Python機器學習與項目實踐- 課件 chap5-卷積神經網絡_第1頁
Python機器學習與項目實踐- 課件 chap5-卷積神經網絡_第2頁
Python機器學習與項目實踐- 課件 chap5-卷積神經網絡_第3頁
Python機器學習與項目實踐- 課件 chap5-卷積神經網絡_第4頁
Python機器學習與項目實踐- 課件 chap5-卷積神經網絡_第5頁
已閱讀5頁,還剩84頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

卷積神經網絡《神經網絡與深度學習》XXX大學全連接前饋神經網絡權重矩陣的參數非常多局部不變性特征自然圖像中的物體都具有局部不變性特征尺度縮放、平移、旋轉等操作不影響其語義信息。全連接前饋網絡很難提取這些局部不變特征全連接前饋神經網絡前饋神經網絡處理圖像信息時存在的下列問題。(1)參數多。假設輸入圖像的大小為100×100×3(圖像高度為100像素,寬度為100像素,以及3個RGB顏色通道)。如果使用前饋神經網絡,則第1個隱藏層的每個神經元到輸入層有100×100×3=30000個互相獨立的連接,每個連接都對應一個權重參數。隨著隱藏層神經元數量的增多,參數的規模會急劇增加。這會導致整個網絡的訓練非常困難,并且容易出現過擬合的情況。(2)局部不變性特征。自然圖像中的物體都具有局部不變性特征,如縮放、平移、旋轉等操作不影響其語義信息。而前饋神經網絡很難提取這些局部不變性特征,一般需要進行數據增強來提高性能。卷積神經網絡卷積神經網絡(ConvolutionalNeuralNetworks,CNN)一種前饋神經網絡受生物學上感受野(ReceptiveField)的機制而提出的在視覺神經系統中,一個神經元的感受野是指視網膜上的特定區域,只有這個區域內的刺激才能夠激活該神經元。卷積神經網絡有三個結構上的特性:局部連接權重共享空間或時間上的次采樣卷積神經網絡卷積運算卷積經常用在信號處理中,用于計算信號的延遲累積。假設一個信號發生器每個時刻t產生一個信號xt

,其信息的衰減率為wk

,即在k?1個時間步長后,信息為原來的wk

倍假設w1=1,w2=1/2,w3=1/4時刻t收到的信號yt

為當前時刻產生的信息和以前時刻延遲信息的疊加。卷積運算卷積經常用在信號處理中,用于計算信號的延遲累積。假設一個信號發生器每個時刻t產生一個信號xt

,其信息的衰減率為wk

,即在k?1個時間步長后,信息為原來的wk

倍假設w1=1,w2=1/2,w3=1/4時刻t收到的信號yt

為當前時刻產生的信息和以前時刻延遲信息的疊加濾波器(filter)或卷積核(convolutionkernel)卷積

卷積不同的濾波器來提取信號序列中的不同特征低頻信息高頻信息

二階微分卷積類型卷積的結果按輸出長度不同可以分為三類:窄卷積:步長??=1,兩端不補零??=0,卷積后輸出長度為n

?k

+1寬卷積:步長??=1,兩端補零??=k

?1,卷積后輸出長度n

+k

?1等寬卷積:步長??=1,兩端補零??=(k

?1)/2,卷積后輸出長度n

二維卷積在圖像處理中,圖像是以二維矩陣的形式輸入到神經網絡中,因此我們需要二維卷積。二維卷積在圖像處理中,圖像是以二維矩陣的形式輸入到神經網絡中,因此我們需要二維卷積。二維卷積在圖像處理中,圖像是以二維矩陣的形式輸入到神經網絡中,因此我們需要二維卷積。二維卷積步長1,零填充0步長2,零填充0步長1,零填充1步長2,零填充1卷積神經網絡用卷積層代替全連接層卷積的變種分組卷積分組卷積(GroupConvolution):分組卷積首先將輸入特征映射為輸入特征圖進行分組,然后每組分別卷積。空洞(擴張)卷積空洞卷積是針對圖像語義分割問題中下采樣會降低圖像分辨率、丟失信息而提出的一種卷積方法。示例多個卷積核

卷積層的映射關系步長2

filter3*3

filter個數6零填充1卷積層典型的卷積層為3維結構5.2卷積神經網絡結構卷積神經網絡(ConvolutionalNeuralNetwork,CNN)是一種具有局部連接、權重共享等特點的深層前饋神經網絡(FeedforwardNeuralNetwork,FNN)。它是深度學習(DeepLearning)的代表算法之一。其擅長處理圖像,特別是圖像識別等相關機器學習問題,在圖像分類、目標檢測、圖像分割等各種視覺任務中都有顯著的效果。卷積神經網絡是目前應用最廣泛的模型之一。卷積網絡結構卷積網絡是由卷積層、匯聚層、全連接層交叉堆疊而成。趨向于小卷積、大深度趨向于全卷積典型結構一個卷積塊為連續M個卷積層和b個匯聚層(M通常設置為2~5,b為0或1)。一個卷積網絡中可以堆疊N個連續的卷積塊,然后在接著K個全連接層(N的取值區間比較大,比如1~100或者更大;K一般為0~2)。5.2.1輸入層輸入層(InputLayer)主要對原始數據進行初步處理,使卷積神經網絡能有更好的效果。有以下幾種處理方法。灰度化:圖像一般是通過一個三維矩陣存儲的,矩陣的大小為(width,height,3),width是圖像的寬度,height是圖像的高度,3表示紅(Red)、綠(Green)、藍(Blue)顏色通道。我們可以認為任何圖像都是通過不同程度的紅色、綠色、藍色疊加形成的。由于RGB不能反映圖像的形狀特征,只是從光學的原理上進行顏色的調配。而我們一般需要提取圖像的形狀特征,所以可以將三個通道的圖像變成一個通道,這個過程就是灰度化。5.2.1輸入層常用的灰度化方法如下。(1)分量法:將圖像R、G、B三個分量中的一個分量作為灰度圖像的灰度值。(2)最大值法:將圖像R、G、B三個分量中最大的分量作為灰度圖像的灰度值。(3)加權平均法:將圖像R、G、B三個分量以不同的權重進行加權平均。在三種顏色中,人眼對綠色敏感度最高,對藍色敏感度最低,故采用心理學灰度公式:Gray=0.114B+0.587G+0.299R。歸一化:在神經網絡中經常會使用Sigmoid函數當作激活函數。Sigmoid函數的函數值在[0,1]之間。當輸入{20,30,40,50,60}等遠大于1的數據時,經過Sigmoid函數的值將會非常接近,甚至相等。這樣就無法起到應有的訓練作用,將數據歸一化就可以較好地解決這個問題。而且歸一化可以使神經網絡更快地收斂。5.2.2卷積層卷積層(ConvolutionalLayer)是卷積神經網絡的核心。對卷積層的認識有助于理解卷積神經網絡。卷積層的作用是對輸入數據進行卷積操作,也就是前面講到的卷積運算。卷積層的作用也可以理解為過濾過程,一個卷積核就是一個過濾器,在網絡訓練過程中,使用自定義大小的卷積核作為一個滑動窗口對輸入數據進行卷積。卷積神經網絡中每個卷積層由若干個卷積單元組成,每個卷積單元的參數都是通過反向傳播算法優化得到的。。5.2.2卷積層卷積層中的卷積運算類似于加權求和的過程,將卷積核理解成權重矩陣,計算方式如圖5.2.2卷積層卷積層中的卷積運算類似于加權求和的過程,將卷積核理解成權重矩陣,計算方式如圖步長為1的前向傳播卷積過程5.2.3池化層池化層(PoolingLayer)是對輸入的數據進行壓縮,提取主要特征的過程。一般,池化分為最大池化和平均池化。(1)最大池化(MaximumPooling或MaxPooling):5.2.3池化層池化層(PoolingLayer)是對輸入的數據進行壓縮,提取主要特征的過程。一般,池化分為最大池化和平均池化。(2)平均池化(MeanPooling):5.3參數學習在卷積神經網絡中,參數為卷積核及偏置。和全連接前饋神經網絡類似,卷積神經網絡可以通過誤差反向傳播算法來進行參數學習。在全連接前饋神經網絡中,梯度主要通過每一層的誤差項進行反向傳播,并進一步計算每層參數的梯度。在卷積神經網絡中,主要有兩種不同功能的神經層:卷積層和匯聚層,參數為卷積核及偏置,因此只需要計算卷積層中參數的梯度。5.4幾種典型的卷積神經網絡5.4.1LeNet-5LeNet-5共有7層,接收輸入圖像的大小為32像素×32像素=1024像素,輸出對應10個類別的得分。5.4幾種典型的卷積神經網絡5.4.2AlexNetAlexNet是第一個現代深度卷積神經網絡模型。其首次使用了很多現代深度卷積神經網絡的技術和方法,如使用GPU進行并行訓練,采用ReLU函數作為非線性激活函數,使用Dropout方法防止過擬合,使用數據增強技術來提高模型準確率等。AlexNet贏得了2012年ImageNet圖像分類競賽的冠軍。5.4幾種典型的卷積神經網絡5.4.3VGG網絡Simonyan等人在AlexNet的基礎上,針對卷積神經網絡的深度進行了研究,提出了VGG網絡。5.4幾種典型的卷積神經網絡5.4.4ResNet針對深度網絡的退化問題,He等人分析認為:如果網絡中增加的每一個層次都能夠得到完善的訓練,那么訓練誤差是不應該會在網絡深度增大的情況下提高的。5.4幾種典型的卷積神經網絡5.4.5Inception網絡在卷積神經網絡深度的研究以外,Szegedy等人關注通過優化網絡結構從而降低網絡的復雜程度。他們提出了一種卷積神經網絡的基本模塊,稱為Inception。在Inception網絡中,一個卷積層包含多個不同大小的卷積核。5.5應用實例:基于卷積神經網絡的人臉識別1.具體目標通過計算機的本地攝像頭,拍攝實時人臉照片(圖片),與訓練好的卷積神經網絡模型中存儲的人臉信息進行比對,同時在桌面上顯示識別出的人臉標記值。2.環境搭建Python3.5TensorFlowcpu1.11.0OpenCV3.4.3Keras2.2.4NumPy1.14.6具體安裝過程及環境搭建步驟省略。5.5應用實例:基于卷積神經網絡的人臉識別3.實現步驟人臉識別實現步驟如圖5-21所示。5.5.1人臉數據采集首先通過OpenCV打開攝像頭,獲取實時視頻流,然后通過OpenCV自帶的人臉分類器Haar來識別并標記出人臉區域,將當前幀保存為圖片并存儲到指定的文件夾下面。相關代碼如下。1.#catchpicture.py

