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
按照国际标准这里应该放一张图的
总结
原作者万壑说到,模型有过拟合的问题。在训练的时候如果epoch太高,会发现accuray虽然逐步提高甚至到达95%以上,但是实际test的准确度要比training的时候低很多,这个就说明模型出现了过拟合的问题。解决办法,增加样本类别和样本数,这个需要花费很多功夫;调整模型,但是在样本数量比较小的时候不是很显著。
另外放上我修改后使用的代码吧,里边改成了相对路径。点这下载–>faceRecognition
再次感谢前辈的踩坑带路。