前言

前几天在网上看到了openface(链接),觉得挺有趣就下载配置了一下,稍微修改了一下跑了个demo,效果还是很不错的。这里分享下安装配置的过程以及demo。

简介

openface是一个基于深度神经网络的开源人脸识别系统,由卡耐基梅隆大学的B. Amos主导。代码全部开源在github上了,还提供了一些预训练模型。该系统是参考CVPR2015的:FaceNet: A Unified Embedding for Face Recognition and Clustering实现的,感兴趣的话可以读读这篇经典论文。
官网:http://cmusatyalab.github.io/openface/
代码:https://github.com/cmusatyalab/openface/

环境搭建

我只是在笔记本上搭建了环境所以涉及到GPU的CUDA驱动的部分没有安装,只是装了CPU版本的,速度也还可以。我的电脑上此前就配好了opencv、dlib等环境,所以实际配置时仅仅是配置了Torch而已。网上也有很多配置环境的教程,所以下面简要带过。
1、OpenCV
直接用命令行安装:

sudo apt-get install libopencv-dev
sudo apt-get install python-opencv

注:这种方式只能装opencv2的,如果想装opencv3的请自行编译源码安装,可以参考:https://www.cnblogs.com/dylancao/p/7879818.html。

2、dlib
关于这个库的安装可以参考我以前写的博客:https://blog.csdn.net/hongbin_xu/article/details/76284134。
可以从github上下载源码编译安装也可以直接用命令行安装。

sudo pip install dlib

据说直接pip安装dlib会碰到一些问题,我是直接编译源码安装的,按照步骤来一般不会出问题。
源码编译安装可以参考:https://blog.csdn.net/zmdsjtu/article/details/72642521?utm_source=itdadao&utm_medium=referral。

3、下载openface源码

git clone https://github.com/cmusatyalab/openface.git

另外把依赖的python库安装一下:

cd openface
sudo pip install -r requirements.txt

4、安装Torch

git clone https://github.com/torch/distro.git ~/torch --recursive
cd torch
bash install-deps
./install.sh

中途可能执行./install.sh时从github下载文件时会花费较多时间,如果进程中断后,可以执行./update.sh继续安装。
安装完成后,使刚刚配置的环境变量立刻生效:

source ~/.bashrc

5、安装依赖的 LUA库
由于openface中用到了lua语言,所以还需要安装一些lua库。
如果torch安装成功,应该可以在下面的目录中找到luarocks这个文件:

/home/xhb/torch/install/bin/

如果没有就手动安装luarocks

sudo apt-get install luarocks

两个都是一样的,接下来就以前者为例了:
找到torch中的luarocks来安装一些包:
注:cunn使用了cuda,如果不使用GPU来跑的话,不需要安装这个;fblualib和torchx都是用来训练DNN的,建议安装。

/home/xhb/torch/install/bin/luarocks install dpnn
/home/xhb/torch/install/bin/luarocks install nn
/home/xhb/torch/install/bin/luarocks install optim
/home/xhb/torch/install/bin/luarocks install csvigo
/home/xhb/torch/install/bin/luarocks install cunn
/home/xhb/torch/install/bin/luarocks install fblualib
/home/xhb/torch/install/bin/luarocks install torchx  

安装结束后,用指令th来验证是否安装成功。

6、编译openface源码

python setup.py build
sudo python setup.py install

7、验证几个模块是否安装成功
python中输入:

import cv2
import dlib
import openface

如果没有报错,即安装成功。

8、下载预训练模型
在源码中提供了下载模型的脚本,运行即可自动下载几个模型文件:

cd openface
./models/get-models.sh

但是,由于国外的服务器可能访问受限,下载可能极慢。所以需要采取一些其他方法来下载模型,“科学上网”都懂得。
也可以直接用迅雷来下载文件:
http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
文件下载好后,放到./models/dlib中。

https://storage.cmusatyalab.org/openface-models/nn4.small2.v1.t7
文件下载好后,放到./models/openface中。

https://storage.cmusatyalab.org/openface-models/celeb-classifier.nn4.small2.v1.pkl
文件下载好后,放到./models/openface中。

随后再执行./models/get-models.sh,验证无误即可:

demo

代码

log.py

这段代码是用来配置终端打印输出信息的,供另外一个py代码调用。

