Mini-batch: 梯度下降需要对所有样本进行处理过后然后走一步,如果样本规模大会导致效率低,这种梯度下降叫full batch。
为了提高效率,将样本分成等量子集, 这些子集就称为mini batch。假如我们用for循环遍历1000个子集, 针对子集做一次梯度下降,然后更新参数w和b的值。接着到下一个子集继续梯度下降。 遍历完所有的mini batch之后相当于在梯度下降中做了1000次迭代,将遍历一次所有样本的行为叫做一个 epoch。在Mini-batch下的梯度下降中做的事情跟full batch一样,只不过我们训练的数据是一个个的子集。 这样在一个epoch中就能进行1000次的梯度下降(走的步数多),而在full batch中只有一次,这提高了算法的运行速度。
自适应锚框计算
之前我们学的 YOLOv3、YOLOv4,对于不同的数据集,都会计算先验框 anchor。然后在训练时,网络会在 anchor 的基础上进行预测,输出预测框,再和标签框进行对比,最后就进行梯度的反向传播。
在YOLO算法中,针对不同的数据集,都会有初始设定长宽的锚框。在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算两者差距,再反向更新,迭代网络参数,因此初始锚框是比较重要的一部分。
在 YOLOv3、YOLOv4 中,训练不同的数据集时,是使用单独的脚本进行初始锚框的计算, 在 YOLOv5 中,则是将此功能嵌入到整个训练代码里中。所以在每次训练开始之前,它都会根据不同的数据集来自适应计算 anchor
自适应图片缩放
在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。YOLO算法中常用416416,608608等尺寸,比如对下面800*600的图像进行缩放。
但YOLOv5代码中对此进行了改进,也是使得YOLOv5推理速度更快的一个trick。在项目实际使用时,很多图片的长宽比不同,因此缩放填充后,两端的黑边大小都不同。填充的比较多,则存在信息冗余,影响推理速度。因此在YOLOv5的代码中datasets.py的letterbox函数中进行了修改,对原始图像自适应的添加最少的黑边。
图像高度上两端的黑边变少,在推理时计算量也会减少,即目标检测速度会得到提升。
注意:填充的是黑色,即(0,0,0),而YOLOv5中填充的是灰色,即(114,114,114),效果相同;
训练时没有采用缩减黑边的方式,还是采用传统填充的方式,即缩放到416*416大小。只是在测试,使用模型推理时,采用缩减黑边的方式,提高目标检测,推理的速度;
为什么np.mod函数的后面用32?
因为Yolov5的网络经过5次下采样,而2的5次方,等于32。所以至少要去掉32的倍数,以免产生尺度太小走不完stride(filter在原图上扫描时,需要跳跃的格数)的问题,再进行取余。
Focus
Yolov5s的Focus结构最后使用了32个卷积核,而其他三种结构,使用的数量有所增加。
CSP(Cross Stage Partial)
主要从网络结构设计的角度解决推理中从计算量很大的问题。CSPNet的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。
CSP1_X 结构主要应用于主干网络,该结构的基本思想是将输入特征图分成两部分,一部分直接进行深层网络的处理,另一部分通过一个或多个跨阶段连接(cross-stage connections)连接到深层网络的输出。这有助于减轻梯度消失的问题,提高信息传递的效率。
在这两个结构中,X 表示一个数字,表示结构中重复使用的块的数量。例如,CSP1_2 表示在主干网络中应用 CSP 结构,其中包含两个重复的块。
每个CSP模块前面的卷积核的大小都是3*3,stride=2,因此可以起到下采样的作用