Sử dụng Augmentation cẩn thận
Kiểm thử mọi phép augmentation với camera triển khai, xây dựng profile có căn cứ, train với profile đó và kiểm tra kết quả trong các batch train.
Hãy hình dung một dây chuyền phân loại tách viên nang đỏ khỏi viên nang cam, được train với mức dịch hue mặc định. Ở mỗi epoch, model đều thấy viên nang đỏ bị đổi màu thành cam, nên model học rằng màu sắc không quan trọng, trong khi đó chính là điều duy nhất model cần học. Augmentation chỉ giúp model vững chắc hơn khi mỗi phép biến đổi là điều camera triển khai thực sự có thể tạo ra. Bài học này cung cấp cho bạn phép kiểm tra để quyết định nên giữ lại những phép biến đổi nào.
Thực hành
Augmentation có tác dụng gì#

Data augmentation biến đổi ảnh train ngay trong quá trình chạy, để model nhìn thấy phiên bản hơi khác của mỗi ảnh ở từng epoch. Nếu thực hiện đúng cách, augmentation cải thiện khả năng chống chịu với thay đổi về ánh sáng, tỷ lệ và hướng, đồng thời giảm overfitting, vì model không thể ghi nhớ những ảnh liên tục thay đổi. Nếu thực hiện sai, augmentation dạy model nhận diện những cảnh bất khả thi về mặt vật lý và che giấu các khoảng trống trong dataset mà bạn cần khắc phục.
Hãy nhìn vào bảng hue ở trên: con vẹt đuôi dài màu đỏ chuyển thành màu vàng. Điều đó không ảnh hưởng nếu bài toán là "vẹt đuôi dài hay không phải vẹt đuôi dài", nhưng lại gây hại nếu màu sắc là yếu tố phân biệt hai lớp của bạn.
Các giá trị mặc định quan trọng#
Đây là các giá trị mặc định trong Ultralytics 8.4; tài liệu tham chiếu về cài đặt augmentation liệt kê mọi đối số:
| Đối số | Mặc định | Tác dụng | Thay đổi khi nào |
|---|---|---|---|
hsv_h | 0.015 | Dịch hue | Đặt thành 0 khi màu sắc xác định lớp |
hsv_s / hsv_v | 0.7 / 0.4 | Dịch saturation và độ sáng | Giảm nếu điều kiện ánh sáng cố định và được kiểm soát |
degrees | 0.0 | Xoay ngẫu nhiên (±độ) | Tăng khi object có thể xuất hiện ở mọi góc độ |
translate / scale | 0.1 / 0.5 | Dịch chuyển và phóng to/thu nhỏ | Giảm nếu việc cắt ảnh có thể làm mất các bộ phận xác định lớp |
fliplr | 0.5 | Xác suất lật ngang | Đặt thành 0 khi trái và phải có ý nghĩa, chẳng hạn với văn bản |
flipud | 0.0 | Xác suất lật dọc | Tăng cho góc nhìn từ trên xuống, ảnh chụp trên không hoặc ảnh kính hiển vi |
mosaic | 1.0 | Ghép bốn ảnh thành một | Hiếm khi dùng; xem close_mosaic |
close_mosaic | 10 | Tắt mosaic trong N epoch cuối | Giảm nếu lượt train rất ngắn |
mixup / cutmix | 0.0 / 0.0 | Trộn hai ảnh / dán một vùng ảnh lên ảnh khác | Thử trên dataset nhỏ sau khi đã có baseline |
copy_paste | 0.0 | Dán các instance object giữa các ảnh | Dataset segmentation, semantic và OBB có các lớp hiếm |
Dataset depth là trường hợp ngoại lệ: mosaic, mixup, cutmix và copy_paste sẽ tạo ra các bản đồ depth ghép cặp không hợp lệ, vì vậy bộ nạp dữ liệu depth tự động đặt chúng thành 0.
Kiểm tra theo môi trường triển khai#
Mỗi phép biến đổi được bật phải vượt qua một câu hỏi, rồi đến câu hỏi thứ hai:
| Phép biến đổi | Thực tế? | Kết luận |
|---|---|---|
| Độ sáng ±30% trên camera ngoài trời | Có: thay đổi theo thời điểm trong ngày | Giữ lại |
| Lật ngang trên camera an ninh | Có: người đi lại theo cả hai hướng | Giữ lại |
| Lật dọc trên camera gắn tường | Không: sàn nhà luôn ở phía dưới | Tắt |
| Lật dọc trên camera băng chuyền nhìn từ trên xuống | Có: trong khung hình không có khái niệm “phía trên” | Bật |
| Xoay 90° trên camera đường bộ cố định | Không: camera không bao giờ xoay | Tắt |
| Dịch sắc độ khi các bộ phận màu đỏ và xanh lá thuộc các class khác nhau | Không: làm mất tín hiệu | Tắt |

