計(jì)算機(jī)視覺中的目標(biāo)檢測:非極大值抑制技術(shù)詳解_第1頁
計(jì)算機(jī)視覺中的目標(biāo)檢測:非極大值抑制技術(shù)詳解_第2頁
計(jì)算機(jī)視覺中的目標(biāo)檢測:非極大值抑制技術(shù)詳解_第3頁
計(jì)算機(jī)視覺中的目標(biāo)檢測:非極大值抑制技術(shù)詳解_第4頁
計(jì)算機(jī)視覺中的目標(biāo)檢測:非極大值抑制技術(shù)詳解_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

計(jì)算機(jī)視覺中的目標(biāo)檢測:非極大值抑制技術(shù)詳解1計(jì)算機(jī)視覺基礎(chǔ)1.1圖像處理基本概念在計(jì)算機(jī)視覺領(lǐng)域,圖像處理是分析和解釋圖像數(shù)據(jù)的關(guān)鍵步驟。圖像可以被視為由像素組成的二維矩陣,每個(gè)像素?cái)y帶顏色信息。在彩色圖像中,像素通常由紅、綠、藍(lán)(RGB)三個(gè)顏色通道表示,而在灰度圖像中,每個(gè)像素只有一個(gè)強(qiáng)度值。1.1.1像素與圖像格式像素是圖像的基本單位,其顏色或灰度值決定了圖像的外觀。常見的圖像格式包括JPEG、PNG、BMP等,這些格式在存儲(chǔ)和傳輸圖像時(shí)有不同的壓縮和無損特性。1.1.2圖像變換圖像變換是圖像處理中的重要技術(shù),包括縮放、旋轉(zhuǎn)、平移等,用于調(diào)整圖像的大小和位置,以適應(yīng)不同的應(yīng)用場景。例如,使用OpenCV庫可以輕松地對(duì)圖像進(jìn)行變換:importcv2

importnumpyasnp

#讀取圖像

img=cv2.imread('example.jpg')

#縮放圖像

scale_percent=60

width=int(img.shape[1]*scale_percent/100)

height=int(img.shape[0]*scale_percent/100)

dim=(width,height)

resized=cv2.resize(img,dim,interpolation=cv2.INTER_AREA)

#旋轉(zhuǎn)圖像

