Face Recognition 搭建过程总结

本学期选修了 “应用人工智能” 课,并且在期末课程设计时用到了 Face Recognition 的库,于是记录一下在服务器部署的过程。

Face Recognition 的具体内容请浏览 GitHub

服务器运行 CentOS 7 系统。

系统环境配置

基本安装

  • yum -y install wget
  • yum -y install vim
  • yum groupinstall "Development Tools"

配置国内 yum 源

  1. cd /etc/yum.repos.d
  2. mv CentOS-Base.repo CentOS-Base.repo.bk
  3. wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
  4. yum makecache

配置 epel 源

  • yum -y install epel-release

Anaconda 3

个人并没有装在 Anaconda 环境下,这里仅做个记录。

安装 Anaconda 3

  1. wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.1.0-Linux-x86_64.sh
  2. bash /root/Anaconda3-5.1.0-Linux-x86_64.sh
  3. ENTER ... 按提示操作
  4. 记得将 Anaconda 3 写入系统环境变量

配置 Anaconda 3

  • conda update conda
  • conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  • conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
  • conda config --set show_channel_urls yes
  • conda create -n face-recognition python=3.6
  • source activate face-recognition
  • source deactivate
  • conda remove -n face-recognition --all
  • conda remove --name face-recognition package_name

在 Anaconda 环境下安装 face-recognition

  • conda install -c menpo dlib
  • pip install face_recognition

安装 Python3

  • yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
  • wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz
  • mkdir /usr/local/python3
  • tar -xvJf Python-3.6.5.tar.xz
  • cd Python-3.6.5
  • ./configure --prefix=/usr/local/python3
  • make && make install
  • ln -s /usr/local/python3/bin/python3 /usr/bin/python3
  • ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
  • 修改 /etc/profile文件,在文件末尾添加 PATH=$PATH:/usr/local/python3/bin 并保存
  • source /etc/profile
  • pip install virtualenv

如果缺少 Cython

  • pip install Cython

pypi 使用清华镜像

  • pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
  • pip install --upgrade pip :升级 pip

全局环境下安装

依赖

  • yum install cmake
  • yum install gtk2-devel
  • yum install libdc1394-devel
  • yum install libv4l-devel
  • yum install gstreamer-plugins-base-devel
  • yum install libjpeg-turbo-devel
  • yum install jasper-devel
  • yum install openexr-devel
  • yum install libtiff-devel
  • yum install libwebp-devel
  • yum install opencv
  • yum install opencv-python
  • yum install opencv-devel
  • yum install boost
  • yum install boost-devel
  • yum install boost-doc

安装

  • pip install dlib
  • pip install face_recognition

部署

virtualenv(可选)

  • pip install virtualenv

安装 Nginx

参考前面安装 Hexo 的文章

安装 Node.js

参考前面安装 Hexo 的文章

安装 uWSGI

  • pip install uwsgi

使用 uwsgi 怎么都配置不正确,头快秃了,于是放弃。

安装 Gunicorn

后来选择使用 Node.js 所有并没有用到,这里也只是做记录。

  • pip install gunicorn

使用 Gunicorn

假设 /Face_Recognition 下有 web_service.py 文件。

  • gunicorn web_service:app :最简单的执行。
  • gunicorn web_service:app -p web_service.pid -D :为了在后台运行(即变成守护进程),可以使用 -D 选项。为了将来方便关闭 gunicorn ,使用 -p <file> 来简化在进程中的搜索。
  • cat web_service.pid :输出相关 pid
  • kill -HUP 'cat web_service.pid'kill 'cat web_service.pid' :挂起并关闭
  • gunicorn web_service:app -p web_service.pid -b 127.0.0.1:xxxx -D :当端口被占用时,使用 -b 自定义端口

配置 Nginx

  • /etc/nginx/conf.d/ 下新建 face_recognition.conf
    文件内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    server {
    listen 80;
    server_name xxxx;

    # Handle all locations
    location / {
    # Pass the request to Gunicorn
    proxy_pass http://127.0.0.1:xxx;

    # Set some HTTP headers so that our app knows where the request really came from
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }
  • nginx -t

  • nginx -s reload

ProxyFix

有时,你会遇到 Flask 不能恰当处理转发的请求的情况。这也许是因为在 Nginx 中设置的某些 HTTP 报文头部造成的。我们可以使用 Werkzeug 的 ProxyFix 来修复转发请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
from flask import Flask

# Import the fixer
from werkzeug.contrib.fixers import ProxyFix

app = Flask(__name__)

# Use the fixer
app.wsgi_app = ProxyFix(app.wsgi_app)

@app.route('/')
def index():
return "Hello World!"

参考

Node.js + Nginx 反向代理

后来改用 Node.js 。

/etc/nginx/conf.d 目录下新建配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
upstream rockjins {
server 127.0.0.1:xxx; # 这里的端口号写你 node.js 运行的端口号,也就是要代理的端口号
keepalive 64;
}

server {
listen 80; #这里的端口号是你要监听的端口号
server_name 39.108.55.xxx www.rockjins.com rockjins.com; # 这里是你的服务器名称,也就是别人访问你服务的ip地址或域名,可以写多个,用空格隔开

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_set_header Connection "";
proxy_pass http://rockjins; # 这里要和最上面upstream后的应用名一致,可以自定义
}
}

C++/g++:内部错误 Killed (程序 cc1plus)

这个原因是内存不足, 解决方法是在 linux 下增加临时 swap 空间:

  1. sudo dd if=/dev/zero of=/home/swap bs=64M count=16 注释:of=/home/swap,放置 swap 的空间;count 的大小就是增加的 swap 空间的大小,64M 就是块大小,这里是 64MB ,所以总共空间就是 bs*count=1024MB 。这里分配空间的时候需要一点时间,等待执行完毕。
  2. sudo mkswap /home/swap (可能会提示 warning: don’t erase bootbits sectorson whole disk. Use -f to force,不用理会) 注释:把刚才空间格式化成 swap 格式
  3. sudo swapon /home/swap 注释:使用刚才创建的 swap 空间
  4. 执行你相关的操作,如 make

如果创建了临时空间仍然提示 “g++: 内部错误:Killed (程序 cc1plus)”,可能分配的空间不够大,可继续分配更大的空间。

关闭:

  1. sudo swapoff /home/swap
  2. sudo rm /home/swap