人臉檢測及識別python實現系列(3)——為模型訓練準備人臉資料

NO IMAGE

人臉檢測及識別python實現系列(3)——為模型訓練準備人臉資料

       機器學習最本質的地方就是基於海量資料統計的學習,說白了,機器學習其實就是在模擬人類兒童的學習行為。舉一個簡單的例子,成年人並沒有主動教孩子學習語言,但隨著孩子慢慢長大,自然而然就學會了說話。那麼孩子們是怎麼學會的呢?很簡單,在人類出生之前,有了聽覺開始,就開始不斷聽到各種聲音。人類的大腦會自動組織、分類這些不同的聲音,形成自己的認識。隨著時間的推移,大腦接收到的聲音資料越來越多。最終,大腦利用一種我們目前尚未知曉的機制建立了一個成熟、可靠的聲音分類模型,於是孩子們學會了說話。機器學習也是如此,要想識別出這張人臉屬於誰,我們同樣需要大量的本人和其他人的人臉資料,然後將這些資料輸入Tensorflow這樣的深度學習(深度學習指的是深度神經網路學習,乃機器學習分支之一)框架,利用深度學習框架建立屬於我們自己的人臉分類模型。只要資料量足夠,分類準確率就能提高到足以滿足我們需求的級別。

        日本程式設計師提供的原始碼利用了keras這個深度學習庫來訓練自己的人臉識別模型。keras是一個上層的神經網路學習庫,純python編寫,被整合進了Tensorflow和Theano這樣的深度學習框架。其存在的目的就是簡化開發複雜度,能夠讓你迅速出產品,更關鍵的是,keras有中文文件;),有興趣的請點這裡:keras中文文件。由於我的機器已經安裝了Tensorflow,因此我直接使用了keras的Tensorflow版。同時,為了驗證其它深度學習庫的效率和準確率,當然也為了滿足我的好奇心,我還使用了Theano,利用CNN——卷積神經網路來訓練我的人臉識別模型。我會在接下來的幾節講述這些內容,本節專注把訓練資料準備好。

        首先,我們需要大量自己的臉部圖片,怎麼獲取呢?很簡單,利用前兩節講到的知識就可以了,我們只是在前面程式碼的基礎上增加臉部影象儲存功能即可,先把完整程式碼貼出來:

複製程式碼
 1 #-*- coding: utf-8 -*-
2 
3 import cv2
4 import sys
5 
6 from PIL import Image
7 
8 def CatchPICFromVideo(window_name, camera_idx, catch_pic_num, path_name):
9     cv2.namedWindow(window_name)
10     
11     #視訊來源,可以來自一段已存好的視訊,也可以直接來自USB攝像頭
12     cap = cv2.VideoCapture(camera_idx)                
13     
14     #告訴OpenCV使用人臉識別分類器
15     classfier = cv2.CascadeClassifier("/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt2.xml")
16     
17     #識別出人臉後要畫的邊框的顏色,RGB格式
18     color = (0, 255, 0)
19     
20     num = 0    
21     while cap.isOpened():
22         ok, frame = cap.read() #讀取一幀資料
23         if not ok:            
24             break                
25     
26         grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  #將當前楨影象轉換成灰度影象            
27         
28         #人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點數
29         faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32))
30         if len(faceRects) > 0:          #大於0則檢測到人臉                                   
31             for faceRect in faceRects:  #單獨框出每一張人臉
32                 x, y, w, h = faceRect                        
33                 
34                 #將當前幀儲存為圖片
35                 img_name = '%s/%d.jpg'%(path_name, num)                
36                 image = frame[y - 10: y   h   10, x - 10: x   w   10]
37                 cv2.imwrite(img_name, image)                                
38                                 
39                 num  = 1                
40                 if num > (catch_pic_num):   #如果超過指定最大儲存數量退出迴圈
41                     break
42                 
43                 #畫出矩形框
44                 cv2.rectangle(frame, (x - 10, y - 10), (x   w   10, y   h   10), color, 2)
45                 
46                 #顯示當前捕捉到了多少人臉圖片了,這樣站在那裡被拍攝時心裡有個數,不用兩眼一抹黑傻等著
47                 font = cv2.FONT_HERSHEY_SIMPLEX
48                 cv2.putText(frame,'num:%d' % (num),(x   30, y   30), font, 1, (255,0,255),4)                
49         
50         #超過指定最大儲存數量結束程式
51         if num > (catch_pic_num): break                
52                        
53         #顯示影象
54         cv2.imshow(window_name, frame)        
55         c = cv2.waitKey(10)
56         if c & 0xFF == ord('q'):
57             break        
58     
59     #釋放攝像頭並銷燬所有視窗
60     cap.release()
61     cv2.destroyAllWindows() 
62     
63 if __name__ == '__main__':
64     if len(sys.argv) != 4:
65         print("Usage:%s camera_id face_num_max path_name\r\n" % (sys.argv[0]))
66     else:
67         CatchPICFromVideo("擷取人臉", int(sys.argv[1]), int(sys.argv[2]), sys.argv[3])
複製程式碼

依然很簡單的程式碼,只是增加了不到10行程式碼,程式能夠指定要擷取的人臉數量,由cv2.imwrite()函式完成實際的儲存,到達指定數量程式會自動退出。同時,在影象上提供了資訊輸出功能,以便我們能隨時知道已經擷取了多少張人臉,當然前提是你在一定距離之外還能看清楚螢幕。整個流程還是比較簡單的,不多說了。我們需要利用這個程式準備至少1000張自己的人臉圖片,將其單獨放到一個資料夾下,如下圖:

我將它們放到了與程式同路徑的”data/me“資料夾下。然後我們還需要擷取至少另外一個人的圖片以便訓練程式分類使用,以提高模型準確度。我擷取的我閨女的,將其儲存到了data/other資料夾下,同樣也是1000張。注意一定要確保每個資料夾下的所有圖片都是同一個人的(對於我來說data/me是我的,data/other全部是閨女的),接下來的訓練程式將以資料夾作為標籤資料區分個人。

        前面已經說過,OpenCV對人臉的識別也不是100%準確,因此,我們擷取的人臉影象中會有些不合格的,比如誤把燈籠當人臉存下來了或者人臉影象很模糊。在我擷取的1000張人臉中大約有幾十張這樣的,要想確保模型可靠,必須要把這樣的圖片去掉。這個活只能手動了,沒辦法。幸運的是,資料量不大,不會耽誤太多時間的。最後,請確保程式所在路徑下已經有了data/me和data/other兩個資料夾及各1000張人臉圖片。下一篇博文將講述如何利用這些已經準備好的資料訓練我們的識別模型。

https://www.cnblogs.com/neo-T/p/6432596.html