Hiểu về độ đo IoU trong nhận diện thực thể

IoU là độ đo đánh giá các mô hình nhận diện thực thể. Phép đo này có thể đánh giá các mô hình khác nhau như RCNN, Fast-RCNN, Faster- RCNN hay YOLO.

Sau khi huấn luyện xong một mô hình nhận diện thực thể, chúng ta cần đánh giá xem mô hình hoạt động chính xác đến mức độ nào. Đây là một yêu cầu không chỉ đối với xử lý ảnh mà với machine learning nói chung.

IoU là gì?

Trong bài toán regression, chúng ta có độ đo như Mean Square Error (MSE), hay đối với classification chúng ta có accuracy, precision, recall, confusion matrix v..v.. Vậy đối với nhận dạng thực thể, chúng ta sẽ dùng độ đo nào? Câu trả lời là IoU.

Trong nhận dạng thực thể, các mô hình cần phải vẽ ra được một khung giới hạn để đánh dấu thực thể với một xác suất nào đó.

Image for post
Ví dụ về output của nhận dạng thực thể. Màu đỏ là khung được dự đoán, màu đen là khung chuẩn.

Khung giới hạn là tập hợp các tọa độ dùng để xác định vị trí trong ảnh. Các dataset khác nhau có thể có định dạng khác nhau của tập hợp này.

Không giống như các độ đo như accuracy hay f1, chúng ta không yêu cầu một sự trùng khớp tuyệt đối mà tính trên mức độ tương đồng của hai khung giới hạn. IoU cho phép chúng ta tính được con số đó.

Giả sử chúng ta có hai tập hợp là S1 và S2, chỉ số Jaccard được tính bởi:

J(S1, S2) = |S1 ∩ S2|/ |S1 U S2|

Đối với IoU ta có:

IoU = Diện tích phần GIAO /Diện tích phần HỢP

Tôi thích suy nghĩ của bạn.
Image for post
IoU = Diện tích phần GIAO /Diện tích phần HỢP.

IoU ≥0.5 được coi là có mức độ tương đồng cao.

Tính IoU bằng Python

Định nghĩa hàm

def iou(box1, box2):
    """
    box1 -- first box, list object with coordinates (x1, y1, x2, y2)
    box2 -- second box, list object with coordinates (x1, y1, x2, y2)
    """

    xi1 = max(box1[0],box2[0])
    yi1 = max(box1[1],box2[1])
    xi2 = min(box1[2],box2[2])
    yi2 = min(box1[3],box2[3])
    inter_area = (yi2-yi1)*(xi2-xi1)
  
    box1_area = (box1[2]-box1[0])*(box1[3]-box1[1])
    box2_area = (box2[2]-box2[0])*(box2[3]-box2[1])
    union_area = box1_area+box2_area-inter_area

    
    # compute the IoU
    iou = inter_area/union_area
    
    return iou

Áp dụng để tính IoU giữa 2 khung:

box1 = (21, 11, 14, 13)
box2 = (23, 12, 13, 14) 
print("iou = " + str(iou(box1, box2)))
Output : iou = 0.417

Ứng dụng của IoU trong Non-max suppression

Trong trường hợp có nhiều khung giới hạn cho cùng một thực thể, chúng ta có thể loại bỏ các khung thừa với thuật toán Non-max suppression (NMS).

Image for post

Giả sử chúng ta có một tập hợp các khung giới hạn và điểm của từng khung, ta có thể áp dụng IoU để lấy ra khung tốt nhất và loại bỏ các khung trùng lặp khác.

Chúng ta bắt đầu với A là tập hợp gồm tất cả các khung giới hạn và B là một tập rỗng.

  1. Lấy ra khung có điểm cao nhất và chuyển từ A sang B.
  2. Xóa khung đó khỏi A.
  3. Tính IoU của khung đó với tất cả các khung khác, loại bỏ hết các khung có IoU vượt ngưỡng.
  4. Lặp lại bước 2 và 3 cho đến khi A rỗng.

Nếu bạn thích bài viết này, đừng ngại chia sẻ với những người quan tâm. Hãy thường xuyên truy cập website hoặc tham gia cộng đồng trên các trang mạng xã hội để có những thông tin chuyên sâu về lĩnh vực!

Bạn muốn trích dẫn bài này:
-----
"Hiểu về độ đo IoU trong nhận diện thực thể," Trí tuệ nhân tạo, Ngày xuất bản: 21/01/2021, URL: https://trituenhantao.io/kien-thuc/hieu-ve-do-do-iou-trong-nhan-dien-thuc-the/, Ngày truy cập: 28/04/2024.