1、概述

上一讲,我们讲了人脸识别的基本原理,这一讲,我们用tensorflow来实现它。

2、下载LFW人脸数据集

2.1、LFW数据集简介

LFW人脸数据集主要用来研究非受限情况下的人脸识别问题,包含13000张人脸图像,每张图像都被标识出对应的人名,其中,有1680张图像对应不止一个人名。这些图片都来自互联网。

2.2、LFW数据集下载

下载链接为,

http://vis-www.cs.umass.edu/lfw/lfw.tgz

大概180.6M

2.3、LFW数据集结构

下载完数据集后,将其解压,得到文件夹lfw。lfw文件夹里有5749个子文件夹,每个子文件夹名对应一个人名,而子文件夹里则包含这个人名的人脸图片。

3、FaceNet库

3.1、FaceNet库简介

FaceNet论文链接为:

http://www.goodtimesweb.org/surveillance/2015/1503.03832v1.pdf

它求两张图片所对应特征的欧几里得空间距离来描述两张图片的近似度,跟我们上一讲说的方法一样。如下图所示,

其中,图像之间的数字表示图像特征之间的欧几里得距离,每一行的两种图片为同一个人。可以看到,图像类内距离要小于类间距离的,阈值为1.1左右。

3.2、下载FaceNet库源码和模型

FaceNet在github的链接为,

https://github.com/davidsandberg/facenet/tree/master

FaceNet库源码下载链接:

https://codeload.github.com/davidsandberg/facenet/zip/master

源码文件解压,得到如下结构,

FaceNet库模型下载链接:

https://drive.google.com/open?id=1EXPBSXwTaqrSC0OhUdXNmKSh9qJUQ55-

上面的链接被墙了~

如果不能翻墙,可以通过下面的链接下载:

https://download.csdn.net/download/rookie_wei/10609076

解压,得到四个文件,

4、安装依赖

打开requirements.txt文件,删除tensorflow==1.7,执行命令,

sudo pip3 install -r requirements.txt

即可。

5、预处理-人脸检测和人脸对齐

我们先使用MTCNN进行人脸检查和人脸对齐,且统一缩放到合适的大小。

MTCNN的实现在src/align/文件夹下,detect_face.py定义了MTCNN的模型结构,主要由P-Net、R-Net、O-Net网络构成。det1.npy、det2.npy、det3.npy分别对应于这三个网络已经训练好的模型,align_dataset_mtcnn.py是入口代码。

先说一下文件结构,FaceNet源码库解压得到facenet-master文件夹,FaceNet库模型解压得到20180402-114759文件夹,LFW数据集解压得到lfw文件夹。

在facenet-master里执行以下命令就可以对LFW数据库进行人脸检测和人脸对齐。

python src/align/align_dataset_mtcnn.py ../lfw ../lfw_align_160 --image_size 160 --margin 32 --random_order

执行结果,

Traceback (most recent call last):

File "src/align/align_dataset_mtcnn.py", line 34, in <module>

import facenet

ImportError: No module named 'facenet'

报错,找不到facenet模块,可以看到在src/文件夹下有facenet.py和__init__.py文件,将src/文件夹加到PYTHONPATH环境变量下好了。执行以下命令,

export PYTHONPATH=$PATH:/home/wilf/tensorflow-master/demo/face/facenet-master/src

为了避免每次开机都执行,将其写到~/.bashrc文件中。

再次运行上面的命令,得到以下结果说明成功。

来看看运行的结果得到了什么鬼?

上图是对比Aaron_Eckhart文件夹下处理之前和处理之后的图片。左边是未处理的图片,右边是处理后的图片,可以看到,左边是人的半身照,右边是人脸照,并且,右边图像的大小是160×160。

对比Aaron_Guiel文件夹的结果也是一样的。这样我们就完成了图像的预处理--人脸检测和人脸对齐。

6、在LFW数据库中验证已有模型

上面我们已经准备好所有数据了,现在只要动动手指就可以了,在facenet-master文件夹下执行以下命令,

python src/validate_on_lfw.py ../lfw_align_160/ ../20180402-114759

很不幸,报错了,

