六、yolov7网络结构图
通过backbone获得3个有效特征层。特征金字塔可以将不同shape的特征层进行特征融合,有利于提取出更好的特征。
yolov7中将neck划分到了head里。
使用MP-1进行下采样,在卷积神经网络中,常见的用于下采样的模块是一个卷积核大小为3 * 3、步长为2 * 2的卷积或者一个步长为2*2的最大池化。池化层和卷积。左边的分支是一个步长为2 * 2的最大池化+1个1 * 1卷积,右边的分支是一个1 * 1卷积+1个卷积核大小为3 * 3、步长为2 * 2的卷积,两个分支的结果在输出时进行拼接。输出的通道数相较于输入没有改变,但是尺寸减半了,相当于复杂版的最大池化层。
目的是压缩宽和高,但是通道数不变。
加强特征提取模块。 作用是扩大感受野。池化核大小为5,9,13,无处理。
class SPPCSPC(nn.Module): # CSP https://github.com/WongKinYiu/CrossStagePartialNetworks def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5, k=(5, 9, 13)): super(SPPCSPC, self).__init__() c_ = int(2 * c2 * e) # hidden channels self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c1, c_, 1, 1) self.cv3 = Conv(c_, c_, 3, 1) self.cv4 = Conv(c_, c_, 1, 1) self.m = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k]) self.cv5 = Conv(4 * c_, c_, 1, 1) self.cv6 = Conv(c_, c_, 3, 1) self.cv7 = Conv(2 * c_, c2, 1, 1) def forward(self, x): x1 = self.cv4(self.cv3(self.cv1(x))) y1 = self.cv6(self.cv5(torch.cat([x1] + [m(x1) for m in self.m], 1))) y2 = self.cv2(x) return self.cv7(torch.cat((y1, y2), dim=1))
在yolov7中,每一个特征层上每一个特征点存在3个先验框。
最后的255可以拆分成3个85,对应3个先验框的85个参数,85可以拆分成4+1+80。
前4个参数用于判断每一个特征点的回归参数,回归参数调整后可以获得预测框;
第5个参数用于判断每一个特征点是否包含物体;
最后80个参数用于判断每一个特征点所包含的物体种类。
七、yolov7x的网络结构图
八、检测模块
测试中用的都是detect模块,在训练中,使用的是Idetect和Iauxdetect模块。I的意思是implicit隐式的意思。对于隐式内容可以通过学习yolo-R来了解。
IDetect
九、文件之间的关系
1、yolov7和yolov7x是常规GPU的模型。yolov7x是在yolov7的基础上在颈部进行堆栈缩放,并使用所提出的复合缩放方法对整个模型的深度和宽度进行缩放得到的。
2、yolov7-d6、yolov7-e6、yolov7-e6e和yolov7-w6是云GPU的模型。对于yolov7-w6,我们使用新提出的复合缩放方法来获得yolov7-e6和yolov7-d6。此外,我们将所提出的E-ELAN用于yolov7-e6,从而完成yolov7-e6e。
3、yolov7-tiny和yolov7-tiny-silu是边缘GPU的模型。它们的区别只在于所使用的激活函数不同。yolov7-tiny它将使用Leaky ReLU作为激活函数。对于其他模型,我们使用SiLU作为激活函数。
十、预测结果的编码
具体可以看看这篇博文:睿智的目标检测61——Pytorch搭建YoloV7目标检测平台
1、获得预测框与得分
我们得到的三个特征层的预测结果并不对应着最终的预测框在图片上的位置,还需要解码才可以完成。
2、得分筛选与非极大抑制
得到最终的预测结果后还要进行得分排序与非极大抑制筛选。
得分筛选:筛选出得分满足confidence置信度的预测框。
非极大抑制:筛选出一定区域内属于同一种类得分最大的框。
十一、损失值部分
1、计算loss所需内容
计算loss实际上是 网络的预测结果和网络的真实结果的对比。
网络的损失由三个部分组成,分别是reg部分、obj部分和cls部分。
reg:特征点的回归参数判断
obj:特征点是否包含物体判断
cls:特征点包含的物体的种类
2、正样本的匹配过程
(1)对每个真实框通过坐标与宽高粗略匹配先验框和特征点
(2)使用SimOTA自适应精确选取每个真实框对应多少个先验框
正样本匹配的概念: 寻找哪些先验框被认为有对应的真实框,并且负责这个真实框的预测。
a. 不再使用iou进行正样本的匹配,而是直接采用高宽比进行匹配。
b. SimOTA自适应匹配
在yolov7中,会计算一个Cost代价矩阵,代表每个真实框和每个特征点之间的代价关系,Cost代价矩阵由两个部分组成:
(1)每个真实框和当前特征点预测框的重合程度;
(2)每个真实框和当前特征点预测框的种类预测准确度;
以上两个值越高,Cost代价越小。
3、计算loss
- Reg部分,由第2部分知道每个真实框对应的先验框,获取到每个框对应的先验框后,取出该先验框对应的预测框,利用真实框和预测框计算CIOU损失,作为Reg部分的Loss组成。
- Obj部分,所有真实框对应的先验框都是正样本,剩余的先验框均为负样本,根据正负样本和特征点的是否包含物体的预测结果计算交叉熵损失,作为Obj部分的Loss组成。
- Cls部分,获取每个框的先验框后,取出该先验框的种类预测结果,根据真实框的种类和先验框的种类预测结果计算交叉熵损失,作为Cls部分的Loss组成。