center=(img.shape[1]//2,img.shape[0]//2)

angle=45

scale=1.0

M=cv2.getRotationMatrix2D(center,angle,scale)

rotated=cv2.warpAffine(img,M,(img.shape[1],img.shape[0]))

#平移圖像

M=np.float32([[1,0,100],[0,1,50]])

shifted=cv2.warpAffine(img,M,(img.shape[1],img.shape[0]))1.1.3圖像濾波圖像濾波用于去除噪聲或增強(qiáng)圖像的某些特征。常見的濾波器包括高斯濾波、中值濾波和均值濾波。例如,使用高斯濾波器平滑圖像:#高斯濾波

blurred=cv2.GaussianBlur(img,(5,5),0)1.2目標(biāo)檢測概述目標(biāo)檢測是計(jì)算機(jī)視覺中的一個(gè)核心任務(wù),旨在識(shí)別圖像或視頻中的特定對(duì)象,并確定它們的位置。這通常涉及到兩個(gè)主要步驟:對(duì)象分類和位置定位。目標(biāo)檢測在自動(dòng)駕駛、安防監(jiān)控、醫(yī)學(xué)影像分析等領(lǐng)域有廣泛的應(yīng)用。1.2.1檢測算法目標(biāo)檢測算法經(jīng)歷了從滑動(dòng)窗口方法到深度學(xué)習(xí)模型的演變?,F(xiàn)代的目標(biāo)檢測算法,如YOLO(YouOnlyLookOnce)、SSD(SingleShotMultiBoxDetector)和FasterR-CNN,利用深度神經(jīng)網(wǎng)絡(luò)來實(shí)現(xiàn)高效和準(zhǔn)確的檢測。1.2.2檢測流程特征提?。菏褂镁矸e神經(jīng)網(wǎng)絡(luò)(CNN)從圖像中提取特征。候選區(qū)域生成:生成可能包含對(duì)象的區(qū)域。分類與定位:對(duì)每個(gè)候選區(qū)域進(jìn)行分類并調(diào)整邊界框以更精確地定位對(duì)象。非極大值抑制:去除重疊的邊界框,保留最有可能的檢測結(jié)果。(注意:此處不展開非極大值抑制的詳細(xì)內(nèi)容,遵循指令要求)1.2.3數(shù)據(jù)集與評(píng)估指標(biāo)目標(biāo)檢測的性能通常在標(biāo)準(zhǔn)數(shù)據(jù)集上進(jìn)行評(píng)估,如COCO、PascalVOC和ImageNet。評(píng)估指標(biāo)包括平均精度(mAP)、召回率(Recall)和精確度(Precision)。#示例:使用PascalVOC數(shù)據(jù)集評(píng)估目標(biāo)檢測模型

frompycocotools.cocoimportCOCO

frompycocotools.cocoevalimportCOCOeval

#初始化COCOAPI

cocoGt=COCO('path/to/annotations.json')

#加載模型預(yù)測結(jié)果

cocoDt=cocoGt.loadRes('path/to/detections.json')

#創(chuàng)建評(píng)估對(duì)象

cocoEval=COCOeval(cocoGt,cocoDt,'bbox')

#運(yùn)行評(píng)估

cocoEval.evaluate()

cocoEval.accumulate()

cocoEval.summarize()以上代碼示例展示了如何使用PascalVOC數(shù)據(jù)集和COCO評(píng)估工具來評(píng)估目標(biāo)檢測模型的性能。通過加載模型的預(yù)測結(jié)果和真實(shí)標(biāo)注,COCOeval類可以計(jì)算出mAP、Precision和Recall等指標(biāo),幫助我們了解模型在檢測任務(wù)上的表現(xiàn)。2非極大值抑制(NMS)原理2.1NMS算法介紹非極大值抑制(Non-MaximumSuppression,NMS)是計(jì)算機(jī)視覺中目標(biāo)檢測算法的一個(gè)關(guān)鍵步驟,用于從多個(gè)重疊的邊界框中選擇最合適的邊界框,以減少冗余的檢測結(jié)果。在目標(biāo)檢測任務(wù)中,模型可能會(huì)預(yù)測出多個(gè)邊界框包圍同一個(gè)目標(biāo),這些邊界框可能具有不同的位置和大小,但它們的置信度得分可能相近。NMS算法通過比較這些邊界框的置信度得分和計(jì)算它們之間的重疊程度,來決定保留哪些邊界框,從而提高檢測結(jié)果的準(zhǔn)確性和清晰度。2.1.1算法流程排序邊界框:首先,根據(jù)邊界框的置信度得分對(duì)所有邊界框進(jìn)行排序。選擇最高得分:從排序后的邊界框列表中選擇得分最高的邊界框。計(jì)算重疊:計(jì)算當(dāng)前最高得分邊界框與其他所有邊界框之間的重疊程度,通常使用交并比(IntersectionoverUnion,IoU)來衡量。去除重疊:移除所有與當(dāng)前最高得分邊界框重疊程度超過預(yù)設(shè)閾值的邊界框。重復(fù)步驟:重復(fù)步驟2至4,直到所有邊界框都被處理。2.1.2代碼示例以下是一個(gè)使用Python實(shí)現(xiàn)的NMS算法示例:importnumpyasnp

defnon_max_suppression(boxes,scores,overlapThresh):

#如果沒有框,返回空列表

iflen(boxes)==0:

return[]

#如果邊界框是整數(shù),轉(zhuǎn)換為浮點(diǎn)數(shù)

ifboxes.dtype.kind=="i":

boxes=boxes.astype("float")

#初始化選擇的邊界框索引列表

pick=[]

#獲取邊界框的坐標(biāo)

x1=boxes[:,0]

y1=boxes[:,1]

x2=boxes[:,2]

y2=boxes[:,3]

#計(jì)算邊界框的面積

area=(x2-x1+1)*(y2-y1+1)

idxs=np.argsort(scores)

#保持邊界框的索引

whilelen(idxs)>0:

#選擇當(dāng)前得分最高的邊界框

last=len(idxs)-1

i=idxs[last]

pick.append(i)

#計(jì)算其余邊界框與當(dāng)前邊界框的交并比

xx1=np.maximum(x1[i],x1[idxs[:last]])

yy1=np.maximum(y1[i],y1[idxs[:last]])

xx2=np.minimum(x2[i],x2[idxs[:last]])

yy2=np.minimum(y2[i],y2[idxs[:last]])

#計(jì)算交集的寬度和高度

w=np.maximum(0,xx2-xx1+1)

h=np.maximum(0,yy2-yy1+1)

#計(jì)算交并比

overlap=(w*h)/area[idxs[:last]]

#移除重疊程度超過閾值的邊界框

idxs=np.delete(idxs,np.concatenate(([last],np.where(overlap>overlapThresh)[0])))

#返回選擇的邊界框索引

returnboxes[pick].astype("int")2.1.3數(shù)據(jù)樣例假設(shè)我們有以下邊界框和它們的置信度得分:boxes=np.array([[10,10,50,50],[20,20,60,60],[15,15,55,55]])

scores=np.array([0.9,0.8,0.85])

overlapThresh=0.5調(diào)用non_max_suppression函數(shù):result=non_max_suppression(boxes,scores,overlapThresh)

print(result)輸出結(jié)果將只包含得分最高且與其他邊界框重疊程度低于閾值的邊界框。2.2NMS在目標(biāo)檢測中的作用在目標(biāo)檢測中,NMS算法的作用是消除冗余的邊界框,確保每個(gè)檢測到的目標(biāo)只被一個(gè)邊界框包圍。這一步驟對(duì)于提高檢測結(jié)果的準(zhǔn)確性和可讀性至關(guān)重要。在深度學(xué)習(xí)模型中,如YOLO、FasterR-CNN等,模型通常會(huì)生成大量的候選邊界框,這些邊界框可能覆蓋了相同的目標(biāo)。NMS通過比較這些邊界框的置信度得分和重疊程度,選擇最合適的邊界框,從而避免了對(duì)同一目標(biāo)的多次標(biāo)記,提高了檢測結(jié)果的精度和效率。2.2.1實(shí)際應(yīng)用在實(shí)際應(yīng)用中,NMS算法的參數(shù)(如重疊閾值)可能需要根據(jù)具體任務(wù)和數(shù)據(jù)集進(jìn)行調(diào)整。例如,在行人檢測任務(wù)中,可能需要一個(gè)較低的重疊閾值,因?yàn)樾腥说纳眢w可能部分重疊,而在車輛檢測任務(wù)中,可能需要一個(gè)較高的重疊閾值,因?yàn)檐囕v之間的重疊較少。2.2.2代碼示例在目標(biāo)檢測模型的后處理階段,NMS通常與模型預(yù)測結(jié)果一起使用。以下是一個(gè)使用PyTorch實(shí)現(xiàn)的NMS示例:importtorch