# *_*coding:utf-8 *_*
# author: 许鸿斌
# 邮箱:2775751197@qq.comimport logging
import sys# 获取logger实例,如果参数为空则返回root logger
logger = logging.getLogger('Test')
# 指定logger输出格式
formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
# 文件日志
# file_handler = logging.FileHandler("test.log")
# file_handler.setFormatter(formatter)  # 可以通过setFormatter指定输出格式
# 控制台日志
console_handler = logging.StreamHandler(sys.stdout)
console_handler.formatter = formatter  # 也可以直接给formatter赋值
# 为logger添加的日志处理器
# logger.addHandler(file_handler)
logger.addHandler(console_handler)
# 指定日志的最低输出级别,默认为WARN级别
logger.setLevel(logging.INFO)

face_compare.py

这里是实际对人脸进行匹配的代码。

# *_*coding:utf-8 *_*
# author: 许鸿斌
# 邮箱:2775751197@qq.comimport time
start = time.time()import cv2
import itertools
import os
import numpy as np
import openface
import argparse
from log import loggerdlib_model_dir = '/home/xhb/文档/Packages/openface/models/dlib'
openface_model_dir = '/home/xhb/文档/Packages/openface/models/openface'parser = argparse.ArgumentParser()
parser.add_argument('imgs', type=str, nargs='+', help='Input images.')
parser.add_argument('--dlibFacePredictor', type=str, help="Path to dlib's face predictor.", default=os.path.join(dlib_model_dir, "shape_predictor_68_face_landmarks.dat"))
parser.add_argument('--networkModel', type=str, help="Path to Torch network model.", default=os.path.join(openface_model_dir, 'nn4.small2.v1.t7'))
parser.add_argument('--imgDim', type=int, help="Default image dimension.", default=96)
parser.add_argument('--verbose', action='store_true')args = parser.parse_args()if args.verbose:logger.info("Argument parsing and loading libraries took {} seconds.".format(time.time() - start))start = time.time()
align = openface.AlignDlib(args.dlibFacePredictor)
net = openface.TorchNeuralNet(args.networkModel, args.imgDim)
if args.verbose:logger.info("Loading the dlib and OpenFace models took {} seconds.".format(time.time() - start))def getRep(imgPath):if args.verbose:logger.info("Processing {}.".format(imgPath))bgrImg = cv2.imread(imgPath)if bgrImg is None:raise Exception("Unable to load image: {}".format(imgPath))rgbImg = cv2.cvtColor(bgrImg, cv2.COLOR_BGR2RGB)if args.verbose:logger.info("Original size: {}".format(rgbImg.shape))   start = time.time()faceBoundingBox = align.getLargestFaceBoundingBox(rgbImg)if faceBoundingBox is None:raise Exception("Unable to find a face: {}".format(imgPath))if args.verbose:logger.info("Face detection took {} seconds.".format(tim.time() - start))start = time.time()alignedFace = align.align(args.imgDim, rgbImg, faceBoundingBox, landmarkIndices=openface.AlignDlib.OUTER_EYES_AND_NOSE)     if alignedFace is None:raise Exception("Unable to align image: {}".format(imgPath))if args.verbose:logger.info("Face alignment took {} seconds.".format(time.time() - start))start = time.time()rep = net.forward(alignedFace)  if args.verbose:logger.info("OpenFace forward pass took {} seconds.".format(time.time()-start))logger.info("Representation:")logger.info(rep)return repfor (img1, img2) in itertools.combinations(args.imgs, 2):distance = getRep(img1) - getRep(img2)logger.info("Comparing {} with {}.".format(img1, img2))logger.info("Squared l2 distance between representations: {:0.3f}".format(np.dot(distance, distance)))

代码都比较简单,不做详细介绍了。但是,还有几个地方要注意修改一下:

dlib_model_dir = '/home/xhb/文档/Packages/openface/models/dlib'
openface_model_dir = '/home/xhb/文档/Packages/openface/models/openface'

这里两个目录分别指的是存放我们之前下载模型的存放的目录,修改成自己电脑中对应的路径就行。
目录下应该有如下图中所示的文件:

运行结果

我在网上随便搜集了一些图片,用来测试:

在终端下运行face_compare.py

