计算机视觉中的目标检测:非极大值抑制技术详解_第1页
计算机视觉中的目标检测:非极大值抑制技术详解_第2页
计算机视觉中的目标检测:非极大值抑制技术详解_第3页
计算机视觉中的目标检测:非极大值抑制技术详解_第4页
计算机视觉中的目标检测:非极大值抑制技术详解_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机视觉中的目标检测:非极大值抑制技术详解1计算机视觉基础1.1图像处理基本概念在计算机视觉领域,图像处理是分析和解释图像数据的关键步骤。图像可以被视为由像素组成的二维矩阵,每个像素携带颜色信息。在彩色图像中,像素通常由红、绿、蓝(RGB)三个颜色通道表示,而在灰度图像中,每个像素只有一个强度值。1.1.1像素与图像格式像素是图像的基本单位,其颜色或灰度值决定了图像的外观。常见的图像格式包括JPEG、PNG、BMP等,这些格式在存储和传输图像时有不同的压缩和无损特性。1.1.2图像变换图像变换是图像处理中的重要技术,包括缩放、旋转、平移等,用于调整图像的大小和位置,以适应不同的应用场景。例如,使用OpenCV库可以轻松地对图像进行变换: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)

#旋转图像

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图像滤波图像滤波用于去除噪声或增强图像的某些特征。常见的滤波器包括高斯滤波、中值滤波和均值滤波。例如,使用高斯滤波器平滑图像:#高斯滤波

blurred=cv2.GaussianBlur(img,(5,5),0)1.2目标检测概述目标检测是计算机视觉中的一个核心任务,旨在识别图像或视频中的特定对象,并确定它们的位置。这通常涉及到两个主要步骤:对象分类和位置定位。目标检测在自动驾驶、安防监控、医学影像分析等领域有广泛的应用。1.2.1检测算法目标检测算法经历了从滑动窗口方法到深度学习模型的演变。现代的目标检测算法,如YOLO(YouOnlyLookOnce)、SSD(SingleShotMultiBoxDetector)和FasterR-CNN,利用深度神经网络来实现高效和准确的检测。1.2.2检测流程特征提取:使用卷积神经网络(CNN)从图像中提取特征。候选区域生成:生成可能包含对象的区域。分类与定位:对每个候选区域进行分类并调整边界框以更精确地定位对象。非极大值抑制:去除重叠的边界框,保留最有可能的检测结果。(注意:此处不展开非极大值抑制的详细内容,遵循指令要求)1.2.3数据集与评估指标目标检测的性能通常在标准数据集上进行评估,如COCO、PascalVOC和ImageNet。评估指标包括平均精度(mAP)、召回率(Recall)和精确度(Precision)。#示例:使用PascalVOC数据集评估目标检测模型

frompycocotools.cocoimportCOCO

frompycocotools.cocoevalimportCOCOeval

#初始化COCOAPI

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

#加载模型预测结果

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

#创建评估对象

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

#运行评估

cocoEval.evaluate()

cocoEval.accumulate()

cocoEval.summarize()以上代码示例展示了如何使用PascalVOC数据集和COCO评估工具来评估目标检测模型的性能。通过加载模型的预测结果和真实标注,COCOeval类可以计算出mAP、Precision和Recall等指标,帮助我们了解模型在检测任务上的表现。2非极大值抑制(NMS)原理2.1NMS算法介绍非极大值抑制(Non-MaximumSuppression,NMS)是计算机视觉中目标检测算法的一个关键步骤,用于从多个重叠的边界框中选择最合适的边界框,以减少冗余的检测结果。在目标检测任务中,模型可能会预测出多个边界框包围同一个目标,这些边界框可能具有不同的位置和大小,但它们的置信度得分可能相近。NMS算法通过比较这些边界框的置信度得分和计算它们之间的重叠程度,来决定保留哪些边界框,从而提高检测结果的准确性和清晰度。2.1.1算法流程排序边界框:首先,根据边界框的置信度得分对所有边界框进行排序。选择最高得分:从排序后的边界框列表中选择得分最高的边界框。计算重叠:计算当前最高得分边界框与其他所有边界框之间的重叠程度,通常使用交并比(IntersectionoverUnion,IoU)来衡量。去除重叠:移除所有与当前最高得分边界框重叠程度超过预设阈值的边界框。重复步骤:重复步骤2至4,直到所有边界框都被处理。2.1.2代码示例以下是一个使用Python实现的NMS算法示例:importnumpyasnp

