データ拡張マトリクス
データ拡張ノブを設定しても、必ずパイプラインに届くとは限りません。このページでは、ライブラリが唯一の信頼できる情報源として提供する宣言的な表を使い、学習可能な各ファミリーがTrainConfig上の各ノブをどのように扱うかを記録します。
ノブ
これらはCLIでの表記ではなく、TrainConfigのフィールド名です。train()とCLIは短い表記をこれらにマッピングするため、mosaicはmosaic_probを設定します。
| ノブ | 意味 |
|---|---|
mosaic_prob | 4画像のmosaicサンプルを構築する確率 |
mixup_prob | 2つ目のサンプルを混ぜる確率 |
hsv_prob | HSVカラージッターを行う確率 |
flip_prob | 水平反転の確率 |
degrees | アフィン変換におけるランダム回転範囲(度) |
translate | アフィン変換におけるランダム平行移動の割合 |
mosaic_scale | アフィン変換におけるランダムスケール範囲 |
mixup_scale | MixUp相手の画像に適用するジッタースケール範囲 |
shear | アフィン変換におけるランダムせん断範囲(度) |
perspective | アフィン変換に加える射影変換の強さ:キャンバスの角が、軸ごとにキャンバス辺長の半分のmin(perspective * 100, 0.2)倍まで内側に動く。0で無効 |
flipud | 垂直反転の確率 |
no_aug_epochs | 強いデータ拡張を無効にして学習する最後のエポック数 |
auto_augment | 分類用AutoAugmentポリシー:randaugment、autoaugment、augmix |
erasing | 分類用RandomErasingの確率 |
mixup | ソフトラベルを使う分類用バッチMixUpの確率 |
cutmix | ソフトラベルを使う分類用バッチCutMixの確率 |
最後の4つは分類専用の設定です。物体検出のファミリーはこれらを無視します。train()とCLIは分類モデルのmixupをバッチの混合に、検出モデルではmixup_probに振り分けます。
from libreyolo.data.augment.spec import ( AUG_KNOBS, aug_support, ignored_aug_params, uses_mosaic_gating,) print(sorted(AUG_KNOBS)) table = aug_support("yolo9")print(table["mixup_prob"].status, table["mixup_prob"].note) print(sorted(ignored_aug_params("dfine")))print(uses_mosaic_gating("yolo9"), uses_mosaic_gating("yolonas"))3つの状態
| 状態 | 意味 |
|---|---|
used | ノブがファミリーの学習パイプラインに届き、サンプルを変更 |
gated_by_mosaic | mosaic分岐に入ったサンプルだけにノブを適用。mosaic_prob == 0なら一切発動しない |
ignored | ノブはパイプラインに届かず、設定しても何も変わらない |
実行前に確認する価値があるのはignoredです。何も失敗しないためです。明示的に設定した学習パラメータを選択したファミリーが無視する場合、CLIは警告します。ファミリーがMixUpをmosaicに依存させ、mosaic_probがゼロのためmixup_prob > 0が発動できない場合も、トレーナーが警告します。
パイプライン構成
対象となるすべてのファミリーは、以下に示す少数のファミリー固有差を除き、6つのパイプラインのいずれかに従います。
| ノブ | YOLOX形式 | YOLO-NAS | DETR形式 | 分類 | セマンティック | 復元 |
|---|---|---|---|---|---|---|
mosaic_prob | 使用 | 無視 | 無視 | 無視 | 無視 | 無視 |
mixup_prob | mosaic依存 | 使用 | 無視 | 無視 | 無視 | 無視 |
hsv_prob | 使用 | 使用 | 無視 | 無視 | 無視 | 無視 |
flip_prob | 使用 | 使用 | 使用 | 使用 | 無視 | 無視 |
degrees | mosaic依存 | 使用 | 無視 | 無視 | 無視 | 無視 |
translate | mosaic依存 | 使用 | 無視 | 無視 | 無視 | 無視 |
mosaic_scale | mosaic依存 | 使用 | 無視 | 無視 | 無視 | 無視 |
mixup_scale | mosaic依存 | 使用 | 無視 | 無視 | 無視 | 無視 |
shear | mosaic依存 | 使用 | 無視 | 無視 | 無視 | 無視 |
perspective | mosaic依存 | 使用 | 無視 | 無視 | 無視 | 無視 |
flipud | 使用 | 使用 | 無視 | 使用 | 無視 | 無視 |
no_aug_epochs | 使用 | 使用 | 使用 | 使用 | 使用 | 使用 |
auto_augment | 無視 | 無視 | 無視 | 使用 | 無視 | 無視 |
erasing | 無視 | 無視 | 無視 | 使用 | 無視 | 無視 |
mixup | 無視 | 無視 | 無視 | 使用 | 無視 | 無視 |
cutmix | 無視 | 無視 | 無視 | 使用 | 無視 | 無視 |
YOLOX形式のパイプラインでは、サンプルごとの前処理がHSVジッターと反転を適用し、アフィン変換とMixUpはmosaic分岐の中だけで実行されます。一方、YOLO-NASは常に有効なサンプルごとのアフィン変換を実行し、mosaicを無視し、MixUpを独立して適用します。mosaic_scaleはアフィン変換のスケール範囲として再利用されます。
DETR系パイプラインはモザイクを使わない変換です。測光的な歪み、ズームアウト、IoUクロップは変更可能な設定ではなくレシピの定数なので、hsv_probと幾何変換の設定は作用しません。分類は水平反転にflip_prob、垂直反転にflipudを使います。セマンティックセグメンテーションのスケール変動とHSVはモデルクラスの属性から決まり、復元では入力と正解を固定確率0.5で一緒に反転します。
no_aug_epochsはすべてのパイプラインで反映されますが、無効にする処理は異なります。YOLOX系ではモザイクとMixUp、YOLO-NASではアフィン変換とMixUp、DETR系では強い測光的な拡張とクロップに加えて学習率スケジュールの終盤、分類では自動拡張、erasing、MixUp、CutMixが対象です。分類のクロップと反転は有効なままです。
構成別のファミリー
| 構成 | ファミリー |
|---|---|
| YOLOX形式 | yolox、yolo7、yolo9、yolo9_e2e、yolo9_p2、rtmdet、picodet、rtdetr、rtdetrv2、fomo |
| YOLO-NAS | yolonas、ppyoloe |
| DETR形式 | dfine、gtr、domedetr、deim、deimv2、tinyformer、rtdetrv4、rfdetr、ec、dinov2 |
| 分類 | resnet、convnext、convnextv2、mobilenetv4、efficientnetv2 |
| セマンティック | segformer、unet、lingbotvision |
| 復元 | nafnet |
31のファミリーが対象です。この一覧にないファミリーでは無視される集合が空で返されるため、警告は表示されません。
差異
| ファミリー | 構成との差異 |
|---|---|
rtmdet | flipudを無視。変換に垂直反転がない |
picodet | flipudを無視 |
rtdetr | flipudを無視 |
rtdetrv2 | flipudを無視 |
fomo | perspectiveとflipudを無視 |
ppyoloe | flipudを無視。元のレシピはランダムな90度回転を代わりに使う |
gtr | mosaic_probとmixup_probを、最初のmosaic_epochsエポックの間使用。degrees、translate、mosaic_scaleは、モザイクの後に続くアフィン変換の形を決める |
ec | task="pose"の場合だけhsv_prob、degrees、translateを使用。detectとsegmentでは固定の測光レシピを使用 |
dinov2 | task="classify"の場合だけ分類パックを使用 |
ecとdinov2はマルチタスクファミリーなので、ファミリーの学習可能なすべてのタスクが無視する場合だけノブを無視とマークします。これにより、あるタスクでは誤りで別のタスクでは正しいCLI警告が出ることはありません。
Dome-DETRはD-FINEの変換を変更せずに継承します。利用できないのはマルチスケール学習だけで、データ拡張仕様ではなく設定によって無効にされます。
ファミリー固有のノブ
一部のファミリーは、基本クラスではなく固有のTrainConfigサブクラスにデータ拡張ノブを持ちます。CLIはこれらを公開しないため、Python APIから設定してください。
| ファミリー | ノブ | 意味 |
|---|---|---|
yolo9、yolo9_e2e、yolo9_p2 | copy_paste | task="segment"だけで使うcopy-pasteインスタンス拡張の確率 |
yolo9、yolo9_e2e、yolo9_p2 | copy_paste_mode | copy-pasteのソース。flipは同じサンプルを鏡像化し、mixupは2つ目のサンプルを使用 |
yolo9、yolo9_e2e、yolo9_p2 | rot90 | ランダムな90度回転の確率 |
rfdetr | copy_paste | task="segment"向けcopy-pasteの確率。flipモードだけ |
rfdetr | copy_paste_mode | task="segment"向けcopy-pasteソースモード |
rfdetr | crop_resize_prob | ネイティブパイプライン内のランダムcrop-resize確率 |
dfine | crop_resize_prob | task="segment"向けランダムcrop-resize確率 |
ec | crop_resize_prob | task="segment"向けランダムcrop-resize確率 |
ec、yolonas | brightness_contrast_prob | task="pose"向け明るさとコントラストのジッター確率 |
ec、yolonas | affine_prob | task="pose"向けキーポイント対応アフィン変換の確率 |
rot90はyolo9のdetectとOBBに適用されます。
仕様の照会
| ヘルパー | 返り値 |
|---|---|
aug_support(family) | ノブからSupportへの表。不明なファミリーではNone |
ignored_aug_params(family) | ファミリーが無視するノブ名の集合。不明なファミリーでは空 |
uses_mosaic_gating(family) | ファミリーのMixUpがmosaicサンプルだけで発動するか |
display_name(family) | 警告で使うユーザー向けファミリー名 |
mixup_gating_warning(family, mosaic_prob, mixup_prob) | MixUpが一切発動できない場合の警告テキスト。それ以外はNone |
Supportはstatusとnoteからなる名前付きタプルで、noteはそのファミリーでノブが無視される、またはmosaicに依存する理由を説明します。
mosaicゲート
YOLOX形式のファミリーでは、mosaic_prob=0でmixup_prob=0.5を指定するとMixUpが完全に無効になります。MixUpはmosaicサンプルだけに適用されるためです。この組み合わせは学習後半でmosaicを無効にすると簡単に発生します。トレーナーはファミリー名を示す警告をログに記録し、その背後にある純粋関数がmixup_gating_warningです。