[Paper:Focal Loss for Dense Object Detection] [ ] 关于目标检测主要分为两大类别:one stage,two stage one stage 代表:yolo系列,ssd(特点:检测精度低,但检测速度快) two stage 代表:R-CNN系列,SPPNet(特点:检测精度高,但检测速度慢) 在论文中作者去探讨了造成one stage精度低的原因,发现在训练密集目标检测器的过程中出现了严重的foreground-background类别不平衡。 检测算法在早期会生成很多bbox,而在一幅正常的图像中需要检测的object不会很多,这就意味着多数的bbox是属于background,使得foreground-background类别不平衡。 因为bbox数量很多,而属于background的bbox太多了,假设分类器将所有的bbox全部归为background,那么精度也会很高,而这样的分类器是一个失败的分类器,所以导致目标检测的精度很低。 因为two stage的第一个阶段生成一个候选目标位置组成的稀疏样本集,即RPN简单的对anchor进行二分类(只是区分是foreground和background,并不会区别细类),这样,属于background类别的bbox会大量减少,虽然其数量依然远大于foreground的bbox(例如3:1),但已不像最初生成anchor差别那么大了,这一阶段最终结果是从“类别极不平衡”到“类别较不平衡”转变,也就是说two stage并不能完全解决类别不平衡问题,第二个阶段使用一个卷积神经网络将各候选位置归置foreground类别或者background类别,即在初步筛选后的bbox上进行难度小得多的分类(细分类),这样分类器便得到了较好的训练,从而精度提高了。但因为是经过了两个阶段的处理,操作复杂,使得检测速度变慢了。 因为one stage系列的检测器直接在“类别极不平衡”的bbox中进行难度极大的细分类,直接输出bbox和标签,而原有的交叉熵损失(CE)作为分类任务的损失函数,无法抗衡“类别极不平衡”(会在另一篇文章中详细讲解交叉熵损失),容易导致分类器训练失败。因此,one stage检测虽然速度快,但检测精度低。 既然one stage中的交叉熵损失函数无法抗衡“类别极不平衡”,所以retinanet作者何恺明及其团队提出Focal Loss替换交叉熵损失来提高检测精度。 首先介绍一下二分类的交叉熵损失:鉴于以上的改进过程的思想,可以将交叉熵损失增加一个调节因子(1 - pt)γ,其中γ≥0。这样便出现了Focal Loss,其定义为: 在实践过程中使用的Focal Loss形式为:
对于目标检测方向并不是特别熟悉,本文记录一下RCNN, fast-RCNN, faster-RCNN, mask-RCNN这4篇有关目标检测的论文笔记和学习心得。
R-CNN的意思就是Region based,主要思路就是根据一张图像,提取多个region,再将每个Region输入CNN来进行特征的提取。因此RCNN就可以分为 Region proposals , Feature extraction 两个主要部分,提取的特征就可以输入任意一个分类器来进行分类。 模型的流程图如下:
在训练的时候,首先使用的是已经训练好的CNN网络作为特征提取器,但是由于预训练是在分类数据集上,因此在应用到检测之前要做finetune。也就是说,为了将用ImageNet数据集训练的网络应用到新的任务(检测),新的数据集(region)上,作者将原来的CNN最后的1000类的fc层,更改为了 层, 代表待检测的物体的类别数。然后,对于所有的region,如果它和ground truth的重叠率大于,就认为是正类。 对于分类器的训练,作者发现选择多大的IoU来区分正类和负类非常关键。并且,对于每一类,都会训练一个分类器。
框的回归非常重要,在对每一个region proposal使用分类器进行打分评价之后,作者使用一个回归器来预测一个新的框作为结果。这个回归器使用的特征是从CNN中提取的特征。回归器的训练中,输入是 region proposal 的 和ground truth的 ,目标是学习一种变换,使得region proposal通过该变换能够接近ground truth。同时,希望这种变换拥有尺度不变性,也就是说尺度变化的话,变换不会改变。 如下图所示,每一个regressor会学习一组参数,特征输入是pool 5的特征输出,拟合的目标是 。
Fast-RCNN 主要解决的问题是在RCNN中对于每一个region proposal都进行特征提取,会产生非常多的冗余计算,因此可以先对一张图像进行特征提取,再根据region proposal在相应的特征上进行划分得到对应region的特征(映射关系)。 这样便可以实现共享计算提高速度,但是与SPPnets不同,SPPnets在一副图像得到对应的特征后,从这张图像的特征上proposal对应的部分,采用空间金字塔池化,如下图:
RoI pooling的方法很简单,类似于空间金字塔pooling,它将proposal部分对应卷积层输出的特征(称之为RoI,因为用于做pooling的特征是 region of interest,也就是我们感兴趣的区域)划分成 块,然后对每一块求最大值,最终得到了一个 的特征图。可以看出,它只是空间金字塔pooling的一部分。 但是SPP-nets的空间金字塔也是可以求导的,那么它到底不好在哪里呢?因为当每一个RoI都可能来源于不同的图像的时候(R-CNN和SPPnets的训练策略是从一个batch的不同图像中,分别挑选一个proposal region),SPPNets的训练非常地低效,这种低效来源于在SPPnets的训练中,每个RoI的感受野都非常地大,很可能对应了原图的整个图像,因此,得到的特征也几乎对应了整张图像,所以输入的图像也就很大。 为了提高效率,Fast-RCNN首先选取 个图像,再从每个图像上选择 个RoI,这样的效率就比从每个图像提取一个RoI提高了 倍。
为了将分类和框回归结合起来,作者采用了多任务的loss,来进行联合的训练。具体来说就是将分类的loss和框回归的loss结合起来。网络的设计上非常直接,就是将RoI得到的特征接几个FC层后,分别接不同的输出层。对应于分类部分,特征会接一个softmax输出,用于分类,对于框回归部分,会接一个输出4维特征的输出层,然后分别计算loss,用于反向传播。loss的公式如下:
回归的target可以参考前面的R-CNN部分。
notes
为什么比fast还fast呢?主要原因是在这篇论文中提出了一个新的层:RPN(region proposal networks)用于替代之前的selective search。这个层还可以在GPU上运算来提高速度。 RPN的目的:
为了能够进行region proposal,作者使用了一个小的网络,在基础的卷积层输出的特征上进行滑动,这个网络输入大小为 ,输入后会映射(用 的卷积)为一个固定长度的特征向量,然后接两个并联的fc层(用 的卷积层代替),这两个fc层,一个为box-regressoin,一个为box-classification。如下图:
在每一个滑动窗口(可以参考 ),为了考虑到尽可能多的框的情况,作者设计了anchors来作为region proposal。anchors就是对于每一个滑动窗口的中心位置,在该位置对应的原图位置的基础上,按照不同的尺度,长宽比例框出 个不同的区域。然后根据这些anchors对应的原始图像位置以及区域,和ground truth,就可以给每一个滑动窗口的每一个anchor进行标记,也就是赋予label,满足一定条件标记为正类(比如和ground truth重叠大于一个值),一定条件为负类。对于正类,就可以根据ground truth和该anchor对应的原图的区域之间的变换关系(参考前面的R-CNN的框回归),得到回归器中的目标,用于训练。也就是论文中的loss function部分:
自然地,也就要求RPN的两个并联的FC层一个输出2k个值用于表示这k个anchor对应的区域的正类,负类的概率,另一个输出4k个值,用于表示框回归的变换的预测值。
对于整个网络的训练,作者采用了一种叫做 4-step Alternating Training 的方法。具体可以参考论文。
与之前的检测任务稍有不同,mask r-cnn的任务是做instance segmentation。因此,它需要对每一个像素点进行分类。 与Faster R-CNN不同,Faster R-CNN对每一个候选框产生两个输出,一个是类别,一个是bounding box的offset。Mask R-CNN新增加了一个输出,作为物体的mask。这个mask类似于ps中的蒙版。
与Faster R-CNN类似的是,Mask R-CNN同样采用RPN来进行Region Proposal。但是在之后,对于每一个RoI,mask r-cnn还输出了一个二值化的mask。
不像类别,框回归,输出都可以是一个向量,mask必须保持一定的空间信息。因此,作者采用FCN来从每个RoI中预测一个 的mask。
由于属于像素级别的预测问题,就需要RoI能够在进行特征提取的时候保持住空间信息,至少在像素级别上能够对应起来。因此,传统的取最大值的方法就显得不合适。 RoI Pooling,经历了两个量化的过程: 第一个:从roi proposal到feature map的映射过程。 第二个:从feature map划分成7*7的bin,每个bin使用max pooling。
为此,作者使用了RoIAlign。如下图
为了避免上面提到的量化过程
可以参考
作者使用ResNet作为基础的特征提取的网络。 对于预测类别,回归框,mask的网络使用如下图结构:
整体看完这几篇大佬的论文,虽说没有弄清楚每一个实现细节,但是大体上了解了算法的思路。可以看出,出发点都源于深度神经网络在特征提取上的卓越能力,因此一众大神试图将这种能力应用在检测问题中。从R-CNN中简单地用于特征提取,到为了提高速度减少计算的Fast R-CNN,再到为了将region proposal集成进入整个模型中,并且利用GPU加速的RPN,也就是Faster R-CNN。再到为了应用于instance segmentation任务中,设计的RoIAlign和mask。包括bounding box regression,pooling层的设计,训练方法的选择,loss的设计等等细节,无一不体现了大师们的思考和创造力。 可能在我们这些“拿来”者的眼中,这些方法都显得“理所应当”和巧妙,好用,但是,它们背后隐藏的选择和这些选择的思考却更值得我们学习。 以及,对待每一个问题,如何设计出合理的解决方案,以及方案的效率,通用性,更是应该我们努力的方向。
论文: Sparse R-CNN: End-to-End Object Detection with Learnable Proposals
论文认为,目前的目标检测算法可以按预设框的多少分为两种:
上述两种方法都会预测大量的结果,需要进行NMS后处理,而在训练的时候会存在many-to-one的问题,并且anchor的设置对性能的影响很大。 于是,很多研究开始探讨稀疏(sparse)检测,比如近期的DETR算法。该算法不需要预设anchor,并且预测的结果可直接输出,不需要后处理。但论文认为DETR并不是真正的稀疏检测,因为DETR在各位置提取特征时,需要与全图的上下文进行交互,而真正的稀疏检测应该满足sparse boxes和sparse features,即较少的初始框设定以及框之间不需要过多的特征互动。 为此,论文提出了Sparse R-CNN,如图1c所示,仅需设定少量anchor即可进行检测,而且能够进行set prediction,免去NMS等后处理,其核心主要包含以下几点:
Sparse R-CNN的推理流程如图3所示,输入图片、可学习的proposal boxes以及可学习的proposal features,根据proposal boxes提取对应的RoIAlign特征,dynamic head将proposal features转换为卷积核参数,对RoIAlign特征进一步提取特征,再进行后续的分类和回归。整体的思想和Fast RCNN很像,将selective search替换为proposal boxes,再增加其它更强的模块。
论文采用FPN-ResNet作为主干网络,输出多层特征,每层特征的维度都是256。采用更复杂的主干网络可以获得更好的性能,但论文与Faster R-CNN对齐,采用标准的实现。
Sparse R-CNN的核心是采用数目固定的小批量可学习proposal boxes( )作为region proposal,而非RPN。每个box为4-d参数,在0~1范围内,值为归一化的中心点坐标、宽度和高度。这些参数在训练过程中通过反向传播进行更新,包含了训练集目标位置的统计信息,可用于推理时的初步目标位置猜测。
尽管4维的proposal box能够直观地表示目标的定位,但缺少了目标的信息,比如目标的姿态和形状,所以论文引入proposal feature( )进行补充。proposal features是高维的可学习向量,与proposal boxes一一对应,用于丰富目标的RoIAlign特征。
Dynamic instance interactive head的结构如图4所示,每个proposal box都有一个专属的预测head。给定 个proposal boxes和 个proposal features,先通过RoIAlign提取每个box的 维特征,Dynamic instance interactive head将其对应的 维proposal feature转换为卷积参数,使用这个卷积参数对RoIAlign特征进行提取,得到目标的 维特征,最后经过简单的3层感知机进行分类与回归。 Dynamic instance interactive head也可以使用类似Cascade R-CNN那样的级联模式进一步的提升性能,将输出的新回归框和 维特征作为下一次迭代的proposal box和proposal feature即可。
Sparse R-CNN的训练采用set prediction的形式,将固定数量的预测结果与GT之间进行二分图最优的匹配,然后计算损失值,完整的损失函数为:
各模块对比实验。
性能与收敛性。
在COCO上进行对比。
Sparse R-CNN贯彻了稀疏的思想,只提供少量初始框,可进行Set prediction,颠覆了当前密集预测的检测思路,整体框架十分简洁,跟Fast RCNN有点像,十分值得大家阅读。
论文: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
目标检测网络大多依靠 区域生成 (region proposal)算法来假设目标的位置。 R-CNN 是采用 Selective Search 算法来提取(propose)可能的 RoIs(regions of interest) 区域,然后对每个提取区域采用标准 CNN 进行分类。选择性搜索(Selective Search )方法就是在目标对象周围设定2000个形状大小位置不一的候选区域,目标物体在候选区域的可能性还是比较大的。然后对这些区域卷积,找到目标物体,虽然大多数区域都是无用的。与寻找几乎个区域比起来,这种方法要高效的多。
Fast R-CNN ,不在原始图像生成备选区域,而是先整张图片通过卷积网络得到特征图,然后在特征图上使用备选区域算法得到感兴趣的区域在特征图的映射,之后使用 Rol Pool将所有区域变成同样尺寸,大大减少了这些目标检测网络的运行时间,但是区域生成的计算成为整个检测网络的瓶颈。
Faster R-CNN 引入了一个 区域生成网络(Region Proposal Network,RPN) ,该网络与检测网络共享输入图像的卷积特征,从而使接近零时间成本的区域生成成为可能。 RPN是一个全卷积网络,可以同时在每个位置预测目标边界和目标分数。RPN经过端到端的训练,可以生成高质量的区域候选框,然后提供给Fast R-CNN用于检测。
Faster R-CNN 由两个模块组成:第一个模块是区域生成的深度全卷积网络,第二个模块是使用备选区域的Fast R-CNN检测器。整个系统是一个单个的,统一的目标检测网络。使用最近流行的“注意力”机制的神经网络术语,RPN模块告诉Fast R-CNN模块在哪里寻找目标。
针对一张图片,需要获得的输出有:
Faster R-CNN 第一步是采用基于分类任务(如ImageNet)的 CNN 模型作为特征提取器。输入图片表示为 H × W × D 的形式,经过预训练 CNN 模型的处理,得到卷积特征图(conv feature map)。
Faster R-CNN 最早是采用在 ImageNet 训练的 ZF 和 VGG ,其后出现了很多其它权重不同的网络.。如 MobileNet 是一种小型效率高的网络结构,仅有 参数;而ResNet-152 的参数量达到了 60M;新网络结构,如 DenseNet 在提高了结果的同时,降低了参数数量。
以 VGG16 为例:
VGG16 图片分类时,输入为 224×224×3 的张量(即,一张 224×224 像素的 RGB 图片)。网络结构最后采用 FC 层(而不是 Conv 层)得到固定长度的向量,以进行图片分类.。对最后一个卷积层的输出拉伸为1维的向量,然后送入 FC 层。官方实现中是采用的卷积层 conv5/conv5_1 的输出。
在深度上,卷积特征图对图片的所有信息进行了编码,同时保持相对于原始图片所编码 “things” 的位置。例如,如果在图片的左上角存在一个红色正方形,而且卷积层有激活响应,那么该红色正方形的信息被卷积层编码后,仍在卷积特征图的左上角。因此利用特征图检测目标所在的位置是可行的。
ResNet 结构逐渐取代 VGG 作为基础网络,用于提取特征。ResNet 相对于 VGG 的明显优势是,网络更大,因此具有更强的学习能力.。这对于分类任务是重要的,在目标检测中也应该如此。另外,ResNet 采用残差连接(residual connection) 和 BN (batch normalization) 使得深度模型的训练比较容易。
然后,RPN(Region Propose Network) 对提取的卷积特征图进行处理,寻找可能包含 目标的 预定义数量的区域(regions,边界框) 。为了生成候选区域,在最后的共享卷积层输出的卷积特征图上做 3x3 卷积,卷积核共有512个(VGG),后面是ReLU,这样每个 3x3 区域会得到一个512维的特征向量。然后这个特征向量被输入到两个全连接层——一个边界框回归层(reg)和一个边界框分类层(cls)。
下面解释 k, 2k, 4k 的含义。
基于深度学习的目标检测中,可能最难的问题就是生成长度不定(variable-length)的边界框列表(bounding-boxes),边界框是具有不同尺寸(sizes)和长宽比(aspect ratios )的矩形。在构建深度神经网络时,最后的网络输出一般是固定尺寸的张量输出(采用RNN的除外)。例如,在图片分类中,网络输出是 (C, ) 的张量,C是类别标签数,张量的每个位置的标量值表示图片是类别的概率值。
在 RPN 中,通过采用 anchors(锚) 来解决边界框列表长度不定的问题,即在原始图像中统一放置固定大小的参考边界框。上面说到RPN对特征图做3x3的卷积,假设每一次卷积需要预测 k 个候选区域,因此,reg层具有 4k 个输出,编码 k 个边界框的坐标,cls层输出 2k 个分数,估计每个区域是目标或是背景的概率。这 k 个区域就是 被 k 个参考边界框初始化, k 个参考框就是 k 个锚点,作为第一次预测目标位置的参考 boxes。锚点的中心位于卷积核滑动窗口的中心。默认情况下每个滑动位置使用3个不同尺度(128 2 , 256 2 , 512 2 )3个不同长宽比(1:2, 1:1, 2:1)的锚点,k=9。对于大小为W×H(通常约为2400)的卷积特征图,总共有 W×H×k 个锚点。对于RPN的最后两个全连接层,参数的个数为 512×(4+2)×k.
不同于直接检测目标的位置,这里将问题转化为两部分。对每一个 anchor 而言:
有一种简单的方法来预测目标的边界框,即学习相对于参考边界框的偏移量。假设参考 box:( ),待预测量:( ),一般都是很小的值,以调整参考 box 更好的拟合所需要的。
虽然 anchors 是基于卷积特征图定义的,但最终的 anchos 是相对于原始图片的.
由于只有卷积层和 pooling 层,特征图的维度是与原始图片的尺寸成比例关系的. 即,数学地表述,如果图片尺寸 w×h,特征图的尺寸则是w/r×h/r. 其中,r 是下采样率(subsampling ratio). 如果在卷积特征图空间位置定义 anchor,则最终的图片会是由 r 像素划分的 anchors 集。在 VGG 中, r=16。
RPN 利用所有的参考边界框(anchors),输出一系列目标的良好的 proposals。针对每个 anchor,都有两个不同的输出:
RPN是全卷积网络。
对于分类层,每个 anchor 输出两个预测值:anchor 是背景(background,非object)的 score 和 anchor 是前景(foreground,object) 的 score.
对于回归层,也可以叫边界框调整层,每个 anchor 输出 4 个预测值: (Δxcenter,Δycenter,Δwidth,Δheight),用于 anchors 来得到最终的 proposals。根据最终的 proposal 坐标和其对应的 objectness score,即可得到良好的 objects proposals.
RPN 有两种类型的预测值输出:二值分类和边界框回归调整。
为了训练RPN,我们为每个锚点分配一个二值类别标签(是目标或不是目标)。我们给两种锚点分配一个正标签:(i)具有与实际边界框的重叠最高交并比(IoU)的锚点,或者(ii)具有与实际边界框的重叠超过 IoU的锚点。注意,单个真实边界框可以为多个锚点分配正标签。通常第二个条件足以确定正样本;但我们仍然采用第一个条件,因为在一些极少数情况下,第二个条件可能找不到正样本。对于所有的真实边界框,如果一个锚点的IoU比率低于,我们给非正面的锚点分配一个负标签。既不正面也不负面的锚点不会有助于训练目标函数。
然后,随机采样 anchors 来生成batchsize=256 的 mini-batch,尽可能的保持 foreground 和 background anchors 的比例平衡。
RPN 对 mini-batch 内的所有 anchors 采用二分类交叉熵来计算分类 loss。然后,只对 mini-batch 内标记为 foreground 的 anchros 计算回归 loss。为了计算回归的目标targets,根据 foreground anchor 和其最接近的 groundtruth object,计算将 anchor 变换到 object groundtruth 的偏移值 Δ。
Faster R-CNN没有采用简单的 L1 或 L2 loss 用于回归误差,而是采用 Smooth L1 loss. Smooth L1 和 L1 基本相同,但是,当 L1 误差值非常小时,表示为一个确定值即认为是接近正确的,loss 就会以更快的速度消失.
由于 Anchors 一般是有重叠,因此,相同目标的候选区域也存在重叠。
为了解决重叠 proposals 问题,采用 NMS 算法处理,丢弃与一个 score 更高的 proposal 间 IoU 大于预设阈值的 proposals.
虽然 NMS 看起来比较简单,但 IoU 阈值的预设需要谨慎处理. 如果 IoU 值太小,可能丢失 objetcs 的一些 proposals;如果 IoU 值过大,可能会导致 objects 出现很多 proposals。IoU 典型值为 。
NMS 处理后,根据 sore 对topN 个 proposals 排序. 在 Faster R-CNN 论文中 N=2000,其值也可以小一点,如 50,仍然能的高好的结果.
当获得了可能的相关目标和其在原始图像中的对应位置之后,问题就更加直接了,采用 CNN 提取的特征和包含相关目标的边界框,采用 RoI Pooling 处理,并提取相关目标的特征,得到一个新的向量。
RPN 处理后,可以得到一堆没有分类得分的目标 proposals。待处理问题为,如何利用这些边界框并分类。
一种最简单的方法是,对每个 porposal,裁剪,并送入pre-trained base 网络,提取特征;然后,将提取特征来训练分类器. 但这就需要对所有的 2000 个 proposals 进行计算,效率低,速度慢。Faster R-CNN通过重用卷积特征图来加快计算效率,即采用 RoI(region of interest) Pooling 对每个 proposal 提取固定尺寸的特征图。然后 R-CNN 对固定尺寸的特征图分类。
目标检测中,包括 Faster R-CNN,常用一种更简单的方法,即:采用每个 proposal 来对卷积特征图裁剪crop,然后利用插值算法(一般为双线性插值 bilinear)将每个 crop resize 到固定尺寸14×14×ConvDepth. 裁剪后,利用 2×2 kernel 的 Max Pooling 得到每个 proposal 的最终7×7×ConvDepth 特征图.
之所以选择该精确形状,与其在下面的模块(R-CNN)中的应用有关。
R-CNN利用RoI Pooling提取的特征进行分类,采用全连接层来输出每个可能的 目标类别的分类得分,是Faster R-CNN框架中的最后一个步骤。
R-CNN 有两个不同的输出:
R-CNN 对每个 proposal 的特征图,拉平后采用 ReLU 和两个大小为 4096 维的全连接层进行处理。然后,对每个不同目标采用两个不同的全连接层处理:一个全连接层有 N+1 个神经单元,其中 N 是类别 class 的总数,包括 background class;一个全连接层有 4N 个神经单元,是回归预测输出,得到 N 个可能的类别分别预测 Δcenterx,Δcentery,Δwidth,Δheight。
R-CNN 的目标基本上是与 RPN 目标的计算是一致的,但需要考虑不同的可能的 object 类别 classes.
根据 proposals 和 ground-truth boxes,计算其 IoU。与任何一个 ground-truth box 的 IoU 大于 的 proposals 被设为正确的 boxes。IoU 在 到 之间时设为 background。这里忽略没有任何交叉的 proposals。这是因为,在此阶段,假设已经获得良好的 proposals。当然,所有的这些超参数都是可以用于调整以更好的拟合 objects。
边界框回归的目标计算的是 proposal 与其对应的 ground-truth间的偏移量,只对基于 IoU 阈值设定类别后的 proposals 进行计算。随机采用一个平衡化的 mini-batch=64,其中,25% 的 foreground proposals(具有类别class) 和 75% 的background proposals.
类似于 RPNs 的 losses,对于选定的 proposals,分类 loss 采用 multiclass entropy loss;对于 25% 的 foreground proposals 采用 SmoothL1 loss 计算其与 groundtruth box 的匹配。
由于 R-CNN全连接网络对每个类别仅输出一个预测值,当计算边框回归loss 时需谨慎,只需考虑正确的类别。
类似于 RPN,R-CNN 最终输出一堆带有类别分类的objects,在返回结果前,再进一步进行处理。
为了调整边界框,需要考虑概率最大的类别的 proposals. 忽略概率最大值为 background class 的proposals.
当得到最终的 objects 时,并忽略被预测为 background 的结果,采用 class-based NMS. 主要是通过对 objects 根据类别class 分组,然后根据概率排序,并对每个独立的分组采用 NMS 处理,最后再放在一起.
最终得到的 objects 列表,仍可继续通过设定概率阈值的方式,来限制每个类的 objects 数量.
Faster R-CNN在论文中是采用分步方法,对每个模块分别训练再合并训练的权重. 自此,End-to-end 的联合训练被发现能够得到更好的结果.
当将完整的模型合并后,得到 4 个不同的 losses,2 个用于 RPN,2 个用于 R-CNN。4 种不同的 losses 以加权和的形式组织. 可以根据需要对分类 loss 和回归 loss 设置权重,或者对 R-CNN 和 RPNs 设置不同权重.
采用 SGD 训练,momentum=. 学习率初始值为 ,50K 次迭代后衰减为 . 这是一组常用参数设置。
深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理。 目标检测可以理解为是物体识别和物体定位的综合 ,不仅仅要识别出物体属于哪个分类,更重要的是得到物体在图片中的具体位置。 2014年R-CNN算法被提出,基本奠定了two-stage方式在目标检测领域的应用。它的算法结构如下图 算法步骤如下: R-CNN较传统的目标检测算法获得了50%的性能提升,在使用VGG-16模型作为物体识别模型情况下,在voc2007数据集上可以取得66%的准确率,已经算还不错的一个成绩了。其最大的问题是速度很慢,内存占用量很大,主要原因有两个 针对R-CNN的部分问题,2015年微软提出了Fast R-CNN算法,它主要优化了两个问题。 R-CNN和fast R-CNN均存在一个问题,那就是 由选择性搜索来生成候选框,这个算法很慢 。而且R-CNN中生成的2000个左右的候选框全部需要经过一次卷积神经网络,也就是需要经过2000次左右的CNN网络,这个是十分耗时的(fast R-CNN已经做了改进,只需要对整图经过一次CNN网络)。这也是导致这两个算法检测速度较慢的最主要原因。 faster R-CNN 针对这个问题, 提出了RPN网络来进行候选框的获取,从而摆脱了选择性搜索算法,也只需要一次卷积层操作,从而大大提高了识别速度 。这个算法十分复杂,我们会详细分析。它的基本结构如下图 主要分为四个步骤: 使用VGG-16卷积模型的网络结构: 卷积层采用的VGG-16模型,先将PxQ的原始图片,缩放裁剪为MxN的图片,然后经过13个conv-relu层,其中会穿插4个max-pooling层。所有的卷积的kernel都是3x3的,padding为1,stride为1。pooling层kernel为2x2, padding为0,stride为2。 MxN的图片,经过卷积层后,变为了(M/16) x (N/16)的feature map了。 faster R-CNN抛弃了R-CNN中的选择性搜索(selective search)方法,使用RPN层来生成候选框,能极大的提升候选框的生成速度。RPN层先经过3x3的卷积运算,然后分为两路。一路用来判断候选框是前景还是背景,它先reshape成一维向量,然后softmax来判断是前景还是背景,然后reshape恢复为二维feature map。另一路用来确定候选框的位置,通过bounding box regression实现,后面再详细讲。两路计算结束后,挑选出前景候选框(因为物体在前景中),并利用计算得到的候选框位置,得到我们感兴趣的特征子图proposal。 卷积层提取原始图像信息,得到了256个feature map,经过RPN层的3x3卷积后,仍然为256个feature map。但是每个点融合了周围3x3的空间信息。对每个feature map上的一个点,生成k个anchor(k默认为9)。anchor分为前景和背景两类(我们先不去管它具体是飞机还是汽车,只用区分它是前景还是背景即可)。anchor有[x,y,w,h]四个坐标偏移量,x,y表示中心点坐标,w和h表示宽度和高度。这样,对于feature map上的每个点,就得到了k个大小形状各不相同的选区region。 对于生成的anchors,我们首先要判断它是前景还是背景。由于感兴趣的物体位于前景中,故经过这一步之后,我们就可以舍弃背景anchors了。大部分的anchors都是属于背景,故这一步可以筛选掉很多无用的anchor,从而减少全连接层的计算量。 对于经过了3x3的卷积后得到的256个feature map,先经过1x1的卷积,变换为18个feature map。然后reshape为一维向量,经过softmax判断是前景还是背景。此处reshape的唯一作用就是让数据可以进行softmax计算。然后输出识别得到的前景anchors。 另一路用来确定候选框的位置,也就是anchors的[x,y,w,h]坐标值。如下图所示,红色代表我们当前的选区,绿色代表真实的选区。虽然我们当前的选取能够大概框选出飞机,但离绿色的真实位置和形状还是有很大差别,故需要对生成的anchors进行调整。这个过程我们称为bounding box regression。 假设红色框的坐标为[x,y,w,h], 绿色框,也就是目标框的坐标为[Gx, Gy,Gw,Gh], 我们要建立一个变换,使得[x,y,w,h]能够变为[Gx, Gy,Gw,Gh]。最简单的思路是,先做平移,使得中心点接近,然后进行缩放,使得w和h接近。如下:我们要学习的就是dx dy dw dh这四个变换。由于是线性变换,我们可以用线性回归来建模。设定loss和优化方法后,就可以利用深度学习进行训练,并得到模型了。对于空间位置loss,我们一般采用均方差算法,而不是交叉熵(交叉熵使用在分类预测中)。优化方法可以采用自适应梯度下降算法Adam。 得到了前景anchors,并确定了他们的位置和形状后,我们就可以输出前景的特征子图proposal了。步骤如下: 1,得到前景anchors和他们的[x y w h]坐标。 2,按照anchors为前景的不同概率,从大到小排序,选取前pre_nms_topN个anchors,比如前6000个 3,剔除非常小的anchors。 4,通过NMS非极大值抑制,从anchors中找出置信度较高的。这个主要是为了解决选取交叠问题。首先计算每一个选区面积,然后根据他们在softmax中的score(也就是是否为前景的概率)进行排序,将score最大的选区放入队列中。接下来,计算其余选区与当前最大score选区的IOU(IOU为两box交集面积除以两box并集面积,它衡量了两个box之间重叠程度)。去除IOU大于设定阈值的选区。这样就解决了选区重叠问题。 5,选取前post_nms_topN个结果作为最终选区proposal进行输出,比如300个。 经过这一步之后,物体定位应该就基本结束了,剩下的就是物体识别了。 和fast R-CNN中类似,这一层主要解决之前得到的proposal大小形状各不相同,导致没法做全连接。全连接计算只能对确定的shape进行运算,故必须使proposal大小形状变为相同。通过裁剪和缩放的手段,可以解决这个问题,但会带来信息丢失和图片形变问题。我们使用ROI pooling可以有效的解决这个问题。 ROI pooling中,如果目标输出为MxN,则在水平和竖直方向上,将输入proposal划分为MxN份,每一份取最大值,从而得到MxN的输出特征图。 ROI Pooling层后的特征图,通过全连接层与softmax,就可以计算属于哪个具体类别,比如人,狗,飞机,并可以得到cls_prob概率向量。同时再次利用bounding box regression精细调整proposal位置,得到bbox_pred,用于回归更加精确的目标检测框。 这样就完成了faster R-CNN的整个过程了。算法还是相当复杂的,对于每个细节需要反复理解。faster R-CNN使用resNet101模型作为卷积层,在voc2012数据集上可以达到的准确率,超过yolo ssd和yoloV2。其最大的问题是速度偏慢,每秒只能处理5帧,达不到实时性要求。 针对于two-stage目标检测算法普遍存在的运算速度慢的缺点, yolo创造性的提出了one-stage。也就是将物体分类和物体定位在一个步骤中完成。 yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式, yolo可实现45帧每秒的运算速度,完全能满足实时性要求 (达到24帧每秒,人眼就认为是连续的)。它的网络结构如下图: 主要分为三个部分:卷积层,目标检测层,NMS筛选层。 采用Google inceptionV1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionV1进行了改造,他没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception module中的一个分支,应该是为了简化网络结构) 先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。yolo将一副448x448的原图分割成了7x7个网格,每个网格要预测两个bounding box的坐标(x,y,w,h)和box内包含物体的置信度confidence,以及物体属于20类别中每一类的概率(yolo的训练数据为voc2012,它是一个20分类的数据集)。所以一个网格对应的参数为(4x2+2+20) = 30。如下图 其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真实标记的box之间的重合度。它等于两个box面积交集,除以面积并集。值越大则box越接近真实位置。 分类信息: yolo的目标训练集为voc2012,它是一个20分类的目标检测数据集 。常用目标检测数据集如下表: | Name | # Images (trainval) | # Classes | Last updated | | --------------- | ------------------- | --------- | ------------ | | ImageNet | 450k | 200 | 2015 | | COCO | 120K | 90 | 2014 | | Pascal VOC | 12k | 20 | 2012 | | Oxford-IIIT Pet | 7K | 37 | 2012 | | KITTI Vision | 7K | 3 | | 每个网格还需要预测它属于20分类中每一个类别的概率。分类信息是针对每个网格的,而不是bounding box。故只需要20个,而不是40个。而confidence则是针对bounding box的,它只表示box内是否有物体,而不需要预测物体是20分类中的哪一个,故只需要2个参数。虽然分类信息和confidence都是概率,但表达含义完全不同。 筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box(NMS具体算法可以回顾上面faster R-CNN小节)。这样就得到了最终的最合适的几个box和他们的类别。 yolo的损失函数包含三部分,位置误差,confidence误差,分类误差。具体公式如下: 误差均采用了均方差算法,其实我认为,位置误差应该采用均方差算法,而分类误差应该采用交叉熵。由于物体位置只有4个参数,而类别有20个参数,他们的累加和不同。如果赋予相同的权重,显然不合理。故yolo中位置误差权重为5,类别误差权重为1。由于我们不是特别关心不包含物体的bounding box,故赋予不包含物体的box的置信度confidence误差的权重为,包含物体的权重则为1。 Faster R-CNN准确率mAP较高,漏检率recall较低,但速度较慢。而yolo则相反,速度快,但准确率和漏检率不尽人意。SSD综合了他们的优缺点,对输入300x300的图像,在voc2007数据集上test,能够达到58 帧每秒( Titan X 的 GPU ),的mAP。 SSD网络结构如下图: 和yolo一样,也分为三部分:卷积层,目标检测层和NMS筛选层 SSD论文采用了VGG16的基础网络,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个CNN网络来提取特征,然后再进行后续的目标定位和目标分类识别。 这一层由5个卷积层和一个平均池化层组成。去掉了最后的全连接层。SSD认为目标检测中的物体,只与周围信息相关,它的感受野不是全局的,故没必要也不应该做全连接。SSD的特点如下。 每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到 多尺度检测 的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。而yolo中,只在最后一个卷积层上做目标位置和类别的训练和预测。这是SSD相对于yolo能提高准确率的一个关键所在。 如上所示,在每个卷积层上都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。 和faster R-CNN相似,SSD也提出了anchor的概念。卷积输出的feature map,每个点对应为原图的一个区域的中心点。以这个点为中心,构造出6个宽高比例不同,大小不同的anchor(SSD中称为default box)。每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类)。如下图所示: 另外,在训练阶段,SSD将正负样本比例定位1:3。训练集给定了输入图像以及每个物体的真实区域(ground true box),将default box和真实box最接近的选为正样本。然后在剩下的default box中选择任意一个与真实box IOU大于的,作为正样本。而其他的则作为负样本。由于绝大部分的box为负样本,会导致正负失衡,故根据每个box类别概率排序,使正负比例保持在1:3。SSD认为这个策略提高了4%的准确率 另外,SSD采用了数据增强。生成与目标物体真实box间IOU为 的patch,随机选取这些patch参与训练,并对他们进行随机水平翻转等操作。SSD认为这个策略提高了的准确率。 和yolo的筛选层基本一致,同样先过滤掉类别概率低于阈值的default box,再采用NMS非极大值抑制,筛掉重叠度较高的。只不过SSD综合了各个不同feature map上的目标检测输出的default box。 SSD基本已经可以满足我们手机端上实时物体检测需求了,TensorFlow在Android上的目标检测官方模型,就是通过SSD算法实现的。它的基础卷积网络采用的是mobileNet,适合在终端上部署和运行。 针对yolo准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合SSD的特点,提出了yoloV2。它主要还是采用了yolo的网络结构,在其基础上做了一些优化和改进,如下 网络采用DarkNet-19:19层,里面包含了大量3x3卷积,同时借鉴inceptionV1,加入1x1卷积核全局平均池化层。结构如下 yolo和yoloV2只能识别20类物体,为了优化这个问题,提出了yolo9000,可以识别9000类物体。它在yoloV2基础上,进行了imageNet和coco的联合训练。这种方式充分利用imageNet可以识别1000类物体和coco可以进行目标位置检测的优点。当使用imageNet训练时,只更新物体分类相关的参数。而使用coco时,则更新全部所有参数。 YOLOv3可以说出来直接吊打一切图像检测算法。比同期的DSSD(反卷积SSD), FPN(feature pyramid networks)准确率更高或相仿,速度是其1/3.。 YOLOv3的改动主要有如下几点:不过如果要求更精准的预测边框,采用COCO AP做评估标准的话,YOLO3在精确率上的表现就弱了一些。如下图所示。 当前目标检测模型算法也是层出不穷。在two-stage领域, 2017年Facebook提出了mask R-CNN 。CMU也提出了A-Fast-RCNN 算法,将对抗学习引入到目标检测领域。Face++也提出了Light-Head R-CNN,主要探讨了 R-CNN 如何在物体检测中平衡精确度和速度。 one-stage领域也是百花齐放,2017年首尔大学提出 R-SSD 算法,主要解决小尺寸物体检测效果差的问题。清华大学提出了 RON 算法,结合 two stage 名的方法和 one stage 方法的优势,更加关注多尺度对象定位和负空间样本挖掘问题。 目标检测领域的深度学习算法,需要进行目标定位和物体识别,算法相对来说还是很复杂的。当前各种新算法也是层不出穷,但模型之间有很强的延续性,大部分模型算法都是借鉴了前人的思想,站在巨人的肩膀上。我们需要知道经典模型的特点,这些tricks是为了解决什么问题,以及为什么解决了这些问题。这样才能举一反三,万变不离其宗。综合下来,目标检测领域主要的难点如下: 一文读懂目标检测AI算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2 从YOLOv1到v3的进化之路 SSD-Tensorflow超详细解析【一】:加载模型对图片进行测试 YOLO C#项目参考: 项目实践贴个图。
Since we combine region proposals with CNNs, we call our method R-CNN: Regions with CNN features. 下面先介绍R-CNN和Fast R-CNN中所用到的边框回归方法。 为什么要做Bounding-box regression? 如上图所示,绿色的框为飞机的Ground Truth,红色的框是提取的Region Proposal。那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准(IoU<),那么这张图相当于没有正确的检测出飞机。如果我们能对红色的框进行微调,使得经过微调后的窗口跟Ground Truth更接近,这样岂不是定位会更准确。确实,Bounding-box regression 就是用来微调这个窗口的。 那么经过何种变换才能从图11中的窗口P变为窗口呢?比较简单的思路就是: 注意:只有当Proposal和Ground Truth比较接近时(线性问题),我们才能将其作为训练样本训练我们的线性回归模型,否则会导致训练的回归模型不work(当Proposal跟GT离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)。这个也是G-CNN: an Iterative Grid Based Object Detector多次迭代实现目标准确定位的关键。 PASCAL VOC为图像识别和分类提供了一整套标准化的优秀的数据集,从2005年到2012年每年都会举行一场图像识别challenge。模型详解 RCNN全程就是Regions with CNN features,从名字也可以看出,RCNN的检测算法是基于传统方法来找出一些可能是物体的区域,再把该区域的尺寸归一化成卷积网络输入的尺寸,最后判断该区域到底是不是物体,是哪个物体,以及对是物体的区域进行进一步回归的微微调整(与深度学习里的finetune去分开,我想表达的就只是对框的位置进行微微调整)学习,使得框的更加准确。 正如上面所说的,RCNN的核心思想就是把图片区域内容送给深度网络,然后提取出深度网络某层的特征,并用这个特征来判断是什么物体(文章把背景也当成一种类别,故如果是判断是不是20个物体时,实际上在实现是判断21个类。),最后再对是物体的区域进行微微调整。实际上文章内容也说过用我之前所说的方法(先学习分类器,然后sliding windows),不过论文用了更直观的方式来说明这样的消耗非常大。它说一个深度网络(alexNet)在conv5上的感受野是195×195,按照我的理解,就是195×195的区域经过五层卷积后,才变成一个点,所以想在conv5上有一个区域性的大小(7×7)则需要原图为227×227,这样的滑窗每次都要对这么大尺度的内容进行计算,消耗可想而知,故论文得下结论,不能用sliding windows的方式去做检测(消耗一次用的不恰当,望各位看官能说个更加准确的词)。不过论文也没有提为什么作者会使用先找可能区域,再进行判断这种方式,只是说他们根据09年的另一篇论文[1],而做的。这也算是大神们与常人不同的积累量吧。中间的深度网络通过ILSVRC分类问题来进行训练,即利用训练图片和训练的分类监督信号,来学习出这个网络,再根据这个网络提取的特征,来训练21个分类器和其相应的回归器,不过分类器和回归器可以放在网络中学习,R-CNN 模型如果要拟人化比喻,那 R-CNN 肯定是 Faster R-CNN 的祖父了。换句话说,R-CNN 是一切的开端。 R-CNN,或称 Region-based Convolutional Neural Network,其工作包含了三个步骤: 1.借助一个可以生成约 2000 个 region proposal 的「选择性搜索」(Selective Search)算法,R-CNN 可以对输入图像进行扫描,来获取可能出现的目标。 2.在每个 region proposal 上都运行一个卷积神经网络(CNN)。 3.将每个 CNN 的输出都输入进:a)一个支持向量机(SVM),以对上述区域进行分类。b)一个线性回归器,以收缩目标周围的边界框,前提是这样的目标存在。 下图具体描绘了上述 3 个步骤:Abstract : R-CNN的两个贡献:卷积层的能力很强,可以遍历候选区域达到精确的定位。2.当有标签的数据很少的时候,我们可以事前进行有标签(别的数据集上?)的预训练作为辅助任务,然后对特定的区域进行微调。Introduction: 这篇文章最开始是在PASCAL VOC上在图像分类和目标检测方面取得了很好的效果。 为了达到很好的效果,文章主要关注了两个问题:1.用深层网络进行目标的定位。2.如何用少量的带标签的检测数据来训练模型 对于 对一个问题目标定位 ,通常有两个思路可以走: 1.把定位看成回归问题。效果不是很好。 2.建立划窗检测器。 CNN一直采用建立划窗这个方式,但是也只是局限于人脸和行人的检测问题上。 本文使用了五个卷积层(感受野食195*195),在输入时移动步长是32*32。 除此之外,对于定位问题,我们采用区域识别的策略。 在测试阶段,本文的方法产生了大约2000个类别独立的候选区域作为cnn的输入。然 后得到一个修正后的特征向量。然后对于特定的类别用线性SVM分类器分类。我们用简 单的方法(放射图像变形)来将候选区域变成固定大小。 对于第二个缺少标签数据的问题 目前有一个思路就是无监督的预训练,然后再加入有监督的微调。 作为本文最大的贡献之二:在ILSVRC数据集上,我们先进行有监督的预训练。然 后我们在PASCAL这个小数据集上我们进行特定区域的微调。在我们的实验中,微调 可以提升8%的mAP。 本文的贡献;效率高 仅仅是特别类别的计算是合乎情理的矩阵运算,和非极大值抑制算法。他们共享权 值,并且都是低维特征向量。相比于直接将区域向量作为输入,维数更低。 本文方法处理能实现目标检测,还以为实现语义分割。 2.用R-CNN进行目标检测: 有3个Model: (1)产生独立的候选区域。 (2)CNN产生固定长度的特征向量。 (3)针对特别类别的一群svm分类器。 模块的设计 候选区域: 之前有大量的文章都提过如果产生候选区域。本文采用SS(selective search )方法。参考文献【34】+【36】 特征抽取: 对于每个候选区域,我们采用cnn之后得到4096维向量。 测试阶段的检测 在测试阶段,我们用选择性搜素的方式在测试图片上选取了2000个候选区域,如上图所示的步骤进行。 运行时间分析: 总之当时相比很快。 训练模型 有监督的预训练: 我们使用了大量的ILSVRC的数据集来进行预训练CNN,但是这个标签是图片层的。换句话说没有带边界这样的标签。 特定区域的微调: 我们调整VOC数据集的候选区域的大小,并且我们把ImageNet上午1000类,变成了21类(20个类别+1个背景)。我们把候选区域(和真实区域重叠的)大于的标记为正数,其他的标记为负数。然后用32个正窗口和96个负窗口组成128的mini-batch。 目标类别分类器: 对于区域紧紧的包括着目标的时候,这肯定就是正样本。对于区域里面全部都是背景的,这也十分好区分就是负样本。但是某个区域里面既有目标也有背景的时候,我们不知道如歌标记。本文为了解决这个,提出了一个阈值:IoU覆盖阈值,小于这个阈值,我们标记为负样本。大于这个阈值的我们标记为正样本。我们设置为。这个是一个超参数优化问题。我们使用验证集的方法来优化这个参数。然而这个参数对于我们的最后的性能有很大的帮助。 一旦,我们得到特征向量。因为训练数据太大了。我们采用standard hard negative mining method(标准难分样本的挖掘)。这个策略也是的收敛更快。 Results on PASCAL VOC 201012 . Visualization, ablation, and modes of error . Visualizing learned features 提出了一个非参数的方法,直接展现出我们的网络学习到了什么。这个想法是将一个特定的单元(特性)放在其中使用它,就好像它自己是一个对象检测器正确的。具体方法就是:我们在大量候选区域中,计算每个单元的激励函数。按从最高到最低排序激活输出,执行非最大值抑制,然后显示得分最高的区域。我们的方法让选定的单元“为自己说话”通过显示它所触发的输入。我们避免平均为了看到不同的视觉模式和获得洞察力为单位计算的不变性。我们可以看到来着第五个maxpooling返回的区域。第五层输出的每一个单元的接受野对应输出227*227的其中的195*195的像素区域。所以中心那个点单元有全局的视觉。. Ablation studies 实际上ablation study就是为了研究模型中所提出的一些结构是否有效而设计的实验。比如你提出了某某结构,但是要想确定这个结构是否有利于最终的效果,那就要将去掉该结构的网络与加上该结构的网络所得到的结果进行对比,这就是ablation study。 Performance layer-by-layer, without fine-tuning. 我们只观察了最后三层Performance layer-by-layer, with fine-tuning. 微调之后,fc6和fc7的性能要比pool5大得多。从ImageNet中学习的pool5特性是一般的,而且大部分的提升都是从在它们之上的特定领域的非线性分类器学习中获得的。Comparison to recent feature learning methods. 见上图 . Detection error analysis CNN的特征比HOG更加有区分。. Bounding box regression 有了对错误的分析,我们加入了一种方法来减少我们的定位错误。我们训练了一个线性的回归模型HOG和SIFT很慢。但是我们可以由此得到启发,利用有顺序等级和多阶段的处理方式,来实现特征的计算。生物启发的等级和移不变性,本文采用。但是缺少有监督学习的算法。使得卷积训练变得有效率。第一层的卷积层可以可视化。 【23】本文采用这个模型,来得到特征向量 ImageNet Large Scale Visual Recognition Competition用了非线性的激励函数,以及dropout的方法。【34】直接将区域向量作为输入,维数较高。IoU覆盖阈值=,而本文设置为,能提高5个百分点。产生候选区域的方式:selective search 也是本文所采取的方式是结合【34】+【36】。【5】产生候选区域的方式为:限制参数最小割bounding box regression HOG-based DPM文章中的对比试验。缩略图概率。[18][26][28]文章中的对比试验。
【嵌牛导读】目标检测在现实中的应用很广泛,我们需要检测数字图像中的物体位置以及类别,它需要我们构建一个模型,模型的输入一张图片,模型的输出需要圈出图片中所有物体的位置以及物体所属的类别。在深度学习浪潮到来之前,目标检测精度的进步十分缓慢,靠传统依靠手工特征的方法来提高精度已是相当困难的事。而ImageNet分类大赛出现的卷积神经网络(CNN)——AlexNet所展现的强大性能,吸引着学者们将CNN迁移到了其他的任务,这也包括着目标检测任务,近年来,出现了很多目标检测算法。 【嵌牛鼻子】计算机视觉 【嵌牛提问】如何理解目标检测算法——OverFeat 【嵌牛正文】 一、深度学习的典型目标检测算法 深度学习目标检测算法主要分为 双阶段检测算法 和 单阶段检测算法 ,如图1所示。双阶段目标检测算法先对图像提取候选框,然后基于候选区域做二次修正得到检测结果,检测精度较高,但检测速度较慢;单阶段目标验测算法直接对图像进行计算生成检测结果,检测速度快,但检测精度低。 1、双阶段目标检测算法 双阶段目标检测方法主要通过选择性搜索(Selective Search)或者Edge Boxes等算法对输入图像选取可能包含检测目标的候选区域(Region Proposal),再对候选区域进行分类和位置回归以得到检测结果。 OverFeat 算法 《OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks》 Sermanet 等改进AlexNet 提出 OverFeat 算法。该算法结合AlexNet通过多尺度滑动窗口实现特征提取功能,并且共享特征提取层,应用于图像分类、定位和目标检测等任务。 关键技术: 1、FCN( 全卷积神经网络 ) 对于一个各层参数结构都设计好的网络模型,要求输入图片的尺寸是固定的(例如,Alexnet要求输入图片的尺寸为227px*227px)。如果输入一张500*500的图片,希望模型仍然可以一直前向传导,即一个已经设计完毕的网络,可以输入任意大小的图片,这就是FCN。 FCN的思想在于: 1、从卷积层到全连接层,看成是对一整张图片的卷积层运算。 2、从全连接层到全连接层,看成是采用1*1大小的卷积核,进行卷积层运算。如上图所示,绿色部分代表卷积核大小。假设一个CNN模型,其输入图片大小是14*14,通过第一层卷积后得到10*10大小的图片,然后接着通过池化得到了5*5大小的图片。像但是对于像素值为5*5的图片到像素值为1*1的图片的过程中: (1)传统的CNN:如果从以前的角度进行理解的话,那么这个过程就是全连接层,我们会把这个5*5大小的图片,展平成为一维向量进行计算。 (2)FCN:FCN并不是把5*5的图片展平成一维向量再进行计算,而是直接采用5*5的卷积核,对一整张图片进行卷积运算。 二者本质上是相同的,只是角度不同,FCN把这个过程当成了对一整张特征图进行卷积,同样,后面的全连接层也是把它当做是以1*1大小的卷积核进行卷积运算。 当输入一张任意大小的图片,就需要利用以上所述的网络,例如输入一张像素为16*16的图片:根据上图,该网络最后的输出是一张2*2的图片。可见采用FCN网络可以输入任意大小的图片。同时需要注意的是网络最后输出的图片大小不在是一个1*1大小的图片,而是一个与输入图片大小息息相关的一张图片。 Overfeat就是把采用FCN的思想把全连接层看成了卷积层,在网络测试阶段可以输入任意大小的图片。 2、offset max-pooling 简单起见,不用二维的图像作为例子,而是采用一维作为示例: 如上图所示,在X轴上有20个神经元,并且选择池化size=3的非重叠池化,那么根据之前所学的方法应该是:对上面的20个神经元,从1位置开始进行分组,每3个连续的神经元为一组,然后计算每组的最大值(最大池化),19、20号神经元将被丢弃,如下图所示: 或者可以在20号神经元后面,添加一个数值为0的神经元编号21,与19、20成为一组,这样可以分成7组:[1,2,3],[4,5,6]……, [16,17,18],[19,20,21],最后计算每组的最大值。 如果只分6组,除了以1作为初始位置进行连续组合之外,也可以从位置2或者3开始进行组合。也就是说其实有3种池化组合方法: A、△=0分组:[1,2,3],[4,5,6]……,[16,17,18]; B、△=1分组:[2,3,4],[5,6,7]……,[17,18,19]; C、△=2分组:[3,4,5],[6,7,8]……,[18,19,20]; 对应图片如下: 以往的CNN中,一般只用△=0的情况,得到池化结果后,就送入了下一层。但是该文献的方法是,把上面的△=0、△=1、△=2的三种组合方式的池化结果,分别送入网络的下一层。这样的话,网络在最后输出的时候,就会出现3种预测结果了。 前面所述是一维的情况,如果是2维图片的话,那么(△x,△y)就会有9种取值情况(3*3);如果我们在做图片分类的时候,在网络的某一个池化层加入了这种offset 池化方法,然后把这9种池化结果,分别送入后面的网络层,最后的图片分类输出结果就可以得到9个预测结果(每个类别都可以得到9种概率值,然后我们对每个类别的9种概率,取其最大值,做为此类别的预测概率值)。 算法原理: 文献中的算法,就是把这两种思想结合起来,形成了文献最后测试阶段的算法。 1、论文的网络架构与训练阶段 (1)网络架构 对于网络的结构,文献给出了两个版本——快速版、精确版,一个精度比较高但速度慢;另外一个精度虽然低但是速度快。下面是高精度版本的网络结构表相关参数: 表格参数说明: 网络输入:图片大小为221px*221px; 网络结构方面基本上和AlexNet相同,使用了ReLU激活,最大池化。不同之处在于:(a)作者没有使用局部响应归一化层;(b)然后也没有采用重叠池化的方法;(c)在第一层卷积层,stride作者是选择了2,这个与AlexNet不同(AlexNet选择的跨步是4,在网络中,如果stride选择比较大得话,虽然可以减少网络层数,提高速度,但是却会降低精度)。 需要注意的是把f7这一层,看成是卷积核大小为5*5的卷积层,总之就是需要把网络看成前面所述的FCN模型,去除了全连接层的概念,因为在测试阶段可不是仅仅输入221*221这样大小的图片,在测试阶段要输入各种大小的图片,具体请看后面测试阶段的讲解。 (2)网络训练 训练输入:对于每张原图片为256*256,然后进行随机裁剪为221*221的大小作为CNN输入,进行训练。 优化求解参数设置:训练的min-batchs选择128,权重初始化选择高斯分布的随机初始化: 然后采用随机梯度下降法,进行优化更新,动量项参数大小选择,L2权重衰减系数大小选择10-5次方。学习率初始化值为,根据迭代次数的增加,每隔几十次的迭代后,就把学习率的大小减小一半。 然后就是DropOut,这个只有在最后的两个全连接层,才采用dropout,dropout比率选择。 2、网络测试阶段 在Alexnet的文献中,预测方法是输入一张图片256*256,然后进行multi-view裁剪,也就是从图片的四个角进行裁剪,还有就是一图片的中心进行裁剪,这样可以裁剪到5张224*224的图片。然后把原图片水平翻转一下,再用同样的方式进行裁剪,又可以裁剪到5张图片。把这10张图片作为输入,分别进行预测分类,在后在softmax的最后一层,求取个各类的总概率,求取平均值。 然而Alexnet这种预测方法存在两个问题: 一方面这样的裁剪方式,把图片的很多区域都给忽略了,这样的裁剪方式,刚好把图片物体的一部分给裁剪掉了; 另一方面,裁剪窗口重叠存在很多冗余的计算,像上面要分别把10张图片送入网络,可见测试阶段的计算量还是较大的。 Overfeat算法: 训练完上面所说的网络之后,在测试阶段不再是用一张221*221大小的图片了作为网络的输入,而是用了6张大小都不相同的图片,也就是所谓的多尺度输入预测,如下表格所示: 当网络前向传导到layer 5的时候,就利用了前面所述的FCN、offset pooling这两种思想的相结合。现以输入一张图片为例(6张图片的计算方法都相同),讲解layer 5后面的整体过程,具体流程示意图如下: 步骤一: 对于某个尺度的图片,经过前五层的卷积后得到特征图。上图中特征图的分辨率是20x23,256个通道。 步骤二: 对于该特征图,重复多次使用非重叠的池化,每次池化的偏置不同,有行偏置和列偏置。上图中偏置池化3次,偏置分别为为(0,1,2)。这就是offset pooling,也被称为fine stride。offset pooling得到的特征图的维度为6x7x3x3xD,其中6x7是特征图的分辨率,3x3是偏置池化的次数,D是通道数。上图中是以1维显示的。 步骤三: 池化后得到的特征图将被送入分类器。 步骤四: 分类器的输入是的5x5xD,输出是C(类别数)维向量。但是offset pooling后得到的特征图并不是5x5xD,比如上图中的特征图大小为6x7xD,因此分类器以滑动窗口的方式应用在特征图上,每个滑动窗口经过分类器输出一个C维向量。比如上图中输入的6x7xD的特征图最终得到2x3xC的输出,其中2x3是滑动窗口的个数。 步骤五: 而2x3xC只是一组偏置池化的输出,总的输出为2x3x3x3xC,将输出的张量reshape,得到6x9xC输出张量。最终输出分类张量为3d张量,即两个分辨率维度 x C维。 然后需要在后面把它们拉成一维向量,这样在一个尺度上,可以得到一个C*N个预测值矩阵,每一列就表示图片属于某一类别的概率值,并且求取每一列的最大值,作为本尺度的每个类别的概率值。 最后一共用了6种不同尺度(文献使用了12张,另外6张是水平翻转的图片)进行做预测,然后把这六种尺度结果再做一个平均,作为最最后的结果。 从上面过程可以看到整个网络分成两部分:layer 1~5这五层称之为特征提取层;layer 6~output称之为分类层。 六、定位任务 用于定位任务的时候,就把分类层(上面的layer 6~output)给重新设计一下,把分类改成回归问题,然后在各种不同尺度上训练预测物体的bounding box。
论文名称:Rich feature hierarchies for accurate object detection and semantic segmentation 提出时间:2014年 论文地址: 针对问题: 从Alexnet提出后,作者等人思考如何利用卷积网络来完成检测任务,即输入一张图,实现图上目标的定位(目标在哪)和分类(目标是什么)两个目标,并最终完成了RCNN网络模型。 创新点: RCNN提出时,检测网络的执行思路还是脱胎于分类网络。也就是深度学习部分仅完成输入图像块的分类工作。那么对检测任务来说如何完成目标的定位呢,作者采用的是Selective Search候选区域提取算法,来获得当前输入图上可能包含目标的不同图像块,再将图像块裁剪到固定的尺寸输入CNN网络来进行当前图像块类别的判断。 参考博客: 。 论文题目:OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks 提出时间:2014年 论文地址: 针对问题: 该论文讨论了,CNN提取到的特征能够同时用于定位和分类两个任务。也就是在CNN提取到特征以后,在网络后端组织两组卷积或全连接层,一组用于实现定位,输出当前图像上目标的最小外接矩形框坐标,一组用于分类,输出当前图像上目标的类别信息。也是以此为起点,检测网络出现基础主干网络(backbone)+分类头或回归头(定位头)的网络设计模式雏形。 创新点: 在这篇论文中还有两个比较有意思的点,一是作者认为全连接层其实质实现的操作和1x1的卷积是类似的,而且用1x1的卷积核还可以避免FC对输入特征尺寸的限制,那用1x1卷积来替换FC层,是否可行呢?作者在测试时通过将全连接层替换为1x1卷积核证明是可行的;二是提出了offset max-pooling,也就是对池化层输入特征不能整除的情况,通过进行滑动池化并将不同的池化层传递给后续网络层来提高效果。另外作者在论文里提到他的用法是先基于主干网络+分类头训练,然后切换分类头为回归头,再训练回归头的参数,最终完成整个网络的训练。图像的输入作者采用的是直接在输入图上利用卷积核划窗。然后在指定的每个网络层上回归目标的尺度和空间位置。 参考博客: 论文题目:Scalable Object Detection using Deep Neural Networks 提出时间:2014年 论文地址: 针对问题: 既然CNN网络提取的特征可以直接用于检测任务(定位+分类),作者就尝试将目标框(可能包含目标的最小外包矩形框)提取任务放到CNN中进行。也就是直接通过网络完成输入图像上目标的定位工作。 创新点: 本文作者通过将物体检测问题定义为输出多个bounding box的回归问题. 同时每个bounding box会输出关于是否包含目标物体的置信度, 使得模型更加紧凑和高效。先通过聚类获得图像中可能有目标的位置聚类中心,(800个anchor box)然后学习预测不考虑目标类别的二分类网络,背景or前景。用到了多尺度下的检测。 参考博客: 论文题目:DeepBox: Learning Objectness with Convolutional Networks 提出时间:2015年ICCV 论文地址: 主要针对的问题: 本文完成的工作与第三篇类似,都是对目标框提取算法的优化方案,区别是本文首先采用自底而上的方案来提取图像上的疑似目标框,然后再利用CNN网络提取特征对目标框进行是否为前景区域的排序;而第三篇为直接利用CNN网络来回归图像上可能的目标位置。创新点: 本文作者想通过CNN学习输入图像的特征,从而实现对输入网络目标框是否为真实目标的情况进行计算,量化每个输入框的包含目标的可能性值。 参考博客: 论文题目:AttentionNet: AggregatingWeak Directions for Accurate Object Detection 提出时间:2015年ICCV 论文地址: 主要针对的问题: 对检测网络的实现方案进行思考,之前的执行策略是,先确定输入图像中可能包含目标位置的矩形框,再对每个矩形框进行分类和回归从而确定目标的准确位置,参考RCNN。那么能否直接利用回归的思路从图像的四个角点,逐渐得到目标的最小外接矩形框和类别呢? 创新点: 通过从图像的四个角点,逐步迭代的方式,每次计算一个缩小的方向,并缩小指定的距离来使得逐渐逼近目标。作者还提出了针对多目标情况的处理方式。 参考博客: 论文题目:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 提出时间:2014年 论文地址: 针对问题: 如RCNN会将输入的目标图像块处理到同一尺寸再输入进CNN网络,在处理过程中就造成了图像块信息的损失。在实际的场景中,输入网络的目标尺寸很难统一,而网络最后的全连接层又要求输入的特征信息为统一维度的向量。作者就尝试进行不同尺寸CNN网络提取到的特征维度进行统一。创新点: 作者提出的SPPnet中,通过使用特征金字塔池化来使得最后的卷积层输出结果可以统一到全连接层需要的尺寸,在训练的时候,池化的操作还是通过滑动窗口完成的,池化的核宽高及步长通过当前层的特征图的宽高计算得到。原论文中的特征金字塔池化操作图示如下。 参考博客 : 论文题目:Object detection via a multi-region & semantic segmentation-aware CNN model 提出时间:2015年 论文地址: 针对问题: 既然第三篇论文multibox算法提出了可以用CNN来实现输入图像中待检测目标的定位,本文作者就尝试增加一些训练时的方法技巧来提高CNN网络最终的定位精度。创新点: 作者通过对输入网络的region进行一定的处理(通过数据增强,使得网络利用目标周围的上下文信息得到更精准的目标框)来增加网络对目标回归框的精度。具体的处理方式包括:扩大输入目标的标签包围框、取输入目标的标签中包围框的一部分等并对不同区域分别回归位置,使得网络对目标的边界更加敏感。这种操作丰富了输入目标的多样性,从而提高了回归框的精度。 参考博客 : 论文题目:Fast-RCNN 提出时间:2015年 论文地址: 针对问题: RCNN中的CNN每输入一个图像块就要执行一次前向计算,这显然是非常耗时的,那么如何优化这部分呢? 创新点: 作者参考了SPPNet(第六篇论文),在网络中实现了ROIpooling来使得输入的图像块不用裁剪到统一尺寸,从而避免了输入的信息丢失。其次是将整张图输入网络得到特征图,再将原图上用Selective Search算法得到的目标框映射到特征图上,避免了特征的重复提取。 参考博客 : 论文题目:DeepProposal: Hunting Objects by Cascading Deep Convolutional Layers 提出时间:2015年 论文地址: 主要针对的问题: 本文的作者观察到CNN可以提取到很棒的对输入图像进行表征的论文,作者尝试通过实验来对CNN网络不同层所产生的特征的作用和情况进行讨论和解析。 创新点: 作者在不同的激活层上以滑动窗口的方式生成了假设,并表明最终的卷积层可以以较高的查全率找到感兴趣的对象,但是由于特征图的粗糙性,定位性很差。相反,网络的第一层可以更好地定位感兴趣的对象,但召回率降低。 论文题目:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 提出时间:2015年NIPS 论文地址: 主要针对的问题: 由multibox(第三篇)和DeepBox(第四篇)等论文,我们知道,用CNN可以生成目标待检测框,并判定当前框为目标的概率,那能否将该模型整合到目标检测的模型中,从而实现真正输入端为图像,输出为最终检测结果的,全部依赖CNN完成的检测系统呢? 创新点: 将当前输入图目标框提取整合到了检测网络中,依赖一个小的目标框提取网络RPN来替代Selective Search算法,从而实现真正的端到端检测算法。 参考博客 :
每一个检测任务都有其特有的检测难点,比如背景复杂,目标尺度变化大,颜色对比度低等挑战,这就导致某个检测算法在检测任务A上可能表现SOTA,但在检测任务B上表现得可能不尽如人意。因此,分析研究每一个检测任务存在的难点与挑战至关重要,这有利于我们针对不同的检测难点设计出不同的技术以解决该项问题,从而使得我们提出的算法能够在特定的任务上表现SOTA。 目标检测任务可能存在的检测难点与挑战: (1)待检测目标尺寸很小,导致占比小,检测难度大 (2)待检测目标尺度变化大,网络难以提取出高效特征 (3)待检测目标所在背景复杂,噪音干扰严重,检测难度大 (4)待检测目标与背景颜色对比度低,网络难以提取出具有判别性的特征 (5)各待检测目标之间数量极度不均衡,导致样本不均衡 (6)检测算法的速度与精度难以取得良好平衡 不同尺度,不同形状物体的检测是目标检测面临的主要挑战之一,而多尺度检测技术是解决多尺度问题的主要技术手段。目标检测发展的几十年来,多尺度检测技术的演变经历了以下过程: (1)Feature pyramids and sliding windows(2014年前) (2)Detection with object proposals(2010-2015年) (3)Deep regression(2013-2016年) (4)Multi-reference detection(2015年后) (5)Multi-resolution detection(2016年后) 如下图5展示了多尺度检测技术的演变历程: 边框回归(The Bounding Box regression,BB)是目标检测非常重要的技术。它的目的是根据初始设定的anchor box来进一步改进修正预测框的位置。目标检测发展的几十年来,边框回归技术的演变经历了以下过程: (1)Without BB regression(2008年之前) (2)From BB to BB(2008-2013年) (3)From feature to BB(2013年后) 如下图展示了边框回归技术的演变历程 目标检测领域中每一个目标都被周围背景所包围,而我们对于一个目标的认知会根据其周围的环境作出判断,于是我们将目标周围的环境信息称作上下文信息。上下文可以作为网络判断目标类别和定位的重要辅助信息,可大大提高网络检测的精度。为网络提取上下文信息有以下三种常用的方法: (1)提取局部上下文信息用于目标检测 (2)提取全局上下文信息用于目标检测 (3)上下文信息交互提取高效上下文信息用于目标检测 如下图展示了上下文信息提取技术的演变历程: 目标检测的过程中在同一目标的位置上会产生大量的候选框,这些候选框相互之间可能会有重叠,此时我们需要利用非极大值抑制找到最佳的目标边界框,消除冗余的边界框。非极大值抑制算法的流程如下: (1)根据置信度得分进行排序; (2)选择置信度最高的比边界框添加到最终输出列表中,将其从边界框列表中删除; (3)计算所有边界框的面积; (4)计算置信度最高的边界框与其它候选框的IoU; (5)删除IoU大于阈值的边界框; (6)重复上述过程,直至边界框列表为空。 近年来非极大值抑制算法逐渐发展成为以下三条路线: (1)Greedy selection (2)Bounding box aggregation (3)Learning to NMS 如下图展示了非极大值抑制算法的技术演变历程: 目标检测的训练过程本质上还是一个样本数据不平衡的学习过程,因为检测算法中需要用到很多检测框,而真正包含目标的检测框占比却极少。在网络训练过程中,大量简单的负样本(背景)会主导学习方向而不利于网络往正确的方向加以优化,因此这需要采取一定的策略来解决这一问题。难分负样本挖掘(Hard Negative Mining, HNM)技术正是解决训练过程中的数据不平衡问题的一项关键技术。 难分负样本挖掘技术的演变主要经历了以下过程: (1)Bootstrap (2)HNM in deep learning based detectors 如下图展示了难分负样本挖掘技术的演变历程:
识别技术是基于人的脸部特征,对输入的人脸图像或者视频流进行判断。首先判断是否存在人脸,如果存在,则进一步给出人脸所在的位置、大小。并根据这些信息进一步提取出人脸的特征信息,最后将其与已知的人脸对比,从而识别每个人脸的身份,总体来说,人脸的识别分为两大步骤,一是人脸的检测,二是人脸的对齐,人脸检测方面,目前人脸检测采用边框检测的方式,即利用网络学习将图像划分为若干边框,从若干边框中捕捉人脸,并提取出人脸的关键点信心,人脸的对齐则是将图像中的人脸与已知的人脸进行比对从而达到识别的目的。如MTCNN(Multi-task Cascaded Convolutional Neural Networks),MTCNN人脸识别的主要方法是:当给定一张照片的时候,将其缩放到不同尺度形成图像金字塔,以达到尺度不变。步骤1:使用P-Net生成候选窗和边框回归向量(bounding box regression vectors)。使用Bounding box regression的方法来校正这些候选窗,使用非极大值抑制(NMS)合并重叠的候选框。全卷积网络和FasterR-CNN中的RPN一脉相承;步骤2:使用N-Net改善候选窗,将通过P-Net的候选窗输入R-Net中,拒绝掉
姓名:张钰 学号:21011210154 学院:通信工程学院 【嵌牛导读】Frequency-aware Discriminative Feature Learning Supervised by Single-Center Loss for Face Forgery Detection论文阅读笔记 【嵌牛鼻子】Deepfake人脸检测方法,基于单中心损失监督的频率感知鉴别特征学习框架FDFL,将度量学习和自适应频率特征学习应用于人脸伪造检测,实现SOTA性能 【嵌牛提问】本文对于伪造人脸检测的优势在哪里体现 【嵌牛正文】 转自:
步骤1:使用P-Net生成候选窗和边框回归向量(bounding box regression vectors)。使用Bounding box regression的方法来校正这些候选窗,使用非极大值抑制(NMS)合并重叠的候选框。全卷积网络和FasterR-CNN中的RPN一脉相承;
URL: 论文pdf Google出品。亚毫秒级的移动端人脸检测算法。移动端可达200~1000+FPS速度。主要以下改进: 在深度可分离卷积中,计算量主要为point-wise部分,增加depth-wise部分卷积核大小并不会明显增加成本。因此本文在depth-wise部分采用了5x5的卷积核,已获得更大的感受野,故此可以降低在层数上的需求。 此外,启发于mobilenetV2,本文设计了一个先升后降的double BlazeBlock。BlazeBlock适用于浅层,double BlazeBlock适用于深层。 16x16的anchor是一样的,但本文将8x8,4x4和2x2的2个anchor替换到8x8的6个anchor。此外强制限制人脸的长宽为1:1。 由于最后一层feature map较大(相对于ssd),导致预测结果会较多,在连续帧预测过程中,nms会变导致人脸框变得更加抖动。本文在原始边界框的回归参数估计变为其与重叠概率的加权平均。这基本没有带来预测时间上的消耗,但在提升了10%的性能。 效果好速度快的方法想不想要?
作为计算机视觉三大任务(图像分类、目标检测、图像分割)之一,目标检测任务在于从图像中定位并分类感兴趣的物体。传统视觉方案涉及霍夫变换、滑窗、特征提取、边界检测、模板匹配、哈尔特征、DPM、BoW、传统机器学习(如随机森林、AdaBoost)等技巧或方法。在卷积神经网络的加持下,目标检测任务在近些年里有了长足的发展。其应用十分广泛,比如在自动驾驶领域,目标检测用于无人车检测其他车辆、行人或者交通标志牌等物体。
目标检测的常用框架可以分为两类,一类是 two-stage/two-shot 的方法,其特点是将兴趣区域检测和分类分开进行,比较有代表性的是R-CNN,Fast R-CNN,Faster R-CNN;另一类是 one-stage/one-shot 的方法,用一个网络同时进行兴趣区域检测和分类,以YOLO(v1,v2,v3)和SSD为代表。
Two-stage的方式面世比较早,由于需要将兴趣区域检测和分类分开进行,虽然精度比较高,但实时性比较差,不适合自动驾驶无人车辆感知等应用场景。因而此次我们主要介绍一下SSD和YOLO系列框架。
SSD与2016年由W. Liu et al.在 SSD: Single Shot MultiBox Detector 一文中提出。虽然比同年提出的YOLO(v1)稍晚,但是运行速度更快,同时更加精确。
SSD的框架在一个基础CNN网络(作者使用VGG-16,但是也可以换成其他网络)之上,添加了一些额外的结构,从而使网络具有以下特性:
用多尺度特征图进行检测 作者在VGG-16后面添加了一些特征层,这些层的尺寸逐渐减小,允许我们在不同的尺度下进行预测。越是深层小的特征图,用来预测越大的物体。
用卷积网络进行预测 不同于YOLO的全连接层,对每个用于预测的 通道特征图,SSD的分类器全都使用了 卷积进行预测,其中 是每个单元放置的先验框的数量, 是预测的类别数。
设置先验框 对于每一个特征图上的单元格,我们都放置一系列先验框。随后对每一个特征图上的单元格对应的每一个先验框,我们预测先验框的 维偏移量和每一类的置信度。例如,对于一个 的特征图,若每一个特征图对应 个先验框,同时需要预测的类别有 类,那输出的大小为 。(具体体现在训练过程中) 其中,若用 表示先验框的中心位置和宽高, 表示预测框的中心位置和宽高,则实际预测的 维偏移量 是 分别是:
下图是SSD的一个框架,首先是一个VGG-16卷积前5层,随后级联了一系列卷积层,其中有6层分别通过了 卷积(或者最后一层的平均池化)用于预测,得到了一个 的输出,随后通过极大值抑制(NMS)获得最终的结果。
图中网络用于检测的特征图有 个,大小依次为 , , , , , ;这些特征图每个单元所对应的预置先验框分别有 , , , , , 个,所以网络共预测了 个边界框,(进行极大值抑制前)输出的维度为 。
未完待续
参考: chenxp2311的CSDN博客:论文阅读:SSD: Single Shot MultiBox Detector 小小将的知乎专栏:目标检测|SSD原理与实现 littleYii的CSDN博客:目标检测论文阅读:YOLOv1-YOLOv3(一)
作者的其他相关文章: 图像分割:全卷积神经网络(FCN)详解 PointNet:基于深度学习的3D点云分类和分割模型 详解 基于视觉的机器人室内定位
深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理。 目标检测可以理解为是物体识别和物体定位的综合 ,不仅仅要识别出物体属于哪个分类,更重要的是得到物体在图片中的具体位置。 2014年R-CNN算法被提出,基本奠定了two-stage方式在目标检测领域的应用。它的算法结构如下图 算法步骤如下: R-CNN较传统的目标检测算法获得了50%的性能提升,在使用VGG-16模型作为物体识别模型情况下,在voc2007数据集上可以取得66%的准确率,已经算还不错的一个成绩了。其最大的问题是速度很慢,内存占用量很大,主要原因有两个 针对R-CNN的部分问题,2015年微软提出了Fast R-CNN算法,它主要优化了两个问题。 R-CNN和fast R-CNN均存在一个问题,那就是 由选择性搜索来生成候选框,这个算法很慢 。而且R-CNN中生成的2000个左右的候选框全部需要经过一次卷积神经网络,也就是需要经过2000次左右的CNN网络,这个是十分耗时的(fast R-CNN已经做了改进,只需要对整图经过一次CNN网络)。这也是导致这两个算法检测速度较慢的最主要原因。 faster R-CNN 针对这个问题, 提出了RPN网络来进行候选框的获取,从而摆脱了选择性搜索算法,也只需要一次卷积层操作,从而大大提高了识别速度 。这个算法十分复杂,我们会详细分析。它的基本结构如下图 主要分为四个步骤: 使用VGG-16卷积模型的网络结构: 卷积层采用的VGG-16模型,先将PxQ的原始图片,缩放裁剪为MxN的图片,然后经过13个conv-relu层,其中会穿插4个max-pooling层。所有的卷积的kernel都是3x3的,padding为1,stride为1。pooling层kernel为2x2, padding为0,stride为2。 MxN的图片,经过卷积层后,变为了(M/16) x (N/16)的feature map了。 faster R-CNN抛弃了R-CNN中的选择性搜索(selective search)方法,使用RPN层来生成候选框,能极大的提升候选框的生成速度。RPN层先经过3x3的卷积运算,然后分为两路。一路用来判断候选框是前景还是背景,它先reshape成一维向量,然后softmax来判断是前景还是背景,然后reshape恢复为二维feature map。另一路用来确定候选框的位置,通过bounding box regression实现,后面再详细讲。两路计算结束后,挑选出前景候选框(因为物体在前景中),并利用计算得到的候选框位置,得到我们感兴趣的特征子图proposal。 卷积层提取原始图像信息,得到了256个feature map,经过RPN层的3x3卷积后,仍然为256个feature map。但是每个点融合了周围3x3的空间信息。对每个feature map上的一个点,生成k个anchor(k默认为9)。anchor分为前景和背景两类(我们先不去管它具体是飞机还是汽车,只用区分它是前景还是背景即可)。anchor有[x,y,w,h]四个坐标偏移量,x,y表示中心点坐标,w和h表示宽度和高度。这样,对于feature map上的每个点,就得到了k个大小形状各不相同的选区region。 对于生成的anchors,我们首先要判断它是前景还是背景。由于感兴趣的物体位于前景中,故经过这一步之后,我们就可以舍弃背景anchors了。大部分的anchors都是属于背景,故这一步可以筛选掉很多无用的anchor,从而减少全连接层的计算量。 对于经过了3x3的卷积后得到的256个feature map,先经过1x1的卷积,变换为18个feature map。然后reshape为一维向量,经过softmax判断是前景还是背景。此处reshape的唯一作用就是让数据可以进行softmax计算。然后输出识别得到的前景anchors。 另一路用来确定候选框的位置,也就是anchors的[x,y,w,h]坐标值。如下图所示,红色代表我们当前的选区,绿色代表真实的选区。虽然我们当前的选取能够大概框选出飞机,但离绿色的真实位置和形状还是有很大差别,故需要对生成的anchors进行调整。这个过程我们称为bounding box regression。 假设红色框的坐标为[x,y,w,h], 绿色框,也就是目标框的坐标为[Gx, Gy,Gw,Gh], 我们要建立一个变换,使得[x,y,w,h]能够变为[Gx, Gy,Gw,Gh]。最简单的思路是,先做平移,使得中心点接近,然后进行缩放,使得w和h接近。如下:我们要学习的就是dx dy dw dh这四个变换。由于是线性变换,我们可以用线性回归来建模。设定loss和优化方法后,就可以利用深度学习进行训练,并得到模型了。对于空间位置loss,我们一般采用均方差算法,而不是交叉熵(交叉熵使用在分类预测中)。优化方法可以采用自适应梯度下降算法Adam。 得到了前景anchors,并确定了他们的位置和形状后,我们就可以输出前景的特征子图proposal了。步骤如下: 1,得到前景anchors和他们的[x y w h]坐标。 2,按照anchors为前景的不同概率,从大到小排序,选取前pre_nms_topN个anchors,比如前6000个 3,剔除非常小的anchors。 4,通过NMS非极大值抑制,从anchors中找出置信度较高的。这个主要是为了解决选取交叠问题。首先计算每一个选区面积,然后根据他们在softmax中的score(也就是是否为前景的概率)进行排序,将score最大的选区放入队列中。接下来,计算其余选区与当前最大score选区的IOU(IOU为两box交集面积除以两box并集面积,它衡量了两个box之间重叠程度)。去除IOU大于设定阈值的选区。这样就解决了选区重叠问题。 5,选取前post_nms_topN个结果作为最终选区proposal进行输出,比如300个。 经过这一步之后,物体定位应该就基本结束了,剩下的就是物体识别了。 和fast R-CNN中类似,这一层主要解决之前得到的proposal大小形状各不相同,导致没法做全连接。全连接计算只能对确定的shape进行运算,故必须使proposal大小形状变为相同。通过裁剪和缩放的手段,可以解决这个问题,但会带来信息丢失和图片形变问题。我们使用ROI pooling可以有效的解决这个问题。 ROI pooling中,如果目标输出为MxN,则在水平和竖直方向上,将输入proposal划分为MxN份,每一份取最大值,从而得到MxN的输出特征图。 ROI Pooling层后的特征图,通过全连接层与softmax,就可以计算属于哪个具体类别,比如人,狗,飞机,并可以得到cls_prob概率向量。同时再次利用bounding box regression精细调整proposal位置,得到bbox_pred,用于回归更加精确的目标检测框。 这样就完成了faster R-CNN的整个过程了。算法还是相当复杂的,对于每个细节需要反复理解。faster R-CNN使用resNet101模型作为卷积层,在voc2012数据集上可以达到的准确率,超过yolo ssd和yoloV2。其最大的问题是速度偏慢,每秒只能处理5帧,达不到实时性要求。 针对于two-stage目标检测算法普遍存在的运算速度慢的缺点, yolo创造性的提出了one-stage。也就是将物体分类和物体定位在一个步骤中完成。 yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式, yolo可实现45帧每秒的运算速度,完全能满足实时性要求 (达到24帧每秒,人眼就认为是连续的)。它的网络结构如下图: 主要分为三个部分:卷积层,目标检测层,NMS筛选层。 采用Google inceptionV1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionV1进行了改造,他没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception module中的一个分支,应该是为了简化网络结构) 先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。yolo将一副448x448的原图分割成了7x7个网格,每个网格要预测两个bounding box的坐标(x,y,w,h)和box内包含物体的置信度confidence,以及物体属于20类别中每一类的概率(yolo的训练数据为voc2012,它是一个20分类的数据集)。所以一个网格对应的参数为(4x2+2+20) = 30。如下图 其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真实标记的box之间的重合度。它等于两个box面积交集,除以面积并集。值越大则box越接近真实位置。 分类信息: yolo的目标训练集为voc2012,它是一个20分类的目标检测数据集 。常用目标检测数据集如下表: | Name | # Images (trainval) | # Classes | Last updated | | --------------- | ------------------- | --------- | ------------ | | ImageNet | 450k | 200 | 2015 | | COCO | 120K | 90 | 2014 | | Pascal VOC | 12k | 20 | 2012 | | Oxford-IIIT Pet | 7K | 37 | 2012 | | KITTI Vision | 7K | 3 | | 每个网格还需要预测它属于20分类中每一个类别的概率。分类信息是针对每个网格的,而不是bounding box。故只需要20个,而不是40个。而confidence则是针对bounding box的,它只表示box内是否有物体,而不需要预测物体是20分类中的哪一个,故只需要2个参数。虽然分类信息和confidence都是概率,但表达含义完全不同。 筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box(NMS具体算法可以回顾上面faster R-CNN小节)。这样就得到了最终的最合适的几个box和他们的类别。 yolo的损失函数包含三部分,位置误差,confidence误差,分类误差。具体公式如下: 误差均采用了均方差算法,其实我认为,位置误差应该采用均方差算法,而分类误差应该采用交叉熵。由于物体位置只有4个参数,而类别有20个参数,他们的累加和不同。如果赋予相同的权重,显然不合理。故yolo中位置误差权重为5,类别误差权重为1。由于我们不是特别关心不包含物体的bounding box,故赋予不包含物体的box的置信度confidence误差的权重为,包含物体的权重则为1。 Faster R-CNN准确率mAP较高,漏检率recall较低,但速度较慢。而yolo则相反,速度快,但准确率和漏检率不尽人意。SSD综合了他们的优缺点,对输入300x300的图像,在voc2007数据集上test,能够达到58 帧每秒( Titan X 的 GPU ),的mAP。 SSD网络结构如下图: 和yolo一样,也分为三部分:卷积层,目标检测层和NMS筛选层 SSD论文采用了VGG16的基础网络,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个CNN网络来提取特征,然后再进行后续的目标定位和目标分类识别。 这一层由5个卷积层和一个平均池化层组成。去掉了最后的全连接层。SSD认为目标检测中的物体,只与周围信息相关,它的感受野不是全局的,故没必要也不应该做全连接。SSD的特点如下。 每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到 多尺度检测 的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。而yolo中,只在最后一个卷积层上做目标位置和类别的训练和预测。这是SSD相对于yolo能提高准确率的一个关键所在。 如上所示,在每个卷积层上都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。 和faster R-CNN相似,SSD也提出了anchor的概念。卷积输出的feature map,每个点对应为原图的一个区域的中心点。以这个点为中心,构造出6个宽高比例不同,大小不同的anchor(SSD中称为default box)。每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类)。如下图所示: 另外,在训练阶段,SSD将正负样本比例定位1:3。训练集给定了输入图像以及每个物体的真实区域(ground true box),将default box和真实box最接近的选为正样本。然后在剩下的default box中选择任意一个与真实box IOU大于的,作为正样本。而其他的则作为负样本。由于绝大部分的box为负样本,会导致正负失衡,故根据每个box类别概率排序,使正负比例保持在1:3。SSD认为这个策略提高了4%的准确率 另外,SSD采用了数据增强。生成与目标物体真实box间IOU为 的patch,随机选取这些patch参与训练,并对他们进行随机水平翻转等操作。SSD认为这个策略提高了的准确率。 和yolo的筛选层基本一致,同样先过滤掉类别概率低于阈值的default box,再采用NMS非极大值抑制,筛掉重叠度较高的。只不过SSD综合了各个不同feature map上的目标检测输出的default box。 SSD基本已经可以满足我们手机端上实时物体检测需求了,TensorFlow在Android上的目标检测官方模型,就是通过SSD算法实现的。它的基础卷积网络采用的是mobileNet,适合在终端上部署和运行。 针对yolo准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合SSD的特点,提出了yoloV2。它主要还是采用了yolo的网络结构,在其基础上做了一些优化和改进,如下 网络采用DarkNet-19:19层,里面包含了大量3x3卷积,同时借鉴inceptionV1,加入1x1卷积核全局平均池化层。结构如下 yolo和yoloV2只能识别20类物体,为了优化这个问题,提出了yolo9000,可以识别9000类物体。它在yoloV2基础上,进行了imageNet和coco的联合训练。这种方式充分利用imageNet可以识别1000类物体和coco可以进行目标位置检测的优点。当使用imageNet训练时,只更新物体分类相关的参数。而使用coco时,则更新全部所有参数。 YOLOv3可以说出来直接吊打一切图像检测算法。比同期的DSSD(反卷积SSD), FPN(feature pyramid networks)准确率更高或相仿,速度是其1/3.。 YOLOv3的改动主要有如下几点:不过如果要求更精准的预测边框,采用COCO AP做评估标准的话,YOLO3在精确率上的表现就弱了一些。如下图所示。 当前目标检测模型算法也是层出不穷。在two-stage领域, 2017年Facebook提出了mask R-CNN 。CMU也提出了A-Fast-RCNN 算法,将对抗学习引入到目标检测领域。Face++也提出了Light-Head R-CNN,主要探讨了 R-CNN 如何在物体检测中平衡精确度和速度。 one-stage领域也是百花齐放,2017年首尔大学提出 R-SSD 算法,主要解决小尺寸物体检测效果差的问题。清华大学提出了 RON 算法,结合 two stage 名的方法和 one stage 方法的优势,更加关注多尺度对象定位和负空间样本挖掘问题。 目标检测领域的深度学习算法,需要进行目标定位和物体识别,算法相对来说还是很复杂的。当前各种新算法也是层不出穷,但模型之间有很强的延续性,大部分模型算法都是借鉴了前人的思想,站在巨人的肩膀上。我们需要知道经典模型的特点,这些tricks是为了解决什么问题,以及为什么解决了这些问题。这样才能举一反三,万变不离其宗。综合下来,目标检测领域主要的难点如下: 一文读懂目标检测AI算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2 从YOLOv1到v3的进化之路 SSD-Tensorflow超详细解析【一】:加载模型对图片进行测试 YOLO C#项目参考: 项目实践贴个图。