defnon_max_suppression(boxes,scores,overlapThresh):

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

iflen(boxes)==0:

return[]

#如果边界框是整数,转换为浮点数

ifboxes.dtype.kind=="i":

boxes=boxes.astype("float")

#初始化选择的边界框索引列表

pick=[]

#获取边界框的坐标

x1=boxes[:,0]

y1=boxes[:,1]

x2=boxes[:,2]

y2=boxes[:,3]

#计算边界框的面积

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

idxs=np.argsort(scores)

#保持边界框的索引

whilelen(idxs)>0:

#选择当前得分最高的边界框

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]])

#计算交集的宽度和高度

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

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

#计算交并比

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数据样例假设我们有以下边界框和它们的置信度得分: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调用non_max_suppression函数:result=non_max_suppression(boxes,scores,overlapThresh)

print(result)输出结果将只包含得分最高且与其他边界框重叠程度低于阈值的边界框。2.2NMS在目标检测中的作用在目标检测中,NMS算法的作用是消除冗余的边界框,确保每个检测到的目标只被一个边界框包围。这一步骤对于提高检测结果的准确性和可读性至关重要。在深度学习模型中,如YOLO、FasterR-CNN等,模型通常会生成大量的候选边界框,这些边界框可能覆盖了相同的目标。NMS通过比较这些边界框的置信度得分和重叠程度,选择最合适的边界框,从而避免了对同一目标的多次标记,提高了检测结果的精度和效率。2.2.1实际应用在实际应用中,NMS算法的参数(如重叠阈值)可能需要根据具体任务和数据集进行调整。例如,在行人检测任务中,可能需要一个较低的重叠阈值,因为行人的身体可能部分重叠,而在车辆检测任务中,可能需要一个较高的重叠阈值,因为车辆之间的重叠较少。2.2.2代码示例在目标检测模型的后处理阶段,NMS通常与模型预测结果一起使用。以下是一个使用PyTorch实现的NMS示例:importtorch

fromtorchvision.opsimportnms

#假设模型预测的边界框和置信度得分

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)在这个例子中,torchvision.ops.nms函数被用来执行NMS算法,返回一个索引列表,表示哪些边界框被保留。通过这个索引列表,我们可以从原始的边界框列表中选择最终的检测结果。2.2.3总结非极大值抑制(NMS)是目标检测中一个重要的后处理步骤,用于消除冗余的边界框,提高检测结果的准确性和清晰度。通过比较边界框的置信度得分和计算它们之间的重叠程度,NMS算法能够选择最合适的边界框,确保每个目标只被一个边界框包围。在实际应用中,NMS的参数可能需要根据具体任务进行调整,以达到最佳的检测效果。3NMS算法实现3.1NMS算法步骤解析3.1.1算法原理非极大值抑制(Non-MaximumSuppression,NMS)是计算机视觉中目标检测算法的一个关键步骤,用于从多个重叠的边界框中选择最合适的边界框,以减少冗余的检测结果。NMS的基本思想是,对于每个类别的检测结果,首先按边界框的置信度得分排序,然后从得分最高的边界框开始,计算其与其余所有边界框的交并比(IntersectionoverUnion,IoU),如果IoU超过预设的阈值,则认为这两个边界框检测的是同一个目标,因此将得分较低的边界框移除。这一过程会重复进行,直到所有边界框都被处理完毕。3.1.2算法步骤得分排序:对所有边界框按其置信度得分进行降序排序。选择最高得分框:从排序后的边界框列表中选择得分最高的边界框。计算IoU:计算最高得分框与列表中其余所有边界框的IoU。移除重叠框:将IoU超过阈值的边界框从列表中移除。重复步骤2-4:直到列表为空或不再有边界框与当前最高得分框的IoU超过阈值。3.2代码实现NMS算法3.2.1示例代码importnumpyasnp

