基于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

基于facenet人脸识别设计文档相关推荐

  1. 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)...

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  2. Linux下基于GTK人脸识别界面设计

    Linux下基于GTK人脸识别界面设计 1.人脸识别简介   人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术.用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸, ...

  3. 基于JRTPLIB库的RTP数据传输设计文档(1)

    关键词:JRTPLIB  RTP  ARM  交叉编译 BCNG  项 目 组 技 术 文 档                            基于JRTPLIB库的RTP数据传输设计文档   ...

  4. 基于javaweb框架的springboot mybatis宠物商城源码含论文设计文档

    在互联网高速发展.信息技术步入人类生活的情况下,电子贸易也得到了空前发展.网购几乎成为了人人都会进行的活动.近几年来,养宠物更是成为人们生活中重要的娱乐内容之一, 人们越来越多的讲感情也寄托给了宠物, ...

  5. linux小型游戏系统设计,Linux平台下基于JAVA小游戏_设计文档.doc

    Linux课程设计报告 课题名称:<Linux平台下基于java小游戏设计> 专 业:2011级计算机科学与技术 组 长:043佘清泉 组 员:007陈威达 008陈学仁 026赖华标 0 ...

  6. 基于JRTPLIB库的RTP数据传输设计文档

    http://xiyong8260.blog.163.com/blog/static/665146212008824112748499/  版权所有,若转载,请注明出处,谢谢合作.  关键词:JRTP ...

  7. 基于stm32的空气质量检测净化系统,检测温湿度和pm10和 pm2.5,资料包含(设计文档,源码,pcb电路)。

    基于stm32的空气质量检测净化系统,检测温湿度和pm10和 pm2.5,资料包含(设计文档,源码,pcb电路).

  8. 基于Delphi7openGauss2.0开发社区信息管理系统-设计文档

    疫情防控信息管理系统设计文档 目录 需求分析... 3 a.引言... 3 a. 1目的... 3 a. 2文档约定... 3 a. 3预期的读者和阅读建议... 3 a. 4产品的范围... 3 b ...

  9. 基于 TensorFlow 在手机端实现文档检测

    手机端运行卷积神经网络的一次实践 - 基于 TensorFlow 和 OpenCV 实现文档检测功能 1. 前言 本文不是神经网络或机器学习的入门教学,而是通过一个真实的产品案例,展示了在手机客户端上 ...

最新文章

  1. Happy New Year 2016
  2. 【建站系列教程】6、.htaccess文件的url重写规则-网页伪静态化
  3. Java 中如何使用 SQL 查询文本
  4. vim代码格式化工具autopep8
  5. Opportunity retrieval in SalesPipeline
  6. ASP.NET Core分布式项目实战(oauth2 + oidc 实现 client部分)--学习笔记
  7. python查看图片的源代码_python实现图片筛选程序
  8. 数学和古典诗词的意境
  9. 好爽 java_Intellij是进行scala开发的一个非常好用的工具,可以非常轻松查看scala源码,当然用它来开发Java也是很爽的,之前一直在用scala ide和ec...
  10. Servlet 2.4 规范之第四篇:Servlet上下文
  11. Android Studio 导入项目时容易出现的问题汇总
  12. vue封装element-ui的table组件,灵活配置表头实现表格内编辑,按钮,链接等功能。...
  13. STM32/STM8+DMX512协议
  14. Matlab:实现菲涅尔矩形孔衍射仿真
  15. 百度网盘不能下载文件,如何用迅雷下载(链接为网盘链接)
  16. 使用Whisper框架快速为项目添加国际化支持
  17. 高效建站(华为云服务器速成篇)
  18. 深度卷积神经网络架构:从基本组件到结构创新
  19. Android 如何让你的App分享给别人
  20. mfc加载ocx失败

热门文章

  1. 如何让多个word文档合并成一个
  2. nova8se鸿蒙,挖东西:华为nova8SE标准版和高配版哪个好?解析有区别没有?主要的优势在哪里?...
  3. 大白话5分钟带你走进人工智能-第33节神经网络和神经元概念(1)
  4. RealView 应用
  5. linux下查看系统配置参数
  6. 2019-11-12
  7. 计算机网络实验之验证性实验
  8. k8s中使用基于nfs的storageclass
  9. linux卸载teamviewer,ubuntu 16.04 desktop + server LTS - TeamViewer 软件彻底卸载
  10. ASP.NET页面在IE缓存的清除办法 (转)