卷积神经网络的架构及其性能分析


卷积神经网络现在在图像识别领域中使用广泛,主要有最原始的 CNN网络,之后再 CNN网络上演化出 R-CNN网络,但是由于速度还不够快,于是出现了 RCNN的改进版 Fast R-CNN与更快的框架 Faster R-CNN,这些提高了检测速度,但是准确率不高,为了提高准确率,增加了神经网络的层数,出现了梯度消失现象,于是又提出了 ResNet。针对特征大小不同增加了池化层,提出了 AlexNet。在 ResNet的基础上,又衍生出 mask R-CNN。为了使检测速度更快,改进了候选框的选取方式,利用回归的思想创造了 YOLOYOLO虽然改善了之前方式的缺点,但是又引入了新的缺点,为了改进YOLO的缺点,将 YOLO与之前的思想进行了结合,创造出 SSDYOLOSSD因为单级结构( one-shot)速度快而出现准确率的下降,针对这个问题问题,提出 RetinaNet进行解决。

本文将针对上述的几种框架进行分析,并分析对比其性能。

1 概述

神经网络初始的思想来自脑科学,为了识别物体,模仿大脑建立了低级的神经网络,这个时候的使用的是全连接,由程序员自己调参,其本质是人的猜测,实验不同的参数,观察输出结果,之后手动调节参数,直到可以将两个物体区分,本质是一个分类器。显然这种方法很慢,并且一旦层数过多,就会出现算力完全没有办法支持的现象,举个例子,假设有 5 ∗ 5 5*5 55的一组图片,使用一层 10 10 10个神经元的全连接,那么这一层就要计算 5 ∗ 5 ∗ 10 5*5*10 5510次计算,之后将每个神经元的输出结果相加,得到一个数字,这个数字就是这个物体的特征,通过调节10个神经元的参数使同一物体的特征值稳定,这时,如果再加一层 10 10 10个神经元的全连接,那么计算次数就变为 5 ∗ 5 ∗ 10 + 10 ∗ 10 5*5*10+10*10 5510+1010次计算,并且需要调节 20 20 20个神经元的参数,这不仅给计算机造成了很大的算力压力,而且结果的稳定性与正确性还极大地取决于调节参数的人。为了解决调参问题,提出了反向传播算法,将结果反馈给神经网络,通过求导的方式找到局部最优解,改变神经元的参数,使其最优化,到达局部最小值。当到了局部最优解,参数会卡在局部最优解,而最好的解是全局最优解,所以就出现drop out,当迭代稳定就将一部分神经元参数置零,这样可以将参数的起始位置放在另一个地方,之后再次寻找最优解。

任何一个物体都有其特征,人类的大脑通过这些特征来区分物体,而计算机并没有那么的智能,无法直接通过特征来区分物体,因为图片有大有小,这在计算机看来是不同的特征,所以需要一种方法,将特征进行放大和缩小,使得照片尺寸大小与特征无关。为了解决这一问题,在全连接的基础上加入了卷积核与池化层,一方面将图片缩放,另一方面将运算量减少,以达到更好的效果。这样卷积神经网络就诞生了。

2 CNN

CNN是最原始的卷积神经网络。就是在全连接原有的基础之上,增加卷积核,提取特征,之后将提取到的特征通过全连接进行分类,选取得分最高的一项作为物体识别的结果。举例,为了区别猫和狗,做一个训练集,将猫的图片标签记为 0 0 0,狗的图片标签记为 1 1 1,那么通过卷积神经网络之后,值接近 0 0 0的照片为猫,值接近 1 1 1的照片为狗,这样就分清了猫和狗。

CNN网络自己提取照片的特征,之后进行分类——这也是深度学习的由来,即机器自主提取特征——得到结果。CNN的缺点很明显,首先照片上只有一种物品,CNN并没有对照片进行分割,其次网络层数增加会导致梯度消失,使得整个网络变得冗余。

3 R-CNN