2.import

cv2

3.cap=cv2.VideoCapture(0)

4.num=0

5.while

cap.isOpened():

6.

ret,frame=cap.read()

#讀取一幀數據

7.

gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#將圖片轉化成灰度圖片

8.

face_cascade=cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")

9.

face_cascade.load('F:\python35\haarcascade_frontalface_alt2.xml')#一定要告訴編譯器文件所在的具體位置

5.5.1人臉數據采集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.

#將當前幀保存為圖片

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:

#如果超過指定最大存儲數量,則退出循環

20.

break

21.

cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)

22.

#顯示當前捕捉到了多少人臉圖片

23.

font=cv2.FONT_HERSHEY_SIMPLEX

24.

cv2.putText(frame,'num:%d'%(num),(x

+

30,y

+

30),font,1,(255,0,255),4)

25.

#超過指定最大存儲數量,結束程序

26.

if

num

>

1000

:break

27.

#顯示圖片并等待10ms按鍵輸入,輸入“q”退出程序

5.5.1人臉數據采集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圖片預處理采集的圖片樣本形狀可能存在不規則大小,需要對圖片做尺寸變換。人臉圖片集中的每一張圖片大小都不一樣,為了后續操作的方便,需要將捕獲到的人臉圖片壓縮為64像素×64像素的并進行灰度化處理。所以,圖片預處理一共分為兩步,第1步定義了一個resize_image()函數,其作用是將圖片補成正方形之后壓縮成64像素×64像素的,第2步利用OpenCV自帶的cvtColor()函數將圖片灰度化。代碼如下。

5.5.2圖片預處理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圖片預處理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)

#將圖片轉為64像素×64像素

30.

image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)

#將圖片轉為灰度圖片

31.

cv2.imwrite(full_path,image)

5.5.3加載圖片將圖片預處理之后的圖片集以多維數組的形式加載到內存中,并且為每一類樣本數據標記標記值。代碼如下。1.#loaddata.py

2.import

os

3.import

sys

4.import

numpy

as

np

5.import

cv2

6.#讀取圖片數據并與標記值綁定

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加載圖片將圖片預處理之后的圖片集以多維數組的形式加載到內存中,并且為每一類樣本數據標記標記值。代碼如下。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模型搭建搭建卷積神經網絡前,需要先完成6個步驟:第1步,需要把數據加載到內存中,即將圖片預處理之后的圖片集以多維數組的形式加載到內存中,并且為每一類樣本數據標記標記值;第2步,劃分數據集,即按照交叉驗證原則劃分數據集。交叉驗證是機器學習中的一種常用來測試精度的方法,拿出大部分數據用來訓練模型,少部分數據用來驗證模型,將驗證結果與真實結果計算出平方差,以上工作重復進行,直至平方差為0,模型訓練完畢,可以交付使用。5.5.4模型搭建搭建卷積神經網絡前,需要先完成6個步驟:第3步,改變圖片的維度,此處用到了Keras庫,這個庫是建立在TensorFlow或者Theano基礎上的,所以Keras庫的后端系統可以是TensorFlow,也可以是Theano。但是TensorFlow和Theano定義的圖片數據輸入CNN的維度順序是不一樣的,TensorFlow的維度順序為行數、列數、通道數,Theano則是通道數、行數、列數。所以需要調用image_dim_ordering()函數來確定后端系統的類型(用“th”來代表Theano,用“tf”來代表TensorFlow),最后用NumPy庫提供的reshape()函數來調整維度;第4步,進行One-Hot編碼,因為本模型采用了categorical_crossentropy函數作為損失函數,而這個函數要求標記集必須采用One-Hot編碼;第5步,歸一化圖片數據,即先讓數據集浮點化,再歸一化,目的是提升網絡收斂速度,縮短模型的訓練時間,同時適應值域在(0,1)之間的激活函數,增大區分度。第6步,確定優化器5.5.4卷積神經網絡模型結構圖卷積神經網絡模型一共13層:3個卷積層、2個池化層、4個Dropout層、1個Flatten層、2個全連接層和1個分類層,其結構如圖5.5.4卷積神經網絡模型結構圖相關代碼如下。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優化器

