论文下载
在训练中,我们使用误差平方和损失。如果坐标预测的真实值是ˆt*,我们的梯度是真实值减去我们的预测值:ˆt−t。这个真实值可以很容易地通过上述方程的反求来计算。
⛄️ softmax被替代的原因
物体检测任务中可能一个物体有多个标签;
logistic激活函数来完成,这样就能预测每一个类别是/不是
❄️ 为了能检测到不同大小的物体,设计了3个scale
❄️ 左图:对不同的特征图分别利用;右图:不同的特征图融合后进行预测
YOLOv3 物体检测架构(下图源自此处 )
注:
DBL是Darknet53的基本组件 :每个DBL单元由卷积(Conv2D)层、批处理归一化(BN)层和激活函数(Leaky ReLU)组成。
Residual: 残差模块
Concat:张量拼接,会扩充两个张量的维度。Concat和cfg文件中的route功能一样
Add:张量相加,张量直接相加,不会扩充维度。add和cfg文件中的shortcut功能一样。
1、yolov3提取多特征层进行目标检测,一共提取三个特征层,三个特征层位于主干特征提取网络darknet53的不同位置,分别位于中间层,中下层,底层,三个特征层的shape分别为(52,52,256)、(26,26,512)、(13,13,1024),这三个特征层后面用于与上采样后的其他特征层堆叠拼接(Concat)
2、第三个特征层(13,13,1024)进行5次卷积处理(为了特征提取),处理完后一部分用于卷积+上采样UpSampling,另一部分用于输出对应的预测结果(13,13,75),Conv2D 3×3和Conv2D1×1两个卷积起通道调整的作用,调整成输出需要的大小。
3、卷积+上采样后得到(26,26,256)的特征层,然后与Darknet53网络中的特征层(26,26,512)进行拼接,得到的shape为(26,26,768),再进行5次卷积,处理完后一部分用于卷积上采样,另一部分用于输出对应的预测结果(26,26,75),Conv2D 3×3和Conv2D1×1同上为通道调整
4、之后再将3中卷积+上采样的特征层与shape为(52,52,256)的特征层拼接(Concat),再进行卷积得到shape为(52,52,128)的特征层,最后再Conv2D 3×3和Conv2D1×1两个卷积,得到(52,52,75)特征层
残差模块
Darknet53中的残差卷积就是首先进行一次卷积核大小为3X3、步长为2的卷积,该卷积会压缩输入进来的特征层的宽和高,此时我们可以获得一个特征层,我们将该特征层命名为layer。之后我们再对该特征层进行一次1X1的卷积和一次3X3的卷积,并把这个结果加上layer,此时我们便构成了残差结构。通过不断的1X1卷积和3X3卷积以及残差边的叠加,我们便大幅度的加深了网络。残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。
loss的计算过程
λ coord ∑ i = 0 S 2 ∑ j = 0 B 1 i , j o b j [ ( b x − b ^ x ) 2 + ( b y − b ^ y ) 2 + ( b w − b ^ w ) 2 + ( b h − b ^ h ) 2 ] \lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} 1_{i, j}^{o b j}\left[\left(b_{x}-\hat{b}_{x}\right)^{2}+\left(b_{y}-\hat{b}_{y}\right)^{2}+\left(b_{w}-\hat{b}_{w}\right)^{2}+\left(b_{h}-\hat{b}_{h}\right)^{2}\right] λcoord ∑i=0S2∑j=0B1i,jobj[(bx−b^x)2+(by−b^y)2+(bw−b^w)2+(bh−b^h)2]
+ ∑ i = 0 S 2 ∑ j = 0 B 1 i , j o b j [ − log ( p c ) + ∑ i = 1 n B C E ( c ^ i , c i ) ] +\sum_{i=0}^{S^{2}} \sum_{j=0}^{B} 1_{i, j}^{o b j}\left[-\log \left(p_{c}\right)+\sum_{i=1}^{n} B C E\left(\hat{c}_{i}, c_{i}\right)\right] +∑i=0S2∑j=0B1i,jobj[−log(pc)+∑i=1nBCE(c^i,ci)]
+ λ noobj ∑ i = 0 S 2 ∑ j = 0 B 1 i , j noobj [ − log ( 1 − p c ) ] +\lambda_{\text {noobj }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} 1_{i, j}^{\text {noobj }}\left[-\log \left(1-p_{c}\right)\right] +λnoobj ∑i=0S2∑j=0B1i,jnoobj [−log(1−pc)]
其中:
S : S: S: 网格数, 即 S 2 S^{2} S2 为 13 ∗ 13 , 26 ∗ 26 13 * 13,26 * 26 13∗13,26∗26 和 52 ∗ 52 ; 52 * 52 ; 52∗52;
B : B: B: box;
1 i , j o b j 1_{i, j}^{o b j} 1i,jobj : 如果 b o x b o x box 有目标物, 则其值为 1, 否则为 0 ; 0 ; 0;
B C E ( B C E( BCE( binary cross entropy ) : B C E ( c ^ i , c i ) = − c ^ i ∗ log ( c i ) − ( 1 − c ^ i ) ∗ log ( 1 − c i ) ): B C E\left(\hat{c}_{i}, c_{i}\right)=-\hat{c}_{i} * \log \left(c_{i}\right)-\left(1-\hat{c}_{i}\right) * \log \left(1-c_{i}\right) ):BCE(c^i,ci)=−c^i∗log(ci)−(1−c^i)∗log(1−ci)
1 i , j noobj 1_{i, j}^{\text {noobj }} 1i,jnoobj : 如果 b o x b o x box 无目标物, 则其值为 1, 否则为 0 ; 0 ; 0;
损失由三个部分组成:a、正样本,编码后的长宽与xy轴偏移量与预测值的差距。b、正样本,预测结果中置信度的值与1对比;负样本,预测结果中置信度的值与0对比。c、实际存在的框,种类预测结果与实际结果的对比。
上表显示,以一般的 A P A P AP 指标来看,YOLOv3 的表现与SSD 的变体DSSD513 并驾 齐驱。若以 A P 50 ( I O U A P_{50}(I O U AP50(IOU 阈值为 0.5 ) 0.5) 0.5) 来看,则YOLOv3 甚至表现接近RetinaNet, 但上表没有说的事情是不管是RetinaNet 还是DSSD,YOLOv3 的速度都快上3 倍 以上。然而以 A P 75 A P_{75} AP75 来说, YOLOv3 表现反而下滑。
且在小物件的侦测上面, YOLOv3 的表现提升不少。这表明:
作者在这部分将一些徒劳无功的做法记录下来。
Anchor box x, y offset predictions
将的偏移量x,y假设为w或h的倍数,这样的尝试导致模型的不稳定,而且表现不是很理想
Linear x, y predictions instead of logistic.
将activation function 从本来的logistic 改为linear,一样导致mAP下滑。
Focal loss
YOLO 其实利用独立的object score 以及class prediction 解决了Focal Loss 要解决的问题,然而使用Focal Loss 后YOLOv3 却有两个百分点的下降,为什么会这样,作者也不太确定。
Dual IOU thresholds and truth assignment
在Faster-RCNN 中使用了两个阈值来进行训练。当预测的边界框 I O U I O U IOU 大于 0.7 0.7 0.7 则将此视为正样本,介于 0.3 − 0.7 0.3-0.7 0.3−0.7 之间则忽略,小于 0.3 0.3 0.3 便视为负样本。 如将YOLOv3 利用类似的方法进行训练,则无法得到好的结果。
YOLOv3 是一个快速且准确的物件侦测系统,即使在阈值之间表现得差强人意,但在阈值的状况下,它表现得非常好。
在COCO 论文中追求高阈值的表现,对YOLO 作者来说觉得并不是太有意义。事实上,人类无法用肉眼精准看出值在之间的差异,既然如此,只要有一定的精准度,定位精度并不需要追求这么高标准。
作者希望,应用计算机视觉技术的人们,可以将其用在好的、对的事情上面,我们有责任去考量到我们的工作可能对社会造成的危害。
参考:
为什么 YOLOv3 用了 Focal Loss 后 mAP 反而掉了?
[论文] YOLOv3 : An Incremental Improvement
Yolo v3 loss function
What’s new in YOLO v3?
睿智的目标检测26——Pytorch搭建yolo3目标检测平台
How to implement a YOLO (v3) object detector from scratch in PyTorch: Part 1