机器视觉导论
图像分类
线性分类器
K折交叉验证
全连接神经网络
多层感知器(全连接神经网络)
激活函数
SOFTMAX和交叉熵
计算图与反向传播
再谈激活函数
Adam算法
Xavier初始化(应用于sigmoid函数)
HE初始化或MSRA(用于ReLU函数)
批归一化
欠拟合、过拟合与Dropout
过拟合现象:得到的模型在训练集上的准确率很高,但在真实的场景中识别率很低。
对训练数据预测很好,但对未知数据预测的很差,说明只是单纯的记住了训练集的数据,而不是学习到了数据特征。
欠拟合:模型描述能力太弱,以至于不能很好的学习数据中的规律。
欠拟合产生的原因通常是因为模型过于简单。
优化:指的是调节模型以在训练数据上得到最佳性能。
泛化:是指训练好的模型在前所未见的数据上的性能好坏。
在初始阶段的时候,泛化、优化能力同时增强,但是在训练后期,泛化能力会逐渐变差。
最优方案:获取更多的训练数据。
次优方案:调节模型允许存储的信息量或者对模型允许存储的信息加以约束。(该方法称为正则化)
①调节模型大小(也就是诸如增减神经元个数)
②约束模型权重,权重正则化(L1、L2正则化)
③随机失活(Dropout)
L2正则化
L2正则损失会对大数值的权值进行严厉惩罚,鼓励分散权重,会让模型泛化性能更好。
使分界面不会过于复杂,也就是考虑大部分数据的情况。
随机失活(Dropout):跟L2正则损失的目的都是鼓励权重分散。
让隐层的神经元以一定的概率不被激活。也就是将某一层的一些输出舍弃(输出值设置成0)
随机失活比率:指被设置成0的神经元所占的比例,通常设定为0.2-0.5范围内。
随机失活能够防止过拟合的原因
解释①:每次更新梯度的时候参与计算的网络参数减少了,也就是模型容量降低了。
解释②:随机失活鼓励权重分散,从这个角度来看随机失活就起到了正则化的作用。
解释③:Dropout可以看成是模型集成。(也就是多个小型网络综合集成的输出)
随机失活的应用
三层神经网络Python代码
生成一个mask矩阵(U1),也就是随机失活用的矩阵,里面的值是0或者是1,让U1和H1相乘,就相当于让H1的相应位置失活。
但是由于测试阶段和训练阶段的不同,需要在测试阶段的计算中乘以P来保证测试和训练结果的一致性。
为了方便编辑代码,在训练过程的代码编写时就直接除以P。
也就是直接在U1、U2的结尾除以P。这样的好处就是把U1直接当成一个层,输入是H1,输出的时候也是H1,这样就达到了随机失活的目的。
神经网络中超参数
超参数:
①网络结构---隐层神经元个数,网络层数,非线性单元选择等
②优化相关---学习率、dropout比率、正则项强度等
(需要神经网络自己学习的是参数,人为设置的是超参数)
学习率(梯度调节中的步长)
(记忆的时候结合二维图)
如何设置学习率
方法一: t为迭代次数,当迭代次数增加的时候,会慢慢那变小,这样启动的时候步长大,等到了学习后期就步长就会变小。
方法二:手动设置学习率。
如何找到一个较好的初始超参数
方法一(网格搜索法):
①每个超参数分别取几个值,组合这些超参数值,形成多组超参数;
②在验证集上评估每组超参数的模型性能;
③选择性能最优的模型所采用的那组值作为最终的超参数的值。
方法二(随机搜索法) 更常用!!!!:
①参数空间内随机取点,每个点对应一组超参数;
②在验证集上评估每组超参数的模型性能;
③选择性能最优的模型所采用的那组值作为最终的超参数的值。
同样的9组实验,网格搜索只评测了三个学习率,但是随机搜索法评测了9个学习率,不会浪费在不重要的超参数上。
在使用随机搜索法的时候,先粗略的搜索,找到一些比较好的点,然后再精确搜索。
超参数的标尺空间
[0.0001---1]
在学习率、正则项强度这类超参数的采样时,在对数空间上进行随机采样更合适。因为对数空间尺度分布的更均匀。
卷积与图像去噪
一般的去噪方式是加权求平均。
这个过程就是对这个像素点的卷积操作。通常会将它们存放在一个模板里面,这个模板就叫卷积核(滤波和)。这个卷积核主要记录的就是权值。
卷积
令F为图像,H为卷积核,F与H的卷积记为R=F*H
减号的意义就代表着先将模板旋转180°以后再进行操作。
卷积的性质
叠加性
平移不变性(所有的平移都可以用卷积来实现)
边界填充
零填充(边界会成为黑色),像素拉伸,镜像(将图像左边的图像镜像到右边)
填充的大小跟模板的大小有关系
卷积操作后的图像要小于输入时的图像,通过边界填充,我们可以实现卷积前后图像的尺寸不变。
最常用的边界填充就是---边界填充。
通过卷积进行图像的平移。
图像会变的平滑。平滑的作用是去噪。
图像会得到锐化处理,中心以外的权值会成为-1/9.
卷积是图像处理中非常基础的一个操作,但是它也可以对图像进行很多的操作,比如平移,平滑,锐化等。
高斯卷积核
平均卷积核会产生一些水平或竖直方向的条状,这就是振铃现象。
解决这一问题的方法就是:跟据领域像素与中心的远近程度分配权重。
越靠近中心就越大,越远离中心就越小。
生成高斯卷积核的步骤:
①确定卷积核的尺寸,比如5×5
②设置高斯函数标准差。比如=1
③计算卷积核各个位置的权重值(以中心为0.0,分为X轴和Y轴)
④对权重值进行归一化(将所有的权值的总和为1),进行权重归一化以后,所有像素都不会发生变化。
如何设置下述参数:
①卷积核的尺寸
窗宽越小,中心值越大,平滑效果越弱。
窗宽越大,中心值越小,平滑效果越强。
②高斯函数的标准差
方差越小,平滑效果越弱。
方差越大,越容易收到周边像素的影响,平滑的效果越明显。
经验法则:将卷积核的半窗宽度设置为,最终卷积模板尺寸为。
例子:标准差为1的时候,卷积模板宽度=2*3*1+1=7
这个时候归一化的影响就没有那么大了。
特点:
①去除图像中“高频”成分(低通滤波器)
②两个卷积核卷积后得到的还是高斯卷积核
→使用多次小方差卷积核连续卷积,可以得到与大方差卷积核相同的结果。
→使用标准差为的高斯核进行两次卷积与使用标准差的高斯核进行一次卷积相同。
③可分离:可分解为两个一维高斯的乘积。
卷积操作运算量
例①:用尺寸为mm的卷积核卷积一个尺寸为nn的图像,其计算复杂度是多少?
答:
因为卷积相加不增加复杂度,所以分离开进行计算的复杂度降低了。
例②:如果核可以分离呢?
答:
将7*7的模板分解成1*7和7*1的模板
图像噪声与中值滤波器
椒盐噪声:黑色像素和白色像素随机出现
脉冲噪声:白色像素随机出现
高斯噪声:噪声强度变化服从高斯分布(正态分布)
高斯噪声上的每一个像素点都是由理想图像加随机噪声。这个噪声的分布通常μ=0,很小。
上面是高斯噪声的方差,右边是卷积核的方差。
当高斯噪声较大的时候,需要使用方差较大的卷积模板,但这个时候会使图像过于平滑。
椒盐噪声和脉冲噪声无法通过高斯卷积核去除噪声,应该使用中值滤波器。
中值滤波的是将它与周围的所有值都拿出来重新排序,然后将中值替代原图的值。
高斯滤波因为是经过加权求和的,所以称之为线性滤波器。
卷积与边缘提取
边缘:图像中亮度明显而急剧变化的点
为什么要研究边缘?
→编码图像中的语义与形状信息
→相对于像素表示,边缘显示显然更加紧凑
边缘的种类
边缘就是明暗急剧变化的点,也就是导数的极值。在图像中可以用卷积求偏导。
对X求偏导的卷积模板的-1 1就是用右边的像素减去原像素。
对Y求偏导的卷积模板就是用下面的像素点减去原像素点的值。
左边的图是对X求偏导的结果,因为对X求偏导的时候Y方向上是没有区别的。
右边的图是对Y求偏导的结果,因为对Y求偏导的时候X方向上是没有区别的。
图像梯度
梯度只想灰度变换最快的方向(与信号方向垂直),一般由暗的地方指向亮的地方。
第四张图是梯度模值,模值一般就是边缘。
在实际处理的时候应该先平滑再求导,但是为了方便计算,一般讲求导和平滑结合,事先利用高斯卷积降噪的时候直接求导,得到一阶高斯模板。
高斯一阶方差中,参数会影响结果。
小方差提取的是小颗粒,细节特征。
大方差提取的是大颗粒,粗狂轮廓。
在边缘提取时,如果碰到渐变边,提取的梯度强度的轮廓线会非常粗,需要使用非极大值抑制方法来修改。
在梯度强度的线上取点,如果:
p点的梯度强度>q点的强度并且p点的强度大于r点的强度。就保留p点,否则删除p点。
这个门限过高会缺少边缘,门限过低的话会有过多的边缘。所以在确定门限的时候需要使用双阈值。
总结canny边缘检测器:
①用高斯一阶偏导核卷积图像
②计算每个点的梯度幅值和方向
③非极大抑制:将宽的“边缘”细化至单个像素宽度
④连接与阈值(滞后):定义两个阈值:低阈值和高阈值,使用高阈值开始边缘曲线,使用低阈值继续边缘曲线。
纹理表示
纹理分为:规则纹理,随即纹理。
基于卷积核组的纹理表示方法。
思路:利用卷积核组提取图像中的纹理基;利用基元的统计信息来表示图像中的纹理。
①设计卷积核组
②利用卷积核组对图像进行卷积操作获得对应的特征响应图组
③利用特征响应图的某种统计信息来表示图像中的纹理
第一个是Y方向的纹理多,第二个是斜方向的纹理多,第三个是圆形的纹理多。
关键在于设计卷积核组。
①卷积核类型(边缘、条形以及点状)
②卷积核尺度(3-6个尺度)
③卷积核方向(6个角度)
卷积神经网络所学习的卷积会代替原本人为设定的卷积核组,产生新的特征响应图。
假设一个图像左上角经过卷积核组(48个基元)卷积之后,得到了48个特征响应图,第三个响应结果比较大,表示存在这个基元所描述的边。
特征响应图的均值用向量表示,这就为卷积和全连接神经网络相联系做了铺垫。
卷积神经网络
全连接神经网络的瓶颈
它不能对很大的图像进行操作,它只适合处理小图像或是处理之后的向量。
卷积神经网络的做法:用48个卷积核(滤波器核)把图像卷积以后,用得到的特征图的均值来代表图像,得到48个向量,48个向量当做输入来训练。
也就是把卷积结果卷成向量当成输入,进行分类。这样整个系统的模型就会比较小,学习的内容是这些卷积核组。
图像→卷积核组→48维向量→全连接神经网络分类。
卷积神经网络一般分为
CONV---卷积层
RELU---计划层
POOL---池化层
FC---全连接层
CONV、RELU、POOL组成了卷积核,FC是卷积神经网络。
卷积网络中的卷积核
不仅有宽和高,还有深度,通畅写成:长度×宽度×深度。
卷积操作计算过程:将卷积核展开成5×5×3的向量,覆盖在图像区域的5×5×3向量,()卷积核组的深度跟图像色素的深度应该是统一的)。计算两者的点乘,最后在点乘的结果上加上偏移量。
也就是:
其中w为卷积核的权值,b为卷积核的偏置
在卷积的过程中,使用多少个卷积核就得到多少个特征响应图。也就是特征响应图组深度等于卷积核的个数。
不同的特征响应图反映了输入图像对不同卷积核的相应结果。(多少个不同的卷积核由人为设定)
同一特征响应图上不同位置的值表示输入图像上不同位置对同一卷积核的响应结果。
卷积步长
卷积神经网络中,卷积核可以按照指定的间隔进行卷积操作,这个间隔就是卷积步长。
在无边界填充时
输入数据矩阵尺寸:W1×H1
输出特征图组尺寸:W2×H2
W2与W1的关系如下:
W2=(W1-F)/S+1
H2=(H1-F)/S+1
其中 F-卷积核尺寸,S-卷积步长。
边界填充
W2=(W1-F+2P)/S+1
H2=(H1-F+2P)/S+1
F-卷积核尺寸,S-卷积步长,P-零填充数量
所以影响特征图组尺寸大小的因素:
①卷积核的宽、高。
②是否采用边界填充。
③卷积步长。
④该层卷积核的个数。
池化操作
池化的作用:
①对每一个特征响应图独立进行,降低特征响应图中每个特征响应图的宽度和高度(就是把特征图的尺寸变小),减少后续卷积层的参数的数量,降低计算资源耗费,进而控制过拟合。
②缩小特征图(池化)还有另一优点,能让卷积核具有更大的视野。
池化操作:对特征响应图某个区域进行池化就是在该区域上指定一个值来代表整个区域。
下采样就是池化操作,常见的池化操作:
①最大池化—区域内的最大值来代表区域。
②平均池化—区域内所有值的均值为代表。
③在上述两种池化都不行的时候可以进行金字塔池化。
④双线性池化主要用于细粒度分类网络,用于特征融合
在浅层网络中,最好使用最大池化。
最大池化可以理解为非最大值抑制,在这个过程中会丢掉75%的相应信息,但不改变特征响应图的个数。
池化层的超参数:池化窗口和池化步长。
卷积神经网络的损失函数&优化算法
损失函数:交叉熵损失
优化算法:SGD、带动量的SGD以及ADAM
训练过程中的样本增强技术
存在的问题:过拟合的原因是学习样本太少,导致无法训练出能够泛化到新数据的模型。
数据增强:是从现有的训练样本中生成更多的训练数据,其方法是利用多种能够生成可信图像的随机变换来增加样本。
数据增强的目标:模型在训练时不会两次查看完全相同的图像。这让模型能够观察到数据的更多内容,从而具有更好的泛化能力。
样本增强的方法:
镜像(翻转)
随机缩放&抠图
色彩抖动
以及随机联合下列操作:
平移、旋转、拉伸、径向畸变、裁剪等。
经典网络解析
AlexNet(8层的神经网络)
ZFNet
VGG(16层的神经网络)
GoogleNet(22层的神经网络)
ResNet(152层的神经网络)
层数统计说明:
①统计层数的时候只统计卷积层和全连接层。
②池化层与各种归一化层都是对它们前面卷积层输出的特征图进行后处理,不单独算作一层。
AlexNet
它具有五个卷积层(CONV1-CONV5),三个池化层,两个局部归一化层,三个全连接层(FC6-FC8)。
第一层(CONV1):96个11×11卷积核,步长为4,没有领填充。
问题:输入227×227×3大小的图像,输出特征图个数及尺寸为多少?
尺寸:(227-11)/4 + 1 = 55
个数:卷积核的个数 96
问题:第一层有多少个参数?
参数:(11×11×3 + 1) × 96 = 35K
AlexNet网络输入问题:是将所有模板向量去均值以后作为输入。
MAX POOL1:窗口大小3×3,步长为2。(有重叠,用于对抗过拟合,对抗轻微的目标偏移带来的影响)
输出尺寸:(55-3)/2 +1 = 27
特征图个数: 96
参数个数:0
局部响应归一化层(NORM1)的作用
①对局部神经元的活动创建竞争机制;
②响应比较大的值变得相对更大;
③抑制其他反馈较小的神经元;
④增强模型的泛化能力。
但是后来的研究表明:更深的网络中该层对分类性能的提升效果并不明显,且会增加计算量与存储空间。
第二层(CONV2):256个5×5的卷积核,步长为1,使用零填充P=2
问题:输入27×27×96大小的特征图组,输出特征图个数及尺寸为多少?
尺寸:(27-5+2×2)/1 + 1=27
个数:256
参数:(5×5×96+1)×256
在第二层增大了卷积核以后就增大了感受野。
第三、四层(CONV3、CONV4):384个3×3卷积核,步长为1,使用零填充P=1
问题:CONV3输入:13×13×256大小的特征图组,输出特征图个数及尺寸为多少。
尺寸:(13-3+2*1)/1+1=13
个数:384
在第三层和第四层之间没有进行最大池化与局部归一化。
第五层(CONV5):256个3×3卷积核,步长为1,使用领填充p=1
在第五层之后使用最大池化层来进一步缩小特征图尺寸。
在池化层之后输出的结果是6×6×256的矩阵。
第六—八层(FC6、FC7、FC8):全连接神经网络分类器
由于全连接神经网络的输入是需要向量形式,所以将6×6×256的矩阵拉长为9216维的向量对FC6进行输入。
重要说明
→用于提取图像特征的卷积层以及分类的全连接层是同时学习的;
→卷积层与全连接层在学习过程中会相互影响、相互促进
重要技巧
→Dropout防止过拟合;
→使用加入动量的随机梯度下降算法,加速收敛;
→验证集损失不下降时,手动降低10倍的学习率;
→采用样本增强策略增加训练样本数量,防止过拟合;
→集成多个模型,进一步提高精度。(但凡集成,通常都能提高精度)
问题:AlexNet卷积层在做什么?
从数据中心学习了一系列的超级卷积核组,这些卷积核都有明确的语义,这些超级卷积核都能得到相应的特征响应图,将每个特征向量图都拉成向量作为全连接神经网络的输入。
ZFNet
其结构与AlexNet基本一致
主要改进:
→将第一个卷积层的卷积核大小改为7×7;
(能感受更加细腻的东西)
→将第二、第三个卷积层的卷积步长都设置为2;
(不会让图像的尺寸降的太快,防止图像信息损失太多)
→增加了第三、第四个卷积层的卷积核个数。
VGG的贡献:
→使用尺寸更小的3×3卷积核串联来获得更大的感受野;
(三个3×3的卷积核串联卷积一次以后就相当于7×7的卷积核卷积一次)
→放弃使用11×11和5×5这样的大尺寸卷积核;
→深度更深、非线性更强,网络的参数也更少
→去掉了AlexNet中的局部响应归一化层(LRN)层
VGG的预处理与AlexNet不同,唯一的预处理就是:基于整个训练集计算 RGB 的均值,然后每个像素节点上减去该均值。
VGG16
→13个卷积层与3个全连接
→分为5段conv1,···,conv5,每一段中卷积层的卷积核个数均相同。
→所有卷积层均采用3×3的卷积核及ReLU激活函数
→池化层均采用最大池化,其窗口大小为2×2、步长为2
→经过一次池化操作,其后卷积层的卷积核个数就增加一倍,直至达到512(在前面卷积核中学习的只是点线的基元,没必要学习那么多的基元)
→VGG也使用了Dropout策略
思考
问1:小卷积核的优势?
答:多个小尺寸卷积核串联可以得到与大尺寸卷积核相同的感受野。(经过串联,进行了两次非线性变换,,网络深度根深,非线性更强,描述能力更强)
问2:为什么VGGNet中每一次池化后,卷积核的数量都增加一倍?
答:
①池化操作可以减小特征图尺寸,降低显存占用
②增加卷积核个数有助于学习更多的结构特征,但会增加网络参数数量以及内存消耗
③一减一增的设计平衡了识别精度与存储、计算开销
问3:为什么卷积核个数增加到512后就不在增加了
答:
①第一个全连接层含102M参数,占总参数个数的74%;(再增加的话权值就太多了,参数无法设置了,无法学习了)
②这一层的参数个数是特征图的尺寸与个数的乘积
③参数过多容易过拟合。
GoogleNet
创新点:
→提出了一种Inception结构,它能保留输入信号中的更大特征信息;
→去掉了AlexNet的前两个全连接层,并采用了平均池化,这一设计是的GoogleNet只有500万参数,比AlexNet少了12倍。
→在网络的中部引入了辅助分类器,克服了训练过程中的梯度消失问题。
串联结构(如VGG)存在的问题—后面的卷积层只能处理千层输出的特征图;前层因某些原因(比如感受野受限)丢失重要信息,后层无法找回。
解决方案—每一层尽量多的保留输入信号中的信息
Inception模块
1×1只改变深度信号(进行压缩保留),3×3小感受野(局部结构信息),5×5大感受野
3×3的maxpooling相当于对一个区域进行增强
然后将他们输出的结果按深度方向拼凑起来
通过1×1的卷积层改变深度,再进行3×3、5×5的卷积操作
通过加入1×1的卷积操作,降低了计算量,这样就跟VGGNet一样了。
优点:层数更深、参数更少、计算效率更高、非线性表达能力也更强
ResNet
当网络过深的时候,深层网络反而比浅层网络错误率高。原因就是训练过程中网络的正、反向信息流动不顺畅,网络没有被充分训练。
ResNet具有以下共享:
→提出了一种残差模块(恒等映射结构),通过堆叠残差模块可以构建任意深度的神经网络,而不会出现“退化”现象。
→提出批归一化方法来对抗梯度消失,该方法降低了网络训练过程对权重初始化的依赖。
→提出了一种针对ReLU激活函数的初始化方法)
因此研究者在设计的时候考虑到如何在向上堆积锌层来建立更深的网络,使其满足即使不能提升浅层网络的性能,深层网络也不应降低性能。
解决方案:残差模块
假设卷积层学习的变换为F(X),残差结构的输出为H(X),则有
H(X) = F(X) + X
F(X) = H(X) - X
残差 = 输出 - 输入
这样的作用就是即使F(X)什么都不做,只是单纯的传递X,这样性能至少不会下降。
在回传的过程中,可以从X通道返回(跳远连接),X通道的梯度永远为1,保证反向梯度流的通顺。
“瓶颈”结构残差模块
第一个1×1卷积是降低深度,减少计算量,第二个1×1卷积是提高深度,保证它与跳跃连接的深度相同。
ResNet的网络结构
问题:为什么残差网络性能这么好?
残差网络可以看做是一种集成模型
在去掉其中一部分分支以后不影响运算结果,说明这是一种集成模型。但是这种投票性质的网络结构也有弊端,会有一些冗余,浪费了计算资源。
视觉识别任务
→分类(不考虑空间位置)
→语义分割(像素的类别)
→目标检测(多目标)
→实例分割(多目标)
语义分割思路:全卷积
解决方案,让整个网络只包含卷积层,一次性输出所有像素的类别预测。
虽然能解决计算问题,但是如果在处理过程中一直保持原始分辨率的话,对于显存的需求会非常庞大
解决的方法就是:还是让整个网络只包含卷积层,但是在网络中嵌入下采样(降低尺寸)与上采样(提高尺寸)过程。
其中上采样过程使用的方法是:
反池化操作(Unpooling)
近邻采样
钉床采样
index
在进行下采样(池化)操作时,需要记住他最大值的位置,在反池化操作(Max Unpooling)时,将该值填回相应位置。
上述三种方法并不常用
常用的为可学习的上采样:转置卷积(Transpose Convolution)
在上采样的过程中,不仅仅只有A、B的值参与了计算,还有x、y、z参与在其中。神经网络可以不断的通过学习调整x、y、z的值。
下采样过程
在a向量中补零是因为存在零填充p=1。
尺寸为3,就有x、y、z。步长为1,每次错开1位
上采样过程
将卷积核转置之后,与低维向量相乘,就会实现上采样的操作。在上采样的过程中,x、y、z是可以通过不断的学习进行修正的。
在做决定的时候用UNET网络。
将下采样之前的特征图与上采样之后的特征图进行结合,这样这个特征图组就既有升级来的特征,也有原始的特征。
目标检测:不光告诉我们图像中有什么(标签),还要表明这些标签的位置。
!!!!单目标!!!!
单目标检测就是分类+定位
综合来看就是多任务损失:一个是种类损失,一个是位置损失。
倒数第二层分为两个向量:一个向量说明图像的种类,一个向量说明包裹目标的边界核的位置(x、y是说中心位置(有时候也指的左上角),w、h指的是宽高)。
L2损失:
将L2损失和Softmax损失相加得到一个总损失。
这个网络的目标就是降低总损失。
也可以设定权值,来改变softmax和L2在总损失中所占的比重。(来决定谁是占主导的)
一般不从头开始训练,通常使用在ImageNet上训练好的模型(迁移学习),在位置的损失上该网络是没有学习的,除此之外网络是已经训练好的,让网络学习定位(也就是找一个已经训练好的模型,训练倒数第二层和定位的关系就行)。
等第二阶段训练完以后将所有的参数都打开。再训练使总损失降低。
当多目标的时候,由于不知道具体有多少个目标。所以采用滑动窗口的方法。
将所有可能的区域都送入卷积网络进行检测,以确定当前区域是背景还是哪个类别的目标。(但是由于图像的不同位置、尺寸、长宽比进行分类,计算量巨大)
区域建议:Selecive Search
区域裁剪:Rol Pool
将候选区域投影到特征图上,然后将区域定点规整到网格交点上。然后将该区域粗略的分成面积相等的2×2(人为设定)个子区域,对每个子区域都进行最大池化。(在进行Rol Pool处理前不同的区域特征的空间尺寸可能不一致,但是处理后的所有区域特征尺寸都是一致的)
问题:处理之后会有轻微的对不齐。
区域裁剪:Rol Align
改进的地方就在于不对区域进行规整操作。
在求该绿色点的值得时候,使用双线性差值。
这样多次操作以后就会得到多个双线性差值,然后对每个子区域再进行最大池化。
但是过程中还是会有大量的时间用于产生候选区域
Faster R-CNN:
在中间特征层后加入区域建议网RPN(Region Proposal Network)产生候选区域网络
实际使用中,对于每个特征图上的每个位置,我们通常采用K个不同尺寸和分辨率的锚点区域(anchor boxes)
第一阶段:每张图运行一次
→主干网络(backbone)
→区域建议网络
第二阶段:每个区域运行一次
→扣取区域特征:Rol pool /align
→预测目标类别
→预测边界框偏移量
假设在一般用3×3的卷积核进行卷积,但是由于不确定3×3能否起作用,所以就多设定几个区域。3×3的卷积核卷积后的特征图与神经网络连接起来,判断图像的类别就行(对分数进行排序,通常将分数最高的前300个直接送入Rol Pooling)。但是在区域建议中,由于多设置了几个锚点区域(K值),所以神经网络也要判断这几个区域是什么类别。就相当于用相同的特征额外预测了几个区域。 (当然,我们事先需要确定这几个区域的标答是什么。)
四种损失的联合训练
→RPN分类损失(目标/非目标)
→RPN边界框坐标回归损失
→候选区域分类损失
→最终边界框坐标回归损失
目标检测:影响精度的因素
主干网络:VGG16、ResNet-101、InceptionV2、InceptionV3、Inception、ResNet、MobileNet
基础架构:
→两阶段:Faster R-CNN
→一阶段:YOLO/SSD
→混合:R-FCN
图像尺寸
区域建议个数
一些经验性的结论:
→Faster R-CNN速度偏慢,但精确度高
→SSD速度快,相对于Faster R-CNN精度有所欠缺
→主干网越宽、深度越深,对性能的帮助就越大。
实例分割任务
对Faster T-CNN的改进:Mask R-CNN
上半部分是分类,下半部分是预测每个点的类标。
图为训练时的标答。
可视化
通过反向可视化,查看网络是通过哪些像素点进行判断的。(显著性检测)
guided backprop
真实的网络是
w是训练后的神经网络学习到的权重矩阵,它为输入的不同位置分配了不同的关注度,并加权求和获得分类得分
计算图像像素相对于当前分类下的得分的梯度,这个梯度反应了每个像素对分类结果的影响程度。梯度值越大,说明它对应的像素越重要。
得到的结果就是
各个图像中哪个像素点将神经元激活的。
还有一种更好的方法进行可视化——梯度上升
输入一个纯黑的图像,输入进行响应之后再通过反向梯度传回来,与原图相加。这样重复多次后会得到这个可视化图。
deep dream
是用一张图像进行反复加强达到一定的艺术效果。
特征的可逆性
前一项是希望输出的4096维向量,让这4096根φ0一模一样。(L公式的意义就是求距离)起到约束作用
后一项就是全面正则项。
这说明在第二个卷积层的时候仍然保留着原图的几乎全部特征,随着卷积层的加深,原图的特征逐渐消失。
纹理合成
神经网络将纹理表示成Gram Matrix
从中随便抽取两列就能得到一个Gram矩阵,将所有的Gram矩阵加起来求平均就得到了Gram Matrix
因为如果在Gram矩阵中有较大的值,说明在卷积核中被大量采用,而这记录的就是纹理特征。
通过红蓝进行提取,通过噪声损失(黑色)进行梯度回传。进行很多轮的迭代才能得到结果。
内容和风格谁损失越多谁占的权重越大。
一种更快的方法,噪声的输入是神经网络的输出。
同一张图片的不同风格。
实例分割:作用在每一个图像的每一个卷积核,只用实例分割,这样还能进行一个网络多风格。
每个γ和β都是要学习获得的。不同的风格的神经元的车别就在γ和β上。只要调整这两个超参数就可以获得不同风格的图像。这一切都是基于实力分割
为什么要做可视化
输入一张图,进行正向传递,然后再进行反向传递,看看做出结论的图是否关注到目标。
生成模型
→无监督学习
→生成模型
PixelRNN and PixelCNN
Variational Autoencoders(VAE)
Generative Adversarial Networks(GAN)
有监督学习中
数据:(x,y),其中x表示样本,y表示标签
目标:学习x→y的映射
例子:分类,回归,目标检测,语义分割等等。
有监督的意思是指有标答,有正确的答案作为指导
无监督学习
数据:x,其中x为数据
目标:找出隐含在数据里的模式或者结构
例子:聚类,降维,特征学习,密度估计等
因为在垂直于面的方向上差别不大,所以就降低维度,PCA降维是一种线性降维。
自编码(特征学习)是一种非线性降维。
比如输入一个图像,经过神经网络输出一个低维的图像。
生成模型:
给定训练集,产生于训练集同分布的新样本
无监督学习中的核心问题——密度估计问题
几种典型思路:
- 显示的密度估计:显示的定义并求解分布
- 隐式的密度估计:学习一个模型,而无需显示的定义它(不需要知道工作原理)
为什么要研究生成模型?
图像合成:根据图片、文本信息或几何信息合成图片
图像属性编辑:通过将属性隐藏进掩码,以更改图像属性。
图片风格转移:黑白图片转彩色图片、白天转黑夜图片等。
域适应:减少source和target不同分布之间的差异。
PixelRNN与PixelCNN
显式的密度模型
利用链式准则将图像x的生成概率转变为每个像素生成概率的乘积:
学习的过程就是最大化训练数据的似然(密度函数)!
缺陷:需要从图像左上角开始产生像素,序列生成整张图片太慢了
PixelCNN进行了改进,依然是从图像的左上角开始产生像素,但是是基于已生成的像素,利用CNN来生成新的像素。
用256个卷积,只有灰色部分进行卷积运算。
卷积的结果输出的是该点的概率值
可是图像的产生过程还是逐像素的序列生成,依然很慢。
总结:
优点:
- 似然函数可以精确计算
- 利用似然函数的值可以有效地评估模型性能
缺点:序列产生的很慢。
Variational Autoencoders(VAE)
自编码器
无监督的特征学习,其目标是利用无标签数据找到一个有效地低维的特征提取器。
主要是求输出和输入的损失。
特征降维有什么作用?
希望降维后的特征仅保留数据中有意义的信息
如何学习?
自编码利用重构损失来训练低维的特征表示
已经训练完毕的编码器可以作为有监督学习的初始特征提取模型。
解码器同样有很多功能,输入一个编码,然后解码就生成一个图形。可以完成图像生成任务
变分自编码器(VAE)
编码器生成了一个输入(m)和一个方差(),后面标准差×e是一个噪声,使m产生了偏差。
噪声的方差是从数据中学到的
从正态分布中提取一个新的码(c)输入解码器
所以越接近0越好,也就是取样的越接近1越好
是L2正则化,希望越分散越好
之前的直接编码在中间没有学习的一段是无法准确输出结果的,经过VAE中 的噪声以后,在未学习的部分也可以有输出结果。只有加了噪声以后,才能在中间加上既不是满月也不是半弦月的图像。
变分自编码(VAE)总结
基于典型自编码器拓展成的概率框架→可以产生新的样本
定义一个难以计算的密度函数→通过推到来优化一个下边界
优点:
- 生成模型里的一种主要方法
- 可以计算,这个特征表示可以用在其他许多任务中。
缺点:
- 最大似然函数的下边界能够有效的工作,但是模型本身没有Pixel RNN和Pixel CNN那样好评估
- 与最新的技术(GANs)相比,产生的样本比较模糊,质量较低。
生成对抗网络(Generative Adversarial NetWork,GAN)
问题:希望从训练样本分布中采样新数据,但这个分布不仅维度高而且还很复杂,难以直接实现。
解决方案:对一个简单的分布采样,比如均匀分布;然后,学习一种映射将其变换到训练样本分布
(就使用神经网络实现这个复杂的映射)
生成网络:期望能够产生尽量真实的图片,进而骗过判别器
判别网络:期望能够准确的区分真假图片
是真实数据的分布
是噪声分布
G是生成函数,就是生成器。是G 神经网络的参数。
max:如果想调整找到最大,就要前项(真实样本)中的对数项越接近于1,后项(假样本)中的越接近0越好。
min:在最小时,跟前项(真实样本)无关,只与后项(假样本)有关,而若想整体最小,就要最大,越接近1越好。
在确定了目标函数以后,max和min是交替完成的。
判别器输出的结果在0-1之间,所以最后一层用sigmoid输出一个数值。对于正样本,这个值越大越好,负值越小越好。
但是Gradient descent on generator直接优化效果并不是很有效,在生成的样本很糟糕时,判别器输出值很小,生成器损失函数在此处的梯度很小,使得生成器学习很慢。
但是当样本较好的时候,梯度很大,生成器更新较大。(但此时的样本已经趋于学习完成,这时速度快意义不大)
所以进行优化以后
所以实际应用中,做了两个最大函数(max)
因为判别器有梯度,梯度会促使生成的分布进行平移。
V(D,G)的值越大,采样样本和生成样本的散度就越大。