R-CNN是对于CNN的缺陷的一个改进,R-CNN在图像中创建了多个边界框,检查这些框中是否还有目标物体,R-CNN使用选择性搜索来从一张图片中提取这些边框。选择性搜索会确定物体在图片中的这些特征,然后基于这些特征突出不同区域。过程如下:

  1. 输入一张照片;
  2. 生成最初的分割图像;
  3. 基于颜色、结构、尺寸、形状,将相似的区域合并为更大的区域;
  4. 生成ROI(Region of Interest).

RCNN检测目标物体的步骤如下:

  1. 取一个预训练卷积神经网络;
  2. 根据需要检测的目标类别数量,训练网络的最后一层;
  3. 得到每张图片的ROI,对这些区域重新改造,以让其符合CNN的输入尺寸要求;
  4. 得到CNN输出后,训练SVM(支持向量机)来辨别目标物体和背景。对每个类别,我们都要训练一个二元SVM.

这样R-CNN就可以对目标物体进行检测了,同样缺点十分明显。在上述第 3 3 3步,ROI区域需要 2000 2000 2000多个,而每一个ROI需要一个CNN,这就导致训练一个R-CNN模型非常昂贵,根据选择性搜索,要对每张图片提取 2000 2000 2000个单独区域,用CNN提取每个区域的特征。假设我们有 N N N张图片,那么CNN特征就是 N ∗ 2000 N*2000 N2000,一个新照片需要 40 − 50 40-50 4050秒进行预测,对于大型数据基本无法处理。

4 Fast R-CNN

R-CNN基本过程是首先生成ROI,之后针对每一个ROI提取特征,最后对这些特征进行分类得到需要的目标,主要的时间消耗在CNN上。Fast R-CNN的创造者提出,如果每一张照片只用一次CNN就可以更快。于是,将R-CNN的执行步骤做了调整,首先对整个图片使用CNN,得到特征映射(feature map,矩阵 A A A通过卷积层形成矩阵 B B B B B B A A A的特征映射),通过特征映射划定ROI,要使用ROI池化层将ROI大小修正到合适大小,之后输入全连接层进行分类。这样一张图片只需要一次CNN,将时间减少了。但是R-CNN其他的缺点,Fast R-CNN依然没有解决,它同样用的是选择性搜索作为寻找感兴趣区域的,这一过程通常较慢。Fast R-CNN处理一张图片大约需要 2 2 2秒,但是这个速度对于大型数据集依然不过理想。

5 Faster R-CNN

Faster R-CNNFast R-CNN的优化版,主要为了优化ROI的生成,Fast RCNN使用的是选择性搜索,而Faster RCNN用的是Region Proposal Network(RPN)。RPN工作过程:

  1. 输入照片与GT(ground truth,即需要找的目标的正确边框);
  2. 以每一个特征映射的像素点为一个Anchor(锚点),以Anchor为中心生成 k k k个不同大小不同比例的矩形作为anchor boxes k k k默认为 9 9 9
  3. 通过计算 I O U IOU IOU( I n t e r s e c t i o n o v e r U n i o n Intersection over Union IntersectionoverUnion),将正样本标签定为与某一个GT有最高的IOU重叠的Anchor box。与任意一个GTIOU重叠部分大于 0.7 0.7 0.7Anchor box 。负样本标签定为给与所有GTIOU重叠部分都小于 0.3 0.3 0.3Anchor box。返回目标建议(object proposalsOP)和相应的得分。
  4. 应用ROI池化层,将所有proposals修正到同样尺寸,返回到全连接层,生成目标物体的边框。

这个时候的OPGT还是有很大的差距,需要进行修正。进行平移与回归,平移是将正样本的Anchor平移,也就是移动正样本的中点;回归是固定Anchor,改变box的大小。无论平移还是回归,都是为了将Anchor box接近GT

