YOLOv2 瞑想

YOLOv2 瞑想

3 つの質問について考えていますか?

まず、モデルの最後の層の出力値はいくらでしょうか?
次に、モデルの出力結果をどのように変換・計算して予測フレーム(マニュアル標準のフレーム)を得るのか。
第三に、データ処理の対象をどのように計算するか。つまり、真の値を計算して損失を計算するにはどうすればよいでしょうか?

この3つの疑問はずっと気になっていて、何度も読み返したのですが、その時読んだときは理解できたのですが、時間が経つと忘れてしまったので、記録しておくことにしました。

最初の質問

まず、モデルの最後の層の出力値はいくらでしょうか?

まず、論文に記載されている予測ボックス、この写真を見てください。
予測ボックス

予測ボックス、モデルによって予測された結果は何ですか? はネットワーク、最後の層の出力値、

ネットワークの最後の層の出力値:
最初のステップの結果: tx 、 ty 、 tw 、 th 最初のステップの結果: t_x,t_y,t_w,t_h\\最初のステップの結果: t×tはいtt

yolov1 から、
tx 、 ty 、 tw 、 th t_x,t_y,t_w,t_h\\ を知ることができます。t×tはいtt最終予測フレームとして直接使用することもできますが、著者は yolov2 にアンカー計算のメカニズムを導入し、正規化とアンカー変換を使用して最終予測フレームを取得しました。

正規化処理:
第二段階結果:σ ( tx ) 、σ ( ty ) 、℮ tw 、℮ 第二段階結果: \sigma\left(t_x\right),\sigma\left(t_y\right), ℮^{t_w },℮^{t_h}\\2 番目のステップの結果: σ( t×p( tはいtt
σ はシグモイド関数、 、℮ は対数関数、論文は直接与えません \\ sigma はシグモイド関数、 、℮ は対数関数、論文は直接与えません\\σs i g mod関数_ _℮はlog関数であり、論文では直接与えられません

なぜ正規化処理が必要なのか、やらなくても大丈夫です、答えは「はい」です、入れて実験してください、モデルの収束や精度に大きな差が出る可能性があります。

変換処理:
3 段階目の結果: bx = σ ( tx ) + cxby = σ ( ty ) + cybw = pw ℮ twbh = ph ℮ th 3 段階目の結果: \\ b_x= \sigma\left(t_x) \right)+ c_x\\ b_y= \sigma\left(t_y\right)+c_y\\ b_w= p_w℮^{t_w}\\ b_h= p_h℮^{t_h}\\3 番目のステップの結果:b×=p( t×+c×bはい=p( tはい+cはいb=ptb=pt

bx 、 by 、 bw 、 bh は、手作業でラベルを付けたボックスと同様に、最終的に取得したボックスです。 b_x、b_y、b_w、b_h は、手作業でラベルを付けたボックスと同様、最終的に取得したボックスです。\\b×bはいbbは、手作業で注釈が付けられたボックスと同様に、最終的に完成するボックスです

pw 、 ph はアンカーの幅と高さ、 cx 、 cy はグリッドの左上隅の座標です (これら 4 つのパラメーター値は以下でさらに分析されますが、これらは既知で固定されています) p_w、p_h はアンカーの幅と高さ、 c_x 、 c_y はグリッドの左上隅の座標です \\ (以下では、既知で固定されているこれら 4 つのパラメーター値をさらに分析します)ppc hまたはcの幅と高さです×cはいはグリッドの左上隅の座標です(以下では、これら 4 つのパラメーター値のさらなる分析が既知であり、修正されています)

最初の質問、要約:
モデルから計算された計算は、第 1、第 2、および第 3 のステップを経て、最終的に必要な予測フレーム (手動の標準フレームなど) を取得します。

3番目の質問

データ処理、GT値の計算方法は?

まず、損失関数に入力される予測値とは何かを見てみましょう。
先ほど、予測出力として使用できる予測値には3段階の値があるとお話しましたが、どれを損失に送ればよいのでしょうか?

回答案:
σ ( tx ) 、 σ ( ty ) 、 ℮ tw 、 ℮ th \sigma\left(t_x\right),\sigma\left(t_y\right),℮^{t_w},℮^{t_h}\\p( t×p( tはいtt
この値が予測値として損失に入力されます。

次に、対応する GT 値を取得するにはどうすればよいでしょうか?

GT ボックスは、x、y と w、h の 2 つの部分に分かれています。
なぜこのように分割したいのですか?x、y、w、hの値の取得方法が異なるため、この場所は非常に複雑で忘れがちです。


まず、416x416 の画像上のx、y を見ると、13x13x5 のアンカーが生成されます。つまり、各グリッドに、最初に 5 つのアンカー (アンカー ボックス) を描画します。下の写真は、yolov1 の論文からの 7x7 グリッド道路です。
ここに画像の説明を挿入

損失を入力したいターゲットが次のようなものだとします:
targetx 、 targety 、 targetw 、 targetth target_x,target_y,target_w,target_h\\ターゲット_ _ _ _ _×ターゲット_ _ _ _ _はいターゲット_ _ _ _ _ターゲット_ _ _ _ _
targetx、targety target_x、target_yの計算を開始します\\
ターゲット_ _ _ _ _×ターゲット_ _ _ _ _はい

計算手順:
ステップ 1: GT 実フレームの中心点の座標を計算します。GT 実フレームがどのグリッド (グリッド) に該当するかを計算します。これを勝利グリッドと呼びます。 ステップ 2: 各グリッドの幅 (幅と高さが等しい):
Gridw
= 416 13 = 32 グリッド_w = \ frac{416}{13} = 32\\ギルディ_ _ _=13416=32

ステップ 3:
targetx = σ ( tx ) = GT 実フレームの中心点の座標 x − 勝利グリッドの左上隅 xgirdw target_x=\sigma\left(t_x\right) = \frac{GT\mathrm{座標実際のフレームの中心点}x-\ mathrm{グリッドの左上隅}x}{gird_w}\\ターゲット_ _ _ _ _×=p( t×=ギルディ_ _ _GT実フレームの中心点の座標x勝ちグリッドの左上隅にあるx
この値は、損失関数に送信する GT 値です。
同様に、次のように求めることができます。
targety = σ ( ty ) = GT 実フレームの中心点の座標 y − ygirdh target_y=\sigma\left(t_y\right) = \frac{GT\mathrm{座標実際のフレームの中心点} y-\mathrm{勝利グリッドの左上隅}y}{gird_h}\\ターゲット_ _ _ _ _はい=p( tはい=ギルディ_ _ _GT実フレームの中心点の座標y勝ちグリッドの左上隅にあるy

この時点で、 targetx、targety、target_x、target_y\\を計算していることがわかります。
ターゲット_ _ _ _ _×ターゲット_ _ _ _ _はい

計算プロセス全体は 5 つのアンカーとは無関係であり、アンカーの値は使用されません。

ただし、ある情報に気づくことができます。落札グリッドの左上隅の座標は、実際にはアンカーの中心座標です。一部のコード実装ではこの手法が使用されているため、この理解はコード内で非常に重要です。コードを柔軟に変えなければなりません。

これもグリッドとアンカーの間には非常に密接な関係があります。

もう一度見てください、w、h

損失を入力するターゲットは次のようになっているとすでに想定しています:
targetx 、 targety 、 targetw 、 targetth target_x,target_y,target_w,target_h\\ターゲット_ _ _ _ _×ターゲット_ _ _ _ _はいターゲット_ _ _ _ _ターゲット_ _ _ _ _
targetw、targetth、target_w、target_hの計算を開始します\\
ターゲット_ _ _ _ _ターゲット_ _ _ _ _

これら 2 つの値を取得するにはどうすればよいでしょうか?

  1. GT リアル ボックスの w、h に直接等しいですか? いいえ!
  2. アンカーの w, h に相当しますか? いいえ!
  3. グリッド、アンカー、GTフレームの変換関係は何ですか?

アンカー導入の目的は?それの使い方?
アンカーについて話す前に、yolo では計算ボックスの損失と分類ではターゲットの状況のみが考慮されることを明確にしましょう。つまり、正のサンプルのみが計算され、負のサンプルは考慮されません。信頼性を計算する際には、正のサンプルと負のサンプルの両方が考慮されます。

ここに画像の説明を挿入
yolov1 のyolov1 を振り返ると
、損失の計算には gt ボックスが損失の gt ターゲットとして直接使用されています。ネットワーク外には 2 つの予測ボックスがあります。損失の計算にはどのボックスと GT ボックスが使用されますか? これは、yolov1 が比較的忘れがちな詳細です。2
つの予測ボックスと GT ボックスの IOU を計算し、IOU が大きい方が勝ち、GT ボックスでの損失の計算に使用され、もう 1 つはオブジェクトを計算しません。

FasterRCNN が
yolov2 に到着したとき、GT フレームを直接ロスに送信するのではなく、アンカーで変換してから送信しました。
アンカーの導入は Faster RCNN から来ています。まず、Faster RCNN でアンカーを使用する方法を見てみましょう: 1)
アンカーと GT は IOU を計算し、ネットワークの入力を取得します: IOU が大きいアンカー0.7 より大きい場合は正のサンプル (前景)、0.1 ~ 0.3 の間は負のサンプル (背景) として使用され、0.3 ~ 0.5 の間は入力としてアンカーを直接使用するボックスを無視します。カテゴリは 1 (前景、ターゲットあり)、 0 (バックグラウンド、ターゲットなし)。
2) RPN ネットワークを介して特徴マップから候補フレーム ROI を取得し、ROI に対して二値分類を実行し、候補フレームの内容が前景であるか背景であるかを判断し、前景候補フレームを残し、背景候補フレームを破棄します。回帰 gt close を通じて前景 BBox とラベルを微調整します。
3) 2 つの損失、rpn 損失計算ボックス損失: アンカーと予測値、カテゴリ損失: 0、1 ターゲットの有無、rcnn 損失、rpn と GT ボックスによって予測される前景の損失、N 個のカテゴリがあります。
上記は Faster RCNN でのアンカーの適用です. アンカーを使用することにより、GT フレームに近い rpn 段階でモデルが大量の前景フレームを取得できることがわかります。多数の背景フレームも削除され、最後に RPN が予測されます。前景フレームは微調整と修正のために RCNN ステージに送信されます。精度は非常に高くなりますが、速度は遅くなります。

yolov2 は
yolov2 でアンカーをどのように使用しますか?
yolov2では5つのアンカーがプリセットされていますが、そのうちGTボックスとターゲット関係を持つアンカーは1つだけで、残りの4つのアンカーはターゲット関係を持たず、ターゲットが無い場合は損失計算に参加しません。
ここで yolov1 をもう一度見ることができます。陽性サンプルが 1 つしかなく、GT ボックスもグリッドを通して検出されるため、アンカーがある場合とない場合に本質的な違いはないようです。考えられるのは、アンカーがテストの最初の概念をもたらすということです。
モデルが特定のフレームを探すことから微調整フレームを探すようになったのですが、ここでなぜ彼のエフェクトが良くなるのか理解できません。

ネガティブ サンプルの観点から見ると、彼はさらに 4 つのネガティブ サンプルを持っており、明確な先行フレームであり、yolov1 よりも強力です。

同時に、信頼スコアを計算するときに、正のサンプルと負のサンプルが考慮されます。yolov1 は 1:1 の関係であり、yolov2 は 1:4 の関係です。もちろん、途中には IOU を無視するアンカーがまだあります。 >0.6. すでに最大の IOU アンカーが存在し、他のアンカーもしきい値 0.6 より大きいため、この処理は理解できますが、それらは正のサンプルとみなされず、負のサンプルともみなされないため、これらは無視してください。損失計算に参加するためにそのようなアンカーを使用しないでください。これらは非常に重要なマイナーな取り扱いです。

上記を理解した上で、アンカーと gt の関係を見て、次のように計算します。
targetw = ℮ tw = GT box wanchorw、targeth = ℮ th = GT box hanchorh、target_w=℮^{t_w}=\frac{GT box _w }{anchor_w},target_h=℮^{t_h}=\frac{GT フレーム_h}{anchor_h},ターゲット_ _ _ _ _=t=アンカー_ _ _ _GTボックスターゲット_ _ _ _ _=t=アンカー_ _ _ _GTボックス


観察の結果、各グリッドの左上隅の点がアンカーの中心点であることがわかりました。

参考

おすすめ

転載: blog.csdn.net/u010006102/article/details/126759232