非极大值抑制_【计算机视觉——RCNN目标检测系列】三、IoU与非极大抑制
寫在前面
在上一篇博客:【計算機(jī)視覺—RCNN目標(biāo)檢測系列】二、邊界框回歸(Bounding-Box Regression)(
戴璞微:【計算機(jī)視覺—RCNN目標(biāo)檢測系列】二、邊界框回歸(Bounding-Box Regression)?zhuanlan.zhihu.com)
中我們主要講解了R-CNN中邊界框回歸,接下來我們在這篇博客我們講解R-CNN中另外一個比較種重要的模塊——IoU與非極大抑制。
在這篇博客中,我們將重點RCNN論文中另一個比較重要模塊——IoU與非極大抑制。IoU是描述兩個矩形框之間重合程度的指標(biāo),在RCNN中常用于衡量邊界框回歸算法得到的預(yù)測目標(biāo)框與真實目標(biāo)框之間的重合程度。非極大抑制算法(Non-Maximum Suppression,NMS)則是用于去除大量重復(fù)的候選目標(biāo)框。
一、IoU
首先來看下交并比(Intersection over Union,IoU)。假定兩個目標(biāo)框分別為 和 ,兩個矩形框的示意圖如下圖所示。那么兩個目標(biāo)框的交并比計算公式為:
。也就是IoU是兩個目標(biāo)框交際與并集的比值。一般來說,在目標(biāo)檢測中, 可視為檢測結(jié)果良好正確,如果預(yù)測器和實際邊界框完美重疊,則 ,因為交集就等于并集。但一般來說只要 ,那么結(jié)果是可以接受。python中實現(xiàn)IoU的代碼如下:
import numpy as npdef IoU(vertice1, vertice2):"""這是計算兩個矩形區(qū)域的交并比函數(shù),verticle格式為:[xin,ymin,xmax,ymax]:param vertice1: 目標(biāo)框1:param vertice2: 目標(biāo)框1:return: 兩個矩形區(qū)域的交并比"""# 計算區(qū)域交集的左上與右下坐標(biāo)lu = np.maximum(vertice1[0:2], vertice2[0:2])rd = np.minimum(vertice1[2:], vertice2[2:])# 計算區(qū)域交集的面積intersection = np.maximum(0.0, rd - lu)inter_square = intersection[0] * intersection[1]# 計算區(qū)域并集的面積square1 = (vertice1[2] - vertice1[0]) * (vertice1[3] - vertice1[1])square2 = (vertice2[2] - vertice2[0]) * (vertice2[3] - vertice2[1])union_square = np.maximum(square1 + square2 - inter_square, 1e-10)return np.clip(inter_square / union_square, 0.0, 1.0)二、非極大抑制
接下來,我們重點介紹非極大抑制(Non-Maximum Suppression,NMS)。顧名思義,非極大抑制就是要抑制非極大值。也可以將非極大抑制理解成搜索局部最大值。 在此我們討論的非極大抑制主要特指用于目標(biāo)檢測領(lǐng)域中搜索木分類概率最大的目標(biāo)框的非極大抑制算法,而通用的非極大抑制請閱讀論文《Efficient Non-Maximum Suppression》。下面我們來看下非極大抑制的示意圖。
我們常會采用分類概率與IoU作為指標(biāo)來實現(xiàn)目標(biāo)框的非極大抑制。具體算法流程如下: 1. 首先我們按照目標(biāo)框?qū)?yīng)的分類概率進(jìn)行排序,選取分類概率最大的目標(biāo)框,記作current_box。 2. 計算current_box與剩余目標(biāo)框之間的IoU 3. 將IoU大于閾值的目標(biāo)框舍棄 4. 接下來在剩余的目標(biāo)框中再選出最大分類概率的目標(biāo)框。按照上述流程一直循環(huán)直至條件結(jié)束。 顯然從算法流程可以看出,非極大抑制是一種貪心算法。它的主要目的就是消除多余重疊比例較高的目標(biāo)框。在RCNN與Fast RCNN中,候選框主要是由選擇性搜索算法獲取的,為了涵蓋每張圖片中對各個目標(biāo),選擇行搜索算法會返回將近2000個候選框,因此帶來大量重疊率叫高的目標(biāo)框,因此在分類和定位任務(wù)借宿后,利用非極大抑制算法進(jìn)行淘汰多余重復(fù)候選框時一項十分重要的工作。
非極大抑制(NMS)算法的python實現(xiàn)如下:
import numpy as np def py_cpu_nms(dets, thresh):"""這是NMS去除重復(fù)目標(biāo)框的函數(shù):param dets: 目標(biāo)框數(shù)組,目標(biāo)框的格式為:[xin,ymin,xmax,ymax,score]:param thresh: 閾值:return: 不重復(fù)的目標(biāo)框數(shù)組在元目標(biāo)框數(shù)組中的下標(biāo)數(shù)組"""vertices = dets[:, 0:4] # 目標(biāo)框scores = dets[:, 4] # bbox打分#areas = (x2 - x1 + 1) * (y2 - y1 + 1)# 打分從大到小排列,取indexorder = scores.argsort()[::-1]# keep為最后保留的邊框keep = []while order.size > 0:# order[0]是當(dāng)前分?jǐn)?shù)最大的窗口,肯定保留i = order[0]keep.append(i)# 計算窗口i與其他所有窗口的交疊部分的面積ious = np.array([IoU(vertices[i], vertices[j]) for j in order[1:]])# inds為所有與窗口i的iou值小于threshold值的窗口的index,其他窗口此次都被窗口i吸收inds = np.where(ious <= thresh)[0]# order里面只保留與窗口i交疊面積小于threshold的那些窗口,由于ovr長度比order長度少1(不包 含i),所以inds+1對應(yīng)到保留的窗口order = order[inds + 1]return keep歡迎關(guān)注我的微信公眾號:AI那點小事
總結(jié)
以上是生活随笔為你收集整理的非极大值抑制_【计算机视觉——RCNN目标检测系列】三、IoU与非极大抑制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python legb_理解 Pytho
- 下一篇: yolov3权重_目标检测之 YOLOv