把不同的资料进行了整合,同时对自己在看的过程中的问题进行了记录。
目录
引言
优点
缺点
V1、V2、V3的共同点
YOLO算法的基本思想是
YOLO v1
相关链接
1、核心思想
2、实现方法
3、网络设计
4、网络训练
5、网络预测
6、损失函数
YOLO v2
相关链接
1、网络设计-32层
2、两大方面的改进
3、精度的改进
4、速度的改进
5、分类的改进
YOLO v3
相关链接
博文里的图片均来自论文本身和部分参考博文(可能没有附完全),如有侵权,请与我联系。
目前,基于深度学习算法的一系列目标检测算法大致可以分为两大流派:
1.两步走(two-stage)算法:先产生候选区域然后再进行CNN分类(RCNN系列),
2.一步走(one-stage)算法:直接对输入图像应用算法并输出类别和相应的定位(YOLO系列)
首先通过特征提取网络对输入图像提取特征,得到一定size的feature map,比如13*13,然后将输入图像分成13*13个grid cell,接着如果ground truth中某个object的中心坐标落在哪个grid cell中,那么就由该grid cell来预测该object,因为每个grid cell都会预测固定数量的bounding box(YOLO v1和v2中是2个,YOLO v3中是3个,这几个bounding box的初始size是不一样的),那么这几个bounding box中最终是由哪一个来预测该object?答案是:这几个bounding box中只有和ground truth的IOU最大的bounding box才是用来预测该object的。
可以看出预测得到的输出feature map有两个维度是提取到的特征的维度,比如13*13,还有一个维度(深度)是B*(5+C),注:YOLO v1中是(B*5+C),其中B表示每个grid cell预测的bounding box的数量,比如YOLO v1中是2个,YOLO v2中是5个,YOLO v3中是3个,C表示bounding box的类别数(没有背景类,所以对于VOC数据集是20),5表示4个坐标信息和一个置信度(objectness score)。
Q1:在哪里实现的划分网格?是直接对输入图片进行网格划分还是对经过特征提取以后进行网格的划分?
Q2:bbox是通过全连接层直接预测出来的,那么具体是怎么预测出来的?需要分析代码!
论文:You Only Look Once: Unified, Real-Time Object Detection
项目主页:http://pjreddie.com/darknet/yolo/
论文阅读:You Only Look Once: Unified, Real-Time Object Detection
darknet版代码:https://github.com/pjreddie/darknet
tensorflow版代码:https://github.com/hizhangp/yolo_tensorflow
源码分析参考:https://zhuanlan.zhihu.com/p/25053311
参考博文1:Object Detection -- 论文YOLO(You Only Look Once: Unified, Real-Time Object Detection)解读
参考博文2:YOLO算法详解
利用整张图作为网络的输入,直接在输出层回归 bounding box(边界框) 的位置及其所属的类别
A. 将一幅图像分成SxS(默认7)个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object
B. 每个单元格通过全连接层直接预测B(默认2)个bounding box值(中心坐标和宽w高h),同时为每个bbox值预测一个置信度(confidence scores=P(objects)*IOU),即每个单元格需要预测B×(4+1)个值
预测框的位置、大小和物体分类都通过CNN暴力predict出来
Q;怎么预测出bbox的?
Answer:不同于Faster RCNN类,每个feature map上的额每一个点对应9个anchor,每个anchor的尺寸都是固定且预先设置的;YOLO的bbox通过回归产生,标注文件是从bbox的[xmin, xmax, ymin, ymax]
计算得到中心坐标。
Q:什么是Bounding Box Regression边框回归?
Answer:微调selective search提取的region proposal,使得微调(平移+尺寸缩放)之后的窗口与Ground Truth更接近
窗口一般使用四维向量(x, y, w, h)来表示, 分别表示窗口的中心点坐标和宽高
说明:
每个单元格预测bbox的四个值都归一化,bbox的高和宽是相对于整张图的占比,bbox的中心点位置是相对于单元格的offset
置信度(confidence scores=P(objects)*IOU)由两部分组成,若bbox包含物体,P(objects)=1;否则,P(objects)=0;IOU为bbox与物体真实区域的交集面积(归一化)
C. 每个单元格需要预测C(分类数)个条件概率值。条件概率定义为Pr(Classi|Object),表示该单元格存在物体且属于第i类的概率
最后网络的输出维度为S×S×(B×5+C)。
以GoogLeNet为基础改进,输入448*448,输出S×S×(B×5+C)=7*7*(2*5+20)的一个tensor,base model共有24个卷积层,2个全连接层。对于卷积层和全连接层,采用Leaky ReLU激活函数。最后一层采用线性激活函数。
A. 预训练。使用ImageNet(224*224)训练前20个卷积层+平均池化+FC层
B. 用A的前20个卷积层的网络参数初始化YOLO前20个卷积层,在此基础上添加4个卷积层和2个FC层,输入resize至448*448
A. 类别C(20)与每个grid(7*7)的B(2)个预测bounding box的confidence相乘,得到该bounding box为不同类的概率,共有7*7*2=98个bbox
在测试的时候,每个单元格预测最终输出的概率定义为,如下图所示,其中,(置信度confidence scores = P(objects)*IOU)
B. 设置阈值,对上一步预测得到的77*2=98个目标窗口,过滤去除低分的bbox
C. 非极大值抑制算法(NMS),去除多余框,得到最终的bbox
D. 对每一列找到最大值,并判断score是否为目标
使用均方误差,loss = coordError(预测与标定之间的坐标误差) + iouError (IOU误差)+ classError(分类误差)
对于相同的误差值,大物体误差对检测的影响小于小物体,因为,相同的位置偏差占大物体的比例远小于同等偏差占小物体的比例。YOLO通过对w、h求平方根来改进,但仍不能完全解决。
论文:YOLO9000: Better, Faster, Stronger
项目主页:YOLO: Real-Time Object Detection
参考博文:YOLOv2 论文笔记
YOLOv2:代表着目前业界最先进物体检测的水平,它的速度要快过其他检测系统(FasterR-CNN,ResNet,SSD),使用者可以在它的速度与精确度之间进行权衡。
YOLO9000:这一网络结构可以实时地检测超过 9000 种物体分类,这归功于它使用了 WordTree,通过 WordTree 来混合检测数据集与识别数据集之中的数据。
Route:25和28是route层(作用:层的合并),即把27和24层合并输入到下一层
Reorg:27层,类似reshape,将26*26*64输出变形到13*13*256,因为26*26*1可以变成13*13*4
说明:
最后输出13*13是169个像素点,每一个像素点都有125层的厚度。而在这一层之后就直接预测了,所以这169*125个数包含了YOLO2需要的所有信息,边框,类别等等。
125指的是25*5,其中5参考faster r-cnn中的anchor建议框,faster r-cnn是9,在YOLO2中变成了5。25=20+4+1,YOLO2在预测20类(VOC数据集),其中:
20是class的分数(probability),就是当前的某一个像素,对应的某个参考框中是某一个class的概率;
4是δ(tx)δ(tx),δ(ty)δ(ty),txtx,tyty,这4个数会被用来计算边框的位置和大小;
1是confidence,表示边框预测里有真正的对象的概率。
A. 使用一系列方法,在保持原速度的同时提高精度
B. 提出目标分类与检测的联合训练方式,YOLO9000实现9000多种物体的实时检测
联合训练算法将两种数据集混合,用分层的观点对物体进行分类。
基本思路:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors),用监测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升鲁棒性。
A. Batch Normalization
改善了收敛速度同时减少了对其他regularization方法的依赖(舍弃dropout优化后依然没有过拟合)
B. High Resolution Classifier高分辨率分类器
目前大部分的检测模型都会在先在ImageNet分类数据集上预训练模型的主体部分(CNN特征提取器),ImageNet分类模型基本采用大小为 224*224 的图片作为输入,分辨率相对较低,不利于检测模型。
YOLOv1在采用 224*224 分类模型预训练后,将分辨率增加至 448*448 ,直接切换分辨率,检测模型可能难以快速适应高分辨率。为了让网路更好地适应新的分辨率,YOLOv2增加了在ImageNet数据集上使用 448*448先在 ImageNet上进行微调10 epochs,这可以使得模型能更好地适用高分辨率输入。
C. Convolutional With Anchor Boxes
去掉了全连接层,引入anchor boxes来预测bounding boxes。YOLO v1只能在每张图给出98个预测框,但是使用了anchor boxes机制之后模型能预测超过1000个框。
D. Dimension clusters
box的规格通过线性回归调整,但如果一开始就选用更合适的prior的话,可以使网络学习更轻松。
使用了欧氏距离的K-means聚类方法类训练bounding boxes,找到更好的boxes宽高维度
采用IOU得分作为评判标准,这样的话,error就和box的尺度无关,
E. Direct location prediction
当在YOLO中使用anchor boxes机制的时候,模型不稳定。尤其早期迭代的时候,不稳定的因素主要来自于为box预测(x,y)位置的时候。在RPN中预测偏移量,YOLO直接预测对于网格单元的相对位置。
F. Fine-Grained Features(细粒度特征)
G. Multi-Scale Training
用多种分辨率的输入图片进行训练
使用基于Googlenet的定制网络——Darknet-19(类似于faster-rcnn使用VGG)
考虑检测数据集不像分类数据集这么成熟,用分类数据集来扩充检测数据集。
联合训练基本思路:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors),用监测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升鲁棒性
用 WordTree 把数据集合中的类别映射到分层树中的同义词上,混合了 ImageNet 与 COCO
论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf
参考博文:yolo系列之yolo v3【深度解析】
tensorflow版代码:https://github.com/YunYang1994/tensorflow-yolov3
源码分析参考:https://mp.weixin.qq.com/s/cq7g1-4oFTftLbmKcpi_aQ
改进点:predictions across scales
借鉴了FPN(feature pyramid networks),采用多尺度对不同size的目标进行检测,越精细的grid cell就可以检测出越精细的物体
yolo v3设定的是每个网格单元预测3个box,所以每个box需要有(x, y, w, h, confidence)五个基本参数,还有80个类别(COCO数据集)的概率。所以3*(5 + 80) = 255。