一、簡介
1 CNN的應用領域
CNN在以下幾個領域均有不同程度的應用:
影像處理領域(最主要運用領域) —— 影像識別和物體識別,影像標注,影像主題生成,影像內容生成,物體標注等,
視頻處理領域 —— 視頻分類,視頻標準,視頻預測等
自然語言處理(NLP)領域 —— 對話生成,文本生成,機器翻譯等
其它方面 —— 機器人控制,游戲,引數控制等
2 CNN的網路結構
2.1 傳統神經網路

上圖為傳統的神經網路的結構, 它是一種全連接的結構, 這也就造成了引數訓練的難度加深. 還有BP求解中的可能出現的梯度爆炸和梯度消失的現象等.此外,深度結構(涉及多個非線性處理單元層)非凸目標代價函式中普遍存在的區域最小是訓練困難的主要來源. 這些因素都造成了傳統的神經網路的不適用性,所以沒有較為廣泛的運用.
2.2 卷積神經網路(Convolutional Neural Networks,CNN)

上圖為CNN的網路結構,CNN可以有效的降低反饋神經網路(傳統神經網路)的復雜性,常見的CNN結構有LeNet-5、AlexNet、ZFNet、VGGNet、GoogleNet、ResNet等等,其中在LVSVRC2015 冠軍ResNet是AlexNet的20多倍,是VGGNet的8倍;從這些結構來講CNN發展的一個方向就是層次的增加,通過這種方式可以利用增加的非線性得出目標函式的近似結構,同時得出更好的特征表達,但是這種方式導致了網路整體復雜性的增加,使網路更加難以優化,很容易過擬合,
CNN的網路結構和傳統神經網路結構異同點有:
(1)CNN主要有資料輸入層, 卷積層, RELU激勵層, 池化層, 全連接層, Batch Normalization Layer(不一定存在). 傳統神經網路主要有資料輸入層, 一個或多個隱層以及資料輸出層. 比較可以發現CNN仍然使用傳統神經網路的層級結構.
(2)CNN的每一層都具有不同的功能, 而傳統神經網路每一層都是對上一層特征進行線性回歸, 再進行非線性變換的操作.
(3)CNN使用RELU作為激活函式(激勵函式) , 傳統神經網路使用sigmoid函式作為激活函式.
(4)CNN的池化層實作資料降維的作用,提取資料的高頻資訊.傳統神經網路沒有這個作用.
(5)CNN主要是在影像分類和物品識別等應用場景應用比較多
2.2.0 CNN的主要層次介紹
CNN保持了層級網路結構,不同層次使用不同的形式(運算)與功能
資料輸入層:Input Layer
卷積計算層:CONV Layer
ReLU激勵層:ReLU Incentive Layer
池化層:Pooling Layer
全連接層:FC Layer
備注:Batch Normalization Layer(可能有)
2.2.1 資料輸入層 (Input Layer)
和神經網路/機器學習一樣,需要對輸入的資料需要進行預處理操作,需要進行預處理的主要原因是:
輸入資料單位不一樣,可能會導致神經網路收斂速度慢,訓練時間長
資料范圍大的輸入在模式分類中的作用可能偏大,而資料范圍小的作用就有可能偏小
由于神經網路中存在的激活函式是有值域限制的,因此需要將網路訓練的目標資料映射到激活函式的值域
S形激活函式在(0,1)區間以外區域很平緩,區分度太小,例如S形函式f(X),f(100)與f(5)只相差0.0067
常見的資料預處理的方式有以下幾種:
(1)均值化處理 — 即對于給定資料的每個特征減去該特征的均值(將資料集的資料中心化到0)
(2)歸一化操作 — 在均值化的基礎上再除以該特征的方差(將資料集各個維度的幅度歸一化到同樣的范圍內)
(3)PCA降維 — 將高維資料集投影到低維的坐標軸上, 并要求投影后的資料集具有最大的方差.(去除了特征之間的相關性,用于獲取低頻資訊)
(4)白化 — 在PCA的基礎上, 對轉換后的資料每個特征軸上的幅度進行歸一化.用于獲取高頻資訊.
(5) http://ufldl.stanford.edu/wiki/index.php/白化

