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