2018-08-25 19:22:35.215465: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMAModel directory: ../20180402-114759Metagraph file: model-20180402-114759.metaCheckpoint file: model-20180402-114759.ckpt-2752018-08-25 19:22:37.416049: W tensorflow/core/graph/graph_constructor.cc:1255] Importing a graph with a lower producer version 24 into an existing graph with producer version 26. Shape inference will have run different parts of the graph with different producer versions.Traceback (most recent call last):File "src/validate_on_lfw.py", line 164, in <module>main(parse_arguments(sys.argv[1:]))File "src/validate_on_lfw.py", line 73, in mainfacenet.load_model(args.model, input_map=input_map)File "/home/wilf/tensorflow-master/demo/face/facenet-master/src/facenet.py", line 381, in load_modelsaver = tf.train.import_meta_graph(os.path.join(model_exp, meta_file), input_map=input_map)File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/training/saver.py", line 1939, in import_meta_graph**kwargs)File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/meta_graph.py", line 779, in import_scoped_meta_graphproto, import_scope=scope_to_prepend_to_names))File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/control_flow_ops.py", line 1775, in from_protoimport_scope=import_scope)File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/control_flow_ops.py", line 1683, in __init__self._init_from_proto(context_def, import_scope=import_scope)File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/control_flow_ops.py", line 1715, in _init_from_protoimport_scope=import_scope)File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/control_flow_ops.py", line 1488, in __init__self._init_values_from_proto(values_def, import_scope=import_scope)File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/control_flow_ops.py", line 1520, in _init_values_from_protog.as_graph_element(op)._set_control_flow_context(self)File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py", line 3339, in as_graph_elementreturn self._as_graph_element_locked(obj, allow_tensor, allow_operation)File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py", line 3399, in _as_graph_element_locked"graph." % repr(name))KeyError: "The name 'decode_image/cond_jpeg/is_png' refers to an Operation not in the graph."

百度了以下,没找到原因,我估计是tensorflow版本问题,因为我电脑安装的tensorflow是1.9,而打开facenet-master/requirements.txt文件看到要求tensorflow要求的版本是1.7,

所以对tensorflow降级试试,修改

tensorflow==1.7

tensorflow-gpu==1.7

因为我们要用GPU的版本,接着执行,

sudo pip3 install -r requirements.txt

然后,在python里运行

>>> import tensorflow as tf

没有任何提示,说明通过了。

接着继续执行命令,

python src/validate_on_lfw.py ../lfw_align_160/ ../20180402-114759

没有出错,说明真的是FaceNet和tensorflow版本不匹配的问题。运行结果如下,

在LFW数据集上大概由98.47%的准确率。

7、在自己的数据上应用


上面的例子验证了FaceNet的准确率,现在,我们来计算图片之间的“距离”。首先,准备三张图片,

分别命令0.JPG、1.JPG、2.JPG,其中1.JPG和2.JPG是同一个人,将它们放在test_images文件夹下,然后执行命令,

python src/compare.py ../20180402-114759 ../test_images/0.JPG ../test_images/1.JPG ../test_images/2.JPG

得到结果如下,

可以看到,相同图片的“距离”为0, 同一个人的两张图片的“距离”小于不同人的图片的“距离”。

总结:

这一讲没有自己写什么代码,本着快速学习tensorflow的目的,我暂时不深究代码实现,要学习的内容还有很多,我想先有个全局观,做什么应用的时候,再去深究它。下一讲,我们训练自己的模型。

