友快網

導航選單

【人臉識別】第一期:如何用人臉識別技術在網路上做一個人臉識別?

上一期我們玩了下人臉檢測,深感寫得不好,這期好好寫。

小槍換炮,我們一起來做人臉識別如何?

話不多說。。。

step 1 網路

人臉檢測好了,如何知道是誰呢?首先搞個CNN分配器。

那學習下CNN的結構

一看圖,別跑,乍一看就是把影象經過卷積輸出一組資料 其實不就是基於深度網路的特徵提取嗎?那好了,最後的1024個特徵全連線到幾個人就OK了。

使用keras構建一個不就好了,照貓畫虎 程式碼奉上:

model = Sequential()model。add(Conv2D(32,kernel_size = (3,3), strides = (1,1), padding = ‘same’, input_shape = (114,114,3), activation = ‘relu’))model。add(MaxPooling2D(pool_size = (2,2)))model。add(Dropout(0。25))model。add(Conv2D(64,kernel_size = (3,3), strides = (1,1), padding = ‘same’, activation = ‘relu’))model。add(MaxPooling2D(pool_size = (2,2)))model。add(Dropout(0。25))model。add(Conv2D(128,kernel_size = (3,3), strides = (1,1), padding = ‘same’, activation = ‘relu’))model。add(MaxPooling2D(pool_size = (2,2)))model。add(Dropout(0。25))model。add(Flatten())model。add(Dense(128,activation = ‘relu’))model。add(Dense(64,activation = ‘relu’))model。add(Dense(len(classes),activation = ‘softmax’))

說明:

Sequential:序貫模型

序貫模型是函式式模型的簡略版,為最簡單的線性、從頭到尾的結構順序,不分叉,是多個網路層的線性堆疊

add 網路新增

新增網路到序貫模型

Conv2D:二維卷積

影象的處理當然是二維卷積了

Conv2D(32,kernel_size = (3,3), strides = (1,1), padding = ‘same’, input_shape = (114,114,3), activation = ‘relu’)

引數說明:

32 輸出的維度大小

kernel_size 卷積核的大小

strides 步長(每次卷積操作跳的步長)

padding 自動填充輸入

input_shape 輸入的shape我們輸入的是114*114*3

activation 啟用函式

MaxPooling2D:最大池化層

就是弄個卷積比如(2*2)在這個2*2的影象裡取最大值代替2*2所以輸出減半嘍

Dropout:防止過擬合的

按照一定的機率將一段神經網路暫時從網路中丟棄

Flatten:扁平化層

就是把多維的資料變成一維的

Dense:全連線層

把扁平化的資料全連線到我們輸出的類的數量上,比如classes的長度

classes裡面就是我們不同人的id唄。

網路構建好了 資料呢??

step2 資料

深度神經網路的主要做的就是就是 資料 ——->網路模型學習——->識別

好的,那我們錄下自己的資料唄,每個人一個名字一個資料夾,裡面放114*114大小的臉部圖片。

如:

之前我們做好了人臉檢測的那我們在這基礎上檢測人臉並儲存到資料夾裡唄,程式碼奉上:

import cv2import osimport numpy as npxml_path = r‘。/haarcascade_frontalface_default。xml’cascade_signal = cv2。CascadeClassifier(xml_path)cap = cv2。VideoCapture(0)#注意這裡是數字零、dir_name=‘。/xia/’#存放人臉的資料夾名稱,你的名字num=0#檢測到沒有資料夾構建一個唄if not os。path。isdir(dir_name): os。mkdir(dir_name)while True: box = [] _,frame= cap。read()#讀取第一幀畫面 #讀取成功 if _: #置信度的與閾值1~1。5 越大識別越的要求高,但可能識別出你就很困難、 result = cascade_signal。detectMultiScale(frame, 1。3, 5) #識別到了畫出來 if result != (): result_mean = np。mean(result, axis=0) x = int(result_mean[0]) y = int(result_mean[1]) w = int(result_mean[2]) h = int(result_mean[3]) box = (x,y,x+w,y+h) face_img = frame[y:y+h, x:x+w] cv2。rectangle(frame,(x,y),(x+w,y+h),(0,255,0),1) #顯示出來 cv2。imshow(‘im’,frame) #儲存臉部資訊 cv2。imwrite(dir_name+(‘%06d。png’%num),cv2。resize(face_img,(114,114))) cv2。waitKey(1) num+=1cap。replease()

好的我們有自己的臉再去找些其他人的臉吧!

一個蘿蔔一個坑 一個一個資料夾準備好:

當然不能寫漢字,這裡寫漢字主要是皮一下。。。

資料數量:

樣式越多越好,表情豐富,光線充足 。一千以上

構建資料集

按照比例構建資料集,有兩個需要的,訓練資料集,測試資料集

讀取所有圖片,每個人的臉部圖片對應一個標籤0~10遞增當然也可以是0~100看你有多少資料夾多少個人了

還說啥程式碼:

def dataset(data_dir): category_count=0 for dirname in os。listdir(data_dir): if os。path。isdir(data_dir+‘/’+dirname): sample_count = 0 print(“load——>”+dirname) sub_dir = data_dir+“/”+dirname for filename in os。listdir(sub_dir): max_ = len(os。listdir(sub_dir)) sub_img = sub_dir+“/”+filename img = cv2。imread(sub_img) sample_count += 1 if(sample_count <= max_*0。2): validation_images。append(img) self。validation_labels。append(self。category_count) else: train_images。append(img) train_labels。append(category_count) category_count+=1 train_images = np。asarray(train_images) train_labels = np。asarray(train_labels) validation_images = np。asarray(validation_images) validation_labels = np。asarray(validation_labels) return train_images,train_labels,validation_images,validation_labels

完後就是訓練了,點贊超百,馬上開始訓練,哭了幫兄弟一把吧

上一篇:本田CRV一代神車,也有吐槽的地方
下一篇:莫斯科印象 | 沒有對比,就沒有“傷害”