Paddle带你零基础入门深度学习---YoloV3
一、YOLOV3
YoloV3 的⽹络框架有了很⼤的改变,它在“特征融合”上做了很⼤的改进。YoloV3 也有两个版本,⼀个是普通版,⼀个是YoloV3-spp。YoloV3-spp 版本很重要,因为它直接启发了后续的 YoloV4。 YoloV3 采⽤和 YoloV2 同样的 gd 编码⽅式。并也采⽤了 anchor 的思想。它借鉴了特征图⾦字塔 的思想,⽤不同尺度的特征图来检测⽬标。⼩尺⼨特征图感受野⼤,于是⽤来检测⼤尺⼨的物体, ⼤尺⼨的特征图感受野⼩,检测⼩尺⼨的物体。(其实也算是借鉴了 SSD 的思想)
1.网络框架
YoloV3 总共输出 3 个不同尺度的特征图,分别是 19×19,38×38,76×76
后半部分的“特征融合”就借鉴了 FPN 网络。
接下来是 YoloV3-SPP,YoloV3-SPP 的网络结构和 YoloV3 几乎一致,唯一不同的是,YoloV3 借鉴 SPPNET 的思想,增加了 SPP 模块。
特征图 19×19,对应(116 × 90), (156 × 198),(373 × 326) anchor。
特征图38×38,对应(30×61),(62×45),(59× 119) anchor。
特征图76×76,对应(10×13),(16×30),(33×23) anchor。
gd 的编码方式和解码方式和 YoloV2 保持一致,略有不同的是,类别概率输出使用 sigmoid,不再是 softmax。这样一个“负责”区域可以同时输出多个类别。
2.损失函数
3.训练过程
YoloV3 的训练过程,特别是样本的选择和 V1 和 V2 已经完全不一样了。
在 V1 和 V2 中是看 gd 中心所落的负责区域来确定 gd 由哪个点来负责。由于 V3 中有多个最终的 feature map。使用这种策略可能会导致矛盾(即一个 gd 同时属于多个点负责)。所以需要新的方式确定样本由哪个点的区域负责。原则很简单:
所有预测的 pd 中和 gd 的 IOU 最大的那个就是正样本。
作者还创新的把预测 pd 分成三类:
正例:产生回归框 loss 和类别置信度 loss。
负例:只产生置信度 loss。
忽略:不产生任何 loss。
正例:
对任意的 gd,与所有的 pd 计算IOU,IOU 最大那个就是正例。一个pd,只能分配给一个gd。比如第一个 gd 已经匹配了一个正例的 pd,那么下一个 gd,需要在剩下的 pd 中寻找 IOU 最大的作为正例。
负例:
除正例以外(与 gd 计算后 IOU 最大的检测框,但是IOU小于阈值,仍为正例),与全部 gd 的 IOU 都小于阈值(论文中为 0.5),则为负例。
忽略:
除正例以外,与任意一个 gd 的 IOU 大于阈值(论文中为 0.5),则为忽略。
在 YoloV3 中置信域标签直接设置为 1 和0。而不是 YoloV1 的 IOU 值。原因是假设 iou 是0.8,但学习到的可能只有 0.6 总是会低一些。不如直接将标签设为 1 (学习到的可能就是 0.8)。
4. 测试过程
由于有三个特征图,所以需要对三个特征图分别进行预测。
三个特征图一共可以出预测 19 × 19 × 3 + 38 × 38 × 3 + 76 × 76 × 3 = 22743 个 pd 坐标以及对应的类别和置信度。
测试时,选取一个置信度阈值,过滤掉低阈值 box,经过 NMS(非极大值抑制),输出整个网络的预测结果。注意最后要还原到原始坐标。该改成测试模式的模块需要改成测试模式(比如 BatchNorm)