然后通过损失函数softmax loss(cross entropy loss,交叉熵损失)进行计算,这里的监督标签就是GT( 1 , 0 1,0 1,0),不断告诉训练出的结果对还是不对。就这样训练到最后分类训练完成,生成目标物体的边界框。

RPN简单来说就是在CNN之后将特征映射作为RPN的输入,进行训练,专门使用了一个网络寻找物体的边框,RPN将前景以背景分开进行物体识别,RPN不解决这个物体是什么,之后通过这个物体边框中的特征进行分类,得到这个物体是什么。

这时,Faster R-CNN对一张图片的检测时间可以缩减到 0.2 0.2 0.2秒。问题在于,准确性还不够高,CNN的层数一般限制在 5 5 5层。

6 AlexNet

CNN的层数增加,会出现梯度消失,也就是反向传播算法改变靠近输入层的神经网络参数编的迟缓甚至停滞,与梯度爆炸一样主要是参数连乘导致的。梯度消失使得深层神经网络训练一仅仅使用最后几层的效果一样,这阻碍了深层神经网络的发展。AlexNet就是为了梯度消失而被提出的第一种方法。

AlexNet中包含了几个比较新的技术点,也首次在CNN中成功应用了ReLUDropoutLRN等方法。同时AlexNet也使用了GPU进行运算加速。AlexNetLeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中。AlexNet主要使用到的新技术点如下:

  1. 成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。虽然ReLU激活函数在很久之前就被提出了,但是直到AlexNet的出现才将其发扬光大。
  2. 训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要是最后几个全连接层使用了Dropout
  3. CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
  4. 提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
  5. 使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半的神经元的参数。因为GPU之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。
  6. 数据增强,随机地从 256 ∗ 256 256*256 256256的原始图像中截取 224 ∗ 224 224*224 224224大小的区域(以及水平翻转的镜像),相当于增加了 2 ∗ ( 256 − 224 ) 2 = 2048 2*(256-224)^2=2048 2(256224)2=2048倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得 10 10 10张图片,对他们进行预测并对 10 10 10次结果求均值。同时,AlexNet论文中提到了会对图像的RGB数据进行PCA处理,并对主成分做一个标准差为 0.1 0.1 0.1的高斯扰动,增加一些噪声,这个方法可以让错误率再下降 1 % 1\% 1%

7 ResNet

ResNet就是为了梯度消失而被提出的第二种方法。ResNet通过跨层的飞线,将信息跳层传输,以便抵抗梯度消失现象,假设ResNet以每两层进行一次飞线,如下图:

图1

这样就可以将神经网络的层数可增加至 152 152 152层,这样的层数增加带来了显著的正确率增加。

8 Mask R-CNN

在之前的Faster R-CNN的基础上,增加了更强大的功能。经过前面的分析,Faster R-CNN中RPN只能对物体进行分割,但是无法进行语义分割(Semantic Segmentation)和实例分割(Instance Segmentation)。Mask R-CNNFaster R-CNN与语义分割算法FCN结合,Faster R-CNN可以快速准确的检测目标,FCN可以精确的完成语义分割。由于发现了ROI Pooling中所存在的像素偏差问题,提出了对应的ROIAlign策略,加上FCN精准的像素MASK,使得其可以获得高准确率。也就是说Mask R-CNNFaster R-CNN + ROIAlign(RPN的基础上改进) + FCN。尽管Mask R-CNNFaster R-CNN复杂,但是速度依旧和Faster R-CNN一样。

大致过程如下:

  1. 输入一幅你想处理的图片,然后进行对应的预处理操作,或者预处理后的图片;
  2. 将其输入到一个预训练好的神经网络中(ResNet等)获得对应的feature map
  3. 对这个feature map中的每一点设定预定个的ROI,从而获得多个候选ROI
  4. 将这些候选的ROI送入RPN网络进行二值分类(前景或背景)和BB回归,过滤掉一部分候选的ROI
  5. 对这些剩下的ROI进行ROIAlign操作(即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来);
  6. 对这些ROI进行分类( N N N类别分类)、BB回归和MASK生成(在每一个ROI里面进行FCN操作)。

