Tensorflow+opencv2实现人脸识别

配置

  • python3
  • Tensorflow
  • opencv2

步骤

  1. 获取并显示摄像头实时视频&读取本地视频
  2. 从实时视频流中识别出人脸区域
  3. 准备人脸数据
  4. 建立CNN(卷积神经网络)模型
  5. 利用keras库训练人脸识别模型
  6. 利用训练数据进行识别人脸

获取并显示摄像头实时视频&读取本地视频

利用OpenCV读取视频流

1
2
3
4
5
6
7
8
cv2.namedWindow(window_name)
# 视频来源
cap = cv2.VideoCapture(camera_idx)
# 读取视频信息
while cap.isOpened():
frame = cap.read() #读取一帧数据
# 显示图像
cv2.imshow(window_name, frame)

释放视频信息并销毁所有窗口

1
2
3
# 释放摄像头并销毁所有窗口
cap.release()
cv2.destroyAllWindows()

从实时视频流中识别出人脸区域

使用人脸识别分类器

opencv自带许多个人脸识别分类器,可以看下官方源码

1
2
3
4
5
6
# 使用人脸识别分类器
classfier = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
# 识别出人脸后要画的边框的颜色,RGB格式
color = (0, 255, 0)
# 将当前帧转换成灰度图像
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

人脸检测并框出人像

读取视频信息后

1
2
3
4
5
6
7
# 人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 1, minSize = (64, 64))

if len(faceRects) > 0: #大于0则检测到人脸
for faceRect in faceRects: #单独框出每一张人脸
x, y, w, h = faceRect
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)

准备人脸数据

把框出的人脸数据保存为图片

  • num是图片数
    1
    2
    3
    4
    # 将当前帧保存为图片
    img_name = '%s/%d.jpg'%(path_name, num)
    image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
    cv2.imwrite(img_name, image)

显示当前捕捉到了多少人脸图片

1
2
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame,'num:%d' % (num),(x + 30, y + 30), font, 1, (255,0,255),4)

完整代码

地址

效果如下

mark

错误

error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale

路径错误提示: 找不到你的xml文件,说明你的xml的路径出错了

eg:我的xml在data文件下的data文件中

Keras 2.0版本运行无更新函数出错

Update your Conv2D call to the Keras 2 API

出现这些警告是由于keras的版本更新的问题

Keras 2.0版本中,定义卷积层需要用Conv2D而不再是Convolution2D 即使用

1
model.add(Conv2D(64, 3, 3, border_mode='same'))

而不是

1
model.add(Convolution2D(64, 3, 3, border_mode='same'))

同时更改import

1
from keras.layers import Conv2D

Keras测试错误ProgbarLogger' no attribute 'log_values

由无使用Conv2D函数而引发的错误 描述为:没找到log_values属性 解决方法: 在定义卷积层时使用Conv2D函数,该错误消失

参考资料