目前keras是对人工智能来说,入门比较好的一款中间件,屏蔽了很多参数配置和实现细节,直接一层层进行网络搭建就可以。最近一直在学习相关知识,但是一直也没有啥实用的功能出现,在网上有个例子,一下子就吸引住了我,使用keras迅速搭建一套人工智能系统,输入自己的照片和他人照片,训练其识别出自己,然后使用摄像头验证。
废话不多说,先上结果图:
是不是很6,其实实现起来还是依赖了很多网上的大牛,现在跟着我,咱们一步步实现这些:
前置知识:
tips:跟着一步步做也能实现,建议先看前置知识;环境配置:python3.3 ;keras3;win10,OpenCV3,tensorflow
源码下载:https://github.com/xvshu/kera-demo-findme.git
1,识别人脸(OpenCV3)
import cv2
def CatchUsbVideo(window_name, camera_idx):
cv2.namedWindow(window_name)
#视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
cap = cv2.VideoCapture(camera_idx)
#告诉OpenCV使用人脸识别分类器
classfier = cv2.CascadeClassifier("D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml")
#识别出人脸后要画的边框的颜色,RGB格式
color = (0, 255, 0)
while cap.isOpened():
ok, frame = cap.read() #读取一帧数据
if not ok:
break
#将当前帧转换成灰度图像
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32))
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)
#显示图像
cv2.imshow(window_name, frame)
c = cv2.waitKey(10)
if c & 0xFF == ord('q'):
break
#释放摄像头并销毁所有窗口
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
CatchUsbVideo("find face", 0)
CatchUsbVideo(window_name, camera_idx),中camera_idx是自己的电脑第几个摄像头,我没有扩展,一般就选0,如果你扩展了usb或者有其他摄像头,一类类推就好
2,准备训练数据
2.1准备自己的脸数据
这个好办,我们直接使用上边使用到的技术,自动截取图像就好,稍作添加:
#-*- coding: utf-8 -*-
import cv2
def CatchPICFromVideo(window_name, camera_idx, catch_pic_num, path_name):
cv2.namedWindow(window_name)
#视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
cap = cv2.VideoCapture(camera_idx)
#告诉OpenCV使用人脸识别分类器
classfier = cv2.CascadeClassifier("D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml")
#识别出人脸后要画的边框的颜色,RGB格式
color = (0, 255, 0)
num = 0
while cap.isOpened():
ok, frame = cap.read() #读取一帧数据
if not ok:
break
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #将当前桢图像转换成灰度图像
#人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32))
if len(faceRects) > 0: #大于0则检测到人脸
for faceRect in faceRects: #单独框出每一张人脸
x, y, w, h = faceRect