前言
目标检测是计算机视觉中的一个比较中间层面的任务,检测的步骤包括两部分:目标定位和目标检测,定位是为了找到物体在图像中的位置,而检测是为了将这个物体是什么返回出来,这就是两个阶段的检测,俗称two-stage,也就是两阶段检测。
可以自己想一想,如果让你来设计一个方式,给一个图片自动找出目标物体,你会怎么设计?请保持这个疑问继续往下看。
DPM
Deformable Part-based Model
在深度学习流行之前,它是计算机视觉中物体检测的重要技术之一
使用一个滑窗(sliding window)在整张图像上均匀滑动,用SVM分类器评估是否有物体。
R-CNN
Region-based Convolutional Neural Network
提出来候选区的方法:region proposals
什么意思呢?就是先从图像中找到一些可能存在对象的候选区potential bounding box,这个过程叫做\(selective-serach\),在实际利用模型的时候大概有2000个左右,然后用分类器来评估这些boxes,接着通过post-processing来改善bounding boxes,消除重复的检测目标,并基于整个场景中的其他物体重新对boxes进行打分。整个流程执行下来很慢,而且因为这些环节都是分开训练的,检测性能很难进行优化。
Fast R-CNN ->Faster R-CNN
这些就是将R-CNN的性能进行提升
YOLOv1
You Only Look Once
想象为什么叫这个名字。人们在看到一张图片的时候只需要看一眼,就能大致知道物体的位置和种类信息,那么就是这个一眼,被迁移到了这个算法中进行实现了。
是将物体检测当做回归任务,直接将整张图像所有像素都输入得到bopunding box的坐标,box中几包含物体的置信度和class probilities。实现了端到端。
YOLO将候选区和目标检测合二为一。
首先
作者将原始图像分割成了\(S\times S\)个网格,使用这种预定义的类似候选区的预测区域方式取代了R-CNN的候选区,论文中S等于7,也就是49个网格(下文要用到,敲黑板)
网络结构
先按下不表怎么实现的,我们先来看看这个网络是什么样子的。
一张\(448\times448\times3\)的图片输入,最终输出一个\(7\times7\times30\)的张量。还记得前面的网格吗?没错,每一个网格都被拓展为\(1\times1\times30\)的向量了,一共49个,所以输出是:\(7\times7\times30\)。
那么这时候有人就会有疑问了?
那么如果存在跨网格的对象是不是就难以识别呢,其实不然,经过卷积神经网络的复杂提取和变换,网格周围的信息其实也被编码到这个30维向量中了。
这30维向量其实长这个样子。
前20个代表着设计之初的20种目标在该位置的概率,\(P(C_i|Object)\)表示若该网格存在一个目标,它是\(C_i\)的概率出现。
最后8个值表示两个bounding box的位置,每个bounding box需要四个值来表示,分别为\((center_x,center_y,width,height)\)
以及置信度confidence,表示每个bounding box的置信度。
上式含义为bounding box的置信度等于该bounding box内存在目标的概率和该bounding box与实际bounding box的IOU乘积。
这是针对训练而言的,也就是用于计算预测准确程度的损失函数的一部分,实际使用训练好的YOLO算法是没有实际的bounding box进行参考的,因而没有IOU。简单说来,bounding box的置信度表示它是否包含目标且位置准确的程度。
\[\begin{array}{c} \lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}{i j}^{\text {obj }}\left[\left(x{i}-\hat{x}{i}\right)^{2}+\left(y{i}-\hat{y}{i}\right)^{2}\right] \ +\lambda{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}{i j}^{\text {obj }}\left[(\sqrt{w{i}}-\sqrt{\hat{w}{i}})^{2}+(\sqrt{h{i}}-\sqrt{\hat{h}{i}})^{2}\right] \ +\sum{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}{i j}^{\text {obj }}\left(C{i}-\hat{C}{i}\right)^{2} \ +\lambda{\text {noobj } j} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}{i j}^{\text {noobj }}\left(C{i}-\hat{C}{i}\right)^{2} \ +\sum{i=0}^{S^{2}} \mathbb{1}{i}^{\text {obj }} \sum{c \in \text { classes }}\left(p_{i}(c)-\hat{p}_{i}(c)\right)^{2} \end{array} \]上式第一行表示边框中心位置误差((cx,cy)误差),第二行表示边框宽度和高度误差,第三行表示边框内有目标的置信度误差,第四行表示边框内无目标的置信度误差,最后一行表示目标分类误差。总的来说,就是网络输出与真实标签的各项内容的误差平方和作为最后的输出误差,上述五项和30维输出是对应的。\(\lambda_{\text {coord}}\)用于调整bbox误差的权重,YOLO设置为5。
训练
YOLO现在ImageNet数据集上训练前20层卷积网络,让网络获得一部分图像特征提取能力,然后在Pascal VOC数据集上进行目标检测的训练。除了最后一层使用线性激活函数,其他层均使用Leaky Relu,同时采用Dropout和Data Augmention来控制过拟合的发生。
预测
训练完的YOLO网络就可以进行目标预测了,在此之前需要明确下面几个点。原论文的YOLO结构最多识别49个目标;通过调整网络结构可以识别更多的对象;YOLO中的预定义bounding box和Faster RCNN中的Anchor不一样,并没有设定bounding box的位置和大小,只是表示对一个目标预测两个bounding box,选择可能性较大的那个,仅此而已。
训练完成的YOLO网络就可以进行目标检测了,不过它的输出是49个30维向量,表示网格包含的对象类别以及该对象的可能两个bounding box位置和对应的置信度。
NMS(Non-maximal suppression)
为了向量中提取最有可能的目标及其位置,YOLO采用NMS(Non-maximal suppression,非极大值抑制算法)来实现。
NMS算法并不复杂,其核心思想非常简单:选择score最高的作为输出,与其重叠的删除,反复迭代直到处理完所有备选。在YOLO中定义score如下式,表示每个网格中目标\(C_i\)存在于第\(j\)个bounding box的概率。
\[\text {score}{i j}=P\left(C{i} | O b j e c t\right) * \text { Confidence}_{j} \]总结
YOLO提出时由于one-stage特性,速度很快,FPS可以达到45,总体精度低于FastRCNN
标签:box,概括,text,sum,YOLO,目标,bounding,解析 From: https://www.cnblogs.com/myleaf/p/18591991