Data Augmentation
Tăng cường dữ liệu huấn luyện model bằng các bản sao hiện có của ảnh được biến đổi ngẫu nhiên, chẳng hạn như lật, cắt và đổi màu, giúp model khái quát hóa tốt hơn.
Tăng cường dữ liệu làm đa dạng dataset huấn luyện bằng cách áp dụng các phép biến đổi ngẫu nhiên, chẳng hạn lật, cắt, đổi tỷ lệ, dịch chuyển màu và trộn hình ảnh, lên các mẫu đã có. Mỗi bản sao sau biến đổi giữ nguyên nhãn ban đầu, giúp model học rằng một đối tượng vẫn là chính đối tượng đó dù góc nhìn, ánh sáng và vị trí thay đổi. Việc thu thập và gán nhãn hình ảnh mới chậm và tốn kém, khiến tăng cường dữ liệu trở thành biện pháp ít tốn kém nhất để chống overfitting; hầu hết model thị giác máy tính hiện đại đều được huấn luyện bằng phương pháp này.
Cách tăng cường dữ liệu hoạt động#
Hầu hết pipeline huấn luyện tăng cường dữ liệu trực tuyến: data loader biến đổi từng hình ảnh khi tạo batch, lấy các tham số ngẫu nhiên mới mỗi lần, để mỗi epoch thấy một phiên bản khác nhau của từng hình ảnh. Ngược lại, tăng cường ngoại tuyến ghi một số lượng cố định các bản sao đã biến đổi ra đĩa trước khi huấn luyện, làm tăng dung lượng lưu trữ và khiến model có ít biến thể riêng biệt hơn nhiều.
Hai quy tắc giúp tăng cường dữ liệu không làm sai lệch nhãn. Thứ nhất, nhãn phải biến đổi cùng pixel: trong phát hiện đối tượng, phân đoạn instance và ước lượng pose, phép biến đổi hình học phải cập nhật mọi hộp giới hạn, mask và keypoint; phép lật ngang cũng hoán đổi keypoint trái và phải. Thứ hai, phép biến đổi phải có thể xảy ra trong thế giới thực: lật dọc phù hợp với ảnh chụp từ trên không và ảnh kính hiển vi, nhưng với cảnh đường phố, phép này tạo ra ô tô lộn ngược vốn không xuất hiện khi inference. Phép biến đổi của Torchvision tự động xử lý quy tắc thứ nhất khi truyền hộp cùng với ảnh:
from urllib.request import urlopen
from PIL import Image
from torchvision import tv_tensors
from torchvision.transforms import v2
image = Image.open(urlopen("https://ultralytics.com/images/bus.jpg")) # 810 x 1080 pixels
boxes = tv_tensors.BoundingBoxes([[50, 400, 250, 900]], format="XYXY", canvas_size=(1080, 810))
# Flip every time (p=1.0) and shift colors; the box must move with the pixels
augment = v2.Compose([v2.RandomHorizontalFlip(p=1.0), v2.ColorJitter(brightness=0.4, saturation=0.7)])
new_image, new_boxes = augment(image, boxes)
print(f"Original box: {boxes.tolist()}")
print(f"Flipped box: {new_boxes.tolist()}")Bounding box quanh người đàn ông ở bên trái hình ảnh dịch chuyển từ [50, 400, 250, 900] sang [560, 400, 760, 900], đối xứng qua chiều rộng 810 pixel; trong khi đó, color jitter thay đổi pixel mà không tác động đến bounding box.
Các kỹ thuật phổ biến#
- Phép biến đổi hình học: Lật, xoay, đổi tỷ lệ, dịch chuyển, cắt, xiên và biến dạng phối cảnh mô phỏng các vị trí camera và kích thước đối tượng khác nhau.
- Phép biến đổi trắc quang: Thay đổi độ sáng, độ tương phản, độ bão hòa và sắc độ, cùng với làm mờ và thêm nhiễu, mô phỏng các điều kiện chiếu sáng, cảm biến và chất lượng hình ảnh khác nhau.
- Che khuất: Xóa ngẫu nhiên và cutout làm trống các hình chữ nhật để model không thể phụ thuộc vào bất kỳ phần đơn lẻ nào của đối tượng.
- Trộn hình ảnh: MixUp trộn hai hình ảnh và nhãn của chúng; CutMix dán một vùng từ hình ảnh này vào hình ảnh khác; mosaic ghép bốn hình ảnh thành một mẫu huấn luyện; còn copy-paste chuyển các đối tượng đã phân đoạn lên nền mới.
- Chính sách tự động: RandAugment áp dụng một chuỗi phép biến đổi ngẫu nhiên chỉ được điều khiển bằng hai thiết lập: số lượng phép biến đổi và cường độ của chúng. Cách này loại bỏ bước tìm kiếm tốn kém cần có trong các chính sách được học trước đây.
Pipeline tăng cường dữ liệu cho phát hiện đối tượng#
Pipeline phát hiện nối tiếp nhiều phép biến đổi, mỗi phép có xác suất áp dụng riêng, vì vậy mỗi hình ảnh huấn luyện nhận một tổ hợp ngẫu nhiên khác nhau.
Quá trình huấn luyện Ultralytics YOLO chạy pipeline này theo mặc định, áp dụng mosaic cho mọi hình ảnh (mosaic=1.0), xác suất lật ngang 50% (fliplr=0.5), đổi tỷ lệ tối đa ±50% và dịch chuyển màu HSV; mosaic được tắt trong 10 epoch cuối (close_mosaic=10) để model kết thúc huấn luyện trên các hình ảnh hoàn chỉnh, trông tự nhiên.
from ultralytics import YOLO
# Tải model YOLO26n đã tiền huấn luyện
model = YOLO("yolo26n.pt")
# fliplr: xác suất lật ngang; scale: phạm vi phóng to/thu nhỏ (+/- 70%); degrees: phạm vi xoay (+/- 5)
results = model.train(data="coco8.yaml", epochs=10, fliplr=0.5, scale=0.7, degrees=5.0)Trong lần chạy này, trainer YOLO26 lưu ba batch tăng cường đầu tiên dưới dạng train_batch0.jpg, train_batch1.jpg và train_batch2.jpg, có vẽ bounding box, để có thể kiểm tra tác động của từng thiết lập trước khi bắt đầu một lần chạy dài.
Tăng cường dữ liệu và các thuật ngữ liên quan#
- Dữ liệu tổng hợp: Được tạo từ đầu bằng engine render, trình mô phỏng hoặc model khuếch tán. Tăng cường dữ liệu biến đổi những hình ảnh thực đã có.
- Tiền xử lý dữ liệu: Các bước xác định trước như đổi kích thước và chuẩn hóa, được áp dụng giống hệt cho mọi hình ảnh trong quá trình huấn luyện và inference. Tăng cường dữ liệu mang tính ngẫu nhiên và chỉ chạy khi huấn luyện.
- Tăng cường tại thời điểm kiểm thử (TTA): Chạy inference trên một số phiên bản đã tăng cường của cùng đầu vào, chẳng hạn các bản sao được lật và đổi tỷ lệ, rồi kết hợp dự đoán; phương pháp này đánh đổi thêm chi phí tính toán để đạt mức tăng độ chính xác nhỏ.