defnon_max_suppression(boxes,scores,overlapThresh):

"""

实现非极大值抑制算法。

参数:

boxes(numpyarray):所有边界框的坐标,格式为[x1,y1,x2,y2]。

scores(numpyarray):对应于每个边界框的置信度得分。

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

返回:

list:经过NMS处理后保留的边界框的索引列表。

"""

#如果没有边界框,直接返回空列表

iflen(boxes)==0:

return[]

#如果边界框的坐标是浮点数,转换为整数

ifboxes.dtype.kind=="f":

boxes=boxes.astype("int")

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

pick=[]

#按得分排序

idxs=np.argsort(scores)

#保持边界框的坐标

x1=boxes[:,0]

y1=boxes[:,1]

x2=boxes[:,2]

y2=boxes[:,3]

#计算每个边界框的面积

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

#从得分最低的边界框开始处理

whilelen(idxs)>0:

#取出当前得分最高的边界框的索引

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]])

#计算交集的宽度和高度

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

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

#计算交并比

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

#移除重叠的边界框

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

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

returnpick

#示例数据

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

#调用NMS函数

pick=non_max_suppression(boxes,scores,overlapThresh)

#输出保留的边界框

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

print("保留的边界框:",boxes[pick])3.2.2代码解释上述代码实现了一个基本的NMS算法。首先,它定义了一个non_max_suppression函数,该函数接受边界框坐标、边界框的置信度得分和交并比阈值作为输入。函数内部首先检查边界框列表是否为空,如果为空则直接返回空列表。然后,它按得分对边界框进行排序,并计算每个边界框的面积。接下来,函数进入一个循环,每次循环都会选择当前得分最高的边界框,并计算其与其余所有边界框的交并比。如果交并比超过预设的阈值,则将得分较低的边界框从列表中移除。这一过程会持续进行,直到所有边界框都被处理完毕。最后,函数返回保留的边界框的索引列表。在示例数据中,我们定义了四个边界框和对应的得分,然后调用non_max_suppression函数进行处理。输出结果是经过NMS处理后保留的边界框的索引和坐标,可以看到,得分较低且与得分较高边界框重叠的边界框被成功移除了。4NMS的优化与变体4.1软NMS介绍4.1.1原理非极大值抑制(Non-MaximumSuppression,NMS)是目标检测中一个关键的后处理步骤,用于从多个重叠的边界框中选择最可能的检测结果。传统的NMS通过设定一个阈值,当两个边界框的交并比(IntersectionoverUnion,IoU)超过这个阈值时,会保留得分最高的边界框,而抑制(即删除)其他重叠的边界框。然而,这种硬阈值的设定可能会导致一些边界框被错误地抑制,尤其是当目标部分被遮挡时。软NMS(SoftNMS)是对传统NMS的一种改进,它不直接删除重叠的边界框,而是根据重叠程度降低这些框的得分,使得得分较低的框自然地被抑制。这种方法更加平滑,可以保留更多的信息,提高检测的准确性。4.1.2内容软NMS的核心思想是在计算IoU时,如果一个边界框与当前最高得分的框重叠,那么它的得分会被降低。降低得分的策略可以是线性的,也可以是非线性的,例如使用高斯函数。具体步骤如下:对所有边界框的得分进行排序。选择得分最高的边界框作为检测结果。对于所有与当前最高得分框重叠的边界框,根据IoU的大小降低其得分。重复步骤2和3,直到所有边界框的得分都低于设定的阈值。4.1.3示例代码以下是一个使用Python实现的软NMS示例:importnumpyasnp

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

"""

dets:检测框的坐标,形状为[N,4],其中N是检测框的数量,4表示[x1,y1,x2,y2]。

scores:检测框的得分,形状为[N]。

sigma:高斯函数的标准差。

Nt:交并比阈值。

threshold:最终保留的检测框得分阈值。

method:软NMS的方法,1表示线性方法,2表示高斯方法。

"""

