Markdownで表示

データ拡張

データ拡張はTrainConfigの設定で構成しますが、各モデルファミリーは独自の学習パイプラインを実行します。mosaic分岐がないパイプラインは、mosaic_probを近似せず無視します。

設定値の指定

データ拡張の設定値は通常のtrain()引数です。

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ではmosaic_probをmosaic、mixup_probを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

このうち3つには短い綴りがあり、train()とCLIのどちらでも使えます。mosaicはmosaic_probに、 fliplrはflip_probに、物体検出ではmixupはmixup_probに対応します。短い綴りとその フィールドを異なる値で渡すと例外を送出します。他の設定値はすべて両方で同じ綴りです。

2つではなく3つの状態

設定値が機能するかどうかはファミリーによって異なります。ライブラリはその宣言的な表を保持し、 各項目は3つの状態のいずれかになります。

usedは設定値がパイプラインに到達してサンプルを変更することを意味します。ignoredは パイプラインに到達せず、設定しても何も起きないことを意味します。gated_by_mosaicはmosaic 分岐を通ったサンプルだけに適用されることを意味します。そのため、配線されていても mosaic_prob=0では一度も作動しません。

3つ目の状態が予想外になりやすいものです。YOLOX方式のパイプラインではアフィン変形がmosaic キャンバス上で実行され、MixUpがmosaicサンプルを混合します。そのため、mosaic_prob=0は degrees、translate、shear、perspective、mosaic_scale、mixup_prob、 mixup_scaleをすべて通知なく無効にします。学習器は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は無視される設定値についても警告し、実際に入力したものだけを一覧化します。

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

4種類のパイプライン形状

ファミリーは4つの学習パイプラインに分類され、パイプラインによってほぼすべての結果が決まります。

YOLOX方式のmosaicパイプラインはサンプルごとにHSVジッターと反転を適用し、mosaic分岐内で アフィン変換とMixUpを実行します。YOLOX、YOLOv7、YOLOv9とそのE2EおよびP2バリアント、 RTMDet、PicoDet、RT-DETR、RT-DETRv2、FOMOが対象です。

DETR方式のパススルーパイプラインにはmosaicもアフィン変形もありません。測光歪み、ズームアウト、 IoU切り抜きは設定値ではなくレシピ定数なので、有効なのはflip_probとno_aug_epochsだけです。 D-FINE、Dome-DETR、DEIM、DEIMv2、RT-DETRv4、ECが対象で、RF-DETRでは1点異なります。

分類用のImageFolderパイプラインには専用のデータ拡張設定があります。flip_probは水平方向の反転を制御し、デフォルトは0.5です。fliplrはそのエイリアスです。

YOLO-NASは独自の形状です。mosaicは一切なく、サンプルごとのアフィン変換が常に有効で、MixUpは 制限されず独立して適用されます。mosaic_scaleの値はアフィン変換のスケール範囲として再利用 されます。

SegFormer、LingBot-Vision、NAFNetは、それぞれタスク固有のパイプラインを実行します。そのランダム性は 設定可能ではなくファミリー内で固定されています。SegFormerとLingBot-Visionで有効な設定値は、 mosaic_scaleとhsv_probではなくクラス属性semantic_scale_jitterとsemantic_hsv_probです。NAFNetの 切り抜きと反転は、入力とターゲットを組み合わせた処理として固定確率0.5で行われます。

各ファミリーが尊重する設定値

次の表はlibreyolo/data/augment/spec.pyに同梱された仕様で、ライブラリ自身のテストにより実際の パイプライン配線と照合されています。アーキテクチャから推測せず、ここを参照してください。

ファミリーの対応表を確認
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}")
無視される項目のみ
from libreyolo.data.augment.spec import ignored_aug_params print(sorted(ignored_aug_params("rfdetr")))

基本設定値をパイプラインごとに要約すると次のようになります。

設定値YOLOX方式YOLO-NASDETR方式分類
mosaic_prob使用無視無視無視
mixup_probmosaicにより制限使用無視無視
hsv_prob使用使用無視無視
flip_prob使用使用使用使用
flipud使用使用無視使用
degreesmosaicにより制限使用無視無視
translatemosaicにより制限使用無視無視
shearmosaicにより制限使用無視無視
perspectivemosaicにより制限使用無視無視
mosaic_scalemosaicにより制限使用無視無視
mixup_scalemosaicにより制限使用無視無視
no_aug_epochs使用使用使用使用

各列内の例外は次のとおりで、すべて範囲を狭めるものです。

  • RTMDet、PicoDet、RT-DETR、RT-DETRv2、FOMOには垂直反転がないため、flipudは無視されます。FOMOのmosaicラッパーもperspectiveなしで構築されています。
  • RF-DETR固有のパイプラインにはHSVジッターがないため、DETR方式の列に加えてhsv_probも無視されます。
  • ECはhsv_prob、degrees、translateを尊重しますが、それらを読み取るキーポイント対応変換を使うtask="pose"の場合だけです。detectとsegmentの経路は固定の測光レシピを使います。
  • DINOv2はdetectおよびsemanticタスクでDETR方式の列に従い、task="classify"では分類用設定を追加します。

