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

Ba nút có cách viết ngắn hơn, được cả train() lẫn CLI chấp nhận: mosaic ánh xạ tới mosaic_prob, fliplr tới flip_prob, và với phát hiện, mixup ánh xạ tới mixup_prob. Truyền một cách viết ngắn cùng trường tương ứng của nó với hai giá trị khác nhau sẽ báo lỗi. 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_prob và mixup_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 samplesand 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_prob và no_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 phân loại ImageFolder có các điều khiển augmentation riêng. flip_prob điều khiển lật ngang và mặc định là 0.5; fliplr là tên thay thế của nó.

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, LingBot-Vision 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 và LingBot-Vision, các nút có tác dụng là thuộc tính class semantic_scale_jitter và semantic_hsv_prob, không phải mosaic_scale và hsv_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ùngđược dùng
flipudđược dùngđược dùngbị bỏ quađược dùng
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, degrees và translate, 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ó trạng thái used ở mọi nơi nhưng không mang cùng ý nghĩa. 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 quang học, zoom-out và cắt ảnh, đồng thời định hình phần cuối lịch trình. Trên pipeline phân loại, nó tắt auto-augmentation, erasing, MixUp và CutMix; cắt và lật ảnh vẫn hoạt động.

perspective thêm một phép méo phối cảnh lên trên phép xoay, scale, shear và dịch chuyển. Mỗi góc canvas dịch vào trong một lượng ngẫu nhiên tối đa min(perspective * 100, 0.2) lần nửa cạnh canvas, theo từng trục, nên perspective=0.001 dịch một góc tối đa 5 phần trăm cạnh ở mọi độ phân giải, và mọi giá trị từ 0.002 trở lên đạt cùng mức tối đa. Mặc định 0 giữ phép méo ở dạng affine, và một giá trị âm phát sinh ValueError khi mẫu đầu tiên bị làm méo. YOLOv9 cùng các biến thể E2E và P2, YOLOX, YOLOv7, YOLO-NAS, PP-YOLOE, RTMDet, PicoDet, RT-DETR và RT-DETRv2 áp dụng nó.

MixUp trong pipeline mosaic của YOLOv9, mà YOLOv9 cùng các biến thể, YOLOv7, RT-DETR và RT-DETRv2 huấn luyện qua, lấy tỉ lệ trộn từ Beta(1, 1), đồng đều trên [0, 1]. Wrapper mosaic của YOLOX, dùng bởi YOLOX, RTMDet và PicoDet, trộn ở mức cố định 0.5.

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. mixup và cutmix 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.

train() và CLI định tuyến mixup theo tác vụ: phân loại dùng trộn batch, còn phát hiện dùng mixup_prob.

scale=0.5 nghĩa là khoảng diện tích cắt ngẫu nhiên (0.5, 1.0); một cặp rõ ràng đặt cả hai giới hạn. crop_pct=None giữ tỷ lệ đổi kích thước đánh giá của họ mô hình; giá trị ghi đè ảnh hưởng đánh giá trong huấn luyện và đánh giá riêng, còn xuất giữ tiền xử lý gốc của họ mô hình.

CLI cung cấp auto_augment, erasing, cutmix, fliplr và flipud. mixup trong phân loại nghĩa là trộn batch và mặc định là 0.0. Lật ngang mặc định là 0.5 và lật dọc là 0.0. mixup + cutmix không được vượt quá 1.

no_aug_epochs tắt auto-augmentation, erasing, MixUp và CutMix trong các epoch cuối, giữ cắt và lật ảnh. Công thức phân loại mặc định đặt phần cuối này là 0.

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 độ
YOLOv9, YOLOv9-E2E, YOLOv9-P2max_labelsGiới hạn ground truth trên mỗi ảnh trong transform huấn luyện, mặc định 300
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 làm mất dữ liệu. Các hộp vượt quá giới hạn bị loại kèm một cảnh báo một lần thay vì 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. Bộ nhớ gán nhãn theo ảnh dày đặc nhất trong batch, không theo giới hạn này.

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.

  • 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.6.0.