利用卷积神经网络(CNN)提取图像特征

1、前言

本篇文章主要介绍了CNN网络中卷积层的计算过程,欲详细了解CNN的其它信息能够参考:技术向:一文读懂卷积神经网络

卷积神经网络(CNN)是局部链接网络。相对于全链接网络其最大的特色就是:局部链接性权值共享性。由于对一副图像中的某个像素p来讲,通常离像素p越近的像素对其影响也就越大(局部链接性);另外,根据天然图像的统计特性,某个区域的权值也能够用于另外一个区域(权值共享性)。这里的权值共享说白了就是卷积核共享,对于一个卷积核将其与给定的图像作卷积就能够提取一种图像的特征,不一样的卷积核能够提取不一样的图像特征。概况的讲,卷积层的计算方法就是根据公式

conv=σ(imgMatW+b)(1)

其中” σ ”表示激活函数;” imgMat ”表示灰度图像矩阵; ” W ”表示卷积核;” ”表示卷积操做;” b ”表示偏置值。

2、举例说明

下面用一个具体例子来详细说明卷积层的计算过程。用到的图像为lena图像,如图1所示;卷积核为Sobel卷积核,如图2所示。

这里写图片描述

图1 Lena图像(512x512)

这里写图片描述

图2 Sobel卷积核(Gx表示水平方向,Gy表示垂直方向)

一、首先用Sobel—Gx卷积核来对图像作卷积,即公式(1)中的 imgMatW

这里卷积核大小为3x3,图像大小为512x512若是不对图像作任何其它处理,直接进行卷积的话,卷积后的图像大小应该是:(512-3+1)x(512-3+1)。对卷积不懂的能够参考技术向:一文读懂卷积神经网络或其余读物。最终结果为:

这里写图片描述

图3 lena图像与Sobel—Gx卷积核的卷积结果

二、 将步骤1中所得结果(一个矩阵)的每一个元素都加上b(偏置值),并将所得结果(矩阵)中的每一个元素都输入到激活函数,这里取sigmoid函数以下式所示

f(x)=11+ex(2)

最终结果如图4所示:

这里写图片描述

图4 卷积层所获得的最终结果

三、同理

利用Sobel—Gy卷积核咱们最终能够获得如图5所示的结果。

这里写图片描述

图5 Sobel—Gy卷积核卷积层所获得的最终结果

3、完整代码及结果

clear
clc
imgRGB = imread('lena.jpg');
imgGray = double(rgb2gray(imgRGB));

Gx = [-1 0 1;-2 0 2;-1 0 1];
convImg = conv2(imgGray,Gx,'valid');
whos convImg
figure
subplot(1,2,1);
imshow(uint8(convImg));
title('Sobel-Gx卷积结果')
b = 0.2;
sigmImg = 1./(1+exp(-convImg)) + b;
subplot(1,2,2);
imshow(sigmImg);
title('Sobel-Gx-sigmoid函数激活结果')

Gy = [-1 0 1;-2 0 2;-1 0 1]';
convImg = conv2(imgGray,Gy,'valid');
whos convImg
figure
subplot(1,2,1);
imshow(uint8(convImg));
title('Sobel-Gy卷积结果')
b = 0.2;
sigmImg = 1./(1+exp(-convImg)) + b;
subplot(1,2,2);
imshow(sigmImg);
title('Sobel-Gy-sigmoid函数激活结果')

结果

一、Sobel—Gx卷积核结果

这里写图片描述

二、Sobel—Gy卷积核结果

这里写图片描述

4、小结。

以上计算过程,咱们只用了两个卷积核。能够看出两个卷积核提取出了不一样的图像特征。实际中,咱们通常会使用十几个或者几十个卷积核来提取图像特征,进而来进行下一步的运算。