深度学习-计算机视觉

2021-02-06  本文已影响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都一样

随机权重初始化

批归一化

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的数连乘,会导致浅层的梯度会逼近于零

这会导致浅层的参数,永远得不到更新

解决方法

梯度爆炸

cv-expose

如果在计算某个权重的梯度时,导数非常大

会导致w向前走很大一步

导致函数的loss不降反升

解决方法

可以通过梯度截断的方式解决

过拟合与欠拟合

cv-overfiting

机器学习的根本问题是优化和泛化的问题

过拟合解决方案

超参数优化方法

网格搜索

cv-grid-choose

通过认为设定参数

多次尝试模型在训练集和验证集上

随机搜索

cv-s-grid

通过在网格中,随机取9个点

这样就可以选取9个不同的学习率

提高参数搜索的效率

但是模型的提高会变得模糊,因为我们并不能确定到底哪个参数发生变化,引起模型向更优的方向前进

范围缩小搜索

cv-large-to-small

初始的时候,在大范围进行搜索

在确定某一小区域更优的时候

缩小搜索范围

继续找寻最优解

卷积

去噪/磨皮/平滑

cv-quzao
cv-avg-cnn

通过定义n*n卷积核,每个元素为1/n*n,对原图像进行卷积操作,使得每个点等于周边点的求和平均,使得原本白化的点,可以弱化白色

性质

单位脉冲核

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

主要贡献:

卷积层在做什么

人工卷积核:

cv-cnn-manmake

计算机拟合的卷积核:

cv-cnn-machine-make

每一个卷积核是一个图片的模式,用来匹配要预测的图片

如果图片与卷积核的模式匹配

相应的卷积出来的特征图就会高响应

如果不匹配,则特征图就会低响应

因此卷积出来的特征图,呈现稀疏性

通过对不同模式的特征图组合,就可以有效的判断图片的类别

VGG

cv-vgg16

主要贡献:

小卷积核的优势:

池化后卷积核个数增加一倍的原因:

卷积核增加到512后不再增加的原因:

GoogleNet

cv-googlenet

主要贡献:

cv-inception

Inception:

平均池化的意义:

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

cv-1x1cnn

ResNet

cv-resnet

主要贡献:

残差网络性能好的原因:

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来选取候选框

然后对每个候选框进行单目标预测

缺点:

Fast R-CNN
cv-fast-r-cnn

缺点:

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可以产生更高质量的图片

通过两个网络的博弈

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读