no_aug_epochsはすべてのパイプラインでusedですが、効果は異なります。モザイク系では最後のエポックでモザイクとMixUpを無効にします。DETR系では測光的な拡張、ズームアウト、クロップを停止し、スケジュールの終盤も制御します。分類では自動拡張、erasing、MixUp、CutMixを無効にしますが、クロップと反転は残ります。

perspectiveは、回転、スケール、せん断、平行移動に加えて射影変形を追加します。キャンバスの各隅は 軸ごとに、キャンバスの辺の半分の最大min(perspective * 100, 0.2)倍のランダムな量だけ内側へ 移動します。そのため、perspective=0.001はどの解像度でも隅を辺の最大5パーセントだけ移動させ、 0.002以上の値はすべて同じ最大値に達します。デフォルトの0は変形をアフィンのまま保ち、負の値は 最初のサンプルを変形するときにValueErrorを送出します。YOLOv9とそのE2EおよびP2バリアント、 YOLOX、YOLOv7、YOLO-NAS、PP-YOLOE、RTMDet、PicoDet、RT-DETR、RT-DETRv2がこれを適用します。

YOLOv9とそのバリアント、YOLOv7、RT-DETR、RT-DETRv2が学習に使うYOLOv9のmosaicパイプラインでは、 MixUpは混合比率を[0, 1]上の一様分布であるBeta(1, 1)から抽出します。YOLOX、RTMDet、PicoDetが使う YOLOXのmosaicラッパーは、固定の0.5で混合します。

分類用設定

4つの設定値が分類パイプラインだけを制御します。検出ファミリーは4つすべてを無視します。

分類用設定
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は"randaugment"、"autoaugment"、"augmix"、またはNoneを受け取ります。 erasingはRandomErasingの確率です。mixupとcutmixはソフトラベルを生成するバッチごとの確率で、 バッチごとに最大1つだけが実行されます。MixUpが先なので、2つは加算され、合計を最大1にする 必要があります。

4つともデフォルトで無効なので、明示的に要求しない限り分類学習は変わりません。

train()とCLIはタスクに応じてmixupを振り分けます。分類ではバッチの混合、物体検出ではmixup_probを使います。

scale=0.5は、ランダムクロップの面積範囲(0.5, 1.0)を意味します。ペアを明示すると両端を設定します。crop_pct=Noneは、ファミリーの評価用リサイズ比率を維持します。上書きは学習時と検証時の評価に適用されますが、エクスポートではファミリー本来の前処理を維持します。

CLIはauto_augment、erasing、cutmix、fliplr、flipudを公開します。分類のmixupはバッチの混合を意味し、デフォルトは0.0です。水平反転のデフォルトは0.5、垂直反転は0.0です。mixup + cutmixは1を超えてはいけません。

no_aug_epochsは、最後のエポックで自動データ拡張、ランダム消去、MixUp、CutMixを無効にし、クロップと反転は維持します。分類レシピでは、この末尾の期間のデフォルトは0です。

ファミリー固有の設定値

一部の設定値は基底クラスではなくファミリーの設定サブクラスにあるため、そのファミリーだけに 存在し、CLIフラグはありません。

ファミリー設定値効果
YOLOv9、YOLOv9-E2E、YOLOv9-P2copy_pasteCopy-pasteインスタンス拡張の確率。task="segment"のみ
YOLOv9、YOLOv9-E2E、YOLOv9-P2copy_paste_mode"flip"は同じサンプルを反転して再利用し、"mixup"は2つ目のサンプルを取得
YOLOv9、YOLOv9-E2E、YOLOv9-P2rot9090度ランダム回転の確率
YOLOv9、YOLOv9-E2E、YOLOv9-P2max_labels学習変換での画像ごとの正解データ上限。デフォルトは300
RF-DETRcopy_paste、copy_paste_modetask="segment"用のCopy-paste。"flip"モードのみ
RF-DETR、D-FINE、ECcrop_resize_probランダムな切り抜きとサイズ変更の確率
EC、YOLO-NASbrightness_contrast_prob、affine_prob姿勢経路のジッターとキーポイント対応アフィン変換の確率

max_labelsは、データを失う設定値です。上限を超えたボックスはエラーではなく一度だけの警告とともに 破棄されるため、航空写真など検出対象が密な画像では値を増やす必要があります。ラベル割り当てのメモリは 上限ではなく、バッチ内で最も検出対象が密な画像に従います。

回転ボックスに対応した隅座標のデータ拡張は実装されていないため、設定値にかかわらず回転ボックス 学習ではMosaicとMixUpが無効になります。

  • no_aug_epochsをスケジュール引数として扱う方法と、その他のtrain()設定についてはハイパーパラメータを参照してください。
  • これらの変換が使用するラベル形式についてはデータセットを参照してください。

LibreYOLO v1.6.0で検証済みです。