CNN實現人臉識別




一:dlib庫踩的坑

Import dlib報錯:

可是已經安裝了dlib庫:

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

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

重新安裝:pip install dlib失敗,報錯,又試了幾遍還是同樣的錯:

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

然而任然不能import:

經查,說是py36沒有dlib庫的穩定版本,一般裝19.6.1就可以用,結果也報錯:

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

二:OpenCV庫踩得坑:

報錯截圖:

提示代碼:

success, img = camera.read() 
#灰度化           
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

后來得知:除了路徑問題還有可能是攝像頭ID沒對!
打開攝像頭代碼如下:

camera = cv2.VideoCapture(0)
success,frame = camera.read()    

這兩行:

1、cap = cv2.VideoCapture(0)

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

2、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/Pan-will/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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM