YOLOv5のトレーニング結果を最大限に高めるためのヒント#
📚 このガイドでは、YOLOv5で最高のmAPとトレーニング結果を得る方法を説明します 🚀。
ほとんどの場合、データセットが十分な規模で適切にラベル付けされていれば、モデルやトレーニング設定を変更しなくても良好な結果が得られます。最初に良い結果が得られない場合は改善策を試せますが、変更を検討する前に、まずすべてのデフォルト設定でトレーニングすることを常に推奨します。これにより、パフォーマンスのベースラインを確立し、改善点を特定できます。
トレーニング結果について質問する場合、役立つ回答を得るために、結果のプロット(train losses、val losses、P、R、mAP)、PR曲線、混同行列、トレーニング時のモザイク画像、テスト結果、labels.pngなどのデータセット統計画像を含め、できる限り多くの情報を提供することをおすすめします。これらはすべてproject/nameディレクトリ(通常はyolov5/runs/train/exp)にあります。
YOLOv5のトレーニングで最高の結果を得たいユーザー向けに、詳しいガイドを以下にまとめました。
データセット#
- クラスあたりの画像数。 クラスあたり1500枚以上を推奨します
- クラスあたりのインスタンス数。 クラスあたり10000個以上のインスタンス(ラベル付けされたオブジェクト)を推奨します
- 画像の多様性。 デプロイ先の環境を代表する画像を用意する必要があります。実環境での使用を想定する場合は、時間帯、季節、天候、照明、角度、入手元(オンラインから収集、ローカルで収集、異なるカメラ)などが異なる画像をおすすめします。
- ラベルの一貫性。 すべての画像内のすべてのクラスの全インスタンスにラベルを付ける必要があります。一部だけのラベル付けでは機能しません。
- ラベルの精度。 ラベルは各オブジェクトを正確に囲む必要があります。オブジェクトとそのバウンディングボックスの間に隙間があってはいけません。ラベルの付いていないオブジェクトがあってはいけません。
- train/val分割の徹底。 過度に楽観的な指標を避けるため、検証画像とテスト画像がトレーニングセットに含まれないようにします。分割間でクラスの分布を同程度に保ちます。
- ラベルの確認。 トレーニング開始時に
train_batch*.jpgを表示して、ラベルが正しく見えることを確認します。つまり、例のモザイク画像を確認します。 - 背景画像。 背景画像とは、False Positive(FP)を減らすためにデータセットに追加する、オブジェクトのない画像です。FPを減らすため、背景画像の割合は約0~10%を推奨します(参考として、COCOには背景画像が1000枚あり、全体の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、1200など、さらに長くトレーニングします。
- 画像サイズ。 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エポックにわたって改善しない場合にトレーニングを停止できるため、時間を節約し、過学習を防げます。
高度な最適化手法#
- 転移学習。 特化したデータセットの場合は、事前学習済み重みから開始し、必要に応じて
--freezeでレイヤーを凍結して、モデルを特定のタスクに適応させます。 - モデルの枝刈り。 トレーニング後、冗長な重みを削除して、パフォーマンスを大きく損なうことなくモデルサイズを縮小することを検討してください。
- モデルアンサンブル。 重要なアプリケーションでは、異なる設定で複数のモデルをトレーニングし、それらの予測を組み合わせることで精度を高められます。
- テスト時データ拡張。 推論時に
--augmentを有効にすると、入力画像を拡張した複数のバージョンから得られる結果を平均し、予測精度を向上できます。
関連情報#
詳しく知りたい場合は、Karpathyの「ニューラルネットワークのトレーニングレシピ」から始めるとよいでしょう。機械学習の幅広い分野で応用できる、優れたトレーニングのアイデアが紹介されています。https://karpathy.github.io/2019/04/25/recipe/
頑張ってください 🍀。ほかにも質問があればお知らせください。
よくある質問#
トレーニング損失が下がり続ける一方で、検証損失が上昇し始めた場合、モデルが過学習している可能性があります。検証mAPを監視し、トレーニング損失が改善し続ける一方で検証mAPが横ばいまたは低下する場合は、過学習の兆候です。トレーニングデータの追加、データ拡張の強化、正則化手法の導入などが解決策として挙げられます。
最適なバッチサイズはGPUメモリによって異なります。一般に、バッチサイズが大きいほどバッチ正規化の統計とトレーニングの安定性が向上します。メモリ不足にならずにハードウェアで処理できる最大のバッチサイズを使用してください。
--batch-size -1を使用すると、環境に最適なバッチサイズを自動的に判断できます。トレーニングを高速化するには、
--device 0,1,2,3を使用して複数のGPUを使う、--cacheでデータセットをキャッシュする、バッチサイズを最適化する、といった方法を試してください(対応GPUでは混合精度が自動的に有効になります)。絶対的な精度が重要でない場合は、YOLOv5sなどの小型モデルを使うことも検討してください。
