0. 写在前面
这篇博文主要是为了记录一下yolov5中的小的记忆点,方便自己查看和理解。
1. 完整过程
(1)Input阶段,图片需要经过数据增强Mosaic,并且初始化一组anchor预设;
(2)特征提取(Backbone):使用Conv、C3、SPPF基本结构对输入图片进行特征提取,Conv用于对输入进行下采样(一共进行了5次下采样);C3用于对输入进行特征提取、融合,丰富特征的语义信息,在这个过程中使用了BoottleNeck减少参数量和计算量、借鉴CSPNet思想增强CNN学习能力;SPPF利用池化、特征融合的方式丰富特征的语义信息,使得最深层的特征图拥有极丰富的语义信息;
(3)加工特征(Neck):v5是三种尺度的特征图融合浅层特征,浅层特征在检测方面有优势,借鉴了PANet,对提取的特征图融合浅层特征,使得特征图既具有丰富的语义信息又具有物体准确的位置信息;
(4)预测目标(Head):对加工后的特征图进行预测,根据损失函数和优化器优化参数权重。
2. 小知识
2.1 特征融合方式
concat: 张量拼接,会扩充两个张量的维度,例如26*26*256和26*26*512张量拼接,结果是26*26*768;
add:张量相加,张量直接相加,不会扩充维度,例如104*104*128和104*104*128相加,结果还是104*104*128。
2.2 anchor
锚框就是在图像上预设好不同大小,不同长宽比的参照框。anchor是由FasterRCNN提出的,anchor解决了scale和aspect ratio变化范围大的问题,即将单元格的预测框控件划分了几个子空间,降低模型学习难度。
输入640*640的图片,经过32倍、16倍和8倍下采样,会产生20*20、40*40和80*80大小的特征图(网格尺寸),特征图的每个像素(该像素对应的视野大小就是网格中的单元格大小)设置3个anchor,因此v5共有(20*20+40*40+80*80)*3 = 25200个anchor。
借助网络训练的强大拟合能力,直接让网络输出每个anchor是否包含(或者说与物体有较大重叠,也就是IoU较大)物体,以及被检测物体相对本anchor的中心点偏移以及长宽比例。因为anchor的位置是固定的,所以就很容易换算出实际物体的位置。
2.3 BottleNeck
目的是减少参数量和计算而设计的,1*1,64 + 3*3,64 + 1*1,256的卷积层替换3*3的卷积层;
假设Input[1,256,10,10],则:
普通卷积参数量:256 * 3 *3 *256+256=590080;计算量FLOPs:256*3*3*256*10*10=58982400;
BottleNeck的参数量:(256*1*1*64+64) + (64*3*3*64+64)+(64*1*1*256+256)=70016;
BottleNeck的计算量:256*1*1*64*10*10+64*3*3*64*10*10+64*1*1*256*10*10 = 6963200;
BottleNeck结构减少了参数量和计算量十分明显。