x = x - np.mean(x, 0) x = (x - np.mean(x, 0)) / np.std(x, 0)

x -= np.mean(x, axis=0) # 去均值
cov = np.dot(x.T, x) / x.shape[0] # 計算協方差
u, s, v = np.linalg.svd(cov) # 進行 svd 分解
xrot = np.dot(x, u)
x = np.dot(x, u[:, :2]) # 計算 pca
x = xrot / np.sqrt(s + 1e-5) # 白化

備注:雖然我們介紹了PCA去相關和白化的操作,但是實際上在卷積神經網路中,一般并不會適用PCA和白化的操作,一般去均值和歸一化使用的會比較多.
建議:對資料特征進行預處理,去均值、歸一化
2.2.2 卷積計算層(CONV Layer)
這一層就是卷積神經網路最重要的一層,也是“卷積神經網路”的名字由來,
人的大腦在識別圖片的程序中,會由不同的皮質層處理不同方面的資料,比如:顏色、形狀、光暗等,然后將不同皮質層的處理結果進行合并映射操作,得出最終的結果值,第一部分實質上是一個區域的觀察結果,第二部分才是一個整體的結果合并.
還有,對于給定的一張圖片, 人眼總是習慣性的先關注那些重要的點(區域), 再到全域. 區域感知是將整個圖片分為多個可以有區域重疊的小視窗, 通過滑窗的方法進行影像的區域特征的識別. 也可以說每個神經元只與上一層的部分神經元相連, 只感知區域, 而不是整幅影像.
基于人腦的圖片識別程序,我們可以認為影像的空間聯系也是區域的像素聯系比較緊密,而較遠的像素相關性比較弱,所以每個神經元沒有必要對全域影像進行感知,只要對區域進行感知,而在更高層次對區域的資訊進行綜合操作得出全域資訊;即區域感知,


區域關聯:每個神經元看做一個filter
視窗(receptive field)滑動,filter對區域資料進行計算
相關概念:深度:depth,步長:stride,填充值:zero-padding
CONV程序參考:http://cs231n.github.io/assets/conv-demo/index.html
一個資料輸入,假設為一個RGB的圖片
在神經網路中,輸入是一個向量,但是在卷積神經網路中,輸入是一個多通道影像(比如這個例子中有3個通道)

-
區域感知
在進行計算的時候,將圖片劃分為一個個的區域進行計算/考慮;
那么,為什么可以使用區域感知呢?
我們發現, 越是接近的像素點之間的關聯性越強, 反之則越弱. 所以我們選擇先進行區域感知, 然后在更高層(FC層)將這些區域資訊綜合起來得到全域資訊的方式. -
引數共享機制
所謂的引數共享就是就是同一個神經元使用一個固定的卷積核去卷積整個影像,也可以認為一個神經元只關注一個特征. 而不同的神經元關注多個不同的特征.(每一個神經元都可以看作一個filter) -
滑動視窗的重疊
滑動視窗重疊就是在進行滑窗的程序中對于相鄰的視窗有區域重疊的部分,這主要是為了保證影像處理后的各個視窗之間的邊緣的平滑度,降低視窗與視窗之間的邊緣不平滑的特性,
固定每個神經元的連接權重,可以將神經元看成一個模板;也就是每個神經元只關注一個特性
需要計算的權重個數會大大的減少
4)) 卷積計算
卷積的計算就是: 對于每一個神經元的固定的卷積核矩陣與視窗矩陣的乘積(對應位置相乘)再求和之后再加上偏置項b的值, 就得到了代表該神經元所關注的特征在當前影像視窗的值.
如圖2.4所示, 可以看出卷積計算的程序.動態圖點擊這里查看.

2.2.3 RELU激勵層
這一層就是激活層, 在CNN中一般使用RELU函式作為激活函式.它的作用主要是將卷積層的輸出結果做非線性映射.

