赞
踩
目标检测 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=(80∗80+40∗40+20∗20)∗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(非极大值抑制)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。