对于目标检测,我们最多到底能检测多少个类别呢?对于Yolo来说,是9000个。这是非常厉害的,所以,接下来看看Yolo的三代算法Yolo v1、Yolo v2、Yolo v3。
目标检测经历了一个高度的符合人类的直觉的过程。既需要识别出目标的位置,将图片划分成小图片扔进算法中去,当算法认为某物体在这个小区域上之时,那么检测完成。那我们就认为这个物体在这个小图片上了。而这个思路,正是比较早期的目标检测思路,比如R-CNN。后来的Fast R-CNN,Faster R-CNN虽有改进,比如不再是将图片一块块的传进CNN提取特征,而是整体放进CNN提取特征图后,再做进一步处理,但依旧是整体流程分为 ‘区域提取’和‘目标分类’两部分(two-stage),这样做的一个特点是虽然确保了精度,但速度非常慢。而Yolo将物体检测任务当作一个regression(回归)问题来处理,每张图像只需要“看一眼”就能得出图像中都有哪些物体和这些物体的位置。其实Yolo展开就是you only look once。Yolo是One-stage算法。
Yolo v1
基本思想
YOLO v1的核心思想在于将目标检测作为回归问题解决 ,YOLO v1首先会把原始图片放缩到448×448的尺寸,放缩到这个尺寸是为了后面整除来的方便。然后将图片划分成SxS个区域,注意这个区域的概念不同于上文提及将图片划分成N个区域扔进算法的区域不同。上文提及的区域是将图片进行剪裁,或者说把图片的某个局部的像素输入算法中,而这里的划分区域,只的是逻辑上的划分。
如果一个对象的中心落在某个单元格上,那么这个单元格负责预测这个物体。每个单元格需要预测B(超参数)个边界框(bbox)值(bbox值包括坐标和宽高),同时为每个bbox值预测一个置信度(confidence scores)。此后以每个单元格为单位进行预测分析。
这个置信度并不只是该边界框是待检测目标的概率,而是该边界框是待检测目标的概率乘上该边界框和真实位置的IoU(框之间的交集除以并集)的积。通过乘上这个交并比,反映出该边界框预测位置的精度。如下式所示:
每个边界框对应于5个输出,分别是x,y,w,h和置信度。其中x,y代表边界框的中心离开其所在网格单元格边界的偏移。w,h代表边界框真实宽高相对于整幅图像的比例。x,y,w,h这几个参数都已经被限制到了区间[0,1]上。除此以外,每个单元格还产生C个概率(有多少类物体,C就是多少)。注意,我们不管B的大小,每个单元格只产生一组这样的概率。
然后我们让每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:
P(Classi)就是每个网络预测的类别信息。 这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。 得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
网络模型架构
网络结构借鉴了 GoogLeNet 。24个卷积层,2个全连接层。
损失函数
YOLO v1全部使用了均方差(mean squared error)作为损失(loss)函数。由三部分组成:坐标误差、IOU误差和分类误差。
考虑到每种loss的贡献率,YOLO v1给坐标误差(coordErr)设置权重λcoord=5。在计算IoU误差时,包含物体的格子与不包含物体的格子(此处的‘包含’是指存在一个物体,它的中心坐标落入到格子内),二者的IOU误差对网络loss的贡献值是不同的。若采用相同的权值,那么不包含物体的格子的置信度值近似为0,变相放大了包含物体的格子的置信度误差,在计算网络参数梯度时的影响。为解决这个问题,YOLO 使用λnoobj(置信度误差)=0.5修正iouErr。
对于相等的误差值,大物体误差对检测的影响应小于小物体误差对检测的影响。这是因为,相同的位置偏差占大物体的比例远小于同等偏差占小物体的比例。YOLO将物体大小的信息项(w和h)进行求平方根来改进这个问题,但并不能完全解决这个问题。
所以,Loss计算公式: PS:连数学符号都没认全,我太难了
后面看别人的博客,才知道公式意思如下:
在激活函数上:
在最后一层使用的是标准的线性激活函数,其他的层都使用leaky rectified 线性激活函数。
Yolo v2/Yolo 9000
YOLO v1对于bounding box的定位不是很好,在精度上比同类网络还有一定的差距,所以YOLOv2对于速度和精度做了很大的优化,并且吸收了同类网络的优点,一步步做出尝试。
YOLO v2在v1基础上做出改进后提出。其受到Faster RCNN方法的启发,引入了anchor(先验框)。同时使用了K-Means方法,对anchor数量进行了讨论,在精度和速度之间做出折中。并且修改了网络结构,去掉了全连接层,改成了全卷积结构。在训练时引入了世界树(WordTree)结构,将检测和分类问题做成了一个统一的框架,并且提出了一种层次性联合训练方法,将ImageNet分类数据集和COCO检测数据集同时对模型训练。
预测更准确
batch normalization
YOLOv2对每批数据都做了一个归一化预处理。通过在每一个卷积层后添加batch normalization,极大的改善了收敛速度同时减少了对其它正则方法的依赖(Yolo v2不在使用dropout),使得mAP获得了提升。(mAP:平均精度均值(mean Average Precision))
通常,一次训练会输入一批样本(batch)进入神经网络。批规一化在神经网络的每一层,在网络(线性变换)输出后和激活函数(非线性变换)之前增加一个批归一化层(BN),BN层进行如下变换:①对该批样本的各特征量(对于中间层来说,就是每一个神经元)分别进行归一化处理,分别使每个特征的数据分布变换为均值0,方差1。从而使得每一批训练样本在每一层都有类似的分布。这一变换不需要引入额外的参数。②对上一步的输出再做一次线性变换,假设上一步的输出为Z,则Z1=γZ + β。这里γ、β是可以训练的参数。增加这一变换是因为上一步骤中强制改变了特征数据的分布,可能影响了原有数据的信息表达能力。增加的线性变换使其有机会恢复其原本的信息。
使用高分辨率图像
YOLOv1在分辨率为224×224的图片上进行预训练,在正式训练时将分辨率提升到448×448,这需要模型去适应新的分辨率。但是YOLOv2是直接使用448×448的输入, 所以YOLO2在采用 224*224 图像进行分类模型预训练后,再采用 448*448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 448*448 的分辨率。然后再使用 448*448 的检测样本进行训练,缓解了分辨率突然切换造成的影响。
采用先验框anchor
在预测框的数量上,由于YOLOv2将网络的输入分辨率调整到416×416,下采样率为32,多次卷积后得到13×13的特征图(feature map)。在这上面使用9种anchor boxes,得到13×13×9=1521个,这比YOLOv1大多了。PS:我也不知道为什么突然就变416了?
YOLOv1利用全连接层的数据完成边框的预测,会导致丢失较多的空间信息,使定位不准。在YOLOv2中作者借鉴了Faster R-CNN中的anchor思想,来改善全连接层带来的影响。
Anchor是RPN(region proposal network)网络在Faster R-CNN中的一个关键步骤,是在卷积特征图上进行滑窗操作,每一个中心可以预测9种不同大小的候选框。
为了引入anchor boxes来预测候选框,作者在网络中去掉了全连接层。并去掉了最后的一个池化层以确保输出的卷积特征图有更高的分辨率。然后,通过缩减网络,让图片输入分辨率为416 * 416,目的是为了让后面产生的卷积特征图宽高都为奇数,这样就可以产生一个中心框(center cell)。YOLO算法的作者观察到,大物体通常占据了图像的中间位置,可以只用中心的一个框来预测这些物体的位置,否则就要用中间的4个格子来进行预测,这个技巧可稍稍提升效率。最后,YOLOv2使用了卷积层降采样(采样因子为32),使得输入卷积网络的416 * 416图片最终得到13 * 13的卷积特征图(416/32=13)
聚类提取先验框尺度。
使用anchor的时候,anchor boxes的宽和高往往是人工选定的。虽然在训练过程中,网络也会调整宽和高。但一开始就选择了更好的宽和高,网络就更容易得到准确的预测位置。为了使网络更易学到准确的预测位置,作者使用了K-means聚类方法类训练bounding boxes,可以自动找到更好的框宽高维度。传统的K-means聚类方法使用的是欧氏距离函数,也就意味着较大的框会比较小的框产生更多的误差,聚类结果可能会偏离。为此,作者采用IOU得分作为评价标准,这样的话,误差就和框的尺度无关。最终的距离函数为:
centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的“距离”。IOU越大,“距离”越近。YOLO2给出的聚类分析结果如下图所示:
上图左边是选择不同的聚类k值情况下,得到的k个centroid边框,计算样本中标注的边框与各centroid的Avg IOU。显然,边框数k越多,Avg IOU越大。YOLO2选择k=5作为边框数量与IOU的折中。对比手工选择的先验框,使用5个聚类框即可达到61 Avg IOU,相当于9个手工设置的先验框60.9 Avg IOU。
约束预测边框的位置
借鉴于Faster RCNN的先验框方法,在训练的早期阶段,其位置预测容易不稳定。其位置预测公式为:
其中,x,y是预测边框的中心,xa,ya是先验框(anchor)的中心点坐标,ωa,ha是先验框(anchor)的宽和高,tx,ty是要学习的参数。在Yolo论文中写的是x=(tx*ωa)-xa,根据Faster RCNN,应该是“+”。
由于tx,ty的取值没有任何约束,因此预测边框的中心可能出现在任何位置,导致训练早期阶段不容易稳定。Yolo 调整了预测公式,将预测边框的中心约束在特定的grid网格内。
其中,bx、by、bw、bh是预测边框的中心和宽高。Pr(object) * IOU(b,object)是预测边框的置信度,Yolo v1是直接预测置信度的值,这里对预测参数t0进行σ(sigmoid)变换后作为置信度的值。cx,cy是当前网格左上角的距离,要先将网格大小归一化,即令一个网格的宽=1,高=1。pw,ph是先验框的宽和高。tx、ty、tw、th、to是要学习的参数,分别用于预测边框的中心和宽高,以及置信度。
参考上图,由于σ函数将tx、ty约束在(0,1)范围内,所以根据上面的计算公式,预测边框的蓝色中心点被约束在蓝色背景的网格内。约束边框位置使得模型更容易学习,且预测更为稳定。
passthrough层检测细粒度特征
对象检测面临的一个问题是图像中对象会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(比如YOLO2中输入416*416经过卷积网络下采样最后输出是13*13),较小的对象可能特征已经不明显甚至被忽略掉了。为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。
YOLO2引入一种称为passthrough层的方法在特征图中保留一些细节信息。具体来说,就是在最后一个pooling之前,特征图的大小是26*26*512,将其1拆4,直接传递(passthrough)到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。
一拆4是什么拆的呢?举个例子,如下:
还有其它拆法。就不具述了。
多尺度图像训练
因为去掉了全连接层,YOLO2可以输入任何尺寸的图像。因为整个网络下采样倍数是32,作者采用了{320,352,…,608}等10种输入图像的尺寸,这些尺寸的输入图像对应输出的特征图宽和高是{10,11,…19}。训练时每10个batch就随机更换一种尺寸,使网络能够适应各种大小的对象检测。
速度更快
大多数目标检测的框架是建立在VGG-16上的。为了进一步提升速度,Yolo v2提出了Darknet-19网络结构。Darknet-19(19层卷积层和5层池化层)比VGG-16小一些,精度不弱于VGG-16,但浮点运算量减少到约1/5。
YOLO2的训练主要包括三个阶段。第一阶段就是先在ImageNet分类数据集上预训练Darknet-19,此时模型输入为 224*224 ,共训练160个epochs。然后第二阶段将网络的输入调整为 448*448 ,继续在ImageNet数据集上finetune分类模型,训练10个epochs。第三个阶段就是修改Darknet-19分类模型为检测模型,移除最后一个卷积层、global avgpooling层以及softmax层,并且新增了三个 3*3*1024卷积层,同时增加了一个passthrough层,最后使用 11 卷积层输出预测结果,输出的channels数为:**num_anchors\(5+num_classes)** ,和训练采用的数据集有关系。对于VOC数据集(20种分类对象),假如anchor数为5,输出的channels就是125。
识别对象更多
论文提出了一种联合训练的机制:使用识别数据集训练模型识别相关部分,使用分类数据集训练模型分类相关部分。
众多周知,检测数据集的标注要比分类数据集打标签繁琐的多,所以ImageNet分类数据集比VOC等检测数据集高出几个数量级。所以在YOLOv1中,边界框的预测其实并不依赖于物体的标签,YOLOv2实现了在分类和检测数据集上的联合训练。对于检测数据集,可以用来学习预测物体的边界框、置信度以及为物体分类,而对于分类数据集可以仅用来学习分类,但是其可以大大扩充模型所能检测的物体种类。
作者选择在COCO和ImageNet数据集上进行联合训练,遇到的第一问题是两者的类别并不是完全互斥的,比如”Norfolk terrier”明显属于”dog”,所以作者提出了一种层级分类方法(Hierarchical classification),根据各个类别之间的从属关系(根据WordNet)建立一种树结构WordTree,结合COCO和ImageNet建立的词树(WordTree)如下图所示:
WordTree中的根节点为”physical object”,每个节点的子节点都属于同一子类,可以对它们进行softmax处理。在给出某个类别的预测概率时,需要找到其所在的位置,遍历这个路径,然后计算路径上各个节点的概率之积。
在训练时,如果是检测样本,按照YOLOv2的loss计算误差,而对于分类样本,只计算分类误差。在预测时,YOLOv2给出的置信度就是 ,同时会给出边界框位置以及一个树状概率图。在这个概率图中找到概率最高的路径,当达到某一个阈值时停止,就用当前节点表示预测的类别。
Yolo v3
YOLO v3没有太多的创新,主要是借鉴一些好的方案融合到YOLO里面。不过效果还是不错的,在保持速度优势的前提下,提升了预测精度,尤其是加强了对小物体的识别能力。
新的网络结构
在基本的图像特征提取方面,Yolo v3采用了称之为Darknet-53的网络结构(含有53个卷积层),它借鉴了残差网络residual network的做法,在一些层之间设置了快捷链路(shortcut connections)。
利用多尺度特征进行对象预测
YOLO2曾采用passthrough结构来检测细粒度特征,在YOLO3更进一步采用了3个不同尺度的特征图来进行对象检测。
结合上图看,卷积网络在79层后,经过下方几个黄色的卷积层得到一种尺度的检测结果。相比输入图像,这里用于检测的特征图有32倍的下采样。比如输入是416*416的话,这里的特征图就是13*13了。由于下采样倍数高,这里特征图的感受野比较大,因此适合检测图像中尺寸比较大的对象。
为了实现细粒度的检测,第79层的特征图又开始作上采样(从79层往右开始上采样卷积),然后与第61层特征图融合(Concatenation),这样得到第91层较细粒度的特征图,同样经过几个卷积层后得到相对输入图像16倍下采样的特征图。它具有中等尺度的感受野,适合检测中等尺度的对象。
最后,第91层特征图再次上采样,并与第36层特征图融合(Concatenation),最后得到相对输入图像8倍下采样的特征图。它的感受野最小,适合检测小尺寸的对象。
9种尺度的先验框
随着输出的特征图的数量和尺度的变化,先验框的尺寸也需要相应的调整。YOLO2已经开始采用K-means聚类得到先验框的尺寸,YOLO3延续了这种方法,为每种下采样尺度设定3种先验框,总共聚类出9种尺寸的先验框。在COCO数据集这9个先验框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。
分配上,在最小的13*13特征图上(有最大的感受野)应用较大的先验框(116x90),(156x198),(373x326),适合检测较大的对象。中等的26*26特征图上(中等感受野)应用中等的先验框(30x61),(62x45),(59x119),适合检测中等大小的对象。较大的52*52特征图上(较小的感受野)应用较小的先验框(10x13),(16x30),(33x23),适合检测较小的对象。
感受一下9种先验框的尺寸,下图中蓝色框为聚类得到的先验框。黄色框式ground truth,红框是对象中心点所在的网格。
13*13:
26*26:
52*52:
对象分类softmax改成logistic
预测对象类别时不使用softmax,改成使用logistic的输出进行预测。这样能够支持多标签对象(比如一个人有Woman 和 Person两个标签)。
输入映射到输出
不考虑神经网络结构细节的话,总的来说,对于一个输入图像,YOLO3将其映射到3个尺度的输出张量,代表图像各个位置存在各种对象的概率。
我们看一下YOLO3共进行了多少个预测。对于一个416*416的输入图像,在每个尺度的特征图的每个网格设置3个先验框,总共有 13*13*3 + 26*26*3 + 52*52*3 = 10647 个预测。每一个预测是一个(4+1+80)=85维向量,这个85维向量包含边框坐标(4个数值),边框置信度(1个数值),对象类别的概率(对于COCO数据集,有80种对象)。
对比一下,YOLO2采用13*13*5 = 845个预测,YOLO3的尝试预测边框数量增加了10多倍,而且是在不同分辨率上进行,所以mAP以及对小物体的检测效果有一定的提升。
本篇文章使用了较多的他人的图片,如有侵权,请联系我删掉。QQ:1171708687