目标检测 YOLOv5 - YOLOv5的后处理

flyfish

版本:YOLOv5:6.2

C++源码下载地址

 https://github.com/shaoshengsong/DeepSORT

后处理代码在 /detector/YOLOv5/YOLOv5Detector.cpp文件中

在这里插入图片描述
输入节点,name:images
shape NCHW=[1,3,640,640]

输出节点,name: output
shape [1,25200,85]
这样的[1,25200,85]数据怎么就得到了框的坐标,分数,类别这些信息呢?得到这些信息的过程就是后处理。
如下图 有边框的坐标,有分数,有类别


85的意思

85维代表的是
单词的简写
obj = object
conf = conffience
cls = class
框坐标:center_x,center_y, width, height
框置信度:obj_conf
类别置信度:cls1_conf,cls2_conf, … ,cls80_conf
该数据集一共有80 个类
加起来一共85项

25200的意思
需要拆开来看
25200 = ( 80 ∗ 80 + 40 ∗ 40 + 20 ∗ 20 ) ∗ 3 25200= (80*80+40*40 + 20*20) *3 25200=(8080+4040+2020)3
按照stride来划分,以640 × 640像素图像为例
stride分别是8,16,32
640 / 8 = 80,这层网格大小是80 × 80
640 / 16 = 40,这层网格大小是40 × 40
640 / 32 = 20,这层网格大小是20 × 20
如下图
S=20
B=3
C=80
也可以看YOLOv5:50版本的模型输出

产生了这么多框,紧着要去掉多余的

通过阈值和NMS筛选

conf-thres=0.25, confidence threshold
iou-thres=0.45, NMS IoU threshold

第一次筛选 只留下obj_conf > conf_thres的数据
第二次筛选 只留下 (obj_conf * cls_conf) > conf_thres 的数据
是obj_conf 和 cls_conf 两者的乘积作为最后的分数
这里的cls_conf是80个类别置信度中最大的 cls_conf=max(cls1_conf,cls2_conf, ...... ,cls80_conf)

PyTorch版本的nms使用框的坐标是 (x1, y1, x2, y2)
所以要把 (center_x,center_y, width, height) 转换成 (x1, y1, x2, y2)
OpenCV的版本坐标用的是cv::Rect
边框坐标表示方法
通过conf_thres阈值过滤一些框之后的样子
在这里插入图片描述
还有一堆乱七八糟的框,通过NMS再去除,一个目标只有一个框
在这里插入图片描述
扩展 - 在多类别中应用NMS(非极大值抑制)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