tensorflow精进之路(二十七)——人脸识别(中)(MTCNN人脸检查和人脸对齐+FaceNet模型)相关推荐

  1. tensorflow精进之路(二十六)——人脸识别(上)(MTCNN原理)

    1.概述 换了个固态硬盘,本想装最新的系统mint 19,谁知道却是个坑,NVIDIA驱动和CUDA工具老是装不上去,各种问题,折腾了几天,还是用回了原来的系统.不过,这次软件改了一下,使用了pyth ...

  2. tensorflow精进之路(二十八)——人脸识别(下)(MTCNN人脸检查和人脸对齐+CASIA-WebFace数据集模型)

    1.概述 这一讲,我们来训练自己的人脸识别模型. 2.下载CASIA-WebFace人脸数据集 CASIA-WebFace人脸数据集包含了10575个人的494414张人脸图片,需要在 http:// ...

  3. tensorflow精进之路(二十一)——使用slim模型对图像识别与检测(上)(Inception_ResNet_v2模型)

    1.概述 上一讲,我们使用了slim训练了自己的数据,主要用于分类任务.这一讲,我们还是继续学习slim库,用它来对图像进行识别和检测. 2.下载Inception_ResNet_v2模型 第十六讲中 ...

  4. tensorflow精进之路(二十五)——Object Detection API目标检测(下)(VOC数据集训练自己的模型进行目标检测)

    1.概述 上一讲,我们使用了别人根据COCO数据集训练好的模型来做目标检测,这一讲,我们就来训练自己的模型. 2.下载数据集 为了方便学习,我们先使用别人整理好的数据集来训练---VOC 2012数据 ...

  5. tensorflow精进之路(二十四)——Object Detection API目标检测(中)(COCO数据集训练的模型—ssd_mobilenet_v1_coco模型)

    1.概述 上一讲简单的讲了目标检测的原理以及Tensorflow Object Detection API的安装,这一节继续讲Tensorflow Object Detection API怎么用. 2 ...

  6. tensorflow精进之路(二十三)——Object Detection API目标检测(上)(Fast R-CNN算法)

    1.概述 上一讲,我们使用slim库对图片进行检测,每个物品用同一种颜色标注,显得乱七八糟的.这一讲,我们来学习目标检测.目标检测就是,输入一张图片,输出是将该图片中所含的所有目标物体识别,并标记出他 ...

  7. tensorflow精进之路(二十二)——使用slim模型对图像识别与检测(下)(VGG19模型)

    1.概述 上一节使用slim对图像进行识别,但是一张图片里就识别出一样东西,这节我们就来学习怎么检测图片里更多的物品.上一节我们使用的是Inception-ResNet-v2模型,这一节我们使用的是V ...

  8. tensorflow精进之路(二十)——使用slim模型库训练自己的数据

    1.概述 上一节,我们使用python3爬取了百度图片的一些图片数据,这一节,我们就使用这些爬取下来的图片,训练我们自己的模型,用来识别猪.蛇.狗.大象.老虎这五种动物.在这里吐嘲一下百度图片搜索结果 ...

  9. 人脸识别中的深度学习

    深度学习在人脸识别中的应用 人脸识别的过程包括: 人脸检测 人脸对齐 特征提取(在数学上,实质上是:空间变换) 特征度量 其中,特征提取与度量,是人脸识别问题中的关键问题,也是相关研究的难点之一. 传 ...

最新文章

  1. 中国电子学会青少年编程能力等级测试图形化一级编程题:小鸡与鸭妈拥抱
  2. (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)决了当时的问题,那时LZ接触JAVA刚几个月,比葫芦画瓢的用了观察者模式。...
  3. asyncio.Protocol socket 断线重连
  4. iOS开发(1)写在前面的话
  5. DP——背包问题(一)
  6. hbase里插入big int数据用Phoenix查看的报错问题
  7. Thinkphp编辑器扩展类kindeditor用法
  8. 从0到1搞一波dubbo
  9. Spring AOP切入点与通知XML类型
  10. 指令重排序及Happens-before法则随笔
  11. QT5开发及实例学习之十九图形视图体系结构
  12. 初中数学最全几何模型_老师熬夜整理:初中数学最全几何模型大汇总,学生大呼“过瘾”...
  13. View 绘制体系知识梳理(4) 绘制过程之 Layout 详解
  14. [转载] Python程序将十进制转换为二进制,八进制和十六进制
  15. [POJ1830] 开关问题
  16. 海量数据存储 - 性能瓶颈 - 解决方案
  17. 苹果生产日期对照表2020_AirPods Pro 出现静电噪音,如何参与苹果免费维修服务计划?...
  18. Linux课程--实验四 shell 编程
  19. CF711C三维DP
  20. 分享靠写代码赚钱的一些门路

热门文章

  1. hadoop3.1集成tez和tez-ui
  2. 【李宏毅2020 ML/DL】补充:Meta Learning - Gradient Descent as LSTM
  3. 改造二叉树 (长乐一中模拟赛day2T1)
  4. 嵌入式linux ntpd命令,嵌入式Linux网络编程之:实验内容——NTP协议实现
  5. 2021四川高考成绩位次查询,2021年四川高考位次查询及一分一段表排名查询
  6. 打开outlook2010里面的链接显示 “由于本机的限制,该操作已被取消。请与系统管理员联系。”解决方法...
  7. 开源数据库:何为NoSQL生态系统?
  8. java 将bean转化为map,将javabean转化为map对象
  9. python程序设计方法学_python学习笔记(12)--程序设计方法学
  10. 配置 Hadoop 时遇到的一些问题