Mask R-CNN最大的改进在于使用了ROI Align,在Faster RCNN中,有两次整数化的过程:

  1. region proposal x , y , w , h x,y,w,h x,y,w,h通常是小数,但是为了方便操作会把它整数化。
  2. 将整数化后的边界区域平均分割成 k ∗ k k*k kk个单元,对每一个单元的边界进行整数化。

事实上,经过上述两次整数化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。为了解决这个问题,ROI Align方法取消整数化操作,保留了小数,使用以上介绍的双线性插值的方法获得坐标为浮点数的像素点上的图像数值。但在实际操作中,ROI Align并不是简单地补充出候选区域边界上的坐标点,然后进行池化,而是重新进行设计。

采用双线性差值,对特征映射的像素点进行插值计算,用4个采样点确定一个单元格中的一个点,之后再对单元格中 4 4 4个点进行maxpooling。如下图:

图2

虚线为特征映射,每一个单元(黑框中用红线分割的一个小框)中的点由4个特征映射的点进行双插值(得到 4 4 4个箭头指的点),之后再对每个单元做maxpooling得到每个单元的值。

9 YOLO

之前的网络将物体识别与定位的过程分开,所以称为两阶段(two-stage)目标检测,而YOLO采用一阶段(one-stage)目标检测,YOLO将这两个过程结合在一起,一次完成识别与检测。YOLO主要是将检测速度提升,但是mAP没有Faster R-CNN高。

YOLO主要思想是将一张图片先分成 S ∗ S S*S SS个单元格子,之后的输出是以单元格为单位进行的:

  1. 如果一个object的中心落在某个单元格上,那么这个单元格负责预测这个物体。
  2. 每个单元格需要预测 B B Bbbox值(bbox值包括坐标和宽高),同时为每个bbox值预测一个置信度(confidence scores)。也就是每个单元格需要预测 B × ( 4 + 1 ) B×(4+1) B×(4+1)个值。
  3. 每个单元格需要预测 C C C(物体种类个数)个条件概率值。
  4. 所以,最后网络的输出维度为 S ∗ S ∗ ( B ∗ 5 + C ) S*S*(B*5+C) SS(B5+C),这里虽然每个单元格负责预测一种物体(当有小物体时可能会有问题),但是每个单元格可以预测多个bbox值。

YOLO速度提升至每秒 45 45 45张图片,但是正确率下降,并且有明显缺点:面对小物体效果不好。

10 SSD

SSD是在YOLO基础上加入Faster R-CNNanchor box思想,观察YOLO,发现后面存在两个全连接层,全连接层以后,每一个输出都会观察到整幅图像,并不是很合理。但是SSD去掉了全连接层,改为了卷积层,每一个输出只会感受到目标周围的信息,包括上下文,增加合理性。

YOLO最后一层的输出作为Fast NMS网络的输入,而SSDYOLO中又加入几层卷积,并将这些卷积层的输出拼接作为Fast NMS网络的输入。SSD将速度提升至每秒 58 58 58张,并且提升了mAP,但是SSD同样有YOLO的缺点。

11 RetinaNet

RetinaNet主要的思想是更改损失函数的计算方式,Focal loss是在交叉熵损失函数基础上进行的修改。经过人们的观察与统计发现,大部分需要检测的目标都少于背景或者有时样本出现偏差,比如正样本数量远远超过负样本数量。这样训练出的网络效果非常不好。于是RetinaNet的作者就将某一种样本在损失函数中的权值变大,比如正样本数量远远超过负样本数量时,就将负样本损失函数的权值调大,正样本调小,再比如背景远大于需要检测的目标,这时将背景的损失函数权重调小,减少背景的影响。这样做不仅可以应对正负样本数量相差较大的情况,而且还可以改善YOLOSSD的缺点。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FishPotatoChen

谢谢您的支持,我会更努力的~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值