淘宝app官网,软件优化网站,张家界酒店网站建设,线上维护需要做什么https://zhuanlan.zhihu.com/p/76802514) 文章目录 1. 核心改进1.1主干网络1.2 特征图解码1.2.1 检测框#xff08;位置#xff0c;宽高#xff09;解码1.2.2 检测置信度解码1.2.3 类别解码 1.3 训练损失函数1.3.1 正负样本定义1.3.2 损失函数 1. 核心改进
1.1主干网络
更…https://zhuanlan.zhihu.com/p/76802514) 文章目录 1. 核心改进1.1主干网络1.2 特征图解码1.2.1 检测框位置宽高解码1.2.2 检测置信度解码1.2.3 类别解码 1.3 训练损失函数1.3.1 正负样本定义1.3.2 损失函数 1. 核心改进
1.1主干网络
更深,更宽
从v2的darknet-19到v3的darknet-53
并且引入了ResNet的网络 结构解析
1整个v3结构里面是没有池化层和全连接层的。前向传播过程中张量的尺寸变换是通过改变卷积核的步长来实现的
2yolo v3输出了3个不同尺度的feature map如上图所示的y1, y2, y3。这也是v3论文中提到的为数不多的改进点predictions across scales这个实际借鉴了FPN(feature pyramid networks)采用多尺度来对不同size的目标进行检测越精细的grid cell就可以检测出越精细的物体小尺寸特征图用于检测大尺寸物体大尺寸特征图检测小尺寸物体。
特征图的输出维度为 N × N × 255 N × N × [ 3 × 4 1 80 ] N×N×255 N×N×[3×4180] N×N×255N×N×[3×4180]
N×N 为输出特征图格点数对应原网络中有三种8×8,16×16,32×32
255则对应等式右边的3×4180
3表示一共有3个Anchor框
而对于每个框有4维预测框数值(x, y, w, h 1维预测框置信度confidence80维物体类别数COCO数据集是80类
所以
第一层特征图的输出维度为 8×8×255
第二层特征图输出16×16×255
第三层特征图输出32×32×255
3上采样层(upsample)作用是将小尺寸特征图通过插值等方法生成大尺寸图像。例如使用最近邻插值算法将88的图像变换为1616。上采样层不改变特征图的通道数。
举一个例子
这里我们以 256 × 256 256 \times 256 256×256的输入尺度说明看如下图各个尺寸和通道数的变化
图片出自Algernon 上面的网络输出的最后一个维度255是怎么用来训练呢那就是要经过一个解码的步骤将255按照实际意义**(output_size, output_size, anchor_per_scale, 5 num_classes)**拆解出来才能还原出我们预测的坐标。
1.2 特征图解码
解码就是说我们拿到特征图向量怎么将他与实际的含义匹配呢
1.2.1 检测框位置宽高解码
在Yolov1中网络直接回归检测框的宽、高这样效果有限。所以在Yolov2中改为了回归基于先验框的变化值这样网络的学习难度降低整体精度提升不小。Yolov3沿用了Yolov2中关于先验框的技巧并且使用k-means对数据集中的标签框进行聚类得到类别中心点的9个框作为先验框。先验框可以理解为在这个数据集中我的框普遍是接近这9个框的大小的
我们模型预测到相对于这几个框的
在COCO数据集中原始图片全部resize为416 × 416九个框分别是 (10×13)(16×30)(33×23)(30×61)(62×45)(59× 119) (116 × 90) (156 × 198)(373 × 326) 顺序为( p w , p h p_w,p_h pw,ph) 宽高
实际转换公式如下
其中 b x , b y . b w , b h b_x,b_y.b_w,b_h bx,by.bw,bh是最终解码得到的检测框真实值
b_w,b_h还不是最终的值还需要乘特征图下采样率 t x , t y , t w , t h t_x,t_y,t_w,t_h tx,ty,tw,th是模型预测值 c x , c y c_x,c_y cx,cy是中心点左上角点的相对值 σ \sigma σ 是激活函数论文中作者使用sigmoid 1.2.2 检测置信度解码
置信度在输出85维中占固定一位由sigmoid函数解码即可解码之后数值区间在[01]中
1.2.3 类别解码
COCO数据集有80个类别所以类别数在85维输出中占了80维每一维独立代表一个类别的置信度
不过YOLOv3使用sigmoid激活函数替代了Yolov2中的softmax取消了类别之间的互斥可以使网络更加灵活。
1.3 训练损失函数
1.3.1 正负样本定义
预测框一共分为三种情况正例positive、负例negative、忽略样例ignore对于每一种样例的损失计算方式不同
正例任取一个ground truth与4032个框全部计算IOUIOU最大的预测框即为正例。并且一个预测框只能分配给一个ground truth。例如第一个ground truth已经匹配了一个正例检测框那么下一个ground truth就在余下的4031个检测框中寻找IOU最大的检测框作为正例。ground truth的先后顺序可忽略。正例产生置信度loss、检测框loss、类别loss。预测框为对应的ground truth box标签需要反向编码使用真实的x、y、w、h计算出 类别标签对应类别为1其余为0置信度标签为1。忽略样例正例除外与任意一个ground truth的IOU大于阈值论文中使用0.5则为忽略样例。忽略样例不产生任何loss。负例正例除外与ground truth计算后IOU最大的检测框但是IOU小于阈值仍为正例与全部ground truth的IOU都小于阈值0.5则为负例。负例只有置信度产生loss置信度标签为0。
1.3.2 损失函数
最终损失函数为 Yolov3 Loss为三个特征图Loss之和 其中 λ \lambda λ为权重常数控制检测框Loss、obj置信度Loss、noobj置信度Loss之间的比例通常负例的个数是正例的几十倍以上可以通过权重超参控制检测效果。 1 i j o b j \mathbf{1}_{ij}^{obj} 1ijobj 在正样本时正例则输出1否则为0 1 i j n o o b j \mathbf{1}_{ij}^{noobj} 1ijnoobj 在负样本呢则输出1否则为0 忽略样例都输出0 x、y、w、h使用MSE作为损失函数也可以使用smooth L1 loss作为损失函数。smooth L1可以使训练更加平滑。置信度、类别标签由于是01二分类所以使用交叉熵作为损失函数。
Algeronon对YOLOv3的这部分思考我觉得超级赞引用如下
ground truth为什么不按照中心点分配对应的预测box
1在Yolov3的训练策略中不再像Yolov1那样每个cell负责中心落在该cell中的ground truth。原因是Yolov3一共产生3个特征图3个特征图上的cell中心是有重合的。训练时可能最契合的是特征图1的第3个box但是推理的时候特征图2的第1个box置信度最高。所以Yolov3的训练不再按照ground truth中心点严格分配指定cell而是根据预测值寻找IOU最大的预测框作为正例。
2笔者实验结果第一种ground truth先从9个先验框中确定最接近的先验框这样可以确定ground truth所属第几个特征图以及第几个box位置之后根据中心点进一步分配。第二种全部4032个输出框直接和ground truth计算IOU取IOU最高的cell分配ground truth。第二种计算方式的IOU数值往往都比第一种要高这样wh与xy的loss较小网络可以更加关注类别和置信度的学习其次在推理时是按照置信度排序再进行nms筛选第二种训练方式每次给ground truth分配的box都是最契合的box给这样的box置信度打1的标签更加合理最接近的box在推理时更容易被发现。
Yolov1中的置信度标签就是预测框与真实框的IOUYolov3为什么是1
1置信度意味着该预测框是或者不是一个真实物体是一个二分类所以标签是1、0更加合理。
2笔者实验结果第一种置信度标签取预测框与真实框的IOU第二种置信度标签取1。第一种的结果是在训练时有些预测框与真实框的IOU极限值就是0.7左右置信度以0.7作为标签置信度学习有一些偏差最后学到的数值是0.50.6那么假设推理时的激活阈值为0.7这个检测框就被过滤掉了。但是IOU为0.7的预测框其实已经是比较好的学习样例了。尤其是coco中的小像素物体几个像素就可能很大程度影响IOU所以第一种训练方法中置信度的标签始终很小无法有效学习导致检测召回率不高。而检测框趋于收敛IOU收敛至1置信度就可以学习到1这样的设想太过理想化。而使用第二种方法召回率明显提升了很高。
为什么有忽略样例
1忽略样例是Yolov3中的点睛之笔。由于Yolov3使用了多尺度特征图不同尺度的特征图之间会有重合检测部分。比如有一个真实物体在训练时被分配到的检测框是特征图1的第三个boxIOU达0.98此时恰好特征图2的第一个box与该ground truth的IOU达0.95也检测到了该ground truth如果此时给其置信度强行打0的标签网络学习效果会不理想。
代码
qqwweee/keras-yolo3: A Keras implementation of YOLOv3 (Tensorflow backend) (github.com)
参考
【论文解读】Yolo三部曲解读——Yolov3 - 知乎 (zhihu.com)
写给小白的YOLO介绍 - 知乎 (zhihu.com)
YOLO系列详解YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5、YOLOv6、YOLOv7_AI追随者的博客-CSDN博客
目标检测评价标准mAP - 知乎 (zhihu.com)
个人工作平台 (datafountain.cn)
yolo系列之yolo v3【深度解析】_yolov3-CSDN博客
从零开始PyTorch项目YOLO v3目标检测实现 | 机器之心 (jiqizhixin.com)
[从零开始 PyTorch 项目YOLO v3 目标检测实现下 | 机器之心 (jiqizhixin.com)](https://www.jiqizhixin.com/articles/042602?fromsyncedkeyword从零开始PyTorch项目YOLO v3目标检测实现)