Nếu bạn từng đọc những tài liệu liên quan đến Object detection, ắt hẳn bạn đã bắt gặp khái niệm Intersection over Union (IoU). Hôm nay chúng ta sẽ cùng tìm hiểu thêm về nó. Bài viết này được lược dịch từ blog post củaAdrian Rosebrock. Khuyến khích bạn nên đọc bài gốc để ủng hộ và đặt câu hỏi (nếu muốn) cho tác giả. INTERSECTION OVER UNION (IOU) LÀ GÌ? (Đầu tiên, Intersection là phần Giao, trong khi Union là phần ...Hợp, nên trong bài viết này sẽ không dịch khái niệm IoU sang tiếng Việt, mong các bạn thông cảm!) Intersection over Union là chỉ số đánh giá được sử dụng để đo độ chính xác của Object detector trên tập dữ liệu cụ thể. Chúng ta hay gặp chỉ số này trong các Object Detection Challenge, dạng nhưPASCAL VOC challenge. Bạn sẽ thường thấy IoU được sử dụng để đánh giá performance của các bộ object detector HOG + Linear SVM và Convolutional Neural Network (R-CNN, FasterR-CNN, YOLO, v.v...). Tuy nhiên hãy ghi nhớ rằng đối với IoU thì sử dụng thuật toán nào để đưa ra các prediction không quan trọng. IoU đơn giản chỉ là một chỉ số đánh giá. Mọi thuật toán có khả năng predict ra các bounding box làm output đều có thể được đánh giá thông qua IoU. Để áp dụng được IoU để đánh giá một object detector bất kì ta cần:
Miễn là có hai tập bên trên, ta đều có thể sử dụng được IoU. Dưới đây là ví dụ trực quan về một ground-truth bounding box và một predicted bounding box.
Công thức tính toán Inersection over Union có thể được định nghĩa thông qua:
Nhìn vào công thức này, bạn sẽ thấy IoU đơn giản là một tỉ lệ. Ở tử số ta tính toán area of overlap - diện tính phần chồng lên nhau giữa predicted bounding box và ground-truth bounding box. Phần mẫu số là area of union - diện tích phần hợp - hay đơn giản hơn là diện tích mà hai bounding box này đang chiếm. Chia diện tích phần chồng (giao) cho diện tích phần hợp sẽ thu được giá trị mà ta mong muốn - Intersection over Union (IoU).
Ngoài ra có thể cần thêm một validation set sử dụng để điều chỉnh các hyperparameter trong modelcủa bạn. Cả training và testing set đều bao gồm:
Những bounding box trong training và testing set đượckhoanh vùng và đánh nhãn bằng tay, vậy nên đó là lý do ta gọi là ground-truth. Mục đích cuối cùng là từ các hỉnh ảnh training và bounding box, xây dựng nên object detector, và sau đó đánh giá performance trên testing set. Nếu có điểm số IoU > 0.5, prediction sẽ được coi là một "good" prediction. TẠI SAO LẠI SỬ DỤNG INTERSECTION OVER UNION? Nếu trước đây bạn đã từng thực hiện bất kì project machine learning nào, đặc biệt là classification, chắc hẳn bạn sẽ thường phải predict những class label từ output của model là chính xác hay không chính xác.
Như bạn có thể thấy, predicted bounding box trùng khớp nhiều với ground-truth có điểm số cao hơn những box ít trùng. Điều này khiến cho Intersection over Union trở thành một đại lượng tuyệt vời để đánh giá các object detector. Chúng ta không cần quan tâm đến sự trùng khớp chính xác của các toạ độ (x,y), nhưng vẫn muốn đảm bảo các predicted bounding box càng gần với ground-truth càng tốt - IoU có thể tính đến điều này. IMPLEMENT INTERSECTION OVER UNION VỚI PYTHON Bây giờ các bạn đã hiểu được Intersection over Union là gì và tại sao nó được sử dụng để đánh giá các mô hình object detection. Tiếp theo hãy cùng nhau implement nó với Python. Trước khi bắt đầu viết code, hãy xem năm ví dụ mà ta sẽ làm việc:
Những hình ảnh trên được lấy từ bộ dữ liệu CALTECH-101sử dụng cho cả image classification và object detection. Ground-truth (xanh lá) và predicted bounding box (đỏ) đã được cung cấp sẵn, như hình ảnh dưới đây:
Những đánh giá cần đưa ra được nhận xét về prediction rằng nó "good" (hoặc "bad") như thế nào. Dưới đây là đoạn function dùng để tính iou với các parameter là boxA và boxB, trong đó các box là list bao gồm các toạ độ [xmin, ymin, xmax,ymax]. def bb_intersection_over_union(boxA, boxB): # Toạ độ hình chữ nhật tương ứng phần giao nhau xA = max(boxA[0], boxB[0]) yA = max(boxA[1], boxB[1]) xB = min(boxA[2], boxB[2]) yB = min(boxA[3], boxB[3]) # Tính diện tích phần giao nhau interArea = (xB - xA + 1) * (yB - yA + 1) # Diện tích của predicted và ground-truth bounding box boxAArea = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1) boxBArea = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 1) # Tính IoU = diện tích phần giao nhau chia diện tích phần tổng hợp # Diện tích phần hợp = tổng diện tích trừ diện tích phần giao iou = interArea / float(boxAArea + boxBArea - interArea) # Trả về giá trị iou return iou Toàn bộ chi tiết mã nguồn và kết quả thử nghiệm của bài toán trên các bạn có thể tìm đọc trong blog gốc (link ở phần đầu bài viết này). Hy vọng qua bài viết các bạn có thể hiểu rõ hơn về IoU cũng như tác dụng của nó trong Object Detection - một phần rất hấp dẫn và còn nhiều thách thức với Machine Learning hiện nay. |