欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解讀卷積神經(jīng)網(wǎng)絡(luò)的人臉識(shí)別

 更新時(shí)間:2022年11月29日 11:24:02   作者:Mabel-mql  
這篇文章主要介紹了解讀卷積神經(jīng)網(wǎng)絡(luò)的人臉識(shí)別問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

作為一個(gè)小白,用人臉識(shí)別上手了一下,收獲還是挺大的。

使用環(huán)境

  • python3.7
  • tensorflow 2.2.0
  • opencv-python 4.4.0.40
  • Keras 2.4.3
  • numpy 1.18.5,具體安裝過(guò)程以及環(huán)境搭建省略,可借鑒網(wǎng)上。

具體目標(biāo)

通過(guò)卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練自己數(shù)據(jù)并能成功識(shí)別自己

實(shí)現(xiàn)步驟如下圖所示

1. 人臉數(shù)據(jù)采集與讀取

1.1 數(shù)據(jù)采集

本數(shù)據(jù)集使用opencv打開(kāi)攝像頭,從攝像頭當(dāng)中采集圖片信息以及外來(lái)的某些人圖片,共采集5個(gè)人的信息(這里沒(méi)有直接從攝像頭裁剪臉部信息是為了方便外部采集的圖片進(jìn)行處理,每個(gè)人圖片為800張,本數(shù)據(jù)集把采取到每個(gè)人的圖片以名字縮寫(xiě)開(kāi)始放在同一個(gè)文件夾里面。)

相關(guān)代碼如下:

import os
import cv2
import time
from PIL import Image

#只實(shí)現(xiàn)截屏的功能
global path
path='./images/'
#人臉采樣,封裝函數(shù)
def cy(path):
   #path為保存圖片的路徑
   #調(diào)用筆記本內(nèi)置攝像頭,參數(shù)為0,如果有其他的攝像頭可以調(diào)整參數(shù)為1,2
   cap = cv2.VideoCapture(0)
   #為即將錄入的臉標(biāo)記一個(gè)id
   face_id = input('\n 用戶臉部信息錄入,輸入用戶名字(最好用英文):\n')
   #sampleNum用來(lái)計(jì)數(shù)樣本數(shù)目
   count = 0
   
   while True:
       #從攝像頭讀取圖片
       success,img = cap.read()    
       count += 1  
       #保存圖像,把灰度圖片看成二維數(shù)組來(lái)檢測(cè)人臉區(qū)域
       #保存到相應(yīng)的文件夾里
       cv2.imwrite(path+str(face_id)+'.'+str(count)+'.jpg',img)
       #顯示圖片
       cv2.imshow('image',img)
           #保持畫(huà)面的連續(xù)。waitkey方法可以綁定按鍵保證畫(huà)面的收放,通過(guò)q鍵退出攝像
       k = cv2.waitKey(1)
       if k == '27':
           break
           #或者得到800個(gè)樣本后退出攝像,這里可以根據(jù)實(shí)際情況修改數(shù)據(jù)量,實(shí)際測(cè)試后800張的效果是比較理想的
       elif count >= 500:
           time.sleep(2)
           success,img = cap.read()
           break
   
   #關(guān)閉攝像頭,釋放資源
   cap.release()
   cv2.destroyAllWindows()
#調(diào)用函數(shù)進(jìn)行人臉采樣
cy(path)

獲取每個(gè)人的人臉部分區(qū)域,這里用到人臉檢測(cè)級(jí)聯(lián)分類器,并將圖片保存到特定文件夾中。

import cv2
import os

#對(duì)圖片進(jìn)行處理,輸入的不是灰度圖片,方便外部采集的圖片進(jìn)行處理
CASE_PATH = "haarcascade_frontalface_default.xml"
RAW_IMAGE_DIR = 'images/'
DATASET_DIR = 'hh/'
path='D:\\pythonlx\\test\\images\\'

#人臉?lè)诸惼?
face_cascade = cv2.CascadeClassifier(CASE_PATH)

#定義人臉大小
def save_feces(img, name,x, y, width, height):
   image = img[y:y+height, x:x+width]
   cv2.imwrite(name, image)

image_list = os.listdir(RAW_IMAGE_DIR) #列出文件夾下所有的目錄與文件
for image_path in range(len(image_list)):
   gh=path+image_list[image_path]
  # print(gh)
   image = cv2.imread(gh)
  #gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
   faces = face_cascade.detectMultiScale(image,
                                        scaleFactor=1.2,
                                        minNeighbors=5,
                                        minSize=(5, 5), )
   for (x, y, width, height) in faces:
       save_feces(image, '%ss%d.jpg' % (DATASET_DIR, image_path+1), x, y - 30, width, height+30)

1.2 數(shù)據(jù)讀取

將圖片數(shù)據(jù)集轉(zhuǎn)為四維數(shù)組,進(jìn)行歸一化處理,并使用one-hot編碼將標(biāo)簽向量化,按照訓(xùn)練集80%,測(cè)試集20%隨機(jī)劃分。

并進(jìn)行歸一化處理。

 #讀取圖片
def read_image():
 data_x, data_y = [], []
 image_list = os.listdir('mine/')
 for i in range(len(image_list)):
     try:
         im = cv2.imread('mine/{}'.format(image_list[i]))
         im = resize_without_deformation(im)
         data_x.append(np.asarray(im, dtype = np.int8))
         #定義標(biāo)簽
         a=image_list[i].split('.')[0]
         if a=='s2':
             data_y.append(0)
         elif a=='s4':
             data_y.append(1)
         elif a=='s5':
             data_y.append(2)
         elif a=='s6':
             data_y.append(3)
         elif a=='s7':
             data_y.append(4)
     except IOError as e:
         print(e)
     except:
         print('Unknown Error!')
 return data_x,data_y

#讀取所有圖片以及標(biāo)簽
raw_images, raw_labels = read_image()
##查看數(shù)據(jù)每個(gè)標(biāo)簽的數(shù)據(jù)量
#a=raw_labels.count(0)#583
#b=raw_labels.count(1)#621
#c=raw_labels.count(2)#717
#d=raw_labels.count(3)#765
#e=raw_labels.count(4)#698

#轉(zhuǎn)為浮點(diǎn)型
raw_images, raw_labels = np.asarray(raw_images, dtype = np.float32),np.asarray(raw_labels, dtype = np.int32)

#將標(biāo)簽轉(zhuǎn)化為one_hot類型
ont_hot_labels = np_utils.to_categorical(raw_labels)

#劃分?jǐn)?shù)據(jù)集,訓(xùn)練集80%,測(cè)試集20%
train_input, valid_input, train_output, valid_output =train_test_split(raw_images, 
               ont_hot_labels,
               test_size = 0.2)
#數(shù)據(jù)歸一化處理
train_input /= 255.0
valid_input /= 255.0

2. 圖片預(yù)處理

采集的圖片樣本形狀可能存在不規(guī)則大小,須對(duì)圖片做尺寸變換,轉(zhuǎn)化為100*100大小,為防止圖片變形,將圖片較短的一側(cè)涂黑進(jìn)行填充。

使它變成和目標(biāo)圖像相同的比例,然后再resize,這樣既可以保留原圖的人臉信息,又可以防止圖像形變;最后對(duì)灰度圖片直方圖均衡化,增強(qiáng)圖片的細(xì)節(jié)與對(duì)比度,提高識(shí)別率。

def resize_without_deformation(image, size = (100, 100)):
  height, width, _ = image.shape
  #對(duì)于長(zhǎng)度不等的邊,找到最長(zhǎng)邊
  longest_edge = max(height, width)
  #使用0填充邊框
  top, bottom, left, right = 0, 0, 0, 0
   #計(jì)算短邊需要增加多上像素寬度使其與長(zhǎng)邊等長(zhǎng)
  if height < longest_edge:
      height_diff = longest_edge - height
      top = int(height_diff // 2)
      bottom = height_diff - top
  elif width < longest_edge:
      width_diff = longest_edge - width
      left = int(width_diff // 2)
      right = width_diff - left
   #給圖像增加邊界,是圖片長(zhǎng)、寬等長(zhǎng),cv2.BORDER_CONSTANT指定邊界顏色由value指定
  image_with_border = cv2.copyMakeBorder(image, top , bottom, left, right, cv2.BORDER_CONSTANT, value = [0, 0, 0])

  resized_image = cv2.resize(image_with_border, size)
  #將裁剪的圖片轉(zhuǎn)化為灰度圖
  resize_image= cv2.cvtColor(resized_image,cv2.COLOR_BGR2GRAY)
  #直方圖均衡化
  hist = cv2.equalizeHist(resize_image)
  img2 = hist.reshape((100, 100, 1))
  return img2

3. 模型搭建與訓(xùn)練

根據(jù)卷積神經(jīng)網(wǎng)絡(luò)中各組成結(jié)構(gòu)的不同作用搭建卷積網(wǎng)絡(luò)模型,調(diào)整各個(gè)參數(shù),實(shí)現(xiàn)對(duì)模型的優(yōu)化,提高模型訓(xùn)練效果。

模型框架:

模型框架

模型參數(shù):

搭建卷積網(wǎng)絡(luò)及訓(xùn)練:

由于數(shù)據(jù)集的圖片可能過(guò)于單一,以及變化小,因此后面加了一個(gè)數(shù)據(jù)提升,利用生成器進(jìn)行訓(xùn)練模型。

 #搭建卷積神經(jīng)網(wǎng)絡(luò),順序模型
model = models.Sequential()

#卷積層,卷積核大小32,每個(gè)大小383,步長(zhǎng)為1,輸入的類型為(100,100,1),1為通道,激活函數(shù)relu
model.add(Conv2D(filters=32,kernel_size=(3,3),padding='valid',strides= (1, 1),#1
                                  input_shape = (100, 100,1),
                                  activation='relu'))

model.add(Conv2D(filters=32,kernel_size=(3,3),padding='valid',strides= (1, 1),#2
                                  activation='relu'))


#池化層
model.add(MaxPooling2D(pool_size=(2, 2)))#3

#Dropout層
model.add(Dropout(0.25))#4

#卷積層
model.add(Conv2D(64, (3, 3), padding='valid',
                                  strides = (1, 1),
                                  activation = 'relu'))#5

model.add(Conv2D(64, (3, 3), padding='valid',
                                  strides = (1, 1),
                                  activation = 'relu'))#6

#池化層
model.add(MaxPooling2D(pool_size=(2, 2)))#7
model.add(Dropout(0.25))#8

#全連接
model.add(Flatten())#9

model.add(Dense(512, activation = 'relu'))#10

model.add(Dropout(0.25))#11

#輸出層,神經(jīng)元數(shù)是標(biāo)簽種類數(shù),使用sigmoid激活函數(shù),輸出最終結(jié)果
model.add(Dense(len(ont_hot_labels[0]), activation = 'sigmoid'))#12



#優(yōu)化模型,
#SGD----梯度下降算子
#learning_rate = 1#學(xué)習(xí)率
#decay = 1e-6#學(xué)習(xí)率衰減因子
#momentum = 0.8#沖量
#nesterov = True
#sgd_optimizer = SGD(lr = learning_rate, decay = decay,
#                    momentum = momentum, nesterov = nesterov)

#categorical_crossentropy
#優(yōu)化器用Adam算法,損失函數(shù)用交叉熵的方法
model.compile(optimizer='adam',loss='categorical_crossentropy',
              metrics=['accuracy'])


#輸出模型參數(shù)
model.summary()

#定義數(shù)據(jù)生成器用于數(shù)據(jù)提升,其返回一個(gè)生成器對(duì)象datagen,datagen每被調(diào)用一
#次其生成一組數(shù)據(jù)(順序生成),節(jié)省內(nèi)存,其實(shí)就是python的數(shù)據(jù)生成器
datagen = ImageDataGenerator(
                 featurewise_center = False,             #是否使輸入數(shù)據(jù)去中心化(均值為0),
                 samplewise_center  = False,             #是否使輸入數(shù)據(jù)的每個(gè)樣本均值為0
                 featurewise_std_normalization = False,  #是否數(shù)據(jù)標(biāo)準(zhǔn)化(輸入數(shù)據(jù)除以數(shù)據(jù)集的標(biāo)準(zhǔn)差)
                 samplewise_std_normalization  = False,  #是否將每個(gè)樣本數(shù)據(jù)除以自身的標(biāo)準(zhǔn)差
                 zca_whitening = False,                  #是否對(duì)輸入數(shù)據(jù)施以ZCA白化
                 rotation_range = 20,                    #數(shù)據(jù)提升時(shí)圖片隨機(jī)轉(zhuǎn)動(dòng)的角度(范圍為0~180)
                 width_shift_range  = 0.2,               #數(shù)據(jù)提升時(shí)圖片水平偏移的幅度(單位為圖片寬度的占比,0~1之間的浮點(diǎn)數(shù))
                 height_shift_range = 0.2,               #同上,只不過(guò)這里是垂直
                horizontal_flip = True,                 #是否進(jìn)行隨機(jī)水平翻轉(zhuǎn)
                 vertical_flip = False)                  #是否進(jìn)行隨機(jī)垂直翻轉(zhuǎn)
 
#計(jì)算整個(gè)訓(xùn)練樣本集的數(shù)量以用于特征值歸一化、ZCA白化等處理
datagen.fit(train_input)

#利用生成器開(kāi)始訓(xùn)練模型
history=model.fit_generator(datagen.flow(train_input, train_output,batch_size = 50),
                                      epochs = 10,
                                      validation_data = (valid_input, valid_output))

#模型驗(yàn)證
print(model.evaluate(valid_input, valid_output, verbose=2))

##畫(huà)出LOSS變化曲線圖
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'],label='val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.5,1])
plt.legend(loc='lower right')

