Python機(jī)器學(xué)習(xí)與項(xiàng)目實(shí)踐- 課件 chap5-卷積神經(jīng)網(wǎng)絡(luò)_第1頁
Python機(jī)器學(xué)習(xí)與項(xiàng)目實(shí)踐- 課件 chap5-卷積神經(jīng)網(wǎng)絡(luò)_第2頁
Python機(jī)器學(xué)習(xí)與項(xiàng)目實(shí)踐- 課件 chap5-卷積神經(jīng)網(wǎng)絡(luò)_第3頁
Python機(jī)器學(xué)習(xí)與項(xiàng)目實(shí)踐- 課件 chap5-卷積神經(jīng)網(wǎng)絡(luò)_第4頁
Python機(jī)器學(xué)習(xí)與項(xiàng)目實(shí)踐- 課件 chap5-卷積神經(jīng)網(wǎng)絡(luò)_第5頁
已閱讀5頁,還剩84頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論