0x01 环境:
curl安装:
sudo apt-get install curl
MySQLdb安装: sudo apt get install python-pip sudo apt-get install libmysqlclient-dev pip install mysql-python
LAMP:
sudo apt-get install apache2
sudo apt-get install php7.0
sudo apt-get install libapache2-mod-php7.0
sudo apt-get install mysql-server
sudo apt-get install phpmyadmin
sudo chmod 777 /var/www/html/
sudo ln -s /usr/share/phpmyadmin /var/www/html/
sudo sed -i 's/;extension=php_mbstring.dll/extension=php_mbstring.dll/' /etc/php/7.0/apache2/php.ini
sudo /etc/init.d/apache2 restart
mysql --user=root -p
CREATE DATABASE IF NOT EXISTS `FRT` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `FRT`;
CREATE TABLE `None` (`None` int(11) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
OpenCV:
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
git clone https://github.com/0x024/opencv.git
cd ~/opencv
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j8
sudo make install
0x02 目录树:
0×04 代码构建
1:./face/FaceAPI.py #API的调用

这里为了方便以后进行调用,特意的将FaceAPI写成包,放在创建的face目录下,
FaceAPI中包括delect(面部识别),analyze(面部分析),compare(面部比对),search(面部搜索),faceset(创建面部集合)等,因为官方文档给出的就是采用curl -X POST方式进行数据上传和返回,所以就直接在导入标准库的subprocess包,在python中调用curl,当然还有更好的方法,比如用python标准库里的urllib2里的POST进行上传.但咱们不这是为了省事嘛!返回结果为JSON的格式,为了方面进行调试,特异的将Json写log中,当出现错误的时候,可以查看log的内容,这些JSON数据在下面用到的时候再进行处理
2:./face/DBconnect.py #数据库的连接

这里将数据库的连接也写在了包里面。
在host里填写数据库的地址,port默认为3306,user为数据库用户名,passwd为数据库密码,db为数据库的名称,charset为数据库编码方式,为了能让表显示中文
3:./import.py #人脸数据的导入

这里的话。首先要创建一个的faceset(人脸的集合),调用FaceAPI.facesetcreate()进行创建,传入一个outer_id.也就是你要导入这批人脸的集合的唯一标识,这个值是唯一的。为了当你再次运行import.py时候,防止图片多次的重复导入到数据库中或者多次进行faceaddface(),将每次导入的图片文件名写进到log中,这样就可以减少了服务器的压力(虽然这点微不足道,但是毕竟免费用人家的嘛),如果图片不存在的话,将调用FaceAPI.facesetaddface(),将读取到的脸添加到到faceset中

这个要多说一点,首先,将要导入的图片存放才./data/import/下,当然图片要命名为,”ID.name.jpg”的任何格式,毕竟我的数据库在进行创建的时候就是这样进行数据录入的,然后调用os.walk()对路径进行分割,append()进行连接。

这一步就是对调用detect()返回的json文件进行数据的整理,分别提取其中的face_token,gender,facequality的value,当然也可以返回其他的信息,比如gender,age,smiling,headpose,facequality,blur,eyestatus,ethnicity等。
PS:因为我数据库创建时候,写的是face_data(stuID varchar(12),也就是说,你如果命名的ID小于12位的话,那么他前面的数字全部为随机的,所以当调用check_stuID()的时候,if stuID in a[0]:永远为false

这一步就是要将所有的数据写入到数据库中,因为之前,都将ID,nameface_token等信息进行的全局global的声明。所以这里可以直接进行写入,需要提醒的是,每进行一条sql语句,都与要跟一句 conn.commit()才可以将sql语句进行提交
python import.py
最后运行 就可以看到图片信息在慢慢的导入到数据库中

4:./img.py #检测图片中所有人的面部

这里就要用到一些OpenCV的内容了,其实不用太去深刻的学习OpenCV,毕竟我们仅仅能使用到OpenCV的很小一部分,而这一部分恰恰正是经常用到的,首先加载cv2.CasacdeClassifier选择器,接着加载图片放在img_search目录下的图片,将起转化为灰度,据说机器对灰度图片的识别效率更高,因为cv2.puttext对中文的支持不够友好,所有这里调用了freetype库(开始已经安装过),从而可以让脸部的框框显示中文,在for循环中,每找到一个面部,就会调用cv2.rectangle(),将面部用黄色的方框标记出来(当然你也可以尝试其他颜色,这里只需要修改BGR(0.255.255)的值就可以),并命名其为*.pgm,写入到/data/search/文档下,然后调用FaceAPI.seaechItoI(),让.pgm图像与faceset集合进行比对,并且返回faceset集合中与之置信度最高的face_token,这里设置了以下阀值,如果置信度不高于设定的80.00的话,就会打印“Unknow Face”,
关于img.y需要介绍就这些,下面来运行
python img.py
(不错,看着还可以,)

5:./cam.py #摄像头实时识别(可多个脸)

这里和图片识别原理差不多,只是OpenCV将视频的每一侦都进行了识别,这样的话,因为每一帧都需要调用一下API进行上传,所以会出现画面卡顿的情况,不过还好,能接受
当然,人脸越多,上传的时间就越长,卡顿的就越厉害,反正我现在还没有找到解决办法,
下面来运行,
python cam.py #羞羞

0x04 执行:
运行前,
需要将./face/FaceAPI.py中的api_key和api_secret换成你的
(为了便于您测试,我以将我的key放在里面,为了防止多人使用outer_id冲突,希望您后期换成自己的)
需要将./face/FaceAPI.py中的outer_id设置成自己喜欢的标识
需要将./face/Dbconnect.py中的数据库信息换成自己的
需要将所有的图片ID设置成12位数字
如果需要重新导入或者识别同一张照片,需要在.data/log/*.log 删除对应log即可
python import.py #将保存在./data/import/目录下的图片特征经分析后,将图片信息导入数据库,只可单人照片,要求图片清晰度较高
python img.py #将需要识别的图片放在./data/search/下,完成后保存在本目录(可放置多张)
python cam.py #实时识别人脸 (可识别多张脸)
0x05 github
所有的代码全部上传到了的我的github上,大家可以在这进行fork,