# 前言
本教程是教程是介绍如何使用 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://www.writebug.com/myres/static/uploads/2022/1/1/6547ed5b8ecd83e5a52507234e64b8c8.writebug)
# 相机人脸识别
在 `camera_infer.py` 实现使用相机的人脸识别,通过调用相机获取图像,进行人脸注册和人脸识别,在使用人脸注册或者人脸识别之前,同样先加载人脸检测模型 MTCNN 和 MobileFaceNet,并将临时 `temp` 文件夹中的人脸经过 MTCNN 处理添加到人脸库中,最后把人脸库中的人脸使用 MobileFaceNet 预测得到特征值,并报特征值和对应的人脸名称存放在列表中。
```python
#
没有合适的资源?快使用搜索试试~ 我知道了~
使用Tensorflow实现的MTCNN和MobileFaceNet实现的人脸识别
共32个文件
py:13个
data-00000-of-00001:3个
checkpoint:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 3 下载量 41 浏览量
2023-02-07
19:25:27
上传
评论 3
收藏 14.06MB ZIP 举报
温馨提示
本教程是教程是介绍如何使用 Tensorflow 实现的 MTCNN 和 MobileFaceNet 实现的人脸识别,并不介绍如何训练模型。关于如何训练 MTCNN 和 MobileFaceNet,请阅读这两篇教程 MTCNN-Tensorflow 和 MobileFaceNet_TF ,这两个模型都是比较轻量的模型,所以就算这两个模型在 CPU 环境下也有比较好的预测速度,众所周知,笔者比较喜欢轻量级的模型,如何让我从准确率和预测速度上选择,我会更倾向于速度,因本人主要是研究深度学习在移动设备等嵌入式设备上的的部署。好了,下面就来介绍如何实现这两个模型实现三种人脸识别,使用路径进行人脸注册和人脸识别,使用摄像头实现人脸注册和人脸识别,通过 HTTP 实现人脸注册和人脸识别。 本地人脸图像识别 本地人脸图像识别就是要通过路径读取本地的图像进行人脸注册或者人脸识别,对应的代码为 path_infer.py。首先要加载好人脸识别的两个模型,一个是人脸检测和关键点检测模型 MTCNN 和人脸识别模型 MobileFaceNet,加载这两个模型已经封装在一个工具中了,方便加载。 然后 add
资源推荐
资源详情
资源评论
收起资源包目录
使用Tensorflow实现的MTCNN和MobileFaceNet实现的人脸识别.zip (32个子文件)
facerecognition_tensorflow
networks
mtcnn_model.py 14KB
MobileFaceNet.py 14KB
font
simfang.ttf 10.09MB
LICENSE 1KB
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
共 32 条
- 1
资源评论
- zl200305062023-05-14感谢资源主分享的资源解决了我当下的问题,非常有用的资源。
- Ophelia172023-04-04非常有用的资源,可以直接使用,对我很有用,果断支持!
- DirectorDi2023-03-10资源有一定的参考价值,与资源描述一致,很实用,能够借鉴的部分挺多的,值得下载。
甜辣uu
- 粉丝: 9455
- 资源: 1102
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- json的合法基色来自红包东i请各位
- 项目采用YOLO V4算法模型进行目标检测,使用Deep SORT目标跟踪算法 .zip
- 针对实时视频流和静态图像实现的对象检测和跟踪算法 .zip
- 部署 yolox 算法使用 deepstream.zip
- 基于webmagic、springboot和mybatis的MagicToe Java爬虫设计源码
- 通过实时流协议 (RTSP) 使用 Yolo、OpenCV 和 Python 进行深度学习的对象检测.zip
- 基于Python和HTML的tb商品列表查询分析设计源码
- 基于国民技术RT-THREAD的MULTInstrument多功能电子测量仪器设计源码
- 基于Java技术的网络报修平台后端设计源码
- 基于Python的美食杰中华菜系数据挖掘与分析设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功