微软算法的真正问题

深度学习目前已经应用到各个领域,应用场景大致可以分为三类:物体识别、目标检测和自然语言处理。?物体检测可以理解为物体识别和物体定位的融合,不仅仅是识别物体属于哪一类,更重要的是得到物体在图片中的具体位置。

R-CNN算法于2014年提出,基本奠定了两阶段法在目标检测领域的应用基础。其算法结构如下。

算法步骤如下:

与传统的目标检测算法相比,R-CNN实现了50%的性能提升。在使用VGG-16模型作为物体识别模型的情况下,在voc2007数据集上可以达到66%的准确率,还算不错。它最大的问题是速度非常慢,而且占用大量内存。主要有两个原因。

针对R-CNN的一些问题,2015年微软提出了快速R-CNN算法,主要优化了两个问题。

R-CNN和fast R-CNN都有一个问题,就是候选框是选择性搜索生成的,非常慢。而且R-CNN生成的2000个候选帧都需要经过一次卷积神经网络,也就是需要经过CNN网络2000次左右,非常耗时(fast R-CNN已经改进,整个画面只需要经过CNN网络一次)。这也是这两种算法检测速度慢的主要原因。

为了解决这个问题,fast R-CNN提出RPN网络获取候选帧,摆脱了选择性搜索算法,只需要一次卷积层运算,大大提高了识别速度。这个算法很复杂,我们会详细分析。其基本结构如下。

主要分为四个步骤:

网络结构采用VGG-16卷积模型;

卷积层采用VGG-16模型。首先将PxQ的原始图片缩放裁剪成MxN的图片,然后经过13个conv-雷鲁层,其中穿插了四个max-pooling层。所有卷积核都是3×3,填充是1,步距是1。池层内核为2x2,填充为0,步幅为2。

MxN的图片,经过卷积图层后,变成了(M/16) x (N/16)的特征图。

更快的R-CNN摒弃了R-CNN中的选择性搜索方法,使用RPN层生成候选帧,可以大大提高候选帧的生成速度。RPN层首先进行3×3卷积,然后分成两路。一路用于判断候选框是前景还是背景。它先将其重塑为一维向量,然后softmax判断是前景还是背景,再将其重塑为二维特征图。另一条路径用于确定候选框的位置,通过包围盒回归实现,后面会详细讨论。经过双向计算,选择前景候选帧(因为物体在前景中),利用计算出的候选帧位置,得到我们感兴趣的特征子图提议。

