找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 28198|回复: 12
打印 上一主题 下一主题
收起左侧

基于opencv与face++人脸识别+树莓派的门禁管理系统设计

  [复制链接]
跳转到指定楼层
楼主
ID:267482 发表于 2017-12-27 08:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
嵌入式系统综合实践  
     本项目以树莓派model B为主板,编写python程序实现USB摄像头自动拍照(如果摄像头前没有人脸会一直拍照下去),试图开门者靠近摄像头并让其对自己正脸拍照,程序拍照后调用opencv与face++的API对照片进行人脸识别并与本地权限人照片(拥有开门权限的有两人)比较,以控制继电器实现电子门锁的开关(如若是拥有权限者试图开门,继电器由长闭一边打到另一边),所有试图开门的记录都存储在树莓派的数据库mysql中,可以在自己编写的安卓客户端中查看所有记录。

  •          方案选择
树莓派+Python + Opencv + Face++ +数据库Mysql + 基于JDBC的同一局域网下连接树莓
派数据库的app
1.树莓派是一款基于ARM的微型电脑主板,以SD/MicroSD卡为内存硬盘,卡片主板周围有1/2/4个USB接口和一个10/100 以太网接口,可连接键盘、鼠标和网线,同时拥有视频模拟信号的电视输出接口和HDMI高清视频输出接口,以上部件全部整合在一张仅比信用卡稍大的主板上。
2.考虑到python相较其他语言的简洁性,树莓派对python语言有很好的支持(最新版的树莓派操作系统自带python环境),而且face++官网只提供java与python两种sdk包,选取python语言编写树莓派上运行的程序。
3. OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。选用opencv做人脸识别是较常用和成熟的技术。
4. Face++是北京旷视科技有限公司旗下的新型视觉服务平台,Face++平台通过提供云端API、离线SDK、以及面向用户的自主研发产品形式,将人脸识别技术广泛应用到互联网及移动应用场景中。Face++的API功能更加全面,人脸识别精度也要高于Opencv。
5.MySQL 是一个关系型数据库,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言。Mysql是轻量级的数据库,支持远程连接,为制作客户端提供了方便。
6. JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成,可以用JDBC实现与树莓派中的mysql远程连接。采取先在eclipse上建立java工程,调试核心代码,再移植到android studio中的android工程中,在android studio中写好app,直接用手机调试(用模拟器PC可能会卡),并生成apk放在手机上作为客户端。
二.相关硬件
1、树莓派主板:程序运行的平台
2、USB摄像头:实现图像的采集
3、其他模块:电脑、网线(用于平时调试),360随身wifi模块(用于平时调试与最终演示)
相关软件(下载到树莓派中)
1、Raspbian系统
Raspbian系统是基于Debian系统的Raspberry Pi的硬件优化的免费操作系统。广义的Debian是指一个致力于创建自由操作系统的合作组织及其作品,而Raspbian操作系统是一套基本的能使树莓派运行的程序和设备。Raspbian不仅仅是一个单纯的操作系统,它包涵了35000种适当格式的工具包、预编译软件,而这些都是能够非常容易地安装在树莓派上的 。
2、抓图软件fswebcam
实现USB摄像头拍照功能
3、Python图像处理库、python-imaging、python-imaging-tk
4、opencv
  Python的视觉库
5、face++的Python SDK 包
SDK包中包括通过网络调用face++的API所必须的一些工具。
四.实践流程
  1.树莓派基本操作和必要环境搭建
包括下载好所需系统镜像并烧入microSD中、树莓派上网的实现、360随身wifi模块插入树莓派后相关的配置、登陆工具putty的下载、vncserver安装、下载sftp工具用来传输数据。
  2.基于face++的人脸识别与比较并控制继电器开关
(1)用putty登录树莓派进入命令行界面,插入usb摄像头,输入指令lsusb查看是否被树莓派识别(一般不需要,最新系统自动驱动usb摄像头)。
(2)用命令行安装fswebcamsudo
apt-get install fswebcam#安装fswebcam
sudo fswebcam -d /dev/video0 -r 352x288 /home/pi/0.jpg#拍照尝试一下
(3)用命令行安装python相关库
sudo apt-get install libjpeg8-dev zlib1g-dev libfreetype6-dev#安装PIL依赖包
sudo apt-get install python-imaging#安装python-imaging
sudo apt-get install python-imaging-tk#安装python-imaging-tk
(4)进入face++官网,注册face++账号,在如下图所示界面下载对应Python的sdk包到PC端,再用文件传输工具传入树莓派中
(5)建立一个新应用,将账号的API_KEY和应用的API_SECRET写入下载好的SDK中的apikey.cfg文件和call.py文件中,用命令行运行call.py文件,体验人脸识别,并研究putty界面所可能显示的python捕获异常的信息,尝试进行程序的调试。
(6)仔细研究face++的API文档,最终选定Detect API与Compare API(如下图所示)实现所需功能。
    (7)拍摄拥有开门权限者的照片并放入树莓派本地,编写程序完成系统的核心功能人脸识别与比较(见附录程序1),并对拍照图片进行处理。(在对比开门者照片与权限者照片时所用到的是Compare API返回值之一的“比对结果置信度”confidence,前者的confidence为94.795,后者的confidence为56.607,所以将判断的阀值定为70。)
     (8)将继电器的正、负、in端分别接树莓派GPIO的5V引脚、地引脚与11引脚,在程序中导入python的GPIO库,写入简单的GPIO引脚高低电平控制程序,观察继电器的状态。
      import RPi.GPIO as GPIO#导入库
