关于yolov5后处理细节

这篇博客详细记录了YoloV5模型的后处理步骤,包括两次conf_thres筛选、坐标转换及NMS处理。在NMS中,为避免不同类别间的相互影响,会在坐标上加上最大像素值。文章还更新了解释为何在坐标上加最大像素值的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近日做项目遇到yolov5后处理操作,有点记不太清楚,所以想记录下来,方便后期复习。

我们都知道,yolov5模型的输入三个feature map的集合,加上batch的维度,也就是三维张量,即[batch,(p3*p3+p4*p4+p5*p5)*3,4+conf+cls_num],模型输出的为相对于调整图片的xywh,然后后面就要进入后处理阶段。

后处理采用了两次阈值筛选,然后送入了nms处理。

 

两次筛选都用的是conf_thres,只有nms求IOU的时候采用的iou_thresh.

 首先,通过tensor的性质提取classes numbers,筛选出大于confience socre的box,得到的xc为bool,并采用assert进行阈值界限设置。

 第一个for循环于图片数量的单张预测,即提取张量[(p3*p3+p4*p4+p5*p5)*3,5+cls_nums],取出大于阈值的box, 如果有labels将labels加入到筛选的box后边,如果没有box,就继续下一张图片。

然后计算class confidence。

这段代码开始是将xywh转化为xyxy(相对于resize图像),后面是mutil labels和single label的处理。

如果是mutil labels, 筛选出大于阈值的box,nonzero()得到位置索引[[i-n,j-n],[i,j],[i+n,j+n]...],利用转置得到i,j,分别表示第i个框,第j个类别。最后x保留为6维,分别是,xyxy,conf,cls,其中的conf 为类别置信度。single label 只保留类别置信度最大的置信度就可以了。

参数 classes为需要筛选掉的类别,不得不说大神对于pytorch的熟练,一行代码全解决。

 然后对boxes进行降序排序,并利用max_nms保留nms的最大数量,但是没看懂为什么要在坐标值上加个最大像素值然后进行nms,感觉加不加都一样。。。。sorces为类别置信度得分。然后送入到标准的nms接口进行nms处理。

2023.11.23更新

至于为什么要在坐标值上加上个最大像素再进行nms,这里再更新一下,这是因为在做nms时是对每一个类别进行nms,对于不同的类别通过加上不同的值,使得不同类别的相互重叠的框分离开,使得每个类别在进行nms时互相不受影响。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值