文章目录
引入
首先思考一个问题:我们如何识别一个熟人?
场景1:你的同学小王迎面向你走来,你说:嗨,早上好!
场景2:你们班新来了一个同学,你看了他一眼,心里想到,这人是谁啊。
场景1:
1. 离远看的时候,看脸型(模糊的轮廓),诶好像是认识的人,好像是小王,但是不敢确定
2. 走近一点,看这眼睛,这鼻子,这嘴巴,不就是小王嘛
场景2:
1. 扫视周围同学,这个人是小王,每天都来,我认识;这个人是班主任,挺烦的,但是我也认识
2. 这个人我好像没见过啊,仔细看看… 看看眼睛,鼻子,嘴巴。嗯…确实没见过
我们把这两个场景抽象出来:
我们把对象的轮廓提取出来,与我们脑子里的“人脸数据库”进行对比
如果有相似概率比较高的,我们就进行下一步处理;如果没有,这个人我们大概率就不去看了
抽取对象的局部特征,与我们脑子里某个人的局部特征进行对比
得出结论:
(1)如果相似度接近100%,那我们断定,就是这个人
(2)如果相似度较高,根据新的特征,那我们推测,这哥们可能是被揍了,或者化妆了
(3)如果相似度一般,那我们说,这人和“某某某”长得真像啊
(4)如果相似度不高,那这人我们就没见过
第二个问题:计算机如何模拟人的行为进行识别
RGB示例
轮廓特征
局部特征
计算机处理图像识别的思路
轮廓特征和局部特征的抽取:
(1)通过对每个像素块RGB数据的抽取,得出每个像素块的值
(2)在某个范围内(眼睛,鼻子,嘴),抽取所有,或者一部分的像素块,得到某个范
围内的图像轮廓特征和局部特征的对比
通过和样本库进行对比,确定局部是不是类似的把所有局部的对比结果综合,得出最后结论
“啊! 这是小王,我需要跟他打个招呼!”
神经网络和卷积神经网络的联系
卷积神经网络的原理
卷积运算
边缘检测
eg:
灰度图
Padding & Stride (填充和步长)
卷积运算的缺点
- 每次做卷积的时候,图像都会缩小
- 角落的像素点只会被使用一次,而中间的像素点会用到很多次,这意味着你丢掉了很多图像边缘的信息
解决的方法 – 在做卷积运算前,对图像进行填充
Vaild 和 Same 卷积运算
Stride 步长
公式:
((n + 2p – f)/s + 1) x (n + 2p – f)/s + 1)
注意:
如果商不为0, 那就向下取整
如果移动到了外面,那就跳过
卷积神经网络的总结和延伸
基于RGB的卷积神经网络
卷积神经网络的示例1
池化层
池化层是用来缩减模型,提高计算速度,同时提高所取得特征的鲁棒性
池化层是用来降采样subsample, shrink, 减少计算负荷,内存使用,参数数量(防止过拟合)
正如卷积神经网络一样,在池化层中的每个神经元被连接到上面一层输出的神经元,只对应一小块感受野的区域。 我们必须定义大小,步长,padding类型
池化层没有权重值,他只是聚合输入根据取最大值或者求均值
池化层的例子: 2x2的池化核,步长为2,没有填充,只有最大值往下传,其他输入被丢弃掉了; 直观的理解说就是,因为取最大值,所以较小值就会被忽略,也就是不重要的特征会被忽略
最大池化
平均池化
平均池化选取的不是每个过滤器的最大值,而是平均值
参数总结
超参数:
f: 过滤器大小
s:步长
最大池化或者平均池化
没有padding!所以池化层公式就变为: ((n – f )/ s + 1) x ((n – f )/ s + 1) x nc
最大池化层是一个静态属性
卷积神经网络示例2 – 基于经典模型LeNet5
为什么要用卷积神经网络
既然我们能把图像数据化,那我们可以可以不用卷积神经网络呢,直接用深度神经网络呢?
可以,但是运算量很大
比如LeNet,第一层就需要1400万个参数,而且要知道32x32是一个非常非常小的图像
但是用卷积神经网络,第一层只有156个参数
参数共享和稀疏连接
通过循环梯度下降,把不重要的特征权重降低(稀疏链接),最终得到合适的模型