Ultralytics YOLO27: Tham gia danh sách chờ.
Get Started
Nền tảng Thị giác máy tính·Chọn tác vụ·Bài học 4/10
Bài họcngười mới bắt đầu

Hộp và mask: khi nào bạn thực sự cần segmentation

Đo lường phần mask bổ sung được gì so với hộp trên ảnh thực tế, rồi dựa vào thành phần downstream để quyết định dự án có thực sự cần hình dạng hay không.

Mask là thứ mà hầu hết mọi người hình dung khi nghĩ đến thị giác AI, đồng thời cũng là phần khiến các nhóm tiêu tốn nhiều ngân sách gán nhãn nhất. Mask cho biết hình dạng chính xác của vật thể; hộp chỉ cho biết vị trí của vật thể. Sự khác biệt đó quyết định hoàn toàn một số sản phẩm — nhưng không làm thay đổi gì đối với phần lớn sản phẩm.

Kết quả

Đo chênh lệch giữa hộp và mask trên một ảnh, rồi chọn hộp hoặc mask cho dự án dựa trên code đọc đầu ra.

Lộ trình cấp tốc
Nếu bạn đã nắm rõ cách thực hiện, đây là phiên bản tóm tắt.
  1. Hộp cung cấp vị trí; mask cung cấp hình dạng, diện tích và đường biên chính xác.

  2. Cần diện tích, lỗ khoét hay khoảng hở? Dùng mask. Cần đếm, xác định vùng, tracking hay crop? Dùng hộp.

  3. Đếm từng vật thể: instance segmentation. Chỉ cần độ phủ vùng: semantic segmentation.

  4. So sánh số pixel ở cùng độ phân giải: retina_masks=True.

  5. Đo thời gian tạo 20 hộp so với 20 polygon trước khi quyết định ngân sách gán nhãn.

Thực hành

Mask bổ sung được gì#

Instance segmentation bằng Ultralytics YOLO tại một giao lộ trong thành phố, với mask riêng cho từng ô tô, xe buýt và người đi bộ

Với mỗi vật thể, tác vụ Segment trả về mọi thông tin mà detector trả về — lớp, hộp, confidence — cùng các pixel thuộc về vật thể; nhờ vậy, mỗi chiếc ô tô ở trên có đường viền riêng, tách biệt với xe buýt và người đi bộ. Đọc mask dưới dạng polygon (masks.xy) hoặc ảnh nhị phân (masks.data).

Hình dạng làm thay đổi các con số đến mức nào? So sánh diện tích hộp với diện tích mask của từng vật thể:

from ultralytics import YOLO

model = YOLO("yolo26n-seg.pt")
result = model("https://ultralytics.com/images/bus.jpg", retina_masks=True, verbose=False)[0]

for box, mask in zip(result.boxes, result.masks.data):
    x1, y1, x2, y2 = box.xyxy[0].tolist()
    box_area = (x2 - x1) * (y2 - y1)
    mask_area = float(mask.sum())  # pixels inside the object's mask
    name, ratio = result.names[int(box.cls)], mask_area / box_area
    print(f"{name:7} box={box_area:7.0f} px  mask={mask_area:7.0f} px  ({ratio:.0%})")
person  box=  97116 px  mask=  49331 px  (51%)
person  box=  68102 px  mask=  21316 px  (31%)
bus     box= 410093 px  mask= 255265 px  (62%)
person  box=  55998 px  mask=  33524 px  (60%)
person  box=  23690 px  mask=  11109 px  (47%)

Xe buýt chỉ chiếm 62% diện tích hộp, còn một người chỉ chiếm 31%. Mọi con số tính riêng từ hộp — diện tích được sơn, kích thước vết tràn, phần kệ còn trống — đều sẽ sai lệch ở mức đó. Nếu sản phẩm của bạn báo cáo những con số như vậy, bạn cần mask. Nếu sản phẩm chỉ đếm hoặc xác định vị trí, số pixel bổ sung không tạo ra khác biệt.

So sánh số pixel ở cùng độ phân giải

Triệu chứng: diện tích mask có vẻ nhỏ hơn diện tích hộp 3–4 lần. Nguyên nhân: theo mặc định, masks.data được trả về ở kích thước inference (ở đây là 640×480), trong khi các hộp dùng pixel của ảnh gốc (1080×810). Cách khắc phục: truyền retina_masks=True như trên, hoặc tự mình điều chỉnh tỷ lệ các số đếm.

Quyết định dựa trên thành phần sử dụng đầu ra, không phải bản demo#

Nhu cầu downstreamChỉ dùng hộp có đủ không?Lý do
Đếm vật thể hoặc kiểm tra sự hiện diệnCóVị trí là toàn bộ câu trả lời
Cảnh báo khi vật thể đi vào một vùngCóChỉ cần hộp cắt qua một đường
Tracking vật thể qua các frameCóTracker liên kết các hộp
Crop để đưa vào classifier thứ haiCóCrop chỉ cần hộp
Đo diện tích hoặc độ phủ (cỏ dại, gỉ sét, vết tràn)KhôngHình dạng không đều khiến diện tích hộp trở nên vô nghĩa
Tách vật thể khỏi nền (xóa nền, AR)KhôngBạn cần đường biên chính xác
Kiểm tra khoảng hở hoặc tiếp xúc (robot gắp vật, va chạm)KhôngHộp phóng đại kích thước vật thể
Tách các vật thể không đều đang chạm nhauThường là khôngCác hộp chồng lấn khiến khó xác định pixel nào thuộc về vật thể nào