#对得分进行排序

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])

#计算IoU

ious=bbox_overlaps(dets,dets[max_score_index])

#根据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):

"""

计算两个边界框集合之间的IoU。

"""

#计算每个边界框的面积

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

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

#计算交集的左上角和右下角坐标

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])

#计算交集的面积

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

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

inter=w*h

#计算并集的面积

union=area1+area2-inter

#计算IoU

ious=inter/union

returnious4.1.4示例数据假设我们有以下边界框和得分: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示例解释在这个例子中,前三个边界框有较大的重叠,而第四个边界框与前三个没有重叠。使用软NMS后,前三个边界框的得分会被降低,而第四个边界框的得分保持不变。最终,软NMS会保留得分最高的边界框,这通常会是那些与目标最匹配的框。4.2自适应NMS与集群NMS4.2.1原理自适应NMS(AdaptiveNMS)和集群NMS(ClusterNMS)是NMS的两种变体,它们旨在解决传统NMS和软NMS在处理不同尺度和形状的目标时的局限性。自适应NMS:它根据目标的尺度和形状动态调整IoU的阈值。对于小目标或长宽比大的目标,IoU阈值会设置得更高,以减少误抑制。对于大目标或接近正方形的目标,IoU阈值会设置得更低,以避免过度抑制。集群NMS:它将重叠的边界框聚类成一组,然后从每个聚类中选择得分最高的边界框。这种方法可以更好地处理密集目标的情况,因为它考虑了目标可能在空间上聚集的特性。4.2.2内容自适应NMS和集群NMS都是为了提高目标检测的精度和召回率,特别是在处理复杂场景时。它们通过更精细的控制边界框的抑制过程,避免了不必要的信息丢失,同时减少了误检。4.2.3示例代码以下是一个使用Python实现的自适应NMS示例:defadaptive_nms(dets,scores,scale_factor=0.5,aspect_ratio_factor=0.5):

"""

dets:检测框的坐标,形状为[N,4]。

scores:检测框的得分,形状为[N]。

scale_factor:尺度调整因子。

aspect_ratio_factor:长宽比调整因子。

"""

#计算每个边界框的尺度和长宽比

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

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

#根据尺度和长宽比调整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])

#计算IoU

ious=bbox_overlaps(dets,dets[max_score_index])

