YOLOv5で最良の学習結果を得るためのヒント#
📚 本ガイドでは、YOLOv5を使用して最高のmAPと学習結果を生み出す方法を解説します 🚀。
多くの場合、データセットが十分に大きく、適切にラベル付けされていれば、モデルや学習設定を変更しなくても良好な結果が得られます。最初に良好な結果が得られなかった場合、改善のために実行できるステップはありますが、変更を検討する前に、常にすべてのデフォルト設定で学習を実行することを推奨します。これにより、パフォーマンスのベースラインを確立し、改善の余地がある領域を特定するのに役立ちます。
トレーニング結果について質問がある場合、有用な回答を得るためには可能な限り多くの情報を提供することをおすすめします。結果プロット(訓練損失、検証損失、P、R、mAP)、PR曲線、confusion matrix、訓練モザイク、テスト結果、およびlabels.pngなどのデータセット統計画像が含まれます。これらはすべて project/name ディレクトリ(通常は yolov5/runs/train/exp)にあります。
以下に、YOLOv5の学習で最良の結果を得ようとしているユーザーのための完全なガイドをまとめました。
データセット#
- クラスごとの画像数。 クラスごとに1500枚以上の画像を推奨します。
- クラスごとのインスタンス数。 クラスごとに10000インスタンス(ラベル付けされたオブジェクト)以上を推奨します。
- 画像の多様性。 デプロイ環境を代表するものである必要があります。現実世界のユースケースでは、時間帯、季節、天候、照明、角度、ソース(オンラインスクレイピング、ローカル収集、異なるカメラなど)が異なる画像を使用することを推奨します。
- ラベルの一貫性。 すべての画像内の全クラスの全インスタンスにラベルを付ける必要があります。部分的なラベル付けでは機能しません。
- ラベルのaccuracy。 ラベルは各オブジェクトをしっかりと囲んでいる必要があります。オブジェクトとそのbounding boxの間に隙間があってはなりません。ラベルが欠落しているオブジェクトがないようにしてください。
- 学習/検証分割の規律。 楽観的すぎる指標を避けるため、検証およびテスト用の画像が学習セットに決して含まれないようにしてください。分割間でクラス分布が類似するように維持してください。
- ラベルの検証。 訓練開始時に
train_batch*.jpgを表示して、ラベルが正しく表示されているか、つまりexampleモザイクを確認してください。 - 背景画像。 背景画像とは、False Positive (FP) を減らすためにデータセットに追加される、オブジェクトのない画像のことです。FPを減らすために、0〜10%程度の背景画像を含めることを推奨します(参考としてCOCOには合計の1%にあたる1000枚の背景画像が含まれています)。背景画像にはラベルは必要ありません。
モデルの選択#
YOLOv5xやYOLOv5x6のような大型モデルは、ほとんどの場合でより優れた結果を生み出しますが、パラメータが多く、訓練により多くのCUDAメモリを必要とし、実行速度が遅くなります。モバイル デプロイには YOLOv5s/m を推奨し、クラウド デプロイには YOLOv5l/x を推奨します。すべてのモデルの完全な比較については、READMEのtableを参照してください。

-
事前学習済み重みから開始。 小規模から中規模のデータセット(つまり 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 にあります。
- Epochs。 300エポックから開始します。これで早期に過学習が発生する場合は、エポック数を減らすことができます。300エポック後もoverfittingが発生しない場合は、600、1200エポックなど、より長く訓練します。
- 画像サイズ。 COCO は
--img 640のネイティブ解像度で訓練されますが、データセット内の小オブジェクトの数が多いため、--img 1280などの高解像度で訓練することでメリットが得られる場合があります。小オブジェクトが多い場合、カスタムデータセットはネイティブ解像度またはそれ以上の解像度で訓練することでメリットが得られます。最良の推論結果は、訓練が実行されたのと同じ--imgで得られます。つまり、--img 1280で訓練した場合は、--img 1280でもテストと検出を行う必要があります。 - Batch size。 ハードウェアが許容する最大の
--batch-sizeを使用してください。バッチサイズが小さいと、batch normalization の統計が悪くなるため避けるべきです。--batch-size -1を使用して、GPU に最適なバッチサイズを自動的に選択できます。 - Learning rate。 デフォルトの学習率スケジュールは、ほとんどの場合でうまく機能します。より高速な収束のために、
--cos-lrフラグを使用してコサイン学習率スケジュールを有効にすることを試すことができます。これにより、エポックにわたってコサイン曲線に従って学習率が徐々に低下します。 - Data augmentation. YOLOv5はモザイクなどのさまざまな拡張テクニックを備えており、複数のトレーニング画像を組み合わせます。
mosaicファイル内の--hypハイパーパラメータを使用して拡張強度を調整し、トレーニングの安定化を図ります。 - ハイパーパラメータ。 デフォルトのハイパーパラメータは hyp.scratch-low.yaml にあります。何も変更を考える前に、まずはデフォルトのハイパーパラメータで訓練することをお勧めします。一般に、拡張ハイパーパラメータを増やすと過学習が軽減および遅延され、より長時間の訓練とより高い最終 mAP が可能になります。
hyp['obj']などの損失コンポーネントのゲインハイパーパラメータを減らすと、それらの特定の損失コンポーネントにおける過学習を軽減するのに役立ちます。これらのハイパーパラメータを最適化するための自動化された方法については、Hyperparameter Evolution Tutorial を参照してください。 - Mixed precision 訓練。 YOLOv5 は、サポートされている GPU が検出されたときに Automatic Mixed Precision (AMP) を自動的に有効にし、モデルの精度を犠牲にすることなく訓練を高速化し、メモリ使用量を削減します。
- マルチGPU訓練。 複数の GPU がある場合は、
--device 0,1,2,3を使用してそれらの間で訓練を分散させることができます。これにより、訓練時間を大幅に短縮できます。 - 早期停止。 検証指標が 50 エポックの間改善しない場合に訓練を停止するには、
--patience 50を使用します。これにより、時間を節約し、過学習を防ぐことができます。
高度な最適化テクニック#
- Transfer learning。 特殊なデータセットの場合は、事前学習済みの重みから開始し、訓練中にレイヤーを徐々にフリーズ解除して、モデルを特定のタスクに適応させます。
- Model pruning。 訓練後、モデルのパフォーマンスを大幅に低下させることなく、冗長な重みを削除してモデルサイズを縮小するためにモデルプルーニングを検討してください。
- Model ensemble。 重要なアプリケーションの場合、異なる構成で複数のモデルを訓練し、その予測を組み合わせて精度を向上させます。
- Test-time augmentation。 入力画像の拡張バージョンからの結果を平均化して予測精度を向上させるために、
--augmentで推論中に TTA を有効にします。
さらなる学習#
詳細を知りたい場合、始めるのに良い場所は Karpathy の「Recipe for Training Neural Networks」です。これは、すべての ML ドメインに幅広く適用できる素晴らしいトレーニングのアイデアを持っています: https://karpathy.github.io/2019/04/25/recipe/
訓練設定と構成に関する詳細については、利用可能なすべてのパラメータの包括的な説明を提供する Ultralytics train settings documentation を参照してください。
幸運を祈ります 🍀。他にも質問があればお知らせください!
よくある質問 (FAQ)#
学習損失が減少を続けている一方で検証損失が増加し始めた場合、モデルが過学習している可能性があります。検証 mAP を監視してください。学習損失が改善し続けているのに mAP が停滞または減少している場合は、過学習の兆候です。解決策としては、学習データを増やす、データ拡張を増やす、あるいは正則化手法を実装することが挙げられます。
最適なバッチサイズは GPU メモリによって異なります。一般的に、バッチサイズが大きいほど、バッチ正規化の統計と訓練の安定性が向上します。メモリ不足にならずにハードウェアが処理できる最大のバッチサイズを使用してください。セットアップに最適なバッチサイズを自動的に決定するには、
--batch-size -1を使用できます。訓練を高速化するには、
--device 0,1,2,3を使用した複数 GPU の使用、--cacheを使用したデータセットのキャッシュ、およびバッチサイズの最適化(サポートされている GPU では混合精度が自動的に有効になります)を試してください。また、絶対的な精度が重要でない場合は、YOLOv5s などのより小さなモデルバリアントの使用も検討してください。
