YOLO | YOLOv2 | YOLOv3 paper &code
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$大小的张量。
网络与损失
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)。
Fine-Grained Features - 提升mAP
- YOLOv2的输入图片大小为416*416 ,经过5次maxpooling之后得到 13*13大小的特征图,并以此特征图采用卷积做预测。但是对于小物体,还需要更精细的特征图(Fine-Grained Features)。
- YOLOv2提出了一种passthrough层来利用更精细的特征图。如下图所示,该层抽取前面层的局部区域,将其转化为channel维度。
Multi-Scale Training - 增强适应性
- YOLOv2模型中只有卷积层和池化层,可输入各种大小的图片。为了增强鲁棒性,YOLOv2采用了多尺度输入训练策略(在训练过程中每间隔一定的iterations之后改变模型的输入图片大小)。下表为2007数据集上的性能对比。
训练与损失
YOLOv3: An Incremental Improvement
性能
改进
- 使用残差模型 - 特征提取器Darknet-53
- 采用FPN架构 - 多尺度特征图
结构
Keras-YOLOv3[^3]
Install
- code[^4]
- download from github directlly
- or clone by git
git clone https://github.com/qqwweee/keras-yolo3.git
- weight
- download the weight https://pjreddie.com/darknet/yolov2/
- then cd to the pathe and translate .cfg to .h5 by
python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
Usage
- Image
python yolo_video.py --image
- then input the path of the image according to the prompt
- Video
- `python yolo_video.py –input xx.mp4
Train
- Generate your VOC dataset.
- Mark sure you have
yolo_weights.h5
- Modify
train.py
and start training.
[^1]: 目标检测|YOLO原理与实现
[^2]: 目标检测|YOLOv2原理与实现(附YOLOv3)
[^3]: (keras)yolov3特定目标检测&自己图片做训练集
[^4]: qqwweee / keras-yolo3