Opencv Python 人脸识别尝试——knn与深度学习
Contents
引言
人脸识别和人脸检测不同,人脸检测时检测到人脸位置,而人脸识别是基于人脸数据库,进行一些识别操作如识别某一个人像是数据库中的哪个标签。
需要说明的是,使用knn和Dense层的神经网络作为人脸识别算法只是我的尝试,在实际的使用中基本不使用这两种算法的。同时,经过实际测试,这样得到的结果极不准确,甚至可以说毫无效果(苦笑)。
人脸数据获取
进行人脸识别首先要有人脸数据库,我们可以用opencv调用摄像头,进行人脸检测,并将人脸灰度图片写入到(200, 200)的pgm文件作为我们的人脸数据库。
code
|
|
处理图片读取到并数组中
这个代码是读取数据的模块,在后面的代码中多次调用以获取数据。 将上一步存储的图片数据转化为可处理的numpy数组,提供了两种相似的接口函数。
read_images 为普通的读取到灰度的pgm图片返回的数组 read_images_binary 是将pgm图片进行了二值化处理得到的数组数据
返回的数据类型为 list, list, dict 分别为 图片数据、图片标签、标签和人名的映射字典
|
|
调用opencv内置函数进行人脸识别
内置的三种人脸识别函数
|
|
调用opencv-python提供的这三种人脸识别函数,发现效果都不好。人脸总是检测错误,准确率极低,要它何用?(不知道是不是我使用姿势不太正确)于是我催生出自己实现人脸识别算法那的念头。
观察框出的人脸,觉得一个人的人脸图片,单单框出了人脸,那应该相似度很高啊。类似于手写数字识别,简单的knn算法可以达到很高的正确率,那么是不是可以用knn较好的解决这个问题。
实践出来的结果是:不是的。
code
|
|
knn算法进行人脸识别
简单的knn模板
knn 实现
|
|
调用knn的主体部分
|
|
使用Dense层神经网络进行人脸识别
简单的神经网络多分类器实现(效果不好,大概是数据太少,每个人只有200张(200, 200) 的pgm图片数据。
调用keras的高级API,搭积木一样的建立神经网络。
即使是这么少的数据,训练一次的时间也要好几分钟。调参调了好久,关键是调不出效果啊~
|
|
主体部分
|
|
一些小知识点
opencv putText无法写中文
putText()不能直接写上中文,那就用PIL库曲线救国了。下面是一个demo。
|
|
二值化图片
使用cv2.threshold()
函数,设置cv2.THRESH_BINARY
参数进行二值化。可以设置阈值。
|
|
路径目录测试
由于代码文件和图片文件中间隔了两个文件夹,且图片所在文件夹名称代表图片标签名称,所以如何遍历文件夹,读取到有用的信息是个技术活。
|
|
np.random.shuffle() 测试
np.random.shuffle()
能够将某一迭代对象进行打乱。
会直接改变传递给他的对象,而不会返回值,需要注意。
用这个函数,生成索引的随机排列,可以很方便的得到打乱的数据和标签,从而更好的进行训练。
|
|
keras保存和恢复模型
from tensorflow.keras import models
model.save('dense_model_7.h5')
model = models.load_model('dense_model_6.h5')
就不用每次都重新训练了。
Author 姬小野
LastMod 2019-06-08