Tăng cường dữ liệu

Augmentation được cấu hình bằng các nút điều chỉnh trên TrainConfig, nhưng mỗi model family chạy pipeline huấn luyện riêng, và pipeline không có nhánh mosaic sẽ bỏ qua mosaic_prob thay vì mô phỏng gần đúng.

Thiết lập các nút điều chỉnh

Các nút điều chỉnh tăng cường dữ liệu (augmentation) là đối số train() thông thường.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.train(    data="my-dataset.yaml",    epochs=100,    mosaic_prob=1.0,    mixup_prob=0.15,    hsv_prob=1.0,    flip_prob=0.5,    no_aug_epochs=15,)
CLI
# CLI viết mosaic_prob thành mosaic và mixup_prob thành mixup.libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \  epochs=100 mosaic=1.0 mixup=0.15 hsv_prob=1.0 \  flip_prob=0.5 no_aug_epochs=15

Hai nút có cách viết CLI ngắn hơn: mosaic ánh xạ tới mosaic_probmixup ánh xạ tới mixup_prob. Mọi nút khác được viết giống hệt ở cả hai nơi.

Ba trạng thái, không phải hai

Một nút có tác dụng hay không phụ thuộc vào family. Thư viện duy trì một bảng khai báo về điều đó, và mỗi mục có một trong ba trạng thái.

used nghĩa là nút đi tới pipeline và thay đổi sample. ignored nghĩa là nó không bao giờ đến pipeline, vì vậy việc đặt giá trị không có tác dụng. gated_by_mosaic nghĩa là nó chỉ áp dụng cho sample đi qua nhánh mosaic, vì vậy với mosaic_prob=0, nó không bao giờ kích hoạt dù đã được nối vào pipeline.

Trạng thái thứ ba thường gây bất ngờ. Trên pipeline kiểu YOLOX, affine warp chạy trên canvas mosaic và MixUp trộn một sample mosaic, vì vậy mosaic_prob=0 âm thầm tắt đồng thời degrees, translate, shear, perspective, mosaic_scale, mixup_probmixup_scale. Trainer ghi cảnh báo riêng cho trường hợp MixUp:

mixup_prob=0.15 has no effect for YOLOv9: mixup only applies to mosaic samples
and mosaic_prob=0. Set mosaic_prob > 0 to enable mixup.

CLI cũng cảnh báo về các nút bị bỏ qua và chỉ liệt kê những nút bạn thực sự nhập:

Warning: RF-DETR ignores these parameters: degrees, mosaic

Bốn dạng pipeline

Các family tập trung thành bốn pipeline huấn luyện, và pipeline quyết định gần như toàn bộ câu trả lời.

Pipeline mosaic kiểu YOLOX áp dụng HSV jitter và phép lật theo từng sample, sau đó chạy affine và MixUp bên trong nhánh mosaic. Pipeline này bao gồm YOLOX, YOLOv7, YOLOv9 cùng các biến thể E2E và P2, RTMDet, PicoDet, RT-DETR, RT-DETRv2 và FOMO.

Pipeline pass-through kiểu DETR không có mosaic và không có affine warp. Photometric distortion, zoom-out và IoU crop của nó là hằng số recipe thay vì nút cấu hình, nên chỉ flip_probno_aug_epochs có tác dụng. Pipeline này bao gồm D-FINE, Dome-DETR, DEIM, DEIMv2, RT-DETRv4, EC và RF-DETR với một thay đổi.

Pipeline ImageFolder cho phân loại bỏ qua mọi nút của phát hiện. Phép lật ngang là hằng số 0.5 mà flip_prob không tác động tới. Thay vào đó, pipeline có bộ nút riêng được mô tả bên dưới.

YOLO-NAS có dạng riêng: hoàn toàn không có mosaic, affine theo từng sample luôn bật, và MixUp được áp dụng độc lập thay vì bị ràng buộc. Giá trị mosaic_scale của nó được dùng lại làm phạm vi tỷ lệ affine.

SegFormer và NAFNet đều chạy pipeline riêng theo tác vụ, với tính ngẫu nhiên được cố định trong family thay vì có thể cấu hình. Với SegFormer, các nút có tác dụng là thuộc tính class semantic_scale_jittersemantic_hsv_prob, không phải mosaic_scalehsv_prob. Phép crop và lật của NAFNet là các thao tác ghép cặp đầu vào với target ở xác suất cố định 0.5.

Mỗi family áp dụng nút nào

Bảng bên dưới là đặc tả được phân phối tại libreyolo/data/augment/spec.py, được các test riêng của thư viện đối chiếu với cách nối pipeline thực. Hãy đọc bảng ở đó thay vì suy luận từ kiến trúc.

Đọc bảng hỗ trợ cho một family
from libreyolo.data.augment.spec import AUG_KNOBS, aug_support for knob, description in AUG_KNOBS.items():    support = aug_support("yolo9")[knob]    print(f"{knob:16} {support.status:16} {support.note or description}")
Chỉ những nút bị bỏ qua
from libreyolo.data.augment.spec import ignored_aug_params print(sorted(ignored_aug_params("rfdetr")))

Tóm tắt theo pipeline cho các nút cơ sở:

NútKiểu YOLOXYOLO-NASKiểu DETRPhân loại
mosaic_probđược dùngbị bỏ quabị bỏ quabị bỏ qua
mixup_probbị ràng buộc bởi mosaicđược dùngbị bỏ quabị bỏ qua
hsv_probđược dùngđược dùngbị bỏ quabị bỏ qua
flip_probđược dùngđược dùngđược dùngbị bỏ qua
flipudđược dùngđược dùngbị bỏ quabị bỏ qua
degreesbị ràng buộc bởi mosaicđược dùngbị bỏ quabị bỏ qua
translatebị ràng buộc bởi mosaicđược dùngbị bỏ quabị bỏ qua
shearbị ràng buộc bởi mosaicđược dùngbị bỏ quabị bỏ qua
perspectivebị ràng buộc bởi mosaicđược dùngbị bỏ quabị bỏ qua
mosaic_scalebị ràng buộc bởi mosaicđược dùngbị bỏ quabị bỏ qua
mixup_scalebị ràng buộc bởi mosaicđược dùngbị bỏ quabị bỏ qua
no_aug_epochsđược dùngđược dùngđược dùngđược dùng

Các ngoại lệ trong những cột đó đều thu hẹp phạm vi:

  • RTMDet, PicoDet, RT-DETR, RT-DETRv2 và FOMO không có phép lật dọc, vì vậy flipud bị bỏ qua. Wrapper mosaic của FOMO cũng được dựng không có perspective.
  • Pipeline gốc của RF-DETR không có HSV jitter, vì vậy hsv_prob bị bỏ qua bên cạnh các mục trong cột kiểu DETR.
  • EC áp dụng hsv_prob, degreestranslate, nhưng chỉ cho task="pose", nơi transform nhận biết keypoint đọc các giá trị này. Đường dẫn detect và segment dùng recipe photometric cố định.
  • DINOv2 tuân theo cột kiểu DETR cho tác vụ detect và semantic, đồng thời bổ sung bộ tùy chọn phân loại cho task="classify".

no_aug_epochs được used ở mọi nơi nhưng không mang cùng ý nghĩa ở mọi nơi. Trên pipeline mosaic, nó tắt mosaic và MixUp trong các epoch cuối. Trên pipeline kiểu DETR, nó dừng augmentation photometric, zoom-out và crop, đồng thời định hình phần đuôi của lịch. Trên pipeline phân loại và ngữ nghĩa, nó chỉ định hình phần đuôi.

Bộ tùy chọn phân loại

Bốn nút điều khiển pipeline phân loại và không điều khiển gì khác. Các family phát hiện bỏ qua cả bốn.

Bộ tùy chọn phân loại
from libreyolo import LibreYOLO model = LibreYOLO("LibreConvNeXtt-cls.pt")model.train(    data="my-classification-dataset",    epochs=50,    auto_augment="randaugment",    erasing=0.25,    mixup=0.2,    cutmix=0.2,)

auto_augment nhận "randaugment", "autoaugment", "augmix" hoặc None. erasing là xác suất RandomErasing. mixupcutmix là xác suất theo batch tạo nhãn mềm; tối đa một loại chạy trên mỗi batch, MixUp chạy trước, vì vậy hai giá trị được cộng lại và tổng không nên vượt quá 1.

Cả bốn đều mặc định tắt, vì vậy quá trình huấn luyện phân loại không thay đổi nếu bạn không yêu cầu.

Cần nêu rõ một xung đột tên: trên CLI, mixup là alias của mixup_prob dành cho phát hiện. Trường mixup dành cho phân loại không có cách viết CLI riêng và chỉ truy cập được qua model.train(mixup=...) trong Python.

Nút riêng theo family

Một số nút nằm trên subclass cấu hình của family thay vì class cơ sở, vì vậy chúng chỉ tồn tại cho family đó và không có flag CLI.

FamilyNútTác dụng
YOLOv9, YOLOv9-E2E, YOLOv9-P2copy_pasteXác suất augmentation thực thể copy-paste, chỉ cho task="segment"
YOLOv9, YOLOv9-E2E, YOLOv9-P2copy_paste_mode"flip" dùng lại cùng sample đã lật, "mixup" lấy sample thứ hai
YOLOv9, YOLOv9-E2E, YOLOv9-P2rot90Xác suất xoay ngẫu nhiên 90 độ
YOLOv9max_labelsGiới hạn ground truth trên mỗi ảnh trong transform huấn luyện, mặc định 100
RF-DETRcopy_paste, copy_paste_modeCopy-paste cho task="segment", chỉ ở chế độ "flip"
RF-DETR, D-FINE, ECcrop_resize_probXác suất crop-resize ngẫu nhiên
EC, YOLO-NASbrightness_contrast_prob, affine_probXác suất jitter và affine nhận biết keypoint trên đường dẫn tư thế

max_labels là nút âm thầm làm mất dữ liệu. Các hộp vượt quá giới hạn bị loại mà không phát sinh lỗi, vì vậy cần tăng giá trị cho ảnh dày đặc như ảnh hàng không.

Mosaic và MixUp bị tắt cho quá trình huấn luyện hộp xoay bất kể giá trị các nút, vì augmentation nhận biết góc cho hộp xoay chưa được triển khai.

Nội dung liên quan

  • Xem Siêu tham số để biết no_aug_epochs dưới dạng đối số lịch và phần còn lại của train().
  • Xem Dataset để biết các định dạng nhãn mà những transform này sử dụng.

Đã kiểm chứng với LibreYOLO v1.5.0.