演算法思想
目標檢測中常用到NMS,在faster R-CNN中,每一個bounding box都有一個打分,NMS實作邏輯是:
1,按打分最高到最低將BBox排序 ,例如:A B C D E F
2,A的分數最高,保留,從B-E與A分別求重疊率IoU,假設B、D與A的IoU大于閾值,那么B和D可以認為是重復標記去除
3,余下C E F,重復前面兩步,
代碼實作
"""
檔案說明:https://www.cnblogs.com/king-lps/p/9031568.html
"""
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon May 7 21:45:37 2018
@author: lps
"""
import numpy as np
# size(6,4)
boxes = np.array([[100, 100, 210, 210, 0.72],
[250, 250, 420, 420, 0.8],
[220, 220, 320, 330, 0.92],
[100, 100, 210, 210, 0.72],
[230, 240, 325, 330, 0.81],
[220, 230, 315, 340, 0.9]])
def py_cpu_nms(dets, thresh):
# dets:(m,5) thresh:scaler
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
areas = (y2 - y1 + 1) * (x2 - x1 + 1)
scores = dets[:, 4]
keep = []
index = scores.argsort()[::-1]
while index.size > 0:
i = index[0] # every time the first is the biggst, and add it directly
keep.append(i)
x11 = np.maximum(x1[i], x1[index[1:]]) # calculate the points of overlap
y11 = np.maximum(y1[i], y1[index[1:]])
x22 = np.minimum(x2[i], x2[index[1:]])
y22 = np.minimum(y2[i], y2[index[1:]])
w = np.maximum(0, x22 - x11 + 1) # the weights of overlap
h = np.maximum(0, y22 - y11 + 1) # the height of overlap
overlaps = w * h
ious = overlaps / (areas[i] + areas[index[1:]] - overlaps)
idx = np.where(ious <= thresh)[0]
index = index[idx + 1] # because index start from 1
return keep
import matplotlib.pyplot as plt
def plot_bbox(dets, c='k'):
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
plt.plot([x1, x2], [y1, y1], c) # c for color
plt.plot([x1, x1], [y1, y2], c)
plt.plot([x1, x2], [y2, y2], c)
plt.plot([x2, x2], [y1, y2], c)
plt.title("after nms")
plt.show()
plot_bbox(boxes, 'k') # before nms
keep = py_cpu_nms(boxes, thresh=0.7)
plot_bbox(boxes[keep], 'r') # after nms
輸出結果:
nms之前

nms之后

這里有幾個細節點:
-
獲取下一輪的點坐標時,需要+1,這是因為iou計算是index[1:],拋掉了概率最大值的那個框,所以少一個size.

-
計算IOU時,請選用矩陣坐標系統來思考(即opencv的坐標系,左上角是原點,往下是x遞增的方向,往右是y遞增的方向),其實只要按照矩陣row和col的格式來思考就可以了.相交的左上角都是max,相交區域的右下角都是min.
參考
NMS的python實作
python numpy.where()函式的用法
非極大值抑制演算法(Non-Maximum Suppression,NMS)
非極大值抑制(NMS)的幾種實作
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/395271.html
標籤:其他
