[YOLO series] p1. Lý thuyết YOLO và YOLOv2
03 Jul 2020 - trungthanhnguyenTrong lĩnh vực computer vision, có rất nhiều chủ đề, bài toán mà con người vẫn đang cố gắng tối ưu: classification, object detection/recognition, semantic segmentation, style transfer… Trong đó object detection là bài toán rất quan trọng và phổ biến, ứng dụng rộng rãi. Ai làm về computer vision không ít thì nhiều cũng phải động tới nó. Khi bạn up ảnh lên facebook, lập tức facebook xác định và gán tên cho từng người trong ảnh. Các camera IP bây giờ đã tích hợp tính năng nhận diện người. Tính ứng dụng của object detection ngày càng thiết thực và mở rộng. Trong bài viết này, mình sẽ viết về YOLO và YOLO_v2
prerequirement: basic knowlegde of deep learning (neural network, convolution…) Note: đón đọc các bài viết của mình tại:
Trong phần này, mình sẽ giải thích về phiên bản đầu tiên của YOLO, tức YOLO v1. Trước YOLO đã có rất nhiều ý tưởng và thuật toán cho chủ đề object detection, từ image-processing-based đến deep-learning-based. Trong đó, deep-learning-based cho kết quả tốt vượt trội. Hầu hết các object detection model khi đó được xây dựng theo kiến trúc 2-stage. Nổi bật trong số đó là RCNN, FastRCNN, FasterRCNN. Kiến trúc 2-stage bao gồm 2 giai đoạn:
Nguồn ảnh: r-cnn paper
Hướng giải quyết này đảm bảo độ chính xác và chất lượng model khá cao, tuy nhiên lại không đảm bảo về tốc độ và hiệu năng tính toán. Lý do là bởi model bị chia làm 2 giai đoạn (đặc biệt sử dụng ROI Pooling) không thể song song hóa tính toán. Sau này, YOLO xuất hiện giải quyết khá tốt vấn đề này, tính tất cả trong 1 phát :) . Đó chính là ý nghĩa của YOLO - You only look once
Nguồn ảnh: medium.com
YOLO có kiến trúc khá cơ bản, bao gồm base network và extra layers. Base network là Convolution network có nhiệm vụ trích xuất đặc trưng ảnh. Extra layers là các layer cuối dùng để phân tích các đặc trưng và phát hiện vật thể. Base network thường được dùng là Darknet.
YOLO hoạt động theo cơ chế detect vật thể trên từng vùng ảnh. Ảnh được chia thành S x S ô, ô hay còn gọi là cell … Thực ra là chia trong tưởng tượng, không phải cắt ảnh ra hay thực hiện bất kì bước image-processing nào. Bản chất của việc chia ảnh là việc chia output, target thành dạng matrix $A$ kích thước S x S. Nếu trong ảnh, tâm của vật thể nằm trong cell thứ (i,j) thì output tương ứng nó sẽ nằm trong $A[i,j]$.
Luồng xử lí như sau:
Như vậy, bạn đã thấy rằng YOLO tính toán tọa độ bbox, xác suất có xuất hiện vật thể, phân bố xác suất để phân loại vật thể… tất cả đều được thực hiện trong 1 lần. Đó là lý do khiến cho YOLO nhanh hơn nhiều so với các 2-stage model, tạo nên lợi thế cho YOLO.
Loss function của YOLO khá đơn giản nếu cần giải thích, nhưng để code lại là một vấn đề khác =))
Loss_total được tổng hợp từ 5 phần, mỗi phần nhằm tối ưu một vấn đề riêng biệt:
Chú thích:
Giả sử trải qua quá trình huấn luyện mô hình, bạn thu được một model đủ tốt và muốn đưa vào ứng dụng. Tuy nhiên model dù tốt vẫn xảy ra trường hợp: dự đoán nhiều bounding box cho cùng một vật thể
Để giải quyết vấn đề này, ta lọc bớt các bouding box dư thừa ( trùng nhau và cùng class) bằng non-max suppression. Ý tưởng:
Vậy trong phần này, bạn đã được cung cấp những kiến thức cơ bản về YOLO phiên bản đầu tiên. Tuy nhiên, YOLO đã phát triển lên phiên bản YOLOv5 với rất nhiều sự thay đổi. Đọc mỗi YOLO là chưa đủ. Sang phần 2, mình sẽ viết về YOLOv2 và cố gắng code nếu có thời gian.
Phần 1, mình đã mô tả chi tiết về YOLO phiên bản đời đầu YOLO v1. Tuy nhiên, YOLO v1 thực sự vẫn tồn tại rất nhiều nhược điểm cần khắc phục:
YOLO v2 ra đời nhằm cải thiện những vấn đề này.
Trước tiên, ta cần đọc một chút về khái niệm anchor box. Thực ra anchor box là ý tưởng của FasterRCNN. Như đã nói, người ta nhận thấy rằng trong hầu hết các bộ dataset, các bbox thường có hình dạng tuân theo những tỷ lệ và kích cỡ nhất định.
Bằng việc dùng Kmean để phân cụm, ta sẽ tính ra được B anchor box đại diện cho các kích thước phổ biến. Dưới đây là minh họa cho cách tính các anchor box đại diện trong 1 bộ dataset.
Nguồn ảnh: ResearchGate
Như vậy, thay vì predict trực tiếp (x,y,w,h), ta predict ra bộ offset - tức độ lệch giữa groundtruth_bbox với các anchor box.
Các cải tiến của YOLO v2 so với YOLO v1 bao gồm:
Chính những thay đổi này đã khiến YOLO v2 hiệu quả hơn hẳn, cũng trở thành nền tảng chính để các phiên bản v3, v4, v5 phát triển dựa trên. Dưới đây là hình minh họa output của YOLO v2:
Output của YOLO v2 là matrix $A$ có shape: \(Shape(A) = S* S* B *( 4 + 1 + C)\)
Nguồn ảnh: yolo v2 paper
Loss function, về cơ bản, loss function của YOLO v2 vẫn như vậy, khi code chỉ cần khéo léo khi tính $(b_x, b_y, b_w, b_h)$ một chút là được.
Như vậy, qua bài này bạn đã được cung cấp đủ kiến thức về YOLO/YOLOv2. Trong bài sắp tới, mình sẽ hướng dẫn code lại YOLO v2. Cảm ơn bạn đã đọc bài viết.