Phần 3 - Cùng phân tích kỹ các chỉ số của Box dự đoán
Trong Phần 2 - Giải thích đầu ra và đầu vào của mô hình YOLO , khái niệm Box dự đoán đã được đề cập dùng để khoanh vuông đối tượng chúng ta cần nhận diện.
1) Nhắc lại một số khái niệm trong phần trước
Trong bài này chúng ta cùng đào sâu 5 chỉ số mã YOLO cần học cho mỗi box này.
Như chúng ta đã biết, một bounding box nhãn có hai điểm min và max. Vậy từ hai giá trị này làm thế nào để chúng ta bố trí dữ liệu để đào tạo bao gồm 5 giá trị x, y, w, h, confidence đã được đề cập trong phần 2.
2) Ô chứa tâm của box dự đoán
Trong bài trước chúng ta đã nhắc đến YOLO sẽ chia ảnh thành S x S ô, mỗi một ô này sẽ dự đoán ra B box dự đoán, trường hợp này đang đặt B = 2. Tâm của hai box này sẽ nằm trong ô. Cho nên khi tiến hành dự đoán YOLO sẽ phải xác định vị trí của tâm tỉ lệ với chiều của ô này, trường hợp này là 64.
3) Các chỉ số của box dự đoán
3.1) Chỉ số chiều dài (w), chiều cao (h)
Với hai giá trị min và max ta có thể tính ra được:
Chiều dài của box dự đoán
box_width = xmax - xmin
Giá trị w là tỉ lệ giữa chiều dài của box và chiều dài của ảnh
w = box_width / image_width
3.2) Chỉ số tâm của box (x, y)
Tọa độ tâm của bounding box theo chiều của ảnh
x_center = (xmax + xmin) / 2
y_center = (ymax + ymin) / 2
Chiều một ô trường hợp này
cell_size = 64
Dòng hiện tại của ô
row = y_center // cell_size
col = x_center // cell_size
Trong trường hợp này ô chứa tâm nằm ở dòng có chỉ mục tính từ 0 là dòng số 5 và cột số 4. Nhiệm vụ tính dòng và cột là để tỉm ra:
Khoảng cách từ tâm bounxing box tới viền của ô hiện tại (màu xanh)
a = x_center - col x cell_size
b = y_center - row x cell_size
Tỉ lệ của khoảng cách này trên chiều của ô
x = a / cell_size
y = b / cell_size
Đây chính là cặp x, y mà YOLO sẽ cố gắng học
3.3) Chỉ số tự tin - confidence
Với nhãn thì chỉ số này sẽ bằng 1 vì nhãn chính là grounding true box
Với dự đoán của YOLO thì chỉ số này được đo lượng bằng giá trị IOU, độ đo thể hiện sự khớp giữa box dự đoán và grounding true box. IOU là giá trị thể hiện sự giao thoa giữa hai box bất kỳ. Nếu hai box giao thoa càng nhiều thì giá trị này càng lớn.
Để tính IOU ta cần tính diện tích phần giao và diện tích phần hợp, sau đó tính tỉ lệ giữa hai phần này.
3.1.1) Cách tính diện tích phần giao:
Để tính diện tích phần giao, ta cần đi tìm hai tọa độ của hình chữ nhật phần giao:
Tọa độ bên trái nằm trên: (i_min_x, i_min_y)
Tọa độ bên phải nằm dưới: (i_max_x, i_max_y)
Cách tìm ra tọa độ trái bên trên:
Chú ý rằng có khả năng box A nằm trước box B hoặc ngược lại cho nên ta cần thiết kế theo cách tổng hợp như sau:
Tọa độ bên trái nằm trên: (i_min_x, i_min_y)
i_min_x = max(a_min_x, b_min_x)
i_min_y = max(a_min_y, b_min_y)
Tương tự ta có thể tọa độ bên phải nằm dưới: (i_max_x, i_max_y)
i_max_x = min(a_max_x, b_max_x)
i_max_y = min(a_max_y, b_max_y)
Sau khi biết hai tọa độ này bạn có thể tính ra chiều dài và chiều cao của phần giao:
Chiều dài của phần giao
intersection_width = i_max_x - i_min_x
Chiều cao của phần giao
intersection_height = i_max_y - i_min_y
Diện tích của phần giao
I = intersection_width x intersection_height
Chú ý: Diện tích này có thể âm trong trường hợp hai box không đè lên nhau nên cần so sánh với 0 khi lập trình.
3.1.2) Cách tính diện tích phần hợp:
Diện tích phần hợp bằng tổng diện tích của A và B trừ đi diện tích phần giao:
U = A + B - I
3.1.3) Cách lập trình IOU như sau:
def calculate_iou(A, B):
x1_inter = max(A[0], B[0])
y1_inter = max(A[1], B[1])
x2_inter = min(A[2], B[2])
y2_inter = min(A[3], B[3])
# Tính diện tích phần giao
intersection = max(0, x2_inter - x1_inter) * max(0, y2_inter - y1_inter)
# Tính diện tích của A và B
area_A = (A[2] - A[0]) * (A[3] - A[1])
area_B = (B[2] - B[0]) * (B[3] - B[1])
# Tính diện tích phần hợp
union = area_A + area_B - intersection
# Tính IOU
iou = intersection / union if union > 0 else 0
return iou
Giá trị này chính là chỉ số thứ 5 mà YOLO cần dự đoán được.
Vậy là bạn đã cùng tìm hiểu chi tiết các giá trị nằm trong box dự đoán đầu ra của YOLO.
Trong những bài tiếp theo chúng ta sẽ đi sâu và kiến trúc mô hình YOLO nhé.