YOLOv5で最良のトレーニング結果を得るためのヒント#
📚 このガイドでは、YOLOv5で最高のmAPとトレーニング結果を得る方法を説明します 🚀。
ほとんどの場合、データセットが十分に大きく、適切にラベル付けされていることを条件に、モデルやトレーニング設定を変更せずに良好な結果を得られます。最初に良い結果が得られなかった場合は、改善のために実行できる手順がありますが、変更を検討する前に、まずすべてのデフォルト設定でトレーニングすることを常に推奨します。これにより、パフォーマンスのベースラインを確立し、改善すべき領域を把握できます。
トレーニング結果について質問がある場合、役立つ回答を期待するなら、可能な限り最大限の情報を提供することを推奨します。これには、結果のプロット(train losses、val losses、P、R、mAP)、PR曲線、混同行列、トレーニングモザイク、テスト結果、labels.pngなどのデータセット統計画像が含まれます。これらはすべて project/name ディレクトリ(通常は yolov5/runs/train/exp)にあります。
YOLOv5のトレーニングで最良の結果を得たいユーザー向けに、完全なガイドを以下にまとめました。
データセット#
- クラスあたりの画像数。 クラスあたり1,500画像以上を推奨
- クラスあたりのインスタンス数。 クラスあたり10,000インスタンス(ラベル付けされたオブジェクト)以上を推奨
- 画像の多様性。 デプロイ環境を代表するものである必要があります。実環境のユースケースでは、時刻、季節、天候、照明、角度、ソース(オンラインから収集、ローカルで収集、異なるカメラ)などが異なる画像を推奨します。
- ラベルの一貫性。 すべての画像に含まれるすべてのクラスのすべてのインスタンスにラベルを付ける必要があります。一部だけのラベル付けは機能しません。
- ラベルの精度。 ラベルは各オブジェクトを正確に囲む必要があります。オブジェクトとそのバウンディングボックスの間に隙間があってはなりません。ラベルのないオブジェクトが存在してはなりません。
- Train/val分割の徹底。 過度に楽観的なメトリクスを避けるため、検証画像とテスト画像がトレーニングセットに含まれないようにしてください。分割間でクラス分布を同様に保ってください。
- ラベルの検証。 トレーニング開始時に
train_batch*.jpgを表示し、ラベルが正しく表示されることを確認してください。つまり、例のモザイクを確認します。 - 背景画像。 背景画像とは、False Positives(FP)を減らすためにデータセットへ追加する、オブジェクトを含まない画像です。FPの削減に役立つよう、背景画像は約0~10%にすることを推奨します(参考として、COCOには背景画像が1,000枚あり、全体の1%に相当します)。背景画像にラベルは必要ありません。
モデルの選択#
YOLOv5xやYOLOv5x6などの大規模モデルは、ほぼすべてのケースでより良い結果を得られますが、パラメーター数が多く、トレーニングにより多くのCUDAメモリを必要とし、実行速度も遅くなります。モバイル環境へのデプロイにはYOLOv5s/m、クラウド環境へのデプロイにはYOLOv5l/xを推奨します。すべてのモデルの完全な比較については、READMEの表を参照してください。

