YOLO[^1]

特征

  • 速度快
  • 定位不够准确,召回率较低

理念

  • CNN网络将图片分割成S*S网格,每个单元格负责检测中心点落在该格子内的目标。

  • 每个单元格预测B个边界框和置信度$confidence_score=Pr(object)*IOU^{truth}_{pred}$式中:前者表示边界框是否包含目标,取0或1;后者是预测和实际框的交并比。

  • 边界框的大小位置用$(x,y,w,h)$表示,分别指边界中心位置(以左上为零点的坐标)与框的宽与高(相对于整个图片的比例)。此外,用$c$表征置信度。

  • 对于单元格还需预测出C个类别概率值,表征的由该单元格负责预测的边界框其目标属于各个类别的概率。 这些概率值其实是在各个边界框置信度下的条件概率,即边界框类别置信度

    $$P_r(Class_i|object)*confidence_score$$

    $$=P_r(Class_i|object)*Pr(object)*IOU^{truth}_{pred}$$

    $$=P_r(Class_i)*IOU^{truth}_{pred}$$

  • 总结,则每个单元格需要预测$B*5+C$个值。整张图的最终预测值为$(B*5+C)*S*S$大小的张量。

网络与损失

img

img

img

YOLOv2[^2]

改进

改进策略

  • Batch Normalization - 提升模型收敛速度,而且可以起到一定正则化效果,降低模型的过拟合

  • High Resolution Classifier - 适应高分辨率输入

    • YOLOv1在采用224*224分类模型预训练后,将分辨率增加至448*448,并使用这个高分辨率在检测数据集上finetune。
    • 以YOLOv2增加了在ImageNet数据集上使用448*448输入来finetune分类网络这一中间过程(10 epochs),这可以使得模型在检测数据集上finetune之前已经适用高分辨率输入。
  • Convolutional With Anchor Boxes - 大大提升召回率,mAP稍降

    CNN特征提取器得到的特征图(feature map)进行卷积来预测每个位置的边界框以及置信度(是否含有物体),并且各个位置设置不同尺度和比例的先验框,所以RPN预测的是边界框相对于先验框(anchor boxes)的offsets值(其实是transform值,详细见Faster R_CNN论文),采用先验框使得模型更容易学习

    • YOLOv1采用全连接层直接对边界框进行预测,其中边界框的宽与高是相对整张图片大小的,而由于各个图片中存在不同尺度和长宽比(scales and ratios)的物体,YOLOv1学习比较困难。
    • YOLOv2借鉴了先验框策略,采用了卷积和anchor boxes来预测边界框。且使用了anchor boxes之后,每个位置的各个anchor box都单独预测一套分类概率值。
  • Dimension Clusters

    • 选取比较合适的先验框维度(长和宽)是,模型更容易学习。YOLOv2采用k-means聚类方法训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标。
  • New Network: Darknet-19 - 减少计算量

    • YOLOv2采用了一个新的基础模型(特征提取器),称为Darknet-19,包括19个卷积层和5个maxpooling层。Darknet-19采用global avgpooling做预测,并且在3*3卷积之间使用1*1卷积来压缩特征图channles以降低模型计算量和参数。
  • Direct location prediction

    • YOLOv2预测边界框中心点相对于对应cell左上角位置的相对偏移值,为了将边界框中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)。

    img

  • Fine-Grained Features - 提升mAP

    • YOLOv2的输入图片大小为416*416 ,经过5次maxpooling之后得到 13*13大小的特征图,并以此特征图采用卷积做预测。但是对于小物体,还需要更精细的特征图(Fine-Grained Features)。
    • YOLOv2提出了一种passthrough层来利用更精细的特征图。如下图所示,该层抽取前面层的局部区域,将其转化为channel维度。

    img

  • Multi-Scale Training - 增强适应性

    • YOLOv2模型中只有卷积层和池化层,可输入各种大小的图片。为了增强鲁棒性,YOLOv2采用了多尺度输入训练策略(在训练过程中每间隔一定的iterations之后改变模型的输入图片大小)。下表为2007数据集上的性能对比。

    img

训练与损失

img

img

YOLOv3: An Incremental Improvement

性能

img

改进

  • 使用残差模型 - 特征提取器Darknet-53
  • 采用FPN架构 - 多尺度特征图

结构

img

Keras-YOLOv3[^3]

Install

  1. code[^4]
    • download from github directlly
    • or clone by git git clone https://github.com/qqwweee/keras-yolo3.git
  2. weight

Usage

  1. Image
    • python yolo_video.py --image
    • then input the path of the image according to the prompt
  2. Video
    • `python yolo_video.py –input xx.mp4

Train

  1. Generate your VOC dataset.
  2. Mark sure you have yolo_weights.h5
  3. Modify train.py and start training.

[^1]: 目标检测|YOLO原理与实现
[^2]: 目标检测|YOLOv2原理与实现(附YOLOv3)
[^3]: (keras)yolov3特定目标检测&自己图片做训练集
[^4]: qqwweee / keras-yolo3

keras-yolo3遇到的一些注意点与解决思路

windows10+keras下的yolov3的快速使用及自己数据集的训练