CVPR2021目標(biāo)檢測(cè)佳作 | Weighted boxes fusion
目標(biāo)檢測(cè)是計(jì)算機(jī)視覺(jué)系統(tǒng)中的一項(xiàng)關(guān)鍵任務(wù),在自動(dòng)駕駛、醫(yī)學(xué)成像、零售、安全、人臉識(shí)別、機(jī)器人技術(shù)等領(lǐng)域都有廣泛的應(yīng)用。目前,基于神經(jīng)網(wǎng)絡(luò)的模型被用于對(duì)特定類(lèi)目標(biāo)的實(shí)例進(jìn)行定位和分類(lèi)。
1、動(dòng)機(jī)&摘要
當(dāng)不需要實(shí)時(shí)推理時(shí),模型的整合就有助于獲得更好的結(jié)果。在這項(xiàng)工作中,研究者提出了一種新的方法來(lái)結(jié)合目標(biāo)檢測(cè)模型的預(yù)測(cè):加權(quán)邊界框融合。新提出的算法利用所有提出的邊界框的置信度分?jǐn)?shù)來(lái)構(gòu)造平均的邊界框。
2、背景
目標(biāo)檢測(cè)是一種計(jì)算機(jī)視覺(jué)技術(shù),它處理圖像和視頻中特定類(lèi)別的語(yǔ)義目標(biāo)的實(shí)例。檢測(cè)是一系列實(shí)際應(yīng)用的基本任務(wù),包括自主駕駛、醫(yī)學(xué)成像、機(jī)器人、安全等。該任務(wù)將定位與分類(lèi)相結(jié)合。目標(biāo)檢測(cè)模型通常會(huì)返回目標(biāo)的候選位置、類(lèi)標(biāo)簽和置信度分?jǐn)?shù)。使用非極大抑制(NMS)方法選擇預(yù)測(cè)框。首先,它會(huì)根據(jù)它們的置信度分?jǐn)?shù)對(duì)所有的檢測(cè)框進(jìn)行分類(lèi)。然后,選擇具有最大置信值的檢測(cè)框。同時(shí),所有其他有明顯重疊的檢測(cè)框都會(huì)被過(guò)濾掉。它依賴(lài)于一個(gè)硬編碼的閾值來(lái)丟棄冗余的邊界框。最近的一些工作使用了一個(gè)可微分的模型來(lái)學(xué)習(xí)NMS,并引入了soft-NMS來(lái)提高過(guò)濾性能。
3、相關(guān)工作
Non-maximum suppression (NMS)
回顧下NMS和Soft-NMS
經(jīng)典N(xiāo)MS最初第一次應(yīng)用到目標(biāo)檢測(cè)中是在RCNN算法中,其實(shí)現(xiàn)嚴(yán)格按照搜索局部極大值,抑制非極大值元素的思想來(lái)實(shí)現(xiàn)的,具體的實(shí)現(xiàn)步驟如下:
設(shè)定目標(biāo)框的置信度閾值,常用的閾值是0.5左右
根據(jù)置信度降序排列候選框列表
選取置信度最高的框A添加到輸出列表,并將其從候選框列表中刪除
計(jì)算A與候選框列表中的所有框的IoU值,刪除大于閾值的候選框
重復(fù)上述過(guò)程,直到候選框列表為空,返回輸出列表
其中IoU(Intersection over Union)為交并比,如上圖所示,IoU相當(dāng)于兩個(gè)區(qū)域交叉的部分除以兩個(gè)區(qū)域的并集部分得出的結(jié)果。下圖是IoU為各個(gè)取值時(shí)的情況展示,一般來(lái)說(shuō),這個(gè)score > 0.5 就可以被認(rèn)為一個(gè)不錯(cuò)的結(jié)果了。
下面,通過(guò)一個(gè)具體例子來(lái)說(shuō)明經(jīng)典N(xiāo)MS究竟做了什么。下圖的左圖是包含一個(gè)檢測(cè)目標(biāo)(王鬧海)的實(shí)例圖片。其中的綠色矩形框代表了經(jīng)過(guò)目標(biāo)檢測(cè)算法后,生成的大量的帶置信度的Bounding box,矩形框左下角的浮點(diǎn)數(shù)即代表該Bounding box的置信度。在這里,使用Python對(duì)經(jīng)典N(xiāo)MS算法實(shí)現(xiàn),并應(yīng)用到該實(shí)例中去。當(dāng)NMS的閾值設(shè)為0.2時(shí),最后的效果如下圖中右圖所示。
def nms(bounding_boxes, Nt): if len(bounding_boxes) == 0: return [], [] bboxes = np.array(bounding_boxes) # 計(jì)算 n 個(gè)候選框的面積大小 x1 = bboxes[:, 0] y1 = bboxes[:, 1] x2 = bboxes[:, 2] y2 = bboxes[:, 3] scores = bboxes[:, 4] areas = (x2 - x1 + 1) * (y2 - y1 + 1) # 對(duì)置信度進(jìn)行排序, 獲取排序后的下標(biāo)序號(hào), argsort 默認(rèn)從小到大排序 order = np.argsort(scores) picked_boxes = [] # 返回值 while order.size > 0: # 將當(dāng)前置信度最大的框加入返回值列表中 index = order[-1] picked_boxes.append(bounding_boxes[index]) # 獲取當(dāng)前置信度最大的候選框與其他任意候選框的相交面積 x11 = np.maximum(x1[index], x1[order[:-1]]) y11 = np.maximum(y1[index], y1[order[:-1]]) x22 = np.minimum(x2[index], x2[order[:-1]]) y22 = np.minimum(y2[index], y2[order[:-1]]) w = np.maximum(0.0, x22 - x11 + 1) h = np.maximum(0.0, y22 - y11 + 1) intersection = w * h # 利用相交的面積和兩個(gè)框自身的面積計(jì)算框的交并比, 將交并比大于閾值的框刪除 ious = intersection / (areas[index] + areas[order[:-1]] - intersection) left = np.where(ious < Nt) order = order[left] return picked_boxes
soft-NMS
經(jīng)典N(xiāo)MS是為了去除重復(fù)的預(yù)測(cè)框,這種算法在圖片中只有單個(gè)物體被檢測(cè)的情況下具有很好的效果。然而,經(jīng)典N(xiāo)MS算法存在著一些問(wèn)題:對(duì)于重疊物體無(wú)法很好的檢測(cè)。當(dāng)圖像中存在兩個(gè)重疊度很高的物體時(shí),經(jīng)典N(xiāo)MS會(huì)過(guò)濾掉其中置信度較低的一個(gè)。如下圖所示,經(jīng)典N(xiāo)MS過(guò)濾后的結(jié)果如下下圖所示:
而我們期望的結(jié)果是兩個(gè)目標(biāo)都被算法成功檢測(cè)出來(lái)。
為了解決這類(lèi)問(wèn)題,Jan Hosang,等人提出了Soft-NMS算法。Soft-NMS的算法偽代碼如圖5所示。其中紅色框?yàn)榻?jīng)典N(xiāo)MS的步驟,而綠色框中的內(nèi)容為Soft-NMS改進(jìn)的步驟。可以看出,相對(duì)于經(jīng)典N(xiāo)MS算法,Soft-NMS僅僅修改了一行代碼。當(dāng)選取了最大置信度的Bounding box之后,計(jì)算其余每個(gè)Bounding box與Bounding box的I ou值,經(jīng)典N(xiāo)MS算法的做法是直接刪除Iou大于閾值的Bounding box;而Soft-NMS則是使用一個(gè)基于Iou的衰減函數(shù),降低Iou大于閾值Nt的Bounding box的置信度,IoU越大,衰減程度越大。
def soft_nms(bboxes, Nt=0.3, sigma2=0.5, score_thresh=0.3, method=2): # 在 bboxes 之后添加對(duì)于的下標(biāo)[0, 1, 2...], 最終 bboxes 的 shape 為 [n, 5], 前四個(gè)為坐標(biāo), 后一個(gè)為下標(biāo) res_bboxes = deepcopy(bboxes) N = bboxes.shape[0] # 總的 box 的數(shù)量 indexes = np.array([np.arange(N)]) # 下標(biāo): 0, 1, 2, ..., n-1 bboxes = np.concatenate((bboxes, indexes.T), axis=1) # concatenate 之后, bboxes 的操作不會(huì)對(duì)外部變量產(chǎn)生影響 # 計(jì)算每個(gè) box 的面積 x1 = bboxes[:, 0] y1 = bboxes[:, 1] x2 = bboxes[:, 2] y2 = bboxes[:, 3] scores = bboxes[:, 4] areas = (x2 - x1 + 1) * (y2 - y1 + 1) for i in range(N): # 找出 i 后面的最大 score 及其下標(biāo) pos = i + 1 if i != N - 1: maxscore = np.max(scores[pos:], axis=0) maxpos = np.argmax(scores[pos:], axis=0) else: maxscore = scores[-1] maxpos = 0 # 如果當(dāng)前 i 的得分小于后面的最大 score, 則與之交換, 確保 i 上的 score 最大 if scores[i] < maxscore: bboxes[[i, maxpos + i + 1]] = bboxes[[maxpos + i + 1, i]] scores[[i, maxpos + i + 1]] = scores[[maxpos + i + 1, i]] areas[[i, maxpos + i + 1]] = areas[[maxpos + i + 1, i]] # IoU calculate xx1 = np.maximum(bboxes[i, 0], bboxes[pos:, 0]) yy1 = np.maximum(bboxes[i, 1], bboxes[pos:, 1]) xx2 = np.minimum(bboxes[i, 2], bboxes[pos:, 2]) yy2 = np.minimum(bboxes[i, 3], bboxes[pos:, 3]) w = np.maximum(0.0, xx2 - xx1 + 1) h = np.maximum(0.0, yy2 - yy1 + 1) intersection = w * h iou = intersection / (areas[i] + areas[pos:] - intersection) # Three methods: 1.linear 2.gaussian 3.original NMS if method == 1: # linear weight = np.ones(iou.shape) weight[iou > Nt] = weight[iou > Nt] - iou[iou > Nt] elif method == 2: # gaussian weight = np.exp(-(iou * iou) / sigma2) else: # original NMS weight = np.ones(iou.shape) weight[iou > Nt] = 0 scores[pos:] = weight * scores[pos:] # select the boxes and keep the corresponding indexes inds = bboxes[:, 5][scores > score_thresh] keep = inds.astype(int) return res_bboxes[keep]
后期我們?cè)敿?xì)給大家說(shuō)說(shuō)NMS一系列知識(shí)!
4、Weighted Boxes Fusion
在這里,我們描述了新的邊界框融合方法:加權(quán)邊界框融合(WBF)。假設(shè),我們已經(jīng)綁定了來(lái)自N個(gè)不同模型的相同圖像的框預(yù)測(cè)。或者,我們對(duì)相同圖像的原始和增強(qiáng)版本(即垂直/水平反射,數(shù)據(jù)增強(qiáng))有相同模型的N個(gè)預(yù)測(cè))。WBF工作如下步驟:
NMS和Soft-NMS都排除了一些框,而WBF則使用了所有框。因此,它可以修復(fù)所有模型都預(yù)測(cè)不準(zhǔn)確的情況。本案例如下圖所示。NMS/Soft-NMS將只留下一個(gè)不準(zhǔn)確的框,而WBF將使用所有預(yù)測(cè)的框來(lái)融合它。
5、實(shí)驗(yàn)結(jié)果
[46]: ZFTurbo. Coco wbf benchmark. https://github. com/ZFTurbo/Weighted-Boxes-Fusion/tree/master/benchmark, 2020.
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。