【深度学习】一分钟速学 | NMS, IOU 与 SoftMax
非極大抑制
NMS的英文是Non-maximum suppression的縮寫(xiě)。
簡(jiǎn)單的說(shuō),就是模型給出了多個(gè)重疊在一起的候選框,我們只需要保留一個(gè)就可以了。其他的重疊的候選框就刪掉了,效果可見(jiàn)下圖:
交并比
IoU的英文全稱(chēng)Interp over Union,就是兩個(gè)候選框區(qū)域的交集面積比上并集的面積,用下圖可以理解:
hard-NMS
hard-nms其實(shí)就是經(jīng)典版本的NMS的方法。就是根據(jù)模型給出每個(gè)box的置信度從大到小進(jìn)行排序,然后保留最大的,刪除所以與這個(gè)最大置信度的候選框的IoU大于閾值的其他候選框。
舉個(gè)例子吧,現(xiàn)在有4個(gè)候選框:(box1,0.8),(box2,0.9), (box3,0.7),(box4,0.5)
我們把這四個(gè)候選框按照置信度從大到小排序:box2>box1>box3>box4
現(xiàn)在我們保留置信度最大的候選框box2,然后計(jì)算剩下三個(gè)box與box2之間的IoU,如果IoU大于一個(gè)事先設(shè)置的閾值,那么就刪除這個(gè)box。假設(shè),閾值是0.5:
IoU(box1,box2)=0.1<0.5,保留;
IoU(box3,box2)=0.7<0.5,刪除;
IoU(box4,box2)=0.2<0.5,保留;
現(xiàn)在還有box1和box4,然后再重復(fù)上面的過(guò)程,排序,然后刪除。
下面是python實(shí)現(xiàn)的hard-NMS:
def?hard_nms(box_scores,?iou_threshold,?top_k=-1,?candidate_size=200):"""Args:box_scores?(N,?5):?box的集合,N為框的數(shù)量,5即4(位置信息)+1(可能為物體的概率)iou_threshold:?我們用IOU標(biāo)準(zhǔn)去除多余檢測(cè)框的閾值top_k:?保留多少個(gè)計(jì)算后留下來(lái)的候選框,如果為-1則全保留candidate_size:?參與計(jì)算的boxes數(shù)量Returns:picked:?經(jīng)過(guò)nms計(jì)算后保留下來(lái)的box"""scores?=?box_scores[:,?-1]????????????????#?首先我們?nèi)〕鯾ox中的最后一個(gè)元素也就是當(dāng)前box檢測(cè)到物體的概率boxes?=?box_scores[:,?:-1]????????????????#?取出box中的四個(gè)坐標(biāo)(左上、右下)picked?=?[]??_,?indexes?=?scores.sort(descending=True)?#?按照降序排列所有的物體的概率,得到排序后在原數(shù)組中的索引信息?indexesindexes?=?indexes[:candidate_size]????????#?只保留前?candidate_size?個(gè)?boxes?其余的不考慮了while?len(indexes)?>?0:current?=?indexes[0]??????????????????#?每次取出當(dāng)前在?indexes?中?檢測(cè)到物體概率最大的一個(gè)?picked.append(current.item())?????????#?將這個(gè)最大的存在結(jié)果中if?0?<?top_k?==?len(picked)?or?len(indexes)?==?1:breakcurrent_box?=?boxes[current,?:]???????#?當(dāng)前第一個(gè)也就是最高概率的boxindexes?=?indexes[1:]????????????????rest_boxes?=?boxes[indexes,?:]????????#?剩下其余的boxiou?=?iou_of(?????????????????????????#?將當(dāng)前的box與剩下其余的boxes用IOU標(biāo)準(zhǔn)進(jìn)行篩選rest_boxes,current_box.unsqueeze(0),)indexes?=?indexes[iou?<=?iou_threshold]#?保留與當(dāng)前box的IOU小于一定閾值的boxes,return?box_scores[picked,?:]如何計(jì)算iou的面積呢?實(shí)現(xiàn)方法在下面:
def?area_of(left_top,?right_bottom)?->?torch.Tensor:"""Compute?the?areas?of?rectangles?given?two?corners.Args:left_top?(N,?2):?left?top?corner.right_bottom?(N,?2):?right?bottom?corner.Returns:area?(N):?return?the?area."""hw?=?torch.clamp(right_bottom?-?left_top,?min=0.0)return?hw[...,?0]?*?hw[...,?1]def?iou_of(boxes0,?boxes1,?eps=1e-5):"""Return?interp-over-union?(Jaccard?index)?of?boxes.Args:boxes0?(N,?4):?ground?truth?boxes.boxes1?(N?or?1,?4):?predicted?boxes.eps:?a?small?number?to?avoid?0?as?denominator.Returns:iou?(N):?IoU?values."""overlap_left_top?=?torch.max(boxes0[...,?:2],?boxes1[...,?:2])overlap_right_bottom?=?torch.min(boxes0[...,?2:],?boxes1[...,?2:])overlap_area?=?area_of(overlap_left_top,?overlap_right_bottom)area0?=?area_of(boxes0[...,?:2],?boxes0[...,?2:])area1?=?area_of(boxes1[...,?:2],?boxes1[...,?2:])return?overlap_area?/?(area0?+?area1?-?overlap_area?+?eps)soft-NMS
在密集目標(biāo)檢測(cè)任務(wù)中,hard-NMS會(huì)有一些問(wèn)題,看下面的例子:兩個(gè)物體重疊起來(lái)了,但是根據(jù)hard-NMS綠色的框會(huì)被掉。
Soft-NMS就改動(dòng)了一個(gè)地方。 在判斷最高的置信度的box和其他box的IoU的時(shí)候增加了一個(gè)系數(shù),可以更好的選擇哪些才是多余的box。
對(duì)于hard-NMS來(lái)說(shuō),??的時(shí)候,保留,大于等于的時(shí)候刪除,??表示置信度:
對(duì)于soft-NMS來(lái)說(shuō),??的時(shí)候,保留,大于的時(shí)候削減:
可以看出來(lái),hard-NMS對(duì)于IoU大于閾值的候選框,直接把其置信度變成0,這樣就相當(dāng)于刪除了這個(gè)box;但是soft-NMS的會(huì)根據(jù)IoU的大小,去適當(dāng)?shù)南鳒p置信度,從而留下一些余地。
【如何削減】這里有兩種方法來(lái)降低重疊候選框的置信度:
簡(jiǎn)單的線(xiàn)性衰減;
指數(shù)衰減。其中sigma是常數(shù),一般是0.5.
第二種方法更為常見(jiàn)。
下面是python來(lái)實(shí)現(xiàn)的soft-NMS,其實(shí)跟hard-NMS相比,就多了一行代碼罷了:
def?soft_nms(box_scores,?score_threshold,?sigma=0.5,?top_k=-1):"""Soft?NMS?implementation.References:https://arxiv.org/abs/1704.04503https://github.com/facebookresearch/Detectron/blob/master/detectron/utils/cython_nms.pyxArgs:box_scores?(N,?5):?boxes?in?corner-form?and?probabilities.score_threshold:?boxes?with?scores?less?than?value?are?not?considered.sigma:?the?parameter?in?score?re-computation.scores[i]?=?scores[i]?*?exp(-(iou_i)^2?/?simga)top_k:?keep?top_k?results.?If?k?<=?0,?keep?all?the?results.Returns:picked_box_scores?(K,?5):?results?of?NMS."""picked_box_scores?=?[]while?box_scores.size(0)?>?0:max_score_index?=?torch.argmax(box_scores[:,?4])cur_box_prob?=?torch.tensor(box_scores[max_score_index,?:])picked_box_scores.append(cur_box_prob)if?len(picked_box_scores)?==?top_k?>?0?or?box_scores.size(0)?==?1:breakcur_box?=?cur_box_prob[:-1]box_scores[max_score_index,?:]?=?box_scores[-1,?:]box_scores?=?box_scores[:-1,?:]ious?=?iou_of(cur_box.unsqueeze(0),?box_scores[:,?:-1])#?以下這句是新加的,如果沒(méi)有這句就是Hard-NMS了box_scores[:,?-1]?=?box_scores[:,?-1]?*?torch.exp(-(ious?*?ious)?/?sigma)?box_scores?=?box_scores[box_scores[:,?-1]?>?score_threshold,?:]if?len(picked_box_scores)?>?0:return?torch.stack(picked_box_scores)else:return?torch.tensor([]) 往期精彩回顧適合初學(xué)者入門(mén)人工智能的路線(xiàn)及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線(xiàn)手冊(cè)深度學(xué)習(xí)筆記專(zhuān)輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專(zhuān)輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專(zhuān)輯獲取一折本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開(kāi):https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群請(qǐng)掃碼進(jìn)群:總結(jié)
以上是生活随笔為你收集整理的【深度学习】一分钟速学 | NMS, IOU 与 SoftMax的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 机器学习的数学,从入门到不放弃(文末彩蛋
- 下一篇: 【面试招聘】聊聊求职过程中的技术面试