Golang实现人脸活体检测?百度AI接口帮你搞定!

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中调用人脸活体检测接口,并提供了代码示例。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签