fromtorchvision.opsimportnms

#假設(shè)模型預(yù)測的邊界框和置信度得分

boxes=torch.tensor([[10,10,50,50],[20,20,60,60],[15,15,55,55]])

scores=torch.tensor([0.9,0.8,0.85])

iou_threshold=0.5

#使用NMS算法

keep=nms(boxes,scores,iou_threshold)

#保留的邊界框

result_boxes=boxes[keep]

print(result_boxes)在這個(gè)例子中,torchvision.ops.nms函數(shù)被用來執(zhí)行NMS算法,返回一個(gè)索引列表,表示哪些邊界框被保留。通過這個(gè)索引列表,我們可以從原始的邊界框列表中選擇最終的檢測結(jié)果。2.2.3總結(jié)非極大值抑制(NMS)是目標(biāo)檢測中一個(gè)重要的后處理步驟,用于消除冗余的邊界框,提高檢測結(jié)果的準(zhǔn)確性和清晰度。通過比較邊界框的置信度得分和計(jì)算它們之間的重疊程度,NMS算法能夠選擇最合適的邊界框,確保每個(gè)目標(biāo)只被一個(gè)邊界框包圍。在實(shí)際應(yīng)用中,NMS的參數(shù)可能需要根據(jù)具體任務(wù)進(jìn)行調(diào)整,以達(dá)到最佳的檢測效果。3NMS算法實(shí)現(xiàn)3.1NMS算法步驟解析3.1.1算法原理非極大值抑制(Non-MaximumSuppression,NMS)是計(jì)算機(jī)視覺中目標(biāo)檢測算法的一個(gè)關(guān)鍵步驟,用于從多個(gè)重疊的邊界框中選擇最合適的邊界框,以減少冗余的檢測結(jié)果。NMS的基本思想是,對(duì)于每個(gè)類別的檢測結(jié)果,首先按邊界框的置信度得分排序,然后從得分最高的邊界框開始,計(jì)算其與其余所有邊界框的交并比(IntersectionoverUnion,IoU),如果IoU超過預(yù)設(shè)的閾值,則認(rèn)為這兩個(gè)邊界框檢測的是同一個(gè)目標(biāo),因此將得分較低的邊界框移除。這一過程會(huì)重復(fù)進(jìn)行,直到所有邊界框都被處理完畢。3.1.2算法步驟得分排序:對(duì)所有邊界框按其置信度得分進(jìn)行降序排序。選擇最高得分框:從排序后的邊界框列表中選擇得分最高的邊界框。計(jì)算IoU:計(jì)算最高得分框與列表中其余所有邊界框的IoU。移除重疊框:將IoU超過閾值的邊界框從列表中移除。重復(fù)步驟2-4:直到列表為空或不再有邊界框與當(dāng)前最高得分框的IoU超過閾值。3.2代碼實(shí)現(xiàn)NMS算法3.2.1示例代碼importnumpyasnp

defnon_max_suppression(boxes,scores,overlapThresh):

