美文网首页
深度学习-计算机视觉

深度学习-计算机视觉

作者: 谭英智 | 来源:发表于2021-02-06 17:02 被阅读0次

定义

cv-define

人通过眼睛获取图片的信息

再经过大脑的处理,得到对图片的解析

cv-human-vision

计算机通过摄像头获取图片的信息

经过CPU的数学运算,得到对图片的解析

cv-computer-vision

大脑信号处理

cv-brain-signal

科学家通过对猫的大脑分析,发现猫的大脑对一些基本的图像元素有比较大的反应,对整体复杂的图像,没什么反应。

结论

大脑对图片的处理是分层的

浅层的神经元只会处理基本的图像元素

深层的神经元会对浅层得到的基元进行组合,得到更高级的语义

大卫马尔

计算机视觉之父

他定义了什么是计算机视觉任务:

  • 计算理论

    计算的目的是什么?该问题的已知或可以施加的约束是什么

  • 表达与算法

    输入,输出和中间信息如何表达,使用哪些算法来计算所期望的结果

  • 硬件实现

    表达和算法如何再硬件中实现运算

深度学习三要素

cv-deeplearning-element

计算机视觉的难点

  • 视角
cv-angle
  • 光照
cv-light
  • 尺度
cv-size
  • 遮挡
cv-cover
  • 形变
cv-shape-change
  • 背景杂波
cv-background
  • 类内形变
cv-multi-shape
  • 运动模糊
cv-sport
  • 类别繁多
cv-lots

基于规则的分类

由于上述难点

简单的通过硬编码来识别猫,是一件很困难的事情

技术点

线性分类

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-rmsprop

rmsprop通过加入遗忘系数

解决了adagrad不再更新权重的问题

ADAM

同时结合动量和自适应梯度思想

cv-adam

修正偏差用于解决冷启动的问题

例如当u比较大,例如0.9,那么初始v等于0.1的梯度,通过修正偏差,可以让v变会梯度的值

数据集划分

cv-data
  • 训练集用于给定超参数时模型参数的学习
  • 验证集用于选择超参数
  • 测试集用于评估泛化能力

数据集过小

可以通过k折交叉验证

cv-k-data

数据预处理

  • 归一化
cv-mean

由于模型只对数据的相对位置有兴趣,对绝对位置没兴趣

因此通过去均值和归一化,可以让各特征的范围一致

从而可以更有效的训练模型

全连接神经网络

cv-mlp
cv-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-quzao
cv-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-pooling

卷积全网络

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倍
  • 引入辅助分类器,克服训练过程的梯度消失问题
cv-inception

Inception:

  • 通过并联多个不同类别的卷积,来增加信息的传递
  • 通过1x1的卷积做信号压缩,来抵消并联卷积增加的参数

平均池化的意义:

  • 平均池化丢失了信号的位置信息
  • 忽略位置信息,有助于提升特征的平移不变性
  • 池化后的信号,可以保留语义特征
  • 可以大大减少模型的参数

1x1卷积不会很大的损失信息

cv-1x1cnn
  • 由于特征图是某个卷积核对原图的模式匹配,这必然带来不同的特征图会有不同的响应,因此具有很大的稀疏性
  • 通过1x1卷积的压缩,会让特征图的厚度发生变化,由于稀疏性,因此大部分的特征卷积后会得以保留。
  • 因此压缩并不会损失太多的信息

ResNet

cv-resnet

主要贡献:

  • 通过堆叠残差模块,可以构造很深的神经网络,而不会出现梯度消失的现象
  • 提出批归一化方法来对抗梯度消失,降低网络训练对于权重初始化的以来
  • 提出针对Relu函数的权重初始化方法

残差网络性能好的原因:

  • 残差网络可以看出一种集成模型
cnn-resnet-jicheng

视觉识别任务

cv-task

语义分割

cv-segmentaion

通过全卷积神经网络,预测每个像素点的类别

上采样
  • 反池化
cv-max-unpooling
  • 转置卷积
cv-zhuanzhi-cnn

目标检测

单目标检测
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可以把不同维度的特征图归一成相同维度的特征向量
cv-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-van-not-ok

通过对自编码器,加入正态分布

把特征进行模糊输入

使得编码器的泛化效果更好

cv-vae

GAN

cv-gan

由于VAE产生的图像过于模糊

效果不好

而GAN可以产生更高质量的图片

通过两个网络的博弈

迭代的更新两个网络的性能

使得生成网络生成的图片越来越真实

判定网络越来越能判断哪些是真图片,哪些是假图片

相关文章

网友评论

      本文标题:深度学习-计算机视觉

      本文链接:https://www.haomeiwen.com/subject/zvsotltx.html