YOLOv1 Core Ideas
Trong bài này chúng ta sẽ cùng tìm hiểu các ý chính về YOLOv1. Không giống như các mô hình two-stages như R-CNN, Fast-RCNN, Faster-RCNN, YOLOv1 là mô hình one-stage để nhận diện vật thể. Bạn chỉ cần cho ảnh đi qua model duy nhất một lần là có kết quả, đó là lý do vì sao có tên YOLO - You Only Look One. Để hiểu rõ một số phần liên quan các bạn có thể đọc từ bài báo. Ở đây mình sẽ đi trực tiếp vào phần inference và training model.
-
Input image được chia thành
grid cells ( ). Nếu tâm của object thuộc grid cell nào thì cell đó chịu trách nhiệm phát hiện vật thể đó. Nếu có nhiều tâm của các object nằm trong cùng một cell thì cũng chỉ gán nhãn duy nhất một nhãn cho cell đó. Đây cũng chính là nhược điểm của YOLOv1. Chúng ta có thể tăng kích thước grid lên để phát hiện được nhiều object hơn. - Mỗi grid cell sẽ chịu trách nhiệm dự đoán:
bounding boxes conditional class probabilities (hay xác suất có điều kiện xuất hiện các classes trong cell đó). Ban đầu sử dụng bộ dữ liệu PASCAL VOC có số classes . Grid cell ở đây được coi là prior box, dự đoán bounding boxes sẽ dựa trên những grid cell này.
- Đối với mỗi predicted bounding box dự đoán 5 giá trị:
- 4 tọa độ của của bounding box
.
là tọa độ tâm của bounding box so với grid cell của nó (chính xác là offsets của tâm box so tâm của grid cell, có chia cho width hoặc height của grid cell). sẽ nhận giá trị từ 0 đến 1 ban đầu, lúc dự đoán thì không có constraints. là width và height của bounding box so với width và height của toàn bộ ảnh (không phải so với grid cell). Do đó cũng nhận các giá trị trong khoảng .
- 4 tọa độ của của bounding box
- 1 box confidence score thể hiện khả năng box có chứa object, nó chính là
. Ở đây thêm có nghĩa rằng vừa tính khả năng box chứa object vừa tính đến bounding box khớp với grounth truth như thế nào. Nếu không có object trong cell thì confidence score bằng 0, ngược lại chúng ta muốn confidence score bằng với IoU giữa predicted box và ground truth box.
Hình bên dưới sẽ thể hiện rất rõ cách bố trí output. Trong hình “Confidence” của mỗi box sẽ tương ứng với
Như vậy tổng cộng chúng ta sẽ có
Chú ý: Đầu output tensor của YOLOv1 của shape là 7x7x30
. Đó chính là lý do bên trên chúng ta nói input image được chia thành grid cell 7x7
. Mỗi vị trí trên output tương ứng với một cell trên input image. Bạn có thể xem video này.
Cùng phân tích kết quả của quá trình inference.
Đầu ra của model chúng ra nhận được
Do đó kết quả nhận được cuối cùng cho một bounding box sẽ là:
Công thức trên cho chúng ta confidence score cho class cụ thể trong một box. Nó vừa tính xác suất có mặt
Network architecture
Kiến trúc của YOLOv1 dựa trên GoogleNet, thay vì dùng inception block nó sẽ sử dụng các Conv layers
Model YOLOv1 bao gồm 24 Conv layers và 2 FC layers. Phiên bản Fast YOLO (YOLO-tiny) chỉ sử dụng 9 Conv layers và ít filters hơn trong các layer đó.
Training
Trong quá trình training sẽ đi optimize loss function sau:
Loss function của YOLOv1 có 3 thành phần chính.
- Localization loss
Khi huấn luyện chúng ta đã biết grounth-truth box thuộc cell nào. Khi dự đoán đưa ra nhiều predicted boxes cho mỗi grid cell. Chúng ta chỉ muốn duy nhất một predicted box chịu trách nhiệm cho object của grid cell. Do đó box thứ
Chú ý: Phần localization loss này chỉ cho grid cell chứa object và cho predicted box của grid đó có IoU cao nhất.
Trong loss function
Để dễ hiểu hơn nữa mình sẽ lấy thêm ví dụ cho trường hợp kích thước thật. Tạm thời chỉ quan tâm đến width. Một box lớn có
, dự đoán được . Một box nhỏ có , dự đoán được . Nếu chỉ dùng thông thường chúng ta sẽ có , tuy nhiên thực chất về việc dự đoán sai khác là như nhau (lệch một nửa). Do đó ở đây tác giả đã sử dụng square root để giảm sự khác biệt này.
- Confidence loss (hay object loss)
Chú ý: trong bài báo dùng
Thành phần thứ nhất của object loss chính là phần loss cho trường hợp cell
Thành phần thứ hai của object loss chính là phần loss cho trường hợp cell
Chú ý: Trong ảnh đa số các grid cell không chứa object nên nếu để weights của localization loss và confidence loss cho vị trí không có object như nhau thì kết quả sẽ không tốt. Model lúc này có xu hướng tập trung dự đoán các box không chứa object để giảm loss nhiều nhất có thể. Do đó ở đây sẽ thiết lập weights khác nhau
- Classification loss
Loss function chỉ phạt classification error nếu object có trong grid cell. Grid cell không có object sẽ không có classification loss.
trong đó
Tóm lại loss function cho model YOLOv1 được viết như sau:
Quá trình training
- Pretrain 20 Conv layers đầu + Avarage Pooling layer + FC layer trên tập dữ liệu ImageNet khoảng 1 tuần để đạt được top-5 accuracy khoảng 88%. Ảnh đầu vào có kích thước 224 x 244.
- Chuyển model để thực hiện detection. Để làm điều đó thì giữ lại 20 Conv layers bên trên thêm vào 4 Conv layers + 2 FC layers với khởi tạo ngẫu nhiên weights. Ảnh đầu vào được đổi thành 448 x 448 chi tiết hơn để tăng performance cho model. Sự thay đổi kích thước ảnh đầu vào chấp nhận được do chúng ta chỉ lấy 20 Conv layers đầu mà không lấy FC phía sau (nếu lấy sẽ bị ràng buộc về kích thước). Tiếp theo phần sau được train trên bộ dữ liệu PASCAL VOC.
- Một số hyperparameters:
- epochs = 135
- batch_size = 64
- momemtum = 0.9
- decay = 0.0005
- learning rate =
- dropout = 0.5
- augmentation = [scaling, translation, exposure, satuaration]
Non-Max Suppression
Chú ý khi nhận diện có rất nhiều bounding boxes có thể phụ trách cho một vật thể. Để loại bỏ bớt các bounding boxes thừa chúng ta sẽ áp dụng Non-Max Supression. Tuy nhiên trước tiên chúng ta cần biến đổi ouput một chút.
Ở bên trên chúng ta cũng đã đề cập
Tương ứng với mỗi bounding box chúng ta sẽ có 20 giá trị 7x7x30
như hình bên dưới.
Sau đó chúng ta cần biến đổi một chút để có được class score cho mỗi bounding box như đã trình bày ở phần trên. Chúng ta có tổng cộng 98 predicted bounding boxes. Quá trình NMS có thể được tóm tắt như hình dưới đây
Để đơn giản gọi là
- Đối với class
đầu tiên, nếu class confidence của box nào nhỏ hơn threshold score thì set class confidence của box đó = 0 - Sắp xếp boxes theo chiều giảm của class confidence
- Áp dụng NMS bắt đầu từ box bên trái có class confidence
lớn nhất, các box phía bên phải có IOU so với box đầu lớn hơn IOU threshold thì set class confidence của box đó = 0. - Làm xong với box bên trái có class confidence
max rồi sẽ làm tiếp đến box còn lại (có class confidence còn khác 0) - Cứ làm như vậy đến khi bên tay phải không còn box nào có class confidence
khác 0. Như vậy xong cho một class. Lúc này class confidence của class đó trong các boxes được chọn sẽ lớn hơn 0, và bằng 0 trong các boxes không được chọn - Lặp lại các bước trên lần lượt cho các class còn lại.
Sau khi thực hiện xong các bước trên sẽ đến bước vẽ các bounding box. Nên nhớ sau khi xử lý trong một bounding box có thể có nhiều class confidences khác 0. Đối với mỗi bounding box sẽ chọn ra class có confidence lớn nhất. Giá trị của class confidence này phải lớn hơn 0. Khi đó bounding box là hợp lệ có chứa thông tin class, class confidence và các thông số hình học, từ đây là vẽ được rồi.
Chú ý: các giá trị dự đoán
được xác định theo grid cell được so sánh với kích thước của original image
Kết luận
Như vậy chúng ta đã cùng tìm hiểu các ý chính trong YOLOv1. YOLOv1 có một số nhược điểm:
- Dự đoán tối đa 49 objects
- Mỗi cell chỉ predict được duy nhất một vật thể với score cao nhất (do nó chỉ đưa ra class conditional probability chung cho grid cell), nếu vật thể gần nhau rất khó để phát hiện được.
- Độ chính xác chưa được tốt như các state-of-the-art thời bấy giờ tuy nhiên bù lại YOLOv1 có tốc độ rất nhanh
- Không có constraints với tọa độ predicted bounding box, điều này khiến nó có thể nằm ở bất kì vị trí nào trong ảnh. Nhược điểm này sẽ được giải quyết trong YOLOv2.
Tài liệu tham khảo
- https://towardsdatascience.com/yolov1-you-only-look-once-object-detection-e1f3ffec8a89
- https://lilianweng.github.io/lil-log/2018/12/27/object-detection-part-4.html
- https://www.git2get.com/av/89501128.html
- https://deepsystems.ai/
- https://www.harrysprojects.com/articles/yolov1.html