CNN實現人臉識別

一:dlib庫踩的坑

Import dlib報錯:
git

但是已經安裝了dlib庫:
github

嘗試卸載在安裝:
conda uninstall dlib命令失敗:
安全

改用pip uninstall dlib命令成功卸載:

ide

從新安裝:pip install dlib失敗,報錯,又試了幾遍仍是一樣的錯:
函數

後來嘗試:從 https://pypi.org/ 將dlib庫下載到本地安裝以下圖,安裝成功:
測試

然而任然不能import:
ui

經查,說是py36沒有dlib庫的穩定版本,通常裝19.6.1就能夠用,結果也報錯:
code

將dlib-19.6.1版本的whl文件下載到本地安裝,安裝成功,import可行:
視頻

二:OpenCV庫踩得坑:

報錯截圖:
xml

提示代碼:

success, img = camera.read() 

\#灰度化           

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

後來得知:除了路徑問題還有多是攝像頭ID沒對!
打開攝像頭代碼以下:

camera = cv2.VideoCapture(0)     

success,frame = camera.read()

以上代碼裏:

一、cap = cv2.VideoCapture(0)

​ VideoCapture()中參數是0,表示打開筆記本的內置攝像頭,其餘數字則表明其餘設備;參數是視頻文件路徑則打開視頻,如cap = cv2.VideoCapture(「../demo.mp4」)

二、ret,frame = cap.read()

cap.read()按幀讀取視頻,ret,frame是獲cap.read()方法的兩個返回值。其中ret是布爾值,若是讀取幀是正確的則返回True,若是文件讀取到結尾,它的返回值就爲False。frame就是每一幀的圖像,是個三維矩陣。

然而:默認攝像頭是自帶的那個攝像頭,索引號爲0,但是若是外接USB攝像頭,它的索引號就不必定是0 ;另外,像個人筆記本自帶攝像頭索引傳0一直報錯,因此我先暴力破解一下攝像頭的索引號,確認一下究竟是不是0!代碼以下:
import cv2    
ID = 0         
while(1):
	camera = cv2.VideoCapture(ID)
	success,frame = camera.read()
	if success==False:
		ID += 1
	else:
		print(ID)
		break

打印的結果是700!!

將原來代碼裏的索引號替換後果真OK!

importcv2

ID=700
camera=cv2.VideoCapture(ID)
while(1):
    success,frame=camera.read()
    cv2.imshow("hello",frame)
    if cv2.waitKey(1)&0xFF==ord('q'):
    	break
camera.release()
cv2.destroyAllWindows()

攝像頭的索引號改爲了700,代碼能打開攝像頭了,可是窗口一片漆黑!以下:

——重啓解決了問題,不過此後又出現了這個狀況,後來才發現是我在某軟件中設置了關於攝像頭的安全規則——不容許非法打開攝像頭,我先扶牆緩緩

代碼以下:

"""
經過攝像頭檢測並標記人臉
"""
import cv2

# 加載人臉特徵庫
face_engine = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 加載人眼特徵庫
eye_engine = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

# 打開攝像頭,700是攝像頭索引號(0表示默認攝像頭)
camera = cv2.VideoCapture(700)

while(True):
    # 讀取一幀的圖像
    success, img = camera.read()
    # 灰度化
    # img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 檢測人臉:1.3是放大比例(此參數必須大於1);13是重複識別次數(此參數用來調整精確度,越大則越精確)
    faces = face_engine.detectMultiScale(img, scaleFactor=1.3, minNeighbors=13)
    # 對每一張臉,進行如下操做
    for (x, y, w, h) in faces:
        # 用矩形框出人臉:BGR色彩體系;2表示畫筆寬度
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 用矩形圈出人臉

        # 記錄下臉部位置,做爲識別眼睛的區域範圍
        face_area = img[y:y + h, x:x + w]
        # 在記錄下的臉部區域識別人眼
        eyes = eye_engine.detectMultiScale(face_area)
        # 對每個識別出的人眼,進行如下操做
        for (xe, ye, we, he) in eyes:
            cv2.rectangle(face_area, (xe, ye), (xe + we, ye + he), (0, 255, 0), 1)

    cv2.imshow('Face Recognition', img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 關閉攝像頭
camera.release()
# 關閉全部窗口
cv2.destroyAllWindows()

三:實現人臉識別

項目詳見GitHub地址。具體功能:支持從照片、視頻文件、攝像頭獲取人臉數據;支持本身訓練模型;支持識別照片、視頻文件、攝像頭中的人臉。

GitHub:https://github.com/PanWeiw/CNN_FacesRecognition.git

項目環境:詳見requirements.txt文件;

項目結構如圖:

注:

1. dataset文件夾是數據集;

2. MyModel文件夾存放訓練的模型問價;

3. model_test文件夾是測試模型時,存放待測照片、視頻所用;

4. my_faces 和 MySource_faces文件夾是測試採集人臉數據集時所用的。

5. 採集人臉數據集:
   從照片採集:faces_from_Photo.py
   從視頻文件採集:faces_from_Video.py
   從攝像頭採集:faces_from_Camera.py
   加載照片的函數:read_img.py

6. 處理照片並加載標籤:load_dataset.py

7. 構建並訓練模型:train_model.py
   處理數據集的函數:dataSet.py

8. 模型測試
   識別照片中的人臉:Recognize_From_Photo.py、Recognize_From_Photo(2).py
   識別視頻文件中的人臉:Recognize_From_Vedio.py
   識別攝像頭中的人臉:Recognize_From_Camera.py
相關文章
相關標籤/搜索