影象專案-基於opencv的人臉識別
阿新 • • 發佈:2019-02-09
基於opencv的人臉識別
opencv的一個目錄:opencv/sources/data/haarcascades 提供了用於人臉檢測相關的檔案,載入這些檔案,就可以方便的實現人臉檢測的相關工作。
face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(face_gray, 1.3, 5)
上述程式碼就可以實現人臉的區域的檢測,face返回人臉矩形框的左上角座標以及矩形框的長和寬的列表。
顯然,做人臉識別需要大量的訓練資料。一般深度學習識別的訓練集資料都是萬為單位。我們這裡就打算呼叫攝像頭,然後將用上述矩形框裡的影象轉化為灰度圖然後再resize到200*200大小作為訓練資料。
下面是獲取100張訓練影象的程式碼
#coding: utf-8 import cv2 datapath = "D:/imgData/face/" def generate(name): face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml') # eye_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml') camera = cv2.VideoCapture(0) count = 0 while (True): ret, frame = camera.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #p2:人臉檢測中每次迭代影象的壓縮率 p3:每個人臉矩形保留近鄰數目的最小值ֵ faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: img = cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) f = cv2.resize(gray[y:y+h, x:x+w], (200, 200)) cv2.imwrite(datapath + str(name) + '/%s.pgm' % str(count), f) print count count += 1 if(count >= 100): break cv2.imshow("camera", frame) if cv2.waitKey(1000 / 12) & 0xff == ord("q"): break camera.release() cv2.destroyAllWindows() if __name__ == "__main__": generate('wjf')
訓練資料的話都要一個文字檔案來指定當前圖片屬於哪一個類別?caffee是用一個txt文字說明,opencv需要一個csv檔案說明。
當然,這個檔案肯定需要程式碼來生成,程式碼比較簡單,就是一些檔案的操作。python方便的就是可以用其他的包呼叫,而且使用起來很方便,跟Java一樣。python檔案操作一個好用的包就是os了。
下面是生成csv檔案的程式碼:
#coding: utf-8 import os dataPath = "D:/imgData/face/" #列出資料夾所有資料夾 dirList = os.listdir(dataPath) label = -1; for name in dirList: path = dataPath + str(name) + '/' print path cpath = str(path)[16:str(path).rfind('/')+1] label += 1 f = open(dataPath+'train.csv', 'a+'); fileList = os.listdir(path) for fileName in fileList: print fileName f.write(cpath + fileName + ';' + str(label) + '\n')
開啟這個檔案,可以看到其內容如下,有必要的話可以將順序在打亂一點。
完事具備,接下來就是訓練了。opencv提供了三種人臉識別的方法,這裡打算用Eigenfaces來實現,它是基於PCA原理的。
- 使用起來也很簡單,傳入所有影象陣列的list集合X以及對應標籤的list。
訓練完成後,我們將模型儲存到xml檔案中去。
model = cv2.face.createEigenFaceRecognizer() model.train(np.asarray(X), np.asarray(y)) model.save(dataPath + 'model.xml')
模型的預測也很簡單了,呼叫model.predict(img)就可以返回img對應的標籤了。
- 如果識別的不穩定,可以增加訓練資料。