版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
卷積神經(jīng)網(wǎng)絡(luò)《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》XXX大學(xué)全連接前饋神經(jīng)網(wǎng)絡(luò)權(quán)重矩陣的參數(shù)非常多局部不變性特征自然圖像中的物體都具有局部不變性特征尺度縮放、平移、旋轉(zhuǎn)等操作不影響其語義信息。全連接前饋網(wǎng)絡(luò)很難提取這些局部不變特征全連接前饋神經(jīng)網(wǎng)絡(luò)前饋神經(jīng)網(wǎng)絡(luò)處理圖像信息時(shí)存在的下列問題。(1)參數(shù)多。假設(shè)輸入圖像的大小為100×100×3(圖像高度為100像素,寬度為100像素,以及3個(gè)RGB顏色通道)。如果使用前饋神經(jīng)網(wǎng)絡(luò),則第1個(gè)隱藏層的每個(gè)神經(jīng)元到輸入層有100×100×3=30000個(gè)互相獨(dú)立的連接,每個(gè)連接都對(duì)應(yīng)一個(gè)權(quán)重參數(shù)。隨著隱藏層神經(jīng)元數(shù)量的增多,參數(shù)的規(guī)模會(huì)急劇增加。這會(huì)導(dǎo)致整個(gè)網(wǎng)絡(luò)的訓(xùn)練非常困難,并且容易出現(xiàn)過擬合的情況。(2)局部不變性特征。自然圖像中的物體都具有局部不變性特征,如縮放、平移、旋轉(zhuǎn)等操作不影響其語義信息。而前饋神經(jīng)網(wǎng)絡(luò)很難提取這些局部不變性特征,一般需要進(jìn)行數(shù)據(jù)增強(qiáng)來提高性能。卷積神經(jīng)網(wǎng)絡(luò)卷積神經(jīng)網(wǎng)絡(luò)(ConvolutionalNeuralNetworks,CNN)一種前饋神經(jīng)網(wǎng)絡(luò)受生物學(xué)上感受野(ReceptiveField)的機(jī)制而提出的在視覺神經(jīng)系統(tǒng)中,一個(gè)神經(jīng)元的感受野是指視網(wǎng)膜上的特定區(qū)域,只有這個(gè)區(qū)域內(nèi)的刺激才能夠激活該神經(jīng)元。卷積神經(jīng)網(wǎng)絡(luò)有三個(gè)結(jié)構(gòu)上的特性:局部連接權(quán)重共享空間或時(shí)間上的次采樣卷積神經(jīng)網(wǎng)絡(luò)卷積運(yùn)算卷積經(jīng)常用在信號(hào)處理中,用于計(jì)算信號(hào)的延遲累積。假設(shè)一個(gè)信號(hào)發(fā)生器每個(gè)時(shí)刻t產(chǎn)生一個(gè)信號(hào)xt
,其信息的衰減率為wk
,即在k?1個(gè)時(shí)間步長(zhǎng)后,信息為原來的wk
倍假設(shè)w1=1,w2=1/2,w3=1/4時(shí)刻t收到的信號(hào)yt
為當(dāng)前時(shí)刻產(chǎn)生的信息和以前時(shí)刻延遲信息的疊加。卷積運(yùn)算卷積經(jīng)常用在信號(hào)處理中,用于計(jì)算信號(hào)的延遲累積。假設(shè)一個(gè)信號(hào)發(fā)生器每個(gè)時(shí)刻t產(chǎn)生一個(gè)信號(hào)xt
,其信息的衰減率為wk
,即在k?1個(gè)時(shí)間步長(zhǎng)后,信息為原來的wk
倍假設(shè)w1=1,w2=1/2,w3=1/4時(shí)刻t收到的信號(hào)yt
為當(dāng)前時(shí)刻產(chǎn)生的信息和以前時(shí)刻延遲信息的疊加濾波器(filter)或卷積核(convolutionkernel)卷積
卷積不同的濾波器來提取信號(hào)序列中的不同特征低頻信息高頻信息
二階微分卷積類型卷積的結(jié)果按輸出長(zhǎng)度不同可以分為三類:窄卷積:步長(zhǎng)??=1,兩端不補(bǔ)零??=0,卷積后輸出長(zhǎng)度為n
?k
+1寬卷積:步長(zhǎng)??=1,兩端補(bǔ)零??=k
?1,卷積后輸出長(zhǎng)度n
+k
?1等寬卷積:步長(zhǎng)??=1,兩端補(bǔ)零??=(k
?1)/2,卷積后輸出長(zhǎng)度n
二維卷積在圖像處理中,圖像是以二維矩陣的形式輸入到神經(jīng)網(wǎng)絡(luò)中,因此我們需要二維卷積。二維卷積在圖像處理中,圖像是以二維矩陣的形式輸入到神經(jīng)網(wǎng)絡(luò)中,因此我們需要二維卷積。二維卷積在圖像處理中,圖像是以二維矩陣的形式輸入到神經(jīng)網(wǎng)絡(luò)中,因此我們需要二維卷積。二維卷積步長(zhǎng)1,零填充0步長(zhǎng)2,零填充0步長(zhǎng)1,零填充1步長(zhǎng)2,零填充1卷積神經(jīng)網(wǎng)絡(luò)用卷積層代替全連接層卷積的變種分組卷積分組卷積(GroupConvolution):分組卷積首先將輸入特征映射為輸入特征圖進(jìn)行分組,然后每組分別卷積??斩矗〝U(kuò)張)卷積空洞卷積是針對(duì)圖像語義分割問題中下采樣會(huì)降低圖像分辨率、丟失信息而提出的一種卷積方法。示例多個(gè)卷積核
卷積層的映射關(guān)系步長(zhǎng)2
filter3*3
filter個(gè)數(shù)6零填充1卷積層典型的卷積層為3維結(jié)構(gòu)5.2卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)卷積神經(jīng)網(wǎng)絡(luò)(ConvolutionalNeuralNetwork,CNN)是一種具有局部連接、權(quán)重共享等特點(diǎn)的深層前饋神經(jīng)網(wǎng)絡(luò)(FeedforwardNeuralNetwork,F(xiàn)NN)。它是深度學(xué)習(xí)(DeepLearning)的代表算法之一。其擅長(zhǎng)處理圖像,特別是圖像識(shí)別等相關(guān)機(jī)器學(xué)習(xí)問題,在圖像分類、目標(biāo)檢測(cè)、圖像分割等各種視覺任務(wù)中都有顯著的效果。卷積神經(jīng)網(wǎng)絡(luò)是目前應(yīng)用最廣泛的模型之一。卷積網(wǎng)絡(luò)結(jié)構(gòu)卷積網(wǎng)絡(luò)是由卷積層、匯聚層、全連接層交叉堆疊而成。趨向于小卷積、大深度趨向于全卷積典型結(jié)構(gòu)一個(gè)卷積塊為連續(xù)M個(gè)卷積層和b個(gè)匯聚層(M通常設(shè)置為2~5,b為0或1)。一個(gè)卷積網(wǎng)絡(luò)中可以堆疊N個(gè)連續(xù)的卷積塊,然后在接著K個(gè)全連接層(N的取值區(qū)間比較大,比如1~100或者更大;K一般為0~2)。5.2.1輸入層輸入層(InputLayer)主要對(duì)原始數(shù)據(jù)進(jìn)行初步處理,使卷積神經(jīng)網(wǎng)絡(luò)能有更好的效果。有以下幾種處理方法?;叶然簣D像一般是通過一個(gè)三維矩陣存儲(chǔ)的,矩陣的大小為(width,height,3),width是圖像的寬度,height是圖像的高度,3表示紅(Red)、綠(Green)、藍(lán)(Blue)顏色通道。我們可以認(rèn)為任何圖像都是通過不同程度的紅色、綠色、藍(lán)色疊加形成的。由于RGB不能反映圖像的形狀特征,只是從光學(xué)的原理上進(jìn)行顏色的調(diào)配。而我們一般需要提取圖像的形狀特征,所以可以將三個(gè)通道的圖像變成一個(gè)通道,這個(gè)過程就是灰度化。5.2.1輸入層常用的灰度化方法如下。(1)分量法:將圖像R、G、B三個(gè)分量中的一個(gè)分量作為灰度圖像的灰度值。(2)最大值法:將圖像R、G、B三個(gè)分量中最大的分量作為灰度圖像的灰度值。(3)加權(quán)平均法:將圖像R、G、B三個(gè)分量以不同的權(quán)重進(jìn)行加權(quán)平均。在三種顏色中,人眼對(duì)綠色敏感度最高,對(duì)藍(lán)色敏感度最低,故采用心理學(xué)灰度公式:Gray=0.114B+0.587G+0.299R。歸一化:在神經(jīng)網(wǎng)絡(luò)中經(jīng)常會(huì)使用Sigmoid函數(shù)當(dāng)作激活函數(shù)。Sigmoid函數(shù)的函數(shù)值在[0,1]之間。當(dāng)輸入{20,30,40,50,60}等遠(yuǎn)大于1的數(shù)據(jù)時(shí),經(jīng)過Sigmoid函數(shù)的值將會(huì)非常接近,甚至相等。這樣就無法起到應(yīng)有的訓(xùn)練作用,將數(shù)據(jù)歸一化就可以較好地解決這個(gè)問題。而且歸一化可以使神經(jīng)網(wǎng)絡(luò)更快地收斂。5.2.2卷積層卷積層(ConvolutionalLayer)是卷積神經(jīng)網(wǎng)絡(luò)的核心。對(duì)卷積層的認(rèn)識(shí)有助于理解卷積神經(jīng)網(wǎng)絡(luò)。卷積層的作用是對(duì)輸入數(shù)據(jù)進(jìn)行卷積操作,也就是前面講到的卷積運(yùn)算。卷積層的作用也可以理解為過濾過程,一個(gè)卷積核就是一個(gè)過濾器,在網(wǎng)絡(luò)訓(xùn)練過程中,使用自定義大小的卷積核作為一個(gè)滑動(dòng)窗口對(duì)輸入數(shù)據(jù)進(jìn)行卷積。卷積神經(jīng)網(wǎng)絡(luò)中每個(gè)卷積層由若干個(gè)卷積單元組成,每個(gè)卷積單元的參數(shù)都是通過反向傳播算法優(yōu)化得到的。。5.2.2卷積層卷積層中的卷積運(yùn)算類似于加權(quán)求和的過程,將卷積核理解成權(quán)重矩陣,計(jì)算方式如圖5.2.2卷積層卷積層中的卷積運(yùn)算類似于加權(quán)求和的過程,將卷積核理解成權(quán)重矩陣,計(jì)算方式如圖步長(zhǎng)為1的前向傳播卷積過程5.2.3池化層池化層(PoolingLayer)是對(duì)輸入的數(shù)據(jù)進(jìn)行壓縮,提取主要特征的過程。一般,池化分為最大池化和平均池化。(1)最大池化(MaximumPooling或MaxPooling):5.2.3池化層池化層(PoolingLayer)是對(duì)輸入的數(shù)據(jù)進(jìn)行壓縮,提取主要特征的過程。一般,池化分為最大池化和平均池化。(2)平均池化(MeanPooling):5.3參數(shù)學(xué)習(xí)在卷積神經(jīng)網(wǎng)絡(luò)中,參數(shù)為卷積核及偏置。和全連接前饋神經(jīng)網(wǎng)絡(luò)類似,卷積神經(jīng)網(wǎng)絡(luò)可以通過誤差反向傳播算法來進(jìn)行參數(shù)學(xué)習(xí)。在全連接前饋神經(jīng)網(wǎng)絡(luò)中,梯度主要通過每一層的誤差項(xiàng)進(jìn)行反向傳播,并進(jìn)一步計(jì)算每層參數(shù)的梯度。在卷積神經(jīng)網(wǎng)絡(luò)中,主要有兩種不同功能的神經(jīng)層:卷積層和匯聚層,參數(shù)為卷積核及偏置,因此只需要計(jì)算卷積層中參數(shù)的梯度。5.4幾種典型的卷積神經(jīng)網(wǎng)絡(luò)5.4.1LeNet-5LeNet-5共有7層,接收輸入圖像的大小為32像素×32像素=1024像素,輸出對(duì)應(yīng)10個(gè)類別的得分。5.4幾種典型的卷積神經(jīng)網(wǎng)絡(luò)5.4.2AlexNetAlexNet是第一個(gè)現(xiàn)代深度卷積神經(jīng)網(wǎng)絡(luò)模型。其首次使用了很多現(xiàn)代深度卷積神經(jīng)網(wǎng)絡(luò)的技術(shù)和方法,如使用GPU進(jìn)行并行訓(xùn)練,采用ReLU函數(shù)作為非線性激活函數(shù),使用Dropout方法防止過擬合,使用數(shù)據(jù)增強(qiáng)技術(shù)來提高模型準(zhǔn)確率等。AlexNet贏得了2012年ImageNet圖像分類競(jìng)賽的冠軍。5.4幾種典型的卷積神經(jīng)網(wǎng)絡(luò)5.4.3VGG網(wǎng)絡(luò)Simonyan等人在AlexNet的基礎(chǔ)上,針對(duì)卷積神經(jīng)網(wǎng)絡(luò)的深度進(jìn)行了研究,提出了VGG網(wǎng)絡(luò)。5.4幾種典型的卷積神經(jīng)網(wǎng)絡(luò)5.4.4ResNet針對(duì)深度網(wǎng)絡(luò)的退化問題,He等人分析認(rèn)為:如果網(wǎng)絡(luò)中增加的每一個(gè)層次都能夠得到完善的訓(xùn)練,那么訓(xùn)練誤差是不應(yīng)該會(huì)在網(wǎng)絡(luò)深度增大的情況下提高的。5.4幾種典型的卷積神經(jīng)網(wǎng)絡(luò)5.4.5Inception網(wǎng)絡(luò)在卷積神經(jīng)網(wǎng)絡(luò)深度的研究以外,Szegedy等人關(guān)注通過優(yōu)化網(wǎng)絡(luò)結(jié)構(gòu)從而降低網(wǎng)絡(luò)的復(fù)雜程度。他們提出了一種卷積神經(jīng)網(wǎng)絡(luò)的基本模塊,稱為Inception。在Inception網(wǎng)絡(luò)中,一個(gè)卷積層包含多個(gè)不同大小的卷積核。5.5應(yīng)用實(shí)例:基于卷積神經(jīng)網(wǎng)絡(luò)的人臉識(shí)別1.具體目標(biāo)通過計(jì)算機(jī)的本地?cái)z像頭,拍攝實(shí)時(shí)人臉照片(圖片),與訓(xùn)練好的卷積神經(jīng)網(wǎng)絡(luò)模型中存儲(chǔ)的人臉信息進(jìn)行比對(duì),同時(shí)在桌面上顯示識(shí)別出的人臉標(biāo)記值。2.環(huán)境搭建Python3.5TensorFlowcpu1.11.0OpenCV3.4.3Keras2.2.4NumPy1.14.6具體安裝過程及環(huán)境搭建步驟省略。5.5應(yīng)用實(shí)例:基于卷積神經(jīng)網(wǎng)絡(luò)的人臉識(shí)別3.實(shí)現(xiàn)步驟人臉識(shí)別實(shí)現(xiàn)步驟如圖5-21所示。5.5.1人臉數(shù)據(jù)采集首先通過OpenCV打開攝像頭,獲取實(shí)時(shí)視頻流,然后通過OpenCV自帶的人臉分類器Haar來識(shí)別并標(biāo)記出人臉區(qū)域,將當(dāng)前幀保存為圖片并存儲(chǔ)到指定的文件夾下面。相關(guān)代碼如下。1.#catchpicture.py
2.import
cv2
3.cap=cv2.VideoCapture(0)
4.num=0
5.while
cap.isOpened():
6.
ret,frame=cap.read()
#讀取一幀數(shù)據(jù)
7.
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#將圖片轉(zhuǎn)化成灰度圖片
8.
face_cascade=cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
9.
face_cascade.load('F:\python35\haarcascade_frontalface_alt2.xml')#一定要告訴編譯器文件所在的具體位置
5.5.1人臉數(shù)據(jù)采集10.
'''''此文件是OpenCV的haar人臉特征分類器'''
11.
faces=face_cascade.detectMultiScale(gray,1.3,5)
12.
if
len(faces)
>
0:
13.
for
(x,y,w,h)
in
faces:
14.
#將當(dāng)前幀保存為圖片
15.
img_name='%s/%d.jpg'%("F:\data\me",num)
16.
image=frame[y
-
10:
y
+
h
+
10,x
-
10:
x
+
w
+
10]
17.
cv2.imwrite(img_name,image)
18.
num
+=
1
19.
if
num
>
1000:
#如果超過指定最大存儲(chǔ)數(shù)量,則退出循環(huán)
20.
break
21.
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
22.
#顯示當(dāng)前捕捉到了多少人臉圖片
23.
font=cv2.FONT_HERSHEY_SIMPLEX
24.
cv2.putText(frame,'num:%d'%(num),(x
+
30,y
+
30),font,1,(255,0,255),4)
25.
#超過指定最大存儲(chǔ)數(shù)量,結(jié)束程序
26.
if
num
>
1000
:break
27.
#顯示圖片并等待10ms按鍵輸入,輸入“q”退出程序
5.5.1人臉數(shù)據(jù)采集28.
cv2.imshow("capture",frame)
29.
if
cv2.waitKey(10)
&
0xFF
==
ord('q'):
30.
break
31.
#釋放攝像頭并銷毀所有窗口
32.cap.release()
33.cv2.destroyAllWindows()
5.5.2圖片預(yù)處理采集的圖片樣本形狀可能存在不規(guī)則大小,需要對(duì)圖片做尺寸變換。人臉圖片集中的每一張圖片大小都不一樣,為了后續(xù)操作的方便,需要將捕獲到的人臉圖片壓縮為64像素×64像素的并進(jìn)行灰度化處理。所以,圖片預(yù)處理一共分為兩步,第1步定義了一個(gè)resize_image()函數(shù),其作用是將圖片補(bǔ)成正方形之后壓縮成64像素×64像素的,第2步利用OpenCV自帶的cvtColor()函數(shù)將圖片灰度化。代碼如下。
5.5.2圖片預(yù)處理1.#picturepraction.py
2.import
os
3.import
cv2
4.IMAGE_SIZE=64
5.def
resize_image(image,height=IMAGE_SIZE,width=IMAGE_SIZE):
6.
top,bottom,left,right=(0,0,0,0)
7.
h,w,_=image.shape
8.
longest_edge=max(h,w)
9.
if
h
<
longest_edge:
10.
dh=longest_edge
-
h
11.
top=dh
//
2
12.
bottom=dh
-
top
13.
elif
w
<
longest_edge:
14.
dw=longest_edge
-
w
15.
left=dw
//
2
16.
righ=dw
-
left
17.
else:
18.
pass
19.
BLACK=[0,0,0]
5.5.2圖片預(yù)處理20.
constant=cv2.copyMakeBorder(image,top,bottom,left,right,cv2.BORDER_CONSTANT,value=BLACK)
21.
return
cv2.resize(constant,(height,width))
22.if
__name__
==
'__main__':
23.
path_name="F:\data\me"
24.
i=0
25.
for
dir_item
in
os.listdir(path_name):
26.
full_path=os.path.abspath(os.path.join(path_name,dir_item))
27.
i
+=
1
28.
image=cv2.imread(full_path)
#讀取圖片29.
image=resize_image(image)
#將圖片轉(zhuǎn)為64像素×64像素
30.
image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
#將圖片轉(zhuǎn)為灰度圖片
31.
cv2.imwrite(full_path,image)
5.5.3加載圖片將圖片預(yù)處理之后的圖片集以多維數(shù)組的形式加載到內(nèi)存中,并且為每一類樣本數(shù)據(jù)標(biāo)記標(biāo)記值。代碼如下。1.#loaddata.py
2.import
os
3.import
sys
4.import
numpy
as
np
5.import
cv2
6.#讀取圖片數(shù)據(jù)并與標(biāo)記值綁定
7.def
read_path(images,labels,path_name,label):
8.
for
dir_item
in
os.listdir(path_name):
9.
full_path=os.path.abspath(os.path.join(path_name,dir_item))
10.
image=cv2.imread(full_path)
11.
images.append(image)
12.
labels.append(label)
5.5.3加載圖片將圖片預(yù)處理之后的圖片集以多維數(shù)組的形式加載到內(nèi)存中,并且為每一類樣本數(shù)據(jù)標(biāo)記標(biāo)記值。代碼如下。13.
14.def
loaddata(parent_dir):
15.
images=[]
16.
labels=[]
17.
read_path(images,labels,parent_dir+"me",0)
18.
read_path(images,labels,parent_dir+"chen",1)
19.
read_path(images,labels,parent_dir+"jia",2)
20.
read_path(images,labels,parent_dir+"other",3)
21.
images=np.array(images)
22.
labels=np.array(labels)
23.
return
images,labels
24.if
__name__
==
'__main__':
25.
images,labels=loaddata("F:/example/")
5.5.4模型搭建搭建卷積神經(jīng)網(wǎng)絡(luò)前,需要先完成6個(gè)步驟:第1步,需要把數(shù)據(jù)加載到內(nèi)存中,即將圖片預(yù)處理之后的圖片集以多維數(shù)組的形式加載到內(nèi)存中,并且為每一類樣本數(shù)據(jù)標(biāo)記標(biāo)記值;第2步,劃分?jǐn)?shù)據(jù)集,即按照交叉驗(yàn)證原則劃分?jǐn)?shù)據(jù)集。交叉驗(yàn)證是機(jī)器學(xué)習(xí)中的一種常用來測(cè)試精度的方法,拿出大部分?jǐn)?shù)據(jù)用來訓(xùn)練模型,少部分?jǐn)?shù)據(jù)用來驗(yàn)證模型,將驗(yàn)證結(jié)果與真實(shí)結(jié)果計(jì)算出平方差,以上工作重復(fù)進(jìn)行,直至平方差為0,模型訓(xùn)練完畢,可以交付使用。5.5.4模型搭建搭建卷積神經(jīng)網(wǎng)絡(luò)前,需要先完成6個(gè)步驟:第3步,改變圖片的維度,此處用到了Keras庫,這個(gè)庫是建立在TensorFlow或者Theano基礎(chǔ)上的,所以Keras庫的后端系統(tǒng)可以是TensorFlow,也可以是Theano。但是TensorFlow和Theano定義的圖片數(shù)據(jù)輸入CNN的維度順序是不一樣的,TensorFlow的維度順序?yàn)樾袛?shù)、列數(shù)、通道數(shù),Theano則是通道數(shù)、行數(shù)、列數(shù)。所以需要調(diào)用image_dim_ordering()函數(shù)來確定后端系統(tǒng)的類型(用“th”來代表Theano,用“tf”來代表TensorFlow),最后用NumPy庫提供的reshape()函數(shù)來調(diào)整維度;第4步,進(jìn)行One-Hot編碼,因?yàn)楸灸P筒捎昧薱ategorical_crossentropy函數(shù)作為損失函數(shù),而這個(gè)函數(shù)要求標(biāo)記集必須采用One-Hot編碼;第5步,歸一化圖片數(shù)據(jù),即先讓數(shù)據(jù)集浮點(diǎn)化,再歸一化,目的是提升網(wǎng)絡(luò)收斂速度,縮短模型的訓(xùn)練時(shí)間,同時(shí)適應(yīng)值域在(0,1)之間的激活函數(shù),增大區(qū)分度。第6步,確定優(yōu)化器5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖卷積神經(jīng)網(wǎng)絡(luò)模型一共13層:3個(gè)卷積層、2個(gè)池化層、4個(gè)Dropout層、1個(gè)Flatten層、2個(gè)全連接層和1個(gè)分類層,其結(jié)構(gòu)如圖5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖相關(guān)代碼如下。1.#face_CNN_keras.py
2.import
random
3.
4.import
numpy
as
np
5.from
sklearn.model_selection
import
train_test_split
6.from
keras.preprocessing.image
import
ImageDataGenerator
7.from
keras.models
import
Sequential
8.from
keras.layers
import
Dense,Dropout,Activation,Flatten
9.from
keras.layers
import
Convolution2D,MaxPooling2D
10.from
keras.optimizers
import
SGD
11.from
keras.utils
import
np_utils
12.from
keras.models
import
load_model
13.from
keras
import
backend
as
K
14.#Adam優(yōu)化器
15.from
keras.optimizers
import
Adam
5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖相關(guān)代碼如下。16.
17.from
loaddata
import
loaddata
18.from
picturepraction
import
resize_image,IMAGE_SIZE
19.
20.class
Dataset:
21.
def
__int__(self):
22.
23.
#
訓(xùn)練數(shù)據(jù)
24.
self.train_images=None
25.
self.train_labels=None
26.
27.
#
驗(yàn)證數(shù)據(jù)
5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖相關(guān)代碼如下。28.
self.valid_images=None
29.
self.valid_labels=None
30.
31.
#
測(cè)試數(shù)據(jù)
32.
self.test_images=None
33.
self.test_labels=None
34.
35.
#
當(dāng)前庫采用的維度順序
36.
self.input_shape=None
37.
38.
#
加載數(shù)據(jù)并預(yù)處理39.
def
load(self,img_rows=IMAGE_SIZE,img_cols=IMAGE_SIZE,img_channels=3,nb_classes=4):40.
images,labels=loaddata("F:/example/")
5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖相關(guān)代碼如下。41.
42.
#
隨機(jī)劃分訓(xùn)練集、驗(yàn)證集(利用交叉驗(yàn)證原則)
43.
train_images,valid_images,train_labels,valid_labels=train_test_split(images,labels,test_size=0.3,random_state=random.randint(0,100))
44.
#
劃分測(cè)試集
45.
_,test_images,_,test_labels=train_test_split(images,labels,test_size=0.5,
46.
random_state=random.randint(0,100))
47.
48.
#
判斷后端系統(tǒng)類型來調(diào)整數(shù)組維度順序49.
if
(K.image_dim_ordering()
==
'th'):#如果后端系統(tǒng)是Theano,則維度順序?yàn)橥ǖ罃?shù)、行數(shù)、列數(shù)50.
train_images=train_images.reshape(train_images.shape[0],img_channels,img_rows,img_cols)51.
valid_images=valid_images.reshape(valid_images.shape[0],img_channels,img_rows,img_cols)52.
test_images=test_images.reshape(test_images.shape[0],img_channels,img_rows,img_cols)
53.
self.input_shape=(img_channels,img_rows,img_cols)
54.
else:
5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖相關(guān)代碼如下。55.#如果后端系統(tǒng)是TensorFlow,則維度順序?yàn)樾袛?shù)、列數(shù)、通道數(shù)
56.
train_images=train_images.reshape(train_images.shape[0],img_rows,img_cols,img_channels)57.
valid_images=valid_images.reshape(valid_images.shape[0],img_rows,img_cols,img_channels)58.
test_images=test_images.reshape(test_images.shape[0],img_rows,img_cols,img_channels)
59.
self.input_shape=(img_rows,img_cols,img_channels)
60.
61.
#
輸出訓(xùn)練集、驗(yàn)證集、測(cè)試集的數(shù)量
62.
print(train_images.shape[0],'train
samples')
63.
print(valid_images.shape[0],'valid_samples')
64.
print(test_images.shape[0],'test_samples')
65.
66.
#模型使用categorical_crossentropy函數(shù)作為損失函數(shù)
67.
#因此需要根據(jù)圖片集數(shù)量將圖片集標(biāo)記進(jìn)行One-Hot編碼使其向量化
68.
train_labels=np_utils.to_categorical(train_labels,nb_classes)
5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖相關(guān)代碼如下。69.
valid_labels=np_utils.to_categorical(valid_labels,nb_classes)
70.
test_labels=np_utils.to_categorical(test_labels,nb_classes)
71.
72.
#像素?cái)?shù)據(jù)浮點(diǎn)化和歸一化
73.
train_images=train_images.astype('float32')
74.
valid_images=valid_images.astype('float32')
75.
test_images=test_images.astype('float32')
76.
train_images
/=
255
77.
valid_images
/=
255
78.
test_images
/=
255
5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖相關(guān)代碼如下。79.
80.
self.train_images=train_images
81.
self.valid_images=valid_images
82.
self.test_images=test_images
83.
self.train_labels=train_labels
84.
self.valid_labels=valid_labels
85.
self.test_labels=test_labels
86.
87.class
Model:
88.
def
__init__(self):
89.
self.model=None
90.
91.
def
build_model(self,dataset,nb_classes=4):
92.
self.model=Sequential()
5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖相關(guān)代碼如下。93.
94.
#第1個(gè)卷積層
95.
#保留邊界像素
96.
self.model.add(Convolution2D(32,3,3,border_mode='same',input_shape=dataset.input_shape,activation='relu'))#卷積層和激活函數(shù)
97.
##輸出(32,64,64)
98.
99.#池化層
100.self.model.add(MaxPooling2D(pool_size=(2,2)))
101.
#輸出(32,32,32)
102.
self.model.add(Dropout(0.5))
103.
104.
#第2個(gè)卷積層
105.
#保留邊界像素
106.
self.model.add(Convolution2D(32,3,3,border_mode='same',activation='relu'))#卷積層和激活函數(shù)
107.
##輸出(32,32,32)
108.
109.
self.model.add(Dropout(0.5))
110.
5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖相關(guān)代碼如下。111.
#第3個(gè)卷積層
112.
self.model.add(Convolution2D(64,3,3,border_mode='same',activation='relu'))
113.
#輸出(64,32,32)
114.
115.
self.model.add(MaxPooling2D(pool_size=(2,2)))
116.
#輸出(64,16,16)
117.
118.
self.model.add(Dropout(0.5))
119.
120.
self.model.add(Flatten())
#數(shù)據(jù)從二維轉(zhuǎn)為一維
121.
#輸出大小為64×16×16=
16384
122.
123.
#二層全連接神經(jīng)網(wǎng)絡(luò)124.
self.model.add(Dense(512))
125.
self.model.add(Activation('relu'))
126.
self.model.add(Dropout(0.5))
127.
self.model.add(Dense(nb_classes))
128.
129.
self.model.add(Activation('softmax'))
130.
self.model.summary()
5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖相關(guān)代碼如下。31.
132.
def
train(self,dataset,batch_size=20,nb_epoch=10,data_augmentation=True):
133.
#sgd=SGD(lr=0.01,decay=1e-6,momentum=0.9,nesterov=True)
134.
135.
#pile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])
136.
#Adam優(yōu)化器
137.
adam=Adam(lr=0.001,beta_1=0.9,beta_2=0.999,epsilon=1e-8)
138.
pile(loss='categorical_crossentropy',optimizer=adam,metrics=['accuracy'])
139.
140.
self.model.fit(dataset.train_images,dataset.train_labels,batch_size=batch_size,nb_epoch=nb_epoch
141.
,validation_data=(dataset.valid_images,dataset.valid_labels),shuffle=True)
142.
143.
MODEL_PATH='F:/example/number3.h5'
5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖相關(guān)代碼如下。144.
145.
146.
def
save_model(self,file_path=MODEL_PATH):
147.
self.model.save(file_path)
148.
149.
def
load_model(self,file_path=MODEL_PATH):
150.
self.model=load_model(file_path)
151.
152.
def
evaluate(self,dataset):
153.
score=self.model.evaluate(dataset.test_images,dataset.test_labels,verbose=1)
5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖相關(guān)代碼如下。154.
print("%s:
%.2f%%"
%
(self.model.metrics_names[1],score[1]
*
100))
155.
156.
def
face_predict(self,image):
157.
if
K.image_dim_ordering()
==
'th'
and
image.shape
!=
(1,3,IMAGE_SIZE,IMAGE_SIZE):
158.
image=resize_image(image)
159.
image=image.reshape((1,3,IMAGE_SIZE,IMAGE_SIZE))
160.
elif
K.image_dim_ordering()
==
'tf'
and
image.shape
!=
(1,IMAGE_SIZE,IMAGE_SIZE,3):161.
image=resize_image(image)
162.
image=image.reshape((1,IMAGE_SIZE,IMAGE_SIZE,3))
163.
164.
image=image.astype('float32')
165.
image
/=
255
5.5.4卷積神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖相關(guān)代碼如下。166.
167.
result=self.model.predict_proba(image)
168.
169.
result=self.model.predict_classes(image)
170.
171.
return
result[0]
172.
173.if
__name__
==
'__main__':
174.
dataset=Dataset()
175.
dataset.load()
176.
model=Model()
177.
model.build_model(dataset)
178.
model.train(dataset)
179.
model.save_model(file_path="F:/example/number3.h5")
5.5.5識(shí)別與驗(yàn)證相關(guān)代碼如下。1.#faceclassify.py
2.import
cv2
3.import
sys
4.import
gc
5.from
face_CNN_keras
import
Model
6.import
tensorflow
as
tf
7.if
__name__
==
'__main__':
8.
model=Model()#加載模型
9.
model.load_model(file_path='F:/example/number1.h5')
10.
color=(0,255,255)#框住人臉的矩形邊框顏色
11.
cap=cv2.VideoCapture(0)#捕獲指定攝像頭的實(shí)時(shí)視頻流
12.
cascade_path="F:\python35\haarcascade_frontalface_alt2.xml"#人臉識(shí)別分類器本地存儲(chǔ)路徑
5.5.5識(shí)別與驗(yàn)證相關(guān)代碼如下。13.
#循環(huán)檢測(cè)識(shí)別人臉
14.
while
cap.isOpened():
15.
ret,frame=cap.read()
#讀取一幀視頻
16.
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#圖片灰度化,降低計(jì)算復(fù)雜度
17.
cascade=cv2.CascadeClassifier(cascade_path)#使用人臉識(shí)別分類器,讀入分類器
18.
faceRects=cascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(16,16))#利用分類器識(shí)別出哪個(gè)區(qū)域?yàn)槿四?/p>
19.
if
len(faceRects)
>
0:
20.
for
faceRect
in
faceRects:
21.
x,y,w,h=faceRect
22.
#截取臉部圖片提交給模型識(shí)別這是誰
23.
image=frame[y
-
10:
y
+
h
+
10,x
-
10:
x
+
w
+
10]
24.
cv2.rectangle(frame,(x
-
10,y
-
10),(x
+
w
+
10,y
+
h
+
10),color,thickness=2)
25.
faceID=model.face_predict(image)
26.
#如果是“我”27.
if
faceID
==
0:
28.
cv2.putText(frame,"zhuang",(x+30,y+30),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,
255),2)#在顯示界面輸出
5.5.5識(shí)別與驗(yàn)證相關(guān)代碼如下。29.
print("zhuang")#在控制臺(tái)輸出
30.
elif
faceID
==
1:
31.
cv2.putText(frame,"chen",(x+30,y+30),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,
255),2)#在顯示界面輸出
32.
print("chen")#在控制臺(tái)輸出
33.
elif
faceID
==
2:
34.
cv2.putText(frame,"jia",(x+
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024運(yùn)輸合同書格式正規(guī)范本
- 2025年度智慧社區(qū)物業(yè)管理系統(tǒng)承包合同范本4篇
- 2024食品行業(yè)供應(yīng)鏈管理供貨合同范本3篇
- 2025年度住宅小區(qū)車輛收費(fèi)員雇傭合同材料3篇
- 2024銀杏樹苗圃基地設(shè)施租賃與苗木采購合同3篇
- 2025年度智能化場(chǎng)消防系統(tǒng)升級(jí)改造維修工程合同4篇
- 2025年度新型智能車位買賣合同規(guī)范4篇
- 2025年度新能源汽車生產(chǎn)車間承包合作框架協(xié)議4篇
- 2025年度數(shù)據(jù)中心機(jī)房租賃及維護(hù)服務(wù)合同4篇
- 2025年度水庫環(huán)境保護(hù)與承包服務(wù)協(xié)議4篇
- 2025年度土地經(jīng)營(yíng)權(quán)流轉(zhuǎn)合同補(bǔ)充條款范本
- 南通市2025屆高三第一次調(diào)研測(cè)試(一模)地理試卷(含答案 )
- 2025年上海市閔行區(qū)中考數(shù)學(xué)一模試卷
- 2025中國(guó)人民保險(xiǎn)集團(tuán)校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 0的認(rèn)識(shí)和加、減法(說課稿)-2024-2025學(xué)年一年級(jí)上冊(cè)數(shù)學(xué)人教版(2024)001
- 重癥患者家屬溝通管理制度
- 醫(yī)院安全生產(chǎn)治本攻堅(jiān)三年行動(dòng)實(shí)施方案
- 法規(guī)解讀丨2024新版《突發(fā)事件應(yīng)對(duì)法》及其應(yīng)用案例
- 工程項(xiàng)目合作備忘錄范本
- 信息安全意識(shí)培訓(xùn)課件
- Python試題庫(附參考答案)
評(píng)論
0/150
提交評(píng)論