Trả lời nhanh: Gán nhãn hình ảnh có ba nhóm chính: bounding box (hộp chữ nhật, rẻ và nhanh, dùng cho phát hiện đối tượng), polygon (đa giác bám viền vật thể) và segmentation (nhãn theo pixel, chi tiết nhất nhưng tốn công nhất). Bạn chọn loại theo việc mô hình phải làm, không theo thói quen.
Điểm chính
- Bounding box trả lời “vật ở đâu”, polygon trả lời “viền vật ra sao”, segmentation trả lời “pixel nào thuộc lớp nào”.
- Chọn loại nhãn dựa trên hai câu hỏi: có cần viền chính xác không, và có cần tách từng cá thể không.
- COCO lưu hộp theo pixel, YOLO lưu theo tỉ lệ 0 đến 1. Chuyển đổi sai là lỗi rất phổ biến.
- Chất lượng nhãn quyết định chất lượng mô hình nhiều hơn số lượng ảnh. Cần bộ quy tắc gán nhãn bằng văn bản cho từng lớp.
Mục lục
- Gán nhãn hình ảnh gồm những loại nào?
- Bounding box: khi nào “một cái hộp” là đủ?
- Polygon: gán nhãn đa giác bám theo viền vật thể
- Segmentation: semantic, instance và panoptic khác nhau thế nào?
- Các loại nhãn khác: keypoint, cuboid, polyline, phân loại ảnh
- Chọn loại nhãn nào cho bài toán của bạn?
- COCO hay YOLO: nhãn được lưu như thế nào?
- Bộ quy tắc gán nhãn: viết những gì cho từng loại?
- Lỗi gán nhãn hình ảnh thường gặp và cách xử lý
- Ảnh có người, biển số, giấy tờ: cần lưu ý gì khi gán nhãn?
- Câu hỏi thường gặp
Gán nhãn hình ảnh gồm những loại nào?
Gán nhãn hình ảnh (image annotation) là việc gắn thông tin do con người xác nhận lên ảnh, để mô hình thị giác máy tính có đáp án mẫu khi huấn luyện. Khái niệm chung và nghề annotator đã có trong bài gán nhãn dữ liệu và nghề annotator. Bài này chỉ đi sâu vào ảnh: mỗi loại nhãn lưu gì, dùng khi nào và hay sai ở đâu.
Có thể chia theo “độ chi tiết của vùng được đánh dấu”. Càng xuống dưới càng sát vật thể, và càng tốn thời gian người gán.
Bounding box: khi nào “một cái hộp” là đủ?
Bounding box là hình chữ nhật bao quanh vật thể, dùng cho bài toán phát hiện đối tượng (object detection). Hộp có thể được biểu diễn bằng hai góc (x1, y1) và (x2, y2), hoặc bằng một góc kèm chiều rộng và chiều cao. Cách biểu diễn nào cũng chứa cùng thông tin, nhưng mỗi công cụ và mô hình chọn một kiểu riêng (xem mục định dạng bên dưới).
Bounding box phổ biến nhất vì chi phí thấp hơn các phương pháp phân đoạn ảnh khác. Nó hợp với vật thể tương đối đối xứng như xe cộ, người đi bộ, biển báo. Bạn nên chọn hộp khi mô hình chỉ cần đếm, định vị hoặc cảnh báo, và không cần biết hình dạng chính xác.
Ba quy tắc vẽ hộp cần viết ra trước khi gán
- Hộp ôm sát hay chừa lề? Chọn một kiểu cho toàn dự án. Nếu người này ôm sát, người kia chừa vài pixel, mô hình sẽ học ra ranh giới nhoè.
- Vật bị che khuất? Quy định rõ: vẽ hộp quanh phần nhìn thấy, hay vẽ cả phần suy đoán. Hai cách cho dữ liệu rất khác nhau.
- Vật bị cắt ở mép ảnh? Quy định ngưỡng, ví dụ chỉ gán khi còn nhìn thấy phần đủ để người thứ hai nhận ra.
Điểm yếu của hộp là bao cả nền. Với vật thể dài và chéo như ống thép nằm xiên, phần lớn diện tích hộp là nền, nên mô hình học lẫn đặc trưng của nền vào lớp vật. Khi gặp tình huống này, hãy cân nhắc polygon.
Polygon: gán nhãn đa giác bám theo viền vật thể
Không phải lúc nào hình chữ nhật cũng phù hợp, vì nhiều thông tin trong hộp không thuộc đối tượng. Khi cần khoanh sát, người ta dùng đa giác. Người gán bấm lần lượt các đỉnh quanh viền, rồi khép kín đường.
Số đỉnh quyết định độ chính xác và công sức. Với vật có cạnh thẳng như thùng carton, 4 đến 6 đỉnh là đủ. Với vật cong như lá cây hay vết nứt, bạn cần nhiều đỉnh hơn ở đoạn cong và ít đỉnh ở đoạn thẳng. Hãy đặt giới hạn: sai lệch viền tối đa mấy pixel là chấp nhận được, và ghi vào bộ quy tắc.
Ví dụ minh hoạ: một xưởng may chụp ảnh vải để phát hiện vết bẩn. Vết bẩn hình dạng bất kỳ, nên hộp chữ nhật sẽ bao thừa vùng vải sạch. Nếu bộ phận kiểm hàng cần đo diện tích vết, polygon là lựa chọn hợp lý. Nếu chỉ cần cảnh báo “ảnh này có vết”, nhãn phân loại cả ảnh đã đủ.
Polygon thường được dùng làm nhãn cho phân đoạn thể hiện (instance segmentation). Trong định dạng COCO, đa giác được lưu trong trường segmentation. Mặt nạ có thể lưu bằng danh sách đỉnh đa giác hoặc bằng RLE (mã hoá độ dài chuỗi) nén cho mặt nạ nhị phân.
Segmentation: semantic, instance và panoptic khác nhau thế nào?
Segmentation gán nhãn ở mức pixel. Ba biến thể thường bị lẫn lộn:
- Semantic segmentation (phân đoạn ngữ nghĩa): mỗi pixel trong ảnh được gán về lớp tương ứng. Hai chiếc xe đỗ sát nhau cùng một màu “xe”, không phân biệt xe nào với xe nào.
- Instance segmentation (phân đoạn thể hiện): mỗi cá thể có một mặt nạ riêng, nên hai chiếc xe thành hai vùng khác nhau. Đây là loại bạn cần khi phải đếm hoặc đo từng vật.
- Panoptic segmentation: kết hợp cả hai. Vật đếm được (xe, người) có mã cá thể, vùng không đếm được (trời, mặt đường, cỏ) chỉ có nhãn lớp. COCO có hỗ trợ định dạng cho panoptic và cả “stuff segmentation” cho các vùng nền kiểu này, theo mô tả trong bài về mạng nơ-ron tích chập thì các mô hình này đều xây trên nền đặc trưng ảnh, nhưng khác nhau ở phần đầu ra.
Chi phí là điểm đánh đổi lớn nhất. Detection dùng bounding box, còn segmentation phải gán bằng mặt nạ và tốn nhiều thời gian hơn. Vì vậy đừng chọn segmentation chỉ vì “chi tiết hơn là tốt hơn”. Nếu quyết định kinh doanh không thay đổi dù viền chính xác hay không, bạn đang trả tiền cho thông tin không ai dùng.
Có tài liệu mô tả semantic segmentation chỉ dùng cho ảnh có một đối tượng chính. Cách nói này dễ gây hiểu lầm. Semantic segmentation vẫn xử lý được cảnh nhiều lớp như đường phố, chỉ là không tách riêng từng cá thể cùng lớp.
Các loại nhãn khác: keypoint, cuboid, polyline, phân loại ảnh
- Phân loại ảnh (image classification): một hoặc vài nhãn cho cả bức ảnh, ví dụ “đạt” hoặc “lỗi”. Rẻ nhất, nhưng không cho biết lỗi nằm ở đâu.
- Keypoint (điểm mốc): đánh dấu các điểm có tên như khớp vai, khuỷu tay, góc mắt. Trong COCO, mỗi điểm lưu toạ độ x, y và một giá trị nhìn thấy (visibility). Dùng cho ước lượng tư thế, ví dụ kiểm tra thao tác của công nhân hay đo dáng đi.
- Cuboid 3D: giống bounding box nhưng đóng khung vật thể vào một hình hộp, giúp hình dung vị trí trong không gian ba chiều. Thường gặp ở dữ liệu giao thông và robot kho.
- Polyline: chuỗi đoạn thẳng cho vật dài mảnh như vạch kẻ đường, dây cáp, đường ống. Hộp hay đa giác khép kín đều không phù hợp với loại này.
Các mô hình đa phương thức hiện nay đọc được cả ảnh lẫn chữ, nhưng việc huấn luyện hay đánh giá chúng cho miền hẹp (ví dụ lỗi bề mặt linh kiện) vẫn cần nhãn có vùng rõ ràng. Bạn có thể xem thêm ở bài multimodal AI.
Chọn loại nhãn nào cho bài toán của bạn?
Hai câu hỏi đủ để loại bỏ phần lớn lựa chọn: một là kết quả có cần viền chính xác không, hai là có cần tách từng cá thể cùng lớp không.
| Tiêu chí | Bounding box | Polygon | Segmentation theo pixel |
|---|---|---|---|
| Dữ liệu lưu | 4 số (toạ độ và kích thước) | Danh sách đỉnh x, y | Mặt nạ (ảnh nhãn hoặc RLE) |
| Công sức gán | Thấp nhất | Trung bình đến cao | Cao nhất |
| Bài toán điển hình | Phát hiện, đếm, cảnh báo | Đo diện tích, vật hình bất quy tắc | Hiểu toàn cảnh, ảnh y tế, ảnh vệ tinh |
| Rủi ro chính | Hộp lẫn nền ở vật chéo, dài | Số đỉnh không đồng đều giữa người gán | Viền mờ, vùng giao nhau giữa hai lớp |
| Khi hai vật chồng nhau | Hộp chồng nhau, vẫn tách được | Cần quy ước vùng giao nhau | Semantic: gộp; instance: tách mặt nạ |
Ví dụ minh hoạ: một kho hàng muốn đếm pallet trên camera, thì bounding box đủ dùng. Cũng kho đó, muốn biết pallet nào bị nghiêng vượt mép kệ thì cần viền, nên polygon hoặc instance segmentation mới có ích. Cùng một bộ ảnh nhưng hai mục tiêu cho ra hai chi phí gán nhãn rất khác nhau.
Bạn cũng không bắt buộc phải gán lại từ đầu khi nhu cầu thay đổi. Nếu đã có polygon, bạn tính được hộp bao nhỏ nhất từ các đỉnh. Chiều ngược lại thì không làm được. Vì vậy khi chưa chắc, gán polygon cho một mẫu nhỏ rồi suy ra hộp thường linh hoạt hơn. Ngoài ra, khi dữ liệu ít, bạn có thể tăng đa dạng bằng kỹ thuật data augmentation, nhưng nhớ rằng lật, xoay, cắt ảnh đều làm đổi toạ độ nhãn và phải biến đổi theo.
COCO hay YOLO: nhãn được lưu như thế nào?
Đây là chỗ nhiều dự án gặp lỗi mà không thấy báo lỗi. Hai định dạng phổ biến lưu hộp theo hai cách khác nhau:
- COCO JSON gom toàn bộ nhãn vào một file, còn YOLO dùng mỗi ảnh một file văn bản với toạ độ chuẩn hoá.
- COCO lưu bbox dạng [x_min, y_min, width, height] tính bằng pixel; YOLO lưu class, x_center, y_center, width, height đã chuẩn hoá về khoảng 0 đến 1.
- Với segmentation, COCO dùng mảng đa giác trong trường segmentation, còn YOLO ghi toạ độ đa giác sau mã lớp.
| Đặc điểm | COCO | YOLO |
|---|---|---|
| Cấu trúc file | Một file JSON cho cả tập | Một file txt cho mỗi ảnh |
| Đơn vị toạ độ | Pixel tuyệt đối | Tỉ lệ so với kích thước ảnh |
| Điểm gốc của hộp | Góc trên trái | Tâm hộp |
| Mã lớp | category_id, khai báo trong categories | Số thứ tự lớp, thường bắt đầu từ 0 |
| Dữ liệu phụ | area, iscrowd, mặt nạ RLE | Gần như không có |
Theo mô tả của Roboflow trong tài liệu RF-DETR, trường iscrowd trong COCO có giá trị 0 cho đối tượng đơn lẻ và 1 cho vùng đám đông. Vùng đám đông thường được lưu bằng RLE thay vì đa giác. Khi chuyển sang YOLO, các nhãn iscrowd bằng 1 và hộp diện tích bằng 0 bị bỏ qua trong cách làm của Ultralytics. Nếu bạn gán cả đám đông, hãy kiểm tra xem công cụ huấn luyện có âm thầm bỏ chúng không.
Ví dụ tính tay: đổi một hộp COCO sang YOLO
Ví dụ minh hoạ dùng ảnh 640×480 và hộp lớp “helmet” với bbox [100, 50, 200, 150] (giá trị lấy từ ví dụ trong tài liệu của Ultralytics). Cách tính:
- Tâm x = (100 + 200 / 2) / 640 = 0,3125.
- Tâm y = (50 + 150 / 2) / 480 ≈ 0,2604.
- Rộng = 200 / 640 = 0,3125; cao = 150 / 480 = 0,3125.
- Nếu “helmet” có category_id bằng 1 trong COCO thì lớp YOLO thường là 0. Dòng kết quả: 0 0.3125 0.2604 0.3125 0.3125.
Bước kiểm tra cuối rất đáng làm: vẽ ngược hộp lên 20 đến 30 ảnh ngẫu nhiên. Nếu hộp lệch đều sang một phía, bạn đã nhầm giữa góc trên trái và tâm. Nếu hộp bị méo theo chiều, bạn đã chia nhầm rộng cho cao.
Bộ quy tắc gán nhãn: viết những gì cho từng loại?
Bộ quy tắc (labeling guideline) là tài liệu mà mọi người gán nhãn đọc trước khi bắt đầu. Quy trình đầy đủ, từ nhận việc đến nghiệm thu, nằm ở bài quy trình gán nhãn dữ liệu cho AI. Ở đây là phần riêng cho ảnh:
- Danh sách lớp và ranh giới giữa các lớp. “Xe tải” và “xe bán tải” khác nhau ở đâu, kèm ảnh mẫu đúng và sai cho từng cặp dễ nhầm.
- Kích thước tối thiểu. Vật nhỏ hơn bao nhiêu pixel thì bỏ qua? Nếu không nêu, người này gán, người kia bỏ, mô hình học ra rằng vật nhỏ là nhiễu.
- Xử lý che khuất, cắt mép, phản chiếu, bóng. Bóng của vật có thuộc vật không? Hình vật trong gương có gán không?
- Quy ước chồng lấn của polygon và mask. Pixel thuộc hai vật thì thuộc vật nằm trước hay để trống?
- Nhãn “không chắc chắn”. Cho phép người gán đánh dấu ảnh mờ để chuyển cho người có kinh nghiệm, thay vì ép đoán.
Lỗi gán nhãn hình ảnh thường gặp và cách xử lý
| Lỗi | Dấu hiệu | Cách xử lý |
|---|---|---|
| Bỏ sót đối tượng | Mô hình bị “phạt” khi đoán đúng vật chưa được gán | Cho mô hình cũ chạy lại lên tập đã gán, xem xét các dự đoán có độ tin cậy cao nhưng không có nhãn |
| Hộp lỏng, hộp chặt không đều | Chỉ số IoU giữa hai người gán cùng một ảnh thấp | Cho cả nhóm gán cùng 20 ảnh, so sánh, chốt lại quy tắc ôm sát |
| Nhầm lớp tương tự | Ma trận nhầm lẫn của mô hình tập trung ở hai lớp | Gộp lớp nếu nghiệp vụ không cần phân biệt, hoặc bổ sung ảnh mẫu |
| Chuyển định dạng sai | Hộp lệch đều khi vẽ lại lên ảnh | Kiểm tra gốc toạ độ và đơn vị (pixel hay tỉ lệ) |
| Ảnh bị xoay theo metadata | Nhãn đúng trên công cụ gán nhưng lệch khi huấn luyện | Chuẩn hoá hướng ảnh (EXIF) trước khi gán, không phải sau |
IoU (Intersection over Union) là tỉ lệ giữa phần giao và phần hợp của hai vùng. Dùng nó để đo mức đồng thuận giữa hai người gán, cũng như giữa nhãn và dự đoán mô hình. Cách đo hợp lý là chọn ngẫu nhiên một phần ảnh đã gán, để người thứ hai gán lại độc lập, rồi tính IoU trung bình theo từng lớp. Lớp nào IoU thấp là lớp có quy tắc mơ hồ, không hẳn là người gán kém.
Nguyên tắc “đầu vào kém thì đầu ra kém” được phân tích riêng trong bài GIGO từ góc độ gán nhãn. Với ảnh, một nhãn sai lặp lại hàng nghìn lần còn gây hại hơn vài nhãn sai ngẫu nhiên, vì mô hình học theo cái sai có hệ thống.
Ảnh có người, biển số, giấy tờ: cần lưu ý gì khi gán nhãn?
Ảnh có khuôn mặt, biển số xe gắn với chủ xe hoặc giấy tờ tuỳ thân có thể là dữ liệu cá nhân. Điều này chỉ áp dụng khi bạn gửi ảnh cho bên gán nhãn ngoài hoặc nhiều người cùng xem. Với dự án chỉ cần phát hiện “có người” hay “có xe”, bạn có thể làm mờ khuôn mặt và biển số trước khi đưa vào công cụ gán nhãn, xem kỹ thuật che giấu dữ liệu. Cần ghi rõ trong hợp đồng với bên gán nhãn: ai được xem ảnh gốc, lưu ở đâu và xoá khi nào.
Câu hỏi thường gặp
Bounding box, polygon và segmentation khác nhau cơ bản ở đâu?
Khác nhau ở độ chi tiết của vùng được đánh dấu. Bounding box dùng hình chữ nhật, polygon dùng đa giác theo viền, segmentation gán lớp cho từng pixel. Càng chi tiết, người gán càng tốn thời gian.
Nên bắt đầu với loại nhãn nào nếu chưa chắc?
Hãy bắt đầu từ câu hỏi kết quả cuối cùng cần gì. Nếu chỉ cần đếm hoặc cảnh báo, chọn bounding box. Nếu chưa chắc, gán polygon cho một mẫu nhỏ, vì từ polygon bạn có thể suy ra hộp bao, còn từ hộp thì không suy ngược được.
Semantic segmentation và instance segmentation khác nhau ra sao?
Semantic gán nhãn lớp cho mỗi pixel nhưng không tách các cá thể cùng lớp. Instance cho mỗi cá thể một mặt nạ riêng, nên đếm và đo từng vật được. Panoptic kết hợp cả hai.
COCO và YOLO nên chọn định dạng nào?
COCO phù hợp khi cần dữ liệu phụ như area, iscrowd, mặt nạ RLE hoặc đánh giá theo chuẩn COCO. YOLO gọn hơn khi huấn luyện mô hình họ YOLO. Nhiều công cụ gán nhãn xuất được cả hai, nên có thể giữ COCO làm bản gốc rồi chuyển sang YOLO khi cần.
Làm sao biết nhãn đã đủ tốt?
Cho người thứ hai gán lại một mẫu ngẫu nhiên và tính IoU theo từng lớp, đồng thời vẽ lại nhãn lên ảnh để kiểm bằng mắt. Lớp có mức đồng thuận thấp thường cần sửa quy tắc hơn là thay người.
Có cần gán nhãn thủ công hoàn toàn không?
Không nhất thiết. Nhiều công cụ cho mô hình đề xuất nhãn trước rồi người chỉnh sửa. Tuy nhiên, người vẫn phải duyệt, vì nhãn do mô hình đề xuất dễ lặp lại đúng những lỗi mà mô hình đang mắc.
Bài viết thuộc chuyên mục Dữ liệu & phân tích trên blog công nghệ VBPO, trang tin tức và kiến thức công nghệ cho doanh nghiệp Việt Nam về AI, dữ liệu, blockchain, chuyển đổi số và tự động hoá.