作者想着本次寒假自己动手做一个简单的人脸识别系统。
环境为tensorflow2.0,python3.9.0,opencv3.4.15。
本人新手一枚,代码如有错误还望各位指教。
总体思路是制作数据集—编写模型—训练模型—调整模型。
第一天首先把人脸数据集做好。思路是用opencv来识别人脸(利用笔记本自带摄像头),将人脸裁剪出来,然后统一大小,最后保存。
第一步
导入opencv
import cv2
利用opencv里面自带的人脸识别框架haarcascade来识别人脸。
face_cascade = cv2.CascadeClassifier("E:\\anaconda\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml")#实例化识别框架
第二步
实例化opencv摄像头
cap=cv2.VideoCapture(0 + cv2.CAP_DSHOW)
0表示摄像头用自带的摄像头(如果是外接摄像头则要改变)。后面的‘+ cv2.CAP_DSHOW’是调试的时候短时间内连续打开摄像头就会报错,我参考了一位老哥的帖子加上的,十分感谢。原帖地址
第三步
采集人脸信息。
while True:
ret,img=cap.read()#将摄像头读取到的图像传给参数
cv2.imshow("img",img)#显示图像
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将采集到的图片转为灰度图片
faces = face_cascade.detectMultiScale(gray,1.1,5)#用框架识别图片里的人脸
if len(faces)>0:#如果识别到了人脸
for faceRect in faces:#可能不止一张人脸
x,y,w,h = faceRect#得到人脸的坐标
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)#用矩形框出人脸
if cv2.waitKey(1) & 0xFF == ord('q'):#如果按下q键
cap.release()#释放摄像头
cv2.destroyAllWindows()#关闭所有窗口
break#退出循环
第四步
截取人脸,统一像素并保存
image = gray[y:h+y, x:w+x]#裁剪出人脸
new = cv2.resize(image, (200, 200))#统一像素为200×200(根据后期训练模型可以更改)
cv2.imwrite('E:\\myPicture\\001.jpg', new)#图片保存(地址自行更改)
完整代码如下
import cv2
face_cascade = cv2.CascadeClassifier("E:\\anaconda\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml")#实例化识别框架
cap=cv2.VideoCapture(0 + cv2.CAP_DSHOW)
k = 0
while True:
ret,img=cap.read()#将摄像头读取到的图像传给参数
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将采集到的图片转为灰度图片
faces = face_cascade.detectMultiScale(gray,1.1,5)#用框架识别图片里的人脸
if len(faces)>0:#如果识别到了人脸
for faceRect in faces:#可能不止一张人脸
x,y,w,h = faceRect#得到人脸的坐标
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)#用矩形框出人脸
image = gray[y:h+y, x:w+x]#裁剪出人脸
new = cv2.resize(image, (200, 200))#统一像素为200×200(根据后期训练模型可以更改)
k += 1#K为了改变图片保存地址
cv2.imwrite('E:\\myPicture\\00' + str(k) + '.jpg', new)#图片保存(地址自行更改)
cv2.imshow("img",img)#显示图像
if cv2.waitKey(1) & 0xFF == ord('q'):#如果按下q键
cap.release()#释放摄像头
cv2.destroyAllWindows()#关闭所有窗口
break#退出循环
代码在我的笔记本上运行良好。
还有代码里最好加上延时机制,不然图片保存的太快,很多张都一样的话,就会失了严谨,训练效果不会好。
中间遇到有很多问题,没有在文章里写出来,如果有问题的可以私信我,我看见都会努力解决的。
今天就先这样啦!!!