Markdownで表示

データ拡張マトリクス

データ拡張ノブを設定しても、必ずパイプラインに届くとは限りません。このページでは、ライブラリが唯一の信頼できる情報源として提供する宣言的な表を使い、学習可能な各ファミリーがTrainConfig上の各ノブをどのように扱うかを記録します。

ノブ

これらはCLIでの表記ではなく、TrainConfigのフィールド名です。train()とCLIは短い表記をこれらにマッピングするため、mosaicはmosaic_probを設定します。

ノブ意味
mosaic_prob4画像のmosaicサンプルを構築する確率
mixup_prob2つ目のサンプルを混ぜる確率
hsv_probHSVカラージッターを行う確率
flip_prob水平反転の確率
degreesアフィン変換におけるランダム回転範囲(度)
translateアフィン変換におけるランダム平行移動の割合
mosaic_scaleアフィン変換におけるランダムスケール範囲
mixup_scaleMixUp相手の画像に適用するジッタースケール範囲
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_mosaicmosaic分岐に入ったサンプルだけにノブを適用。mosaic_prob == 0なら一切発動しない
ignoredノブはパイプラインに届かず、設定しても何も変わらない

実行前に確認する価値があるのはignoredです。何も失敗しないためです。明示的に設定した学習パラメータを選択したファミリーが無視する場合、CLIは警告します。ファミリーがMixUpをmosaicに依存させ、mosaic_probがゼロのためmixup_prob > 0が発動できない場合も、トレーナーが警告します。

パイプライン構成

対象となるすべてのファミリーは、以下に示す少数のファミリー固有差を除き、6つのパイプラインのいずれかに従います。

ノブYOLOX形式YOLO-NASDETR形式分類セマンティック復元
mosaic_prob使用無視無視無視無視無視
mixup_probmosaic依存使用無視無視無視無視
hsv_prob使用使用無視無視無視無視
flip_prob使用使用使用使用無視無視
degreesmosaic依存使用無視無視無視無視
translatemosaic依存使用無視無視無視無視
mosaic_scalemosaic依存使用無視無視無視無視
mixup_scalemosaic依存使用無視無視無視無視
shearmosaic依存使用無視無視無視無視
perspectivemosaic依存使用無視無視無視無視
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-NASyolonas、ppyoloe
DETR形式dfine、gtr、domedetr、deim、deimv2、tinyformer、rtdetrv4、rfdetr、ec、dinov2
分類resnet、convnext、convnextv2、mobilenetv4、efficientnetv2
セマンティックsegformer、unet、lingbotvision
復元nafnet

31のファミリーが対象です。この一覧にないファミリーでは無視される集合が空で返されるため、警告は表示されません。

差異

ファミリー構成との差異
rtmdetflipudを無視。変換に垂直反転がない
picodetflipudを無視
rtdetrflipudを無視
rtdetrv2flipudを無視
fomoperspectiveとflipudを無視
ppyoloeflipudを無視。元のレシピはランダムな90度回転を代わりに使う
gtrmosaic_probとmixup_probを、最初のmosaic_epochsエポックの間使用。degrees、translate、mosaic_scaleは、モザイクの後に続くアフィン変換の形を決める
ectask="pose"の場合だけhsv_prob、degrees、translateを使用。detectとsegmentでは固定の測光レシピを使用
dinov2task="classify"の場合だけ分類パックを使用

ecとdinov2はマルチタスクファミリーなので、ファミリーの学習可能なすべてのタスクが無視する場合だけノブを無視とマークします。これにより、あるタスクでは誤りで別のタスクでは正しいCLI警告が出ることはありません。

Dome-DETRはD-FINEの変換を変更せずに継承します。利用できないのはマルチスケール学習だけで、データ拡張仕様ではなく設定によって無効にされます。

ファミリー固有のノブ

一部のファミリーは、基本クラスではなく固有のTrainConfigサブクラスにデータ拡張ノブを持ちます。CLIはこれらを公開しないため、Python APIから設定してください。

ファミリーノブ意味
yolo9、yolo9_e2e、yolo9_p2copy_pastetask="segment"だけで使うcopy-pasteインスタンス拡張の確率
yolo9、yolo9_e2e、yolo9_p2copy_paste_modecopy-pasteのソース。flipは同じサンプルを鏡像化し、mixupは2つ目のサンプルを使用
yolo9、yolo9_e2e、yolo9_p2rot90ランダムな90度回転の確率
rfdetrcopy_pastetask="segment"向けcopy-pasteの確率。flipモードだけ
rfdetrcopy_paste_modetask="segment"向けcopy-pasteソースモード
rfdetrcrop_resize_probネイティブパイプライン内のランダムcrop-resize確率
dfinecrop_resize_probtask="segment"向けランダムcrop-resize確率
eccrop_resize_probtask="segment"向けランダムcrop-resize確率
ec、yolonasbrightness_contrast_probtask="pose"向け明るさとコントラストのジッター確率
ec、yolonasaffine_probtask="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です。

ノブ一覧、状態、構成、ファミリーごとの差異、ヘルパー関数はv1.6.0のlibreyolo/data/augment/spec.pyで確認しました。この表と実際のパイプラインとの一致はtests/unit/test_augment_spec.pyで固定されています。