基于facenet人脸识别设计文档

基于facenet人脸识别设计文档

一、概述

在Ubuntu系统上,创建人脸库搭建基于facenet的人脸识别库,本文采用Python从百度下载明星照片,通过facenet的检测对齐人脸函数制作人脸库,并使用facenet做人脸识别。

二、环境搭建

1、安装Python2.7

sudo apt-get update

sudo apt-get install python2.7

sudo apt-get install python2.7 -dev

sudo update-alternatives –install /usr/bin/python python /usr/bin/python2 100

python --version

2、更新pip

根据ubuntu系统中python 2.7版本安装对应的pip

sudo apt-get install python-pip

升级pip:

sudo pip install --upgrade pip

3、安装tensorflow

安装最新版:

sudo pip install tensorflow

安装指定版本:

sudo pip install tensorflow==1.14

4、安装anaconda

1)Anaconda官网下载链接:https://www.anaconda.com/distribution/,选择linux下的Python2.7版本。

基于facenet人脸识别设计文档

2)如果没有修改地址,默认的安装包的目录在/home/ lq/下载,进入安装包所在的目录,执行以下命令,进行安装:

bash Anaconda2-2019.10-Linux-x86_64.sh

一路回车,到下图位置,回复yes,直至安装完成。

基于facenet人脸识别设计文档

3)安装完成后,提示是否添加环境变量,输入yes后回车,根据需要填入环境路径,再执行命令让配置的环境变量生效:

expert PYTHONPATY=$PYTHONPATY:/home/lq/anaconda2

source ~/.bashrc

4)运行python,会出现如下显示,则安装成功。

基于facenet人脸识别设计文档

 

5、下载facenaet源码

git clone https://github.com/davidsandberg/facenet.git,目录名为:facenet-master

6、安装facenet依赖库

包括:numpy、scipy、scikit-learn、opencv-python、h5py、matplotlib、Pillow、requests和psutil。

命令:pip install -r requirements.txt

sudo gedit ~/.bashrc

但会报numpy、scipy、scikit-learn、opencv-python版本不匹配的错误。因此需要对以上依赖库做版本修改和单独的安装。

安装numpy:

conda install numpy=1.16.2

sudo pip install numpy==1.16.2

安装scipy:

conda install scikit-learn=0.20.3

sudo pip install -U scikit-learn==0.20.3

安装scikit-learn:

conda install scikit-learn=0.20.3

sudo pip install -U scikit-learn==0.20.3

更新scikit-learn:

conda update scikit-learn

       安装opencv-python:

       sudo apt-get install opencv-python

conda install opencv-python

pip install opencv-python

安装requests:

       sudo apt-get install requests

       查看facenet依赖库的版本:

conda list

三、创建人脸库

1、下载预先训练的模型:facenet提供两个预训练模型,分别是基于CASIA-WebFace和MS-Celeb-1M人脸库训练的,下载完成后,把预训练模型的文件夹20170512-110547放入facenet-master/src/models文件夹下。

基于facenet人脸识别设计文档

2、下载lfw数据集:

下载地址:http://vis-www.cs.umass.edu/lfw/#resources,将解压后的文件夹放入到facenet-master/src/data/raw中。

3、预处理lfw数据集:对lfw数据集进行align_dataset_mtcnn.py处理,校准为和训练模型使用的数据集大小一致的图形后存储在lfw_160文件夹中,缩放为160*160,python命令如下:

$ python align/align_dataset_mtcnn.py data/raw/lfw data/lfw/lfw_160--image_size 160 --margin 32 --random_order --gpu_memory_fraction 0.25。

4、在LFW数据库中验证预先训练的模型,运行Python命令测试训练模型的准确率:

$ python validate_on_lfw.py data/lfw/lfw_160 models/20170512-110547

结果如下:

基于facenet人脸识别设计文档

5、运行compare.py做人脸对比,python命令如下:

$ python compare.py models/20170512-110547 1.png 2.png

结果如下:

基于facenet人脸识别设计文档

理论上:同一个人的图片,测试得到的距离值偏小,而不同的人测试得到的距离偏大。正常情况下同一个人测得距离应该小于1,不同人测得距离应该大于1。但限于选取图片的关系,会出现不太尽如人意的效果,因此后期需要以华人的数据集来进行模型的训练。

6、Python编程download_Image_baidu.py获取百度图片,代码如下:(找的代码进行修改)

# coding=utf-8
"""
爬取百度图片的高清原图
"""

import re

import sys

import urllib

import os

