非極大值抑制(nms)
nms的演算法步驟如下:
# input:所有**出的bounding box (bbx)資訊(座標和置信度confidence), iou閾值(大於該閾值的bbx將被移除)for object in all objects:
(1) 獲取當前目標類別下所有bbx的資訊
(2) 將bbx按照confidence從高到低排序,並記錄當前confidence最大的bbx
(3) 計算最大confidence對應的bbx與剩下所有的bbx的iou,移除所有大於iou閾值的bbx
(4) 對剩下的bbx,迴圈執行(2)和(3)直到所有的bbx均滿足要求(即不能再移除bbx)
注意的是,nms是對所有的類別分別執行的。舉個栗子,假設最後**出的矩形框有2類(分別為cup, pen),在nms之前,每個類別可能都會有不只乙個bbx被**出來,這個時候我們需要對這兩個類別分別執行一次nms過程。
我們用python編寫nms**,假設對於一張,所有的bbx資訊已經儲存在乙個字典中,儲存形式如下:
def compute_iou(x1,y1,x2,y2,xx1,yy1,xx2,yy2):
s1=(x2-x1+1)*(y2-y1+1)
s2=(xx2-xx1+1)*(yy2-yy1+1)
***1=max(x1,xx1)
yyy1=max(y1,yy1)
***2=min(x2,xx2)
yyy2=min(y2,yy2)
ins= max(0,***2-***1)*max(0,yyy2-yyy1)
return ins/(s1+s2-ins+1e-6)
def nms(dic,threshold):
for class_name,bbox in dic.items():
bbox.sort(key=lambda x:x[-1],reverse=1)
res =
while bbox:
cur = bbox.pop(0)
for i in bbox:
iou = compute_iou(cur[0],cur[1],cur[2],cur[3],i[0],i[1],i[2],i[3])
if iou>threshold:
bbox.remove(i)
return res
print(nms(,0.5))
python程式設計之美
許久沒有用python,好多都忘得差不多了,以至於面試 趕緊複習,求下次輕虐。1 cmp list1,list2 比較兩個列表的元素 2 len list 列表元素個數 3 max list 返回列表元素最大值 4 min list 返回列表元素最小值 5 list seq 將元組轉換為列表 2 l...
python程式設計之 模擬時鐘
運用畫圓,畫線的方法,以及一些數學知識做的乙個demo。對教材裡的例子裡的畫時針的部分修改了下。需要注意的是遠點選擇在 而數字時鐘的十二點位於遠點的正上方。所以如果用三角函式來計算時針分針秒針的位置的時候需要對角度進行旋轉。根據sin,cos函式的特點,將對應的角度 90 讀得到的是所需要的結果。比...
Python網路程式設計之UDP
udp處理資料報,是一種無連線的協議 伺服器端 server socket.socket socket.af inet,socket.sock dgram 繫結ip server.bind 192.168.1.104 221 while true 接收 data,address server.rec...