15.from

keras.optimizers

import

Adam

5.5.4卷積神經網絡模型結構圖相關代碼如下。16.

17.from

loaddata

import

loaddata

18.from

picturepraction

import

resize_image,IMAGE_SIZE

19.

20.class

Dataset:

21.

def

__int__(self):

22.

23.

#

訓練數據

24.

self.train_images=None

25.

self.train_labels=None

26.

27.

#

驗證數據

5.5.4卷積神經網絡模型結構圖相關代碼如下。28.

self.valid_images=None

29.

self.valid_labels=None

30.

31.

#

測試數據

32.

self.test_images=None

33.

self.test_labels=None

34.

35.

#

當前庫采用的維度順序

36.

self.input_shape=None

37.

38.

#

加載數據并預處理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卷積神經網絡模型結構圖相關代碼如下。41.

42.

#

隨機劃分訓練集、驗證集(利用交叉驗證原則)

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.

#

劃分測試集

45.

_,test_images,_,test_labels=train_test_split(images,labels,test_size=0.5,

46.

random_state=random.randint(0,100))

47.

48.

#

判斷后端系統類型來調整數組維度順序49.

if

(K.image_dim_ordering()

==

'th'):#如果后端系統是Theano,則維度順序為通道數、行數、列數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卷積神經網絡模型結構圖相關代碼如下。55.#如果后端系統是TensorFlow,則維度順序為行數、列數、通道數

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.

#

輸出訓練集、驗證集、測試集的數量

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函數作為損失函數

67.

#因此需要根據圖片集數量將圖片集標記進行One-Hot編碼使其向量化

68.

train_labels=np_utils.to_categorical(train_labels,nb_classes)

5.5.4卷積神經網絡模型結構圖相關代碼如下。69.

valid_labels=np_utils.to_categorical(valid_labels,nb_classes)

70.

test_labels=np_utils.to_categorical(test_labels,nb_classes)

71.

72.

#像素數據浮點化和歸一化

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卷積神經網絡模型結構圖相關代碼如下。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卷積神經網絡模型結構圖相關代碼如下。93.

94.

#第1個卷積層

95.

#保留邊界像素

96.

self.model.add(Convolution2D(32,3,3,border_mode='same',input_shape=dataset.input_shape,activation='relu'))#卷積層和激活函數

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個卷積層

105.

#保留邊界像素

106.

self.model.add(Convolution2D(32,3,3,border_mode='same',activation='relu'))#卷積層和激活函數

107.

##輸出(32,32,32)

108.

109.

self.model.add(Dropout(0.5))

110.

5.5.4卷積神經網絡模型結構圖相關代碼如下。111.

#第3個卷積層

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())

#數據從二維轉為一維

121.

#輸出大小為64×16×16=

16384

122.

123.

#二層全連接神經網絡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卷積神經網絡模型結構圖相關代碼如下。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優化器

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卷積神經網絡模型結構圖相關代碼如下。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卷積神經網絡模型結構圖相關代碼如下。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卷積神經網絡模型結構圖相關代碼如下。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識別與驗證相關代碼如下。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)#捕獲指定攝像頭的實時視頻流

12.

cascade_path="F:\python35\haarcascade_frontalface_alt2.xml"#人臉識別分類器本地存儲路徑

5.5.5識別與驗證相關代碼如下。13.

#循環檢測識別人臉

14.

while

cap.isOpened():

15.

ret,frame=cap.read()

#讀取一幀視頻

16.

gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#圖片灰度化,降低計算復雜度

17.

cascade=cv2.CascadeClassifier(cascade_path)#使用人臉識別分類器,讀入分類器

18.

faceRects=cascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(16,16))#利用分類器識別出哪個區域為人臉

19.

if

len(faceRects)

>

0:

20.

for

faceRect

in

faceRects:

21.

x,y,w,h=faceRect

22.

#截取臉部圖片提交給模型識別這是誰

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識別與驗證相關代碼如下。29.

print("zhuang")#在控制臺輸出

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")#在控制臺輸出

33.

elif

faceID

==

2:

34.

cv2.putText(frame,"jia",(x+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論