Anchor Boxes
Anchor box là các hộp có kích thước và tỷ lệ khung hình cố định được định sẵn, để detector dịch chuyển và thay đổi kích thước nhằm khớp với đối tượng. Cách xác định kích thước, ghép khớp và sử dụng.
Anchor box là các hình chữ nhật định sẵn có kích thước và tỷ lệ khung hình cố định, được xếp tại mọi vị trí trên feature map của bộ phát hiện; chúng đóng vai trò là các dự đoán ban đầu về vị trí và hình dạng của đối tượng. Bộ phát hiện dựa trên anchor chấm điểm từng anchor cho mỗi lớp và dự đoán các độ lệch nhỏ để dịch chuyển, thay đổi kích thước anchor cho khớp với đối tượng; cách này dễ học hơn so với dự đoán một box từ đầu. Faster R-CNN đặt 9 anchor tại mỗi vị trí: ba diện tích (128², 256² và 512² pixel) nhân với ba tỷ lệ khung hình (1:1, 1:2 và 2:1), tổng cộng khoảng 20.000 anchor cho ảnh 1000 × 600.
Cách xác định anchor#
Tập anchor là danh sách kích thước và tỷ lệ khung hình được lặp lại tại mỗi ô của feature map, nên số anchor bằng số ô × số hình dạng trên mỗi ô. Các bộ phát hiện có mạng kim tự tháp đặc trưng (FPN) gán anchor nhỏ cho các tầng độ phân giải cao, chi tiết và anchor lớn cho các tầng thô hơn: RetinaNet sử dụng 9 anchor trên mỗi vị trí ở cả năm tầng, khoảng 100.000 anchor cho mỗi ảnh. SSD gọi chúng là box mặc định; SSD300 xếp 8.732 box như vậy.
Các hình dạng được chọn thủ công thường không khớp tốt với một số tập dữ liệu, vì vậy YOLOv2 áp dụng phân cụm k-means trên chiều rộng và chiều cao của các box huấn luyện, dùng 1 − IoU làm khoảng cách và giữ lại 5 tâm cụm làm anchor. YOLOv3 phân cụm 9 anchor rồi chia đều chúng cho ba stride đầu ra, từ 10 × 13 pixel ở tầng stride-8 đến 373 × 326 ở tầng stride-32.
Ghép anchor với đối tượng#
Trong quá trình huấn luyện, mỗi anchor được so sánh với mọi box đã gán nhãn bằng giao trên hợp (IoU). Các anchor chồng lấp đủ nhiều với một đối tượng trở thành mẫu dương tính, học lớp của đối tượng và các độ lệch tới bounding box của đối tượng; anchor ít chồng lấp trở thành mẫu âm tính và học “nền”, còn anchor có mức chồng lấp trung gian bị bỏ qua. Mạng đề xuất vùng của Faster R-CNN đánh dấu IoU từ 0.7 trở lên là dương tính và dưới 0.3 là âm tính; mạng cũng đánh dấu anchor khớp tốt nhất với mỗi đối tượng là dương tính để không bỏ sót đối tượng nào.
import torch
from torchvision.ops import box_iou
# Nine anchors centered on one feature-map cell at (200, 200): 3 sizes x 3 aspect ratios (height / width)
shapes = [(size, ratio) for size in (64, 128, 256) for ratio in (0.5, 1.0, 2.0)]
anchors = []
for size, ratio in shapes:
w, h = size / ratio**0.5, size * ratio**0.5
anchors.append([200 - w / 2, 200 - h / 2, 200 + w / 2, 200 + h / 2])
# A labeled pedestrian box (x1, y1, x2, y2): tall and narrow
person = torch.tensor([[160.0, 110.0, 240.0, 290.0]])
# Faster R-CNN RPN rule: IoU >= 0.7 is positive, below 0.3 is negative, anything between is ignored
iou = box_iou(torch.tensor(anchors), person).squeeze(1)
for (size, ratio), value in zip(shapes, iou.tolist()):
label = "positive" if value >= 0.7 else "negative" if value < 0.3 else "ignored"
print(f"size {size}, ratio {ratio}: IoU {value:.2f} -> {label}")Chỉ anchor cao 128 pixel (tỷ lệ 2.0) chồng lấp đủ với người đi bộ để được xem là dương tính, với IoU 0.88. Hai anchor 128 pixel còn lại, có IoU lần lượt là 0.31 và 0.50, bị bỏ qua; sáu anchor sai kích thước là âm tính. Sau đó, anchor dương tính học các độ lệch theo cách tham số hóa tiêu chuẩn: tâm dịch chuyển theo tỷ lệ của chiều rộng và chiều cao anchor, còn chiều rộng và chiều cao được nhân với hàm mũ của các giá trị dự đoán.
Chọn kích thước anchor cho tập dữ liệu#
Anchor khớp với hình dạng đối tượng trong tập dữ liệu giúp nhiều đối tượng có anchor dương tính hơn, từ đó tăng recall tối đa mà bộ phát hiện có thể đạt được. YOLOv5 của Ultralytics bắt đầu với 9 anchor YOLOv3 và kiểm tra chúng trước khi huấn luyện bằng AutoAnchor: công cụ đo recall tối đa có thể đạt được của các anchor trên nhãn huấn luyện và, nếu kết quả không vượt 0.98, sẽ khớp lại chúng bằng k-means cùng 1.000 thế hệ tiến hóa di truyền, chỉ giữ anchor mới nếu recall được cải thiện.
Hạn chế và bộ phát hiện không dùng anchor#
Anchor kéo theo ba chi phí. Hầu hết trong số hàng chục nghìn anchor trong một ảnh bao phủ nền, khiến loss bị lấn át bởi các mẫu âm tính dễ; RetinaNet đưa ra focal loss để giảm trọng số của chúng. Một số anchor lân cận khớp với cùng một đối tượng, vì vậy đầu ra cần loại bỏ cực đại không tối đa (NMS) để giữ lại một box cho mỗi đối tượng. Kích thước, tỷ lệ khung hình và ngưỡng IoU cũng là các siêu tham số cần thay đổi theo từng tập dữ liệu và kích thước ảnh.
Bộ phát hiện không dùng anchor loại bỏ các siêu tham số đó bằng cách dự đoán box từ các điểm hoặc keypoint; phần lớn bộ phát hiện thời gian thực được phát hành từ YOLOX năm 2021 trở đi đều không dùng anchor. Anchor vẫn được dùng trong các bộ phát hiện dựa trên anchor như Faster R-CNN, Mask R-CNN và RetinaNet. Khi so sánh RetinaNet với FCOS không dùng anchor, ATSS phát hiện rằng sau khi cả hai dùng cùng một cách chọn mẫu dương tính, RetinaNet với 9 anchor trên mỗi vị trí không chính xác hơn so với khi chỉ dùng 1 anchor.










