YOLOv5-v6.0 の学習ノート


参考リンク:
1. Yolov5の中核となる基礎知識をYoloシリーズで徹底解説
2. yolov5の構造的知識ポイントの分析
3. yolov5ターゲット検出ニューラルネットワーク - 損失関数の計算原理

1. ネットワーク構造

1.1 バックボーン

YOLOv5-6.0 バージョンのバックボーンは主にConv モジュールCSPDarkNet53およびSPPF モジュールに分かれています。
ここに画像の説明を挿入

1.1.1 変換モジュール

ここに画像の説明を挿入
YOLOv5 は、畳み込み (Conv2d)バッチ正規化、およびアクティベーション関数を含むConv モジュールの3 つの関数をカプセル化し、パディングの効果を実現するために autopad(k, p) を使用します。YOLOv5-6.0 バージョンでは、アクティブ化関数としてSwish (またはSiLU ) が使用され、古いバージョンのLeaky ReLUが置き換えられます。

1.1.2 フォーカスモジュール

Focus モジュールはYOLOv5 の旧バージョンのモジュールであり、その構造は次の図に示されています。
ここに画像の説明を挿入

中心となる部分は、画像をスライスし、チャネル次元でステッチすることです。下図に示すように、3 チャンネルの入力画像に対して、それぞれww、そしてふーhの 2 次元では、1 ピクセルおきに値が取得され、12 個の特徴マップが構築されます。これら 12 個の特徴マップは、幅と高さが元の1 2 \frac{1}{2}21ですが、チャネルの次元は 4 倍に拡張されます。同時に、これら 12 の特徴マップには入力画像のすべての情報が含まれているため、Focus モジュールは情報損失を削減しながら 2 倍のダウンサンプリングを達成するだけでなく、パラメータ (params) と計算 (FLOP) の量を削減し、 CUDA メモリの消費量が減少し、前方パスと後方パスの速度が向上します。
ここに画像の説明を挿入
最後に、結合された特徴マップに対して畳み込み演算が実行され、チャネル数が 64 に増加します。
ただし、YOLOv5-6.0 バージョンでは、サイズは6 6です。6 ×6 66.ステップ サイズ 2、パディング 2 のコンボリューション カーネルが Focus モジュールを置き換えます。これは、モデルのエクスポートに便利で、より効率的です。

1.1.3 CSPDarkNet53

1.1.3.1 CSPネット

論文リンク: https://arxiv.org/abs/1911.11929
CSPNetの主な目的は、モデルの検出と認識の精度を低下させることなく、計算量を削減し、推論速度を向上させることです。その主なアイデアは、勾配流をセグメント化することによって、勾配流が異なるネットワーク パスを介して伝播するようにすることです。スティッチングやトランジションなどの操作を通じて、より豊富なグラデーションの組み合わせ情報が実現されます。
ここに画像の説明を挿入

高密度ネット

ここに画像の説明を挿入

クロスステージ パーシャル DenseNet

DenseNetを例に挙げると、特徴マップをDense_Blockに入力する前に、特徴マップはチャネル次元から2つの部分に分割され、1つの部分は計算のためにDense_Blockに入り、もう1つの部分はDense_Blockを介して出力された特徴マップと接合されます。最後に、結合された特徴マップは、畳み込み演算のために遷移層に入力されます。

1.1.3.2 ボトルネックモジュール

ここに画像の説明を挿入
Bottleneck モジュールはResNetの残余構造を利用しており、最初に1 1が最後まで実行されます。1 ×111 つの畳み込みにより特徴マップのチャネル数が半分になり、計算量が削減され、その後3 33 ×333畳み込みは特徴を抽出してチャネル数を 2 倍にしますが、その入出力のチャネル数は変わりません。もう 1 つのパスは、ショートカットを介して残余接続を実行し、最初のパスの出力特徴マップに追加されて、特徴融合を実現します。
YOLOv5 のバックボーンボトルネックによりTrueヘッドのボトルネックではショートカットが使用されません。

1.1.3.3 C3モジュール

YOLOv4 と YOLOv5 はどちらもCSPNetのアイデアを借用し、 DarkNet53バックボーン ネットワークに適用しましたC3 モジュールはYOLOv5-6.0 バージョンで使用され、以前のBottleneckCSP モジュールを置き換えます。
ここに画像の説明を挿入

C3モジュール

ここに画像の説明を挿入

ボトルネック CSP モジュール

両者の構造と機能は基本的に同じであり、どちらもCSP アーキテクチャですが、補正ユニットの選択が異なり、C3 モジュールには3 つの標準畳み込み層と複数のボトルネック モジュールが含まれています。C3 モジュールとBottleneckCSP モジュールの違いは、 Bottleneck モジュールによって出力されたConv モジュールが削除されていることです
ただし、YOLOv4 と YOLOv5 のバックボーンはCSPNetから借用しましたが、実際にはCSPNetの元の論文のように入力特徴マップをチャネル次元で 2 つの部分に分割せず、双方向1 1を直接使用しました。1 ×111入力特徴マップを畳み込み変換します。
ここに画像の説明を挿入

1.1.4 SPPFモジュール

参考リンク: https://github.com/ultralytics/yolov5/pull/4420
YOLOv5-6.0 はSPP モジュールの代わりにSPPF モジュールを使用します( SPPSpatial Pyramid Pooling、つまり空間ピラミッド プーリングの略です)。 SPPNetで考えました。SPPF モジュールは、複数の小型プーリング カーネル カスケードを使用して、SPP モジュール内の単一の大型プーリング カーネルを置き換えます。これにより、元の機能を維持しながら、異なる受容野の特徴マップを融合し、特徴の表現能力を強化します。マップ、走行速度がさらに

ここに画像の説明を挿入

SPPFモジュール

ここに画像の説明を挿入

SPPモジュール

1.2 ネック

YOLOv5 のネックはYOLOV4 に似ており、どちらもFPNPANetのアイデアを利用しています。
ここに画像の説明を挿入

1.2.1 FPN

論文リンク: https://arxiv.org/abs/1612.03144
FPN、つまり、Feature Pyramid Network (特徴ピラミッド)。ほとんどのターゲット検出アルゴリズムは、予測を行うためにトップレベルの特徴のみを使用することが判明しましたが、浅い特徴は意味論的な情報が少なく、位置情報は強力であり、深い特徴はより豊富な意味情報を運び、位置情報は弱いことがわかっています。FPNのアイデアは、深い意味情報を浅い層に転送し、それによって複数のスケールで意味表現を強化することです。
ここに画像の説明を挿入
FPNの一般的な構造は上図に示されており、左側がボトムアップ (Bottom-up) の伝播経路、右側がトップダウン (Top-down) の伝播経路、中央が横のつながり、機能の融合。
ボトムアップ プロセスは、前のバックボーン ネットワーク (Backbone) に対応する、ネットワークの順方向伝播プロセスです。フォワードプロセスでは、いくつかの層を通過すると特徴マップのサイズが変化しますが、他の層を通過すると特徴マップのサイズは変化しません。著者は、特徴マップのサイズが変化しない層をステージに分類します。抽出されるたびに、特徴は各段階の最後の層の出力となるため、特徴ピラミッドを形成できます。
トップダウン (Top-down) プロセスは小さなサイズの特徴マップから開始し、段階ごとに 2 倍のアップサンプリングを実行しますが、ボトムアップ (Bottom-up) プロセスによって水平方向の接続が最初に生成されます。同じサイズ1 1以降1 ×111 つのコンボリューション カーネルを使用してチャネル数を削減し (下図に示すように)、2 倍のアップサンプリングで得られた特徴マップを追加して融合します (YOLOv5 では、スティッチングとフュージョンが使用されます)融合後、各融合結果は3 33 ×333コンボリューションの目的は、アップサンプリングのエイリアシング効果 (エイリアシング効果) を除去することです。
ここに画像の説明を挿入

1.2.2 PAネット

論文リンク: https://arxiv.org/abs/1803.01534
FPN はトップダウン (トップダウン) 構造を通じて深い意味情報を浅い層に転送しますが、浅い位置情報は深い特徴に影響を与えることはできません。同時に、FPNの最上位の情報フローは基幹ネットワーク (Backbone) を介して層ごとに下位に受け渡される必要がありますが、層の数が比較的多いため、計算量は比較的多くなりますが、PANet は上記の問題を効果的に解決します。問題。
ここに画像の説明を挿入
上図 (b) に示すように、PANet はFPNに基づいてボトムアップ (Bottom-up) パスを導入しますトップダウン (Top-down) 特徴融合の後、ボトムアップ (Bottom-up) 特徴融合を行うことで、基礎となる位置情報も深層に送信できるため、複数のスケールでの測位能力が向上します。同時に、FPN (赤い線で示す) と比較して、PANet のボトムレベルの機能転送のために走査する必要がある機能マップの数が大幅に減少します (緑の線で示す)。下位レベルの位置情報を上位に転送することが容易になります
ここに画像の説明を挿入
ボトムアップ プロセスは、N 2 → N 3 → N 4 → N 5 N_2\rightarrow N_3\rightarrow N_4\rightarrow N_5 に沿って行われます。N2N3N4N53 3を段階的に進む3 ×332 回のダウンサンプリングに3 つのコンボリューションが使用され、 FPNの対応するサイズの特徴マップが追加されて融合されますスプライシングと融合が)。

1.3 ヘッド

ここに画像の説明を挿入
YOLOv5 のHead は、Neckで取得した異なるスケールの特徴マップをそれぞれ1 1に渡します。1 ×111コンボリューションによりチャネル数が拡張され、拡張された機能チャネル数は (カテゴリ数 + 5)× ××各検出層のアンカー(うち5 5)5はそれぞれ、横座標、縦座標、幅、高さ、予測フレームの中心点の信頼度に対応します。ここで、信頼度は予測フレームの信頼性を表し、値の範囲は ( 0 , 1 ) (0, 1) です( 0 ,1 )、値が大きいほど、予測フレーム内にターゲットが存在する可能性が高くなります。
Head にはNeckで取得された 3 つの異なるサイズの特徴マップに対応する 3 つの検出レイヤーが含まれていますYOLOv5 は、これら 3 つの特徴マップ上のグリッドを特徴マップのサイズに応じて分割し、各特徴マップ上のグリッドごとに異なるアスペクト比の 3 つのアンカーをプリセットしてターゲットを予測して返すため、上記のチャネルの次元が理解できますアンカーすべての位置情報と分類情報を
ここに画像の説明を挿入

2. ターゲットボックス回帰

ここに画像の説明を挿入
YOLOv5 のターゲットボックス回帰計算式は次のとおりです。
bx = 2 σ ( tx ) − 0.5 + cx b_x=2\sigma(t_x)-0.5+c_xb×=2p ( t _×)0 5+c×by = 2 σ ( ty ) − 0.5 + cy b_y=2\sigma(t_y)-0.5+c_ybはい=2p ( t _はい)0 5+cはいbw = pw × ( 2 σ ( t_w ) ) 2 b_w=p_w×(2\sigma(t_w))^2b=p×( 2( t) )2 bh = ph × ( 2 σ ( th ) ) 2 b_h=p_h×(2\sigma(t_h))^2b=p×( 2( t) )2其中 ( b x , b y , b w , b h ) (b_x,b_y,b_w,b_h) ( b×bはいbb)は、予測フレームの中心点の座標、幅、高さを表します( cx , cy ) (c_x,c_y)( c×cはい) は、予測ボックスの中心点が位置するグリッドの左上隅の座標を表します( tx , ty ) (t_x,t_y)( t×tはい)は、グリッドの左上隅の座標に対する予測フレームの中心点のオフセットを表します( tw , th ) (t_w,t_h)( tt)は、アンカーの幅と高さに対する予測フレームの幅と高さのスケーリング比を示します( pw , ph ) (p_w,p_h)( pp)は、前のフレームアンカーの幅と高さを表します
予測ボックスの中心点を現在のグリッドに制限するには、シグモイド関数オフセットを処理し、予測オフセット値が( 0 , 1 ) (0,1)( 0 ,1 )範囲内であること。このように、ターゲットフレームの回帰計算式によれば、予測フレームの中心点の座標のオフセットは( − 0.5 , 1.5 ) (-0.5, 1.5)( 0 . 5 1.5 ) 、上図の青色の領域に示されています

3. ポジティブサンプルとネガティブサンプルのマッチング

前述したように、YOLOv5 の各検出レイヤーの各グリッドには複数のアンカー事前ボックスがプリセットされていますが、すべてのグリッドにターゲットがあるわけではなく、すべてのアンカーが使用に適しているわけではありません。現在のターゲットに戻るには、これらのアンカー事前ボックスをスクリーニングする必要があります。そして、ポジティブサンプルとネガティブサンプルに分けられます。このペーパーのポジティブ サンプルとネガティブ サンプルは、Ground Truth (手動でマークされた実際のフレーム)ではなく、予測されたフレームを参照しています。YOLOv3/4 とは異なり、YOLOv5 は幅と高さの比率に基づいたマッチング戦略を使用します。その一般的なプロセスは次のとおりです。

  1. Ground Truth (手動でラベル付けされた実際のフレーム) について、対幅の比率 (w1/w2、w2/w1) と高さ対高さの比率 (h1/h2、h2/h1 ) を計算します。
  2. アンカーに対するグラウンドトゥルースの幅の比率(w1/w2、w2/w1)と高さの比率(h1/h2、h2 / h1)の最大値をグラウンドトゥルースのアンカーに対する比率として求めます
  3. Ground Truthアンカーの間の比率が、設定された比率しきい値 (ハイパーパラメーターのデフォルトではアンカー_t = 4.0 )より小さい場合、アンカーはGround Truthを予測する責任を負います。つまり、アンカーによって返される予測ボックスは次のようになります。残りの予測ボックスはすべてネガティブ サンプルです。

上記の方法を通じて、YOLOv5 は陽性サンプルと陰性サンプルをスクリーニングするだけでなく、一部のGround Truth が予測を行うために単一スケールで複数のアンカーを照合します。これにより、一般に陽性サンプルの数が増加します。さらに、YOLOv5 では、以下の方法で陽性サンプルの数を増やし、収束速度を高速化します。

  1. クロスグリッド拡張: Ground Truthの中心点が特定の検出レイヤー上の特定のグリッドに収まると仮定します。ただし、中心点が位置するグリッドを除き、その中心点の左、上、右、下に隣接するグリッドは、グリッドでは、Ground Truthの中心点に近い 2 つのグリッドのアンカーも予測と回帰に参加します。つまり、下の図に示すように、ターゲットは3 つのグリッドのアンカーによって予測されます。ここに画像の説明を挿入
  2. クロスブランチ拡張: YOLOv5 の検出ヘッドには、スケールの異なる 3 つの検出レイヤーが含まれており、アスペクト比の異なる 3 つのアンカーが各検出レイヤーにプリセットされており、 Ground Truthは異なるスケールの検出レイヤーのアンカーと一致できると想定されています。. .の場合、3 つの検出レイヤー上のすべての適格なアンカーを使用してGround Truthを予測できます。つまり、1 つのターゲットを複数の検出レイヤーの複数のアンカー予測できます。

4. 損失計算

4.1 全損失

YOLOv5 は、特徴マップ上の各グリッドを予測し、得られた予測情報を実際の情報と比較して、モデルの収束方向の次のステップをガイドします。損失関数の機能は、予測情報と実際の情報とのギャップを測定することであり、予測情報が実際の情報に近ければ、損失関数の値は小さくなります。YOLOv5 の損失には主に、長方形フレーム損失 (bbox_loss)分類損失 (cls_loss)、および信頼性損失 (obj_loss)の 3 つの側面が含まれます。総損失の式は、L oss = box_gain × bbox_loss + cls_gain × cls_loss + obj_gain × obj_loss Loss=box\_gain×bbox\_loss+cls\_gain×cls\_loss+オブジェクト\_ゲイン×オブジェクト\_ロス損失_ _ _=ボク_ガイン_ _ _ _ _×bボックス_ロスロス_ _ _ _ _+CLS_GAIN _ _ _ _ _ _ _×クラス_ロス_ _ _ _ _+o b j _ g a i n×o b j _ l o s sその中ボックス _ ゲインボックス\_ゲインb o x _ g a i ncls _ ゲイン cls\_gaincl s _ g a i n obj _ゲインobj\_gaino b j _ g a i n はさまざまな損失重みに対応し、デフォルト値はそれぞれ 0.05、0.5、1.0 です。

4.2 境界ボックスの損失

論文リンク: https://arxiv.org/abs/1911.08287
IoU、つまり交差と和の比率。その機能は、ターゲット検出における予測フレームと実際のフレーム間の重複の程度を測定することです。予測フレームがA、実際のフレームがBであると仮定すると、IoUの式は次のようになります。 I o U = A ⋂ BA ⋃ B IoU=\frac{A \bigcap B}{A \bigcup B}アイ・オー・ユー=BB
ここに画像の説明を挿入
ただし、予測フレームが実際のフレームと交差しない場合、IoU は2 つの間の距離を反映できず、この時点でIoU損失は 0 となり、勾配リターンに影響を及ぼし、トレーニングに失敗します。また、IoU は予測フレームと実際のフレームの一致度を正確に反映できません。したがって、 IoUを改善するために、 GioUDIoUCIoUなどの一連のIoUのバリアントが継続的に提案されています
YOLOv5 は、デフォルトでCIoUを使用してバウンディング ボックスの損失を計算します。CIoUDIoUに基づいており、さらにバウンディング ボックスのアスペクト比を考慮しています。このうち、DIoU は、予測フレームと実際のフレーム間の距離オーバーラップ率スケールなどの要素を考慮し、ターゲット フレームの回帰をより安定させます。損失の計算式はLDI o U = 1 − I o U + ρ 2 ( b , bgt ) c 2 L_{DIoU}=1-IoU+\frac{\rho^2(b,b^{gt})} { c^2}LDIOU _ _ _=1アイ・オー・ユー+c2r2 (bbgt ) _ここでbbbbgt b^{gt}bg t はそれぞれ、予測フレームと実際のフレームの中心点を表します、ρ \rhoρ は2 つの中心点間のユークリッド距離、ccc は、下図に示すように、予測フレームと実際のフレームの最小閉包領域の間の対角距離を表します。
ここに画像の説明を挿入
CIoUはDIoU基づいてインパクトファクターα v \alpha vα v、この係数は予測フレームのアスペクト比と実際のフレームのアスペクト比を考慮します。つまり、CIoUのペナルティ項目はRCI o U = ρ 2 ( b , bgt ) c 2 + α v R_です。 {CIoU}=\ frac{\rho^2(b,b^{gt})}{c^2}+\alpha vRCIOU _ _ _=c2r2 (bbgt ) _+α v
ここで、α \alphaαは重みパラメータであり、その式はα = v ( 1 − I o U ) + v \alpha=\frac{v}{(1-IoU)+v} です。ある=( 1アイ・オー・ユー+vvvvvはアスペクト比の一貫性を測定するために使用され、その式はv = 4 π 2 ( arctan ⁡ wgthgt − arctan ⁡ wh ) 2 v=\frac{4}{\pi^2}(\arctan\frac {w^ {gt}}{h^{gt}}-\arctan\frac{w}{h})^2v=円周率24(アークタンhgt _wgt _アークタンh)2したがって、 CIoU損失の計算式はLCI o U = 1 − I o U + ρ 2 ( b , bgt ) c 2 + α v L_{CIoU}=1-IoU+\frac{\rho^2(b,b ^LCIOU _ _ _=1アイ・オー・ユー+c2r2 (bbgt ) _+αv _

4.3 分類損失

YOLOv5 は、デフォルトでバイナリクロスエントロピー関数を使用して分類損失を計算します。2 値クロスエントロピー関数は次のように定義されます。L = − y log ⁡ p − ( 1 − y ) log ⁡ ( 1 − p ) = { − log ⁡ p , y = 1 − log ⁡ ( 1 − p ) , y = 0 L=-y\log p -(1-y)\log (1-p)=\left\{ \begin{array}{ccl} -\log p &, & {y=1}\\ -\ log (1-p) &, & {y=0}\\ \end{array} \right。L=yログ_p( 1y )ログ( 1 _p )={ ログ_pログ( 1 _p )y=1y=0どこyは入力サンプルに対応するラベル (正のサンプルは 1、負のサンプルは 0)、pppは、モデルが入力サンプルが陽性サンプルであると予測する確率です。pt = { p , y = 1 1 − p , y = 0 p_t=\left\{ \begin{array}{ccl} p &, & {y=1}\\ 1-p &, & {y= と仮定します
0}\\ \end{配列} \右。p={ p1py=1y=0クロスエントロピー関数の定義は、L = − log ⁡ pt L=-\log p_tのように簡略化できます。L=ログ_p

4.4 自信の喪失

各予測フレームの信頼度は、予測フレームの信頼性を示し、値が大きいほど信頼性が高く、実際のフレームに近いことを示します。下図に示すように、赤い点AAABBBCCCDDD は実際のフレームの中心点を表し、各赤い点が配置されているグリッドに対応するアンカーによって予測および回帰された予測フレームの信頼度は比較的、0 に近い場合でも比較的小さくなります。
ここに画像の説明を挿入
信頼度ラベルについて、以前のバージョンの YOLO では、ターゲットのあるすべてのグリッド (陽性サンプル) に対応するラベル値が 1、残りのグリッド (陰性サンプル) に対応するラベル値が 0 であると考えられていましたが、次のような問題が発生しました。これは、一部の したがって、YOLOv5 のアプローチは、グリッドと実フレームに対応する予測フレームのCIoU を予測フレームの信頼ラベルとして使用することです。そのコード実装は次のとおりです。

tobj[b, a, gj, gi] = (1.0 - self.gr) + self.gr * score_iou

このうち、self.gr はラベル平滑化係数であり、パラメータself.gr が1 のとき、信頼度ラベルはCIoUと等しくなります。
分類損失の計算と同様に、YOLOv5 はデフォルトでバイナリクロスエントロピー関数を使用して信頼損失を計算します。さらに、YOLOv5 は、異なるスケールの検出レイヤーで得られた信頼損失に対して異なる重み係数を割り当て、検出レイヤーのスケールが大きい順に、対応するデフォルトの重み係数はそれぞれ 4.0、1.0、0.4 になります。つまり、小さなオブジェクトの検出に使用される大規模特徴マップ上の損失重み係数が大きくなるため、トレーニング中にネットワークは小さなオブジェクトにさらに焦点を当てます。

5. データの拡張

5.1 モザイク

YOLOv5 は、YOLOv4 のモザイクデータ拡張メソッドを利用しています。これは、 CutMixデータ拡張メソッドの進化版です。主なアイデアは、ランダムにトリミングするために 4 つの画像をランダムに抽出し、それらをトレーニング データとして 1 つの画像に結合することです。コールアウト ボックスまた、それに応じて切り取られます。
ここに画像の説明を挿入
この利点は、batch_size が偽装的に増加し、画像の背景が豊かになることですが、同時に、認識されたオブジェクトをトリミングすることで、モデルは局所的な特徴に従ってオブジェクトを認識できるため、オブジェクトの検出に役立ちます。遮蔽されたオブジェクトを検出し、モデルの検出能力を向上させます。モザイクデータ拡張の操作プロセスは次のとおりです。

  1. 抽出された各画像のサイズが( 640 , 640 ) (640, 640)であるとします。( 6 4 0 6 4 0 )、再ステッチ後の画像サイズは( 1280 , 1280 ) (1280, 1280)( 1 2 8 0 ,1 2 8 0 )下図の灰色の領域xc, yc)に中心点(xc, yc)( x c ,y c )、したがって、平面を異なるサイズの 4 つの領域に分割します。
labels4, segments4 = [], []
s = self.img_size
yc, xc = (int(random.uniform(-x, 2 * s + x)) for x in self.mosaic_border)

ここに画像の説明を挿入

  1. 最初の画像をロードした後、さらに 3 つの画像がデータセットからランダムに選択され、4 つの画像の順序がシャッフルされます。
indices = [index] + random.choices(self.indices, k=3)
random.shuffle(indices)
  1. 最初の画像を左上の領域に配置すると、その右下の座標はランダムに生成された中心点に揃えられます。2 番目の画像は右上の領域に配置され、その左下の座標はランダムに生成された中心点に揃えられます。点; 3 つの画像は、右上の座標がランダムに生成された中心点に合わせて左下領域に配置されます。4 番目の画像は、左上の座標がランダムに生成された中心点に合わせて右下領域に配置されます。
if i == 0:  # top left
	img4 = np.full((s * 2, s * 2, img.shape[2]), 114, dtype=np.uint8)
	x1a, y1a, x2a, y2a = max(xc - w, 0), max(yc - h, 0), xc, yc
	x1b, y1b, x2b, y2b = w - (x2a - x1a), h - (y2a - y1a), w, h
elif i == 1:  # top right
	x1a, y1a, x2a, y2a = xc, max(yc - h, 0), min(xc + w, s * 2), yc
	x1b, y1b, x2b, y2b = 0, h - (y2a - y1a), min(w, x2a - x1a), h
elif i == 2:  # bottom left
	x1a, y1a, x2a, y2a = max(xc - w, 0), yc, xc, min(s * 2, yc + h)
	x1b, y1b, x2b, y2b = w - (x2a - x1a), 0, w, min(y2a - y1a, h)
elif i == 3:  # bottom right
	x1a, y1a, x2a, y2a = xc, yc, min(xc + w, s * 2), min(s * 2, yc + h)
	x1b, y1b, x2b, y2b = 0, 0, min(w, x2a - x1a), min(y2a - y1a, h)

img4[y1a:y2a, x1a:x2a] = img[y1b:y2b, x1b:x2b]  # img4[ymin:ymax, xmin:xmax]
padw = x1a - x1b
padh = y1a - y1b
  1. 抽出された画像のサイズが塗りつぶし領域の指定されたサイズを超えると仮定すると、次の図に示すように、塗りつぶし領域を超える抽出画像の部分をトリミングする必要があります。
    ここに画像の説明を挿入
    抽出された画像のサイズが指定された塗りつぶし領域のサイズより小さいと仮定すると、次の図に示すように、欠落した領域を塗りつぶす必要があります。
    ここに画像の説明を挿入
  2. 正規化されたラベル フレームの座標は元の画像のサイズに復元され、次にスプライスされた座標系に変換されて、ラベル フレームの新しい座標が取得されます。
labels, segments = self.labels[index].copy(), self.segments[index].copy()
if labels.size:
	labels[:, 1:] = xywhn2xyxy(labels[:, 1:], w, h, padw, padh)
	segments = [xyn2xy(x, w, h, padw, padh) for x in segments]
labels4.append(labels)
segments4.extend(segments)
  1. 再スティッチ後の画像サイズは( 1280 , 1280 ) (1280, 1280)なので( 1 2 8 0 ,1 2 8 0 )なので、 ( 640 , 640 ) (640, 640)にスケールする必要もあります。( 6 4 0 6 4 0 ) であり、トレーニングに使用される入力画像のサイズと一致することが保証されています。

5.2 ミックスアップ

MixUpはシンプルなデータ拡張手法であり、その主なアイデアは、2 つのランダム サンプルの特徴とラベルを重み付けして合計し、新しいトレーニング サンプルを取得することです。式は次のとおりです。x = λ x 1 + ( 1 − λ ) x 2 x = \lambda x_1+(1-\lambda)x_2バツ=λ ×1+( 1l ) x2y = λ y 1 + ( 1 − λ ) y 2 y = \lambda y_1+(1-\lambda)y_2y=λy _1+( 1l ) y2ここで、x 1 x_1バツ1そしてx 2 x_2バツ22 つの異なる入力サンプルを表します、y 1 y_1y1y 2 y_2y22 つの異なる入力サンプルλ \lambdaに対応するラベルを表します。λ は2 つのサンプルの融合の比例係数を表し、ベータ分布を満たします。
ここに画像の説明を挿入

ただし、YOLOv5 では、画像の特徴のみが融合され、ラベルが結合されます。具体的なコード実装は次のとおりです。

r = np.random.beta(32.0, 32.0)
im = (im * r + im2 * (1 - r)).astype(np.uint8)
labels = np.concatenate((labels, labels2), 0)

おすすめ

転載: blog.csdn.net/baoli8425/article/details/122154078
おすすめ