卷积层提取原始图像信息,得到256幅特征图。RPN层3×3卷积后,还是256个特征图。但是每个点融合了周围3x3的空间信息。对于每个特征图上一个点,生成k个锚(k(k缺省为9)。主播分为前景和背景(我们不管是飞机还是汽车,只需要区分是前景还是背景)。Anchor有四个坐标偏移量[x,y,w,h],其中x和y表示中心点的坐标,w和h表示宽度和高度。这样,对于特征图上的每个点,获得了具有不同大小和形状的K个选择区域。

对于生成的主播,首先要判断是前景还是背景。由于感兴趣的对象在前景中,在这一步之后,我们可以放弃背景锚点。大部分锚点属于后台,所以这一步可以过滤掉很多无用的锚点,从而减少全连接层的计算量。

3×3卷积后得到的256幅特征图,经过1x1卷积后,变换成18幅特征图。那么reshape就是一维向量,softmax判断是前景还是背景。这里整形的唯一功能是使数据可用于softmax计算。然后输出识别得到的前景锚点。

另一条路径用于确定候选框的位置,即锚点的[x,y,w,h]坐标值。如下图,红色代表我们当前的选区,绿色代表真正的选区。虽然我们现在的选择可以大致选择平面,但是距离绿色的真实位置和形状还是有很大的差距,所以需要对生成的锚点进行调整。这个过程被称为包围盒回归。

假设红框的坐标是[x,y,w,h],绿框的坐标,也就是目标框的坐标是[Gx,Gy,Gw,Gh],我们需要建立一个变换,使得[x,y,w,h]可以变成[Gx,Gy,Gw,Gh]。最简单的思路就是先做平移让中心点靠近,然后缩放让W和H靠近。如下所示:

我们要学的是dx dy dw dh的四则变换。因为是线性变换,所以可以用线性回归来建模。设置损失和优化方法后,就可以用深度学习来训练,得到模型。对于空间位置损失,我们一般使用均方误差算法,而不是交叉熵(分类预测使用交叉熵)。优化方法可以采用自适应梯度下降算法Adam。

在得到前景锚点并确定它们的位置和形状后,我们可以输出前景的特征子图建议。步骤如下:

1,获得前景锚点及其[x y w h]坐标。

2.根据锚点为前景的概率不同,按降序选择前pre_nms_topN个锚点,如前6000个。

3.排除非常小的锚。

4.通过NMS非最大抑制,找出可信度高的主播。这主要是为了解决选择重叠的问题。首先计算每个选区的面积,然后在softmax中按照它们的得分(即是否是前景的概率)排序,得分最大的选区放入队列。接下来,计算剩余选择和当前最大得分选择的IOU(IOU是两个框的交集面积除以两个框的并集面积,衡量两个框的重叠程度)。移除IOU大于设定阈值的选择。这样就解决了选区重叠的问题。

5.选择第一个post_nms_topN结果作为输出的最终选择建议,例如300。

经过这一步,物体定位应该就基本结束了,剩下的就是物体识别了。

类似于fast R-CNN,这一层主要解决之前得到的提案大小形状不一,无法进行全连接的问题。全连接计算只能对某些形状进行操作,因此需要使提案的大小和形状相同。这个问题可以通过裁剪和缩放来解决,但是会带来信息丢失和图像变形。我们可以通过使用ROI pooling有效地解决这个问题。

在ROI pooling中,如果目标输出为MxN,则将输入建议在水平和垂直方向上分为MxN个部分,每个部分取最大值,从而得到MxN的输出特性图。

ROI Pooling图层背后的特征图可以通过将图层与softmax充分连接来计算,比如人、狗、飞机,可以得到cls_prob概率向量。同时,再次利用包围盒回归对提议的位置进行微调,得到bbox_pred,用于返回更精确的目标检测帧。

这就完成了更快的R-CNN的整个过程。算法相当复杂,每个细节都需要反复理解。更快的R-CNN使用resNet101模型作为卷积层,在voc2012数据集上准确率可以达到83.8%,超过yolo ssd和yoloV2。它最大的问题是速度慢,每秒只能处理5帧,达不到实时性的要求。

Yolo创造性地提出一阶段来克服两阶段目标检测算法的共同缺点。即物体分类和物体定位一步完成。Yolo在输出层直接返回包围盒的位置和类别,实现了一步到位。这样yolo可以达到每秒45帧的运算速度,完全可以满足实时性要求(当达到每秒24帧时,人眼认为是连续的)。其网络结构如下:

它主要分为三个部分:卷积层、目标检测层和NMS屏蔽层。

采用Google inceptionV1网络,对应上图第一阶段,***20层。这一层主要进行特征提取,从而提高模型的泛化能力。不过作者修改了inceptionV1。他没有使用inception模块结构,而是用1x1的卷积和3x3的卷积并行替换。(可以考虑只使用了inception模块中的一个分支,应该是为了简化网络结构。)

经过四个卷积层和两个全连接层,最终生成7x7x30的输出。先经历四个卷积层的目的是为了提高模型的泛化能力。Yolo将一张448x448的原始图片划分成7×7的网格,每个网格要预测两个包围盒的坐标(x,y,w,h),以及盒子中包含的物体的置信度,以及物体属于20个类别中每一个类别的概率(yolo的训练数据是voc2012,这是一个包含20个类别的数据集)。所以一个网格对应的参数是(4x2+2+20) = 30。如下图

其中,前一项表示是否有人工标记的物体落入网格,如果有,则为1,否则为0。第二项表示包围盒和真实标记盒之间的重合度。它等于两个盒子面积的交集,除以面积和集合。值越大,盒子越接近真实位置。

分类信息:yolo的目标训练集是voc2012,这是一个20分类的目标检测数据集。常用的目标检测数据集如下:

| Name | # Images(trainval)| # Classes |上次更新时间|

| - | - | - | - |

| ImageNet | 450k | 200 | 2015 |

|可可| 120K | 90 | 2014 |

|帕斯卡VOC | 12k | 20 | 2012 |

牛津-IIIT宠物医院| 7K | 37 | 2012 |

| KITTI Vision | 7K | 3 | |

每个网格还需要预测它属于这20个类别的概率。分类信息针对每个网格,而不是边界框。所以我们只需要20个,不是40个。而置信度针对的是包围盒,只表示盒子里是否有物体,不需要预测物体是20个类别中的哪一个,所以只需要两个参数。虽然分类信息和置信度都是概率,但意义完全不同。

筛选层的目的是从多个结果(多个包围盒)中筛选出最合适的。这种方法和更快的R-CNN中的方法基本相同。首先过滤掉得分低于阈值的盒子,剩下的盒子进行NMS非极大值抑制,去掉重叠度高的盒子(具体的NMS算法可以在上面更快的R-CNN一节回顾)。这样,最终得到最合适的盒子及其类别。

Yolo的损失函数包括位置误差、置信度误差和分类误差三部分。具体公式如下:

均方误差算法用于所有误差。其实我觉得位置误差应该用均方差算法,分类误差应该用交叉熵。因为物体位置只有4个参数,类别有20个参数,所以它们的累积和是不一样的。给予同样的权重显然是不合理的。所以yolo中的位置误差权重是5,类别误差权重是1。因为我们并不是特别在意不包含物体的包围盒,所以给不包含物体的包围盒的置信度误差的权重是0.5,包含物体的包围盒的权重是1。

较快的R-CNN有较高的mAP准确率和较低的召回率,但速度较慢。而Yolo虽然速度很快,但是准确率和漏检率都不尽如人意。SSD结合了它们的优缺点。对于300x300的输入图像,在voc2007数据测试上可以达到每秒58帧(Titan X的GPU)和72.1% mAP。

固态硬盘的网络结构如下:

和yolo一样,分为三个部分:卷积层、目标探测层和NMS屏蔽层。

SSD论文采用VGG16的基本网络,这其实是几乎所有目标检测神经网络的惯用方法。首先用CNN网络提取特征,然后进行后续的目标定位和目标分类识别。

该层由五个卷积层和一个平均池层组成。最后一个完全连接的层被移除。SSD认为目标检测中的物体只与周围的信息有关,其感受野不是全局的,因此是不必要的,不应该完全连通。固态硬盘的特点如下。

每个卷积层将输出不同感受野的特征图。在这些不同尺度的特征图上,对目标位置和类别进行训练和预测,可以达到多尺度检测的目的,可以克服yolo对长宽比异常的物体识别准确率低的问题。在yolo中,只使用最后一个卷积层来训练和预测目标位置和类别。这是SSD相比yolo能够提高精度的一个关键点。

如上图所示,目标检测和分类将在每个卷积层上进行,最后由NMS滤波并输出最终结果。在多尺度特征图上进行目标检测,相当于增加了很多长宽比的包围盒,可以大大提高泛化能力。

与更快的R-CNN类似,SSD也提出了anchor的概念。通过卷积输出的特征图,每个点对应于原始图像的一个区域的中心点。以此点为中心,构造六个不同宽高比、不同大小的锚点(SSD中称为默认框)。每个主播对应四个位置参数(x,y,w,h)和21分类概率(voc训练集是20分类问题,加上主播是否是后台,***21分类)。如下图所示:

另外,在训练阶段,SSD将正负样本的比例定位在1: 3。给定训练集输入图像和每个对象的真实区域(地面真实框),选择默认框和真实框之间最近的作为正样本。然后选择IOU大于0.5的剩余默认框中的任意一个,真实框IOU为正样本。而另一些则作为阴性样本。因为大部分盒子都是负样本,会导致正负不平衡,所以根据每个盒子类别的概率,正负比例会保持在1: 3。SSD认为这个策略提高了4%的准确率。

另外,SSD使用了数据增强。生成它们与目标物体真实盒子之间IOU为0.1.30.50.70.9的面片,随机选择这些面片参与训练,随机水平翻转。SSD认为这个策略提高了8.8%的准确率。

和yolo的加网层基本一样。类似地,首先过滤类别概率低于阈值的默认框,然后使用NMS非最大值抑制过滤掉重叠度较高的框。只是SSD在不同的特征图上合成了目标检测输出的默认框。

SSD基本可以满足我们手机上实时物体检测的需求。TensorFlow官方目标检测模型SSD _ mobilenet _ v 1 _ Android _ export。Pb用SSD算法实现。它的基本卷积网络是mobileNet,适合在终端上部署和运行。

针对yolo精度低、易漏检、对长宽比异常的物体效果差的问题,结合SSD的特点,提出了yoloV2。它主要采用了yolo的网络结构,并在此基础上做了一些优化和改进,具体如下。

网络采用Darknet-19: 19层,包含大量的3×3卷积。同时增加了1x1卷积核的全局平均池层,供inceptionV1参考。其结构如下

Yolo和yoloV2只能识别20种物体。为了优化这个问题,yolo9000被提出,它可以识别9000种物体。在yoloV2的基础上,进行了imageNet和coco的联合训练。该方法充分利用了imageNet可以识别1000个物体,coco可以检测目标位置的优势。使用imageNet训练时,仅更新与对象分类相关的参数。使用coco时,所有参数都会更新。

YOLOv3可以说是直接挂了所有的图像检测算法。与同期的DSSD(反卷积SSD)和FPN(特征金字塔网络)相比,精度更高或相近,速度为1/3。

YOLOv3的变化主要包括以下几点:

但如果需要更准确的预测框架,以COCO AP作为评测标准,YOLO3在准确率上的表现就弱一些。如下图所示。

目前,目标检测模型的算法也层出不穷。在两阶段领域,脸书在2017中提出了mask R-CNN。CMU还提出了A-Fast-RCNN算法,将对抗性学习引入目标检测领域。Face++还提出了光头强的R-CNN,主要讨论R-CNN在物体检测中如何平衡精度和速度。

一级台的领域也是百花齐放。2017年首尔大学提出了R-SSD算法,主要解决小尺寸物体检测效果差的问题。清华大学提出的RON算法,结合了两阶段命名法和一阶段法的优点,更加注重多尺度物体定位和负空间样本挖掘。

目标检测领域的深度学习算法需要目标定位和物体识别,算法相对复杂。目前各种新算法层出不穷,但是模型之间有很强的连续性。大多数模型算法都是基于前人的思路,站在巨人的肩膀上。我们需要知道经典模型的特点,这些招数是为了解决什么问题,为什么要解决。这样我们就可以举一反三,我们永远不会改变我们的宗教。综上所述,目标检测领域的主要难点如下:

了解目标检测的AI算法:R-CNN,更快的R-CNN,yolo,SSD,yoloV2。

从YOLOv1到v3的演进

SSD-Tensorflow超详细分析一:加载模型测试图片?/darknet/yolo/?/pjreddie/darknet

C#项目引用:/alturosdestinations/alturos . yolo

贴一张项目实践的图片。