import requests
def get_onepage_urls(onepageurl):
if not onepageurl:
print('
执行结束')
return [], ''
try:
html = requests.get(onepageurl).text
except Exception as e:
print(e)
pic_urls = []
fanye_url = ''
return pic_urls, fanye_url
pic_urls = re.findall('"objURL":"(.*?)",', html, re.S)
fanye_urls = re.findall(re.compile(r'<a href="(.*)" class="n">
下一页</a>'), html, flags=0)
fanye_url = 'http://image.baidu.com' + fanye_urls[0] if fanye_urls else ''
return pic_urls, fanye_url

def down_pic(pic_urls,pic_name,localPath):
if not os.path.exists(localPath): #
新建文件夹
os.mkdir(localPath)
"""
给出图片链接列表, 下载图片"""
for i, pic_url in enumerate(pic_urls):
try:
pic = requests.get(pic_url, timeout=15)
string = pic_name + "_" + str(i + 1) + '.jpg'
with open(localPath + '%s' % string, 'wb')as f:
f.write(pic.content)
print('
成功下载第%s张图片: %s' % (str(i + 1), str(pic_url)))
except Exception as e:
print('
下载第%s张图片时失败: %s' % (str(i + 1), str(pic_url)))
print(e)
continue

if __name__ == '__main__':
keyword = '
范冰冰1920*1080' # 关键词, 改为你想输入的词即可
url_init_first = r'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1497491098685_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&ctd=1497491098685%5E00_1519X735&word='
url_init = url_init_first + urllib.parse.quote(keyword, safe='/')
all_pic_urls = []
onepage_urls, fanye_url = get_onepage_urls(url_init)
all_pic_urls.extend(onepage_urls)

fanye_count = 1 #
图片所在页数,下载完后调整这里就行
while 1:
onepage_urls, fanye_url = get_onepage_urls(fanye_url)
fanye_count += 1
print('
%s' % fanye_count)
if fanye_url == '' and onepage_urls == []:
break
all_pic_urls.extend(onepage_urls)

down_pic(list(set(all_pic_urls)),'fbb',/data/face_store/fbb/')#
保存位置也可以修改

7、基于mtcnn对爬取到的图片做预处理,得到人脸库:

$ python align/align_dataset_mtcnn.py data/face_store_160_3 data/face_store_160_4 --image_size 160 --margin 32 --random_order --gpu_memory_fraction 0.25。

四、训练人脸识别库

1、训练自己的模型,使用train_triplestloss.py训练算法:

$ python src/train_tripletloss.py --data_dir ~/facenet-master/data/lfw/lfw_160/ --logs_base_dir ./logs/ --models_base_dir ./models_cslead/ --image_size 160 --model_def models.inception_resnet_v1 --optimizer RMSPROP --learning_rate 0.01 --weight_decay 1e-4 --gpu_memory_fraction 1.0 --max_nrof_epochs 500 --embedding_size 512

2、使用人脸库训练SVM分类器,用到的函数是classifier.py,这个程序的基本原理是:通过图像算出来的向量数据训练一个SVM分类器,对人的身份进行判断,同时在.pkl格式的文件中存储每一个分类。这个函数有两个模式,TRAIN模式用来训练;CLASSIFY模式用来测试。

具体功能如下:

模式= TRAIN:

使用训练好的模型计算图片的向量,用来训练SVM分类器

将训练好的分类模型保存为python pickle文件

模式= CLASSIFY:

加载SVM分类器模型

使用来自数据集测试部分的向量来测试分类器

执行本代码需要添加的参数以及各参数的含义:

mode: 设定“TRAIN”和“CLASSIFY”两种模式。

data_dir: 图片数据所在文件夹

model: 训练好的模型

classifier_filename:类似于标签,如果mode参数是TRAIN,那么需要指定一个输出的文件位置(以.pkl结尾,例如**/**.pkl),如果mode参数是CLASSIFY,那么就需要指定参数的路径(.pkl文件)。

命令如下:

$ python classifier.py TRAIN data/face_store_160_4 models/20170512-110547 models/star_store_4.pkl

基于facenet人脸识别设计文档

3、对训练的分类器进行CLASSIFY模式测试

$ python classifier.py CLASSIFY data/face_store_160_3 models/20170512-110547 models/star_store_4.pkl

基于facenet人脸识别设计文档

4、使用predict.py进行人脸识别:

$ python predict.py test/lyf_22.png models/20170512-110547 models/star_store_4.pkl

基于facenet人脸识别设计文档