深度学习究竟值不值得学习?

2020-07-30 09:32发布

2条回答

深度学习是一种特征学习方法,通过一些简单的非线性模型,可以把原始数据转变成为更高层次、更抽象的表达。只要有足够多的转换的组合,非常复杂的函数也可以被学习。

深度学习的突破极大推动了人工智能的发展,并广泛应用在计算机视觉、自然语言处理等领域中。很多互联网公司像百度、腾讯、华为都在重金布局人工智能领域。由于当前人工智能产业链具有技术驱动型特征,人才成为制约人工智能企业发展的重要因素。互联网企业能够把可行的技术应用到最恰当的有需求的领域,并结合合理的商业模式进行变现,才能实现产业的持续良性发展。

随着我国产业扶持政策的相继出台,二级市场也会出现持续高成长的人工智能上市公司,深度学习必将在其中发挥重大作用,未来发展前景非常广阔。


Anonyem
3楼 · 2020-10-15 14:15





背景

本篇论文的题目是《Richfeaturehierarchiesforaccurateojectdetectionandsemanticsegmentation》,翻译过来就是针对高准确度的目标检测与语义分割的多特征层级,通俗地来讲就是一个用来做目标检测和语义分割的神经网络。

本文作者:RossGirshick,JeffDonahue,TrevorDarrell,JitendraMalik。

这篇论文发布时间是2014年,它具有很多比较重要的意义。

在PascalVOC2012的数据集上,能够将目标检测的验证指标mAP提升到53.3%,这相对于之前最好的结果提升了整整30%.这篇论文证明了可以讲神经网络应用在自底向上的候选区域,这样就可以进行目标分类和目标定位。这篇论文也带来了一个观点,那就是当你缺乏大量的标注数据时,比较好的可行的手段是,进行神经网络的迁移学习,采用在其他大型数据集训练过后的神经网络,然后在小规模特定的数据集中进行fine-tune微调。

什么是目标检测

给定一张图片可以识别出类别就是,对象识别。

比如,上面的图像就需要预测物体类别为cat。

而目标检测除了要识别类别外,还要找到他们的位置。

显然,目标检测比对象识别更难。

R-CNN在前人的肩膀上前行

在过去的十多年时间里,传统的机器视觉领域,通常采用特征描述子来应对目标识别任务,这些特征描述子最常见的就是SIFT和HOG.而OpenCV有现成的API可供大家实现相关的操作。

SIFT和HOG的王者地位最近被卷积神经网络撼动。

2012年Krizhevsky等人在ImageNet举办的ILSVRC目标识别挑战大赛中一战成名,豪夺当年的第一名,Top5错误率15%,而他们团队提出来的网络结构以他们的导师名字命名,它就是AlexNet。


它有5层卷积层,2层全连接层。

因为AlexNet的出现,世人的目光重回神经网络领域,以此为契机,不断涌出各种各样的网络比如VGG、GoogleNet、ResNet等等。

受AlexNet启发,论文作者尝试将AlexNet在ImageNet目标识别的能力泛化到PASCALVOC目标检测上面来。

但一切开始之前,需要解决两个主要的问题。

如何利用深度的神经网络去做目标的定位?如何在一个小规模的数据集上训练能力强劲的网络模型?

论文作者给出了思路。

利用候选区域与CNN结合做目标定位

借鉴了滑动窗口思想,R-CNN采用对区域进行识别的方案。

具体是:

给定一张输入图片,从图片中提取2000个类别独立的候选区域。对于每个区域利用CNN抽取一个固定长度的特征向量。再对每个区域利用SVM进行目标分类。

下面的图像来自论文本身。


利用预训练与微调解决标注数据缺乏的问题

采用在ImageNet上已经训练好的模型,然后在PASCALVOC数据集上进行fine-tune。

因为ImageNet的图像高达几百万张,利用卷积神经网络充分学习浅层的特征,然后在小规模数据集做规模化训练,从而可以达到好的效果。

现在,我们称之为迁移学习,是必不可少的一种技能。

R-CNN的目标识别之路

前面内容提到过,R-CNN系统分为3个阶段,反应到架构上由3个模块完成。

生产类别独立的候选区域,这些候选区域其中包含了R-CNN最终定位的结果。神经网络去针对每个候选区域提取固定长度的特征向量。一系列的SVM分类器。

候选区域

能够生成候选区域的方法很多,比如:

objectnessselectivesearchcategory-independenobjectproposalsconstrainedparametricmin-cuts(CPMC)multi-scalecombinatorialgroupingCiresan

R-CNN采用的是SelectiveSearch算法。

特征抽取

R-CNN抽取了一个4096维的特征向量,采用的是Alexnet,基于Caffe进行代码开发。

需要注意的是Alextnet的输入图像大小是227x227。

而通过SelectiveSearch产生的候选区域大小不一,为了与Alexnet兼容,R-CNN采用了非常暴力的手段,那就是无视候选区域的大小和形状,统一变换到227*227的尺寸。

有一个细节,在对Region进行变换的时候,首先对这些区域进行膨胀处理,在其box周围附加了p个像素,也就是人为添加了边框,在这里p=16。

测试阶段的目标检测

在测试阶段,R-CNN在每张图片上抽取近2000个候选区域。

然后将每个候选区域进行尺寸的修整变换,送进神经网络以读取特征,然后用SVM进行类别的识别,并产生分数。

候选区域有2000个,所以很多会进行重叠。

针对每个类,通过计算IoU指标,采取非极大性抑制,以最高分的区域为基础,剔除掉那些重叠位置的区域。

运行时分析

两个因素可以让目标识别变得高效。

CNN的参数是所有类别共享的。R-CNN生成的特征向量维度较少。论文拿应用在UVA采用的空间金字塔技术相比,它们生成的特征维度是360k,而R-cnn就4K多。

也就是运行过程中,参数变少了,所以比传统的高效。

体现在提取特征的时间,如果用GPU,13s/张,CPU53s/张。

R-cnn能够处理100k种类别,在一个多核的CPU上只要花费10多秒。

与UVA相比,如果处理100k个预测,需要134GB内存空间,而R-CNN只要1.5GB。

训练

前面已经提到过R-CNN采取迁移学习。

提取在ILSVRC2012的模型和权重,然后在VOC上进行fine-tune。

需要注意的是,这里在ImageNet上训练的是模型识别物体类型的能力,而不是预测bbox位置的能力。

ImageNet的训练当中需要预测1000个类别,而R-CNN在VOC上进行迁移学习时,神经网络只需要识别21个类别。这是VOC规定的20个类别加上背景这个类别。

R-CNN将候选区域与GroundTrue中的box标签相比较,如果IoU>0.5,说明两个对象重叠的位置比较多,于是就可以认为这个候选区域是Positive,否则就是Negetive.

训练策略是:采用SGD训练,初始学习率为0.001,mini-batch大小为128.

对象识别相关

通常对待一个二值化的分类器,它的结果只要2中,Positive和Negetive。

比如,有一个汽车分类器,它可以轻松地确认,一个方框里面包含了一辆汽车,那么它肯定就是Positive。

也可以很清楚地确认,如果一个背景方框中没有包含汽车,那么它就是Negetive。

但是,比较难确认的是,如果一个方框,只有一部分与汽车重叠,那么如何标注这个方框呢?

R-CNN采用的是IoU的阈值,这个threshold取0.3,如果一个区域与Groundtureth的IoU值低于设定的阈值,那么可以讲它看成是Negetive.

IoU的threshold它不是作者胡乱取值的,而是来自{0,0.1,0.2,0.3,0.4,0.5}的数值组合的。

而且,这个数值至关重要,如果threshold取值为0.5,mAP指标直接下降5个点,如果取值为0,mAP下降4个点。

一旦特征抽取成功,R-CNN会用SVM去识别每个区域的类别,但这需要优化。

因为训练的数据太大,不可能一下子填充到电脑内存当中,R-CNN作者采取了一种叫做Hardnegetivemining的手段。

R-CNN的在PASCAL-VOC2010-12的表现

R-CNN是在PASCALVOC2012进行最终的fine-tune,也是在VOC2012的训练集上优化SVM.

然后,还与当时4个强劲的对手,也就是4个不同的目标检测算法进行了比较。


值得关注的是,上面表格中UVA检测系统也采取了相同的候选区域算法,但R-CNN的表现要好于它。

可视化、框架精简和错误检测

我们都知道,在卷积神经网络中,第一层可以直接用来显示,而且肉眼可视,通常他们是为了捕捉物体边缘,及突出的颜色信息,但越往后的卷积层越抽象,这个时候进行可视化就是一个挑战了。

Zeiler和Fergus提出了一种基于反卷积手段的可视化研究,但R-CNN的作者直接提供了一个没有参数的方法,简单直接。

思路是挑选一个特征出来,把它直接当成一个物体分类器,然后计算它们处理不同的候选区域时,activation的值,这个值代表了特征对这块区域的响应情况,然后将activation作为分数排名,取前几位,然后显示这些候选区域,自然也可以清楚明白,这个feature大概是什么。

R-CNN作者将pool5作为可视化对象,它的featuremap是6x6x255的规格,可以理解为有256个小方块,每个方块对应一个特征。

下面的图表中显示了这以可视化的效果,这里只显示了256个特征中的6个,每个特征取activation值最高的16个区域。


上图应该很明白了,对于同一类特征,activation相差不大,这也是卷积神经网络能够准确识别物体的直观体现。

框架精简

AlexNet有7层,那么那些层是关键指标呢?哪些层可有可无呢?


pool5在上一小节已经讨论过了,那么fc6和f7就成了研究的对象。

fc6与pool5构成全连接,为了计算feature它会乘以一个4096x9216的权重矩阵,然后在与一组bias相加,所以它有3700多万的参数。

fc7是最后一层,它的权重矩阵是4096x409,它的参数有1678万多的参数。

但经过作者在PASCAL上不做fine-tune处理,直接测试,可以发现fc7的意义没有fc6大,甚至移除它之后,对于mAP结果指标没有影响。

移除fc7就表示可以减少将近1800万个参数。

更惊喜的事情是,同时移除fc6和fc7并没有多大的损失,甚至结果还要好一点点。

所以,神经网络最神奇的力量来自卷积层,而不是全连接层。

上面说的是没有fine-tune的情况,那么在fine-tune的情况是什么呢?

结果证明,fine-tune后fc6与fc7提升的效果明显。

所以结论就是,pool5从ImageNet训练集中学习了物体的泛化能力,而能力的提升则是通过特定领域的fine-tune。

举个例子,神经网络在ImageNet数据集中学习到了100种猫的特征,而我自己的数据集只有两种猫,经过fine-tune训练后,这个神经网络可以更准确识别这两种猫了。

R-CNN还与其他的特征方法进行了能力比较,作者选取了两种基于DPM的方法,DPMST和DPMHSC,结果都证明,R-CNN要好于它们。

目标检测错误分析

R-CNN作者采用了Hoiem提出的目标检测分析工具,能够直观地揭露错误的模型,作者通过这个工具针对性地进行fine-tune。

bbox回归

bbox的值其实就是物体方框的位置,预测它就是回归问题,而不是分类问题。

受DPM的启发,作者训练了一个线性的回归模型,这个模型能够针对候选区域的pool5数据预测一个新的box位置。具体细节,作者放在补充材料当中。

语义分割

什么是语义分割?


区域分类技术是语义分割的标准做法,所以R-CNN也可以做语义分割,并且作者拿它跟O2P来比较。

R-CNN进行语义分割分为3个阶段。

利用CPMC生成候选区域,然后将这些区域调整大小为227x227,送到神经网络当中,这是full阶段,区域中有背景也有前景。这个阶段只处理候选区域的前景,将背景用输入的平均值代替,然后背景就变成了0,这个阶段称为fg。full+fg阶段,将背景和前景简单拼接。

回顾

R-CNN采用AlexNetR-CNN采用SelectiveSearch技术生成RegionProposal.R-CNN在ImageNet上先进行预训练,然后利用成熟的权重参数在PASCALVOC数据集上进行fine-tuneR-CNN用CNN抽取特征,然后用一系列的的SVM做类别预测。R-CNN的bbox位置回归基于DPM的灵感,自己训练了一个线性回归模型。R-CNN的语义分割采用CPMC生成Region

R-CNN灵活地运用了现有比较先进的工具和技术,并充分吸收,根据自己的逻辑改造,最终取得了很大的进步。

到2018年,R-CNN已经不是最先进的目标检测模型,也不是最先进的语义分割模型,但这篇论文最大意义在于展示了作者在资源匮乏的情况下如何整合现有的先进技术去解决自己问题的手段。

除了R-CNN外,还有一些很优秀的目标检测算法,我个人钟爱YOLO,有兴趣的同学可以看看这篇。《死磕YOLO系列,YOLOv1的大脑、躯干和手脚》


相关问题推荐

  • 回答 3

    换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...

  • 回答 42

    十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...

  • 回答 70
    已采纳

    前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...

  • 回答 28

    迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...

  • 回答 9

    python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • 回答 6

    第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...

  • 回答 1

    head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...

  • Python入门简单吗2021-09-23 13:21
    回答 45

    挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了

  • 回答 4

    Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...

  • 回答 8

     相当于 ... 这里不是注释

  • 回答 4

    还有FIXME

  • 回答 3

    python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。

  • 回答 8

    单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:#  单行注释print(hello world)注释可以放在代码上面也可以放在代...

  • 回答 2

    主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...

  • 回答 4

    或许是里面有没被注释的代码

  • 回答 26

    自学的话要看个人情况,可以先在B站找一下视频看一下

没有解决我的问题,去提问