cnn如何自己练习(能力提升培训第二场)
cnn如何自己练习(能力提升培训第二场)– 1957年,计算机专家 Frank Rosenblatt 开始从事感知 器研究,并制成硬件,被认为是最早的神经网络模型。– 1959年,两位电机工程师 Bernard Widrow 和 Marcian Haff 开发出一种被称为自适应线性单元 (ADALINE) 的网络模型,并在其论文“Adaptive Switching Circuits” 中描述了该模型和学习算法。• 该网络通过训练,可以成功用于抵消通信中的回波 和噪声,也可用于天气预报,成为第一个用于实际 问题的神经网络。– 1956 年,美国的明斯基(M. Minsky 2016去世)、西蒙 (H.Simon)以及麦卡锡(J. Mccarthy)等人在“达特茅斯夏 季人工智能研究项目”(Dartmouth Summer Research Project on Artificial Intelligence)首次提出了人工智能
Deep learning in Computer vision1 Deep learningwhat’s deep learningapplications of deep learningBig Year for AIThe History of AI2 神经网络基础生物神经元和人工神经元拓扑结构网络训练BP算法3 神经网络实战应用分类任务检测任务4 大家关心的一些事儿Deep learningwhat’s deep learning人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型(Connection Model),它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。
人脑中神经元的数量病情分析:据调查,人体大约有140亿到160亿个细胞,而大脑内的神经元有100亿个,而且大脑神经元是不可再生的,一般情况下,在成人以后会随着年龄的增加而逐渐减少。另外,神经元的基本功能是通过接受、整合、传导和输出信息进行信息的传递与处理,通俗来说,神经元具有支配运动,感受信息的作用,人体通过神经元构成一个完整的个体,构成完整的神经功能。
深度学习中神经元的基本结构1943年,Mcculloch 和 Pitts提出神经元的数学模型
为了制造出一个人类大脑,一个国际研究组织筹措了16亿美元的资金,发起了人类大脑项目。这是人类迄今为止最大、也是最重大的一个人脑再造项目。人类的神经元连接超过1000亿,它们决定了我们的情绪、意志、意识。在未来10年里,各个学科的科学家将努力破解这些神经元连接,在一台超级计算机上逐步分层地映射它们。
– 1943年,心理学家 Warren.S. McCulloch 和数理逻辑学家 Walter Pitts 建立了神经网络和数学模型,称为MP (Machine Perception) 模型:
• 是一篇关于神经元如何工作的开拓性文章:“A Logical Calculus of Ideas Immanent in Nervous Activity”。
– 指出,脑细胞的活动像断/通开关,脑细胞可 以按各种方式相互结合,进行各种逻辑运算。
– 用电路实现了简单的神经网络模型,并预言大 脑的所有活动最终将被解释清楚。
• 虽然问题并非如此简单,但它给人们一个信念: 即大脑的活动是靠脑细胞的组合连接实现的。
– 1949年,心理学家 Donala Hebb 写了 一 本 书 : “ The Organization of Behavior”。
• 在该书中,他强调了心理学和生 理学之间的联系和沟通,指出脑 细胞间的通路在参与某种活动时 将被加强,这就是后来的Hebb学习规则。
• 提出了突触联系强度可变的设想。
• 目前有些神经网络模型仍然采用 这种学习规则。
– 二十世纪50年代,随着计算机的发展和软硬件的进步, 开始对部分神经系统功能的理论进行模拟,拓宽了研
究的路子。
• IBM的研究室在Hebb工作的基础上,对神经网络的 模型进行了软件模拟。虽然开始时失败了,但在 “使得模型像人那样适应环境”的实验上取得了一 定程度的成功。
• 在此情况下,人们开始酝酿人工智能的项目。
– 1956 年,美国的明斯基(M. Minsky 2016去世)、西蒙 (H.Simon)以及麦卡锡(J. Mccarthy)等人在“达特茅斯夏 季人工智能研究项目”(Dartmouth Summer Research Project on Artificial Intelligence)首次提出了人工智能的 概念,使人工智能成为计算机科学的一个分支。
人们提出两条研究思路:
• 采用高级人工智能方法,试图建立描述智能机功能
的计算机程序;
• 根据大脑对初级信号(比如视觉信号)处理方式构 建成结构模型,以实现智能化。(使一部机器的瓜方 式就象是一个在行动时所依据的智能)
–宣告了人工神经网络的诞生!
– 1957年,计算机专家 Frank Rosenblatt 开始从事感知 器研究,并制成硬件,被认为是最早的神经网络模型。
– 1959年,两位电机工程师 Bernard Widrow 和 Marcian Haff 开发出一种被称为自适应线性单元 (ADALINE) 的网络模型,并在其论文“Adaptive Switching Circuits” 中描述了该模型和学习算法。
• 该网络通过训练,可以成功用于抵消通信中的回波 和噪声,也可用于天气预报,成为第一个用于实际 问题的神经网络。
– 1962年, Frank Rosenblatt 出版了一本书“The Principles of Neurodynamics”,详述了他的感知器模型。
• 该感知器具有输入层、输出层和中间层,通过实验可以模仿人的某些特性,并断言它可以学会任何它可以表示的功能。
– 1967年,Stephen Grossberg 通过对生理学的研究,开发了一种称作 Avalanche(雪崩网)的神经网络模型, 可以执行连续语音识别和控制机器人手臂的运动。
–在这一时期,由于感知器的某些进展和对神经网络的 宣传,人们乐观地认为几乎已经找到了实现智能的关 键,许多部门开始大批地投入此项研究,希望尽快占 领制高点,形成了研究人工神经网络的第一次高潮。
–由于当时对神经网络的乐观情绪的影响,人们夸大了 神经网络的潜力(有人甚至担心制造机器人的人类会 很快受到机器人的攻击)。
反思期– M. Minsky 等仔细分析了以感知器为代表的神经网络 系统的功能及局限后,于1969年出版了《Perceptron》
一书,指出感知器不能解决高阶谓词问题,不能解决 异或问题,将Rosenblatt的感知器拉下神坛。
– 他们的论点极大地影响了神经网络的研究,加之当时 串行计算机和人工智能所取得的成就,掩盖了发展新 型计算机和人工智能新途径的必要性和迫切性,使人 工神经网络的研究处于低潮。
– 在此期间,仍有一些有影响力的工作:自适应谐振理 论(ART网)、自组织映射、认知机网络,以及有关 神经网络数学理论的研究。
– 二十世纪70年代到80年代早期,仍有一些坚信神经网 络的人坚持研究工作。比如:
• 神经生理学家 James Anderson 开发的盒中脑模型 (Brain-State-in-a-Box,BSB)。
• 日本学者 Kunihik Fukushima 开发的用于视觉图形识 别的认知器模型(Neocognitron)。
• 电气工程师 Teuvo Kohonen 开发的与BSB类似的网 络模型。
• 以及 Grossberg Rumelhart McClelland Marr Amari 和 Cooper 等人的工作。
– 1982年,John Hopfield 向美国科学院递交了有关神经 网络的报告,主要内容就是建议收集和重视以前对神经网络的工作,其中特别强调了每种模型的实用性。
– 根据对神经网络的数学分析和深入理解, Hopfield 揭 示了以往的网络是如何工作的,可以做些什么,并提 出了他自己的模型,能从失真的或不完善的数据图像 中获得完整的数据图像,引起了美国军方的兴趣。
– 当时,人工智能对自动制导车的研究失败,而利用神 经网络有可能解决这个问题,使人们的注意力重新投 向人工神经网络,导致了人工神经网络的第二次高潮。
– J. Hopfield提出Hopfield网络 (1984)
– Hinton、Sejnowsky、Rumelhart等人提出了著名的
Boltzmann机 (1985)
– Rumelhart等提出多层网络的学习算法—BP算法 (1986)
• 1970 – efficient error backpropagation Linnainmaa
–二十世纪90年代后,神经网络的研究趋于平缓:
• 应用领域不广、结果不够精确、存在可信度等问
题
–主要研究内容
• 开发现有模型的应用,改进模型和算法,提高训
练速度和准确度。
• 期望在理论上寻找新的突破,建立新的专用或通 用模型和算法。
• 进一步对生物神经系统进行研究,不断丰富对人脑的认识
– 2006年 加拿大多伦多大学教授,机器学习领域的泰斗 Geoffery Hinton 及其学生 Ruslan Salakhutdinov 在《科学》上发表了一篇论文开启了深度学习在学术界和工业界的新浪潮!
– 自2006年以来,深度学习在学术界持续升温。斯坦福大学、纽约大学、加拿大蒙特利尔大学等成为研究深度学习的重镇。2010年,美国国防部DARPA计划首次资助深度学习项目,参与方有斯坦福大学、纽约大学和NEC美国研究院。支持深度学习的一个重要依据,就是脑神经系统的确具有丰富的层次结构。一个最著名的例子就是Hubel-Wiesel模型,由于揭示了视觉神经的机理而曾获得诺贝尔医学与生理学奖。除了仿生学的角度,目前深度学习的理论研究还基本处于起步阶段,但在应用领域已显现出巨大能量。
– 2011年以来,微软研究院和Google的语音识别研究人员先后采用DNN技术降低语音识别错误率20%~30%,是语音识别领域十多年来最大的突破性进展。2012年,DNN技术在图像识别领域取得惊人的效果,在ImageNet评测上将错误率从26%降低到15%。在这一年,DNN还被应用于制药公司的Druge Activity预测问题,并获得世界最好成绩,这一重要成果被《纽约时报》报道。
神经网络基础生物神经元和人工神经元生物神经元神经细胞由细胞体和突起组成。 突起分为两种: 短的叫树突,从其它神经细胞接收信号传递给细胞体的;长的叫轴突,将信号传递给其它神经细胞的树突的。
神经元之间通过突触两两相连。
轴突记录了神经元间联系的强弱。
只有达到一定的兴奋程度,神经元才向外界传输信息。
每个神经元可抽象成一个激励函数(非线性处理)。
• 神经元的基本工作机制
–一个神经元有两种状态—兴奋和抑制
–平时处于抑制状态的神经元,当接收到其它神经元经由突触传来的冲击信号时,多个输入在神经元中以代 数和的方式叠加。
• 进入突触的信号会被加权,起兴奋作用的信号为正 起抑制作用的信号为负。
–如果叠加总量超过某个阈值,神经元就会被激发进入兴奋状态,发出输出脉冲,并由轴突的突触传递给其它神经元。
–就像生物神经元中有很多输入(激励)一样,处理单 元也有很多输入信号,并同时叠加到处理单元上。
–处理单元以输出作为响应。 –处理单元的输出像实际神经元一样,输出响应不但受
输入信号的影响,同时也受内部其它因素的影响:
• 内部因素:内部阈值或一个额外输入(称为偏置 项)
–处理单元的每一个输入都经过相关的加权,以影响 输入的激励作用:
• 类似于生物神经元中突触的可变强度,它确定了 输入信号的强度,一般把它看作连接强度的测度。
–处理单元的初始加权可以根据确定的规则进行调节修正:
• 类似于生物神经元中的突触强度可受外界因素影响
作用是将可能的无限域变换到指定的 有限范围内进行输出(类似于生物神经元的非线性转移特性)。
• 目前,深度学习在计算机视觉领域取得了引人注目的成 果。其中,激活函数的发展也起到了重要的作用。
• 新型激活函数ReLU在一定程度上克服了梯度消失,使得 深度网络的直接监督式训练成为可能。
• Bengio 等在ICML2016的文章“Noisy Activation Functions” 中有如下定义:
– 激活函数是映射 h:R→R,且几乎处处可导。
• 软饱和函数性质: 在无穷处导数为0。
常见的激活函数:
Sigmoid函数的软饱和性使得深度神经网络在二三十年里一直难以有效的训练,是阻碍神经网络发展的重要原因。如果使用sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失。
硬饱和函数:与软饱和相对的是硬饱和激活函数,即: f’(x)=0,当 |x| > c,其中 c 为常数。同理,硬饱和也分为左饱和和右饱和。
Relu– ReLU 在x<0 时硬饱和。由于 x>0时导数 为 1,所以,ReLU 能够在x>0时保持梯 度不衰减,从而缓解梯度消失问题。
– 导致网络稀疏性
– 但随着训练的推进,部分输入会落入硬 饱和区,导致对应权重无法更新。这种 现象被称为“神经元死亡”。
– ReLU还经常被“诟病”的一个问题是输出具有偏移现象,即输出均值恒大于零。
– 偏移现象和神经元死亡会共同影响网络的收敛性。
– 与LReLU相比,PReLU中的负半轴斜
率a可学习而非固定。
– 虽然PReLU 引入了额外的参数,但
基本不需要担心过拟合。
– 但也有可能导致性能有一定的下降。
– 数学形式与PReLU类似,但RReLU是一种非确定性激活函数,其参数是随机的。这种随机性类似于一种噪声, 能够在一定程度上起到正则效果。
拓扑结构单层网络– 输入信号表示为向量:x = [x1 x2 ... xd]T,其中每一 分量通过加权连接到各个结点。
– 每一个结点均可产生一个加权和。
– 输入和结点间采用全连接,并且都是前馈连接。
• 实际的人工神经网络和生物神经网络中有些连接 可能不存在。
–虽然目前有很多网络模型,但它们的结点基本上都是 按层排列的。这一点模仿了大脑皮层中的网络模块。
–多层网络是由单层网络进行级联构成的,即上一层的 输出作为下一层的输入。
–接收输入信号的层称为输入层。 –产生输出信号的层称为输出层。 –中间层称为隐含层,不直接与外部环境打交道。
• 隐含层的层数可从零到若干层。
• 实际情况中,层与层之间可能有部分连接的情况。
– 转移函数应是非线性的,否则多层网络的计算能力并不比单层网络强:
• 对线性转移函数:第一层的输出xTW1作为第二层 的输入,通过第二个加权矩阵得到网络的输出:y=W2(W1x)=(W2W1)x=Wx
• 可见:两层线性网络等效于单层网络,只是后者的加权矩阵为两个加权矩阵的乘积。
没有层内联接,各结点前馈联接到下一层所有结点
结点的输出:依赖于当前的输入,也依赖于自己以前的输出。网络有回路,信息可以沿回路流动
–前馈型网络“不存储记忆”,结点的输出仅仅是当前 输出的加权和(再加激励)。
–在反馈网络中,要将以前的输出循环返回到输入。
–反馈网络类似于“人类的短期记忆”,即网络的输出状态部分取决于以前的输入,是一类广泛应用的网络。
• 有监督的训练
–希望训练这样一个网络,对每个训练数据,通过该网 络计算之后能尽可能输出其原先给定的值。
• 无监督训练
–无监督的训练不要求有目标向量,网络通过自身的“ 经历”来学会某种功能。
–其目的是训练一个网络,使其产生的输出具有某种可理解的规律性。
–从本质上讲,该训练过程是抽取样本所隐含的统计特征。
Hebb认为:如果源和目的神经元都被激活或抑制,则它们之间的联系会加强。
– 基本思路(突触修正假设):如果两个相互联接的处理单元(结点)处于相同的激励电平(即输出值具有 相同的符号),则突触传导增强(权重增强)。
– 训练策略:数学上,两结点 i 和 j 的连接权重将按它们 的输出值之积来改变:
– Hebb学习规则需预先设置权饱和值,以防止输出和输
出正负始终一致时出现权重无约束增长。
– Hebb学习规则是前馈、无指导学习规则。
训练方法(分析方法)
–基本思路:按差值最小准则连续地修正各连接 权重的强度。
• 差值最小:是指处理单元所要求的输出与当前实际 输出间的差值,通过调节各权重值以达到最小。
–训练策略:梯度下降法
• 普遍采用的一种有效的训练方法:
–基本思路:采用概率和能量关系来调节权重 –训练策略:随机改变一个权重,计算改变后产生的最终能量,并按如下准则来确定是否接受此改变:
• 若改变后,网络的能量降低,则接受这一改变。
• 若改变后,能量没有降低,则根据一个预定的概率 分布来保留(接受)这一改变。
• 否则,拒绝这一改变,使权值恢复到原来的值。 –典型的随机训练算法:模拟退火算法
D. Rumelhart,J. McClelland于1985年提出了误差反向传播(Back Propagation BP)学习算法。
• 基本原理
– 利用输出后的误差来估计输出层的前一层的误差,再用 这个误差估计更前一层的误差,如此一层一层地反传下去,从而获得所有其它各层的误差估计。
以分类问题举例子:
– 对于模式分类问题,假定其类别数为c,通常输出层的结点个数为c 。
– 对于训练样本 x,如果它属于第 i 类,则其目标值可以 定义为一个 c 维向量,该向量只有第 i 个元素为1,其 余元素的值均为 0 (或-1)。这些值分别按序分配给 c 个 输出结点。
– 在人工神经网络中,通常称为 one-hot vectors: A one- hot vector is a vector which is 0 in most dimensions and 1 in a single dimension.
网络压缩,dropout,初始化权重,正则化,学习率,优化器
神经网络实战应用分类任务图像分类是要解决图片中是否包含某类物体的问题,对图像进行特征描述是物体分类的主要研究内容。
卷积神经网络输入层、卷积层、激活层、池化层、全连接层
池化主要作用:特征降维、避免过拟合
ImageNet是一个超过15 million的图像数据集,大约有22 000类。
是由李飞飞团队从2007年开始,耗费大量人力,通过各种方式(网络抓取,人工标注,亚马逊众包平台)收集制作而成,它作为论文在CVPR-2009发布。
当时人们还很怀疑通过更多数据就能改进算法的看法。
深度学习发展起来有几个关键的因素,一个就是庞大的数据(比如说ImageNet),一个是GPU的出现。(还有更优的深度模型,更好的优化算法,可以说数据和GPU推动了这些的产生,这些产生继续推动深度学习的发展)。
由于当时的GPU运算能力比较低,AlexNet通过两个GPU协同训练,因此文章给出的网络结构不如NetScope的清晰。清晰的图见这里,http://ethereon.github.io/netscope/#/gist/e65799e70358c6782b1b。
该网络共包含8个权重层,其中5个卷积层,3个全连接层。1,2卷积层后连有LRN层,不过此后的网络也证明LRN并非CNN中必须包含的层,甚至有些网络加入LRN后效果反而降低。每个LRN及最后层卷积层后跟有最大池化层,并且各个权重层均连有RELU激活函数。全连接层后使用了dropOut这一神器以解决过拟合。上面这幅图的feature map 维度需要综合上下两个GPU的结果,其输入为2242243的图片,第一层卷积层的kernel个数为96,size为11113,步伐为4,其得到的feature map size为555548。有个细节,计算feature map size时我们发现,(224-11)/4 并不能整除,也就是说kernel在水平移动时的最后一个感受野并非为1111。不过这个细节在NetScope中已经修改了,里面的输入被resize到227227*3。其后的卷积、池化及全连接就比较好理解了,当我们发现卷积的kernel size不能整除时,自动pad就好啦。
VGG
VGGNet可以看成是加深版本的AlexNet,都是由卷积层、全连接层两大部分构成。VGGNet探索了卷积神经网络的深度与其性能之间的关系,成功地构筑了16~19层深的卷积神经网络,证明了增加网络的深度能够在一定程度上影响网络最终的性能,使错误率大幅下降。
1、小卷积核:使用2个33卷积核来代替55卷积核;不但具有相同的感受野,且参数更少;且引入了更多的非线性因素,增强了模型的表达;
2、小池化核:2*2
3、通道数多:可以提取更多的信息;
4、全连接转卷积(在测试阶段)-解放了输入图片size的限制(通过卷积操作,其最后输出的维度仅为人为定义的通道数);
一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题:
(1)参数太多,如果训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。
解决这些问题的方法当然就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。
如何减少参数?
第一步通过2个33的卷积核来代替一个55的卷积核,感受野相同的情况下,两个33的卷积核的参数为233=18,而55卷积核的参数为25个;
在卷积之前通过1*1的卷积核来降低feature map维度,之后再卷积;
将nn的卷积核替换为1n和n*1两个卷积核。
总结:
参数更少:GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍;
性能更好:占用更少的内存和计算资源,且模型结果的性能却更加优越。
通过实验可以发现:随着网络层级的不断增加,模型精度不断得到提升,而当网络层级增加到一定的数目以后,训练精度和测试精度迅速下降,这说明当网络变得很深以后,深度网络就变得更加难以训练了。
神经网络在反向传播过程中要不断地传播梯度,而当网络层数加深时,梯度在传播过程中会逐渐消失(假如采用Sigmoid函数,对于幅度为1的信号,每向后传递一层,梯度就衰减为原来的0.25,层数越多,衰减越厉害),导致无法对前面网络层的权重进行有效的调整。
假设:假设现有一个比较浅的网络(Shallow Net)已达到了饱和的准确率,这时在它后面再加上几个恒等映射层(Identity mapping,也即y=x,输出等于输入),这样就增加了网络的深度,并且起码误差不会增加,也即更深的网络不应该带来训练集上误差的上升。而这里提到的使用恒等映射直接将前一层输出传到后面的思想,便是著名深度残差网络ResNet的灵感来源。
假定某段神经网络的输入是x,期望输出是H(x),即H(x)是期望的复杂潜在映射,如果是要学习这样的模型,则训练难度会比较大;
回想前面的假设,如果已经学习到较饱和的准确率(或者当发现下层的误差变大时),那么接下来的学习目标就转变为恒等映射的学习,也就是使输入x近似于输出H(x),以保持在后面的层次中不会造成精度下降。
在上图的残差网络结构图中,通过“shortcut connections(捷径连接)”的方式,直接把输入x传到输出作为初始结果,输出结果为H(x)=F(x) x,当F(x)=0时,那么H(x)=x,也就是上面所提到的恒等映射。于是,ResNet相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值H(X)和x的差值,也就是所谓的残差F(x) = H(x)-x,因此,后面的训练目标就是要将残差结果逼近于0,使到随着网络加深,准确率不下降。
这种残差跳跃式的结构,打破了传统的神经网络n-1层的输出只能给n层作为输入的惯例,使某一层的输出可以直接跨过几层作为后面某一层的输入,其意义在于为叠加多层网络而使得整个学习模型的错误率不降反升的难题提供了新的方向。
至此,神经网络的层数可以超越之前的约束,达到几十层、上百层甚至千层,为高级语义特征提取和分类提供了可行性。
因为经过“shortcut-connections(捷径连接)”后,H(x)=F(x) x,如果F(x)和x的通道相同,则可直接相加,那么通道不同怎么相加呢。上图中的实线、虚线就是为了区分这两种情况的:
实线的Connection部分,表示通道相同,如上图的第一个粉色矩形和第三个粉色矩形,都是3x3x64的特征图,由于通道相同,所以采用计算方式为H(x)=F(x) x;
虚线的的Connection部分,表示通道不同,如上图的第一个绿色矩形和第三个绿色矩形,分别是3x3x64和3x3x128的特征图,通道不同,采用的计算方式为H(x)=F(x) Wx,其中W是卷积操作,用来调整x维度的。
深度学习中的检测任务包含了分类和定位两个子任务,暨提供准确的定位信息和分类信息。为了评估定位精度,需要计算IoU(Intersection over Union,介于0到1之间),其表示预测框与真实框(ground-truth box)之间的重叠程度。IoU越高,预测框的位置越准确。因而,在评估预测框时,通常会设置一个IoU阈值(如0.5),只有当预测框与真实框的IoU值大于这个阈值时,该预测框才被认定为真阳性(True Positive TP),反之就是假阳性(False Positive,FP)。
1、YOLO的速度很快,因为将detection作为一个regression的问题之后,它就不再需要大量的计算过程了,在不使用GPU的情况下就可以达到45帧每秒的处理速度
2、YOLO采取整个图片作为输入,它获取的是全局的信息,因而能够做出更好的预测,不像一些基于滑窗或者是建议框的方法,YOLO能够提取到更加高级的语义信息。
3、YOLO具有更强的迁移性和适应性,当它被应用于一些陌生的场景时。
将一幅图像分成SxS个网格(grid cell),如果某个object的中心 落在这个网格中,则这个网格就负责预测这个object。
每个网格要预测B个bounding box,每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准.
每个bounding box要预测(x y w h)和confidence共5个值,每个网格还要预测一个类别信息,记为C类。则SxS个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是S x S x (5*B C)的一个tensor。
SSD可以说是集中了YOLO与RCNN系列的有点,所以整个网络的性能也就得到了大大的提高。首先,它采取了ONE-stage的思想,较大幅度的提高了网络的运行速度。其次他借鉴采用了RCNN系列中Fast RCNN的anchor思想,并且基于此提出了特征分层提取以适应多尺度的目标这样一种设想。SSD的出现可以说是提供了一种高速高效的检测方法
先来介绍一下SSD的框架部分,这张图片是作者原文中提供的一个以VGG16为模板的SSD模型,在这个模型中整个SSD的网络分为了六个部分,每一个部分都会进行单独的候选框生成,特征提取,通过这种金字塔架构的多层信息融合,在最后一层有助于完成多尺度的detection。
第一层直接保留了vgg16的前五层进行特征提取,生成一个特征图,然后进行边框的分类和回归,然后将vgg16的fc6和fc7两个变为两个卷积层,作为SSD多级特征中的第二层和第三层。紧接着SSD又添加了四个卷积层用来继续进行高层语义的提取工作。在每一个层级的操作中,每个层级都包含了多个小卷积层的操作。以上所介绍的部分就是SSD中比较出名的多比例特征图检测(Multi-scale featuremaps for detection)
两阶段方法Faster RCNN经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RCNN,在结构上,Faster RCNN已经将特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classification都整合在了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显。
Region Proposal Networks(RPN)
经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口 图像金字塔生成检测框;或如R-CNN使用SS(Selective Search)方法生成检测框。而Faster RCNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
可以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
anchors
提到RPN网络,就不能不说anchors。所谓anchors,实际上就是一组由rpn/generate_anchors.py生成的矩形。4个值矩形左上和右下角点坐标。9个矩形共有3种形状,长宽比为大约为三种。实际上通过anchors就引入了检测中常用到的多尺度方法。
代码:https://pytorch.org/docs/stable/torchvision/models.html#faster-r-cnn
R-FCN原始图片经过conv卷积得到feature map1,其中一个subnetwork如同FastRCNN:使用RPN在featuremap1上滑动产生region proposal备用;另一个subnetwork则继续卷积,得到k^2(k=3)深度的featuremap2,根据RPN产生的RoI(region proposal)在这些featuremap2上进行池化和打分分类操作,得到最终的检测结果。
中间的九张featuremap实际上就是位置敏感结构图左侧的九层featuremap,每一层分别对应物体的一个感兴趣部位,
当poolingmap九个方框得分都超过一定阈值,我们可以相信这个region proposal中是存在物体的。
目前主流的目标检测算法,包括多阶段的各种RCNN和单阶段的SSD、RetinaNet上都是基于Anchor来做的。Anchor的本质是候选框,在设计了不同尺度和比例的候选框后,DNN学习如何将这些候选框进行分类:是否包含object和包含什么类别的object,对于postive的anchor会学习如何将其回归到正确的位置。它扮演的角色和传统检测算法中的滑动窗口等机制比较类似。但是,这种设计思路有很多问题:
大部分object是不规则的,所以Bounding Box涵盖了大量非object的区域,从而引入比较多的干扰
Anchor的设置需要手动去设计,对不同数据集也需要不同的设计,相当麻烦,也不符合DNN的设计思想
Anchor的匹配机制使得极端尺度(特别大和特别小的object)被匹配到的频率相对于大小适中的object被匹配到的频率更低,DNN在学习的时候不太容易学习好这些极端样本
Anchor的庞大数量使得存在严重的不平衡问题,这里就涉及到一个采样的过程,实际上,类似于Focal loss的策略并不稳定,而且采样中有很多坑,今年的Libra R-CNN有个改进点就是采样时候的iou是不平衡的,实际上这种平衡广泛存在,例如不同的类别、尺度等等,有着很多隐藏问题
基于上述原因,很多人做出了改进,提出了Anchor Free的方法
抛弃Anchor之后,一个比较核心的问题是怎么描述Box,这方面CornerNet提出了一个比较有意思的思路,就是将Box转化为关键点描述,即用box左上角和右下角两个点去确定一个box,将问题转化为对top-left和bottom-right两个点的检测与匹配问题。
- 基础网络也就是Backbone使用的是Hourglass网络,这也是从人体姿态估计处借用来的灵感。这是一个在keypoint检测中非常流行的骨干网络,不熟悉的同学可以去了解下
- 关于输出,网络有两个分支,一个分支预测Top-left Corners,另一个预测Bottom-right corners 每个分支又有三个子分支,heatmaps输出的是feature map上每个点可能是Corners点的概率、预测哪些点最有可能是Corners点;embeddings输出的是每个位置属于某个object的概率,例如如果feature map上两个点分别是0.9和1.1,它们可能都属于object1,如果是1.7和2.2,可能都属于object2,这个分支主要用于分别在heatmaps上提去出了可能的top-left和bottom-right对它们进行匹配;最后的offsets用于对点的位置进行修正,因为由于下采样率的存在,heatmaps上的(x y)映射回原图都是(kx ky),k是下采样率,这就有一定的偏差,这个分支预测的是映射回(kx ky)后,还要做怎么样的偏移,从而让位置更精准
我们可以发现,实际上heatmaps和offset解决的是keypoint点在哪里的问题,这两个子分支在后面的两个网络中也有用到;而embeddings分支解决的是找到点后,怎么把属于同一个Object的点从候选里找出来的问题
CenterNetCenterNet核心就是使用关键点检测的方法去预测目标边框的中心点,然后回归出目标的其他属性,例如大小、3D 位置、方向甚至是其姿态。而且这个方向相比之前的目标检测器,实现起来更加简单,推理速度更快,精度更高!
最后简单的和大家聊聊这次的两个练习赛,疾病结构化预测和天气情况分类这两个练习题都是分类的任务,只不过一个是图像分类,一个是文本分类的任务。由于我对于文本分类的任务并无太多研究,所以给这里给大家关于如何做图像分类做一个小的示范。
可以基于的代码框架kerasCSDN教程:https://blog.csdn.net/tMb8Z9Vdm66wH68VX1/article/details/81090757
Github 源码:https://github.com/keras-team/keras-applications
github源码:https://github.com/tensorpack/tensorpack
https://github.com/jkjung-avt/keras-cats-dogs-tutorial
https://github.com/bearpaw/pytorch-classification
如何从入手到放弃1、熟悉相关的实验数据在和鲸平台上的使用2、选择一个深度学习框架,并且去github检索一个相关的代码作为baseline。搜索关键词:keras classification3、改好相应的数据接口,可以顺利读到数据,并修改配置文件中类别,分类信息等,熟悉代码。4、根据数据类型添加一些trick,比如特定的数据增广,学习率的调整,更换更大的模型等等。PS:以上这些过程是一名DL新手的必须课,请大家不要想着偷懒,老老实实的认真完成。并且需要阅读比如vgg16,resnet,GoogleNet等论文,知道深度学习相关的设计技巧。