Nếu tất cả các hàng tương ứng với nhu cầu sản phẩm đều ghi "có", hãy triển khai detector. Chỉ dùng YOLO26 segmentation khi hình dạng thực sự cần thiết.

Instance segmentation và semantic segmentation#

Instance segmentation tạo mask riêng cho từng vật thể, vì vậy ba chiếc ô tô chồng lấn vẫn được giữ thành ba chiếc riêng biệt. Semantic segmentation gán một lớp cho từng pixel và không cung cấp thông tin nào khác: mọi pixel ô tô trở thành một vùng "ô tô", và không thể đếm riêng nữa. Dùng instance segmentation để đếm hoặc đo từng vật thể — tế bào, trái cây, lỗi sản phẩm. Dùng semantic segmentation để đo độ phủ vùng — đường so với vỉa hè, cây trồng so với đất.

Chi phí gán nhãn hình dạng#

Tạo một hộp cần hai lần nhấp. Một polygon chất lượng tốt có thể cần hàng chục lần, và mỗi đường biên đều có thể khiến người gán nhãn bất đồng: chiếc túi có thuộc về người đó không, bóng đổ có phải là một phần của ô tô không? Hãy tự đo chi phí thay vì tin vào quy tắc kinh nghiệm: tính thời gian người gán nhãn cần để tạo hộp cho 20 vật thể và polygon cho chính 20 vật thể đó, rồi nhân phần chênh lệch với quy mô dataset của bạn.

Các công cụ có AI hỗ trợ giúp thu hẹp đáng kể khoảng cách. Gán nhãn thông minh và gán nhãn hàng loạt đề xuất mask dựa trên một lần nhấp hoặc một hộp, để người gán nhãn chỉnh sửa đường biên thay vì vẽ lại — nhưng vẫn cần có người kiểm tra từng đường biên.

Viết quy tắc ranh giới trước khi tạo mask đầu tiên

Trước khi bắt đầu gán nhãn, hãy quyết định cách xử lý tình trạng che khuất, đối tượng trong suốt, bóng đổ, đối tượng bị cắt ở mép khung hình và vật gắn kèm (túi, tay cầm, hàng hóa), rồi cung cấp cùng một tài liệu cho người gán nhãn và người đánh giá. Các phương pháp gán nhãn tốt nhất trình bày cách thực thi các quy tắc; dataset COCO-Seg cho thấy các mask nhất quán ở quy mô lớn.

Khi kiểm tra mẫu mask, hãy tìm tràn (mask vượt quá đường biên), lỗ hổng (bỏ sót vùng bên trong vật thể), đường biên giả (mask chạy theo lỗi JPEG) và bộ phận không rõ ràng (tay cầm vali có nằm trong mask của vali không?).

Dùng thử

Chạy script so sánh hộp và mask trên ảnh từ dự án của bạn (hoặc bus.jpg). Ghi lại tỷ lệ mask/hộp cho lớp chính, tìm hàng trong bảng thành phần sử dụng đầu ra phù hợp với nhu cầu downstream, rồi viết một dòng: “hộp” hoặc “mask”, kèm theo thành phần sử dụng đầu ra đã quyết định lựa chọn đó.

Điều kiện hoàn thành
Bạn đã hoàn thành bài học khi tất cả các điều kiện sau đều đúng.
  • Bạn đã đo được tỷ lệ mask/hộp cho lớp chính.

  • Bạn đã viết một dòng chọn hộp hoặc mask và nêu tên thành phần downstream quyết định lựa chọn đó.

  • Nếu chọn mask, bạn đã đo thời gian tạo 20 hộp so với 20 polygon và liệt kê các quy tắc về đường biên.

Hiển thị lời giải

Giả sử hai sản phẩm cùng sử dụng camera trên xe buýt: một bộ đếm người và một báo cáo mức độ chiếm dụng đường phố cho biết phương tiện chiếm bao nhiêu phần của khung cảnh. Đo cả hai kết quả từ cùng một lần chạy:

from ultralytics import YOLO

model = YOLO("yolo26n-seg.pt")
result = model("https://ultralytics.com/images/bus.jpg", retina_masks=True, verbose=False)[0]
height, width = result.orig_shape

for name in sorted({result.names[int(c)] for c in result.boxes.cls}):
    rows = [i for i, c in enumerate(result.boxes.cls) if result.names[int(c)] == name]
    union = result.masks.data[rows].amax(dim=0)  # merge masks so overlaps count once
    box_union = sum(float((b[2] - b[0]) * (b[3] - b[1])) for b in result.boxes.xyxy[rows])
    print(f"{name:6} {len(rows)} objects | masks cover {float(union.sum()) / (height * width):.0%} of the image, boxes {box_union / (height * width):.0%}")
bus    1 objects | masks cover 29% of the image, boxes 47%
person 4 objects | masks cover 13% of the image, boxes 28%
  • Bộ đếm người → hộp. Dù dùng cách nào, kết quả đếm vẫn là 4; mask làm tăng chi phí gán nhãn mà không đem lại thay đổi gì.
  • Báo cáo mức độ chiếm dụng → mask. Hộp cho rằng xe buýt chiếm 47% khung cảnh; thực tế chỉ là 29%. Báo cáo dựa trên hộp sẽ sai lệch hơn một nửa.
Tiếp theo là gì

Tiếp theo: hai tác vụ chuyên biệt — pose, trong đó đầu ra là bộ xương, và OBB, trong đó hộp được xoay.

Đăng nhập để lưu tiến độ