1. 程式人生 > >影象專案-基於opencv的人臉識別

影象專案-基於opencv的人臉識別

基於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對應的標籤了。

這裡寫圖片描述

  • 如果識別的不穩定,可以增加訓練資料。