TỔNG QUAN VỀ ĐỀ TÀI
Giới thiệu chung
Đại dịch Covid-19 đã kéo dài 3 năm và vẫn chưa có dấu hiệu kết thúc, với 405,961,201 ca nhiễm và 5,789,567 ca tử vong trên toàn cầu tính đến ngày 14/02/2022 Tại Việt Nam, số ca nhiễm đạt 2,510,860 và 38,949 ca tử vong, gây ra thiệt hại nặng nề về sức khỏe, kinh tế, văn hóa và chính trị Nhiều tỉnh thành phố phải thực hiện giãn cách xã hội nhiều lần, điển hình là 4 tháng giãn cách tại TP Hồ Chí Minh từ tháng 5 đến tháng 9 năm 2021 và 1 tháng tại Hà Nội từ tháng 10 đến tháng 11 năm 2021, dẫn đến nhiều hậu quả nghiêm trọng.
Trong bối cảnh học sinh, sinh viên trở lại trường sau thời gian học online, tình hình dịch bệnh Covid-19 diễn biến phức tạp Để ngăn chặn sự lây lan của dịch bệnh, mỗi cá nhân cần ý thức bảo vệ bản thân bằng cách tuân thủ các biện pháp phòng tránh, đặc biệt là đeo khẩu trang nơi công cộng Nhóm chúng em đã thiết kế một module trí tuệ nhân tạo gắn tại cổng ra vào trường học nhằm kiểm soát và nhắc nhở người dân thực hiện việc đeo khẩu trang Giải pháp này không chỉ giúp kiểm soát việc đeo khẩu trang mà còn giảm thiểu tiếp xúc giữa người với người Trong tương lai, nhóm em hy vọng có thể phát triển module này để tích hợp vào các robot tự hành tại các cơ quan, trường học và trung tâm thương mại, góp phần đẩy lùi dịch bệnh Covid-19 một cách nhanh chóng.
Nhóm em đã quyết định áp dụng thuật toán học sâu Yolo4 để nhận diện người đeo khẩu trang, dựa trên việc tìm hiểu kiến thức từ sách vở và tài liệu trực tuyến.
Tổng quan về YOLO
Trong những năm gần đây, phát hiện đối tượng (object detection) đã trở thành một chủ đề nóng trong lĩnh vực học sâu (deep learning) nhờ vào khả năng ứng dụng rộng rãi và dễ dàng chuẩn bị dữ liệu Các thuật toán hiện đại như YOLO và SSD nổi bật với tốc độ nhanh và độ chính xác cao, cho phép thực hiện các tác vụ gần như thời gian thực, thậm chí nhanh hơn cả con người mà không làm giảm độ chính xác Hơn nữa, các mô hình ngày càng nhẹ, giúp chúng có thể hoạt động hiệu quả trên các thiết bị IoT, góp phần tạo ra những thiết bị thông minh.
Thuật toán phát hiện đối tượng (object detection) mang lại nhiều ứng dụng đa dạng như đếm số lượng vật thể, thanh toán tại quầy hàng, chấm công tự động và phát hiện vật thể nguy hiểm như súng, dao Điều này cho thấy object detection có thể được áp dụng trong hầu hết các lĩnh vực khác nhau.
Nguồn dữ liệu ảnh hiện nay rất đa dạng và dễ dàng tìm kiếm thông qua Google, điều này mang lại lợi thế lớn trong việc huấn luyện mô hình phát hiện đối tượng.
Có nhiều bạn thắc mắc câu hỏi này YOLO nghe khá giống slogan
“Bạn chỉ sống một lần” phải không? Tuy nhiên, trong lĩnh vực phát hiện đối tượng, YOLO có nghĩa là “Bạn chỉ cần nhìn một lần” Điều này có nghĩa là chúng ta có thể phát hiện vật thể chỉ với một lần quan sát, rất nhanh chóng và hiệu quả.
YOLO, mặc dù không phải là thuật toán chính xác nhất trong lĩnh vực phát hiện đối tượng, nhưng lại nổi bật với tốc độ nhanh nhất trong các mô hình hiện có Thuật toán này có khả năng đạt được tốc độ gần như thời gian thực, đồng thời duy trì độ chính xác tương đối cao so với các mô hình hàng đầu khác.
YOLO là một thuật toán phát hiện đối tượng (object detection) không chỉ dự đoán nhãn cho các vật thể mà còn xác định vị trí của chúng Nhờ vào khả năng này, YOLO có thể phát hiện nhiều vật thể với các nhãn khác nhau trong một bức ảnh, thay vì chỉ phân loại một nhãn duy nhất cho toàn bộ bức ảnh.
YOLO có khả năng phát hiện nhiều vật thể trong một bức ảnh nhờ vào các cơ chế thuật toán đặc biệt mà chúng tôi đã nghiên cứu trong đề tài này.
Nguyên lý hoạt động của mạng nơ ron tích chập (Convolutional Neural Network): Đây là mạng nơ ron áp dụng các layer
Convolutional kết hợp với Maxpooling để giúp trích xuất đặc trưng của ảnh tốt hơn Bạn đọc có thể tham khảo Lý thuyết về mạng tích chập neural.
Bounding box là khung hình bao quanh một vật thể trong không gian, trong khi anchor box là các khung hình với kích thước cố định được sử dụng để dự đoán bounding box Việc hiểu rõ khái niệm này là rất quan trọng trong các ứng dụng như nhận diện đối tượng và phân tích hình ảnh.
Feature map: Là một khối output mà ta sẽ chia nó thành một lưới ô
Thuật toán YOLO
Kiến trúc YOLO bao gồm một mạng cơ sở (base network) sử dụng các lớp convolution để trích xuất đặc trưng, cùng với các Extra Layers nhằm phát hiện vật thể trên feature map Mạng cơ sở của YOLO chủ yếu được xây dựng từ các lớp convolutional và các lớp fully connected Đặc biệt, các kiến trúc YOLO rất đa dạng và có thể tùy biến thành nhiều phiên bản khác nhau để phù hợp với các hình dạng đầu vào khác nhau.
Hình 1.1: Sơ đồ kiến trúc mạng YOLO
Thành phần chính của kiến trúc Darknet, gọi là base network, có chức năng trích xuất đặc trưng Đầu ra của base network là một bản đồ đặc trưng với kích thước 7x7x1024, được sử dụng làm đầu vào cho các lớp bổ sung nhằm dự đoán nhãn và tọa độ bounding box của đối tượng.
In YOLO version 3, the author employs a feature extractor network known as darknet-53, which consists of 53 consecutive convolutional layers Each layer is followed by batch normalization and a Leaky ReLU activation function To reduce the output size after each convolutional layer, downsampling is performed using filters of size 2, effectively minimizing the number of parameters in the model.
Hình 1.2: Các layer trong mạng darknet-53
Các bức ảnh khi được đưa vào mô hình sẽ được scale để về chung một kích
Hiện tại, YOLO hỗ trợ hai kích thước đầu vào chính là 416x416 và 608x608, với mỗi kích thước được thiết kế các lớp riêng biệt phù hợp với hình dạng đầu vào Qua các lớp convolutional, kích thước giảm dần theo cấp số nhân 2, và cuối cùng tạo ra một feature map có kích thước nhỏ để dự đoán vật thể trong từng ô của feature map.
Kích thước của feature map sẽ phụ thuộc vào đầu vào Đối với input 416x416 thì feature map có các kích thước là 13x13, 26x26 và 52x52.
Và khi input là 608x608 sẽ tạo ra feature map 19x19, 38x38, 72x72.
- Output của mô hình YOLO là một véc tơ sẽ bao gồm các thành phần: y T =[ p 0 , ⟨ t ⏟ x boundingbox ,t y ,t w ,t h ⟩ , ⟨ ⏟ p 1 scoresof c classes , p 2 , p 3 … p c ⟩ ]
p 0 là xác suất dự báo vật thể xuất hiện trong bounding box.
⟨ t ⏟ x bounding box ,t y ,t w , t h ⟩ giúp xác định bounding box Trong đó t x , t y là tọa độ tâm và t w ,t h là kích thước rộng, dài của bounding box.
Véc tơ phân phối xác suất dự báo cho các lớp được biểu diễn dưới dạng ⟨ ⏟ p 1 scoresof c classes , p 2 , p 3 … p c ⟩ Hiểu rõ đầu ra này là rất quan trọng để cấu hình các tham số chính xác khi huấn luyện mô hình qua các nguồn mở như darknet Đầu ra sẽ được xác định theo số lượng lớp theo công thức (n_class + 5) Ví dụ, nếu bạn huấn luyện 80 lớp, đầu ra sẽ là 85 Nếu bạn áp dụng 3 anchors mỗi ô, số lượng tham số đầu ra sẽ thay đổi tương ứng.
Hình 1.3: Kiến trúc một output của model YOLO
Hình ảnh gốc được biểu diễn dưới dạng một feature map có kích thước 13x13 Mỗi ô trong feature map sẽ được gán 3 anchor boxes với kích thước khác nhau, cụ thể là Box 1, Box 2 và Box 3, sao cho tâm của các anchor boxes trùng với vị trí của ô đó Kết quả đầu ra của YOLO là một véc tơ kết hợp của 3 bounding boxes, trong đó các thuộc tính của mỗi bounding box được mô tả chi tiết như trong hình.
1.3.3 Dự báo trên nhiều feature map
YOLOv3, giống như SSD, thực hiện dự đoán trên nhiều feature map Các feature map ban đầu có kích thước nhỏ, cho phép dự đoán các đối tượng lớn, trong khi các feature map sau có kích thước lớn hơn giúp dự đoán các vật thể nhỏ hơn, nhờ vào việc giữ cố định kích thước của anchor box.
Hình 1.4: Các feature maps của mạng YOLOv3
Với input shape là 416x416, output là 3 feature maps có kích thước lần lượt là 13x13, 26x26 và 52x52.
Trong mô hình YOLO, mỗi cell trên các feature map sẽ áp dụng 3 anchor box để dự đoán vật thể, dẫn đến tổng số anchor box khác nhau là 9 (3 feature map x 3 anchor box) Trên một feature map hình vuông có kích thước S x S, YOLOv3 sẽ sinh ra S x S x 3 anchor box Do đó, tổng số anchor boxes trên một bức ảnh sẽ được tính toán dựa trên kích thước của feature map.
Số lượng anchor boxes lên tới 10647, được tính từ (13 x 13 + 26 x 26 + 52 x 52) x 3, gây ra sự chậm trễ trong quá trình huấn luyện mô hình YOLO Điều này là do chúng ta cần đồng thời dự đoán cả nhãn và bounding box trên tất cả 10647 bounding boxes.
Một số lưu ý khi huấn luyện YOLO:
Khi huấn luyện YOLO sẽ cần phải có RAM dung lượng lớn hơn để save được 10647 bounding boxes như trong kiến trúc này.
Khi sử dụng mô hình YOLO với gói darknet, không thể thiết lập kích thước batch quá lớn như trong các mô hình phân loại, vì điều này dễ dẫn đến tình trạng hết bộ nhớ Để khắc phục, darknet chia nhỏ một batch thành các phân đoạn (subdivisions) nhằm tối ưu hóa việc sử dụng RAM.
Thời gian xử lý của một bước trên YOLO lâu hơn nhiều so với các mô hình phân loại Vì vậy, nên thiết lập giới hạn số bước huấn luyện cho YOLO ở mức thấp Đối với các tác vụ nhận diện có dưới 5 lớp, dưới 5000 bước là đủ để đạt được kết quả tạm chấp nhận Đối với các mô hình có nhiều lớp hơn, số bước có thể tăng lên theo cấp số nhân tùy theo nhu cầu.
Để xác định bounding box cho vật thể, YOLO sử dụng các anchor box làm cơ sở ước lượng, được xác định trước để bao quanh vật thể một cách chính xác Thuật toán regression bounding box sau đó sẽ tinh chỉnh các anchor box này, từ đó tạo ra bounding box dự đoán cho vật thể.
Mỗi vật thể trong hình ảnh huấn luyện sẽ được phân bố vào một anchor box Khi có từ hai anchor box trở lên bao quanh một vật thể, chúng ta sẽ chọn anchor box có chỉ số IoU cao nhất so với ground truth bounding box.
Hình 1.5: Xác định anchor box cho một vật thể
Từ Cell i ta xác định được 3 anchor boxes viền xanh như trong hình
Cả 3 anchor boxes này đều giao nhau với bounding box của vật thể Tuy nhiên chỉ anchor box có đường viền dày nhất màu xanh được lựa chọn làm anchor box cho vật thể bởi nó có IoU so với ground truth bounding box là cao nhất.
Mỗi vật thể trong hình ảnh huấn luyện được phân bổ vào một ô trên feature map, dựa trên điểm giữa của vật thể đó Ví dụ, hình ảnh chú chó trong hình 3 sẽ được gán cho ô màu đỏ, vì điểm giữa của chú chó nằm chính xác trong ô này Từ ô này, chúng ta có thể xác định các anchor boxes bao quanh hình ảnh của chú chó.
KHỞI TẠO GOOGLE COLAB
Cấp phép cho Google Colab
4.1 Huấn luyện Yolov3 (trên hệ điều hành Ubuntu)
4.1.1.1 Tải source Darknet về máy: Đầu tiên các bạn tạo thư mục AI_Yolo trên máy tính tại đâu nào tùy bạn nhé Chúng ta sẽ chuyển vào và làm việc trong thư mục này.
Trên Terminal hãy chuyển vào thư mục AI_Yolo bằnh lệnh cd AI_Yolo, sau đó gõ lệnh: git clone https://github.com/pjreddie/darknet
Sau khi chờ vài phút, thư mục AI_Yolo sẽ có thêm thư mục darknet cùng nhiều thư mục con bên trong, chứng tỏ quá trình tải đã thành công Tiếp theo, chúng ta sẽ chuyển sang bước biên dịch (make) Đầu tiên, hãy mở file Makefile trong thư mục darknet và chú ý đến hai dòng quan trọng sau đây.
# dòng GPU bên dưới để là 1 nếu máy bạn có GPU, ngược lại để 0
# dòng OPENCV để 1 nếu bạn muốn dùng thư viện OpenCV
Mình thường thiết lập OpenCV=1 để hỗ trợ mở nhiều định dạng file ảnh khác nhau Nếu gặp lỗi, bạn có thể để OPENCV=0, vì hiếm khi mở các file ảnh không phổ biến.
SUDO APT-GET INSTALL LIBOPENCV-DEV
Xong, bây giờ bạn lưu lại file Makefile
4.1.1.2 Chuẩn bị dữ liệu train
Để xây dựng một mô hình chất lượng, việc thu thập dữ liệu huấn luyện từ internet hoặc các nguồn sẵn có là rất quan trọng Số lượng dữ liệu càng nhiều, càng tốt; lý tưởng là nên có hàng nghìn ảnh để cải thiện hiệu suất của mô hình.
HUẤN LUYỆN YOLO TRÊN GOOGLE COLAB
Khởi tạo project darknet
Darknet là một framework mã nguồn mở chuyên về phát hiện đối tượng, được lập trình bằng C và CUDA Nó cho phép huấn luyện mô hình nhanh chóng và dễ dàng cài đặt, hỗ trợ cả tính toán trên CPU và GPU Với cộng đồng người dùng đông đảo và đội ngũ hỗ trợ nhiệt tình, Darknet là lựa chọn lý tưởng cho nhóm chúng tôi.
Tại bước này chúng ta cần clone project darknetGoogleColab mà tôi đã customize lại một chút cho phù hợp với google colab.
Các bạn thực hiện tuần tự như sau:
Step 1: Thay đổi đường dẫn tới folder mặc định là My Drive.
Step 2: Sử dụng command line để clone git project darknetTurtorial từ github repo của bản thân.
Sau khi chạy thành công bạn kiểm tra trên My Drive của Google drive bạn sẽ thấy folder darknetGoogleColab vừa mới được clone về.
Sau đó chúng ta cd vào folder và phân quyền execute module darknet để có thể chạy được các lệnh trên darknet.
Lúc này chúng ta đã có thể sử dụng được các lệnh của dự báo, huấn luyện của darknet trên hệ điều hành ubuntu.
Chuẩn bị dữ liệu
Hiện nay, có nhiều công cụ mã nguồn mở để gán nhãn cho mô hình YOLO, nhưng nhóm em đã chọn sử dụng labelImg từ pypi vì những lý do cụ thể.
Giao diện UI/UX khá tốt với đầy đủ chức năng: open, load, save,….
Hỗ trợ gán nhãn trên cả 2 định dạng COCO xml format và YOLO default txt format.
Chức năng default bounding box cho phép tự động gán nhãn cho tất cả các bức ảnh trong một thư mục, giúp tiết kiệm thời gian và công sức Ví dụ, khi gán nhãn cho sản phẩm cà phê, tất cả hình ảnh liên quan đến cà phê sẽ được tổ chức trong cùng một thư mục mà không cần phải nhập lại nhãn cho từng bức ảnh Chỉ cần tạo một default bounding box, bạn có thể dễ dàng quản lý và phân loại hình ảnh của mình.
Và rất nhiều các chức năng khác.
Việc cài đặt và hướng dẫn sử dụng các bạn đọc tại labelImg. annotation của chúng (định dạng txt) Bên dưới là nội dung của một file annotation.txt.
Nội dung của file annotation sẽ bao gồm:
Các giá trị , , , và đại diện cho tâm và kích thước của bounding box, được chuẩn hóa bằng cách chia cho chiều rộng và chiều cao của ảnh, đảm bảo rằng các giá trị này luôn nằm trong khoảng [0, 1] Giá trị là chỉ số đánh dấu các lớp khác nhau.
Trong trường hợp một ảnh có nhiều bounding box thì file annotation sẽ gồm nhiều dòng, mỗi một bounding box là một dòng.
Cảc ảnh và annotation phải được để chung trong cùng 1 folder Bạn đọc có thể tham khảo qua dữ liệu mẫu Dữ liệu ảnh sản phẩm TMDT.
Lệnh trên sẽ sao chép dữ liệu vào thư mục traindata trong dự án của bạn Lưu ý rằng không được đặt tên thư mục traindata trùng với thư mục data mặc định của darknet, vì điều này có thể gây ra lỗi "Cannot load image" khi dự đoán và khiến nhãn dự đoán của hình ảnh không hiển thị.
Dữ liệu trong folder img sẽ bao gồm các file ảnh và file annotation (có đuôi txt) của chúng.
4.2.3 Phân chia dữ liệu train/validation Ở bước này ta sẽ tạo ra 2 file train.txt và valid.txt chứa dữ liệu đường dẫn tới các file hình ảnh nằm trong tập train và validation Chúng ta sẽ sử dụng đoạn code bên dưới để lựa chọn ra ngẫu nhiên 20 files làm dữ liệu validation và các files còn lại làm dữ liệu train.
Cấu hình darknet
4.3.1 Tạo file object name Đây là files chứa tên các classes mà chúng ta sẽ huấn luyện mô hình Trên file này, thứ tự các classes name cần phải đặt đúng với index của nó trong các file label của vật thể. Đoạn code trên sử dụng lệnh echo của bash để tạo và write nội dung vào file obj.names Sau đó, một file obj.names được tạo thành trong project foler Bạn có thể mở file này ra để kiểm tra nội dung.
File config data sẽ khai báo một số thông tin như:
Thư mục backup mô hình huấn luyện.
Chạy lệnh bên dưới để tạo file này.
4.3.3 Tạo file config model Đây là bước quan trọng nhất khi huấn luyện model YOLO Chúng ta sẽ sử dụng file yolov3.cfg để cấu hình mô hình huấn luyện Các bạn download file trên về máy và điều chỉnh các dòng:
Tại các dòng 610, 696, 783: Thay classes thành classes=5 là số lượng classes chúng ta huấn luyện.
Tại các dòng 603, 689, 776, cần thay đổi số lượng filters%5 thành filter0, vì đây là lớp cuối cùng của mạng cơ sở Do đó, hình dạng đầu ra sẽ thay đổi theo số lượng lớp, theo công thức đã nêu trước đó: (n_classes + 5)x3 = (5+5)x3 = 30.
Trong dòng 20, tham số max_batches xác định số lượng bước tối đa để huấn luyện các mô hình YOLO Đối với dữ liệu có 5 lớp, chỉ cần điều chỉnh max_batches là có thể đạt được kết quả tốt.
Burn_in là số lượng bước ban đầu được giữ với learning_rate rất nhỏ, bắt đầu từ 0
Tại dòng 22, điều chỉnh giá trị thành steps@00,4500 để bắt đầu giảm dần learning_rate, vì thuật toán đã đạt điểm hội tụ và không cần thiết phải giữ learning_rate quá cao Sau khi thực hiện các thay đổi, hãy lưu file và đẩy lên dự án darknetGoogleColab trên Google Drive.
Để sử dụng cấu hình cho YOLO phiên bản 3 với 5 lớp và 5000 bước huấn luyện, hãy đổi tên file thành yolov3-5c-5000-maxsteps.cfg Các file cấu hình này đã có sẵn trong kho lưu trữ GitHub, bạn có thể tải về và sử dụng ngay lập tức.
Các hàm phụ trợ
Để thuật lợi cho việc đọc và ghi và hiển thị hình ảnh, tôi sẽ xây dựng các hàm phụ trợ có chức năng như sau:
imShow(): Hiển thị hình ảnh từ một path.
upload(): Upload một file từ local lên google drive.
download(): Download một file từ một path trên mạng.
Huấn luyện mô hình
YOLO được huấn luyện trên nhiều mô hình pretrain, được phát triển từ các bộ dữ liệu ảnh lớn như COCO, Pascal VOC, Imagenet và CIFAR Những bộ dữ liệu này có định dạng chuẩn và chất lượng được đảm bảo bởi các tổ chức nghiên cứu uy tín toàn cầu Trong ví dụ thực hành này, chúng ta sẽ sử dụng mô hình pretrain darknet53.conv.74, được huấn luyện từ bộ dữ liệu ImageNet Trước tiên, hãy clone file weight về Google Drive.
Tạo một thư mục sao lưu để lưu trữ kết quả huấn luyện sau mỗi 1000 bước, và thư mục này cần có tên trùng với liên kết thư mục sao lưu đã được khai báo ở bước 4.3.3 khi tạo file cấu hình dữ liệu.
Để giảm thiểu thời gian chờ đợi trong quá trình sao lưu mô hình, tôi đã thiết lập để tự động sao lưu mô hình sau mỗi 100 bước thay vì 1000 bước Điều này giúp tránh các lỗi có thể xảy ra trong 1000 bước đầu tiên khi huấn luyện.
4.5.3 Huấn luyện model Để huấn luyện model ta chỉ cần thực hiện lệnh detector train.
!./darknet detector train [data config file] [model config file] [pretrain- model weights] -dont_show > [file log saved]
The article discusses various configuration files essential for training models, including data configuration files and model configuration files It also highlights the significance of pre-trained model weights and the log file that records the training process.
Khi lưu log vào [file log saved], mô hình của bạn sẽ không hiển thị log ra màn hình nữa, dẫn đến sự nhầm lẫn rằng mô hình đã ngừng chạy Để tiếp tục hiển thị log trong quá trình huấn luyện, bạn cần loại bỏ phần > [file log saved] ở cuối câu lệnh.
Hãy quay trở lại file yolov3-5c-5000-max-steps.cfg và điều chỉnh tăng subdivisions2 Sau đó train lại model từ đầu.
Quá trình huấn luyện mất khoảng 5 giờ đồng hồ Nếu bạn muốn thấy kết quả, hãy kiên nhẫn chờ đợi Tuy nhiên, nếu bạn muốn có ngay thành quả, hãy tải xuống file pretrain nhận diện sản phẩm TMDT của tôi.
Log của chương trình sẽ không hiển thị trên màn hình vì chúng ta đã lưu vào file yolov3-5c.log Mục đích chính của việc này là để lưu lại log nhằm trực quan hóa hàm mất mát (xem mục 4.5.4) Nếu bạn muốn theo dõi trực tiếp trên màn hình Google Colab, hãy chạy lệnh sau.
!./darknet detector train obj.data yolov3-5c-5000-max-steps.cfg darknet53.conv.74 -dont_show
Bạn có thể mở một google colab khác để thực hiện mục 4.5.4 visualize loss function.
Regularly check your internet connection, as Google Colab automatically terminates offline sessions after one hour If you close Colab or experience a disconnection, your training will continue for up to one hour before it is stopped.
Google Colab cho phép thời gian tối đa cho một phiên làm việc lên đến 12 giờ Tuy nhiên, với các bộ dữ liệu lớn, việc huấn luyện mô hình phát hiện đối tượng trên Google Colab trở nên khó khăn và gần như không khả thi.
Kết quả huấn luyện của mô hình sẽ được lưu trữ trong file yolov3-5c.log qua từng bước File này có thể được sử dụng để trực quan hóa hàm loss function.
Trong dự án git được tùy chỉnh từ darknet, tôi đã phát triển một tệp tin để trực quan hóa hàm mất mát (loss function) Ý tưởng thực hiện khá đơn giản: chúng ta sẽ tìm kiếm trong log các dòng chứa thông tin về Average Loss và trích xuất giá trị của hàm mất mát để trực quan hóa Bạn đọc có thể mở tệp tin để nghiên cứu thêm.
Như vậy đồ thị loss function cho thấy thuật toán đã hội tụ sau khoảng 7000 batches đầu tiên Loss function ở giai đoạn sau có xu hướng tiệm cận gần 1.
Dự báo và ước tính thời gian huấn luyện
Sau khi huấn luyện xong mô hình, kết quả sau cùng sẽ được lưu trong folder backup Để dự báo cho một bức ảnh ta sử dụng cú pháp:
!./darknet detector test [data config file] [model config file] [last-model
Google Colab suppresses OpenCV's graphic functions, preventing direct image display To view results, you must save the output as a file named predictions.jpg Using the argument `-dont_show` can help bypass OpenCV's graphic errors.
Như vậy chúng ta đã hoàn thành quá trình huấn luyện và dự báo một mô hình object detection trên google colab.
Khi tìm hiểu về lý thuyết của mô hình YOLO, bạn sẽ nhận ra lý do tại sao quá trình huấn luyện của nó lại kéo dài Mô hình YOLO cần dự đoán nhãn và tọa độ cho tổng cộng 10,647 bounding boxes từ một ảnh đầu vào kích thước 418x418 Với kích thước batch là 64 ảnh và tổng số max_batches là 5,000, tổng số bounding boxes cần dự đoán lên đến 3.4 triệu Đây là một con số lớn, dẫn đến việc quá trình huấn luyện trên Google Colab có thể mất vài giờ.
Google Colab giới hạn thời gian huấn luyện liên tục ở mức 12 giờ Vì vậy, trước khi bắt đầu quá trình huấn luyện, bạn cần ước lượng tổng thời gian để tránh vượt quá giới hạn này Bài viết này sẽ chia sẻ một số mẹo để ước tính và tiết kiệm thời gian huấn luyện hiệu quả.
Khi ước tính tổng thời gian huấn luyện, bạn nên dựa vào thời gian huấn luyện của một batch Ví dụ, nếu một batch mất 3.6 giây, thì 5000 batch sẽ tiêu tốn khoảng 5 giờ huấn luyện (tính theo công thức (3.6x5000)/3600) Tuy nhiên, đây chỉ là ước tính tương đối, vì không phải tất cả các batch đều có thời gian huấn luyện giống nhau Nếu gặp phải các batch có hình ảnh lỗi hoặc định dạng không tương thích, thời gian huấn luyện có thể tăng lên đáng kể do quá trình gỡ lỗi.
Trong quá trình huấn luyện, hãy lưu lại log và vẽ biểu đồ hàm mất mát (loss function) Biểu đồ này giúp xác định xem quá trình huấn luyện đã đạt trạng thái hội tụ hay chưa Nếu nhận thấy hàm mất mát có dấu hiệu hội tụ, bạn có thể xem xét dừng sớm quá trình huấn luyện.
Huấn luyện mô hình trên nhiều GPU song song giúp tăng tốc độ đào tạo, nhưng chỉ áp dụng cho những ai sở hữu nhiều GPU, không thể thực hiện trên Google Colab Để tối ưu hiệu suất, cần giảm learning rate theo cấp số nhân; ví dụ, khi sử dụng 4 GPU, learning rate mới sẽ là 1/4 learning rate mặc định trên 1 GPU Việc này sẽ giúp quá trình huấn luyện diễn ra nhanh chóng hơn.
Sử dụng mô hình pretrain trên bộ dữ liệu tương tự với bộ dữ liệu đang huấn luyện giúp giảm thiểu số bước huấn luyện cần thiết để đạt kết quả tốt Khi các trọng số của mô hình pretrain gần sát với mô hình tối ưu cho bộ dữ liệu, hiệu suất được cải thiện đáng kể so với việc chọn mô hình pretrain từ một bộ dữ liệu hoàn toàn khác.
Để tối ưu hóa quá trình huấn luyện, bạn nên cập nhật phiên bản cuDNN, đặc biệt nếu bạn đang làm việc trên máy tính cá nhân, trong khi Google Colab đã tích hợp sẵn phiên bản mới Các kiến trúc cuDNN mới, như phiên bản 7.6, đã được cải tiến đáng kể, cho phép tăng tốc độ huấn luyện gấp đôi so với phiên bản 6.0 Vì vậy, nếu bạn đang sử dụng phiên bản cũ, hãy tiến hành cập nhật cuDNN Tuy nhiên, bạn cần lưu ý rằng cuDNN phải tương thích với phiên bản CUDA để tránh gặp phải các lỗi không mong muốn.
Khi phát triển mô hình YOLO, hãy cân nhắc sử dụng kiến trúc đơn giản, vì các kiến trúc của YOLO rất đa dạng tùy thuộc vào base network Đối với những tác vụ có ít lớp, độ chính xác giữa mô hình phức tạp và đơn giản thường không chênh lệch nhiều Bạn nên đặt ra tiêu chuẩn về mAP cho mô hình và thử nghiệm với các kiến trúc đơn giản như tiny YOLO, vì chúng có thể đáp ứng tiêu chuẩn đó Bên cạnh đó, tốc độ dự báo nhanh và khả năng triển khai trên các thiết bị IoT cấu hình thấp là những ưu điểm nổi bật của các mô hình này.