SOFT-NMS(2)(抑制、非最大非極大抑制)


NP numpyのインポートAS

ボックスnp.array =([200 [240、200は、440、400]、[200、240、400、440]、200、400、400]であり、[220、220、420、420]であります、[1 ,. 1、2、2]]、DTYPE = np.float32)
boxscores np.array =(0.9、0.8、0.7、0.6、0.5]、DTYPE = np.float32)#が内部に置かれていないため、スコア変化

:DEFのsoftnms(boxes_x1y1x2y2、score_boxes、threshold_iouが0.3 =シグマ= 0.5、threshold_end = 0.001、方法= 2)
"" "
softnms
:PARAM boxes_x1y1x2y2:boexs形式の行列座標[Y1、X1、Y2、X2]
:PARAM score_boxes:各々は、対応するボックススコア
:PARAM threshold_iou:高い値で除去score_boxesより大きいIOUを解決するための最良のスコアの各ボックスを有する残りのボックスは、ボックスのブロックが重複繰り返しを示し、値が他のオブジェクトのボックスよりも小さくてもよいです、重複閾値
:PARAMシグマは:分散のガウス関数を使用します
:PARAM threshold_end:最終スコアの閾値スコアに格納されたIOU値を、対応する最良ボックスを解決するために初めて、次にボックスに対応する、このスコア閾値よりも大きい保持
:PARAMメソッド:メソッドを使用
:リターン:の左側のボックス指標
"" "
インデックス付き#1 CONCATENATEボックスは、最後の列
N = boxes_x1y1x2y2.shape [0]#は、ボックスの番号を示す
#ボックスの順序は、座標[Y1、X1、Y2、X2]
Y1 = boxes_x1y1x2y2 [:0]
boxes_x1y1x2y2 = X1の[:1]
Y2 = boxes_x1y1x2y2 [:2]
X2 = boxes_x1y1x2y2 [:3]
スコア= score_boxes
分野=(X2 - X1の+ 1)* - (Y2 Y1 + 1)
の範囲内のiについて(N ):
中間パラメータパラメータ後で交流
。TBD = boxes_x1y1x2y2 [I ,:]コピー()#座標i番目に対応
tscore =スコア[I] .copy( )#スコアi番目に対応
TAREAは、i番目の領域に対応する領域[I] .copy()#=
POSを= I + 1つの#のPOSボックス番目電流iをスキップインデックス
iが= N場合- 1:! # iが最大取って決定される
:maxscore = np.max(スコア[POS #、軸= 0]) 現在のスコアは、i番目の最大服用後スコアスキップ
= NP maxposを.argmax(スコア[POS:]、軸= 0)#は、 に対応する最大インデックス服用後に第i画分の現在のスコアの一部をスキップ
他の:
MaxScoreスコア= [-1]#ない(すなわち、一つだけ)の場合にこの取る
だけ即ちインデックス0ものがあるのでmaxpos = 0位
tscore <MaxScore IF第1及び#
#それぞれの最高スコアを取る
boxes_x1y1x2y2を[iが,:] = boxes_x1y1x2y2 [maxposは+ I + 1 ,: ]#行の順列、スコア、領域、あまりに
boxes_x1y1x2y2 [maxpos + I + 1、 :] = TBD
TBD = boxes_x1y1x2y2 [I:]
スコア[i]は=スコア[maxpos + I + 1]
スコア[maxpos + I + 1] = tscore
tscore =スコア[i]は
領域[I] =地域[maxpos + I + 1]
領域[maxpos + I + 1] = tarea
tarea =領域[I]
#のIOUが計算
XX1 = np.maximum(boxes_x1y1x2y2 [I、1]、boxes_x1y1x2y2 [POS :, 1])
YY1 = np.maximum(boxes_x1y1x2y2 [I、 0]、boxes_x1y1x2y2 [POS :, 0])
XX2 = np.minimum(boxes_x1y1x2y2 [I]、[3]、boxes_x1y1x2y2 [POS :, 3])
YY2 = np.minimum(boxes_x1y1x2y2 [I]、[2]、boxes_x1y1x2y2 [POS :, 2])
W = np.maximum(0.0、XX2 - XX1 + 1)
H = np.maximum(0.0、YY2 - YY1 + 1)
W = H *インター
OVR =インター/(エリア[I] +エリア[POS:] -インター)
#3つの方法:1.linear 2.gaussian 3.original NMS
IF ==方法1:#リニア。
重量= np.ones (ovr.shape)
[> threshold_iou OVR] =体重[> threshold_iou OVR]重量- [OVR> threshold_iou] OVR
のelif ==方法2:#ガウス
重量np.exp =( - (* OVR OVR)/シグマ)
他:元のNMS#1
重量= np.ones(ovr.shape)
NtをIOU比較値よりも大きい重量[threshold_iou> OVR]#= 0一致ボックスと、この閾値IOUより従って大きく、多くのスコアに相当する、0であります0で
削除しない場合は#値がスコアを与えられ、:=体重*スコア[POS]:スコア[POS]
位のボックスを選択し、対応する保持インデックスを
boxes_new = boxes_x1y1x2y2 [スコア> threshold_end] #の閾値を解決する決意スコアを満たすを、それが予約満たす場合
boxes_newリターン
#ボックスとスコア


boees_slect = softnms(ボックス、boxscores、メソッド= 3)
プリント(boees_slect)


オリジナルNMS次のように

 

 リニアソフトNMS:

 

 ガウスNMS:

 

 



































おすすめ

転載: www.cnblogs.com/tangjunjun/p/11613291.html