欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【详解】 YOLO V3

程序员文章站 2024-03-18 20:58:28
...

对于 YOLO V3,我们就不逐条逐条分析了,因为原文的作者也认为 V3 只是对他们一年工作的总结,不能称为一篇完整的论文。

网络架构

直接来看看网络架构吧 ()(()( * ̄▽ ̄)((≧︶≦*)

【详解】 YOLO V3
可以看得出来,V3 相较于 V2 的改进有很明显的两点:

  • 使用了残差模型
  • 加入了 FPN

作者将 Darknet-19 改成了 Darknet-53,在 ImageNet 上的实验也表明了 Darknet-53 确实有很强的表现,对比 ResNet-152 和 ResNet-101, 三者的分类精度相差不多,但是 Darknet-53 的计算速度快了不少。

【详解】 YOLO V3

V3 使用了darknet-53 的前面 52 层,丢掉了全连接层。V3 是一个全卷积网络,大量使用残差跳层连接,8x 代表重复了 8 次,并且为了降低池化带来的梯度负面效果,作者直接摒弃了 pooling,用 stride = 2 的 3x3 conv 来实现降采样。在这个网络结构中,使用的是步长为2的卷积来进行降采样。

为了加强算法对小目标检测的精确度,V3 中采用类似 FPN 的 upsampling 和 融合做法(最后融合了3个scale,分别是 13x13、 26×26 和 52×52 ),在多个尺寸的特征图上进行检测。

【详解】 YOLO V3

作者在 3 条预测支路采用的也是全卷积结构,其中最后一个卷积层的卷积核个数是 255,是针对 COCO 数据集的 80 类:3(80+5)=2553*(80+5)=255,3 表示 YOLO V3 中一个网格包含 3 个 boxes,5 表示每个 box 的参数。

Some tricks

Bounding box prediction

大部分是延续 V2 的内容,如果 V2 哪里对 anchor boxes 没有理解的,这里可以再深入一下。(既然这里说到了,我就多提一句,虽然应该是写在 V2 的博客里面的:anchor box 和 bounding box prior 是一样的东西,只是在 V2 的博文里面我把先验框全部叫做 anchor box 了 ʅ´ʃʅ(´◔౪◔)ʃ

不同于 V2 的是 V3 多了类似 FPN 的结构,所以对于三次检验,每次对应的感受野是不一样的。
【详解】 YOLO V3

【详解】 YOLO V3

Loss func

V3 不同于之前的最大一点就是,不再使用 softmax 了,而对检测到的物体进行多标签分类。V3 之前的模型都是用 softmax 获取类别得分并用得分最高的标签表示 bounding box 内的物体。

softmax 分类依赖于这样一个前提,即分类是相互独立的,换句话说,如果一个目标属于一种类别,那么它就不能属于另一种。

但是,当我们的数据集中存在狗或德牧的标签时,上面所提到的前提就是去了意义。这就是作者为什么不用 softmax,而用 logistic regression 来预测每个类别得分并使用一个阈值来对目标进行多标签预测。比阈值高的类别就是这个边界框真正的类别。

用简单一点的语言来说,其实就是对每种类别使用二分类的 logistic regression,即你要么是这种类别要么就不是,然后遍历所有类别,得到所有类别的得分,然后选取大于阈值的类别就好了。

xy_loss = object_mask * box_loss_scale * K.binary_crossentropy(raw_true_xy, raw_pred[..., 0:2], from_logits=True)
wh_loss = object_mask * box_loss_scale * 0.5 * K.square(raw_true_wh - raw_pred[..., 2:4])
confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True) + (1 - object_mask) * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True) * ignore_mask
class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[..., 5:], from_logits=True)

xy_loss = K.sum(xy_loss) / mf
wh_loss = K.sum(wh_loss) / mf
confidence_loss = K.sum(confidence_loss) / mf
class_loss = K.sum(class_loss) / mf
loss += xy_loss + wh_loss + confidence_loss + class_loss

以上是一段 keras 框架描述的 YOLO V3 的 loss func 代码。从上述代码看出:除了 w,hw, h 的损失函数依然采用平方差误差之外,其他部分的损失函数用的是二值交叉熵(binary_crossentropy)。

好的,到此为止 YOLO 家族终于解放了 (。・∀・)ノ゙ (。・∀・)ノ゙ (。・∀・)ノ゙ (。・∀・)ノ゙

如果,你觉得不够还想看 YOLOV4 的话,我们继续

相关标签: 深度学习