定义
人通过眼睛获取图片的信息
再经过大脑的处理,得到对图片的解析
计算机通过摄像头获取图片的信息
经过CPU的数学运算,得到对图片的解析
大脑信号处理
科学家通过对猫的大脑分析,发现猫的大脑对一些基本的图像元素有比较大的反应,对整体复杂的图像,没什么反应。
结论
大脑对图片的处理是分层的
浅层的神经元只会处理基本的图像元素
深层的神经元会对浅层得到的基元进行组合,得到更高级的语义
大卫马尔
计算机视觉之父
他定义了什么是计算机视觉任务:
-
计算理论
计算的目的是什么?该问题的已知或可以施加的约束是什么
-
表达与算法
输入,输出和中间信息如何表达,使用哪些算法来计算所期望的结果
-
硬件实现
表达和算法如何再硬件中实现运算
深度学习三要素
计算机视觉的难点
- 视角
- 光照
- 尺度
- 遮挡
- 形变
- 背景杂波
- 类内形变
- 运动模糊
- 类别繁多
基于规则的分类
由于上述难点
简单的通过硬编码来识别猫,是一件很困难的事情
技术点
线性分类
由于wj与x的维度相同
因此wj可以看成一个模板图片
对每个wj进行可视化
有下图
从w可以隐约的看到,每个类别的一些共有特征
损失函数
正则项
通过在损失函数加入正则惩罚项,可以让模型在逼近训练集的时候, 不要拟合的太过
L2正则项
用L2定义R(w),可以让模型在逼近训练集的时候,让每个w的权重尽量控制在比较小和平均的范围内。鼓励在判定的时候,把所有维度的特征都用上。
可以减轻过拟合
优化算法
梯度下降
优点:
优化方向准确
缺点:
每次梯度更新都需要全部样本参与运算
导致权重更新过慢
随机梯度下降算法
优点:
更新快
缺点:
由于数据中存在噪声
导致优化方向有时会向好的方向前进,有时会向坏的方向前进
小批量随机梯度下降
优点:
方向可以大致准确
迭代快
缺点:
有可能会停留在鞍点
有可能在鞍点不断地震荡
动量法
通过引入累计梯度来更新梯度
可以有效的在震荡方向逐渐减弱
在下降方向,逐渐加强
就像这个球有地心引力作用,拥有动量
并在动量的带动下,可以跳出局部最小点
自适应梯度
通过减少震荡方向的步长
增大平坦方向的步长,来加速到达谷底的方向
缺点:
r通过不断累加梯度,会让r越来越大
最终会导致模型的w不再更新
rmsprop通过加入遗忘系数
解决了adagrad不再更新权重的问题
ADAM
同时结合动量和自适应梯度思想
修正偏差用于解决冷启动的问题
例如当u比较大,例如0.9,那么初始v等于0.1的梯度,通过修正偏差,可以让v变会梯度的值
数据集划分
- 训练集用于给定超参数时模型参数的学习
- 验证集用于选择超参数
- 测试集用于评估泛化能力
数据集过小
可以通过k折交叉验证
数据预处理
- 归一化
由于模型只对数据的相对位置有兴趣,对绝对位置没兴趣
因此通过去均值和归一化,可以让各特征的范围一致
从而可以更有效的训练模型
全连接神经网络
每条直线通过线性变换,等同于对直线进行旋转和位移
对方程进行非线性操作
等同于方程的输出,从一条直线变成多条直线。
那么后续再对这生成的多条直线通过旋转位移
就可以生成任意复杂的图形
常用非线性函数
神经元个数的效果
层次越深,非线性能力越强,可以组合的图形越复杂
神经元越多,可以组合的图形越复杂
深度和宽度的设计
层次越深,神经元越多,会对训练集拟合得越好
但是并非对训练集拟合得越好,泛化能力就越好
因为过拟合,会导致模型再训练集和测试集性能得差距会非常大
但是,如果样本足够多
模型只要见过所有的情况
那么模型即使过拟合,也能得到很好的性能
权重初始化
全零初始化
会导致相同层的所有w的梯度都相同,w在更新的时候,就会向着相同的方向,相同的步长前进
导致w都一样
随机权重初始化
- 好的初始化可以防止前向传播过程中信息的消失,也可以解决反向传递的梯度消失
- 激活函数是双曲正切或sigmoid时,使用Xaizer初始
- Relu或Leakly Relu时使用He初始化方法
批归一化
在送进激活函数之前,进行归一化,可以有效的解决梯度消失问题
通过去均值,归一化,并通过神经网络训练平移和缩放
可以让归一化操作的灵活度更高
KL散度
从公式可以看出,交叉嫡是KL散度的特殊情况
交叉嫡是当p(x)为1时,让q(x)逼近于1
KL散度是非对称的,就是KL(p||q) != KL(q||p),由于对数log是非对称的
最小化KL散度可以让当q(x)>p(x)时,让q逼近于p
因此一般想让p逼近于q,可以通过最小化 KL(p||q) + KL(q||p)来做到
梯度消失
如果神经网络中间层都使用sigmoid函数
sigmoid函数的导数可见上图
一般维持再一个小于1的数
那么在链式法则里,多个小于1的数连乘,会导致浅层的梯度会逼近于零
这会导致浅层的参数,永远得不到更新
解决方法
- 使用relu函数代替sigmoid函数
- 使用残差网络
- 使用梯度中继
梯度爆炸
如果在计算某个权重的梯度时,导数非常大
会导致w向前走很大一步
导致函数的loss不降反升
解决方法
可以通过梯度截断的方式解决
过拟合与欠拟合
机器学习的根本问题是优化和泛化的问题
过拟合解决方案
-
获取更多的训练数据
可以通过寻找更多的数据,或者通过平移,缩放等数据增强,来获得更多的数据
-
引入正则化
引入对权重L的约束
-
随机失活Dropout
训练的时候,通过一定概率,不训练某些权重
在预测时,全部权重参与运算
可以是一种集成学习
-
缩减模型
减少层数,减少神经元
超参数优化方法
网格搜索
通过认为设定参数
多次尝试模型在训练集和验证集上
随机搜索
通过在网格中,随机取9个点
这样就可以选取9个不同的学习率
提高参数搜索的效率
但是模型的提高会变得模糊,因为我们并不能确定到底哪个参数发生变化,引起模型向更优的方向前进
范围缩小搜索
初始的时候,在大范围进行搜索
在确定某一小区域更优的时候
缩小搜索范围
继续找寻最优解
卷积
去噪/磨皮/平滑
通过定义n*n卷积核,每个元素为1/n*n,对原图像进行卷积操作,使得每个点等于周边点的求和平均,使得原本白化的点,可以弱化白色
性质
-
叠加性
filter(f1 + f2) = filter(f1) + filter(f2
-
平移不变性
filter(shift(f)) = shift(filter(f))
单位脉冲核
通过卷积,图像维持不变
左移单位脉冲核
通过卷积,图像左移一位
锐化
振铃
通过平滑卷积,会使图像出现一些水平和垂直的条状
可以通过根据与中心远近程度分配权重
高斯卷积核
计算步骤:
- 计算高斯值
- 对高斯值进行归一化
作用:
- 去掉图像中的高频成分
方差的变化
方差越大,图像越平滑
方差越小,图像的原有特征越能保留
卷积核尺寸
卷积核如果超过了方差覆盖的范围,那么几乎会等于零。
因此在确定方差的情况下,不要设置过大的尺寸,以免计算不必要的运算
计算可分离性
通过分析上述计算过程
一个高斯核的运算,可以分离成两个一维的卷积叠加运算可得
分离后结果会保持一致
但是计算量却大大减少
中值滤波器
噪声
椒盐噪声
黑色白色像素随机出现
使用中值滤波器去噪
脉冲噪声
白色像素随机出现
使用中值滤波器去噪
高斯噪声
噪声强度变化俯冲正态分布
使用高斯卷积核去噪
边缘提取
边缘的定义
图像中亮度急速变化的点
研究边缘的意义
- 图像轮廓的信息更能表达图像的语义和形状
- 相对于像素,边缘表示更加紧凑
种类
边缘检测
通过对灰度进行量化,求出一阶导数,可以找到导数最大的两个点,可以断定为边缘
导数计算
通过卷积计算导数
效果如下
可以看到,对图像求偏导,等同于提取梯度方向灰度的变化
因此对x和y求偏导会得到两张不一样的偏导图
x方向的偏导,可以提取到垂直的边缘
y方向的偏导,可以提取到水平的边缘
结合各方向的偏导,可以得到一张综合图
噪声处理
原始图像,一般包含噪声
而噪声会对用导数计算出来的曲线异常波动
通过先对噪声处理
得到平滑的信号
再进行导数计算
可以得到更好的效果
高斯偏导核
噪声处理需要用到高斯核
对图形进行求导需要用到导数核
对高斯核核导数核进行结合成一个核
可以减少计算量
非最大化抑制
计算出来的导数图
如果每个值都保留,会使得边缘过于复杂
对像素进行阈值处理
只保留高于阈值的像素
可以得到简化而清晰的轮廓图
双阈值
由于轮廓一般是连接的,而在一个连接上,有可能有些点的像素高,有些像素低
通过高阈值得到边缘轮廓
然后使用低阈值去延申边缘
可以得到更有效的图
纹理表示
通过上图48个卷积核,可以对原始图像提取到48个不同的纹理。
对这48个纹理分别取平均成一个点
就成了48维的向量
每1维的向量代表一个特征
然后就可以通过计算这些特征,来做任务的预测了
卷积神经网络
一个卷积核,对相同厚度的特征图进行卷积运算
会得到一个厚度为1的特征图
多个卷积核,可以得到多个特征图
特征图尺寸的计算
池化
作用:
- 降低特征图的长宽
- 减少卷积的参数
- 降低计算开销
- 控制过拟合
常见的池化:
- 最大池化
- 平均池化
卷积全网络
图像增强
为什么:
- 样本太少,容易过拟合
- 泛化效果不好
怎么办:
- 从原有的训练数据中生成更多的训练数据
- 利用能够生成可信图像的随机变换来增加样本
手段:
- 翻转
- 缩放
- 抠图
- 色彩抖动
- 平移
- 旋转
- 拉伸
- 裁剪
经典网络
AlexNet
主要贡献:
- 提出卷积加全连接的神经网络
- 使用Relu函数为激活函数
- 提出Dropout正则化来控制过拟合
- 使用加入动量小批量梯度下降算法加速训练收敛
- 使用数据增强来抑制过拟合
- 使用GPU加速计算
卷积层在做什么
人工卷积核:
计算机拟合的卷积核:
每一个卷积核是一个图片的模式,用来匹配要预测的图片
如果图片与卷积核的模式匹配
相应的卷积出来的特征图就会高响应
如果不匹配,则特征图就会低响应
因此卷积出来的特征图,呈现稀疏性
通过对不同模式的特征图组合,就可以有效的判断图片的类别
VGG
主要贡献:
- 使用更小的3x3的卷积核串联来获得更大的感受野
- 放弃11x11和5x5的大的卷积核
- 深度更深,分线性更强,网络参数更少
- 去掉局部相应归一化层
小卷积核的优势:
- 多个小尺寸的卷积核串联可以得到与大卷积核相同的感受野
- 网络深度更深
- 非线性更强
- 参数更小
池化后卷积核个数增加一倍的原因:
- 池化可以减少特征图尺寸,降低显存占用
- 增加卷积核的个数可以学习更多的结构特征,但会增加网络参数数量
- 一增一减的设计平衡了精度,存储和计算开销
- 提升网络性能
卷积核增加到512后不再增加的原因:
- 第一个全连接层含有102M参数,占总参数个数的74%
- 参数过多容易过拟合,不易被训练
- 参数过多会导致内存溢出
GoogleNet
主要贡献:
- 提出了一种Inception结构,它保留了输入信号的更多特征
- 去掉AlexNet的前两个全连接层,并采用平均池化,使得GoogleNet只有500w参数,比AlexNet少12倍
- 引入辅助分类器,克服训练过程的梯度消失问题
Inception:
- 通过并联多个不同类别的卷积,来增加信息的传递
- 通过1x1的卷积做信号压缩,来抵消并联卷积增加的参数
平均池化的意义:
- 平均池化丢失了信号的位置信息
- 忽略位置信息,有助于提升特征的平移不变性
- 池化后的信号,可以保留语义特征
- 可以大大减少模型的参数
1x1卷积不会很大的损失信息
- 由于特征图是某个卷积核对原图的模式匹配,这必然带来不同的特征图会有不同的响应,因此具有很大的稀疏性
- 通过1x1卷积的压缩,会让特征图的厚度发生变化,由于稀疏性,因此大部分的特征卷积后会得以保留。
- 因此压缩并不会损失太多的信息
ResNet
主要贡献:
- 通过堆叠残差模块,可以构造很深的神经网络,而不会出现梯度消失的现象
- 提出批归一化方法来对抗梯度消失,降低网络训练对于权重初始化的以来
- 提出针对Relu函数的权重初始化方法
残差网络性能好的原因:
- 残差网络可以看出一种集成模型
视觉识别任务
语义分割
通过全卷积神经网络,预测每个像素点的类别
上采样
- 反池化
- 转置卷积
目标检测
单目标检测
通过cnn学习特征
一个分类输出,拟合类别
一个box回归,拟合正方形
多目标检测
R-CNN
通过selective search来选取候选框
然后对每个候选框进行单目标预测
缺点:
- 每个候选框单独用一个网络计算,造成大量的重复计算
- selective search提取候选框,非常耗时
Fast R-CNN
- 通过selective search选取候选框
- 只是用一个卷积网络来提取特征
- 对提取到的特征图,根据候选框的选取,提取特征图的特征信息
- 使用softmax来代替svm
缺点:
- 选取候选框依然很慢
Rol Align:
- 由于候选框的维度更不相同
- 而对于后续的预测,需要输入的维度一致
- Rol align可以把不同维度的特征图归一成相同维度的特征向量
Faster R-CNN
由于R-CNN的候选框选取算法太慢
Faster R-CNN通过只对特征图进行遍历选取候选框
从而大大加速了模型的效率
Yolo/SDD/RetinaNet
由于Faster R-CNN需要两阶段训练
而且提取候选框的粒度很细
而有些场景,并不需要太细粒度的检测
Yolo等算法,通过去掉Faster R-CNN的第一阶段的候选框判断
直接通过粗粒度的选取候选框,并进行目标预测和box回归
快速地得到粗粒度的检测结果
实例分割
Mask R-CNN
通过在Faster R-CNN加上全卷积网络
预测候选框的mask
产生式模型
PixelRNN
从图像左上角开始产生像素
利用RNN
一个像素一个像素的生成
直到生成整张图像
缺点:
太慢
PixelCNN
一个像素一个像素的生成
利用CNN产生新的像素点
缺点:太慢
VAE
缺点:
- 模型记住了训练图片的信息
- 对于新预测数据,效果并不好
通过对自编码器,加入正态分布
把特征进行模糊输入
使得编码器的泛化效果更好
GAN
由于VAE产生的图像过于模糊
效果不好
而GAN可以产生更高质量的图片
通过两个网络的博弈
迭代的更新两个网络的性能
使得生成网络生成的图片越来越真实
判定网络越来越能判断哪些是真图片,哪些是假图片