基于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版本。
2)如果没有修改地址,默认的安装包的目录在/home/ lq/下载,进入安装包所在的目录,执行以下命令,进行安装:
bash Anaconda2-2019.10-Linux-x86_64.sh
一路回车,到下图位置,回复yes,直至安装完成。
3)安装完成后,提示是否添加环境变量,输入yes后回车,根据需要填入环境路径,再执行命令让配置的环境变量生效:
expert PYTHONPATY=$PYTHONPATY:/home/lq/anaconda2
source ~/.bashrc
4)运行python,会出现如下显示,则安装成功。
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文件夹下。
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
结果如下:
5、运行compare.py做人脸对比,python命令如下:
$ python compare.py models/20170512-110547 1.png 2.png
结果如下:
理论上:同一个人的图片,测试得到的距离值偏小,而不同的人测试得到的距离偏大。正常情况下同一个人测得距离应该小于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
3、对训练的分类器进行CLASSIFY模式测试
$ python classifier.py CLASSIFY data/face_store_160_3 models/20170512-110547 models/star_store_4.pkl
4、使用predict.py进行人脸识别:
$ python predict.py test/lyf_22.png models/20170512-110547 models/star_store_4.pkl