1. 前言
在现代人工智能技术的应用中,人脸识别一直是一个重要的领域。与此同时,人工智能也在稳步地向“人性化”与“更加靠谱”的方向发展。活体检测作为人脸识别技术的一项关键技术,其在人脸登陆、实名认证等领域中应用广泛。本篇文章将介绍如何运用百度AI接口进行Golang实现的人脸活体检测。
2. 接口简介
要了解人脸活体检测,首先要了解如何调用百度AI接口。这一部分将简单介绍百度AI接口。
2.1 百度AI开放平台
百度AI开放平台是百度自然语言处理团队面向用户提供的一整套完整、简洁、稳定、可靠的自然语言处理服务的云计算平台。百度AI开放平台提供了众多自然语言处理功能,包括人脸识别、人体分析、图像识别、OCR文本识别等众多开放接口。使用百度AI开放平台只需要注册账号,申请API Key即可。
2.2 人脸活体检测接口
人脸活体检测接口是百度AI开放平台提供的一种通过摄像头等设备完成现场人脸采集,并对采集到的人脸进行照片活体判断的能力。该接口可以保证人脸采集过程真实性,且具有一定的防止攻击的能力。可广泛应用于安全认证场景、人脸捕捉采集场景、会议签到等应用场景。
接口访问地址:https://aip.baidubce.com/rest/2.0/face/v3/faceverify
请求参数:
|参数名称|类型|参数类型|是否可选|是否必须|默认值|说明|
|---|---|---|---|---|---|---|
|image|string|Body|required|是| - |图像数据,需urlencode后上传,要求至少一张图片,图像不能超过10M,建议二进制方式(post方式请求)上传。参数内容为BASE64编码后的字符串,需urlencode后上传。图片不用特意限制大小,但超过10M的图片上传会较缓慢。 |
|image_type|string|Body|optional|否|FACE_TOKEN|图片类型:BASE64,URL,FACE_TOKEN。|
|face_field|string|Body|optional|否|none|包括age、beauty、expression、faceshape、gender、glasses、landmark、race、quality。逗号分隔。默认只返回face_token、活体信息和人脸框位置。 |
|liveness_control|string|Body|optional|否|NONE|活体检测控制。NONE:不进行控制,HIGH:较高的活体要求(生动、不遮挡),NORMAL:一般的活体要求(如佩戴口罩、戴眼镜),LOW:宽松的活体要求(翻照、遮挡)。若活体检测结果不满足要求,则返回结果中会提示活体检测失败,不会判断为照片。 |
返回参数:
|参数名称|类型|说明|
|---|---|---|
|log_id|uint64|请求唯一ID,用于问题定位|
|error_code|int32|错误码,非0即失败。|
|error_msg|string|错误信息描述。|
|cached|uint32|0:非缓存结果;1:缓存结果|
|result|object|活体检测结果。 |
|face_liveness|float|活体得分。[0~1],大于0.6可以判定为活体,小于0.6则判定为非活体。调用定制活体模型时会返回该字段。 |
|thresholds|object|用户设置的阈值。|
|face_list|array[object]|人脸列表。|
|face_token|string|人脸唯一标识。 |
|location|object|人脸在图片中的位置。 |
|left|int32|人脸框的左上角横坐标。|
|top|int32|人脸框的左上角纵坐标。|
|width|int32|人脸框的宽度。|
|height|int32|人脸框的高度。|
请求示例:
{
"image":"[base64]",
"image_type":"BASE64",
"face_field":"beauty,age,expression,faceshape,gender,glasses,landmark",
"liveness_control":"LOW"
}
返回结果示例:
{
"log_id": 12345,
"error_code":0,
"cached":0,
"error_msg":"",
"result": {
"face_liveness": 0.94,
"thresholds": {
"frr_1e-3": 0.42,
"frr_1e-4": 0.6,
"frr_1e-5": 0.75
},
"face_list": [
{
"face_token": "cff48cbb65375b5ab06fe1d6292aa96f",
"location": {
"left": 120.54,
"top": 117.37,
"width": 242,
"height": 259,
"rotation": 0
},
"face_probability": 1,
"angle": {
"yaw": -1.28,
"pitch": 20.25,
"roll": -0.75
},
"age": 36,
"beauty": 75.42,
"expression": {
"type": "smile",
"probability": 0.97
},
"face_shape": {
"type": "heart",
"probability": 0.92
},
"gender": {
"type": "female",
"probability": 1
},
"glasses": {
"type": "common",
"probability": 0.94
},
"emotion": {
"type": "happy",
"probability": 0.38
}
}
]
}
}
3. Golang实现人脸活体检测
有了人脸活体检测的接口简介,接下来介绍如何在Golang中实现人脸活体检测。
3.1 引入必要库文件
以下是在Golang中实现人脸活体检测所必须引用的库文件:
import (
"net/url"
"net/http"
"math/rand"
"crypto/md5"
"encoding/hex"
"io/ioutil"
"strings"
"encoding/json"
)
3.2 编写HTTP请求签名方法
在调用人脸活体检测接口时,需要在HTTP请求header中包含签名信息。这个签名信息可以通过签名算法及特定的请求参数计算得出。下面是一个计算百度AI接口请求签名的方法:
type BaiduAI struct {
AppID string
APIKey string
SecretKey string
}
func (api *BaiduAI) getSign(params map[string]string) string {
strs := []string{}
for k, v := range params {
strs = append(strs, k+"="+v)
}
strs = append(strs, "access_token="+api.getToken())
sort.Strings(strs)
signStr := strings.Join(strs, "&")
signStr += api.SecretKey
h := md5.New()
h.Write([]byte(signStr))
return hex.EncodeToString(h.Sum(nil))
}
func (api *BaiduAI) getToken() string {
params := url.Values{}
params.Set("grant_type", "client_credentials")
params.Set("client_id", api.APIKey)
params.Set("client_secret", api.SecretKey)
tokenURL := "https://aip.baidubce.com/oauth/2.0/token?" + params.Encode()
resp, err := http.Get(tokenURL)
if err != nil {
fmt.Println("[ERROR] 获取Access Token失败")
panic(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("[ERROR] 读取返回数据失败")
panic(err)
}
respData := map[string]interface{}{}
err = json.Unmarshal(body, &respData)
if err != nil {
fmt.Println("[ERROR] 解析返回数据失败")
panic(err)
}
return respData["access_token"].(string)
}
3.3 实现人脸活体检测方法
当有了签名算法和请求参数后,我们就可以实现人脸活体检测的方法:
func (api *BaiduAI) FaceVerify(image string) map[string]interface{} {
params := map[string]string{}
// 在这里填写所有请求参数
// 详细参数请参考http://ai.baidu.com/docs#/Face-Verify-API/top
params["image"] = image
params["image_type"] = "BASE64"
params["face_field"] = "age,beauty,expression,faceshape,gender,glasses,landmark"
params["liveness_control"] = "LOW"
// 获取签名信息
sign := api.getSign(params)
// 构造请求URL
apiURL := "https://aip.baidubce.com/rest/2.0/face/v3/faceverify?access_token=" + api.getToken()
// 定义http header
header := http.Header{}
header.Set("Content-Type", "application/json")
// 构造HTTP请求数据
data := map[string]interface{}{}
data["image"] = image
data["image_type"] = "BASE64"
data["face_field"] = "age,beauty,expression,faceshape,gender,glasses,landmark"
data["liveness_control"] = "LOW"
jsonData, err := json.Marshal(data)
if err != nil {
fmt.Println("[ERROR] JSON序列化失败")
panic(err)
}
// 构造HTTP请求
client := http.Client{}
req, err := http.NewRequest("POST", apiURL, strings.NewReader(string(jsonData)))
if err != nil {
fmt.Println("[ERROR] 构建HTTP请求失败")
panic(err)
}
req.Header = header
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Referer", "https://www.baidu.com")
req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/79 Safari/537.36")
req.Header.Set("Reqid", api.generateReqid())
req.Header.Set("Sdk-Version", "2019-11-01")
req.Header.Set("Sign", sign)
req.Header.Set("Time-Stamp", fmt.Sprintf("%d", time.Now().Unix()))
// 发送HTTP请求
resp, err := client.Do(req)
if err != nil {
fmt.Println("[ERROR] HTTP请求发送失败")
panic(err)
}
defer resp.Body.Close()
// 解析HTTP返回数据
respData, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("[ERROR] 读取HTTP返回数据失败")
panic(err)
}
dataMap := map[string]interface{}{}
err = json.Unmarshal(respData, &dataMap)
if err != nil {
fmt.Println("[ERROR] 解析HTTP返回数据失败")
panic(err)
}
return dataMap
}
func (api *BaiduAI) generateReqid() string {
rand.Seed(time.Now().UnixNano())
reqid := ""
for i := 0; i < 10; i++ {
num := rand.Intn(10)
reqid += fmt.Sprintf("%d", num)
}
return reqid
}
4. 程序运行及结果展示
写完了以上代码后,我们就可以在Golang中调用人脸活体检测接口了。以下是一个简单的程序示例:
package main
import (
"fmt"
"io/ioutil"
"encoding/base64"
)
func main() {
// 读取图片数据
imageFile, err := ioutil.ReadFile("./test.jpg")
if err != nil {
panic(err)
}
image := base64.StdEncoding.EncodeToString(imageFile)
// 执行人脸活体检测
api := BaiduAI{
AppID: "22801211",
APIKey: "YhP4imUFFQQWhfptB1dxIppO",
SecretKey: "BATZnX7uyq8kO77LW9RzEaoQIFYzdPKH",
}
verifyData := api.FaceVerify(image)
// 输出结果
fmt.Println("Error Code:", verifyData["error_code"].(float64))
fmt.Println("Error Message:", verifyData["error_msg"].(string))
fmt.Println("Face Liveness:", verifyData["result"].(map[string]interface{})["face_liveness"].(float64))
}
上述代码读入了一张图片(test.jpg)并输出了人脸活体检测结果。注意,调用人脸活体检测接口需要先在百度AI开发平台上注册账号并创建App ID并获得API Key和Secret Key。
5. 总结
人脸活体检测作为人脸识别技术的一项关键技术,可以保证采集过程真实性,并具有一定的防止攻击的能力。百度AI开放平台提供了人脸活体检测接口供开发者使用,使用该接口需要先在百度AI开发平台上注册并获取API Key和Token。通过调用该接口,开发者可以轻松实现该功能。这里详细介绍了如何在Golang中调用人脸活体检测接口,并提供了代码示例。