【详解】 YOLO V3

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

网络架构

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

在这里插入图片描述
可以看得出来,V3 相较于 V2 的改进有很明显的两点:

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

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

在这里插入图片描述

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

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

在这里插入图片描述

作者在 3 条预测支路采用的也是全卷积结构,其中最后一个卷积层的卷积核个数是 255,是针对 COCO 数据集的 80 类: 3 ∗ ( 80 + 5 ) = 255 3*(80+5)=255 3(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 的结构,所以对于三次检验,每次对应的感受野是不一样的。
在这里插入图片描述

在这里插入图片描述

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 , h w, h w,h 的损失函数依然采用平方差误差之外,其他部分的损失函数用的是二值交叉熵(binary_crossentropy)。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值