基于CNN做人脸识别
首先,我是考虑,这系统在Windows下做还是在Linux、Ubuntu下做比较好?
然后,我都检测过,Windows下可以用python、anaconda写代码都可以。当然,和在Linux和Ubuntu下使用的库和包肯定也是一样的。目的就在于那种形式,比较简单,这是我的想法。何必给自己添加难度呢?
后来,我是选择在Ubuntu下做人脸识别。至于为什么,简单是一回事,后面还有原因,我会一一讲解的。
我写了一份草图,我这几周分别做哪些事。
搭建环境
- 将Ubuntu系统安装好,然后配置环境
安装啊python、pip
这里小编给个建议,安装好ubuntu第一步就是把数据源给改了,那样之后下载库或者包的时候会比官方快好多。个人推荐清华的源https://pypi.tuna.tsinghua.edu.cn/simple
重新导入完后
执行下更新
sudo apt-get update
sudo apt-get upgrade
需要的包的大概有:numpy、opencv-python、keras、scikit-learn、tensorflow、dlib、pandas(有条件可以考虑基于GPU的)以及神经网络所需的各种包及库等等
sudo pip install opencv-python
sudo pip install keras
sudo pip install scikit-learn
sudo pip install tensorflow
sudo pip install dlib
sudo pip install pandas
主要分为五个模块:
1.人脸收集
2.头像提取
3.尺寸变换
4.训练
5.识别
话不多说上代码:
测试摄像头
文件名为:how_to_use_camera.py
这里说明下,小编都是用python来编译的
# OpenCv 调用摄像头
# 默认调用笔记本摄像头
# Author: coneypo
# Blog: http://www.cnblogs.com/AdaminXie
# GitHub: https://github.com/coneypo/Dlib_face_recognition_from_camera
# Mail: coneypo@foxmail.com
import cv2
cap = cv2.VideoCapture(0)
# cap.set(propId, value)
# 设置视频参数: propId - 设置的视频参数, value - 设置的参数值
cap.set(3, 480)
# cap.isOpened() 返回 true/false, 检查摄像头初始化是否成功
print(cap.isOpened())
# cap.read()
"""
返回两个值
先返回一个布尔值, 如果视频读取正确, 则为 True, 如果错误, 则为 False;
也可用来判断是否到视频末尾;
再返回一个值, 为每一帧的图像, 该值是一个三维矩阵;
通用接收方法为:
ret,frame = cap.read();
ret: 布尔值;
frame: 图像的三维矩阵;
这样 ret 存储布尔值, frame 存储图像;
若使用一个变量来接收两个值, 如:
frame = cap.read()
则 frame 为一个元组, 原来使用 frame 处需更改为 frame[1]
"""
while cap.isOpened():
ret_flag, img_camera = cap.read()
cv2.imshow("camera", img_camera)
# 每帧数据延时 1ms, 延时为0, 读取的是静态帧
k = cv2.waitKey(1)
# 按下 's' 保存截图
if k == ord('s'):
cv2.imwrite("test.jpg", img_camera)
# 按下 'q' 退出
if k == ord('q'):
break
# 释放所有摄像头
cap.release()
# 删除建立的所有窗口
cv2.destroyAllWindows()
python3 how_to_use_camera.py
提取头像
下面的视频自己可以随便找一部,人脸多的。代码的目的就是截取人,为之后收集人脸做铺垫。以下代码中有存在路径,自己注意修改自己文件夹目录在哪。
文件名:capture.py
import cv2
print(cv2.__version__)
# /home/zjipc/Documents
vc = cv2.VideoCapture('D:\picture\mda-ihuh3xjpbi20te2c.MP4' ) # 读入视频文件
c = 1
caps = 0
if vc.isOpened(): # 判断是否正常打开
rval, frame = vc.read()
caps = vc.get(7) # 获取视频总帧数
else:
rval = False
timeF = int(caps / 30)
timeF = 100 # 视频帧计数间隔频率
i = 1
while rval: # 循环读取视频帧
rval, frame = vc.read()
# print("c="+str(c))
if (c % timeF == 0): # 每隔timeF帧进行存储操作
path = 'D:\picture\pi' + str(i).zfill(6) + '.jpg'
print("正在保存:" + path)
cv2.imwrite(path, frame) # 存储为图像
i = i + 1
c = c + 1
cv2.waitKey(1)
vc.release()
python3 capture.py
人脸收集
可以通俗的理解为注