#保存模型
MODEL_PATH = 'face_model.h5'
model.save(MODEL_PATH)

4. 識(shí)別與驗(yàn)證

將保存的模型重新進(jìn)行加載,打開(kāi)攝像頭進(jìn)行識(shí)別,可以很準(zhǔn)確的識(shí)別出自己以及別人(由于不能輕易公開(kāi)別人的身份,將預(yù)測(cè)改為識(shí)別自己與非己),在進(jìn)行模型預(yù)測(cè)時(shí),需要將從攝像頭中獲取的每一幀圖片進(jìn)行處理轉(zhuǎn)化為相應(yīng)的格式,否則會(huì)出現(xiàn)shape的問(wèn)題。

并且預(yù)測(cè)出來(lái)的是對(duì)應(yīng)每個(gè)標(biāo)簽的置信度,返回到其最大值的列索引即可知道對(duì)應(yīng)的標(biāo)簽,即可識(shí)別出是誰(shuí)。

效果圖如下所示

  • 識(shí)別自己與自己:

  • 識(shí)別自己與非己:

5 總結(jié)

在初次嘗試進(jìn)行模型訓(xùn)練時(shí),沒(méi)有對(duì)圖片進(jìn)行細(xì)節(jié)處理以及數(shù)據(jù)提升,雖然模型準(zhǔn)確率很高,但當(dāng)使用攝像頭進(jìn)行識(shí)別時(shí),會(huì)存在識(shí)別不準(zhǔn)確的情況,因此后面增加了對(duì)圖像的細(xì)節(jié)處理以及數(shù)據(jù)提升處理,預(yù)測(cè)效果達(dá)到預(yù)期值,模型最高準(zhǔn)確率達(dá)到99.4%,損失率0.015。

數(shù)據(jù)集的問(wèn)題,由于是直接采用攝像頭進(jìn)行拍攝,會(huì)存在有些角度沒(méi)有采集完全或者會(huì)受到環(huán)境因素的影響。到人臉識(shí)別對(duì)比時(shí),就會(huì)只能識(shí)別那些角度的特征,換了一個(gè)角度就會(huì)識(shí)別不出來(lái).

