Detection Head
Đầu phát hiện là phần cuối cùng của bộ phát hiện đối tượng, chuyển các đặc trưng từ backbone và neck thành tọa độ hộp và điểm số lớp tại mỗi vị trí trên lưới.
Detection head là tập hợp các lớp cuối cùng trong mạng phát hiện đối tượng. Detection head đọc feature map do các lớp trước đó tạo ra và xuất ra bounding box cùng điểm số cho từng lớp tại mọi vị trí ứng viên. Thiết kế của head quyết định cách mã hóa bounding box—dưới dạng độ lệch so với anchor box hay khoảng cách từ một điểm—số lượng bounding box ứng viên mà model tạo ra, và liệu có cần bước hậu xử lý như non-maximum suppression (NMS) để loại bỏ các dự đoán trùng lặp hay không.
Vị trí của head#
Detector hiện đại gồm ba giai đoạn. Backbone, thường là mạng tích chập hoặc vision transformer, chuyển pixel thành feature map có độ phân giải giảm dần và nội dung ngữ nghĩa tăng dần theo độ sâu. Neck, chẳng hạn mạng kim tự tháp đặc trưng (FPN), hợp nhất map sâu và nông để mỗi tỷ lệ đầu ra mang cả chi tiết tinh lẫn ngữ cảnh. Sau đó, head chạy các nhánh tích chập nhỏ trên từng cấp kim tự tháp, thường ở stride 8, 16 và 32, để map mịn tìm đối tượng nhỏ còn map thô tìm đối tượng lớn.
Detector một giai đoạn có một head dày đặc duy nhất, dự đoán tại mọi ô lưới. Detector hai giai đoạn như Faster R-CNN có hai head: mạng đề xuất vùng chấm điểm anchor tại mọi vị trí, sau đó head vùng quan tâm phân loại và tinh chỉnh vài trăm vùng được đề xuất.
Cách head dự đoán bounding box và lớp#
Tại mỗi ô lưới, head dày đặc dự đoán ba loại giá trị:
- Điểm số lớp: Một điểm cho mỗi lớp; mỗi điểm được đưa qua sigmoid để một vị trí có thể chấm điểm độc lập cho từng lớp.
- Hồi quy bounding box: Bốn số xác định vị trí bounding box, dưới dạng độ lệch để dịch chuyển và đổi kích thước anchor box hoặc khoảng cách từ tâm ô đến bốn cạnh của bounding box.
- Đầu ra chất lượng và tác vụ: Điểm objectness (YOLOv1 đến YOLOv5) hoặc điểm centerness (FCOS) dùng để xếp hạng bounding box, cùng các giá trị riêng cho từng tác vụ như hệ số mask cho phân đoạn instance hoặc keypoint cho ước lượng tư thế.
Cách mã hóa bounding box là điểm khác biệt giữa detector dựa trên anchor và detector không cần anchor. Mỗi nhánh gồm một vài phép tích chập, kết thúc bằng phép tích chập 1 × 1 với một channel đầu ra cho mỗi giá trị dự đoán. RetinaNet và FCOS đã sử dụng các nhánh phân loại và hồi quy riêng biệt; đến năm 2021, YOLOX đưa head tách biệt này vào YOLO và cho biết tốc độ hội tụ khi huấn luyện nhanh hơn nhiều so với lớp đầu ra dùng chung duy nhất của YOLOv3. Sơ đồ bên dưới xây dựng các lớp 1 × 1 cuối cùng cho ba cấp kim tự tháp của hình ảnh 640 × 640, rồi làm phẳng đầu ra thành một danh sách ứng viên:
import torch
from torch import nn
# Neck outputs for a 640x640 image at strides 8, 16, and 32 (80x80, 40x40, and 20x20 grids)
channels = (64, 128, 256)
features = [torch.randn(1, c, 640 // s, 640 // s) for c, s in zip(channels, (8, 16, 32))]
# Decoupled head: a box branch (4 values) and a class branch (80 scores) for every pyramid level
box_branches = nn.ModuleList(nn.Conv2d(c, 4, 1) for c in channels)
cls_branches = nn.ModuleList(nn.Conv2d(c, 80, 1) for c in channels)
# Flatten each level's grid and concatenate, giving one candidate per grid cell
boxes = torch.cat([branch(f).flatten(2) for branch, f in zip(box_branches, features)], dim=2)
scores = torch.cat([branch(f).flatten(2) for branch, f in zip(cls_branches, features)], dim=2).sigmoid()
print(f"boxes {tuple(boxes.shape)}, class scores {tuple(scores.shape)}")Đoạn mã in ra boxes (1, 4, 8400), class scores (1, 80, 8400): 6.400 + 1.600 + 400 ô lưới, mỗi ô đề xuất một bounding box với 80 điểm số lớp.
Từ đầu ra thô đến các phát hiện#
Quá trình huấn luyện xác định số dự đoán được gán cho mỗi đối tượng. Cách gán một-nhiều đánh dấu một số ô gần mỗi đối tượng là mẫu dương, cung cấp nhiều tín hiệu huấn luyện hơn cho head và để lại một số bounding box chồng lấp trên mỗi đối tượng khi inference, vì vậy NMS giữ lại bounding box tốt nhất. Cách gán một-một, được DETR và head inference của YOLOv10 sử dụng, huấn luyện chính xác một dự đoán cho mỗi đối tượng, vì thế đầu ra không cần NMS.
Head của YOLO26 dự đoán trực tiếp khoảng cách đến bốn cạnh, loại bỏ đầu ra Distribution Focal Loss 16 bin cho mỗi cạnh mà YOLOv8 và YOLO11 sử dụng; đồng thời huấn luyện một bản sao một-nhiều và một bản sao một-một của các nhánh bounding box và lớp. Theo mặc định, YOLO26 áp dụng NMS cho đầu ra một-nhiều; truyền nms=False sẽ chuyển sang các nhánh một-một, trả về tối đa 300 bounding box mỗi hình ảnh mà không cần bước NMS.
Thiết kế head trong thực tế#
- Fine-tune trên các lớp mới: Nhánh lớp kết thúc bằng một channel đầu ra cho mỗi lớp, vì vậy huấn luyện trên dataset có số lớp khác cần một lớp phân loại cuối cùng mới; còn trọng số backbone và neck đã tiền huấn luyện vẫn được giữ lại.
- Triển khai: Mọi phép toán trong head đều chạy trên thiết bị đích, vì vậy giải mã bounding box đơn giản và đầu ra không cần NMS giúp export dễ hơn, đồng thời giảm thời gian hậu xử lý.
- Đối tượng nhỏ: Thêm cấp kim tự tháp stride-4 giúp head có lưới mịn hơn để phát hiện vật thể cực nhỏ, nhưng làm tăng chi phí tính toán: với đầu vào 640 × 640, cấp này bổ sung 160 × 160 = 25.600 ô, gấp bốn lần cấp stride-8.