-
事前トレーニング済みの重みから開始。 小~中規模のデータセット(例:VOC、VisDrone、GlobalWheat)に推奨します。モデル名を
--weights引数に渡してください。モデルは最新のYOLOv5リリースから自動的にダウンロードされます。python train.py --data custom.yaml --weights yolov5s.pt python train.py --data custom.yaml --weights yolov5m.pt python train.py --data custom.yaml --weights yolov5l.pt python train.py --data custom.yaml --weights yolov5x.pt python train.py --data custom.yaml --weights custom_pretrained.pt -
スクラッチから開始。 大規模なデータセット(例:COCO、Objects365、OIv6)に推奨します。使用したいモデルアーキテクチャのYAMLと、空の
--weights ''引数を渡してください。python train.py --data custom.yaml --weights '' --cfg yolov5s.yaml python train.py --data custom.yaml --weights '' --cfg yolov5m.yaml python train.py --data custom.yaml --weights '' --cfg yolov5l.yaml python train.py --data custom.yaml --weights '' --cfg yolov5x.yaml
トレーニング設定#
何かを変更する前に、まずデフォルト設定でトレーニングしてパフォーマンスのベースラインを確立してください。train.py設定の完全な一覧は、train.pyのargparserにあります。
- エポック。 まずは300エポックから開始します。早期に過学習する場合は、エポック数を減らせます。300エポック後も過学習が発生しない場合は、600、1,200など、より長くトレーニングしてください。
- 画像サイズ。 COCOは
--img 640のネイティブ解像度でトレーニングされますが、データセット内に小さなオブジェクトが多数存在するため、--img 1280などの高解像度でトレーニングすると効果があります。小さなオブジェクトが多い場合、カスタムデータセットではネイティブ解像度またはそれ以上の解像度でのトレーニングが効果的です。推論で最良の結果を得るには、トレーニング時と同じ--imgを使用します。つまり、--img 1280でトレーニングした場合は、--img 1280でもテストと検出を行う必要があります。 - バッチサイズ。 ハードウェアで使用可能な最大の
--batch-sizeを使用してください。小さいバッチサイズではバッチ正規化の統計が不十分になるため、避ける必要があります。--batch-size -1を使用すると、GPUに最適なバッチサイズを自動的に選択できます。 - 学習率。 デフォルトの学習率スケジュールは、ほとんどのケースで適切に機能します。より高速に収束させるには、
--cos-lrフラグを使用してコサイン学習率スケジューリングを有効にする方法を試せます。これにより、エポック全体でコサイン曲線に従って学習率が徐々に低下します。 - データ拡張。 YOLOv5には、複数のトレーニング画像を組み合わせるモザイクなど、さまざまな拡張手法が含まれています。
--hypファイル内のmosaicハイパーパラメーターで拡張の強度を調整し、トレーニングの安定化に役立ててください。 - ハイパーパラメーター。 デフォルトのハイパーパラメーターはhyp.scratch-low.yamlにあります。変更を検討する前に、まずデフォルトのハイパーパラメーターでトレーニングすることを推奨します。一般に、拡張のハイパーパラメーターを大きくすると、過学習が抑制・遅延され、より長いトレーニングと最終的に高いmAPが可能になります。
hyp['obj']などの損失成分ゲインのハイパーパラメーターを小さくすると、該当する損失成分での過学習を抑制できます。これらのハイパーパラメーターを自動的に最適化する方法については、ハイパーパラメーター進化チュートリアルを参照してください。 - 混合精度トレーニング。 YOLOv5は、対応するGPUが検出されるとAutomatic Mixed Precision(AMP)を自動的に有効にし、モデルの精度を犠牲にすることなくトレーニングを高速化し、メモリ使用量を削減します。
- マルチGPUトレーニング。 複数のGPUがある場合は、
--device 0,1,2,3を使用してトレーニングを分散すると、トレーニング時間を大幅に短縮できる可能性があります。 - 早期停止。
--patience 50を使用すると、検証メトリクスが50エポックにわたって改善しない場合にトレーニングを停止し、時間を節約して過学習を防止できます。
高度な最適化手法#
- 転移学習。 特化したデータセットでは、事前トレーニング済みの重みから開始し、トレーニング中にレイヤーを徐々に凍結解除して、特定のタスクにモデルを適応させます。
- モデルのプルーニング。 トレーニング後、モデルをプルーニングして冗長な重みを削除し、大幅なパフォーマンス低下なしにモデルサイズを削減することを検討してください。
- モデルアンサンブル。 重要なアプリケーションでは、異なる設定で複数のモデルをトレーニングし、それらの予測を組み合わせることで精度を向上させます。
- テスト時データ拡張。
--augmentを使用して推論中にTTAを有効にすると、入力画像の拡張版から得られた結果を平均化して予測精度を向上できます。
さらに詳しく#
さらに詳しく知りたい場合は、Karpathyの「ニューラルネットワークのトレーニングレシピ」から始めるのがよいでしょう。さまざまなML領域に幅広く適用できる、トレーニングに関する優れたアイデアが紹介されています:https://karpathy.github.io/2019/04/25/recipe/
トレーニング設定と構成の詳細については、使用可能なすべてのパラメーターを包括的に説明しているUltralyticsのtrain設定ドキュメントを参照してください。
🍀 成功をお祈りします。ほかに質問があればお知らせください。
FAQ#
トレーニング損失が低下し続ける一方で検証損失が増加し始めた場合、モデルは過学習している可能性があります。検証mAPを監視し、トレーニング損失が改善し続けているのに検証mAPが横ばいまたは低下している場合は、過学習の兆候です。解決策には、トレーニングデータの追加、データ拡張の強化、正則化手法の導入などがあります。
最適なバッチサイズはGPUメモリに依存します。一般に、バッチサイズを大きくすると、バッチ正規化の統計とトレーニングの安定性が向上します。メモリ不足にならず、ハードウェアで処理できる最大のバッチサイズを使用してください。
--batch-size -1を使用すると、環境に最適なバッチサイズを自動的に決定できます。トレーニングを高速化するには、
--device 0,1,2,3を使用した複数GPUの利用、--cacheによるデータセットのキャッシュ、バッチサイズの最適化を試してください(対応するGPUでは混合精度が自動的に有効になります)。絶対的な精度が重要でない場合は、YOLOv5sのような小規模モデルのバリアントの使用も検討してください。
