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
posted @ 2020-03-27 22:43  人间烟火地三鲜  阅读(2702)  评论(0编辑  收藏  举报