YOLOv5の最適な学習結果を得るためのヒント
📚 このガイドでは、YOLOv5 🚀で最高のmAPとトレーニング結果を得る方法について説明します。
ほとんどの場合、モデルまたはトレーニング設定を変更しなくても、データセットが十分に大きく、適切にラベル付けされていれば、良好な結果が得られます。最初は良い結果が得られない場合は、改善するために実行できる手順がありますが、変更を検討する前に、最初にすべてのデフォルト設定でトレーニングすることを常にお勧めします。これは、パフォーマンスのベースラインを確立し、改善の余地がある領域を特定するのに役立ちます。
トレーニング結果について質問がある場合は 可能な限り多くの情報を提供することをお勧めします。 役立つ回答(トレーニング損失、検証損失、適合率、再現率、mAP)、PR 曲線などの結果プロットを含む)を期待する場合は、 混同行列、トレーニングモザイク、テスト結果、およびlabels.pngなどのデータセット統計画像。これらはすべて、 project/name
ディレクトリ(通常) yolov5/runs/train/exp
.
YOLOv5 のトレーニングで最高の結果を得るための完全なガイドを以下にまとめました。
データセット
- クラスごとの画像数。クラスごとに≥ 1500枚の画像をお勧めします。
- クラスごとのインスタンス数。 クラスあたり≥ 10000インスタンス(ラベル付きオブジェクト)を推奨
- 画像の多様性。デプロイされる環境を代表するものでなければなりません。実際のユースケースでは、異なる時間帯、異なる季節、異なる天候、異なる照明、異なる角度、異なるソース(オンラインでスクレイピング、ローカルで収集、異なるカメラ)からの画像をお勧めします。
- ラベルの一貫性。 すべての画像内のすべてのクラスのすべてのインスタンスにラベルを付ける必要があります。部分的なラベリングは機能しません。
- ラベルの精度。ラベルは各オブジェクトを正確に囲む必要があります。オブジェクトとそのバウンディングボックスの間にスペースがあってはなりません。ラベルのないオブジェクトがあってはなりません。
- ラベルの検証。 表示
train_batch*.jpg
学習開始時にラベルが正しく表示されることを確認します。例えば、 例 モザイク。 - 背景画像: 背景画像とは、誤検出(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にあります。
- Epochs(エポック):まずは300エポックで開始してください。早期に過学習が発生する場合は、エポック数を減らすことができます。300エポック後に過学習が発生しない場合は、600、1200などのように、より長く学習させてください。
- 画像サイズ。 COCOはネイティブ解像度でトレーニング
--img 640
が、データセット内の小さなオブジェクトが多いため、より高い解像度(--img 1280
。小さなオブジェクトが多い場合、カスタムデータセットはネイティブまたはより高い解像度でのトレーニングからメリットが得られます。最高の推論結果は、同じ解像度で得られます。--img
トレーニングが実行された条件として。例えば、--img 1280
また、以下の状況でテストと検出を行う必要があります。--img 1280
. - バッチサイズ。 最大の物を使用します
--batch-size
ハードウェアが許容する範囲で設定してください。バッチサイズが小さいと、 バッチ正規化 統計であり、避ける必要があります。使用できます--batch-size -1
GPUに最適なバッチサイズを自動的に選択します。 - 学習率。 デフォルトの学習率スケジュールは、ほとんどの場合にうまく機能します。より速い収束のために、以下を使用してみてください。
--cos-lr
このフラグは、コサイン学習率スケジューリングを有効にします。これにより、エポックを通じてコサイン曲線に従って学習率が徐々に低下します。 - データ拡張。 YOLOv5には、複数のトレーニング画像を組み合わせるモザイクのような様々なデータ拡張手法が含まれています。最後の数エポックでは、以下を使用することを検討してください。
--close-mosaic 10
モザイクオーグメンテーションを無効にするには、トレーニングの安定化に役立ちます。 - ハイパーパラメータ デフォルトのハイパーパラメータは以下にあります。 hyp.scratch-low.yaml最初にデフォルトのハイパーパラメータで学習することを推奨します。一般に、augmentationハイパーパラメータを大きくすると、過学習が軽減され、遅延するため、より長い学習とより高い最終 mAP が可能になります。損失成分ゲインハイパーパラメータの削減(例:
hyp['obj']
これらの特定の損失成分における過学習を軽減するのに役立ちます。これらのハイパーパラメータを最適化する自動化された方法については、こちらをご覧ください。 ハイパーパラメータ進化チュートリアル. - 混合精度トレーニング。 以下を使用して混合精度トレーニングを有効にします。
--amp
モデルの精度を犠牲にすることなく、トレーニングを高速化し、メモリ使用量を削減します。 - マルチGPUトレーニング。 複数のGPUがある場合は、以下を使用してください
--device 0,1,2,3
それら全体にトレーニングを分散させるには、トレーニング時間を大幅に短縮できます。 - 早期停止。 使用
--patience 50
to stop training if validation metrics don't improve for 50 epochs, saving time and preventing overfitting.
高度な最適化手法
- Transfer learning. 特殊なデータセットの場合、事前トレーニング済みの重みから開始し、トレーニング中にレイヤーを徐々に凍結解除して、モデルを特定のタスクに適応させます。
- Model pruning. トレーニング後、冗長な重みを削除し、パフォーマンスを大幅に低下させることなくモデルサイズを縮小するために、モデルの枝刈りを検討してください。
- Model ensemble. 重要なアプリケーションでは、異なる構成で複数のモデルをトレーニングし、それらの予測を組み合わせて精度を向上させます。
- テスト時の拡張。 以下を使用して推論中にTTAを有効にします。
--augment
入力画像の拡張バージョンから結果を平均化することにより、予測精度を向上させます。
参考資料
さらに詳しく知りたい場合は、Karpathy氏の「ニューラルネットワークのトレーニングレシピ」から始めるのがおすすめです。これは、すべてのMLドメインに広く適用できるトレーニングに関する優れたアイデアが満載です: https://karpathy.github.io/2019/04/25/recipe/
トレーニング設定と構成の詳細については、利用可能なすべてのパラメータに関する包括的な説明が記載されているUltralyticsトレーニング設定ドキュメントを参照してください。
頑張ってください 🍀。何かご不明な点がございましたら、お気軽にお知らせください。
よくある質問
モデルが過学習しているかどうかを判断するにはどうすればよいですか?
トレーニング損失が減少し続ける一方で、検証損失が増加し始めた場合、モデルが過学習している可能性があります。検証のmAPを監視してください。トレーニング損失が向上し続ける一方で、検証のmAPが停滞または減少する場合は、過学習の兆候です。解決策としては、トレーニングデータを増やす、データ拡張を増やす、または正則化手法を実装することなどが挙げられます。
YOLOv5のトレーニングに最適なバッチサイズは何ですか?
最適なバッチサイズは、GPUメモリに依存します。一般に、バッチサイズが大きいほど、バッチ正規化の統計が改善され、トレーニングの安定性が向上します。ハードウェアがメモリ不足にならずに処理できる最大のバッチサイズを使用してください。 --batch-size -1
セットアップに最適なバッチサイズを自動的に決定します。
YOLOv5のトレーニングを高速化するにはどうすればよいですか?
トレーニングを高速化するには、--ampを使用して混合精度トレーニングを有効にしてみてください。 --amp
は、複数のGPUを --device 0,1,2,3
を使用してデータセットをキャッシュし、 --cache
、バッチサイズを最適化します。絶対精度がそれほど重要でない場合は、YOLOv5sのようなより小さなモデルバリアントの使用も検討してください。