Tăng cường dữ liệu Bounding Box cho Object Detection với Albumentations
Bài viết hướng dẫn chi tiết cách sử dụng thư viện Albumentations để tăng cường dữ liệu hình ảnh cho các bài toán phát hiện vật thể (Object Detection). Chúng ta sẽ tìm hiểu cách xử lý khung giới hạn (bounding box), các định dạng tọa độ phổ biến và thiết lập pipeline để đảm bảo nhãn luôn đồng bộ với hình ảnh sau khi biến đổi.

Tăng cường dữ liệu Bounding Box cho Object Detection với Albumentations
Trong lĩnh vực thị giác máy tính (Computer Vision), việc tăng cường dữ liệu (image augmentation) là kỹ thuật không thể thiếu để cải thiện khả năng tổng quát hóa của mô hình. Tuy nhiên, đối với bài toán phát hiện vật thể (Object Detection), quá trình này phức tạp hơn nhiều so với phân loại ảnh đơn giản. Khi bạn lật hoặc xoay một bức ảnh, các tọa độ của khung giới hạn (bounding box) cũng phải thay đổi tương ứng để bao trùm đúng vật thể.
Thư viện Albumentations – một công cụ mã nguồn mở phổ biến với hơn 15.000 sao trên GitHub – cung cấp giải pháp mạnh mẽ để xử lý vấn đề này một cách tự động. Bài viết này sẽ hướng dẫn bạn cách áp dụng augmentation cho bounding box sử dụng Albumentations một cách chính xác và hiệu quả.
Ví dụ về Bounding Box
Các định dạng Bounding Box phổ biến
Các framework và bộ dữ liệu khác nhau sử dụng các quy ước tọa độ khác nhau để biểu diễn bounding box. Albumentations hỗ trợ 5 định dạng chính. Việc xác định đúng định dạng này là bước quan trọng nhất để tránh lỗi trong quá trình huấn luyện.
Dưới đây là bảng so sánh các định dạng:
| Định dạng | Tọa độ | Giá trị | Phổ biến ở |
|---|---|---|---|
| pascal_voc | [x_min, y_min, x_max, y_max] | Pixel | PASCAL VOC, nhiều dataset tùy chỉnh |
| albumentations | [x_min, y_min, x_max, y_max] | Chuẩn hóa [0, 1] | Định dạng nội bộ của Albumentations |
| coco | [x_min, y_min, box_width, box_height] | Pixel | COCO dataset |
| yolo | [x_center, y_center, box_width, box_height] | Chuẩn hóa [0, 1] | Ultralytics YOLO, Darknet |
| cxcywh | [x_center, y_center, box_width, box_height] | Pixel | Tương tự YOLO nhưng không chuẩn hóa |
Ví dụ, với một ảnh kích thước 640x480 có một bounding box từ điểm (98, 345) đến (420, 462), các giá trị tương ứng trong từng định dạng sẽ khác nhau hoàn toàn.
So sánh các định dạng Bounding Box
Lưu ý quan trọng: Sai định dạng tọa độ là nguyên nhân phổ biến nhất gây ra lỗi. Pipeline vẫn sẽ chạy bình thường, nhưng các khung giới hạn sẽ chỉ vào sai vị trí, dẫn đến mô hình học dữ liệu rác và chỉ số mAP gần như bằng 0.
Thiết lập Pipeline phát hiện vật thể
Để bắt đầu, bạn cần cài đặt thư viện và tạo một pipeline augmentation bằng A.Compose. Điểm mấu chốt là sử dụng A.BboxParams để khai báo định dạng tọa độ.
import albumentations as A
import cv2
import numpy as np
train_transform = A.Compose([
A.RandomCrop(width=450, height=450, p=1.0),
A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.2),
], bbox_params=A.BboxParams(
format='coco', # Chọn định dạng phù hợp với dữ liệu của bạn
label_fields=['class_labels'],
), seed=137)
Trong pipeline này, bạn có thể kết hợp tự do các phép biến đổi. Các biến đổi ở mức độ pixel như RandomBrightnessContrast chỉ thay đổi ảnh và giữ nguyên bounding box. Ngược lại, các biến đổi không gian như HorizontalFlip sẽ cập nhật cả ảnh và tọa độ khung giới hạn cùng lúc.
Áp dụng Pipeline và xử lý Metadata
Khi áp dụng biến đổi, bạn cần truyền ảnh, danh sách các bounding boxes và các nhãn tương ứng vào hàm transform.
# Đọc và chuẩn hóa ảnh
image = cv2.imread("image.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Chuẩn bị bounding boxes (dạng mảng NumPy)
bboxes = np.array([
[23, 74, 295, 388],
[377, 294, 252, 161],
[333, 421, 49, 49],
], dtype=np.float32)
class_labels = np.array(['dog', 'cat', 'sports ball'])
# Thực hiện biến đổi
result = train_transform(image=image, bboxes=bboxes, class_labels=class_labels)
augmented_image = result['image']
augmented_bboxes = result['bboxes']
augmented_labels = result['class_labels']
Kết quả đầu vào và đầu ra với các nhãn riêng biệt
Lưu ý rằng đầu ra có thể chứa ít bounding box hơn đầu vào. Những hộp nằm ngoài vùng ảnh đã cắt hoặc quá nhỏ sẽ tự động bị loại bỏ.
Gắn thêm Metadata vào Bounding Box
Ngoài nhãn lớp (class labels), bạn thường cần lưu trữ thêm thông tin cho mỗi hộp. Có hai cách chính để thực hiện việc này:
- Sử dụng
label_fields: Khai báo tên các trường chứa metadata trongA.BboxParams. Khi một hộp bị loại bỏ, dữ liệu trong các trường này cũng được đồng bộ loại bỏ theo. - Mảng đóng gói (Packed arrays): Nếu metadata là số, bạn có thể thêm chúng trực tiếp vào mảng bounding box dưới dạng các cột bổ sung.
Chiến lược cắt ảnh cho Object Detection
Hàm RandomCrop thông thường có thể tạo ra các vùng cắt không chứa bounding box nào, gây lãng phí dữ liệu huấn luyện. Albumentations cung cấp các phương pháp cắt thông minh hơn:
- AtLeastOneBboxRandomCrop: Đảm bảo ít nhất một bounding box xuất hiện trong vùng cắt.
- BBoxSafeRandomCrop: Đảm bảo tất cả các bounding box đều được giữ lại. Vùng cắt sẽ tự động điều chỉnh để bao trùm mọi vật thể.
- RandomSizedBBoxSafeCrop: Cắt một phần ngẫu nhiên của ảnh nhưng vẫn giữ nguyên tất cả các hộp, sau đó thay đổi kích thước về kích thước mục tiêu. Đây là lựa chọn phổ biến nhất cho huấn luyện phát hiện vật thể vì nó cung cấp sự biến đổi về tỷ lệ và kích thước mà không làm mất nhãn.
Các lỗi thường gặp cần tránh
Dưới đây là tổng hợp những sai lầm phổ biến mà các lập trình viên thường gặp phải:
- Sai
formattrongBboxParams: Như đã đề cập, hãy luôn kiểm tra kỹ định dạng tọa độ của dataset (YOLO, COCO hay Pascal VOC). - Lọc hết tất cả các hộp: Việc cắt ảnh quá mức kết hợp với các tham số
min_areahoặcmin_visibilityquá khắt khe có thể khiến mảng bounding box trở nên rỗng. Vòng lặp huấn luyện cần xử lý trường hợp này hoặc bạn nên sử dụng các phương pháp cắt an toàn (bbox-safe). - Trộn lẫn tọa độ chuẩn hóa và tuyệt đối: Ví dụ, passing tọa độ pixel khi
format='yolo'(yêu cầu giá trị [0, 1]) sẽ dẫn đến kết quả sai lệch hoàn toàn. - Sử dụng biến đổi không hỗ trợ: Không phải tất cả các hàm augmentation đều hỗ trợ cập nhật tọa độ bounding box. Nếu bạn thêm một hàm không hỗ trợ vào pipeline có
BboxParams, Albumentations sẽ báo lỗi ngay khi khởi tạo. - Trực quan hóa sau khi Normalize: Hàm
A.Normalizechuyển đổi giá trị pixel về dạng float. Nếu bạn cố hiển thị ảnh sau bước này, nó sẽ chỉ là nhiễu. Hãy luôn trực quan hóa trước khi Normalize.
Việc nắm vững các nguyên tắc này sẽ giúp bạn xây dựng quy trình tiền xử lý dữ liệu vững chắc, từ đó nâng cao hiệu suất của các mô hình phát hiện vật thể.
Bài viết liên quan

Phần mềm
Anthropic ra mắt Claude Opus 4.7: Nâng cấp mạnh mẽ cho lập trình nhưng vẫn thua Mythos Preview
16 tháng 4, 2026

Công nghệ
Qwen3.6-35B-A3B: Quyền năng Lập trình Agentic, Nay Đã Mở Cửa Cho Tất Cả
16 tháng 4, 2026

Công nghệ
Spotify thắng kiện 322 triệu USD từ nhóm pirate Anna's Archive nhưng đối mặt với bài toán thu hồi
16 tháng 4, 2026
