Intersection over Union (IoU) cho object detection

    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ủa  Adrian 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:
  • Những ground-truth bounding box (bounding box đúng của đối tượng, ví dụ như bounding box của đối tượng được khoanh vùng và đánh nhãn bằng tay sử dụng trong tập test.)
  • Những predicted bounding box được model sinh ra.
    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.

Hình 1: Một ví dụ về phát hiện biển báo Stop từ hình ảnh. Predicted bounding box được vẽ bằng màu đỏ, trong khi đó Ground-truth được vẽ bằng màu xanh lá. Mục tiêu của chúng ta là tính toán Intersection over Union giữa hai bounding box này.

    Công thức tính toán Inersection over Union có thể được định nghĩa thông qua:

Hình 2: Tính toán Intersection over Union

    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).


LẤY TẬP MẪU GROUND-TRUTH TỪ ĐÂU?

    Trước khi đi sâu hơn về IoU, có thể có người trong chúng ta sẽ tự hỏi những mẫu ground-truth được lấy ở đâu?. Như đã nói ở trên, ground-truth bounding box được "khoanh vùng và đánh nhãn bằng tay". Khi training một object detector, bạn cần một tập dữ liệu. Tập dữ liệu này được chia thành (ít nhất) hai nhóm:

  1. Một training set sử dụng để huấn luyện object detector.
  2. Một testing set dùng trong việc đánh giá object detector của bạn.

   Ngoài ra có thể cần thêm một validation set sử dụng để điều chỉnh các hyperparameter trong model của bạn.

     Cả training và testing set đều bao gồm:

  1. Bản thân các hình ảnh.
  2. Các bounding box tương ứng của mỗi object trong ảnh. Bounding box này chỉ đơn giản là các toạ độ (x, y) của hình chữ nhật bao xung quanh object trong ảnh.
    Những bounding box trong training và testing set được khoanh 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.

    Các binary classification kiểu này có thể tính toán độ chính xác tương đối đơn giản, tuy nhiên đối với bài toán object detection lại là một câu chuyện khác.

    Trong thực tế, các toạ độ (x, y) của predict bounding box hầu như không thể nào chính xác hoàn toàn với các toạ độ của ground-truth bounding box. Chính vì thế, chúng ta cần định nghĩa một đại lượng đánh giá có thể khen thưởng những predicted bounding box trùng khớp nhiều với ground-truth:
Hình 3: Một ví dụ về tính toán IoU cho những bounding box khác nhau.

    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:
Hình 4: Các ví dụ này yêu cầu tìm chiếc xe trong ảnh.

    Những hình ảnh trên được lấy từ bộ dữ liệu CALTECH-101 sử dụng cho cả image classificationobject detection. Ground-truth (xanh lá) và predicted bounding box (đỏ) đã được cung cấp sẵn, như hình ảnh dưới đây:
Hình 5: Dựa vào các bounding box đã có, hãy đánh giá performance của object detector, sử dụng Intersection over Union.

    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.


Comments

Popular posts from this blog

YOLO: You Only Look Once

Giới thiệu về Generative Adversarial Networks (GANs)