Tăng cường dữ liệu Bounding Box cho Object Detection với Albumentations

08 tháng 4, 2026·6 phút đọc

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

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 BoxVí 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ạngTọa độGiá trịPhổ biến ở
pascal_voc[x_min, y_min, x_max, y_max]PixelPASCAL 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]PixelCOCO 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]PixelTươ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 BoxSo 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ệtKế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:

  1. Sử dụng label_fields: Khai báo tên các trường chứa metadata trong A.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.
  2. 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 format trong BboxParams: 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_area hoặc min_visibility quá 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.Normalize chuyể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 được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