本例當(dāng)中對(duì)于人臉的定位是直接使用opencv自帶的級(jí)聯(lián)分類器,可以在安裝的opencv文件夾下找到相關(guān)的分類器。沒(méi)有自己寫(xiě)算法。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python 實(shí)現(xiàn)使用dict 創(chuàng)建二維數(shù)據(jù)、DataFrame

    Python 實(shí)現(xiàn)使用dict 創(chuàng)建二維數(shù)據(jù)、DataFrame

    下面小編就為大家分享一篇Python 實(shí)現(xiàn)使用dict 創(chuàng)建二維數(shù)據(jù)、DataFrame,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python運(yùn)行第一個(gè)PySide2的窗體程序

    Python運(yùn)行第一個(gè)PySide2的窗體程序

    本文主要介紹了Python運(yùn)行第一個(gè)PySide2的窗體程序,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Python實(shí)現(xiàn)生活常識(shí)解答機(jī)器人

    Python實(shí)現(xiàn)生活常識(shí)解答機(jī)器人

    今天教大家如何用Python爬蟲(chóng)去搭建一個(gè)「生活常識(shí)解答」機(jī)器人.思路:這個(gè)機(jī)器人主要是依托于“阿里達(dá)摩院發(fā)布的語(yǔ)言模型PLUG”,通過(guò)爬蟲(chóng)的方式,發(fā)送post請(qǐng)求(提問(wèn)),然后返回json數(shù)據(jù)(回答),需要的朋友可以參考下
    2021-06-06
  • 解決Pytorch訓(xùn)練過(guò)程中l(wèi)oss不下降的問(wèn)題

    解決Pytorch訓(xùn)練過(guò)程中l(wèi)oss不下降的問(wèn)題

    今天小編就為大家分享一篇解決Pytorch訓(xùn)練過(guò)程中l(wèi)oss不下降的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Python連接打印機(jī)實(shí)現(xiàn)自動(dòng)化打印的實(shí)用技巧和示例代碼

    Python連接打印機(jī)實(shí)現(xiàn)自動(dòng)化打印的實(shí)用技巧和示例代碼

    在計(jì)算機(jī)科學(xué)領(lǐng)域,打印機(jī)是一種重要的外部設(shè)備,用于將電子文檔轉(zhuǎn)換成實(shí)際的紙質(zhì)文件,下面這篇文章主要給大家介紹了關(guān)于Python連接打印機(jī)實(shí)現(xiàn)自動(dòng)化打印的實(shí)用技巧和示例代碼,需要的朋友可以參考下
    2024-05-05
  • Python讀取TIF影像的多種方法

    Python讀取TIF影像的多種方法

    Python提供了豐富的庫(kù)來(lái)讀取和處理TIFF文件,其中PIL庫(kù)是最常用的,本文給大家介紹Python讀取TIF影像的幾種方法,需要的朋友可以參考下
    2023-07-07
  • Matplotlib自定義圖例(多張圖共享一個(gè)圖例)

    Matplotlib自定義圖例(多張圖共享一個(gè)圖例)

    最近再用Matplotlib繪圖,需要做兩個(gè)子圖都不需要設(shè)置圖例,圖例單獨(dú)用一個(gè)figure來(lái)顯示,本文就詳細(xì)的來(lái)介紹一下,感興趣的可以了解一下
    2023-08-08
  • Python深入學(xué)習(xí)之裝飾器

    Python深入學(xué)習(xí)之裝飾器

    這篇文章主要介紹了Python深入學(xué)習(xí)之裝飾器,裝飾器(decorator)是一種高級(jí)Python語(yǔ)法,本文全面介紹了Python中的裝飾器,需要的朋友可以參考下
    2014-08-08
  • python人工智能tensorflow常見(jiàn)損失函數(shù)LOSS匯總

    python人工智能tensorflow常見(jiàn)損失函數(shù)LOSS匯總

    這篇文章主要為大家介紹了python人工智能tensorflowf常見(jiàn)損失函數(shù)LOSS匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • django 單表操作實(shí)例詳解

    django 單表操作實(shí)例詳解

    這篇文章主要介紹了django 單表操作實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07

最新評(píng)論