Ảnh con vẹt đuôi dài lộn ngược phù hợp để huấn luyện drone nhìn thẳng xuống, nhưng lại lãng phí với camera gắn cố định trên tường. Các phép biến đổi không vượt qua được bài kiểm tra này tạo ra tín hiệu huấn luyện tiêu cực: model học cách nhận diện những hình ảnh mà model sẽ không bao giờ thấy, làm giảm dung lượng dành cho những hình ảnh mà model sẽ gặp.
Một cấu hình mẫu#
Camera nhìn từ trên xuống đặt phía trên băng chuyền phân loại các bộ phận có class chỉ khác nhau về màu sắc. Cần bỏ jitter sắc độ, trong khi lật dọc và xoay nhẹ trở nên thực tế. Cấu hình này chạy như minh họa trên bộ demo COCO8; thay bằng YAML dữ liệu và số epoch thực tế của bạn:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(
data="coco8.yaml",
epochs=1,
imgsz=320,
hsv_h=0.0, # màu sắc là tín hiệu của lớp: giữ nguyên sắc độ
flipud=0.5, # góc nhìn từ trên xuống: không có "phía trên" trong khung hình
degrees=10.0, # các bộ phận có thể nằm ở mọi góc nhỏ
)Mở train_batch0.jpg trong thư mục chạy và kiểm tra ba điều: bbox vẫn khít sau phép biến đổi, các đặc điểm xác định class (màu sắc, hình dạng, văn bản) vẫn được giữ nguyên, và không có gì trông bất khả thi về mặt vật lý. Giảm cường độ của bất kỳ phép biến đổi nào vi phạm một trong các điều đó. Huấn luyện model đầu tiên trình bày về chính quy trình huấn luyện.
Mosaic và close_mosaic#

Mosaic ghép bốn ảnh thành một và được bật theo mặc định. Đây là phép tăng cường có tác động lớn nhất cho bài toán phát hiện: mỗi ảnh huấn luyện chứa nhiều cảnh, tỷ lệ và ngữ cảnh đối tượng. Điểm hạn chế là ảnh mosaic không giống các khung hình khi triển khai, vì vậy close_mosaic=10 tắt mosaic trong 10 epoch cuối để model hoàn tất huấn luyện trên đầu vào thực tế. Việc tắt mosaic cũng tắt mixup, cutmix và copy_paste, trong khi các phép lật, HSV và biến đổi hình học vẫn tiếp tục chạy.
Trong các lần chạy không dài hơn close_mosaic epoch, bao gồm cấu hình một epoch ở trên, mosaic sẽ tắt ngay từ epoch đầu tiên. Hãy đánh giá mosaic từ train_batch0.jpg của một lần chạy đủ độ dài, không phải từ một bài kiểm tra nhanh.
Những điều phép tăng cường không thể khắc phục#
Phép tăng cường khuếch đại những gì vốn đã có. Nếu dataset không có ảnh ban đêm, không thiết lập nào tạo ra cảnh đêm: nó chỉ tạo ra các phiên bản sáng hơn và tối hơn của cảnh ban ngày. Nếu một class chỉ hoạt động tốt khi dùng phép tăng cường mạnh, bạn chưa có đủ dữ liệu của class đó. Hãy quay lại Thu thập dữ liệu chất lượng cao, có tính đại diện.
Dataset nhỏ với mọi phép tăng cường ở mức tối đa sẽ khiến model huấn luyện trên các ảnh ngày càng xa điều kiện triển khai, và mAP val thường giảm. Mỗi lần chỉ thay đổi một tham số, có lý do rõ ràng, rồi so sánh với baseline mặc định trên cùng lần chia tách.
Nếu một lớp được xác định bởi một phần nhỏ của đối tượng, chẳng hạn biểu tượng ở góc lá bài, mosaic, translate và scale có thể cắt mất phần đó, tạo ra ảnh huấn luyện trông giống hệt một lớp khác. Hãy giảm các giá trị đó cho dataset này và xác nhận cách khắc phục trong train_batch0.jpg.
Hiển thị lời giải
Drone khảo sát một cảng từ trên cao, phát hiện tàu bằng bbox định hướng. Từ góc nhìn đó không có khái niệm “phía trên”, tàu hướng theo mọi chiều và màu sắc không xác định class:
| Đối số | Lựa chọn | Giải thích |
|---|---|---|
flipud | 0.5 | Góc nhìn từ trên xuống trông giống hệt khi lật dọc |
degrees | 180 | Tàu xuất hiện với mọi hướng |
hsv_h | mặc định | Màu thân tàu thay đổi và không phải tín hiệu phân biệt class |
mosaic | mặc định | Nhiều đối tượng nhỏ trong mỗi ảnh; mosaic có ích |
Trên bộ demo ảnh hàng không DOTA8:
yolo obb train data=dota8.yaml model=yolo26n-obb.pt epochs=1 imgsz=320 flipud=0.5 degrees=180Với camera đường phố cố định, hai thay đổi tương tự sẽ không vượt qua bài kiểm tra triển khai: xe hơi không bao giờ lộn ngược trong luồng hình ảnh từ camera gắn trên tường.