背景
如果用神经网络直接处理1000x1000的图片,那么在一开始入参就需要1000x1000x3 = 3mili个参数,加上后续layer的参数,
会导致整个神经网络需要足够巨大的内存,且消耗训练时间,另外难以获取足够多的数据防止出现过拟合问题和竞争需求
因此,计算机视觉中进行图片识别就引入了卷积计算,解决大图片识别问题
卷积计算
卷积运算在图像处理和计算机视觉中被广泛用于边缘检测。
边缘检测是识别图像中像素值变化显著的区域,这些区域通常对应于物体的边界。
卷积运算通过在图像上应用特定的滤波器(或卷积核)来实现这一点。
卷积运算涉及将一个小矩阵(称为卷积核或滤波器)在图像上滑动,并在每个位置计算该核与图像局部区域的点积。
卷积核的大小通常较小(如 3x3、5x5),而图像可能很大。
步骤
选择卷积核:选择一个合适的卷积核,例如 Sobel 核,用于检测图像中的边缘。
滑动卷积核:将卷积核从图像的左上角开始,逐像素地在图像上滑动。对于每个位置,将卷积核与图像的对应区域进行点积运算。
计算卷积值:将卷积核与图像局部区域的像素值相乘并求和,得到该位置的卷积值。
生成输出图像:将每个位置的卷积值组成一个新的图像,该图像的每个像素值表示原始图像中对应位置的边缘强度。
padding
如上计算过程存在两个弊端
一个是卷积计算完之后,输出图像的大小会比输入图像小,如果神经网络有100层,每一层都缩小一点点,最终得到的图片可能是1x1大小的图片,
另外一个是无法充分利用图片边缘信息,因为卷积核在边缘处计算时,图片的边缘数据只被用到了一次,但是中间的数据被用到了多次,导致图片信息没有等概率的参数推测
The main benefits of padding are the following:
It allows you to use a CONV layer without necessarily shrinking the height and width of the volumes. This is important for building deeper networks, since otherwise the height/width would shrink as you go to deeper layers. An important special case is the “same” convolution, in which the height/width is exactly preserved after one layer.
It helps us keep more of the information at the border of an image. Without padding, very few values at the next layer would be affected by pixels as the edges of an image.
为了解决这个问题,在图片边缘添加p圈0,这样卷积核在边缘处计算时,图片的边缘数据就可以被用到了多次,从而可以防止计算后图片缩小
这个操作的过程就是卷积计算加padding的操作
加padding有两种方式valid 和 same
valid 表示不加padding,输出图片计算公式为 nxn * fxf = (n-f+1) x (n-f+1)
same 表示加padding,使得输出图像的大小和输入图像的大小相同
(n + 2p - f + 1 ) x (n + 2p - f + 1 ) = n x n
p = (f - 1) / 2
这样过滤器f 一般为奇数,才能保证实现对称填充(4周填充数相同),不然会出现不对称填充(左边多右边少)
另外奇数过滤器为奇数,会存在中心点,方便定位过滤器位置
stride
stride 表示卷积核在图像上滑动的步长,默认值为1,表示每次滑动一个像素
如果stride 为2,表示每次滑动2个像素,这样可以减少计算量,同时可以减少输出图像的大小
输出图像的大小计算公式为 math.floor((n + 2p - f) / stride) + 1
三维计算
上面讨论的是在一张灰度图片上的计算,如果是彩色图片,那么需要对图片的每个通道进行卷积计算,
然后将每个通道的卷积结果相加,得到最终的输出图像
最终输入图片大小同上,为 (n-f+1) x (n-f+1)
但是要保证输入图片的通道数和卷积核的通道数相同,否则无法进行卷积计算
如果同时对图片进行多个通道,多个过滤器的计算,
那么输出图片维度需要加上过滤器的个数,相当于一张过滤器产生一个通道
输出图片的大小为 (n-f+1) x (n-f+1) x 过滤器的个数
卷积层
之前的神经网络,输入x 和 w 都是具体的一个数字,现在相当之于x 和 w 是一个三维矩阵
有几个过滤器,相当于有几个神经元,每个神经元的输入是一个三维矩阵,
每个神经元的w是一个和上一层输入深度相同的三维矩阵, b 也是一个和上一层输入深度相同的三维矩阵
这样每个神经元计算结果就是一个2维矩阵,
多个神经元的计算结果就是一个三维矩阵,相当于多个通道的图片
单层的实现原理
相关符号表示
卷积层的实现
池化层
减小模型规模,提高计算速度
类似与卷积层,只不过在过滤器范围内,不再是卷积计算,而是取最大值或者平均值
但是要注意,池化层的过滤器大小和步长是固定的,在整个神经网络中属于静态属性,不参与梯度下降运算
卷积神经网络
上面提到了卷积层和池化层,卷积神经网络的最后一层叫做全连接层
相当于之前的标准神经网络,将卷积层和池化层的输出结果进行展平,然后进行全连接计算
随着卷积池化层的增加,图片尺寸会越来越小,但是通道越来多
池化层没有学习参数,卷积层可学习参数远小于全连接层
而且随着卷积神经网络的向后计算,激活值数据逐渐减少
优点
Parameter sharing: A feature detector (such as a vertical edge detector) that’s useful in one part of the image is probably useful in another part of the image.
Sparsity of connections: In each layer, each output value
depends only on a small number of inputs.
- 参数共享,从而减少参数数量
- 结果输出仅依赖输入的部分数据,计算速度快
三种常见的卷积神经网络架构
LeNet - 5
论文: LeCun et al., 1998. Gradient-based learning applied to document recognition
AlexNet
论文: Krizhevsky et al., 2012. ImageNet classification with deep convolutional neural networks
VGG-16
简化了神经网络的结构,所有的卷积层和池化层都相同
16 指的是整个网络架构中所有卷积层,池化层以及全连接层的层数总和
结构庞大,会有约1.38亿个参数
但是结构规律,
池化层都在缩小一倍图片尺寸
过滤器数量随层数递深,整倍增长
论文:Simonyan & Zisserman 2015. Very deep convolutional networks for large-scale image recognition
残差网络
The problem of very deep neural networks
- The main benefit of a very deep network is that it can represent very complex functions. It can also learn features at many different levels of abstraction, from edges (at the shallower layers, closer to the input) to very complex features (at the deeper layers, closer to the output).
- However, using a deeper network doesn’t always help. A huge barrier to training them is vanishing gradients: very deep networks often have a gradient signal that goes to zero quickly, thus making gradient descent prohibitively slow.
- More specifically, during gradient descent, as you backprop from the final layer back to the first layer, you are multiplying by the weight matrix on each step, and thus the gradient can decrease exponentially quickly to zero (or, in rare cases, grow exponentially quickly and “explode” to take very large values).
- During training, you might therefore see the magnitude (or norm) of the gradient for the shallower layers decrease to zero very rapidly as training proceeds:
残差块
在计算a^[l+2]前,激活函数不再使用z^(l+2)作为入参,而是以z^(l+2) + a^(l) 作为入参
即 a^(l+2) = g(z^(l+2) + a^(l))
其中a^(l) 被称为残差块
在通用场景下,残差块(a^(l))可能不止被加在后面第二层的计算中,可能会加入在更深的网络层中,
这种在main path 的基础上进行的计算又叫short cut 捷径/ skip connect 远跳链接
残差网络
将多个远跳链接计算堆积在一起就形成残差网络,可以使神经网络按照理论规律,随着神经网路层数加深,误差降低
残差网络优化原理
根据残差块的计算原理
a^(l+2) = g(z^(l+2) + a^(l))
a^(l+2) = g(w^(l+2) * a^(l+1) + b^(l+2) + a^(l))
在进行梯度下降处理过程中如果有使用L2正则化,或者梯度缩减,导致 w^(l+2), b^(l+2)变小至0,
那么残差块的计算结果就会变成
a^(l+2) = g(a^(l))
这时激活函数式是Relu函数的话,就会得到
a^(l+2) = a^(l)
也就是说,我们通过在激活函数前添加一个远跳链接,
不仅没有影响网络本身性能,而且发现(学习到)了一个恒等映射,
可以直接利用a^(l+2) = a^(l)进行计算,
中间的两个隐藏层的增加对整个网络没有影响,没有的话会更好
扩展思路,如果跳跃链接加在更深的网络层,甚至神经网络最后一层
有可能学习到比恒等映射更有用的东西,从而提高整个网络的性能
另外,如果没有跳跃链接,随着网络层数的增加,深层参数的初始化会是一个非常困难的事情,更别说是学习恒等映射
这也是为什么随着层数加深,训练的效果不是越来越好,反而越糟
因此,通过增加跳跃连接形成残差网络,从不影响性能开始学习恒等映射,然后梯度下降只能从这里进行更新,
从而避免梯度消失或爆炸,进而提高整个网络的性能
上述讨论假设在全链接层或者卷积层的 a^(l+2),a^(l) 维度相同可以成立,
但是在卷积层中,如果 a^(l+2),a^(l)维度不同, 需要给a^(l) 增加参数保证(比如进行卷积处理后再相加)和 a^(l+2) 维度相同
论文:He et al., 2015. Deep residual networks for image recognition
Inception网络
1 x 1 卷积层
当对三维矩阵进行11 的卷积计算时,相当于取三维矩阵的一个切片进行加和计算
对于11 的过滤器,利用其个数,可以对三维矩阵实现【通道】压缩或增加,
从而实现对输入数据的维度变换
在下面的Inception网络中, 被用来构建【瓶颈层】
对矩阵先压缩在扩展,从而大大降低计算成本
论文:[Lin et al., 2013. Network in network]
Inception网络
可以自行选择过滤器实现卷积层和池化层的计算,代替人工来确定卷积层中的过滤器类型(11, 33, 55, 77, 个数)
直接进行卷积计算,计算量巨大
可以引入瓶颈层降低计算量
inception module
在普通卷积计算中引入瓶颈层,最后将所有结果进行拼接,这个模块就是inception module
inception network
将多个inception module 堆叠在一起,就形成了inception network
论文: Szegedy et al., 2014, Going Deeper with Convolutions
迁移学习
卷积网络中的迁移学习没什么不同,在公开模型基础上继续进行训练
对于训练数据较少的情况,建议固定所有隐藏层参数,仅更改softmax 层结构,使之符合自己的分类规则
相当于只训练输出结果层的参数,
一个提高训练速度的方法是因为隐藏层参数固定,可以看做固定函数,训练数据不多的情况下,
提前计算好所有训练数据的最后一层的激活值,拿激活值进行训练,避免重复计算
对于训练数据较多的情况,建议固定前面几层的参数,仅更改后面几层的参数,使之符合自己的分类规则
相当于只训练后面几层的参数
对于训练数据超多的情况,可以放开所有层级,以已有参数做初始值,从头开始训练
数据增强
图片
镜像处理,随机裁剪,旋转,shearing,local warping(局部扭曲)
色彩转换(加减rgb值, PCA颜色增强算法)
架构实现选择
对于数据量少的情况,一般进行更多的手工设计
对于数据量多的情况,一般使用更简单的算法和更少的手工工程,不需要精心设计
Use open source code
• Use architectures of networks published in the literature
• Use open source implementations if possible
• Use pretrained models and fine-tune on your dataset
目标检测
在图片分类的基础上,我们可以进行分类和定位
但是分类的定位都针对一个对象进行讨论
如果是对一张图的多个对象进行分类和定位就是对象检测)
定义输出
在分类的基础上,定义输出是一个向量,包含分类和定位信息
pc 代表是否有检测目标存在,存在为1,不存在为0,不存在的情况下,后续向量值不做继续讨论
bx 对象中心点横坐标
by 对象中心店纵坐标
bh 对象在图中相对整幅图片高度
bw 对象在图中相对整幅图片宽度
c1 c2 c3 代表具体是哪一个对象,其中一个值为1 时,另外两个为0,同时pc 为1
损失函数分为pc 是否为1 两种计算方式
在实际计算过程中,可能会去将y 向量分类,pc, bx ~bw, c1~c3 然后分别使用不同的计算方法进行损失值计算
特征点检测
原理同定位检测,只不过输出向量是N个特征点的位置坐标 + pc值
滑动窗口进行图像识别
识别一张图片中是否有某个物体的过程一般是通过分别定义不同大小的窗口,对图片进行滑动裁剪
对裁剪到的图片进行对象识别,但是这样无疑会大大增加计算量
解决方案就是利用卷积计算的过程,避免窗口滑动过程重复区域的重复计算
直接将一张图片输入,直接得到物体识别的结果
卷积滑动窗口的具体实现,现将FC 层也转成卷积层,方便输入各个窗口的计算值
YOLO
YOLO(you only look once) 算法通过对图片进行格子分割,直接对格子内图片进行对象识别,从而更准确的判断对象位置
最后的输出结果代表每个格子的识别和位置检测结果
如何解释结果?
bx,by,相对一个格子而言,肯定要小于1
bh,bw 同样相对于一个格子的大小,进行比例计算,有可能大于1,说明对象是跨格子存在的
交并比
用于评价一个位置检测算法的好坏
预测值面积与实际对象所占面积重叠的部分就是交集大小 –> S1
二者面积之和即为并集大小 –>S2
交并比 = S1/S2
阈值认为决定,1 当然是最好的,说明准确发现了对象位置
非最大值抑制 ???
用于解决出现多个位置检测符合条件的情况
原理就是在符合条件的窗口中寻找最大正交比
- 对于所有格子的输出,去掉pc概率小于阈值的格子
- 对剩下格子循环处理,首先找pc值最大的格子A最为最终的检测结果,然后计算剩余格子与A 的交并比,去掉交并比大于一定阈值的格子(在最大值附近),剩余格子的话,继续循环处理
如果是对多类对象进行同时检测,则需要对各个类别,分别进行非最大值抑制处理
ancher box ?
用于处理两个对象同时出现在一个格子的情况
提前定义两个不同形状的ancher box, 分别用不同ancher box去识别不同的对象
然后根据正交比大小,判断当前格子的对象是哪个分类,修改对应分类位置的值
注意这里,通过增加输出通道,输出从单一结果,变成两个
一般很少遇到3个对象同时出现在一个格子的情况,暂不考虑
小结
论文【难】: Redmon et al., 2015, You Only Look Once: Unified real-time object detection
R-CNN
利用图像分割算法,对图像进行分割后,在一定区域内进行图像识别和定位
缺点不如YOLO一次性计算快
人脸识别
验证与识别
验证比识别要简单一些,属于1对1 的问题,识别输入仅仅是一张图,相对来说更难
one shot & similarity
one shot learning 就是根据已有的一张图片对输入的图片进行识别
用传统的训练思维处理容易出现过拟合,而且数据库更新需要重新训练,成本高
解决方式是通过看他们相似度的方法进行图片验证,比较输入图片和图库图片,
有差值小于阈值的图片的话,说明有这个人,没有小于阈值的图片的话,则输入图片对应的人没有在数据库中
Siamese network
根据相似度进行图片验证的网络架构
原理就是,对两张图片进行相同的网络架构处理得到能够尽可能代表两张图片的128为编码
然后对两个编码进行范数运算,如果是同一个人则范数值会很小,否则会很大
模型训练过程也是通过进行范数比较然后再去调整模型参数
论文: Taigman et. al., 2014. DeepFace closing the gap to human level performance
三元损失函数
在训练过程过程中,通过构造识别对象的三元组数据,进行损失函数计算
具体过程就是分别准备待识别对象A,与待识别对象相似的对象P,与待识别对象差异较大的对象N三者的图像编码
通过计算比较AP与AN 之间范数的大小关系,用作损失函数的计算
注意这里引入超参α用于加强 AP 与AN之间的差距,提高准确度,也防止出现图像编码始终为0,导致比较关系始终成立情况出现
论文:Schroff et al.,2015, FaceNet: A unified embedding for face recognition and clustering
Siamese network + 二分类
在 Siamese network 基础上,对输入的两张图片进行计算得出0 和 1 的结果,直接判断二者是否是同一个人
y^的计算方式可以有多种
在实际使用中可以提前计算好数据库中图片编码,需要验证的时候只计算输入图片编码即可
神经风格迁移
将一张作为内容的图片C合并上一张具有艺术表现风格的图片S,从而生成一张具有图片B艺术表现风格,但图片内容是图片A 的新图片 G
可视化深层网络
【要去读】
论文: Zeiler and Fergus., 2013, Visualizing and understanding convolutional networks
成本函数
由两部分组成,CG之间的内容成本函数Jcg(衡量内容相似度),SG之间的风格成本函数Jsg(衡量风格相似度)
论文:Gatys et al., 2015. A neural algorithm of artistic style.
内容成本函数
计算CG在相同预训练模型上某一层的激活函数值的相似度,如果二者相似说明图片有相似的内容
风格成本函数
如果两个通道间关联度高,说明图片风格特征同时出现的概率高
通过某一层计算激活函数值各通道间的关联程度定义来衡量图片的风格,
如果SG相似度低,则成本函数值高