"""

實(shí)現(xiàn)非極大值抑制算法。

參數(shù):

boxes(numpyarray):所有邊界框的坐標(biāo),格式為[x1,y1,x2,y2]。

scores(numpyarray):對(duì)應(yīng)于每個(gè)邊界框的置信度得分。

overlapThresh(float):交并比的閾值。

返回:

list:經(jīng)過NMS處理后保留的邊界框的索引列表。

"""

#如果沒有邊界框,直接返回空列表

iflen(boxes)==0:

return[]

#如果邊界框的坐標(biāo)是浮點(diǎn)數(shù),轉(zhuǎn)換為整數(shù)

ifboxes.dtype.kind=="f":

boxes=boxes.astype("int")

#初始化邊界框的索引列表

pick=[]

#按得分排序

idxs=np.argsort(scores)

#保持邊界框的坐標(biāo)

x1=boxes[:,0]

y1=boxes[:,1]

x2=boxes[:,2]

y2=boxes[:,3]

#計(jì)算每個(gè)邊界框的面積

area=(x2-x1+1)*(y2-y1+1)

#從得分最低的邊界框開始處理

whilelen(idxs)>0:

#取出當(dāng)前得分最高的邊界框的索引

last=len(idxs)-1

i=idxs[last]

pick.append(i)

#找到其余所有邊界框的索引

xx1=np.maximum(x1[i],x1[idxs[:last]])

yy1=np.maximum(y1[i],y1[idxs[:last]])

xx2=np.minimum(x2[i],x2[idxs[:last]])

yy2=np.minimum(y2[i],y2[idxs[:last]])

#計(jì)算交集的寬度和高度

w=np.maximum(0,xx2-xx1+1)

h=np.maximum(0,yy2-yy1+1)

#計(jì)算交并比

overlap=(w*h)/area[idxs[:last]]

#移除重疊的邊界框

idxs=np.delete(idxs,np.concatenate(([last],np.where(overlap>overlapThresh)[0])))

#返回保留的邊界框的索引

returnpick

#示例數(shù)據(jù)

boxes=np.array([[10,10,50,50],[20,20,60,60],[30,30,70,70],[100,100,150,150]])

scores=np.array([0.9,0.4,0.8,0.3])

overlapThresh=0.5

#調(diào)用NMS函數(shù)

pick=non_max_suppression(boxes,scores,overlapThresh)

#輸出保留的邊界框

print("保留的邊界框索引:",pick)

print("保留的邊界框:",boxes[pick])3.2.2代碼解釋上述代碼實(shí)現(xiàn)了一個(gè)基本的NMS算法。首先,它定義了一個(gè)non_max_suppression函數(shù),該函數(shù)接受邊界框坐標(biāo)、邊界框的置信度得分和交并比閾值作為輸入。函數(shù)內(nèi)部首先檢查邊界框列表是否為空,如果為空則直接返回空列表。然后,它按得分對(duì)邊界框進(jìn)行排序,并計(jì)算每個(gè)邊界框的面積。接下來,函數(shù)進(jìn)入一個(gè)循環(huán),每次循環(huán)都會(huì)選擇當(dāng)前得分最高的邊界框,并計(jì)算其與其余所有邊界框的交并比。如果交并比超過預(yù)設(shè)的閾值,則將得分較低的邊界框從列表中移除。這一過程會(huì)持續(xù)進(jìn)行,直到所有邊界框都被處理完畢。最后,函數(shù)返回保留的邊界框的索引列表。在示例數(shù)據(jù)中,我們定義了四個(gè)邊界框和對(duì)應(yīng)的得分,然后調(diào)用non_max_suppression函數(shù)進(jìn)行處理。輸出結(jié)果是經(jīng)過NMS處理后保留的邊界框的索引和坐標(biāo),可以看到,得分較低且與得分較高邊界框重疊的邊界框被成功移除了。4NMS的優(yōu)化與變體4.1軟NMS介紹4.1.1原理非極大值抑制(Non-MaximumSuppression,NMS)是目標(biāo)檢測中一個(gè)關(guān)鍵的后處理步驟,用于從多個(gè)重疊的邊界框中選擇最可能的檢測結(jié)果。傳統(tǒng)的NMS通過設(shè)定一個(gè)閾值,當(dāng)兩個(gè)邊界框的交并比(IntersectionoverUnion,IoU)超過這個(gè)閾值時(shí),會(huì)保留得分最高的邊界框,而抑制(即刪除)其他重疊的邊界框。然而,這種硬閾值的設(shè)定可能會(huì)導(dǎo)致一些邊界框被錯(cuò)誤地抑制,尤其是當(dāng)目標(biāo)部分被遮擋時(shí)。軟NMS(SoftNMS)是對(duì)傳統(tǒng)NMS的一種改進(jìn),它不直接刪除重疊的邊界框,而是根據(jù)重疊程度降低這些框的得分,使得得分較低的框自然地被抑制。這種方法更加平滑,可以保留更多的信息,提高檢測的準(zhǔn)確性。4.1.2內(nèi)容軟NMS的核心思想是在計(jì)算IoU時(shí),如果一個(gè)邊界框與當(dāng)前最高得分的框重疊,那么它的得分會(huì)被降低。降低得分的策略可以是線性的,也可以是非線性的,例如使用高斯函數(shù)。具體步驟如下:對(duì)所有邊界框的得分進(jìn)行排序。選擇得分最高的邊界框作為檢測結(jié)果。對(duì)于所有與當(dāng)前最高得分框重疊的邊界框,根據(jù)IoU的大小降低其得分。重復(fù)步驟2和3,直到所有邊界框的得分都低于設(shè)定的閾值。4.1.3示例代碼以下是一個(gè)使用Python實(shí)現(xiàn)的軟NMS示例:importnumpyasnp