python face_compare.py ./test_images/*

运行结果截图如下:

同一个人脸的特征向量之间的欧式距离比较小,一般都小于1;不同人脸的特征向量之间的欧式距离较大,一般都有1.5左右。

后记

最近都在忙毕业论文,另外还要参加学校的足球比赛,学习之余还需要经常去拉练体能,没有多少时间上博客。下次有时间,再写几个openface的demo,或者复现一下facenet,感觉还是挺有趣的。

参考资料:
1、https://blog.csdn.net/itas109/article/details/50790139
2、http://cmusatyalab.github.io/openface/
3、https://blog.csdn.net/weixinhum/article/details/77046873
4、https://github.com/cmusatyalab/openface/

OpenFace学习(1):安装配置及人脸比对相关推荐

  1. Maven学习以及安装配置教程

    Maven学习以及安装配置教程 一.简介 Maven是Apache软件基金会推出用于java项目构建以及依赖管理的工具 官方网站:Maven Repository: commons-httpclien ...

  2. 基于Java的Android OpenCV安装配置及人脸识别示例

    1. OpenCV安装配置 1.1 开发环境 Android Studio 3.5.2 Opencv-4.3.0-android-sdk 1.2 安装OpenCV SDK opencv的官网中下载an ...

  3. (非常详细)大数据平台学习·环境安装配置(一)(RockyLinux9版)

    一.文章简介 着手搭建大数据平台时,配置虚拟机环境是成为新手的第一道门槛.虽然各种视频和网站上也有很多虚拟机安装配置教程,但由于对 Linux 环境不熟悉,同时加上网上不少教程都是五花八门的cento ...

  4. Kotlin学习笔记——安装配置kotlin

    这个系列主要为了整理一下自己学习kotlin的笔记以及学习过程中遇到的问题. 整个系列初期大约有20篇左右,我会尽快整理出来.后续会不定时更新,主要是实际使用的案例或者一些知识点的深入探讨. 1.安装 ...

  5. pythonjam教程_Python学习:安装配置pycharm编辑器教程

    我只介绍windows的安装过程. 1. windows安装过程 1.1 下载安装包 下载地址为 https://www.jetbrains.com/pycharm/download/#section ...

  6. 深度学习Win10安装配置CUDA和cuDNN实现显卡GPU加速

    背景: 最近进入到深度学习的行列中,由于笔记本带有独显,并且在网上看到许多博客都说深度学习通过GPU加速可以提高训练的速度,所以我就在想我也不能浪费了我的独显,最后决定尝试配置CUDA和cuDNN来体 ...

  7. 3.Hadoop的学习(ubuntu安装配置jdk)

    1.将jdk压缩包解压 执行命令:tar -xzvf 压缩包名 2.把JDK安装到usr下面的soft文件夹里面.(注意,本来没有这个文件夹,需要自己去创建) 并且修改soft的文件夹权限:   su ...

  8. OpenSSH学习笔记(安装配置openssh-4.6p1)[zz]

    本文系作者原创,转载请保留出处:http://marion.cublog.cn     一.关闭并卸载RedHat9.0自带的Openssh     1.1 停止服务     #service ssh ...

  9. Storm学习笔记——安装配置

    1.安装一个zookeeper集群 2.上传storm的安装包,解压 3.修改配置文件conf/storm.yaml #所使用的zookeeper集群主机 storm.zookeeper.server ...

最新文章

  1. IntelliJ IDEA 最常用配置,应用、永久激活
  2. python五十五:__getattribute__内置函数
  3. Lync 2010迁移Lync 2013 PART6:迁移CMS
  4. Maven and Nexus2
  5. IT综合学习网站收集
  6. 十个不可不看的Matlab GUI
  7. telnet入侵linux,教你入侵RedHatLinux
  8. PHP系列(一)PHP流程控制结构
  9. 【双11狂欢背后】微服务注册中心如何承载大型系统的千万级访问?
  10. Spark-submit执行流程,了解一下
  11. Adafruit GFX Library字体规范
  12. 计算机网页外文文献图书,免费外文文献网站.doc
  13. QGIS自定义地图工具
  14. 河海大学计算机专业戴慧凤,特色宿舍 - 河海大学学生工作处.doc
  15. ad软件one pin错误是啥意思_AD19的错误提示大总结解释
  16. 第四课 C++中的运算符
  17. 自定义UI 简易图文混排
  18. 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第十一集
  19. 解决Spring5源码编译各种Gradle报错问题
  20. 1036: 某年某月有多少天 C语言

热门文章

  1. python怎么玩_怎么用Python玩GTA5?跟着教程玩!
  2. 如何利用GitHub发布个人网站
  3. 物联网卡联网原理是什么?为什么有时无法使用?
  4. python编程入门
  5. 前端面试题-clearfix(清除浮动)
  6. itstime后面跟什么_spend time后面接什么
  7. 小马哥-----高仿三星i8552刷机 拆机主板与开机界面图 14年新高仿
  8. HTML5--多媒体viedo和radio
  9. 什么是Web3D?Web3D技术发展历程以及Web3D应用场景
  10. 精心整理后的PS教程,全套学习适合小白进阶(photoshop视频学习)