YOLOv3: An Incremental Improvement

deep-learning
object-detection

#1

Link paper

Joseph Redmon, Ali Farhadi

(Submitted on 8 Apr 2018)

We present some updates to YOLO! We made a bunch of little design changes to make it better. We also trained this new network that’s pretty swell. It’s a little bigger than last time but more accurate. It’s still fast though, don’t worry. At 320x320 YOLOv3 runs in 22 ms at 28.2 mAP, as accurate as SSD but three times faster. When we look at the old .5 IOU mAP detection metric YOLOv3 is quite good. It achieves 57.9 mAP@50 in 51 ms on a Titan X, compared to 57.5 mAP@50 in 198 ms by RetinaNet, similar performance but 3.8x faster. As always, all the code is online at this https URL

Comments: Tech Report
Subjects: Computer Vision and Pattern Recognition (cs.CV)
Cite as: arXiv:1804.02767 [cs.CV]
(or arXiv:1804.02767v1 [cs.CV] for this version)

#2

Trước khi bàn luận về YOLO, em xin đưa ra một chút về kiến thức về lịch sử của Object Detection


RCNN:

Mạng sử dụng thuật toán Selective Search sinh ra các ROI, lúc đó đã là rất cải tiến so với thuật toán Sliding Window. Sau đó đưa các ROI này vào CNN để phân loại vật thể có trong ROI, đồng thời hiệu chỉnh lại các ROI này ( Bounding Box Regression)

Fast RCNN:

Tác giả nhận ra rằng rất nhiều ROI sẽ có phần trùng nhau, như vậy khi đưa các ROI qua CNN sẽ bị tốn thời gian tính toán lại. Vậy nên tác giả đã thay đổi cách làm bằng cách chỉ đưa ảnh đầu vào 1 lần qua CNN để có được Feature Map, đồng thời sử dụng Selective Search để tìm ra các ROI, rồi mới map các tọa độ của ROI này vào Feature Map .

Faster RCNN:

Fast RCNN đã tốt hơn RCNN ở việc chúng chỉ cần 1 lần đưa ảnh qua CNN nhưng vì vẫn sử dụng thuật toán Selective Search nên thời gian vẫn tương đối nhiều ( 2s cho 1 ảnh 400*400). Tác giả cải thiện tốc độ bằng cách đưa ra 1 mạng RPN để dự đoán bouding box của vật thể Trong Loss Function của Faster RCNN, tác giả đã đưa ra một cách regression mới dựa vào anchor box

L_{reg} = R(t_i-t_i^*). Trong đó R() là hàm smooth_{L1}

  • t_i là vector bao gồm: t_x = (x-x_a)/w_a , t_y = (y-y_a)/h_a , t_w = log(w/w_a) , t_h = log(h/h_a)
  • t_i^* là vector bao gồm: t_x^* = (x^*-x_a)/w_a , t_y = (y^*-y_a)/h_a , t_w^* = log(w^*/w_a) , t_h^* = log(h^*/h_a)
  • x, x_a, x^* lần lượt là tọa độ của predicted box , anchor box và groundt-ruth box

SSD:

Faster RCNN đã khắc phục việc phụ thuộc vào Selective Search, tuy nhiên điểm yếu của mạng này nằm ở 2 điểm sau:

  • Việc dự đoán bouding box và phân loại vật thể trong box là không đồng thời, hay nói cách khác mạng này vẫn là mô hình two-stage.
  • Chỉ sử dụng 1 Feature Map cuối cùng ở RPN để khởi tạo anchor box.

SSD cải tiến Faster RCNN bằng cách kế thừa kĩ thuật anchor box của Faster RCNN nhưng thực hiện trên nhiều lớp feature map đồng thời kết hợp việc dự đoán bouding box và phân loại vật thể vào 1 lần. Vậy nên tác giả mới nói SSD là mạng one-stage.

Vậy YOLO có điều gì nổi bật hơn tất cả các mạng đã có ?


Lịch sử phát triển của các Deep Network phục vụ Object Detection cho ta thấy có 2 kỹ thuật để tăng tốc độ như sau:

  • Kết hợp việc dự đoán bouding box và phân loại vật thể trong box đó.
  • Sinh ra ít ROI nhất có thể, và đưa ROI qua ít layer nhất có thể.

YOLO giảm việc tạo ra các ROI bằng cách giảm số lượng anchor box (với mạng one-stage thì số ROI phụ thuộc vào số anchor box tạo trước). Thay vì tạo anchor box từ các điểm ảnh trên nhiều Feature Map, YOLO chia ảnh thành các Grid rồi tạo anchor box từ các Grid.

<?>Câu hỏi đặt ra:
Như vậy trong 1 Grid sẽ có rất nhiều điểm ảnh, cho dù ta có thể mặc định trước chiều rộng và chiều dài của anchor box, ta cũng không thể nói được tâm của anchor box này sẽ nằm ở đâu trong Grid? Sự thật là YOLO không sử dụng tâm của anchor box để tính toán hàm mất mát, và dự đoán thông số các predicted box như sau: b_x = \sigma(t_x)+c_x , b_y = \sigma(t_y)+c_y , b_w=p_we^{t_w} , b_h=p_he^{t_h}

Trong đó:

  • p_w, p_h chính là các chiều dài, chiều rộng của anchor box dựa vào thuật toán K-mean clusterrng áp dụng trên tập Ground-truth box.
  • c_x, c_y là tọa độ của các Grid.
  • t_x, t_y, t_w, t_h là các thông số sẽ được regression ( giống FasterRCNN với t_i ).

Ngoài ra, dể tăng độ chính xác YOLO đã áp dụng kĩ thuật Feature Pyramid, điều mà Faster CNN và SSD chưa có. Tất nhiên ta đều có thể tự lập trình để thêm kỹ thuật này vào SSD và Faster RCNN.

TÓM LẠI, em xin tóm tắt điểm nổi bật của YOLO như sau:


1. YOLO sử dụng kĩ thuật chia ảnh thành các Grid để giảm số lượng Box(ROI) cần dự đoán, mà vẫn xử lí khéo léo được Box Regression

2. Việc khởi tạo chiều dài và chiều rộng của anchor box theo Groundtruth-box của dataset sẽ giúp mô hình học nhanh và chính xác hơn. Ngoài ra, ta có thể tự tăng số lượng phân cụm của K-mean clustering để tăng độ chính xác. Tất nhiên tăng số lượng cụm sẽ rất đến tăng anchor box và dẫn đến giảm tốc độ của mạng

Trên đây là những gì em hiểu về YOLO. Em rất mong nhận được sự góp ý của bọn người ạ.


#3

Cảm ơn em, bài viết rất chi tiết. Phần phân tích của em là YOLO version nào nhỉ? Từ version 2 và 3 có khá nhiều cải tiến.

P/s: Em sửa lại công thức toán đi.


#4

Dạ bài viết này là những kiến thức em tìm hiểu được ở cả YOLO version 2 và version 3 ạ. Mong anh góp ý :smiley:


#5

Cái này xứng đáng dành một bài dài hơn để nói về điểm mạnh và yêu của Yolo. Cho mình ký sổ nhé =))


#6

Bạn tham khảo bài viết này chưa?