# 前言
本教程是教程是介绍如何使用Tensorflow实现的MTCNN和MobileFaceNet实现的人脸识别,并不介绍如何训练模型。关于如何训练MTCNN和MobileFaceNet,请阅读这两篇教程 [MTCNN-Tensorflow](https://github.com/AITTSMD/MTCNN-Tensorflow) 和 [MobileFaceNet_TF](https://github.com/sirius-ai/MobileFaceNet_TF) ,这两个模型都是比较轻量的模型,所以就算这两个模型在CPU环境下也有比较好的预测速度,众所周知,笔者比较喜欢轻量级的模型,如何让我从准确率和预测速度上选择,我会更倾向于速度,因本人主要是研究深度学习在移动设备等嵌入式设备上的的部署。好了,下面就来介绍如何实现这两个模型实现三种人脸识别,使用路径进行人脸注册和人脸识别,使用摄像头实现人脸注册和人脸识别,通过HTTP实现人脸注册和人脸识别。
# 本地人脸图像识别
本地人脸图像识别就是要通过路径读取本地的图像进行人脸注册或者人脸识别,对应的代码为`path_infer.py`。首先要加载好人脸识别的两个模型,一个是人脸检测和关键点检测模型MTCNN和人脸识别模型MobileFaceNet,加载这两个模型已经封装在一个工具中了,方便加载。
然后`add_faces()`这个函数是从`temp`路径中读取手动添加的图片的人脸库中,具体来说,例如你有100张已经用人脸中对应人名字来命名图片文件名,但是你不能直接添加到人脸库`face_db`中,因为人脸库中是存放经过MTCNN模型处理过的图片,所以大规模添加人脸图片需要通过暂存在`temp`文件夹中的方式来然程序自动添加。最后是读取人脸库中图像,通过MobileFaceNet预测获取每张人脸的特征值存放在到一个列表中,等着之后的人脸对比识别。
```python
# 检测人脸检测模型
mtcnn_detector = load_mtcnn()
# 加载人脸识别模型
face_sess, inputs_placeholder, embeddings = load_mobilefacenet()
# 添加人脸
add_faces(mtcnn_detector)
# 加载已经注册的人脸
faces_db = load_faces(face_sess, inputs_placeholder, embeddings)
```
人脸注册是通过图像路径读取人脸图像,然后使用MTCNN检测图像中的人脸,并通过人脸关键点进行人脸对齐,最后裁剪并缩放成112*112的图片,并以注册名命名文件存储在人脸库中。
```python
def face_register(img_path, name):
image = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), 1)
faces, landmarks = mtcnn_detector.detect(image)
if faces.shape[0] is not 0:
faces_sum = 0
bbox = []
points = []
for i, face in enumerate(faces):
if round(faces[i, 4], 6) > 0.95:
bbox = faces[i, 0:4]
points = landmarks[i, :].reshape((5, 2))
faces_sum += 1
if faces_sum == 1:
nimg = face_preprocess.preprocess(image, bbox, points, image_size='112,112')
cv2.imencode('.png', nimg)[1].tofile('face_db/%s.png' % name)
print("注册成功!")
else:
print('注册图片有错,图片中有且只有一个人脸')
else:
print('注册图片有错,图片中有且只有一个人脸')
```
人脸识别是通过图像路径读取将要识别的人脸,通过经过MTCNN的检测人脸和对其,在使用MobileFaceNet预测人脸的特征,最终得到特征和人脸库中的特征值比较相似度,最终得到阈值超过0.6的最高相似度结果,对应的名称就是该人脸识别的结果。最后把结果在图像中画框和标记上名称并显示出来。
```python
def face_recognition(img_path):
image = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), 1)
faces, landmarks = mtcnn_detector.detect(image)
if faces.shape[0] is not 0:
faces_sum = 0
for i, face in enumerate(faces):
if round(faces[i, 4], 6) > 0.95:
faces_sum += 1
if faces_sum > 0:
# 人脸信息
info_location = np.zeros(faces_sum)
info_location[0] = 1
info_name = []
probs = []
# 提取图像中的人脸
input_images = np.zeros((faces.shape[0], 112, 112, 3))
for i, face in enumerate(faces):
if round(faces[i, 4], 6) > 0.95:
bbox = faces[i, 0:4]
points = landmarks[i, :].reshape((5, 2))
nimg = face_preprocess.preprocess(image, bbox, points, image_size='112,112')
nimg = nimg - 127.5
nimg = nimg * 0.0078125
input_images[i, :] = nimg
# 进行人脸识别
feed_dict = {inputs_placeholder: input_images}
emb_arrays = face_sess.run(embeddings, feed_dict=feed_dict)
emb_arrays = sklearn.preprocessing.normalize(emb_arrays)
for i, embedding in enumerate(emb_arrays):
embedding = embedding.flatten()
temp_dict = {}
# 比较已经存在的人脸数据库
for com_face in faces_db:
ret, sim = feature_compare(embedding, com_face["feature"], 0.70)
temp_dict[com_face["name"]] = sim
dict = sorted(temp_dict.items(), key=lambda d: d[1], reverse=True)
if dict[0][1] > VERIFICATION_THRESHOLD:
name = dict[0][0]
probs.append(dict[0][1])
info_name.append(name)
else:
probs.append(dict[0][1])
info_name.append("unknown")
for k in range(faces_sum):
# 写上人脸信息
x1, y1, x2, y2 = faces[k][0], faces[k][1], faces[k][2], faces[k][3]
x1 = max(int(x1), 0)
y1 = max(int(y1), 0)
x2 = min(int(x2), image.shape[1])
y2 = min(int(y2), image.shape[0])
prob = '%.2f' % probs[k]
label = "{}, {}".format(info_name[k], prob)
cv2img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
pilimg = Image.fromarray(cv2img)
draw = ImageDraw.Draw(pilimg)
font = ImageFont.truetype('font/simfang.ttf', 18, encoding="utf-8")
draw.text((x1, y1 - 18), label, (255, 0, 0), font=font)
image = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
cv2.rectangle(image, (x1, y1), (x2, y2), (255, 0, 0), 2)
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
最后的动时选择是人脸注册还是人脸识别。
```python
if __name__ == '__main__':
i = int(input("请选择功能,1为注册人脸,2为识别人脸:"))
image_path = input("请输入图片路径:")
if i == 1:
user_name = input("请输入注册名:")
face_register(image_path, user_name)
elif i == 2:
face_recognition(image_path)
else:
print("功能选择错误")
```
日志输出如下:
```
loaded face: 张伟.png
loaded face: 迪丽热巴.png
请选择功能,1为注册人脸,2为识别人脸:1
请输入图片路径:test.png
请输入注册名:夜雨飘零
注册成功!
```
识别效果图:
![](https://s1.ax1x.com/2020/07/20/Uf5q5n.jpg)
# 相机人脸识别
在`camera_infer.py`实现使用相机的人脸识别,通过调用相机获取图像,进行人脸注册和人脸识别,在使用人脸注册或者人脸识别之前,同样先加载人脸检测模型MTCNN和MobileFaceNet,并将临时`temp`文件夹中的人脸经过MTCNN处理添加到人脸库中,最后把人脸库中的人脸使用MobileFaceNet预测得到特征值,并报特征值和对应的人脸名称存放在列表中。
```python
# 检测人脸检测模型
mtcnn_detector = load_mtcnn()
# 加载人脸识别模型
face_sess, inputs_placeholder,
没有合适的资源?快使用搜索试试~ 我知道了~
基于MTCNN和MobileFaceNet实现的人脸识别,提供三种预测方式,满足各种需求
共31个文件
py:13个
data-00000-of-00001:3个
checkpoint:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 117 浏览量
2023-08-25
13:17:01
上传
评论
收藏 13.87MB ZIP 举报
温馨提示
本教程是教程是介绍如何使用Tensorflow实现的MTCNN和MobileFaceNet实现的人脸识别,并不介绍如何训练模型。关于如何训练MTCNN和MobileFaceNet,请阅读这两篇教程 MTCNN-Tensorflow 和 MobileFaceNet_TF ,这两个模型都是比较轻量的模型,所以就算这两个模型在CPU环境下也有比较好的预测速度,众所周知,笔者比较喜欢轻量级的模型,如何让我从准确率和预测速度上选择,我会更倾向于速度,因本人主要是研究深度学习在移动设备等嵌入式设备上的的部署。好了,下面就来介绍如何实现这两个模型实现三种人脸识别,使用路径进行人脸注册和人脸识别,使用摄像头实现人脸注册和人脸识别,通过HTTP实现人脸注册和人脸识别。
资源推荐
资源详情
资源评论
收起资源包目录
Tensorflow-FaceRecognition-master.zip (31个子文件)
Tensorflow-FaceRecognition-master
networks
mtcnn_model.py 14KB
MobileFaceNet.py 14KB
font
simfang.ttf 10.09MB
detection
__init__.py 0B
fcn_detector.py 2KB
detector.py 3KB
nms.py 1KB
MtcnnDetector.py 17KB
utils
utils.py 4KB
face_preprocess.py 2KB
templates
index.html 3KB
camera_infer.py 5KB
face_db
张伟.png 23KB
models
mobilefacenet_model
MobileFaceNet_9925_9680.pb 5.68MB
mtcnn_model
PNet_landmark
checkpoint 71B
PNet-18.index 1KB
PNet-18.data-00000-of-00001 54KB
PNet-18.meta 202KB
ONet_landmark
checkpoint 71B
ONet-16.index 2KB
ONet-16.meta 243KB
ONet-16.data-00000-of-00001 2.97MB
RNet_landmark
checkpoint 71B
RNet-14.meta 221KB
RNet-14.index 1KB
RNet-14.data-00000-of-00001 792KB
.gitignore 87B
server_main.py 6KB
README.md 20KB
path_infer.py 5KB
config.py 327B
共 31 条
- 1
资源评论
程序员柳
- 粉丝: 8293
- 资源: 1469
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功