- 常見的幾種激活函式
激活函式之 Sigmoid、tanh、ReLU、ReLU變形和Maxout
sigmoid函式(S函式)
Tanh函式(2S函式)
RELU函式 ----> 線性修正單元 —> max{ 0, x } ==>無邊界, 易出現’死神經元’
Leaky ReLU 函式 —> 若x> 0 , 則輸出x ; 若x<0,則 alphax, 其中 0< alpha <1 ==> 對RELU的改進
ELU 函式 —> 若x> 0 , 則輸出x ; 若x<0,則 alpha(e^x - 1), 其中 0< alpha <1 ==> 也是一種對RELU的改進
Maxout函式 —> 相當于增加了一個激活層 - 激活函式的一些建議
一般不要使用sigmoid函式作為CNN的激活函式.如果用可以在FC層使用.
優先選擇RELU作為激活函式,因為迭代速度快,但是有可能效果不佳
如果2失效,請用Leaky ReLU或者Maxout,此時一般情況都可以解決啦
在極少的情況下, tanh也是有不錯的效果的
2.2.4 池化層 (Poling Layer)
在連續的卷積層中間存在的就是池化層,主要功能是:通過逐步減小表征的空間尺寸來減小引數量和網路中的計算;池化層在每個特征圖上獨立操作,使用池化層可以壓縮資料和引數的量,減小過擬合,簡而言之,如果輸入是影像的話,那么池化層的最主要作用就是壓縮影像,

池化層中的資料壓縮的策略主要有:
Max Pooling(最大池化)—> 選擇每個小視窗中最大值作為需要的特征像素點(省略掉不重要的特征像素點)
Average Pooling(平均池化) —> 選擇每個小視窗中平均值作為需要的特征像素點

池化層選擇較為重要的特征點, 可以降低維度, 能夠在一定程度上防止過擬合的發生.
2.2.5 FC全連接層
類似傳統神經網路中的結構,FC層中的神經元連接著之前層次的所有激活輸出;換一句話來講的話,就是兩層之間所有神經元都有權重連接;通常情況下,在CNN中,FC層只會在尾部出現
通過全連接結構,將前面輸出的特征重新組合成一張完整的影像.
一般的CNN結構依次為:
INPUT
[[CONV -> RELU] * N -> POOL?]M
[FC -> RELU] * K
FC
2.2.6 Batch Normalization Layer(一般用于卷積層后面,主要是使得期望結果服從高斯分布,使用較少!!)
Batch Normalization Layer(BN Layer)是期望我們的結果是服從高斯分布的,所以對神經元的輸出進行一下修正,一般放到卷積層后,池化層前,
論文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift;
論文鏈接:https://arxiv.org/pdf/1502.03167v3.pdf

如果輸出的是ND的結果,對D個維度每個維度求解均值和方差,
根據均值和方差做歸一化,

強制的進行歸一化操作可能存在一些問題,eg: 方差為0等

