Two-Stage Object Detectors
Bộ phát hiện đối tượng hai giai đoạn đề xuất các vùng ứng viên, sau đó phân loại và tinh chỉnh từng vùng. Tìm hiểu cách Faster R-CNN hoạt động, họ R-CNN và các đánh đổi.
Bộ phát hiện đối tượng hai giai đoạn là các model phát hiện đối tượng chia tác vụ thành hai bước: giai đoạn đầu đề xuất các vùng ảnh có thể chứa đối tượng, còn giai đoạn hai phân loại từng vùng và tinh chỉnh bounding box của vùng đó. Họ R-CNN định hình thiết kế này trong giai đoạn 2014–2018 và dẫn đầu các benchmark phát hiện cũng như phân đoạn instance trong nhiều năm. Bộ phát hiện đối tượng một giai đoạn bỏ qua bước đề xuất và dự đoán mọi box từ một lưới dày đặc chỉ trong một lượt, đó là lý do hầu hết hệ thống thời gian thực sử dụng chúng.
Cách hoạt động của bộ phát hiện hai giai đoạn#
Backbone mạng nơ-ron tích chập tính toán feature map cho toàn bộ hình ảnh một lần, thường có mạng kim tự tháp đặc trưng (FPN) ở phía trên. Giai đoạn đầu, mạng đề xuất vùng (RPN), chấm điểm một tập hợp anchor box tại mọi vị trí trên feature map để xác định khả năng có đối tượng và hồi quy các độ lệch để thay đổi hình dạng của chúng; Faster R-CNN dùng chín anchor tại mỗi vị trí, gồm ba kích thước nhân với ba tỷ lệ khung hình. Non-maximum suppression (NMS) loại bỏ các đề xuất chồng lấn; những vùng có điểm cao nhất—300 vùng mỗi ảnh khi kiểm thử trong bài báo gốc—được chuyển sang giai đoạn hai. Tại đây, RoI pooling hoặc phiên bản chính xác hơn là RoIAlign cắt một lưới đặc trưng kích thước cố định cho mỗi đề xuất; một head nhỏ dự đoán lớp, bao gồm cả lớp nền, cùng độ lệch box riêng cho từng lớp trên mỗi vùng cắt.
Một forward hook trên RPN của Faster R-CNN trong torchvision cho thấy giai đoạn hai xử lý bao nhiêu vùng:
import urllib.request
from PIL import Image
from torchvision.models.detection import FasterRCNN_ResNet50_FPN_V2_Weights, fasterrcnn_resnet50_fpn_v2
# Load Faster R-CNN with a ResNet-50 FPN backbone, pretrained on COCO
weights = FasterRCNN_ResNet50_FPN_V2_Weights.DEFAULT
model = fasterrcnn_resnet50_fpn_v2(weights=weights).eval()
image = Image.open(urllib.request.urlopen("https://ultralytics.com/images/bus.jpg"))
# Report how many regions the first stage, the region proposal network, passes on
model.rpn.register_forward_hook(lambda module, inputs, output: print(f"Stage 1: {len(output[0][0])} proposals"))
# The second stage classifies and refines every proposal
detections = model([weights.transforms()(image)])[0]
labels = detections["labels"][detections["scores"] > 0.5]
print(f"Stage 2: {len(labels)} objects {[weights.meta['categories'][i] for i in labels]}")Lệnh này in ra Stage 1: 1000 proposals và Stage 2: 6 objects ['person', 'bus', 'person', 'person', 'person', 'tie']: torchvision giữ lại 1.000 đề xuất mỗi ảnh khi suy luận, và giai đoạn hai chuyển chúng thành sáu kết quả phát hiện có độ tin cậy cao.
Họ R-CNN#
- R-CNN (2014): Selective search đề xuất khoảng 2.000 vùng; mỗi vùng được biến đổi về kích thước cố định rồi đưa riêng qua CNN, còn máy vector hỗ trợ phân loại các đặc trưng. Vì vậy, phát hiện với backbone VGG-16 mất 47 giây mỗi ảnh trên GPU.
- Fast R-CNN (2015): Tính feature map một lần rồi dùng RoI pooling để lấy đặc trưng của từng đề xuất từ feature map đó giúp huấn luyện VGG-16 nhanh hơn R-CNN 9 lần và kiểm thử nhanh hơn 213 lần.
- Faster R-CNN (2015): RPN thay thế selective search và dùng chung đặc trưng của backbone, nên chi phí tạo đề xuất gần như bằng không và toàn bộ bộ phát hiện chạy ở tốc độ 5 khung hình mỗi giây.
- Mask R-CNN (2017): Nhánh thứ ba dự đoán mặt nạ pixel cho từng vùng, biến bộ phát hiện thành model phân đoạn instance; RoIAlign lấy mẫu đặc trưng tại các vị trí phân số chính xác, thay vì làm tròn như RoI pooling.
- Cascade R-CNN (2018): Ba head giai đoạn hai được huấn luyện với các ngưỡng IoU tăng dần 0.5, 0.6 và 0.7; mỗi head tinh chỉnh box do head trước đó tạo ra, giúp định vị chính xác hơn.
Bộ phát hiện hai giai đoạn và một giai đoạn#
RPN loại bỏ phần lớn nền trước khi bộ phân loại xử lý, nên giai đoạn hai được huấn luyện trên các vùng lấy mẫu mà đối tượng chiếm tỷ lệ cố định—25% trong Fast R-CNN—và phân loại từng vùng bằng đặc trưng được gộp tại đúng vị trí. Bộ phát hiện một giai đoạn chấm điểm mọi vị trí trên một lưới dày đặc, khoảng 100.000 ứng viên mỗi ảnh trong RetinaNet; độ chính xác của chúng kém hơn bộ phát hiện hai giai đoạn cho đến khi focal loss giảm trọng số các ứng viên nền dễ vào năm 2017. Các model một giai đoạn hiện nay đạt độ chính xác ngang bằng hoặc cao hơn model hai giai đoạn với độ trễ thấp hơn nhiều; một mạng duy nhất cũng dễ export sang phần cứng biên hơn, vì vậy model hai giai đoạn hiện chủ yếu xuất hiện dưới dạng baseline nghiên cứu và trong các thư viện như Detectron2. auto_annotate của Ultralytics áp dụng cùng cách tách đề xuất rồi tinh chỉnh trên hai model cho tác vụ gán nhãn dữ liệu: bộ phát hiện YOLO26 đề xuất box, còn Segment Anything Model (SAM) của Meta nhận từng box làm prompt và phân đoạn đối tượng bên trong để tạo nhãn phân đoạn.
Ứng dụng thực tế#
- Chẩn đoán hình ảnh y khoa: Các biến thể Mask R-CNN phát hiện và khoanh vùng từng tế bào, nhân tế bào và tổn thương riêng lẻ trong ảnh hiển vi và ảnh CT, nơi mỗi instance cần có mask riêng để đếm và đo lường.
- Phân tích bố cục tài liệu: Benchmark PubLayNet gồm hơn 360.000 ảnh trang tài liệu được dùng để huấn luyện các model Faster R-CNN và Mask R-CNN định vị khối văn bản, tiêu đề, danh sách, bảng và hình minh họa trước khi nhận dạng văn bản.
- Ảnh hàng không: Oriented R-CNN mở rộng RPN để đề xuất các vùng xoay, nhờ đó giai đoạn thứ hai xuất hộp giới hạn có hướng cho tàu, máy bay và phương tiện trong bộ dữ liệu DOTA.










