libreyolo train
1つのデータセットで1つのモデルを学習し、チェックポイント・指標・ログを実行ディレクトリに書き出します。以下の各引数にはコマンド定義由来のデフォルト値があり、モデルファミリー自身の学習設定がそれを置き換えることがあります。
- コマンド
libreyolo train- 必須
data- 出力
- runs/train/<name>配下のチェックポイント・指標・ログ。name=がない場合はyolo9_expなどファミリー独自の実行名
書式
libreyolo train data=<dataset.yaml> [model=<name|path>] [key=value ...]引数はkey=valueのペアで、POSIX形式も使えるため、epochs=50と--epochs 50は
同じ引数です。真偽値はtrueとfalseを受け付けます:フラグに否定形がある場合、
amp=falseは--no-ampになります。
引数
モデルとデータ
| 引数 | デフォルト値 | 意味 |
|---|---|---|
data | データセットYAMLへのパス(YOLO形式、例:coco8.yaml)。必須 | |
model | yolox-s | モデル名または重みへのパス |
task | タスクの明示的な上書き:detect、segment、semantic、pose、classify、gaze、obb、point、depth | |
pretrained | true | 学習済みの重みを使います。falseにするとアーキテクチャを構築してゼロから学習します |
allow_download_scripts | false | データセットYAMLのダウンロードブロックに埋め込まれたPythonを許可 |
学習ループ
| 引数 | デフォルト値 | 意味 |
|---|---|---|
epochs | 300 | 学習エポック数 |
batch | 16 | バッチサイズ。複数GPUではグローバルバッチで、各GPUに均等に分割 |
imgsz | 640 | 学習時の画像サイズ:640(正方形)または480x640(HxW) |
device | auto | デバイス:0、cpu、mps、auto。0,1や[0,1]のようなGPUのリストを指定すると、それらのGPUで学習 |
workers | 4 | データローダーのワーカー数 |
cache | false | データ読み込みを高速化するために画像をキャッシュ:ram、disk、true、false |
seed | 0 | 乱数シード |
resume | 学習を再開:true、またはチェックポイントへのパス | |
amp | true | 自動混合精度 |
amp_dtype | float16 | CUDA AMPのdtype:float16またはbfloat16 |
cuda_graph | false | 学習の順伝播と逆伝播をCUDAグラフにキャプチャします。シングルGPUかつ対応ファミリーのみで、それ以外はeager実行のままです |
compile | false | 学習ネットワークをtorch.compileでコンパイルします:true、false、default、reduce-overhead、max-autotune、max-autotune-no-cudagraphs。シングルCUDA GPUのみで、それ以外の実行は警告を出してeagerで学習します |
lora | false | LoRAファインチューニング。補足に挙げたTransformerファミリー向け |
freeze | 層を凍結:整数の個数、インデックスのリスト、またはモジュール名 |
蒸留
| 引数 | デフォルト値 | 意味 |
|---|---|---|
distill_model | 教師:検出器のチェックポイント、またはバックボーンの特徴量蒸留に使うdinov2のような基盤教師のID | |
dis | 蒸留損失の重み。未設定の場合は損失タイプごとの公開されたデフォルト値 | |
distill_loss_type | mgd | 検出器教師向けの特徴量損失:mgd、cwd。基盤教師は常にfeat_mseを使います |
オプティマイザー
| 引数 | デフォルト値 | 意味 |
|---|---|---|
optimizer | sgd | オプティマイザー:sgd、adam、adamw |
lr0 | 0.01 | 初期学習率 |
momentum | 0.937 | SGDのモーメンタム、およびAdam系オプティマイザーの一次モーメント係数 |
weight_decay | 0.0005 | L2正則化 |
nesterov | true | Nesterovモーメンタム |
clip_max_norm | 各オプティマイザーステップの前に、勾配のL2ノルムをこの値にクリップ。0でクリッピングを無効化。未設定の場合はファミリーの値を適用 |
スケジューラー
| 引数 | デフォルト値 | 意味 |
|---|---|---|
scheduler | yoloxwarmcos | 学習率スケジュールの種類 |
warmup_epochs | 5 | ウォームアップの長さ |
warmup_lr_start | 0.0 | ウォームアップ開始時の学習率 |
min_lr_ratio | 0.05 | 最小学習率の比率 |
lr_drop | 100 | RF-DETRのstep方式で学習率を下げるエポック |
データ拡張
| 引数 | デフォルト値 | 意味 |
|---|---|---|
mosaic | 1.0 | Mosaicの確率 |
mixup | 1.0 | Mixupの確率 |
hsv_prob | 1.0 | HSVジッターの確率 |
flip_prob | 0.5 | 左右反転の確率 |
degrees | 10.0 | 回転の範囲(度単位、プラスマイナス両方向) |
translate | 0.1 | 平行移動の比率 |
shear | 2.0 | せん断の角度 |
mosaic_scale | (0.1,2.0) | Mosaicのスケール範囲 |
mixup_scale | (0.5,1.5) | Mixupのスケール範囲 |
no_aug_epochs | 15 | 最後のNエポックでデータ拡張を無効化 |
EMA
| 引数 | デフォルト値 | 意味 |
|---|---|---|
ema | true | 指数移動平均 |
ema_decay | 0.9998 | EMAの減衰係数 |
学習中の検証
| 引数 | デフォルト値 | 意味 |
|---|---|---|
val | true | 学習中に検証 |
eval_interval | 10 | Nエポックごと、および最終エポックの後に検証 |
max_det | 300 | 検証時のNMS後の画像1枚あたりの最大検出数 |
eval_max_det | COCO評価器の上限。未設定の場合はpycocotoolsのAP@100の慣例 | |
faster_coco_eval | true | インストール済みならCOCO指標にfaster-coco-evalのC++バックエンドを使用し、なければpycocotoolsにフォールバック |
save_plots | false | 学習中に最終的な検証プロットを保存 |
patience | 50 | 早期終了(early stopping)の待機エポック数。0で無効 |
出力
| 引数 | デフォルト値 | 意味 |
|---|---|---|
project | runs/train | 出力ディレクトリのルート |
name | 実験名。未設定の場合は、yolo9_expやdfine_expなど、ファミリーのtrain()が使う名前を使用 | |
exist_ok | false | 既存の出力ディレクトリを再利用 |
save_period | 10 | Nエポックごとにチェックポイントを保存 |
log_interval | 10 | Nバッチごとに損失を記録 |
エージェント向けフラグ
| 引数 | デフォルト値 | 意味 |
|---|---|---|
json | false | 標準出力へのJSON出力 |
quiet | false | 標準エラー出力を抑制 |
dry_run | false | 実行せずに設定を解決して表示 |
help_json | false | コマンドスキーマをJSONで出力して終了 |
| 引数 | デフォルト | 意味 |
|---|---|---|
min_samples | 0 | 小規模データセットのエポック長の下限。画像が少ない場合は、エポックごとにこの数を復元抽出(0で無効) |
class_balanced | False | 裾の長いクラス分布のデータセット向けのLVIS形式の反復係数サンプリング(デフォルトは無効) |
cls_pw | 0.0 | 分類の逆頻度重み付けの指数。0で無効、1で完全適用(クラス重みの平均は1。class_weights=Trueとの併用は不可) |
class_weights | False | 従来のサンプル数で正規化した分類損失の重み(デフォルトは無効) |
single_cls | False | 対応する検出器で、すべてのラベルをクラス0に対応付けて学習 |
classes | None | 対応する検出器で、カンマ区切りの元のデータセットクラスIDのみを使って学習(例:'0,3,5')。それ以外のクラスはラベルがないものとして除外。IDは詰め直さず維持 |
average_best | 0 | 監視する指標で上位N個のチェックポイントを均等に平均し、学習終了時にweights/average.ptへ保存(0で無効) |
export_check | False | エポック1の前にONNXへエクスポートし、失敗した場合は実行を停止(デフォルトは無効) |
precise_bn | 0 | 最後のエポック後に、この数の学習画像からBatchNormの移動統計を再計算(0で無効) |
aux_weight | YOLO9のみ:PGI補助分岐の損失の重み。値を指定するとその重みで新しい分岐を付け、0で主ヘッドのみを学習。未設定の場合、重みがPGIテンソルを持つかゼロから学習するときだけ0.25で分岐を付ける | |
fliplr | None | 水平反転の確率(flip_probの別名) |
flipud | 0.0 | 垂直反転の確率 |
auto_augment | None | 分類の自動データ拡張方針:randaugment、autoaugment、augmix(デフォルトはなし) |
erasing | 0.0 | 分類のRandomErasingの確率。0 <= erasing < 1 |
cutmix | 0.0 | 分類のCutMixの確率(ソフトラベル) |
scale | 0.5 | 分類のRandomResizedCropの面積範囲。浮動小数点数の下限または明示的な(min,max) |
crop_pct | None | 分類の評価で中央クロップの前に使うリサイズ比率(デフォルトはモデルファミリー本来の値) |
plot_samples | 8 | 検証のサンプル描画の画像数。0でなし、-1ですべての検証画像(指標は変化しない) |
使用例
# coco8.yamlはパッケージ同梱で初回使用時に8枚の画像をダウンロードlibreyolo train model=LibreYOLO9s.pt data=coco8.yaml epochs=10 imgsz=640 batch=8# ファミリーのデフォルト値を含めて実行時に使われる設定を表示し# 学習もデータ読み込みもせずに終了libreyolo train model=LibreDFINEn.pt data=coco8.yaml epochs=10 dry_run=truelibreyolo train model=LibreYOLO9s.pt data=coco8.yaml \ epochs=50 batch=8 optimizer=adamw lr0=0.001 weight_decay=0.0001 \ patience=20 save_period=5 project=runs/train name=yolo9s-coco8 exist_ok=true補足
上記のデフォルト値が常に使われるとは限りません
モデルファミリーはそれぞれ独自の学習設定を持っており、その設定がベースの設定と
異なる場合、明示的に設定しなかった引数についてはファミリー側の値がコマンドの
デフォルト値を置き換えます。自分で引数を設定した場合は常にそちらが優先されます。
libreyolo cfgはベースのデフォルト値とファミリーごとの上書きを表示するので、
あるファミリーが実際に何を使うかはこれで確認できます。
これが最も影響するのはimgszです。コマンドのデフォルト値は640ですが、これは
すべてのチェックポイントのネイティブ入力ではありません:公開されているRF-DETRの
検出サイズは384、512、576、704で、YOLOXのnとtのチェックポイントは416です。
RF-DETRとDEIMv2はimgszが明示的に設定されたときだけ値を渡す扱いになっており、
それ以外の場合はそれぞれのサイズがそのまま有効です。ほかのファミリーには指定
された値がそのまま渡され、そのサイズで学習します。厳しいのはFOMOです:各サイズは
ネイティブ入力(96、192、224)しか受け付けないため、FOMOの実行ではimgszを
合わせて設定する必要があり、そうでなければエラーで停止します。RF-DETRはさらに、
値がパッチサイズとウィンドウ数の積で割り切れることを要求し、割り切れない場合は
最も近い2つの有効なサイズを報告します。
ファミリーが無視する引数
すべてのファミリーがすべての引数を読むわけではなく、それが表れるのはデータ拡張の
引数です。RF-DETR、D-FINE、DEIM、DEIMv2、RT-DETRv4、DINOv2はMosaicもMixupも
アフィン変換も行わないパススルーのパイプラインで学習するため、mosaic、mixup、
hsv_prob、degrees、translate、shear、mosaic_scale、mixup_scaleは
そこでは何にも届きません。ECは同じパイプラインを使いますが、タスクが姿勢推定の
ときはhsv_prob、degrees、translateを読みます。分類系のファミリーは、分類系
ではバッチMixUpとなるmixupを除いてその一式を無視し、flip_probは読みます。
SegFormer、LingBot-Vision、NAFNetは、反転が設定可能な確率ではなく固定の確率で
行われるため、その一式全体に加えてflip_probも無視します。YOLO-NASは代わりに常時有効なサンプルごとの
アフィン変換でデータ拡張するため、mosaicだけを無視します。RF-DETRはそのリストに
加えてさらに3つ、optimizer、momentum、nesterovを無視します。
これらを設定してもエラーにはなりません。実行時にはファミリー名と無視する引数を
挙げた行が標準エラー出力に記録されてから学習が始まり、その行がインストールされて
いるバージョンにとっての確定的なリストになります。それが唯一の手がかりでもある
ため、quiet=trueを指定したスクリプト実行では、標準エラー出力のほかの内容と
ともにこの警告も抑制されます。
val=falseも関連するケースです。eval_intervalを0に設定し、これにより最終
エポックも含めて学習中の検証が無効になり、実行ではbest.ptが書き出されません。
知っておくとよいその他の挙動
lora=trueを受け付けるのはRF-DETR、D-FINE、DEIM、DEIMv2、RT-DETRのv1、v2、v4、
EC、GTR、ConvNeXtです。ほかのファミリーはLoRAなしで学習するのではなく、
config_unsupportedで終了します。
clip_max_normを受け付けるのは、学習設定でこれを宣言しているファミリーです:
YOLOv9、YOLOv9-E2E、YOLOv9-P2ではデフォルトが10、D-FINE、Dome-DETR、DEIM、
DEIMv2、TinyFormer、RT-DETR、RT-DETRv2、RT-DETRv4、RF-DETR、DINOv2、GTRでは
デフォルトが0.1です。ほかのファミリーはconfig_unsupportedで終了し、負の値や
有限でない値はconfig_type_errorで終了します。
device=0,1は、リストの最初のGPU上にモデルを構築し、リストをtrain()に渡します。
train()はGPUごとに1つのプロセスを起動します。
マルチGPU学習を参照してください。
RF-DETRには検出からセグメンテーションへの転移がありません。RF-DETRのセグメンテーション
チェックポイントでtask=segmentを指定すると、チェックポイントのメタデータがタスクを
決めるため、ファイル名にかかわらずそのチェックポイントを読み込みます。一方、検出
チェックポイントでは、学習されていないマスクヘッドを学習する代わりにエラーで停止します。
pretrained=falseとresumeの併用は、両者が正反対のことを求めているため、ゼロ
からの学習に対応するファミリーでは拒否されます。
mosaicとmixupは、設定フィールドmosaic_probとmixup_probのコマンドライン上
の書き方で、分類モデルでは代わりにmixupがバッチMixUpになります。Mixupが
Mosaicのサンプルにしか適用されないファミリーでは、mosaicが
0のままmixupを0より大きくしても一度も発火せず、実行時にその旨が示されます。
dry_run=trueはモデル参照を解決し、ファミリーのデフォルト値を適用して、学習に
使われる設定を表示します。データセットは読み込まないため、引数が期待どおりの値に
なっているかを安く確認する方法になります。
標準出力には最終的な結果オブジェクトが流れ、進捗と警告は標準エラー出力に出ます。
終了コードは、成功時が0、使い方や設定の誤りが2、データセットが見つからないか
読み込めない場合が3、モデルを読み込めない場合が4、そのほかの実行時エラーが
1です。
関連:実行に踏み切る前にデータセットを確認するなら
libreyolo doctor、ブラウザーで実行を見守るなら
libreyolo monitor、結果を測定するなら
libreyolo val。