GPIO.setmode(GPIO.BOARD)  #配置IO口的标号方式
GPIO.setup(11, GPIO.OUT)#将GPIO的11引脚设为输出
GPIO.output(11, 1)# 让GPIO的11引脚为高电平
GPIO.output(11, 0) # 让GPIO的11引脚为低电平
3树莓派数据库建立
      用以下指令安装数据库mysql,在安装过程中
      sudo apt-get install mysql-server python-mysqldb
单独建立一个.py文件用于数据库相关代码的测试,从建立一个数据库出发,再到插入一条记录,调试无误后,移植进之前总的python程序中,实现每识别一次人脸,与本地权限者照片比较之外,插入一条试图开门者的记录。
由于记录中需要有试图开门这一动作发生的时间,需要获取树莓派当前的时间,首先需要树莓派每次重启都通过网络将其时间矫正为现实时间,有以下几个步骤:
运行以下命令,启用NTP:
sudo timedatectl set-ntp true
然后通过date命令来查看当前时间,如果时间不对,使用以下命令修改本地时区sudo dpkg-reconfigure tzdata,在“Configuring tzdata”中,依次选择Asia、Chongqing。
等树莓派与现实时间同步,通过python的time模块来获取时间
import time
localtime=time.strftime("%Y-%m-%d %X",time.localtime())
此时已经获取了字符串格式的当前时间local,同样移植到总的python程序中。
  4.自动拍照与opencv
     可以写个大循环,在循环开头进行拍照,拍照代码如下