#根据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示例数据假设我们有以下边界框和得分,以及它们的尺度和长宽比: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示例解释在这个例子中,我们为每个边界框计算了一个IoU阈值,这个阈值是根据尺度和长宽比动态调整的。自适应NMS会根据这些阈值来决定哪些边界框应该被抑制,这使得它能够更灵活地处理不同大小和形状的目标。集群NMS的实现则需要更复杂的聚类算法,如K-means,来将边界框分组,然后在每个组内应用NMS。这种方法在处理密集目标时特别有效,因为它可以避免将属于同一目标的多个边界框都抑制掉。集群NMS的具体实现代码和数据样例将依赖于所使用的聚类算法和具体场景,因此这里不提供具体的代码示例。5NMS在实际应用中的挑战5.1重叠目标的处理5.1.1原理与挑战在计算机视觉的目标检测任务中,非极大值抑制(Non-MaximumSuppression,NMS)是一种常用的后处理技术,用于从多个重叠的边界框中选择最合适的检测结果。NMS的基本思想是,对于每个类别的检测结果,首先按置信度排序,然后从最高置信度的边界框开始,移除所有与之重叠度(IoU,IntersectionoverUnion)超过一定阈值的其他边界框。然而,在实际应用中,重叠目标的处理对NMS提出了挑战。挑战分析多目标重叠:在密集场景下,多个目标可能重叠在一起,导致NMS难以准确区分哪些边界框应该保留,哪些应该抑制。目标尺度变化:小目标与大目标重叠时,NMS可能倾向于保留大目标的边界框,因为大目标的边界框通常具有更高的置信度,这可能导致小目标的检测结果被误抑制。遮挡问题:当一个目标部分被另一个目标遮挡时,NMS可能错误地抑制了被遮挡目标的边界框,即使该边界框对目标的检测是重要的。5.1.2解决方案与改进为了解决上述挑战,研究者们提出了多种NMS的改进方法:SoftNMSSoftNMS是一种改进的NMS算法,它不直接移除重叠的边界框,而是根据重叠程度降低其置信度。这样,即使边界框重叠,它们仍然有机会被保留,从而提高了小目标和遮挡目标的检测率。ClusterNMSClusterNMS通过聚类分析来处理重叠的边界框,将重叠的边界框聚类为一组,然后从每个聚类中选择最优的边界框。这种方法在处理密集场景下的目标检测时表现更佳。DistributionNMSDistributionNMS考虑了边界框的分布情况,通过计算边界框的置信度分布来决定哪些边界框应该被抑制。这种方法在处理尺度变化较大的目标时更为有效。5.2小目标检测的难点与NMS的局限性5.2.1小目标检测难点小目标检测是目标检测任务中的一个难点,主要因为:特征表示不足:在卷积神经网络中,小目标可能只占据几个像素,导致其特征表示不充分,难以与背景或大目标区分。尺度变化大:小目标可能出现在图像的任何位置,尺度变化范围大,增加了检测的难度。遮挡与重叠:小目标更容易被其他目标遮挡或与之重叠,这使得NMS在处理小目标时的局限性更加明显。5.2.2NMS的局限性NMS在处理小目标检测时的局限性主要体现在:置信度阈值:NMS通常基于置信度阈值来决定哪些边界框应该被抑制,这在处理小目标时可能不准确,因为小目标的边界框置信度可能较低。IoU阈值:NMS中的IoU阈值设置对小目标检测尤为敏感,过高的阈值可能导致小目标的边界框被误抑制,而过低的阈值则可能导致边界框的冗余。5.2.3示例:SoftNMS的实现以下是一个使用Python实现的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函数接收边界框和对应的置信度分数作为输入,然后执行SoftNMS算法。边界框首先按置信度排序,然后计算每个边界框与其他边界框的IoU。根据IoU和选择的NMS方法(线性或高斯),边界框的置信度分数会被调整。最后,只有那些调整后的分数高于阈值的边界框会被保留。通过使用SoftNMS,可以更有效地处理重叠目标和小目标检测的问题,提高目标检测的准确性和召回率。6NMS在现代目标检测框架中的应用6.1YOLOv4中的NMS应用6.1.1原理与作用非极大值抑制(Non-MaximumSuppression,NMS)是目标检测中一个关键的后处理步骤,用于从多个重叠的边界框中选择最合适的边界框,从而提高检测的准确性。在YOLOv4中,NMS被用来减少由模型预测出的多个边界框,确保每个检测到的对象只被框定一次。NMS算法流程边界框得分排序:首先,根据每个边界框的置信度得分进行排序。选择最高得分边界框:从排序后的边界框列表中选择得分最高的边界框。计算重叠度:计算当前最高得分边界框与其他所有边界框的交并比(IntersectionoverUnion,IoU)。移除重叠边界框:将IoU超过预设阈值的边界框从列表中移除。重复步骤2-4:直到列表中没有边界框为止。6.1.2代码示例假设我们有以下预测边界框的列表,每个边界框由其左上角和右下角坐标表示,以及一个置信度得分:#假设的边界框数据

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}

]下面是一个简单的NMS实现:defnon_max_suppression(boxes,overlapThresh):

#如果没有边界框,直接返回空列表

iflen(boxes)==0:

return[]

#将边界框按得分降序排序

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

#选择得分最高的边界框

pick=[]

whilelen(boxes)>0:

#选择当前得分最高的边界框

last=len(boxes)-1

i=0

pick.append(boxes[i])

suppress=[i]

#计算当前边界框与其他所有边界框的IoU

forjinrange(i+1,last):

#计算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):

#计算两个边界框的交并比

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

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

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

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

#计算交集面积

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

#计算并集面积

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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论