1 インポートNPとしてnumpyの 2 3 DEF non_max_suppress(predicts_dict、閾値= 0.2 ): 4 ""」 5 上の非最大抑圧を実装するバウンディングボックスを予測する。 6 Argsは: 7 predicts_dict:{ "スティック":[[X1、Y1、X2 、Y2、scores1]、[...]]}。 8 threshhold:IOUしきい値 9 リターン: 10 非最大抑制によって処理predicts_dict 11 ""」 12 のための OBJECT_NAME、バウンディングボックスに predicts_dict.items(): #对每一个类别的目标分别进行NMS 13 = np.array bbox_array(BBOX、DTYPE = np.float) 14 図15は、 ##取得すべての矩形の現在のオブジェクトクラス座標と信頼(バウンディングボックスは、以下BBXをいう)、およびすべてのBBX面積計算 16 、Y1をX1をX2、Y2、スコア= bbox_array [:0]、bbox_array [:1]、bbox_array [:]、[2]、bbox_array [:3]、bbox_array [:4 ] 。17の エリア=(X2-X1 + 1) *(Y1-Y2 + 1 ) 18は #( "シェイプ=分野" areas.shape)プリント 。19 20 #すべてのカテゴリの#現在の信頼度がソート降順BBX(次ホールドインデックス情報)を行う 21で 順序= scores.argsort()[:: - 1 ] 22は、 印刷(" カテゴリ=%sの注文の"%のOBJECT_NAME、注文) 23は、 キープ= [] #BBX最終保持インデクス情報を格納するために使用される 24 K. 1 = 25 #BBXによってトラバース最低信頼に、IOUは、矩形枠の矩形枠のしきい値よりも大きいすべての値を削除する最高から順に#を 26 ながら order.size> 0: 27 プリント(' 第トラバーサル%D '%(K)) 28は、 Iが= オーダー[0] 29 keep.append(I) #はBBX対応する電流最大信頼指数保つ 30 31である 。# #取得BBX現在の左右の角に対応する全ての交点座標は、およびIOU(これはまた、他のすべてのBBXのBBX IOUを算出することに注意してください)を算出 32 XX1 np.maximum =(X1 [I]、X1 [オーダー[1 :]]) #order.size = 1、以下の結果が(] [)np.arrayある場合、最終結果に影響しない 33は YY1 = np.maximum(Y1 [I]、Y1 [オーダー[1 :]]) 34が XX2 = np.minimum(X2 [I]、X2 [オーダー[1 :]]) 35 YY2 np.minimum =(Y2 [I]、Y2 [オーダー[1 :]]) 36 インターnp.maximum =(0.0、xx2- + 1 XX1)* np.maximum(0.0、YY2 + -YY1 1。。 ) 37 IOU =インター/(面積[I] +分野[オーダー[1:]] - インター) 38は、 プリント(" IOU = " 、IOU) 39 40 プリント(np.where(IOUが<=閾値)) #の出力は除去されないBBXインデックス(ベクトルIOU相対指数) 41 = np.where indexs(IOU <=閾値)[0] + 1 位(IOU自体のない計算がないため、1の屈折率差ので、追加する必要が)保持されたインデックスを取得し 42である プリント(" indexs = " 、indexs) 43は、 注文=オーダー[indexs] #更新保持率、(配列([ 0、1、2 ])) 44が プリント(" 注文= " オーダー) 45 K + = 1 46は BBOX = bbox_array [キープ] 47 predicts_dict 【OBJECT_NAME] = bbox.tolist() 48 predicts_dict = predicts_dict 49 戻りpredicts_dict 50 51 なら __name__ == " __main__ " : 52 #predicts_dict = { "カップ":[894、354、63、60、0.6477274894714355]、[648、386、72、59、0.9115888476371765]、[772、233 、30、43、0.6633416414260864]、[723、246、50、41、0.8980304598808289]]} 53 predicts_dict = { " カップ":[647、385、789、501、0.6477274894714355]、[648、386、792、504 、0.9115888476371765 ]、 54 [772、233、832、319、0.6633416414260864]、[767、224、828、309、0.7833416414260864]、[723、246、823、328、0.8980304598808289 ]、 55 "人":[647、385、789、501、0.6477274894714355]、[648、386、792、504、0.9115888476371765 ]、 56 [772、233、832、319、0.6633416414260864]、[767、224、828、309、 0.7833416414260864]、[723、246、823、328、0.8980304598808289 ]]} 57 predicts_dict = non_max_suppress(predicts_dict、閾値= 0.2 ) 58 プリント(predicts_dict)
結果:
1つのオーダーのカテゴリカップ= [ 1 4 3 2 0 ] 2 1トラバーサル 。3 IOU = [ 0。 0。 0。 0.94050474 ] 。4(配列([ 0、1、2 ])) 。5 indexs = [ 1 2 3 ] 。6注文= [ 4 3 2 ] 。7 第二のトラバース 。8 IOU = 0.36237211 0.39097744 ] 。9(配列([]、DTYPE =Int64の)) 10 indexs = [] 。11注文= [] 12である =人の順序にカテゴリー[ 1 。4 。3 2 0 ] 13である 貫通初めて 14 IOU = [ 0。 0。 0。 0.94050474 ] 15(配列([ 0、1、2 ])) 16 indexs = [ 1 2 3 ] 。17注文= [ 4 3 2 ] 図18は、ある 介して第2の時間 19IOU = 0.36237211 0.39097744 ] 20(配列([]、DTYPE = int64モード)、) 21 indexs = [] 22順番= [] 23 { ' カップ':[[ 648.0、386.0、792.0、504.0、0.9115888476371765 ]、[ 723.0、246.0、823.0、328.0、0.8980304598808289 ]]、' 人':[[ 648.0、386.0、792.0、504.0、0.9115888476371765 ]、[ 723.0、246.0、823.0、328.0、0.8980304598808289 ]]}
参考ブログ: