opencv python 人脸识别 相似度_python3.6+opencv+keras等人脸识别匹配初探

本文介绍了在Windows 10系统中,使用Anaconda搭建Python环境,结合OpenCV、Numpy、OS和Keras库进行人脸识别的步骤。通过调试代码解决了Unicode编码错误和级联分类器加载问题。作者分享了如何捕获并裁剪摄像头中的脸部图像,以及训练和保存Keras模型。最后,展示了如何使用训练好的模型进行实时人脸识别。
摘要由CSDN通过智能技术生成

emmm,心血来潮,搞一下子。

参考链接:感谢前辈大佬们的带路!

很喜欢文章中的一句话:如果要真正理解一个东西,我们必须要能够把它创造出来。

扫盲:

运用的技术有opencv(摄像头、图片处理),numpy(图片数字化),os(文件的操作和处理),keras(构建神经网络进行图像识别)。

Anaconda是一个免费且易于使用的科学Python环境。Conda使安装,运行和升级学习环境(如Scikit-learn,TensorFlow和SciPy)变得简单快捷。

运行环境:

Win10 x64、Anaconda3-5.0.0集成了Python 3.6.2 :: Anaconda custom (64-bit)

环境配置

安装好后cmd下用python –version查看能执行吗,没有就自己添加环境变量(根据自己路径修改)

path=%path%;C:\Users\long\Anaconda3;C:\Users\long\Anaconda3\Scripts

使用Anaconda,安装好必要的科学计算包

conda install numpy scipy sklearn keras opencv

权限不够请以管理员身份运行

下载大佬的代码:https://github.com/jerry1900/faceRecognition

其实大佬的代码很棒棒了,你需要的是自己来debug

相关报错处理

为啥要把报错写在前头,既然这坑我踩过了,就告诉你这有坑,你掉进去了蹦出来的也快。。

报错1:unicodeescape’ codec can’t decode bytes in position XXX: truncated

图片路径可能写的有问题,window 读取文件可以用\,但是在字符串中\是被当作转义字符来使用,例如\t可能就转义成tab键了。参考https://blog.csdn.net/u011242657/article/details/64437612

报错2:ascade.detectMultiScale error

获得训练数据集

这里我是用的另一位大佬的代码,稍作修改,大佬文章链接 https://www.cnblogs.com/ylzj/p/8116705.html

第11行请下载分类器放到运行目录,参见上边报错2

import numpy as np

import cv2

import sys

import time

import os

def CatVideo():

cv2.namedWindow("shibie")

#1调用摄像头,这里我用的第二个摄像头,默认应该是0

cap=cv2.VideoCapture(1)

#2人脸识别器分类器

classfier=cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")

color=(0,255,0)

while cap.isOpened():

ok,frame=cap.read()

if not ok:

break

#2灰度转换

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 (x, y, w, h) in faceRects :

listStr = [str(int(time.time())), str(0)] #以时间戳和读取的排序作为文件名称

fileName = ''.join(listStr)

f = cv2.resize(grey[y:(y + h), x:(x + w)], (128, 128))

cv2.imwrite(r'C:\Users\long\Desktop\face\dataset\wangzilong'+os.sep+'%s.jpg' % fileName, f)

cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 3)

cv2.imshow("shibie",frame)

print("ceshi2")

if cv2.waitKey(10)&0xFF==ord('q'):

break

cap.release()

cv2.destroyAllWindows()

CatVideo()

保存运行这个py文件会打开摄像头,自动捕获裁剪成128*128的灰度图片,退出请按q,不然会一直保存下去。

可以修改下路径多获取几个人的进行训练。

构建模型和进行模型训练

train_model.py

keras的后台引擎,三种后端TensorFlow、theano、cntk。

这里源教程用的theano,keras默认后端是tensorflow,我没作修改用的tensorflow.

我修改的是train_model.py的第64行,loss把 categorical_crossentropy修改成了squared_hinge,不然报错训练不通过。

def train_model(self):

self.model.compile(

optimizer='adam', #有很多可选的optimizer,例如RMSprop,Adagrad,你也可以试试哪个好,我个人感觉差异不大

loss='squared_hinge', #你可以选用squared_hinge作为loss看看哪个好 categorical_crossentropy

metrics=['accuracy'])

生成的模型model.h5有98.4MB

打开摄像头验证模型效果

打开read_camera.py

请注意你的self.img_size是否和训练的一致,不然报错

class Camera_reader(object):

#在初始化camera的时候建立模型,并加载已经训练好的模型

def __init__(self):

self.model = Model()

self.model.load()

self.img_size = 128

按照国际标准这里应该放一张图的

408ec8cab79f4e66e0b94b8465fd88fa.png

总结

原作者万壑说到,模型有过拟合的问题。在训练的时候如果epoch太高,会发现accuray虽然逐步提高甚至到达95%以上,但是实际test的准确度要比training的时候低很多,这个就说明模型出现了过拟合的问题。解决办法,增加样本类别和样本数,这个需要花费很多功夫;调整模型,但是在样本数量比较小的时候不是很显著。

另外放上我修改后使用的代码吧,里边改成了相对路径。点这下载–>faceRecognition

再次感谢前辈的踩坑带路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值