YOLOv5 (v7.0) ネットワーク変更の実践 3: 単一ブランチのアンカーベースを変更し、yolov8 のアンカーなしのダブルブランチ デカップリング ヘッド (yolox の DecoupleHead) に移行します。

[この記事と関連ブログはあくまで個人的な学習記録ですので、興味のある方はぜひ交流して一緒に成長してください】

タイトルの作業をうまく練習したトレーニング インターフェイスを添付します (正直に言うと、前の 2 つの練習よりもはるかに複雑でした)。

ここに画像の説明を挿入します

1. 説明:

前回のブログの作業の続き: YOLOv5 (v7.0) ネットワーク変更の実践 2: 単一ブランチ ヘッドを YOLOX のデュアル ブランチ デカップリング ヘッド (DecoupleHead) に変更する 前回のブログでは、

yolov5 の単一ブランチの変更の練習に成功しました。ヘッド構造を、単なる構造であるyoloxの分離二分岐検出ヘッド構造に変更しました。当初の目的は、個人的なアルゴリズムの再現と統合の能力をトレーニングすることであったため、一般的に使用されている yolov5 フレームワークに再現するために、yolov5 よりも成功していると言われている yolox ネットワークを選択しました。まずバックボーンを変更し、次に二分岐ヘッドを変更し、今回はアンカーフリーをyolov5に置き換えました。

再現の難しさに基づいて、デュアルブランチデカップリングヘッドを実装した後、アンカーフレームモジュールの交換方法に十分に慣れていないため、アンカーフリーの統合はまだ少し複雑であることがわかりました。また、アンカーフレームモジュールには独自のターゲットがあるためです。情報のエンコードとデコード、メソッドと損失関数の計算が v5 フレームワークに直接統合されているため、通常のトレーニングが行われるため、再現方法を再考する必要があります。現在提案されている yolov8 もアンカーフリー アルゴリズムを使用しており、yolov5 の作業に一定の連続性があることを考慮すると、基本的な作業をあまり行わずに参照として変更することができます。そこで目標は、デュアルブランチ デカップリング検出ヘッドの実現に基づいて、yolov8 のアンカーフリー アルゴリズムを yolov5 に統合することに変わりました。

既製の yolov8 が用意されており、フレームワークは非常に高度なので、yolov8 を直接使用した方がよいのではないかと疑問に思われるかもしれません。これは確かに一つの側面です。しかし、私が主に試したいのはこの作業であり、yolov8 フレームワークは高度に統合されており、呼び出すことができる既製の Ultralytics ライブラリがあり、非常に便利です。ただし、このライブラリの存在により、一部のアルゴリズムのデバッグ作業がより複雑になり、v8 は v5 ほど快適に使用できません。また、v5 では以前にいくつかの作業が行われています。前作を読んで理解が深まり、今でも使っていますv5で実施。

2. いくつかの問題が発生しました

この記事の作業は非常に時間がかかる部分もありますが、遭遇した困難や回避できる問題を簡単にまとめてみましょう。
1. アンカーベースをアンカーフリーに置き換えます。これが検出ヘッドです。アンカー フレーム操作を削除し、アンカーフリーのエンコードおよびデコード方法を使用するには、データ フローが正常であることを確認する必要があります。2. トレーニング中フェーズで、yolov8 のデータロードが進行中であることがわかりました
。アップグレードすると、yolov5 は学習に不便なので、v8 のデータセットのロード方法を使用しました。実際、それは似ています。この作業は
3. のパラメータを回避できますトレーニング プロセス。v8 ではより多くのパラメーターが使用され、さまざまな損失関数が使用されます。検証フェーズでの通常のトレーニング 4. モデルの精度評価を追加する必要があります。
これは少し複雑です。v5 のデータ ロード関数を使用し、中間変数は次のとおりです。ただし、予測出力と nms の後処理に注意を払う必要があり、一部を置き換える必要があります。

3. トレーニングプロセスの具体的な作業

1. 構造:
yolo.py で定義された DetectYOLO8Head:
ここに画像の説明を挿入します
DetectionModel クラスで検出ヘッド DetectYHOLO8Head を構築するには、複数のスケールでのアンカー ボックスの生成も削除する必要があります
ここに画像の説明を挿入します
DFL クラス定義を common.py に追加します:
ここに画像の説明を挿入します
2. トレーニング プロセス:
パラメータ補足、追加しました パラメータフラグを追加し、アンカーフリー検出ヘッドに必要なパラメータデータを新たに追加しました その後の
ここに画像の説明を挿入します
学習中にデータの読み込み方法が違うことが判明したため、v8関数を使用して読み込みました通常のトレーニングが実行できませんでした。実際には、このようにする必要はありません。v8 の形式を実現するために自分で再パッケージすることもできます。これは私にとって複雑なので、v8 の形式は使用しません検証フェーズ中
ここに画像の説明を挿入します
データトレーニング:
ここに画像の説明を挿入します
損失関数とその他のパラメータ:
ここに画像の説明を挿入します

4. 検証フェーズの具体的な作業:

エポックをトレーニングした後、モデルの精度が検証されます。このとき、val.py の run 関数が呼び出され、精度インジケーターを検証して出力します。val.py のコードでは、主にデータの読み込み
ここに画像の説明を挿入します
方法
、いくつかのデータ変換、後処理 nms など
ここに画像の説明を挿入します
が見られます。ここでは v5 データセットのロード方法を使用しているため、データ処理接続を容易にするために途中で変換を行いました。もう 1 つは後処理 nms です。これは次のとおりです。 predの次元がアンカーベースとアンカーフリーの位置にあるため、デコード方法が全く異なるため置き換えが必要です。
通常のトレーニンググラフ:
ここに画像の説明を挿入します

基本的にはこれが主な作業です。慣れていない方は少し時間がかかります。具体的な内容は省略します。基本的な機能の呼び出しや追加に慣れていない方は、多くの作業。時間が限られており、少し急いでいたため、コードを直接投稿しませんでした。

5. まとめ

とても有意義な作業で、実装してみると理解が深まり、コードに詳しくなったことが分かりました!相互励まし合います!

おすすめ

転載: blog.csdn.net/qq_44442727/article/details/131925684