调用face++平台api进行人脸识别

本文介绍如何使用Face++ API进行人脸检测,包括在Ubuntu环境下安装Python-OpenCV、调用Face++ API的具体步骤及代码实现,并展示了实际检测效果。

转载请注明出处:http://blog.youkuaiyun.com/hongbin_xuhttp://hongbin96.com/
文章链接:http://blog.youkuaiyun.com/hongbin_xu/article/details/74981819http://hongbin96.com/125

Face++介绍:

Face++平台提供一整套世界领先的人脸检测,人脸识别,面部分析的视觉技术服务。通过提供云端API、离线SDK等供用户进行开发,像支付宝人脸支付使用的技术就是Face++。(face++的介绍

每个人在Face++的官网注册账号后可以申请新建API,填写相关信息后,随后会分配API key和 API Secrect。我们可以选择试用的服务,由于是免费的有的功能不支持。
这里写图片描述

分配的API key和 API Secrect,有了这两个东西才能调用api。
这里写图片描述

官网提供了API文档和演示。
这里写图片描述

打开api文档可以查看详细说明,很详细不多说了。
这里写图片描述

实验平台:

我的测试程序是在Ubuntu下自带的Python环境下编写,用到了Python-OpenCV,所以要装一下Python-OpenCV。

console下输入:

sudo apt-get install python-opencv

很快就会安装完成,并且会自动配置好环境变量。

import cv包和cv2包看看,发现没有报错,安装成功。
这里写图片描述

代码:

# -*- coding:utf-8 -*-
import cv2
import urllib2
import urllib
import time

#读取原图,并显示
img = cv2.imread("football_players.jpeg")
cv2.namedWindow("原图")
cv2.imshow("原图", img)

#URL
http_url='https://api-cn.faceplusplus.com/facepp/v3/detect' 
#用户信息
key = "RU8VkInUd4zpcCo2GbKxPz90rPoaY5O0"    
secret = "01YadiHNX_Fpqw6saBYa2POD6ozL6gWu"
#图片存储路径
filepath = r"/home/xhb/Study/FaceRecognition/python-opencv-face++/football_players.jpeg"

#这后面的都是给的示例代码,调用API接口
boundary = '----------%s' % hex(int(time.time() * 1000))
data = []
data.append('--%s' % boundary)
data.append('Content-Disposition: form-data; name="%s"\r\n' % 'api_key')
data.append(key)
data.append('--%s' % boundary)
data.append('Content-Disposition: form-data; name="%s"\r\n' % 'api_secret')
data.append(secret)
data.append('--%s' % boundary)
fr=open(filepath,'rb')
data.append('Content-Disposition: form-data; name="%s"; filename=" "' % 'image_file')
data.append('Content-Type: %s\r\n' % 'application/octet-stream')
data.append(fr.read())
fr.close()
data.append('--%s--\r\n' % boundary)

http_body='\r\n'.join(data)
#buld http request
req=urllib2.Request(http_url)
#header
req.add_header('Content-Type', 'multipart/form-data; boundary=%s' % boundary)
req.add_data(http_body)
try:
    #req.add_header('Referer','http://remotserver.com/')
    #post data to server
    resp = urllib2.urlopen(req, timeout=5)
    #get response
    qrcont=resp.read()
    print qrcont        #打印出得到的结果

except urllib2.HTTPError as e:
    print e.read()

#进过测试前面的程序会返回一个字典,其中指出了人脸所在的矩形的位置和大小等,所以直接进行标注
mydict = eval(qrcont)
faces = mydict["faces"]
faceNum = len(faces)
print("识别到了%d个人脸"%(faceNum))

for i in range(faceNum):
    face_rectangle = faces[i]['face_rectangle']
    width =  face_rectangle['width']
    top =  face_rectangle['top']
    left =  face_rectangle['left']
    height =  face_rectangle['height']
    start = (left, top)
    end = (left+width, top+height)
    color = (55,255,155)
    thickness = 3
    cv2.rectangle(img, start, end, color, thickness)

cv2.namedWindow("识别后")
cv2.imshow("识别后", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

# print type(resp)

程序不复杂,按照程序思路简单解释下:
1、指定图片的名称,读取图片,并显示。

#读取原图,并显示
img = cv2.imread("football_players.jpeg")
cv2.namedWindow("原图")
cv2.imshow("原图", img)

把图片直接放在当前目录下即可(图片是巴萨的<( ̄︶ ̄)>)。
这里写图片描述

2、填一些调用api相关的信息,根据需要自己改就行。

#URL
http_url='https://api-cn.faceplusplus.com/facepp/v3/detect' 
#用户信息
key = "RU8VkInUd4zpcCo2GbKxPz90rPoaY5O0"    
secret = "01YadiHNX_Fpqw6saBYa2POD6ozL6gWu"
#图片存储路径
filepath = r"/home/xhb/Study/FaceRecognition/python-opencv-face++/football_players.jpeg"

从api文档可以查到,detect的URL:
https://api-cn.faceplusplus.com/facepp/v3/detect
这里写图片描述

用户信息要填上自己在前面申请的API Key和API Secret。
这里写图片描述

要传送图片到face++的服务器去进行识别,填上图片所在的目录的路径:

当前目录路径+图片名。

#图片存储路径
filepath = r"/home/xhb/Study/FaceRecognition/python-opencv-face++/football_players.jpeg"

这里写图片描述

3、中间的程序其实就是把信息封装一下,建立网络链接,然后跟服务器通信。调用urlopen()访问服务器,返回resp,打印结果。

try:
    #req.add_header('Referer','http://remotserver.com/')
    #post data to server
    resp = urllib2.urlopen(req, timeout=5)
    #get response
    qrcont=resp.read()
    print qrcont        #打印出得到的结果

except urllib2.HTTPError as e:
    print e.read()

4、resp是返回的数据。调用read()方法,转换成qrcont,这是个字符串,然后在终端打印出来。
终端的全部打印信息:
这里写图片描述
很明显,返回的resp是一个字典,其中记录了一些图片的信息,还有识别出的人脸的位置。
qrcont是一组字符串,调用eval()函数将其转换回字典类型,取出来再处理一下,在图片上标识出人脸的位置。

#进过测试前面的程序会返回一个字典,其中指出了人脸所在的矩形的位置和大小等,所以直接进行标注
mydict = eval(qrcont)
faces = mydict["faces"]
faceNum = len(faces)
print("识别到了%d个人脸"%(faceNum))

for i in range(faceNum):
    face_rectangle = faces[i]['face_rectangle']
    width =  face_rectangle['width']
    top =  face_rectangle['top']
    left =  face_rectangle['left']
    height =  face_rectangle['height']
    start = (left, top)
    end = (left+width, top+height)
    color = (55,255,155)
    thickness = 3
    cv2.rectangle(img, start, end, color, thickness)

运行结果:

这里写图片描述

### 如何在HTML5中使用face-api.js进行面部识别 face-api.js 是一个功能强大的 JavaScript 库,用于在浏览器中实现人脸识别功能。以下是关于如何在 HTML5 环境中使用 face-api.js 的教程及示例代码。 #### 1. 导入 face-api.js 首先,需要从官方仓库获取 face-api.js 的最新版本或缩减版,并将其导入到 HTML 文件中。可以通过以下方式完成: ```html <script src="https://cdn.jsdelivr.net/npm/face-api.js@latest/build/face-api.min.js"></script> ``` 或者下载本地文件后,使用以下方法导入[^1]: ```html <script src="face-api.js"></script> ``` #### 2. 准备训练模型 face-api.js 提供了多种预训练模型以支持不同的人脸检测和识别任务。这些模型需要加载到内存中才能使用。常见的模型包括 `tinyFaceDetector` 和 `ssdMobilenetv1`。 以下是一个加载模型的示例代码: ```javascript async function loadModels() { await faceapi.nets.tinyFaceDetector.loadFromUri('/models'); await faceapi.nets.faceLandmark68Net.loadFromUri('/models'); await faceapi.nets.faceRecognitionNet.loadFromUri('/models'); await faceapi.nets.faceExpressionNet.loadFromUri('/models'); } ``` 注意:上述代码中的 `/models` 路径应指向包含模型文件的目录。可以从 [face-api.js 官方 GitHub](https://github.com/justadudewhohacks/face-api.js) 下载这些模型文件[^3]。 #### 3. 检测人脸 加载模型后,可以使用 face-api.js 提供的 API 来检测图像中的人脸。以下是一个简单的示例: ```javascript async function detectFaces(imageUrl) { const img = await faceapi.fetchImage(imageUrl); const detections = await faceapi.detectAllFaces(img, new faceapi.TinyFaceDetectorOptions()).withFaceLandmarks().withFaceExpressions(); return detections; } ``` 此函数会返回检测到的所有人脸信息,包括位置、地标点和表情等[^2]。 #### 4. 绘制检测结果 为了可视化检测结果,可以将人脸框绘制到画布上。以下是一个示例代码: ```javascript function drawResults(canvas, detections) { const ctx = canvas.getContext('2d'); faceapi.draw.drawDetections(canvas, detections); faceapi.draw.drawFaceLandmarks(canvas, detections); faceapi.draw.drawFaceExpressions(canvas, detections); } ``` #### 5. 完整示例 以下是一个完整的 HTML 示例,展示如何使用 face-api.js 进行人脸检测: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Face API Demo</title> <script src="https://cdn.jsdelivr.net/npm/face-api.js@latest/build/face-api.min.js"></script> </head> <body> <canvas id="canvas"></canvas> <script> async function main() { const canvas = document.getElementById('canvas'); const imageUrl = 'path/to/your/image.jpg'; // 加载模型 await faceapi.nets.tinyFaceDetector.loadFromUri('/models'); await faceapi.nets.faceLandmark68Net.loadFromUri('/models'); await faceapi.nets.faceRecognitionNet.loadFromUri('/models'); await faceapi.nets.faceExpressionNet.loadFromUri('/models'); // 检测人脸 const img = await faceapi.fetchImage(imageUrl); const detections = await faceapi.detectAllFaces(img, new faceapi.TinyFaceDetectorOptions()) .withFaceLandmarks() .withFaceExpressions(); // 绘制结果 const resizedDetections = faceapi.resizeResults(detections, canvas.width / img.width); drawResults(canvas, resizedDetections); } function drawResults(canvas, detections) { const ctx = canvas.getContext('2d'); faceapi.draw.drawDetections(canvas, detections); faceapi.draw.drawFaceLandmarks(canvas, detections); faceapi.draw.drawFaceExpressions(canvas, detections); } main(); </script> </body> </html> ``` #### 注意事项 - 确保 `/models` 目录下的模型文件与代码中的路径一致。 - 如果使用的是本地服务器,请确保跨域问题已解决,或者通过配置 `vue.config.js` 文件来设置代理[^4]。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值