defsoft_nms(dets,scores,sigma=0.5,Nt=0.3,threshold=0.001,method=2):

"""

dets:檢測框的坐標(biāo),形狀為[N,4],其中N是檢測框的數(shù)量,4表示[x1,y1,x2,y2]。

scores:檢測框的得分,形狀為[N]。

sigma:高斯函數(shù)的標(biāo)準(zhǔn)差。

Nt:交并比閾值。

threshold:最終保留的檢測框得分閾值。

method:軟NMS的方法,1表示線性方法,2表示高斯方法。

"""

#對(duì)得分進(jìn)行排序

order=scores.argsort()[::-1]

dets=dets[order]

scores=scores[order]

#初始化保留的邊界框和得分

dets_keep=[]

scores_keep=[]

whiledets.size>0:

#選擇得分最高的邊界框

max_score_index=np.argmax(scores)

dets_keep.append(dets[max_score_index])

scores_keep.append(scores[max_score_index])

#計(jì)算IoU

ious=bbox_overlaps(dets,dets[max_score_index])

#根據(jù)IoU降低得分

ifmethod==1:#線性方法

scores=scores*(1-ious)

elifmethod==2:#高斯方法

scores=scores*np.exp(-(ious*ious)/sigma)

#刪除得分低于閾值的邊界框

dets=dets[scores>threshold]

scores=scores[scores>threshold]

returnnp.array(dets_keep),np.array(scores_keep)

defbbox_overlaps(bboxes1,bboxes2):

"""

計(jì)算兩個(gè)邊界框集合之間的IoU。

"""

#計(jì)算每個(gè)邊界框的面積

area1=(bboxes1[:,2]-bboxes1[:,0])*(bboxes1[:,3]-bboxes1[:,1])

area2=(bboxes2[2]-bboxes2[0])*(bboxes2[3]-bboxes2[1])

#計(jì)算交集的左上角和右下角坐標(biāo)

x1=np.maximum(bboxes1[:,0],bboxes2[0])

y1=np.maximum(bboxes1[:,1],bboxes2[1])

x2=np.minimum(bboxes1[:,2],bboxes2[2])

y2=np.minimum(bboxes1[:,3],bboxes2[3])

#計(jì)算交集的面積

w=np.maximum(0,x2-x1)

h=np.maximum(0,y2-y1)

inter=w*h

#計(jì)算并集的面積

union=area1+area2-inter

#計(jì)算IoU

ious=inter/union

returnious4.1.4示例數(shù)據(jù)假設(shè)我們有以下邊界框和得分:dets=np.array([[10,10,50,50],

[20,20,60,60],

[15,15,55,55],

[100,100,150,150]])

scores=np.array([0.9,0.8,0.7,0.6])4.1.5示例解釋在這個(gè)例子中,前三個(gè)邊界框有較大的重疊,而第四個(gè)邊界框與前三個(gè)沒有重疊。使用軟NMS后,前三個(gè)邊界框的得分會(huì)被降低,而第四個(gè)邊界框的得分保持不變。最終,軟NMS會(huì)保留得分最高的邊界框,這通常會(huì)是那些與目標(biāo)最匹配的框。4.2自適應(yīng)NMS與集群NMS4.2.1原理自適應(yīng)NMS(AdaptiveNMS)和集群NMS(ClusterNMS)是NMS的兩種變體,它們旨在解決傳統(tǒng)NMS和軟NMS在處理不同尺度和形狀的目標(biāo)時(shí)的局限性。自適應(yīng)NMS:它根據(jù)目標(biāo)的尺度和形狀動(dòng)態(tài)調(diào)整IoU的閾值。對(duì)于小目標(biāo)或長寬比大的目標(biāo),IoU閾值會(huì)設(shè)置得更高,以減少誤抑制。對(duì)于大目標(biāo)或接近正方形的目標(biāo),IoU閾值會(huì)設(shè)置得更低,以避免過度抑制。集群NMS:它將重疊的邊界框聚類成一組,然后從每個(gè)聚類中選擇得分最高的邊界框。這種方法可以更好地處理密集目標(biāo)的情況,因?yàn)樗紤]了目標(biāo)可能在空間上聚集的特性。4.2.2內(nèi)容自適應(yīng)NMS和集群NMS都是為了提高目標(biāo)檢測的精度和召回率,特別是在處理復(fù)雜場景時(shí)。它們通過更精細(xì)的控制邊界框的抑制過程,避免了不必要的信息丟失,同時(shí)減少了誤檢。4.2.3示例代碼以下是一個(gè)使用Python實(shí)現(xiàn)的自適應(yīng)NMS示例:defadaptive_nms(dets,scores,scale_factor=0.5,aspect_ratio_factor=0.5):

"""

dets:檢測框的坐標(biāo),形狀為[N,4]。

scores:檢測框的得分,形狀為[N]。

scale_factor:尺度調(diào)整因子。

aspect_ratio_factor:長寬比調(diào)整因子。

"""

#計(jì)算每個(gè)邊界框的尺度和長寬比

scales=np.sqrt((dets[:,2]-dets[:,0])*(dets[:,3]-dets[:,1]))

aspect_ratios=(dets[:,2]-dets[:,0])/(dets[:,3]-dets[:,1])

#根據(jù)尺度和長寬比調(diào)整IoU閾值

iou_thresholds=scale_factor*scales+aspect_ratio_factor*aspect_ratios

#初始化保留的邊界框和得分

dets_keep=[]

scores_keep=[]

whiledets.size>0:

#選擇得分最高的邊界框

max_score_index=np.argmax(scores)

dets_keep.append(dets[max_score_index])

scores_keep.append(scores[max_score_index])

#計(jì)算IoU

ious=bbox_overlaps(dets,dets[max_score_index])

#根據(jù)IoU和IoU閾值抑制邊界框

keep=np.where(ious<iou_thresholds[max_score_index])[0]

dets=dets[keep]

scores=scores[keep]

returnnp.array(dets_keep),np.array(scores_keep)4.2.4示例數(shù)據(jù)假設(shè)我們有以下邊界框和得分,以及它們的尺度和長寬比:dets=np.array([[10,10,50,50],

[20,20,60,60],

[15,15,55,55],

[100,100,150,150]])

scores=np.array([0.9,0.8,0.7,0.6])

scales=np.array([20,20,20,25])

aspect_ratios=np.array([1,1,1,1])4.2.5示例解釋在這個(gè)例子中,我們?yōu)槊總€(gè)邊界框計(jì)算了一個(gè)IoU閾值,這個(gè)閾值是根據(jù)尺度和長寬比動(dòng)態(tài)調(diào)整的。自適應(yīng)NMS會(huì)根據(jù)這些閾值來決定哪些邊界框應(yīng)該被抑制,這使得它能夠更靈活地處理不同大小和形狀的目標(biāo)。集群NMS的實(shí)現(xiàn)則需要更復(fù)雜的聚類算法,如K-means,來將邊界框分組,然后在每個(gè)組內(nèi)應(yīng)用NMS。這種方法在處理密集目標(biāo)時(shí)特別有效,因?yàn)樗梢员苊鈱儆谕荒繕?biāo)的多個(gè)邊界框都抑制掉。集群NMS的具體實(shí)現(xiàn)代碼和數(shù)據(jù)樣例將依賴于所使用的聚類算法和具體場景,因此這里不提供具體的代碼示例。5NMS在實(shí)際應(yīng)用中的挑戰(zhàn)5.1重疊目標(biāo)的處理5.1.1原理與挑戰(zhàn)在計(jì)算機(jī)視覺的目標(biāo)檢測任務(wù)中,非極大值抑制(Non-MaximumSuppression,NMS)是一種常用的后處理技術(shù),用于從多個(gè)重疊的邊界框中選擇最合適的檢測結(jié)果。NMS的基本思想是,對(duì)于每個(gè)類別的檢測結(jié)果,首先按置信度排序,然后從最高置信度的邊界框開始,移除所有與之重疊度(IoU,IntersectionoverUnion)超過一定閾值的其他邊界框。然而,在實(shí)際應(yīng)用中,重疊目標(biāo)的處理對(duì)NMS提出了挑戰(zhàn)。挑戰(zhàn)分析多目標(biāo)重疊:在密集場景下,多個(gè)目標(biāo)可能重疊在一起,導(dǎo)致NMS難以準(zhǔn)確區(qū)分哪些邊界框應(yīng)該保留,哪些應(yīng)該抑制。目標(biāo)尺度變化:小目標(biāo)與大目標(biāo)重疊時(shí),NMS可能傾向于保留大目標(biāo)的邊界框,因?yàn)榇竽繕?biāo)的邊界框通常具有更高的置信度,這可能導(dǎo)致小目標(biāo)的檢測結(jié)果被誤抑制。遮擋問題:當(dāng)一個(gè)目標(biāo)部分被另一個(gè)目標(biāo)遮擋時(shí),NMS可能錯(cuò)誤地抑制了被遮擋目標(biāo)的邊界框,即使該邊界框?qū)δ繕?biāo)的檢測是重要的。5.1.2解決方案與改進(jìn)為了解決上述挑戰(zhàn),研究者們提出了多種NMS的改進(jìn)方法:SoftNMSSoftNMS是一種改進(jìn)的NMS算法,它不直接移除重疊的邊界框,而是根據(jù)重疊程度降低其置信度。這樣,即使邊界框重疊,它們?nèi)匀挥袡C(jī)會(huì)被保留,從而提高了小目標(biāo)和遮擋目標(biāo)的檢測率。ClusterNMSClusterNMS通過聚類分析來處理重疊的邊界框,將重疊的邊界框聚類為一組,然后從每個(gè)聚類中選擇最優(yōu)的邊界框。這種方法在處理密集場景下的目標(biāo)檢測時(shí)表現(xiàn)更佳。DistributionNMSDistributionNMS考慮了邊界框的分布情況,通過計(jì)算邊界框的置信度分布來決定哪些邊界框應(yīng)該被抑制。這種方法在處理尺度變化較大的目標(biāo)時(shí)更為有效。5.2小目標(biāo)檢測的難點(diǎn)與NMS的局限性5.2.1小目標(biāo)檢測難點(diǎn)小目標(biāo)檢測是目標(biāo)檢測任務(wù)中的一個(gè)難點(diǎn),主要因?yàn)椋禾卣鞅硎静蛔悖涸诰矸e神經(jīng)網(wǎng)絡(luò)中,小目標(biāo)可能只占據(jù)幾個(gè)像素,導(dǎo)致其特征表示不充分,難以與背景或大目標(biāo)區(qū)分。尺度變化大:小目標(biāo)可能出現(xiàn)在圖像的任何位置,尺度變化范圍大,增加了檢測的難度。遮擋與重疊:小目標(biāo)更容易被其他目標(biāo)遮擋或與之重疊,這使得NMS在處理小目標(biāo)時(shí)的局限性更加明顯。5.2.2NMS的局限性NMS在處理小目標(biāo)檢測時(shí)的局限性主要體現(xiàn)在:置信度閾值:NMS通?;谥眯哦乳撝祦頉Q定哪些邊界框應(yīng)該被抑制,這在處理小目標(biāo)時(shí)可能不準(zhǔn)確,因?yàn)樾∧繕?biāo)的邊界框置信度可能較低。IoU閾值:NMS中的IoU閾值設(shè)置對(duì)小目標(biāo)檢測尤為敏感,過高的閾值可能導(dǎo)致小目標(biāo)的邊界框被誤抑制,而過低的閾值則可能導(dǎo)致邊界框的冗余。5.2.3示例:SoftNMS的實(shí)現(xiàn)以下是一個(gè)使用Python實(shí)現(xiàn)的SoftNMS示例,該示例基于PyTorch框架:importtorch

importnumpyasnp

defsoft_nms(dets,scores,sigma=0.5,Nt=0.3,threshold=0.001,method=2):

"""

PerformSoftNMSonthegivendetections.

Args:

dets(Tensor):Boundingboxes(x1,y1,x2,y2).

scores(Tensor):Detectionscores.

sigma(float):Gaussiandecayparameter.

Nt(float):IoUthresholdforsuppression.

threshold(float):ScorethresholdafterNMS.

method(int):NMSmethod(1:linear,2:gaussian).

Returns:

dets(Tensor):Remainingboundingboxes.

scores(Tensor):Remainingdetectionscores.

"""

#Sortdetectionsbyscore

order=scores.argsort()[::-1]

dets=dets[order]

scores=scores[order]

#Initializevariables

areas=(dets[:,2]-dets[:,0]+1)*(dets[:,3]-dets[:,1]+1)

keep=[]

whiledets.numel()>0:

#Picktheonewithhighestscore

i=dets[0]

keep.append(i)

#ComputeIoUwithotherboxes

xx1=np.maximum(dets[0,0],dets[1:,0])

yy1=np.maximum(dets[0,1],dets[1:,1])

xx2=np.minimum(dets[0,2],dets[1:,2])

yy2=np.minimum(dets[0,3],dets[1:,3])

w=np.maximum(0.0,xx2-xx1+1)

h=np.maximum(0.0,yy2-yy1+1)

inter=w*h

ovr=inter/(areas[0]+areas[1:]-inter)

#Applydecaytoscores

ifmethod==1:#linear

weight=np.ones_like(ovr)

weight[ovr>Nt]=weight[ovr>Nt]-ovr[ovr>Nt]

elifmethod==2:#gaussian

weight=np.exp(-(ovr*ovr)/sigma)

scores[1:]=scores[1:]*weight

#Removesuppresseddetections

keep_idx=np.where(scores>threshold)[0]

dets=dets[keep_idx+1]

scores=scores[keep_idx]

areas=areas[keep_idx]

returndets,scores

#Exampleusage

dets=torch.tensor([[10,10,50,50],[20,20,60,60],[30,30,70,70]])

scores=torch.tensor([0.9,0.8,0.7])

dets,scores=soft_nms(dets,scores)

print("Remainingdetections:",dets)

print("Remainingscores:",scores)5.2.4解釋在上述代碼中,soft_nms函數(shù)接收邊界框和對(duì)應(yīng)的置信度分?jǐn)?shù)作為輸入,然后執(zhí)行SoftNMS算法。邊界框首先按置信度排序,然后計(jì)算每個(gè)邊界框與其他邊界框的IoU。根據(jù)IoU和選擇的NMS方法(線性或高斯),邊界框的置信度分?jǐn)?shù)會(huì)被調(diào)整。最后,只有那些調(diào)整后的分?jǐn)?shù)高于閾值的邊界框會(huì)被保留。通過使用SoftNMS,可以更有效地處理重疊目標(biāo)和小目標(biāo)檢測的問題,提高目標(biāo)檢測的準(zhǔn)確性和召回率。6NMS在現(xiàn)代目標(biāo)檢測框架中的應(yīng)用6.1YOLOv4中的NMS應(yīng)用6.1.1原理與作用非極大值抑制(Non-MaximumSuppression,NMS)是目標(biāo)檢測中一個(gè)關(guān)鍵的后處理步驟,用于從多個(gè)重疊的邊界框中選擇最合適的邊界框,從而提高檢測的準(zhǔn)確性。在YOLOv4中,NMS被用來減少由模型預(yù)測出的多個(gè)邊界框,確保每個(gè)檢測到的對(duì)象只被框定一次。NMS算法流程邊界框得分排序:首先,根據(jù)每個(gè)邊界框的置信度得分進(jìn)行排序。選擇最高得分邊界框:從排序后的邊界框列表中選擇得分最高的邊界框。計(jì)算重疊度:計(jì)算當(dāng)前最高得分邊界框與其他所有邊界框的交并比(IntersectionoverUnion,IoU)。移除重疊邊界框:將IoU超過預(yù)設(shè)閾值的邊界框從列表中移除。重復(fù)步驟2-4:直到列表中沒有邊界框?yàn)橹埂?.1.2代碼示例假設(shè)我們有以下預(yù)測邊界框的列表,每個(gè)邊界框由其左上角和右下角坐標(biāo)表示,以及一個(gè)置信度得分:#假設(shè)的邊界框數(shù)據(jù)

boxes=[

{'x1':100,'y1':100,'x2':200,'y2':200,'score':0.9},

{'x1':120,'y1':120,'x2':220,'y2':220,'score':0.7},

{'x1':110,'y1':110,'x2':210,'y2':210,'score':0.8},

{'x1':200,'y1':200,'x2':300,'y2':300,'score':0.6}

]下面是一個(gè)簡單的NMS實(shí)現(xiàn):defnon_max_suppression(boxes,overlapThresh):

#如果沒有邊界框,直接返回空列表

iflen(boxes)==0:

return[]

#將邊界框按得分降序排序

boxes=sorted(boxes,key=lambdax:x['score'],reverse=True)

#選擇得分最高的邊界框

pick=[]

whilelen(boxes)>0:

#選擇當(dāng)前得分最高的邊界框

last=len(boxes)-1

i=0

pick.append(boxes[i])

suppress=[i]

#計(jì)算當(dāng)前邊界框與其他所有邊界框的IoU

forjinrange(i+1,last):

#計(jì)算IoU

iou=calculate_iou(boxes[i],boxes[j])

#如果IoU超過閾值,將該邊界框添加到抑制列表中

ifiou>overlapThresh:

suppress.append(j)

#從列表中移除抑制的邊界框

boxes=[boxes[k]forkinrange(last)ifknotinsuppress]

#返回最終選擇的邊界框

returnpick

defcalculate_iou(boxA,boxB):

#計(jì)算兩個(gè)邊界框的交并比

xA=max(boxA['x1'],boxB['x1'])

yA=max(boxA['y1'],boxB['y1'])

xB=min(boxA['x2'],boxB['x2'])

yB=min(boxA['y2'],boxB['y2'])

#計(jì)算交集面積

interArea=max(0,xB-xA+1)*max(0,yB-yA+1)

#計(jì)算并集面積

boxAArea=(boxA['x2']-boxA['x1']+1)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論