YOLOv5で最良の学習結果を得るためのヒント

📚 このガイドでは、YOLOv5で最高のmAPと学習結果を生成する方法を解説します 🚀。

多くの場合、データセットが十分に大きく、適切にラベル付けされていれば、モデルや学習設定を変更しなくても良好な結果が得られます。最初に良い結果が出なかった場合でも、改善のために取れる手段はいくつかありますが、変更を検討する前に、まずはすべてのデフォルト設定で学習を実行することを強く推奨します。これにより、パフォーマンスのベースラインを確立し、改善が必要な領域を特定することができます。

学習結果について質問がある場合は、有益な回答を得るために、結果のプロット(train loss、val loss、P、R、mAP)、PR曲線、混同行列、トレーニングモザイク、テスト結果、およびlabels.pngなどのデータセット統計画像を含む、可能な限り最大限の情報を提供することをお勧めします。これらはすべて project/name ディレクトリ(通常は yolov5/runs/train/exp)に格納されています。

以下に、YOLOv5の学習で最良の結果を得たいユーザー向けの完全なガイドをまとめました。

データセット

  • クラスごとの画像数。 クラスごとに1500枚以上の画像を推奨
  • クラスごとのインスタンス数。 クラスごとに10000インスタンス(ラベル付けされたオブジェクト)以上を推奨
  • 画像の多様性。 デプロイ先の環境を代表するものである必要があります。現実世界での使用例として、時間帯、季節、天候、照明条件、角度、ソース(オンラインでスクレイピングしたもの、ローカルで収集したもの、異なるカメラなど)が異なる画像を推奨します。
  • ラベルの整合性。 すべての画像内の全クラスの全インスタンスにラベルを付ける必要があります。部分的なラベル付けでは機能しません。
  • ラベルの精度 ラベルは各オブジェクトを厳密に囲む必要があります。オブジェクトとバウンディングボックスの間に隙間があってはなりません。ラベル付けされていないオブジェクトがあってはなりません。
  • 学習/検証データの分割の規律。 評価が過度に楽観的にならないよう、検証用画像やテスト用画像が学習セットに決して含まれないようにしてください。分割間でクラス分布を維持してください。
  • ラベルの検証。 学習開始時に train_batch*.jpg を確認し、ラベルが正しく表示されているか(例:のモザイクを参照)を確認してください。
  • 背景画像。 背景画像とは、偽陽性(FP)を減らすためにデータセットに追加される、オブジェクトが含まれていない画像のことです。FPを減らすために、約0~10%の背景画像を含めることを推奨します(参考として、COCOデータセットには全体の中の1%にあたる1000枚の背景画像が含まれています)。背景画像にはラベルは必要ありません。

COCO dataset class distribution analysis

モデルの選択

YOLOv5xやYOLOv5x6のような大型モデルは、ほぼすべての場合においてより良い結果を出しますが、パラメータ数が多く、学習に多くのCUDAメモリを必要とし、実行速度が遅くなります。モバイルへのデプロイにはYOLOv5s/mを、クラウドへのデプロイにはYOLOv5l/xを推奨します。すべてのモデルの比較については、READMEのテーブルを参照してください。

YOLOv5 Models

  • 事前学習済みウェイトから開始。 小規模から中規模のデータセット(例:VOCVisDroneGlobalWheat)に推奨されます。--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
  • ゼロから開始。 大規模なデータセット(例:COCOObjects365OIv6)に推奨されます。関心のあるモデルアーキテクチャの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には、複数の学習画像を組み合わせるモザイクなどのさまざまな拡張技術が含まれています。最後の数エポックについては、モザイク拡張を無効にする --close-mosaic 10 の使用を検討してください。これにより学習が安定する場合があります。
  • ハイパーパラメータ。 デフォルトのハイパーパラメータは hyp.scratch-low.yaml にあります。変更を検討する前に、まずはデフォルトのハイパーパラメータで学習することを強く推奨します。一般的に、拡張に関するハイパーパラメータを増やすと過学習が減少・遅延し、より長い学習が可能になり、最終的なmAPが高くなります。hyp['obj'] のような損失コンポーネントのゲインハイパーパラメータを減らすと、それらの特定の損失コンポーネントにおける過学習を減らすのに役立ちます。これらのハイパーパラメータを最適化する自動化手法については、ハイパーパラメータ進化チュートリアルを参照してください。
  • 混合精度学習。 --amp を有効にして混合精度学習を行うと、モデルの精度を犠牲にすることなく、学習を高速化しメモリ使用量を削減できます。
  • マルチGPU学習。 複数のGPUがある場合は、--device 0,1,2,3 を使用して学習を分散させることで、学習時間を大幅に短縮できます。
  • 早期終了。 --patience 50 を使用して、50エポックの間検証メトリクスが改善されない場合に学習を停止させることで、時間を節約し、過学習を防ぐことができます。

高度な最適化技術

  • 転移学習 特殊なデータセットの場合は、事前学習済みのウェイトから開始し、学習中に段階的にレイヤーの凍結を解除することで、モデルを特定のタスクに適応させることができます。
  • モデル枝刈り(プルーン) 学習後、冗長なウェイトを削除してモデルサイズを縮小し、大幅な性能低下なしにモデルの軽量化を検討してください。
  • モデルアンサンブル クリティカルなアプリケーションでは、異なる構成で複数のモデルを学習し、その予測を組み合わせて精度を向上させます。
  • 推論時データ拡張(TTA) 推論時に --augment でTTAを有効にすると、入力画像の拡張バージョンからの結果を平均化することで、予測精度を向上させることができます。

さらに詳しく

さらに詳しく知りたい場合は、Karpathyによる「ニューラルネットワーク学習のレシピ」から始めるのがおすすめです。これはすべてのML領域に幅広く適用できる素晴らしい学習のアイデアが盛り込まれています:https://karpathy.github.io/2019/04/25/recipe/

学習設定と構成に関する詳細については、利用可能なすべてのパラメータを包括的に解説している Ultralytics学習設定ドキュメント を参照してください。

幸運を祈ります 🍀。他にも質問があればお知らせください!

FAQ

モデルが過学習しているかどうかはどうすればわかりますか?

学習損失(train loss)が減少し続けている一方で、検証損失(val loss)が増加し始めた場合、モデルが過学習している可能性があります。検証mAPを監視してください。もし学習損失が向上し続けているにもかかわらずmAPが停滞または減少する場合は、それが過学習の兆候です。解決策として、学習データを追加する、データ拡張を増やす、あるいは正則化手法を実装することが挙げられます。

YOLOv5の学習における最適なバッチサイズは?

最適なバッチサイズはGPUメモリに依存します。バッチサイズを大きくすると、一般的にバッチ正規化の統計が安定し、学習の安定性も向上します。メモリ不足にならずに処理できる最大のバッチサイズを使用してください。--batch-size -1 を使用して、お使いの環境に最適なバッチサイズを自動的に決定することも可能です。

YOLOv5の学習を高速化するにはどうすればよいですか?

学習を高速化するには、--amp による混合精度学習の有効化、--device 0,1,2,3 を使用した複数GPUの活用、--cache によるデータセットのキャッシュ、およびバッチサイズの最適化を試してください。また、絶対的な精度が重要でない場合は、YOLOv5sのような小規模なモデルバリアントの使用も検討してください。

コメント