Tự động gán nhãn với Grounding DINO và SAM: Rút ngắn thời gian chuẩn bị Dataset từ hàng tuần xuống còn vài giờ

AI tutorial - IT technology blog
AI tutorial - IT technology blog

Nút thắt cổ chai dữ liệu lúc 2 giờ sáng

Lúc đó là 2 giờ sáng, và nhóm của tôi đang phải đối mặt với một deadline gắt gao cho dự án phát hiện vật thể tùy chỉnh. Chúng tôi cần xác định các đinh tán bị oxy hóa trên cánh tuabin—những thành phần không hề tồn tại trong bất kỳ bộ dữ liệu công khai nào. Chúng tôi có 15.000 hình ảnh thô. Báo giá gán nhãn thủ công qua CVAT là ba tuần. Nhưng chúng tôi chỉ có chính xác ba ngày.

Đây chính là điểm nghẽn tiềm ẩn trong Computer Vision. Bạn có kiến trúc transformer mới nhất và nguồn lực tính toán GPU dồi dào. Tuy nhiên, bạn vẫn bị kẹt lại để chờ con người nhấp vào các hộp giới hạn (bounding box) với mức lương 15 USD một giờ. Nếu bạn đã từng dành cả cuối tuần để khoanh vùng các tế bào vi mô hoặc các container vận chuyển, bạn sẽ hiểu sự ức chế này. Nút thắt cổ chai không nằm ở chu kỳ huấn luyện; nó nằm ở khối lượng công việc thủ công khổng lồ cần thiết trước khi epoch đầu tiên bắt đầu.

Tại sao gán nhãn thủ công luôn gặp bế tắc

Sự chậm trễ của chúng tôi không phải do thiếu nhân lực. Đó là sự kém hiệu quả vốn có của quy trình human-in-the-loop. Khi kiểm tra lại quy trình, ba điểm ma sát chính đã lộ diện:

  • Khoảng cách do sự mệt mỏi: Sau hình ảnh thứ 400, độ chính xác của con người giảm mạnh. Các bounding box bị lệch 5-10 pixel, và các lớp có ngoại hình tương tự bị tráo đổi cho nhau.
  • Yêu cầu về chuyên gia: Bạn không thể thuê ngoài việc gán nhãn các lỗi bán dẫn 22nm cho một xưởng gán nhãn phổ thông. Bạn cần những kỹ sư biết lỗi đó trông như thế nào. Thời gian của họ quá quý giá để dành cho việc vẽ hộp.
  • Nghịch lý Khởi đầu Lạnh (Cold Start Paradox): Bạn cần một mô hình để giúp gán nhãn dữ liệu, nhưng bạn không thể huấn luyện mô hình đó vì bạn chưa có dữ liệu đã gán nhãn. Đó là một vòng lặp gây nản lòng.

Đánh giá các giải pháp thay thế

Trước khi xây dựng quy trình hiện tại, chúng tôi đã khám phá một số cách để phá vỡ thế bế tắc:

1. Các mô hình YOLO đã huấn luyện sẵn

Sử dụng mô hình YOLOv8 được huấn luyện sẵn trên bộ dữ liệu COCO là bước đầu tiên tiêu chuẩn. Nó cực kỳ nhanh, nhưng bị giới hạn trong 80 lớp cơ bản. Nếu mục tiêu của bạn không phải là “người” hay “xe hơi”, mô hình này về cơ bản là “mù”. Nó thất bại trong việc tổng quát hóa cho các bộ phận công nghiệp đặc thù mà không có nhãn sẵn có.

2. Model-in-the-Loop

Cách tiếp cận này bao gồm việc con người chỉnh sửa các dự đoán thô của mô hình. Mặc dù nhanh hơn so với việc bắt đầu từ con số không, nhưng con người vẫn là yếu tố giới hạn tốc độ chính. Bạn vẫn phải trả tiền cho từng giây tập trung và từng cử động chuột của con người.

3. Các Foundation Model Zero-Shot

Đây chính là bước đột phá của chúng tôi. Bằng cách kết hợp Grounding DINO với Segment Anything Model (SAM), chúng tôi đã xây dựng một quy trình hiểu được ngữ cảnh mà không cần huấn luyện trước. DINO tìm vật thể bằng các câu lệnh văn bản (text prompt); SAM xử lý việc tạo mask chính xác đến từng pixel. Không cần vẽ hộp thủ công.

Nguyên lý: Grounding DINO + SAM

Hãy coi Grounding DINO như “đôi mắt” hiểu được ngôn ngữ tự nhiên. Bạn cung cấp một prompt như “đinh tán bị gỉ trên dầm thép”, và nó trả về một bounding box. Tuy nhiên, các hộp này thường lỏng lẻo hoặc hơi lệch tâm. Đó là lúc SAM xuất hiện. SAM lấy hộp đó làm gợi ý không gian và bao bọc nó thành một mask độ phân giải cao, cực kỳ chính xác.

Tôi đã triển khai bộ công cụ này trong các môi trường sản xuất từ công nghệ nông nghiệp đến sản xuất công nghiệp nặng. Nó liên tục cắt giảm thời gian lặp lại trên các bộ dữ liệu mới từ hàng tuần xuống còn vài giờ chạy script.