Batch Normalization優點:
梯度傳遞(計算)更加順暢,不容易導致神經元飽和(防止梯度消失(梯度彌散)/梯度
爆炸)
學習率可以設定的大一點
對于初始值的依賴減少
Batch Normalization缺點:
如果網路層次比較深,加BN層的話,可能會導致模型訓練速度很慢,
備注:BN Layer慎用!!!
3 CNN的優缺點
優點
① 使用區域感知和引數共享機制(共享卷積核), 對于較大的資料集處理能力較高.對高維資料的處理沒有壓力
② 能夠提取影像的深層次的資訊,模型表達效果好.
③ 不需要手動進行特征選擇, 只要訓練好卷積核W和偏置項b, 即可得到特征值.
缺點
① 需要進行調參, 模型訓練時間較長, 需要的樣本較多, 一般建議使用GPU進行模型訓練.
② 物理含義不明, 每層中的結果無法解釋, 這也是神經網路的共有的缺點.
二、源代碼
function main
clc
close all
% 創建人臉檢測物件
faceDetector = vision.CascadeObjectDetector;
% 人臉檢測
FaceRecognition(faceDetector);
end
%% 選擇圖片
function I = SelectPicture()
[FileName,PathName] = uigetfile('*.jpg', '選擇一張圖片');
if isequal(FileName,0)
disp('沒選擇圖片,請重新選擇!')
I = [];
else
I = imread(fullfile(PathName,FileName));
end
end
%% 人臉檢測
function [I_faces, bbox] = GetFaces(faceDetector, I)
% 檢測人臉
bbox = step(faceDetector, I);
% 創建一個形狀插入物件來繪制邊框圈出的檢測的結果
if size(I, 3) == 1 % 灰度影像,插入白色或黑色框
if mean(I(:)) > 128 % 影像較亮,使用黑框
shapeInserter = vision.ShapeInserter();
else % 影像較暗,使用白框
shapeInserter = vision.ShapeInserter('BorderColor','White');
end
else % 彩色影像,插入紅色框
shapeInserter = vision.ShapeInserter('BorderColor','Custom','CustomBorderColor',[255 0 0]);
end
% 繪制邊框以圈出結果
I_faces = step(shapeInserter, I, int32(bbox));
end
%% 圖片人臉檢測
function FaceRecognition(faceDetector)
% 滑鼠單擊回應
function BtnDownFcn(h, evt)
FaceRecognition(faceDetector);
end
% 選擇檔案
I = SelectPicture();
if isempty(I)
return
end
% 人臉檢測
[I_faces, bbox] = GetFaces(faceDetector, I);
close all
% 創建figure物件
fig1 = figure;
pos1 = get(fig1,'Position');
set(fig1,'Position',[10 pos1(2:4)]);
set(fig1,'WindowButtonDownFcn',@BtnDownFcn);
% 顯示
figure(fig1)
imshow(I_faces)
title('單擊此圖片選擇另一圖片識別')
for i = 1:size(bbox, 1)
text(bbox(i, 1), bbox(i, 2), mat2str(i), 'color', 'r')
end
% 檢測
intbbox = int32(bbox);
for i = 1:size(intbbox, 1)
xs = intbbox(i, 1);
xe = xs + intbbox(i,3);
ys = intbbox(i, 2);
ye = ys + intbbox(i,4);
% 創建figure
if rem(i, 16) == 1
fig2 = figure; %#ok
end
function varargout = FaceSystem(varargin)
% FACESYSTEM MATLAB code for FaceSystem.fig
% FACESYSTEM, by itself, creates a new FACESYSTEM or raises the existing
% singleton*.
%
% H = FACESYSTEM returns the handle to a new FACESYSTEM or the handle to
% the existing singleton*.
%
% FACESYSTEM('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in FACESYSTEM.M with the given input arguments.
%
% FACESYSTEM('Property','Value',...) creates a new FACESYSTEM or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before FaceSystem_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to FaceSystem_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help FaceSystem
% Last Modified by GUIDE v2.5 20-Apr-2018 19:18:59
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @FaceSystem_OpeningFcn, ...
'gui_OutputFcn', @FaceSystem_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before FaceSystem is made visible.
function FaceSystem_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to FaceSystem (see VARARGIN)
% Choose default command line output for FaceSystem
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes FaceSystem wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = FaceSystem_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global str;
global a0;
[filename,pathname]=...
uigetfile({'*.jpg';'*.bmp';'*.gif'},'choose');
str=[pathname filename]
if str~=0;
a0=imread(str);
% 同學在這里寫上進度條的代碼 等待對話框
h=waitbar(0,'Pleast waiting, reading...');
%*********
axes(handles.axes1);
axis off
imshow(a0);
title('原影像')
waitbar(1,h,'finish');
pause(0.05);
delete(h);
end
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
global a0;
global dets
global i_face;
global im
i_face=0;
faceDetector = vision.CascadeObjectDetector;
[im, dets] = GetFaces(faceDetector, a0);
DisplayDetections(im, dets);
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global dets
global i_face;
global a0;
global A_face;
[M,N]=size(dets);
if (i_face>0)&(i_face<=M)
i_face=i_face-1;
i=i_face
A_face=a0(dets(i,2):(dets(i,2)+dets(i,4)),dets(i,1):(dets(i,1)+dets(i,3)),:);
axes(handles.axes2);
axis off
imshow(A_face);
title('待識別的人臉');
end
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global dets
global a0;
global i_face;
global A_face;
[M,N]=size(dets);
if (i_face>=0)&(i_face<M)
i_face=i_face+1;
i=i_face
A_face=a0(dets(i,2):(dets(i,2)+dets(i,4)),dets(i,1):(dets(i,1)+dets(i,3)),:);
axes(handles.axes2);
axis off
imshow(A_face);
title('待識別的人臉');
end
三、運行結果


四、備注
完整代碼或者代寫添加QQ 1564658423
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277789.html
標籤:AI
