tensorflow入门教程(二十七)人脸识别(中)

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 FMA

Model directory: ../20180402-114759

Metagraph file: model-20180402-114759.meta

Checkpoint file: model-20180402-114759.ckpt-275

2018-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 main

    facenet.load_model(args.model, input_map=input_map)

  File "/home/wilf/tensorflow-master/demo/face/facenet-master/src/facenet.py", line 381, in load_model

    saver = 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_graph

    proto, 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_proto

    import_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_proto

    import_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_proto

    g.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_element

    return 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的目的,我暂时不深究代码实现,要学习的内容还有很多,我想先有个全局观,做什么应用的时候,再去深究它。下一讲,我们训练自己的模型。

猜你喜欢

转载自blog.csdn.net/rookie_wei/article/details/82078373