YOLOv3学习笔记

YOLOv3

YOLO v1学习笔记:https://blog.csdn.net/JSerenity/article/details/88598503
YOLO v2学习笔记:https://blog.csdn.net/JSerenity/article/details/88672337

Bounding box prediction & cost function calculation

YOLOv3用logistic regression为每一个bounding box预测一个objectness score。即这块位置是目标的可能性有多大。这一步是在predict之前进行的,可以去掉不必要anchor,可以减少计算量。如果模板框不是最佳的即使它超过我们设定的阈值,我们还是不会对它进行predict。不同于faster R-CNN的是,yolo_v3只会对1个prior进行操作,也就是那个最佳prior。而logistic回归就是用来从9个anchor priors中找到objectness score(目标存在可能性得分)最高的那一个。logistic回归就是用曲线对prior相对于 objectness score映射关系的线性建模。如果一个prior和GT的重叠度大于其他的prior,则它的objectness score应该为1。另外的高于预设threshold(默认值为5)的priors不会有cost。每一个GT物体只与一个prior相关联。如果一个prior没有GT与之相关联,则不会导致分类和位置误差,而只有objectness误差。

bx=σ(tx)+cxb_x = \sigma(t_x) + c_x

by=σ(ty)+cyb_y = \sigma(t_y) + c_y

bw=pwetwb_w = p_we^{t_w}

bh=phethb_h = p_he^{t_h}

Feature Pyramid Networks(FPN) like Feature Pyramid

YOLOv3在每一个格子上做3个预测。每个预测包含一个boundary box,一个objectness和80类别得分。(N×N×[3×(4+1+80)])(N \times N \times [3 \times(4+1+80)])

  1. 最后一层feature map
  2. 退回2层然后上采样
  3. 重复2

YOLOv3同样使用k-means聚类来决定9个priors。对于COCO,这9个priors分别为(10×13),(16×30),(33×23),(30×61),(62×45),(59× 119),(116 × 90),(156 × 198),(373 × 326)。这9个priors将按比例调整为3组9个的priors以适应不同尺度的feature map。

Feature extractor

一个新的53层的Darknet-53替换了Darknet-19.

Darknet-53

YOLOv3再次通过牺牲速度来提高精度。精度的提升得益于更复杂的网络结构Darknet的提升。

YOLOv2使用的Darknet-19缺乏了许多重要的被广泛使用的元素如:残差块、跳跃连接和上取样。YOLOv3则包含了这些重要内容。

Darknet-53用53层网络在Imagenet上面训练,然后再增加53层训练检测任务。一共使用了106层卷积层。这是为什么YOLOv3比v2要慢。

YOLOv3学习笔记

Detection at three Scales

YOLOv3最显著的特点是在三个不同尺度的feature maps上做预测。yolo v3输出了3个不同尺度的feature map,然后使用1x1的卷积核在这三个feature maps上卷积完成预测。

第一次预测:在82层,feature map大小为13x13x255。

第二次预测:对79层的feature map进行几层卷积,再进行2x上采样得到26x26维。然后和61层连接起来。然后,再次对它进行几个1x1卷积层处理,以融合61层的特征。在94层,feature map大小为26x26x255。

第二次预测:像第二次预测类似,最后在106层,feature map大小为52x52x255。

上采样层与前面的卷积层相连,有助于保留细粒度特征,有助于检测小物体,以帮助解决YOLOv2的痛点。

13x13的层负责检测大物体,26x26的层负责检测中等大小物体,52x52的层负责检测小物体。

Class Prediction

YOLOv3将用于计算输入属于某一类的可能性的softmax替换为一个独立的logistic分类器。YOLOv3使用binary cross-entropy loss而不是使用mean square error去计算分类误差。这也通过避免softmax函数降低了计算复杂度。

Loss function

下面是YOLOv1和v2使用的loss function。最后的三项使用的squared errors。在YOLOv3中他们被cross-entropy error所代替。换句话说,object confidence和class predictions通过logistic regression来预测。

YOLOv3学习笔记

loss function的代码:

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

YOLO特点:

  • YOLO将图像划分为SxS的网格,每个格子预测bouding box。

  • 采用leaky ReLU作为**函数。

  • 端到端训练。

  • 从yolo_v2开始,yolo就用batch normalization作为正则化、加速收敛和避免过拟合的方法,把BN层和leaky relu层接到每一层卷积层之后。

  • 可以灵活切换backbone网络,在速度和准确率之间tradeoff。

  • yolo每一代的提升很大一部分决定于backbone网络的提升。

论文:https://pjreddie.com/media/files/papers/YOLOv3.pdf

参考:

https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b

https://medium.com/@jonathan_hui/real-time-object-detection-with-yolo-yolov2-28b1b93e2088

https://blog.csdn.net/leviopku/article/details/82660381