前言
Deep Learning是全部深度学习算法的总称,而卷积神经网络是深度学习算法在图像处理领域的一个应用。
卷积神经网络的灵感来源于人类大脑的视觉皮层。
人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。
我们看到一张图像或者只是看着周围的世界时,大部分时间我们都能够立刻刻画这个场景,给每个对象一个标签——快速识别能力。
利用电脑怎么做?
当输入一个图像到电脑的时候,电脑会获取到一个像素质的数组。
而计算机的输出的东西,描绘了图像是一个类的概率(.80为猫,.15为狗)
即:输入:图像 输出:类别(猫/狗)
如何解决?
我们希望计算机做的是能够区分所有的图像,并找出使狗成为狗或使猫成为猫的独特功能。这也是下意识地在我们的脑海中继续的过程。当我们看一张狗的照片时,如果照片具有可识别的特征,例如爪子或四条腿,我们可以将其分类。以类似的方式,计算机能够通过查找诸如边缘和曲线等低级特征来执行图像分类,然后通过一系列卷积层来构建更抽象的概念。
卷积神经网络的组成:输入层、卷积层、激活函数、池化层、全连接层
卷积层——用于进行特征提取
对数字图像做卷积操作其实就是利用卷积核(卷积模板)在图像上滑动,将图像点上的像素灰度值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值,并最终滑动完所有图像的过程。
如图所示,我们有一个5x5的图像,我们用一个3x3的卷积核:
1 0 1
0 1 0
1 0 1
来对图像进行卷积操作(可以理解为有一个滑动窗口,把卷积核与对应的图像像素做乘积然后求和),得到了3x3的卷积结果。
这个过程我们可以理解为我们使用一个过滤器(卷积核)来过滤图像的各个小区域,从而得到这些小区域的特征值。
不同卷积核下卷积的意义:
平滑,模糊,去燥,锐化,边缘提取等等工作,其实都可以通过卷积操作来完成
将原像素中间像素值乘1,其余全部乘0,显然像素值不会发生任何变化。
平滑均值滤波
该卷积核的作用在于取九个值的平均值代替中间像素值,所以起到的平滑的效果
图像锐化
该卷积利用的其实是图像中的边缘信息有着比周围像素更高的对比度,而经过卷积之后进一步增强了这种对比度,从而使图像显得棱角分明、画面清晰,起到锐化图像的效果。
可以利用OpenCV提供的filter2D函数完成对图像进行卷积操作,其函数接口为:
CV_EXPORTS_W void filter2D(
InputArray src,
OutputArray dst,
int ddepth,
InputArray kernel,
Point anchor=Point(-1,-1),
double delta=0,
int borderType=BORDER_DEFAULT );
第一个参数: 输入图像
第二个参数: 输出图像,和输入图像具有相同的尺寸和通道数量
第三个参数: 目标图像深度,输入值为-1时,目标图像和原图像深度保持一致。
第四个参数: 卷积核,是一个矩阵
第五个参数:内核的基准点(anchor),其默认值为(-1,-1)说明位于kernel的中心位置。基准点即kernel中与进行处理的像素点重合的点。
第五个参数: 在储存目标图像前可选的添加到像素的值,默认值为0
第六个参数: 像素向外逼近的方法,默认值是BORDER_DEFAULT。
#include <iostream>
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage = imread("1.jpg");
namedWindow("srcImage", WINDOW_AUTOSIZE);
imshow("原图", srcImage);
Mat kernel = (Mat_<double>(3,3) <<
-1, 0 ,1,
-2, 0, 2,
-1, 0, 1);
Mat dstImage;
filter2D(srcImage,dstImage,srcImage.depth(),kernel);
namedWindow("dstImage",WINDOW_AUTOSIZE);
imshow("卷积图",dstImage);
waitKey(0);
return 0;
}
池化层—采样工作
即使我们第一步做完了卷积,图像仍然很大(因为卷积核比较小),所以为了降低数据维度,就进行下采样。
有以下的特点
1、特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。
2、特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。
池化方法
1、Max Pooling
2、avy pooling
方法是对每一个2*2的区域元素求和,再除以4,得到主要特征
普及:strides在官方定义中是一个一维具有四个元素的张量,其规定前后必须为1。中间两个数分别代表了水平滑动和垂直滑动步长值。
在卷积核移动逐渐扫描整体图时候,因为步长的设置问题,可能导致剩下未扫描的空间不足以提供给卷积核的,大小扫描 比如有图大小为5*5,卷积核为2*2,步长为2,卷积核扫描了两次后,剩下一个元素,不够卷积核扫描了,这个时候就在后面补零,补完后满足卷积核的扫描,这种方式就是same。如果说把刚才不足以扫描的元素位置抛弃掉,就是valid方式。
激活函数
激活函数是用来加入非线性因素的,因为线性模型的表达力不够 。
对于图像,我们主要采用了卷积的方式来处理,也就是对每个像素点赋予一个权值,这个操作显然就是线性的。但是对于我们样本来说,不一定是线性可分的,为了解决这个问题,我们可以进行线性变化,或者我们引入非线性因素,解决线性模型所不能解决的问题。
simoid:f(x)=11+e−x
tanh:f(x)=tanh(x)
ReLU:f(x)=max(x,0)
softmax:f(x)=log(1+exp(x))
全连接层
连接所有的特征,将输出值送给分类器
全连接层之前的作用是提取特征
全连接层的作用是分类
可以参照这篇文章
https://www.leiphone.com/news/201705/6Zi5evpIaKJRHsJj.html