import os
command="sudo fswebcam -d /dev/video0 -r 600*600 /home/pi/python-sdk-master/python-sdk/photo.jpeg"
但不能每次拍完照都与本地权限者照片比较一下,那样调用face++的API过于频繁,一来造成累积的网络延时过大,二来正式API应用以调用次数收费(试用API也不能无限次调用,且网络不稳定,容易出问题),因此每次拍完照都要识别一下照片中有没有人脸,如果有人脸再调用face++进行人脸比较。但同样的道理也不能用face++进行人脸识别,综上考虑,用opencv进行识别。
首先用下列命令下载opencv库
sudo apt-get install python-opencv
在GitHub上找到opencv软件包到PC上,在其中找到haarcascade_frontalface_alt2.xml文件放在与总的python程序相同目录下,就可以用如下代码实现基于opencv的人脸识别
face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')
img = cv2.imread('photo.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
faces若返回不为(),则为识别出了人脸。
考虑到降低延时,在最终的总的python程序中,去掉了之前用face++识别人脸对想要开门者照片处理的部分。
5.将权限者修改为两人,得到最终程序(见附录程序2)。
最终测试,从自动拍照到识别到驱动继电器,整个过程工作良好。由于用opencv识别人脸精度较低,需要摄像头离人脸一段距离并采光良好,但仍会偶尔发生长时间(高于6s,小于12s)无法识别人脸的情况(实际上,这可能更多是摄像头的缘故,比如用蓝色妖姬T3200摄像头,虽然要调焦距,拍照指令也要在sudo fswebcam后加“-S 10”,但基本上没有识别不了人脸的情况)。
6.基于JDBC和无线热点的安卓客户端
首先要建立必要的局域网:
无线模块插在树莓派上并已进行配置,手机开热点,树莓派连接该热点,让PC和预备下载客户端的手机也连上同一热点。此时PC可通过putty登陆树莓派命令行界面。当然也可让树莓派、电脑、手机连上同一wifi(对于相同wifi,无线设备每次被分配的ip地址固定)。
然后,必须对树莓派进行配置,开启其数据库mysql可供远程访问的权限。
用sudo nano /etc/mysql/my.cnf修改/etc/mysql/my.cnf文件
找到下面这行,并用#注释掉,
bind-address        = 127.0.0.1
或者修改为bind-address        = 0.0.0.0
然后登录mysql,输入下面命令
mysql>grant all privileges on *.* to username@"%" identified by "password";(username一般是root,password是树莓派mysql上root用户的密码)
mysql> FLUSH PRIVILEGES;
安装防火墙ufw
apt-get installufw
启用ufw
ufw enable
ufw default deny
开启3306、22(ssh端口)端口
ufw allow 3306
ufw allow 22 (注意:如果不开启22端口,下次启动树莓派时,系统的22端口会禁用,不能使用ssh登录树莓派)
然后关上防火墙,否则会禁止一切对树莓派的外部连接(putty除外,但VNC不行)
ufw disable
重启mysql
sudo service mysql restart;
这时尝试在eclipse上建立java工程,书写基于jdbc原理的代码,尝试与树莓派中mysql数据库建立连接(JDBC驱动包选用mysql-connector-java-5.1.22-bin.jar)。
如若连接不上,在PC端下载mysql workbench尝试连接树莓派寻找原因。
将java程序移植到android studio的android工程中,并完成整个工程
客户端效果见下图,填入(设计为自动填入默认内容)用户名(第一行)、密码(第二行)与树莓派IP地址(第三行,虽然应该封装为用户不可见),点击“获取记录”按钮,即可查看所有试图开门的历史记录。
   
四.总结与收获
   这次嵌入式综合实践,历时六周,从一开始的懵懂到最后完成系统的所有功能,收获了很多很多。从拿到树莓派大约两周后,我们便开始准备综合实践的相关内容。从查资料确定大致的方案,到进行最基础的树莓派操作和学习python的基本编程,慢慢进步。
网上有较多的树莓派人脸识别教程而无树莓派人脸比较教程,这是一大难点。而很多人脸识别教程的代码已经过时,拿face++来说,其官网提供的sdk包便与几年前并不一样,API进行了全面的更新,必须仔细研读最新的API文档并结合sdk包中提供的例程,一步步摸索,写下并调试每一句代码。
网上有一些关于树莓派GPIO口、数据库、opencv的程序,也不能直接拿来用,需要分析大概每一句代码的含义,并且做长时间的调试。往往先写“模块”,再将“模块”移植到总程序中。
安卓客户端的制作,也是最难的部分之一,由于java和安卓的知识不够,往往需要很长时间的摸索,请教很多人。用JDBC连接数据库的java程序在网上很好找到,也很简单,容易用eclipse进行调试,但写成android工程仍有很多地方要做。
我们分工明确,组里的每个人在做好自己工作的同时,也关注别人的进展,及时沟通,为整个项目的完成付诸努力。
通过这次综合实践,我们对专业和项目开发有了更加深切和具体的认识,体会到了写程序的艰辛与复杂,但克服困难之后的喜悦也是巨大的。通过不断地去解决问题,每个人的能力都有了很大的提高。
五.附录
程序一
#-*- coding: utf-8 -*-
#从PIL中引入Image和ImageDraw,读出’/home/pi/photo.jpeg’并另存原始图片为yuanshi.jpeg
from PIL import Image
from PIL import ImageDraw
im = Image.open( './photo2.jpeg' )
im.save( './yuanshi2.jpeg' )
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(15, GPIO.OUT)
true=1
# 您需要先注册一个App,并将得到的API key和API secret写在这里。
# You need to register your App first, and enter you API key/secret.
API_KEY = "iYsLwyCzinc_JnsoUSuuO2j7mTdnhLoA"
API_SECRET = "863589RVqKDq3H-u3u57LZr1llDqmQv0"
# Import system libraries and define helper functions
# 导入系统库并定义辅助函数
from print import pformat
def print_result(hit, result):
    def encode(obj):
        if type(obj) is unicode:
            return obj.encode('utf-8')
        if type(obj) is dict:
            return {encode(v): encode(k) for (v, k) in obj.iteritems()}
        if type(obj) is list:
            return [encode(i) for i in obj]
        return obj
    print hit
    result = encode(result)
    print '\n'.join("  " + i for i in pformat(result, width=75).split('\n'))
# First import the API class from the SDK
# 首先,导入SDK中的API类
from facepp import API, File
#创建一个API对象,如果你是国际版用户,代码为:api = API(API_KEY, API_SECRET, srv=api_server_international)
#Create a API object, if you are an international user,code: api = API(API_KEY, API_SECRET, srv=api_server_international)
api = API(API_KEY, API_SECRET)
#利用face++的detectAPI识别刚刚拍摄的照片中的人脸
detectresult = api.detect(api_key=API_KEY,api_secret=API_SECRET,image_file=File('./photo2.jpeg'))
print '=' *60
#将结果输出到打印到命令行界面上
print_result('Detect result:', detectresult)
  #调用face++的compareAPI将拍到的照片与两张本地权限者照片做比较,confidence
表示拍到的照片与本地权限者照片是同一人的置信度
comparation=api.compare(api_key=API_KEY,api_secret=API_SECRET,image_file1=File('./zq3.jpeg'),image_file2=File('./photo2.jpeg'))
confidence=comparation['confidence']
print confidence
#获取识别到的人脸及识别图片实际高度和宽度
zt=detectresult["faces"][0]["face_rectangle"]["top"]
zl=detectresult["faces"][0]["face_rectangle"]["left"]
zw=detectresult["faces"][0]["face_rectangle"]["width"]
zh=detectresult["faces"][0]["face_rectangle"]["height"]
#打开photo图
im = Image.open( './photo2.jpeg' )
draw = ImageDraw.Draw(im)
draw.polygon([(zl,zt+zh),(zl+zw,zt+zh),(zl+zw,zt),(zl,zt)],outline=(0,255,0))
im.save( './photo1.jpeg' )
from PIL import ImageFont,ImageDraw
ft = ImageFont.truetype( '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 18)
draw = ImageDraw.Draw(im)
#如果置信度不超过70,则在相应人脸出标注“stranger”;否则,标注与该人脸有最大相似度的数据库中的成员的名字
if confidence <=70:
        GPIO.output(15, 0)
              draw.text((zl+10,zt-30), 'stranger',fill=(255,0,0), font=ft)
else:
        GPIO.output(15, 1)
              draw.text((zl+10,zt-30), 'Bu Honglong',fill=(255,0,0), font=ft)
#保存修改后的photo图片
im.save( './photo2.jpeg' )
程序2(最终程序faceselect7.py
#-*- coding: utf-8 -*-
from PIL import Image
from PIL import ImageDraw
import time#导入python的time模块
localtime=time.strftime("%Y-%m-%d %X",time.localtime())#获取当前现实时间
import os#导入python的os模块
command="sudo fswebcam -d /dev/video0 -r 600*600 /home/pi/python-sdk-master/python-sdk/photo.jpeg"#赋拍照指令的字符串给command
import numpy as np#导入python的numpy模块并更名为np
import cv2#导入python的opencv模块
import MySQLdb导入python的 MySQLdb模块,用于数据库操作
# 下面是与mysql建立连接,插入名为openperson的数据库,并规范记录格式
db_conn = MySQLdb.connect(host = 'localhost', user= 'root', passwd = '65498732')
cursor = db_conn.cursor()
cursor.execute("create database if not exists openperson")
db_conn.select_db('openperson');
sql = """CREATE TABLE if not exists people(
   open_name CHAR(20) NOT NULL,
   time CHAR(20))"""
try:
cursor.execute(sql)
except Exception, e:
print "Error to create table:", e
sql = """INSERT INTO people(open_name,
   time)
   VALUES ('%s', '%s')"""
import RPi.GPIO as GPIO #导入RPi.GPIO模块,并更名为GPIO
GPIO.setmode(GPIO.BOARD)    #配置IO口的标号方式
GPIO.setup(11, GPIO.OUT) #将GPIO的11引脚设为输出
# 您需要先注册一个App,并将得到的API key和API secret写在这里。
# You need to register your App first, and enter you API key/secret.
API_KEY = "iYsLwyCzinc_JnsoUSuuO2j7mTdnhLoA"
API_SECRET = "863589RVqKDq3H-u3u57LZr1llDqmQv0"
# Import system libraries and define helper functions
# 导入系统库并定义辅助函数
from print import pformat
def print_result(hit, result):
    def encode(obj):
        if type(obj) is unicode:
            return obj.encode('utf-8')
        if type(obj) is dict:
            return {encode(v): encode(k) for (v, k) in obj.iteritems()}
        if type(obj) is list:
            return [encode(i) for i in obj]
        return obj
    print hit
    result = encode(result)
    print '\n'.join("  " + i for i in pformat(result, width=75).split('\n'))
# First import the API class from the SDK
# 首先,导入SDK中的API类
from facepp import API, File
#创建一个API对象,如果你是国际版用户,代码为:api = API(API_KEY, API_SECRET, srv=api_server_international)
#Create a API object, if you are an international user,code: api = API(API_KEY, API_SECRET, srv=api_server_international)
api = API(API_KEY, API_SECRET)
true=1
#下面进入拍照循环
while true:
  os.system(command)#执行command所代表的指令,即拍照
  time.sleep(1)#等待1s
#下面是用opencv进行人脸识别,识别出有人脸才进行下一步人脸比较,否则一直拍照
  face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')
  img = cv2.imread('photo.jpeg')
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  faces = face_cascade.detectMultiScale(gray, 1.3, 5)
  if faces!=():
#利用face++的detectAPI识别刚刚拍摄的照片中的人脸,其实这句调试时能看到不少信息,方便些,可以省略
detectresult=api.detect(api_key=API_KEY,api_secret=API_SECRET,image_file=File('./photo.jpeg'))
  #将结果输出到打印到命令行界面上
print_result('Detect result:', detectresult)
  #调用face++的compareAPI将拍到的照片与两张本地权限者照片做比较,confidence1
和confidence2表示拍到的照片与本地权限者照片是同一人的置信度
      comparation1=api.compare(api_key=API_KEY,api_secret=API_SECRET,image_file1=File('./quanxianzhe1.jpeg'),image_file2=File('./photo.jpeg'))
confidence1=comparation1['confidence']
        comparation2=api.compare(api_key=API_KEY,api_secret=API_SECRET,image_file1=File('./quanxianzhe2.jpeg'),image_file2=File('./photo.jpeg'))
  confidence2=comparation2['confidence']
        #如果置信度超过70时,则送对应11号引脚高电平,改变继电器状态,并给数据库中送对应权限人开门的记录;否则,给数据库中送陌生人想要开门的记录,print1,print2,print3是调试需要,方便树莓派没连继电器时在命令行界面也能查看程序运行情况
        if confidence1 >=70:
           GPIO.output(11, 1)
           time.sleep(2)
           GPIO.output(11, 0)
           print 1
           peoples = (
           {"open_name": "Bu Honglong", "time": localtime},
            )
           for people in peoples:
            cursor.execute(sql % (people["open_name"], \
            people["time"]))
           db_conn.commit()
        elif confidence2 >=70:
           GPIO.output(11, 1)  
           time.sleep(2)
           GPIO.output(11, 0)
           print 2
           peoples = (
           {"open_name": "Chenzhe", "time": localtime},
           )
           for people in peoples:
            cursor.execute(sql % (people["open_name"], \
            people["time"]))
           db_conn.commit()
        else:
           GPIO.output(11, 0)  
           time.sleep(1)
           print 3
           peoples = (
           {"open_name": "Stranger", "time": localtime},
           )
           for people in peoples:
            cursor.execute(sql % (people["open_name"], \
            people["time"]))
           db_conn.commit()
  else:
        GPIO.output(11, 0)
        print "No one"
3 .face++ 的Detect API
版本
3.0
描述
调用者提供图片文件或者图片URL,进行人脸检测和人脸分析。识别出的人脸会给出face_token,用于后续的人脸比对等操作。请注意,只对人脸包围盒面积最大的5个人脸进行分析,其他人脸可以使用Face Analyze API进行分析。如果您需要使用检测出的人脸于后续操作,建议将对应face_token添加到FaceSet中。如果一个face_token连续72小时没有存放在任意FaceSet中,则该face_token将会失效。如果对同一张图片进行多次人脸检测,同一个人脸得到的face_token是不同的。
图片要求
图片格式:JPG(JPEG),PNG
图片像素尺寸:最小48*48像素,最大4096*4096像素
图片文件大小:2MB
最小人脸像素尺寸: 系统能够检测到的人脸框为一个正方形,正方形边长的最小值为图像短边长度的48分之一,最小值不低于48像素。 例如图片为 4096*3200 像素,则最小人脸像素尺寸为 66*66 像素。
更新日志
2017年3月9日:人脸检测算法升级;提供了眼睛状态检测替换是否戴眼镜的检测;人脸模糊检测升级;提供了人种检测。
2017年3月28日:支持base64编码的图片。
调用URL
https://api-cn.faceplusplus点com/facepp/v3/detect
调用方法
POST
权限
不需要单独申请权限。
请求参数
是否必选
参数名
类型
参数说明
必选
api_key
String
调用此API的API Key
必选
api_secret
String
调用此API的API Secret
必选(三选一)
image_url
String
图片的URL。
注:在下载图片时可能由于网络等原因导致下载图片时间过长,建议使用image_file或image_base64参数直接上传图片。
image_file
File
一个图片,二进制文件,需要用post multipart/form-data的方式上传。
image_base64
String
base64编码的二进制图片数据
如果同时传入了image_url、image_file和image_base64参数,本API使用顺序为image_file优先,image_url最低。
可选
return_landmark
Int
是否检测并返回人脸五官和轮廓的83个关键点。
1:检测
0:不检测
注:默认值为0
可选
return_attributes
String
是否检测并返回根据人脸特征判断出的年龄,性别,微笑、人脸质量等属性,需要将需要检测的属性组织成一个用逗号分隔的字符串。目前支持:gender,age,smiling,headpose,facequality,blur,eyestatus,ethnicity 顺序没有要求。默认值为 none ,表示不检测属性。
注:facequality(人脸质量)是指图像中的人脸是否适合进行人脸比对,出现模糊、过亮、过暗、大侧脸、不完整等情况会影响人脸质量分数。
由于提供了eyestatus 眼睛状态监测,所以glass 参数将于2017-4-30日失效,请尽快修改程序使用 eyestatus
返回值说明
字段
类型
说明
request_id
String
用于区分每一次请求的唯一的字符串。
faces
Array
被检测出的人脸数组
注:如果没有检测出人脸则为空数组
image_id
String
被检测的图片在系统中的标识
time_used
Int
整个请求所花费的时间,单位为毫秒。
error_message
String
当请求失败时才会返回此字符串,具体返回内容见后续错误信息章节。否则此字段不存在。
faces数组中单个元素的结构
字段
类型
说明
face_token
String
人脸的标识
face_rectangle
Object
人脸矩形框,坐标数字为整数,代表像素点坐标
top:左上角纵坐标
left:左上角横坐标
width:宽度
height:高度
landmark
Object
人脸的83个关键点坐标数组。
attributes
Object
人脸属性特征,包括:
gender:性别分析结果,value的值为Male/Female。Male 代表男性,Female代表女性。
age:年龄分析结果,value的值为一个非负整数,标识估计的年龄。
smile:笑容分析结果,value的值为一个[0,100]的浮点数,小数点后3位有效数字,数值大表示笑程度高。threshold代表笑容的阈值,超过该阈值认为有笑容。
glass:是否佩戴眼镜的分析结果,value的值为None/Dark/Normal。None代表不佩戴眼镜,Dark代表佩戴墨镜,Normal代表佩戴普通眼镜。(请注意,motionblur 和 gaussianblur 将于2017-4-30日停止返回,请尽快停用)
headpose:人脸姿势分析结果,包括pitch_angle, roll_angle, yaw_angle,分别对应抬头,旋转(平面旋转),摇头。单位为角度。
blur:人脸模糊分析结果,包括以下两种分析(请注意,motionblur 和 gaussianblur 将于2017-4-30日停止返回,请尽快停用。目前两个字段的值会与新的blurness值相同)
  •                               motionblur: 人脸移动模糊度分析结果,value的值为是一个浮点数,范围[0,100], 小数点后3位有效数字。threshold表示人脸模糊度是否影响辨识的阈值。
  •                               gaussianblur:人脸高斯模糊度分析结果,value的值为是一个浮点数,范围[0,100], 小数点后3位有效数字。threshold表示人脸模糊度是否影响辨识的阈值。
  •                               blurness:新的人脸模糊分析结果,value的值为是一个浮点数,范围[0,100], 小数点后3位有效数字,数值大表示人脸模糊。threshold表示人脸模糊度是否影响辨识的阈值。
eyestatus: 眼睛状态信息 包括 left_eye_status,right_eye_status两个对象,分别代表左眼和右眼的状态。每个对象包括以下字段,值是一个浮点数,范围[0,100], 小数点后3位有效数字,总和等于100。
  •                               occlusion:眼睛被遮挡的置信度
  •                               no_glass_eye_open:不戴眼镜且睁眼的置信度
  •                               normal_glass_eye_close:佩戴普通眼镜且闭眼的置信度
  •                               normal_glass_eye_open:佩戴普通眼镜且睁眼的置信度
  •                               dark_glasses:佩戴墨镜的置信度
  •                               no_glass_eye_close:不戴眼镜且闭眼的置信
facequality: 人脸质量判断结果,value值为人脸的质量判断的分数,是一个浮点数,范围[0,100], 小数点后3位有效数字,数值大代表人脸质量高。threshold表示人脸质量基本合格的一个阈值,超过该阈值的人脸适合用于人脸比对。
ethnicity: 人种分析结果,value的值为Asian/White/Black。Asian代表亚洲人,White代表白人,Black代表黑人。

人脸关键点landmark的详细字段说明与图示请参考文档:
返回值示例
请求成功返回示例:
{
              "image_id": "Dd2xUw9S/7yjr0oDHHSL/Q==",
              "request_id": "1470472868,dacf2ff1-ea45-4842-9c07-6e8418cea78b",
              "time_used": 752,
              "faces": [{
                            "landmark": {
                                          "mouth_upper_lip_left_contour2": {
                                                        "y": 185,
                                                        "x": 146
                                          },
                                          "contour_chin": {
                                                        "y": 231,
                                                        "x": 137
                                          },
                                          .............省略关键点信息
                                          "right_eye_pupil": {
                                                        "y": 146,
                                                        "x": 205
                                          },
                                          "mouth_upper_lip_bottom": {
                                                        "y": 195,
                                                        "x": 159
                                          }
                            },
                            "attributes": {
                                          "gender": {
                                                        "value": "Female"
                                          },
                                          "age": {
                                                        "value": 21
                                          },
                                          "glass": {
                                                        "value": "None"
                                          },
                                          "headpose": {
                                                        "yaw_angle": -26.625063,
                                                        "pitch_angle": 12.921974,
                                                        "roll_angle": 22.814377
                                          },
                                          "smile": {
                                                        "threshold": 30.1,
                                                        "value": 2.566890001296997
                                          }
                            },
                            "face_rectangle": {
                                          "width": 140,
                                          "top": 89,
                                          "left": 104,
                                          "height": 141
                            },
                            "face_token": "ed319e807e039ae669a4d1af0922a0c8"
}

请求失败返回示例:
{
              "time_used": 3,
              "error_message": "MISSING_ARGUMENTS: image_url, image_file, image_base64",
              "request_id": "1470378968,c6f50ec6-49bd-4838-9923-11db04c40f8d"
}

当前API特有的ERROR_MESSAGE
HTTP状态代码
错误信息
说明
400
IMAGE_ERROR_UNSUPPORTED_FORMAT:<param>
参数<param>对应的图像无法正确解析,有可能不是一个图像文件、或有数据破损。
400
INVALID_IMAGE_SIZE:<param>
客户上传的图像像素尺寸太大或太小,图片要求请参照本API描述。<param>对应图像太大的那个参数的名称
400
INVALID_IMAGE_URL
无法从指定的image_url下载图片,图片URL错误或者无效
412
IMAGE_DOWNLOAD_TIMEOUT
下载图片超时
通用的ERROR_MESSAGE
HTTP 状态代码
错误信息
说明
401
AUTHENTICATION_ERROR
api_key和api_secret不匹配。
403
AUTHORIZATION_ERROR:<reason>
api_key没有调用本API的权限,具体原因为:用户自己禁止该api_key调用、管理员禁止该api_key调用、由于账户余额不足禁止调用。
目前的<reason>有:
  •                               Denied by Client(用户自己禁止该api_key调用)
  •                               Denied by Admin(管理员禁止该api_key调用)
  •                               Insufficient Account Balance(由于账户余额不足禁止调用)
403
CONCURRENCY_LIMIT_EXCEEDED
并发数超过限制。
400
MISSING_ARGUMENTS: <key>
缺少某个必选参数。
400
BAD_ARGUMENTS:<key>
某个参数解析出错(比如必须是数字,但是输入的是非数字字符串; 或者长度过长,etc.)
400
COEXISTENCE_ARGUMENTS
同时传入了要求是二选一或多选一的参数。如有特殊说明则不返回此错误。
413
Request Entity Too Large
客户发送的请求大小超过了2MB限制。该错误的返回格式为纯文本,不是json格式。
404
API_NOT_FOUND
所调用的API不存在。
500
INTERNAL_ERROR
服务器内部错误,当此类错误发生时请再次请求,如果持续出现此类错误,请及时联系技术支持团队。
调用示例
curl -X POST "https://api-cn.faceplusplus点com/facepp/v3/detect" -F "api_key=<api_key>" \
-F "api_secret=<api_secret>" \
-F "image_file=@image_file.jpg" \
-F "return_landmark=1" \
-F "return_attributes=gender,age"

4.face++的Compare API
版本
3.0
描述
将两个人脸进行比对,来判断是否为同一个人。支持传两张图片进行比对,或者一张图片与一个已知的face_token比对,也支持两个face_token进行比对。使用图片进行比对时会选取图片中检测到人脸尺寸最大的一个人脸。
图片要求
图片格式:JPG(JPEG),PNG
图片像素尺寸:最小48*48像素,最大4096*4096像素
图片文件大小:2MB
最小人脸像素尺寸: 系统能够检测到的人脸框为一个正方形,正方形边长的最小值为150像素。
更新日志
2017年3月28日:支持base64编码的图片。
调用URL
https://api-cn.faceplusplus点com/facepp/v3/compare
调用方法
POST
权限
不需要单独申请权限。
请求参数
是否必选
参数名
类型
参数说明
必选
api_key
String
调用此API的API Key
必选
api_secret
String
调用此API的API Secret
必选(四选一)
face_token1
String
第一个人脸标识face_token,优先使用本参数。
image_url1
String
第一张图片的URL
image_file1
File
第一张图片,二进制文件,需要用post multipart/form-data的方式上传。
image_base64_1
String
base64编码的二进制图片数据
如果同时传入了image_url1、image_file1和image_base64_1参数,本API使用顺序为image_file1优先,image_url1最低。
必选(四选一)
face_token2
String
第二个人脸标识face_token,优先使用本参数。
image_url2
String
第二张图片的URL
image_file2
File
第二张图片,二进制文件,需要用post multipart/form-data的方式上传。
image_base64_2
String
base64编码的二进制图片数据
如果同时传入了image_url2、image_file2和image_base64_2参数,本API使用顺序为image_file2优先,image_url2最低。
返回值说明
字段
类型
说明
request_id
String
用于区分每一次请求的唯一的字符串。
confidence
Float
比对结果置信度,范围 [0,100],小数点后3位有效数字,数字越大表示两个人脸越可能是同一个人。
注:如果传入图片但图片中未检测到人脸,则无法进行比对,本字段不返回。
thresholds
Object
一组用于参考的置信度阈值,Object类型,包含三个字段,均为Float类型、取值[0,100],小数点后3位有效数字。如果置信值低于“千分之一”阈值则不建议认为是同一个人,如果置信值超过“十万分之一”阈值,则是同一个人的几率非常高。
1e-3: 误识率为千分之一的置信度阈值;
1e-4: 误识率为万分之一的置信度阈值;
1e-5: 误识率为十万分之一的置信度阈值;
请注意:阈值不是静态的,每次比对返回的阈值不保证相同,所以没有持久化保存阈值的必要,更不要将当前调用返回的confidence与之前调用返回的阈值比较。
注:如果传入图片但图片中未检测到人脸,则无法进行比对,本字段不返回。
image_id1
String
被检测的image_url1、image_file1或image_base64_1在系统中的标识。
注:如果未使用image_url1、image_file1或image_base64_1传入图片,本字段不返回。
image_id2
String
被检测的image_url2、image_file2或image_base64_2在系统中的标识。
注:如果未使用image_url2、image_file2或image_base64_2传入图片,本字段不返回。
faces1
Array
从image_url1、image_file1或image_base64_1中检测出的人脸数组,采用数组中的第一个人脸进行人脸比对。
注:如果未使用image_url1、image_file1或image_base64_1传入图片,本字段不返回。如果没有检测出人脸则为空数组
faces2
Array
从image_url2、image_file2或image_base64_2中检测出的人脸数组,采用数组中的第一个人脸进行人脸比对。
注:如果未使用image_url2、image_file2或image_base64_2传入图片,本字段不返回。如果没有检测出人脸则为空数组
time_used
Int
整个请求所花费的时间,单位为毫秒。
error_message
String
当请求失败时才会返回此字符串,具体返回内容见后续错误信息章节。否则此字段不存在。
faces1和faces2数组中单个元素的结构
[td]
字段
类型
说明
face_token
String
人脸的标识
face_rectangle
Object
人脸矩形框,坐标数字为整数,代表像素点坐标
top:左上角纵坐标
left:左上角横坐标
width:宽度
height:高度
收费规则
当传入2个face_token进行比对时,收取人脸比对费用。
当传入图片进行比对时,收取人脸检测费用,如果同时传入2张图片收取2次人脸检测费用。当传入图片都检测到人脸的情况下,进行人脸比对,收取人脸比对费用。
当传入图片未检测出人脸,无法进行人脸比对时,只收取人脸检测费用,不收取人脸比对费用。
返回值示例
成功请求返回值示例:
{
  "time_used": 473,
  "confidence": 96.46,
  "thresholds": {
    "1e-3": 65.3,
    "1e-5": 76.5,
    "1e-4": 71.8
  },
  "request_id": "1469761507,07174361-027c-46e1-811f-ba0909760b18"
}

失败请求返回值示例:
{
  "time_used": 5,
  "error_message": "INVALID_FACE_TOKEN:c2fc0ad7c8da3af5a34b9c70ff764da0",
  "request_id": "1469761051,ec285c20-8660-47d3-8b91-5dc2bffa0049"
}

当前API特有的ERROR_MESSAGE
HTTP状态代码
错误信息
说明
400
INVALID_FACE_TOKEN: <face_token>
使用face_token作为参数时,所传的face_token不存在。
400
IMAGE_ERROR_UNSUPPORTED_FORMAT: <param>
参数<param>对应的图像无法正确解析,有可能不是一个图像文件、或有数据破损。
400
INVALID_IMAGE_SIZE: <param>
参数<param>对应的客户上传的图像像素尺寸太大或太小,图片要求请参照本API描述。<param>对应图像太大的那个参数的名称
400
INVALID_IMAGE_URL: <param>
无法从参数<param>对应的image_url下载图片,图片URL错误或者无效
412
IMAGE_DOWNLOAD_TIMEOUT: <param>
下载图片超时
通用的ERROR_MESSAGE
HTTP 状态代码
错误信息
说明
401
AUTHENTICATION_ERROR
api_key和api_secret不匹配。
403
AUTHORIZATION_ERROR: <reason>
api_key没有调用本API的权限,具体原因为:用户自己禁止该api_key调用、管理员禁止该api_key调用、由于账户余额不足禁止调用。
目前的<reason>有:
  •                               Denied by Client(用户自己禁止该api_key调用
  •                               Denied by Admin(管理员禁止该api_key调用
  •                               Insufficient Account Balance(由于账户余额不足禁止调用
403
CONCURRENCY_LIMIT_EXCEEDED
并发数超过限制。
400
MISSING_ARGUMENTS: <key>
缺少某个必选参数。
400
BAD_ARGUMENTS: <key>
某个参数解析出错(比如必须是数字,但是输入的是非数字字符串; 或者长度过长,etc.)
400
COEXISTENCE_ARGUMENTS
同时传入了要求是二选一或多选一的参数。如有特殊说明则不返回此错误。
413
Request Entity Too Large
客户发送的请求大小超过了2MB限制。该错误的返回格式为纯文本,不是json格式。
404
API_NOT_FOUND
所调用的API不存在。
500
INTERNAL_ERROR
服务器内部错误,当此类错误发生时请再次请求,如果持续出现此类错误,请及时联系技术支持团队。
调用示例
curl -X POST "https://api-cn.faceplusplus点com/facepp/v3/compare" \
-F "api_key=<api_key>" \
-F "api_secret=<api_secret>" \
-F "face_token1=c2fc0ad7c8da3af5a34b9c70ff764da0" \
-F "face_token2=ad248a809408b6320485ab4de13fe6a9"

本人初学,仅供参考,存在错误和不足之处,请大家回帖多多指教,切勿照搬
以上图文的Word格式文档下载(内容和本网页上的一模一样,方便大家保存):
嵌入式综合实践-组.docx (1.27 MB, 下载次数: 143)

评分

参与人数 4黑币 +59 收起 理由
roachwz + 5 绝世好帖!
stu + 3 很给力!
Huaic520 + 1 绝世好帖!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶3 踩
回复

使用道具 举报

沙发
ID:300072 发表于 2018-3-31 19:56 | 只看该作者
看起来很NICE!
回复

使用道具 举报

板凳
ID:329279 发表于 2018-5-14 08:04 | 只看该作者
看起来还不错
回复

使用道具 举报

地板
ID:401726 发表于 2018-9-24 09:30 | 只看该作者
楼主介绍的非常详细啊,谢谢分享
回复

使用道具 举报

5#
ID:403067 发表于 2018-9-27 13:40 | 只看该作者
正好需要,非常感谢
回复

使用道具 举报

6#
ID:403067 发表于 2018-10-11 09:57 来自手机 | 只看该作者
对了楼主,楼主用的opencv是2.4.9吗?
回复

使用道具 举报

7#
ID:408082 发表于 2018-10-11 15:04 | 只看该作者
正在搞类似的项目 来参考一下
回复

使用道具 举报

8#
ID:406408 发表于 2018-10-12 10:03 来自手机 | 只看该作者
挺好,只限于调试。正常用会用红外感应或者人体感应来触发摄像头,毕竟摄像头的功耗不小。
回复

使用道具 举报

9#
ID:434428 发表于 2018-11-30 19:59 | 只看该作者
学习了
回复

使用道具 举报

10#
ID:93667 发表于 2018-12-5 11:49 | 只看该作者
哦。不错,可惜资料不齐全
回复

使用道具 举报

11#
ID:444661 发表于 2019-10-22 21:07 | 只看该作者
感谢。。。达到
回复

使用道具 举报

12#
ID:282095 发表于 2020-3-26 11:38 | 只看该作者
尝试python+OpenCV也是可以的
回复

使用道具 举报

13#
ID:555216 发表于 2020-5-19 20:27 | 只看该作者
这个简直太棒了,就和电影里一样,面部开锁
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表