Xây dựng quy trình tự động gán nhãn

Bạn sẽ cần một GPU với ít nhất 12GB VRAM để chạy quy trình này hiệu quả. Việc cố gắng chạy các foundation model này trên CPU sẽ dẫn đến thời gian suy luận (inference) hơn 30 giây cho mỗi hình ảnh—quá chậm cho các lô dữ liệu lớn.

Bước 1: Thiết lập môi trường

pip install torch torchvision
pip install git+https://github.com/IDEA-Research/GroundingDINO.git
pip install git+https://github.com/facebookresearch/segment-anything.git
pip install opencv-python supervision pycocotools

Bước 2: Phát hiện vật thể với Grounding DINO

Chúng tôi khởi tạo Grounding DINO để phát hiện vật thể dựa trên các chuỗi văn bản. Không giống như các bộ phát hiện truyền thống, chúng tôi không sử dụng ID lớp. Chúng tôi sử dụng mô tả bằng tiếng Anh.

from groundingdino.util.inference import load_model, load_image, predict
import cv2

CONFIG_PATH = "GroundingDINO_SwinT_OGC.py"
WEIGHTS_PATH = "groundingdino_swint_ogc.pth"
model = load_model(CONFIG_PATH, WEIGHTS_PATH)

IMAGE_PATH = "turbine_blade_01.jpg"
TEXT_PROMPT = "đinh tán bị oxy hóa"
BOX_THRESHOLD = 0.35
TEXT_THRESHOLD = 0.25

image_source, image = load_image(IMAGE_PATH)

boxes, logits, phrases = predict(
    model=model, 
    image=image, 
    caption=TEXT_PROMPT, 
    box_threshold=BOX_THRESHOLD, 
    text_threshold=TEXT_THRESHOLD
)

Bước 3: Tạo Mask với SAM

Bây giờ chúng ta đưa các hộp từ DINO vào SAM. Bước này rất quan trọng cho các tác vụ instance segmentation (phân đoạn thực thể) khi mà độ chính xác ở cấp độ hộp là chưa đủ.

from segment_anything import SamPredictor, sam_model_registry

sam = sam_model_registry["vit_h"](checkpoint="sam_vit_h_4b8939.pth").to("cuda")
predictor = SamPredictor(sam)
predictor.set_image(image_source)

# Các box từ DINO được chuẩn hóa theo định dạng [cx, cy, w, h]. 
# Chúng ta chuyển đổi chúng sang tọa độ pixel [x1, y1, x2, y2] cho SAM.
for box in boxes:
    masks, scores, _ = predictor.predict(
        box=box.numpy(),
        multimask_output=False
    )
    # Kết quả là một boolean mask chất lượng cao để huấn luyện

Triển khai thực tế: Chiến lược Distillation

Grounding DINO và SAM rất nặng. Chạy một mô hình SAM ViT-H để suy luận thời gian thực trên thiết bị cạnh (edge device) là điều không thể. Thay vào đó, hãy sử dụng quy trình này để tạo ra 10.000 nhãn “chuẩn bạc” (silver-standard) qua đêm. Sau đó, sử dụng các nhãn đó để huấn luyện một mô hình nhẹ hơn như YOLOv8 hoặc RT-DETR.

Chiến lược này mang lại cho bạn những gì tốt nhất của cả hai thế giới. Bạn có được khả năng suy luận sâu của các foundation model trong giai đoạn gán nhãn và tốc độ suy luận tính bằng mili giây trên phần cứng sản xuất của mình.

Lọc bỏ để đảm bảo chất lượng

Các hệ thống tự động thỉnh thoảng sẽ gặp hiện tượng ảo giác (hallucinate). Trong các thử nghiệm của chúng tôi, Grounding DINO đôi khi gắn nhãn các bóng đổ là vật thể. Tôi khuyên bạn nên sử dụng một bộ lọc độ tin cậy: nếu điểm logit dưới 0.45, hãy đánh dấu hình ảnh đó để con người xem xét trong 5 giây. Điều này giúp giảm khối lượng công việc thủ công khoảng 92% trong khi vẫn duy trì tính toàn vẹn cao của bộ dữ liệu.

Lời kết

Thời đại của việc nhấp chuột vẽ hộp trong nhiều tuần đang dần kết thúc. Nếu nhóm của bạn vẫn đang gán nhãn thủ công cho từng khung hình, bạn đang lãng phí thời gian lẽ ra nên dành cho việc tối ưu hóa mô hình hoặc xử lý các trường hợp biên (edge-case engineering). Bằng cách kết hợp Grounding DINO và SAM, bạn biến việc gán nhãn từ một công việc chân tay nặng nhọc thành một nhiệm vụ prompt engineering.

Hãy chạy thử một lô nhỏ để tinh chỉnh các ngưỡng của bạn. Khi các mask đã trông sắc nét, hãy để script xử lý toàn bộ dữ liệu tồn đọng. Bạn sẽ thức dậy với một bộ dữ liệu đã được gán nhãn đầy đủ, sẵn sàng cho quy trình huấn luyện.

Share: