【雑記】NMS方式とR-CNNシリーズ、SSD、Yoloシリーズの一般的な考え方


基本的なターゲット検出方法をいくつか学ぶ必要があります。


1. 非最大抑制 (NMS)

アンカーベースのターゲット検出方法は通常、何らかの方法 (選択的検索など、またはより単純な方法) でアンカー ボックスを生成します。

簡単な方法:いくつかのスケーリング比を事前に設定します (scale, si ∈ ( 0 , 1 ] , m s_i\in(0,1], ms私は( 0 ,1 ] m )およびいくつかのアスペクト比 (アスペクト比、ri > 0 、 n r_i>0、 nr私は>0 n ). 過度の計算の複雑さを避けるために、同じズーム比の下での異なるアスペクト比のすべての組み合わせと、同じアスペクト比の下での異なるズーム比のすべての組み合わせのみを考慮します
( s 1 , ri ) i = 1 n および ( si , r 1 ) i = 2 m (s_1,r_i)_{i=1}^n および (s_i,r_1)_{i=2}^{m}( s1r私はi = 1そして_私はr1i = 2メートル
つまり、 hw ( m + n − 1 ) hw(m+n-1)となります。うわー( m _+n1 )アンカー、h、w、wwは画像の高さと幅です。

)、これらのアンカー ボックスの予測カテゴリとオフセットを生成します。

ただし、多くのアンカー ボックスが重なって同じオブジェクトを表す場合があります。このとき、この繰り返しを取り除くために、非最大抑制(Non-maximum resistance)という手法を導入しました。

NMS の操作手順は次のとおりです。

  1. 予測されたすべての非背景境界ボックスは信頼度の降順で並べ替えられ、リストLLが生成されます。L .
  2. LLからLの信頼度が最も高いB 1 B_1B1次に、すべてのB_1 を B 1 と比較します。B1IoU が特定のしきい値θ \thetaより大きいθのアンカー ボックスはが最大ではない境界ボックスは抑制されます
  3. 2 番目に信頼度が高い次のアンカー ボックスを選択しますB 2 B_2B2、すべてのアンカー ボックスが選択されるまで上記の手順を繰り返します。これは、類似度がしきい値を超えるアンカー ボックスのペアが存在しないことを意味します。

コードの実装: (「ハンズオンディープラーニング」を参照)


```python
import torch 

#定义计算IoU函数
def box_iou(boxes1,boxes2):
    '''
    input:
    boxes1,boxes2:输入的锚框,每个boxes的shape(box_number,4),其中
    4代表:xmin,ymin,xmax,ymax
    output:boxes1和boxes2中两两框的iou torch.Tensor
    注意:两两框的意思是假设boxes1有m个,boxes2有n个,则计算结果应是mn个.
    '''
    #计算每个box的面积
    box_area = lambda boxes : ((boxes[:,2] - boxes[:,0]) * 
                                (boxes[:,3] - boxes[:,1])) #box_area:(box_number,)

    area1 , area2 = box_area(boxes1), box_area(boxes2)

    #计算对应锚框的交集部分
    inter_upleft = torch.max(boxes1[:,None,:2],boxes2[:,:2]) #交集部分左上角坐标,就是比较两个框的(x_min,y_min)的较大者
    #特别注意:None的用法是扩充维度,也就是对每一个boxes1中的框,将所有的boxes2进行比较,下同
    inter_downright = torch.min(boxes1[:,None,2:],boxes2[:,2:]) #同理 比较(x_max,y_max)的较小者
    inters = (inter_downright - inter_upleft).clamp(min=0) #clamp是筛选大于0的值,小于0的输出0

    inter_area = inters[:,:,0] * inters[:,:,1] #交集部分面积 shape(box_number1,box_number2) 下同

    union_area = area1[:,None] + area2 - inter_area #并集面积 None扩充维度,为了维度一直相除

    return inter_area / union_area 


#定义NMS
def NMS(boxes,scores,threshold):
    '''
    input:
    boxes:anchor boxes,shape(number,4)
    scores:置信度 (numbers,)
    threshold:阈值 float
    output:筛选出的anchor box的index
    '''
    #先按置信度大小对所有锚框排序 降序 返回索引值
    B  = torch.argsort(scores,dim=-1,descending=True)

    keep = [] #要保留的box的index

    while B.numel() > 0: #还没筛完
        i = B[0] #选定当前置信度最高的
        keep.append(i) #加入
        
        if B.numel() == 1:
            break #只剩一个就完毕

        iou = box_iou(boxes[i,:].reshape(-1,4),
                        boxes[B[1:],:].reshape(-1,4)).reshape(-1) #计算选定框和剩余框的iou,reshape(-1)相当于flatten

        indexs = torch.nonzero(iou <= threshold).reshape(-1) #iou <= threshold是bool值,
        # 返回的是为True的值得索引,也就是满足小于阈值的索引

        B = B[indexs + 1] # 相当于是B = B[indexs],是筛选,然后将索引都加1,表示移动,删除掉已经计算完的基准框:B = B[indexs + 1]

    return torch.tensor(keep) 

2.R-CNN、高速 RCNN および高速 RCNN

2.1 RCNN

RCNN の設計は選択検索と SVM を組み合わせたもので、大きく次のステップに分かれます。

  1. 入力画像の選択的検索を使用して、およそ 2k 程度の提案領域が提案されます。

選択的検索の一般的な考え方:
1. 領域セットRRを生成するR
2. 領域セット内の各隣接領域の類似度を計算しますS = { s 1 , ... } S=\{s_1,...\}S={ s13.
最も類似性の高い 2 つの領域を見つけ、それらを新しいセットにマージし、RR に追加ますR 4.SS
の削除Sの新しいセットに関連するサブセット
5.SSSは空ですが、
NMSという考えはありますか?

  1. 事前トレーニングされた CNN の後、フレームの特徴が抽出されます
  2. SVM 分類器を最初からトレーニングして、抽出された特徴を分類する
  3. 線形回帰を使用して境界ボックスのオフセットを予測する

ここに画像の説明を挿入

2.2 高速 RCNN

RCNN の効率は低すぎます。特徴は候補フレームごとに計算されるため、非常に冗長です。そのため、Fast RCNN は画像全体から特徴のみを抽出します。候補フレームの選択には依然として選択的検索が使用されますが、これらのフレームはこれは、後続の計算のために特徴マップに投影されます。

一般的な手順は次のとおりです。

  1. 選択的検索、約 2,000 個の候補ボックスを取得
  2. CNN を使用して画像特徴を抽出します。出力は1 × c × h 1 × w 1 1\times c \times h_1\times w_1 であると仮定します。1×c×h1×w1
  3. 前述したように、候補フレームは特徴マップに合わせてスケーリングされます。たとえば、特徴マップのサイズは元の画像の 0.1 倍であり、候補フレームのサイズ応答は 0.1 倍に縮小されます。出力を統一し、その後の計算を容易にするために、 ROI Pooling を追加します ROI Pooling は、特徴マップ上の候補領域の投影をプールし、同じサイズh 2 × w 2 h_2\times を出力しますw_2h2×w2候補領域にnn があると仮定します。nの場合、出力はn × c × h 2 × w 2 n\times c \times h_2\times w_2 にn×c×h2×w2
  4. 全結合層を通じて出力形状をn × dn \times dに変換しますn×d、ここでハイパーパラメータdddはモデルの設計に依存します
  5. 各候補ボックスのカテゴリとサイズを個別に予測します。2 つの分岐の後、1 つはn × qn \times qを出力します。n×qqqqはカテゴリの数で、別の出力はn × 4 n \times 4n×4と 4 はそれぞれ bbox の位置を示します。

ここに画像の説明を挿入

ROI プーリングが異なる入力を同じ出力にどのように変換するかについては、今後学習される予定です。

2.3 より高速な RCNN

選択的検索にはまだ候補ボックスが多すぎるため、Faster RCNN は選択的検索の代わりに領域提案ネットワーク (RPN) を使用してアンカー ボックスの数を減らします。もちろん、RPN は追加のトレーニングを実行します。

ここに画像の説明を挿入

領域提案ネットワークの畳み込み層は完全な畳み込み層です、つまり、畳み込み層は通常の畳み込みネットワークの FC 層を置き換えるために使用されます。RPN の一般的な手順は次のとおりです。

  1. 入力は機能マップで、FCN は 3x3 カーネルを使用し、パディングは 1 で、RPN の畳み込み層の出力チャネルはccであると想定されます。cの場合、特徴マップ内の各ユニットの長さはcccの特徴。
  2. 特徴マップの各ピクセルを中心に配置して、異なるサイズとアスペクト比の複数のアンカー ボックスを生成し、それらにラベルを付けます
  3. アンカー ボックスの中心セルの長さccを使用しますcの機能は、それぞれバイナリ カテゴリ (ターゲットまたは背景) とアンカー ボックスの境界ボックスを予測します。
  4. NMS を使用して、予測クラスがターゲットである予測境界ボックスから類似の結果を削除します。

それ以外はFast RCNNと同じです。

3. SSD(シングルショットマルチフレーム検出)

SSD の基本的な考え方は 1 段階であり、バウンディング ボックスの生成に RPN を使用しなくなり、異なるスケールの特徴マップを抽出するのと同様のピラミッド構造を使用し、各特徴について冒頭で述べたアンカーを生成する単純な方法を使用します。各ピクセル上にいくつかのアンカー ボックスを生成し、各アンカー ボックスを予測、最後に NMS と信頼性スクリーニングを使用して最終候補ボックスを決定します。

当然のことながら、大きな特徴マップは小さなターゲットを検出でき、小さな特徴マップはより大きな受容野を持ち、大きなターゲットを検出できます。

基本的なネットワーク ブロックは通常、切り詰められた VGG、または ResNet を使用します。

ここに画像の説明を挿入

4.ヨロシリーズ

4.1 ヨロ v1

1. 全体的な考え方
yolo v1 は、これまでの方法とは異なりアンカーフリーであり、画像をS × SS\times Sに均等に分割します。S×Sブロックは、GT のターゲットの中心が特定のブロックに現れた場合、このブロックがこのターゲットの検出を担当し

画像を均等にブロックに分割することで、対象の一般的な表現をよりよく把握でき、画像全体を入力とするため、カテゴリーや見た目のコンテキスト情報を学習できると著者は考えている。

S × SS\times SS×Sブロックのうち、各ブロックがBBB個のbbox と信頼水準。1 つの bbox は 4 つの量x 、 y 、 w 、 hx、y、w、h× h は、 x 、 yx 、 yに注意を払うことを意味します× yはブロック サイズに関して正規化されますが、w 、 hw、hhは画像全体のサイズに対して正規化されます

信頼度は、ボックスにターゲットが含まれている(ただし分類はせず、ターゲットを区別しない)信頼度を反映しP r ( オブジェクト ) ∗ IOU predtruth Pr(Object)*IOU_{pred}^{truth}として記録されます。P r (オブジェクト) _ _ _ _ _アイ・オー・ユー_ _ _の前に本当です_ _ _,其中P r ( オブジェクト ) ∈ { 0 , 1 } Pr(オブジェクト)\in\{0,1\}P r (オブジェクト) _ _ _ _ _{ 0 ,1 }、ターゲットを含む場合は 1、ターゲットを含まない場合は 0IOU predtruth ∈ [ 0 , 1 ] IOU_{pred}^{truth}\in[0,1]アイ・オー・ユー_ _ _の前に本当です_ _ _[ 0 ,1 ] は、予測フレームと GT の交差および和集合の比率を表します。

さらに、各ブロックはCCも予測しますCカテゴリの確率、つまりP r ( Classi ∣ O bject ) , i = 1 , 2 , ... , C Pr(Class_i|Object),i=1,2,...,CP r (クラス_ _ _ _私はオブジェクト) _ _ _ _ _=1 2 C (ターゲットがある場合はC i C_iC私は確率)。

したがって、各ブロックにはC i C_iが存在します。C私はクラス分けの概数:
P r ( C lassi ∣ O bject ) P r ( O bject ) ∗ IOU predtruth = P r ( C lassi ) ∗ IOU predtruth Pr(Class_i|Object)Pr(Object)*IOU_{pred} ^{真実}=Pr(Class_i)*IOU_{pred}^{真実}P r (クラス_ _ _ _私はオブジェクト) P r (オブジェクト) _ _ _ _ _ _ _ _ _ _アイ・オー・ユー_ _ _の前に本当です_ _ _=P r (クラス_ _ _ _私はアイ・オー・ユー_ _ _の前に本当です_ _ _

最終的な予測結果のマップの形状は( S , S , ( 5 B + C ) ) (S,S,(5B+C))です。( S ( 5B _+C ) )、以下の図に示すように:
ここに画像の説明を挿入

2. ネットワーク構造

ネットワーク構造は GoogLeNet から借用したもので、ImageNet 用に設計されており、入力は448 × 448 448\times448です。4 4 8×4 4 8 .
ここに画像の説明を挿入
最後の線形層は 4096 個のベクトルを7 × 7 × 30 7\times7\times30 に7×7×3 0テンソル、つまりピクチャは 49 のブロックに分割され、各ブロックは 2 つの bbox と 20 のカテゴリを予測します。

著者は最初の 20 の畳み込み層 (さらに平均プーリング層と完全接続層) を使用して ImageNet で事前トレーニングを行い、事前トレーニングの入力は 224, 224 224,224 です2 2 4 2 2 4、検出中に長さと幅を 2 ​​倍にし、畳み込み層と線形層を追加します。

3. 損失​​関数

責任再解釈: 予測されたターゲットに対して責任があるのは 1 つの bbox のみであると予想されます。どの bbox がターゲットに対して責任があるかを指定するにはどうすればよいですか? 最大の GT IoU を持つ 1 つが責任を負います。したがって、損失を計算するときは、責任のある 1 つのみを考慮します。ターゲットの場合 bbox と GT の計算結果の差。

全体的な損失は二乗損失の形式になります。

ここに画像の説明を挿入

其中: I i o b j \mathbb I_i^{obj} オブジェ_ _iiを示しますiブロックには、ターゲットI i , jobj \mathbb I_{i,j}^{obj}jオブジェ_ _iiを示しますJJでブロックしますj bboxを担当するインジケーター関数λ noobj = 0.5 \lambda_{noobj}=0.5いいえいいえ_ _=0.5は、バックグラウンド クラスの予測への重点を減らすことです。

1. 長さと幅の誤差の計算をルート記号の形式で行う必要があるのはなぜですか
? 同じ bbox オフセットの場合、視覚的に、小さいターゲットの誤差はより明白であり、大きいターゲットの誤差はそれほど明白ではないからです。この 1 つの点に近づくためには、比例関数を使用することは適切ではありません。つまり、同じオフセットの下で誤差が大きい小さなターゲットの検出に効果があるため、 0 より小さい 2 階導関数が必要です。y = x 1 / 2 y=
x ^{1/2}y=バツ1 / 2同じ変化量の場合、大きな独立変数に対応する従属変数は小さくなります。

2. 質問和の符号の上付きと下付きに問題はありますか? S 2 − 1 と B − 1 S^2-1 と B-1
でなければなりませんS21B1

4.2 ヨロ v2

ブロック図はステーションBのアップマスター「Thunderbolt Wz」からのものです

ここに画像の説明を挿入

Yolo v1 と比較して、Yolo v2 にはいくつかの改善点があります。

1.バッチノルム

BN を追加しました。BN は正則化の役割を果たすことができるため、Dropout は削除されました。

2.高解像度分類器

以前、Yolo v1 は半分の解像度で分類の事前トレーニングを行いましたが、今回は直接448 × 448 448 \times 448で行われました。4 4 8×解像度4 4 8の ImageNet で事前トレーニング。

3.アンカーを使用したコンバージョン

著者は、各ブロックの中心座標と長さと幅を予測する効果は比較的乏しく、オフセットを予測するにはアンカーを使用する方が優れており、学習が容易であると考えています。

4.次元クラスター

では、アンカーはどうやって取得するのでしょうか? 以前の RCNN シリーズ (一部は手動で事前設定され、一部は学習されます) とは異なり、Yolo v2 は K-means クラスタリング手法を採用しており、GT の bbox 上でクラスタリングして先験的な知識を取得します。

従来の K-means クラスタリング手法では、ユークリッド距離を使用して距離を測定します。著者は、これにより大きなボックスでより大きな誤差が生じると考えています。IoU に関心があるため、IoU を使用して距離を定義することもできます。 d ( ボックス , 重心
) = 1 − I o U ( ボックス , 重心 ) d(ボックス, 重心)=1-IoU(ボックス, 重心)d (ボックスx _セントロイド_ _ _ _ _ _=1I o U (ボックス_ _セントロイド_ _ _ _ _ _

実験により、クラスターの数が多いほど良いことが証明されました ( k = 5 k=5)。k=5は、精度と複雑さの間のより良いトレードオフです。

ここに画像の説明を挿入

5.直接位置予測

アンカーを直接適用すると、モデルが不安定になります。この不安定性は、bbox の中心点の予測に起因します。その理由は、アンカー予測に基づいて取得される中心座標が次のように計算されるためです: x = ( tx ∗
wa ) + xay = ( ty ∗ ha ) + yax=(t_x*w_a)+x_a\\ y=(t_y*h_a)+y_aバツ=( t×w+バツy=( tはいh+y
その中( tx , ty ) (t_x,t_y)( t×tはい)は予測されたオフセット値です( wa , ha ) (w_a,h_a)( wh)はアンカーの幅と高さです( xa , ya ) (x_a,y_a)( ×y)はアンカーの中心です。

この式には値の範囲制限はありません。具体的には( tx , ty ) (t_x,t_y) です。( t×tはい)制限はありません。ボックスは画像内の任意の場所にジャンプします。したがって、注意してください制限されています

具体的には、ブロックについて、画像全体の左上隅へのオフセットがcx、cy c_x、c_yであると仮定します。c×cはい、アンカーの高さと幅はpw、ph p_w、p_hです。pp、予測値は( tx , ty ) (t_x,t_y)です。( t×tはい)の場合、予測された bbox の中心はbx、b_x、b_y によってb×bはい(オフセットであることに注意してください)および高さと幅bh、bw b_h、b_wbbそして自信を持ってbああために:

ここに画像の説明を挿入

ここでσ \sigmaσはシグモイド関数です。
ここに画像の説明を挿入

6.きめ細かい機能

小さなターゲットを検出するには低レベルの特徴マップが必要となるため、著者は低レベルの特徴と高レベルの特徴マップを融合するパススルー層を提案します。

具体的には、バックボーンネットワークは DarkNet19 を使用しており、中間の特定の層の特徴マップの次元は (26, 26, 512) であるため、まず 1x1conv を使用して次元を (26, 26, 64) に削減し、その後再整形します。それを (13, 13, 256) に入れる

( H , W , C ) − > ( H / 2 , W / 2 , 4 C ) (H,W,C)->(H/2,W/2,4C)( H C ) >( H / 2 W / 2 4C _

高レベルの出力 (13,13,1024) (特徴次元で連結) と融合して、(13,13,256+1024) の特徴マップを取得します。

7.マルチスケールトレーニング

固定入力サイズの代わりに、入力サイズは 10 エポックごとにランダムに変更され、その変更は 32 の倍数になります (元の入力が 416、最終的なネットワーク出力が 13、スケーリング係数が 32 であるため)。

異なるサイズを入力できるのはなぜですか?
ブロック図を観察すると、Yolo v2 は完全な畳み込みネットワークであるため、任意の入力を持つことができることがわかります。

4.3 ヨロ v3

DarkNet19 を DarkNet53 に置き換えます。アンカーの計算には引き続き K-means クラスタリングを使用し、v2 と同じ方法でオフセットを計算します。

全体的な枠組みは次のとおりです。

yolov3より引用

ここに画像の説明を挿入
1、2、3 はサイズが異なると予測し (これらはアップサンプリングされ、低レベルの特徴と融合されていることに注意してください)、異なるスケールのターゲットを検出できます。

損失関数、yolo v4、v5、X については、時間があるときに埋めてください。

おすすめ

転載: blog.csdn.net/wjpwjpwjp0831/article/details/121906657