1. 简介
人脸识别技术是图像识别领域的一个热门方向,它是基于计算机视觉、模式识别以及人工智能等相关技术的结合而诞生的。近年来,人脸识别技术在各个领域中得到了广泛的应用,如门禁系统、考勤打卡、公安的视频监控等。
目前,市场上有许多的人脸识别技术,其中百度AI的人脸识别技术深受广大用户喜爱。本文将介绍如何使用Golang对接百度AI接口实现人脸识别。
2. 准备工作
2.1 百度AI账号申请
使用百度AI人脸识别接口,需要先注册百度智能云账号并开通AI服务,并通过认证,创建一个人脸识别应用并获取API Key和Secret Key。API Key和Secret Key是接口访问的身份识别标识,在代码中会使用到。
2.2 Golang开发环境
Golang是Google开发的一种编程语言,它拥有高效的编译器、简洁的语法和强大的并发能力。在本文中,我们需要使用Golang来编写代码并调用百度AI的人脸识别接口。
在开始之前,需要准备好Golang的编译环境,可以前往官方网站下载对应平台的安装包进行安装。
2.3 百度AI Go SDK安装
由于接下来我们所要使用的百度AI Go SDK比较方便,所以选择使用百度AI Go SDK进行人脸识别接口对接。
首先,我们需要通过以下命令行安装Go SDK:
go get github.com/chenqinghe/baidu-ai-go-sdk/visionface
然后,将以下代码段复制到你的代码中,依次填入API key和Secret Key:
package main
import (
"log"
"github.com/chenqinghe/baidu-ai-go-sdk/visionface"
)
func main() {
// Set client configurations
apiKey := "YOUR_API_KEY_HERE"
secretKey := "YOUR_SECRET_KEY_HERE"
options := &visionface.Options{
APIKey: apiKey,
APISecret: secretKey,
DetectionMaxFaces: 2,
}
client, err := visionface.NewClient(options)
if err != nil {
log.Fatalf("err: %v\n", err)
}
// Do face detect
result, err := client.FaceDetect("https://openid.niuer.cn/FuLJsCduqdBT_sQjGEIn6K2hRaHU", nil)
if err != nil {
log.Fatalf("err: %v\n", err)
}
log.Printf("result: %+v\n", result)
}
运行后,在运行目录下会出现百度AI返回的人脸识别结果。如下图所示:
result: +{Errors:[] 刘德华全身照图像id: s80zqbzb0rfkave3omnqejwhKLKlBQYCyG
0人脸检测是否成功,0-成功,非0-失败 Facenum: 1 表示检测出的人脸数量,大于0表示检测成功,小于等于0则表示检测失败 Faces:[] 是否为人脸 face_token: 797f9e847d0788f5cfaab960d78a2a87 face_probability:0.988344 表示人脸的置信度,范围[0,1],代表人脸面积占比在图片中的大小位置。 x: 147 左上角x坐标
y: 70 左上角y坐标
width: 183 人脸区域往右的宽度
height: 183 人脸区域往下的高度
rotation: -3 人脸旋转角度,顺时针方向旋转为正
landmark: 人脸关键点,眼睛、眉毛、鼻子、嘴巴的位置
left_eye: {X: 181 Y: 126}
right_eye: {X: 238 Y: 135}
nose: {X: 208 Y: 169}
left_mouth: {X: 183 Y: 191}
right_mouth: {X: 236 Y: 198}
}
3. 实战:使用Golang对接百度AI接口实现人脸识别
3.1 代码实现
在开始编写代码之前,我们需要先了解一下人脸识别的接口以及参数要求。
百度AI人脸识别API提供了两个接口:人脸检测与属性分析和人脸比对。本文主要介绍如何使用人脸检测与属性分析接口实现人脸识别。
人脸检测与属性分析接口用于检测上传图像中的人脸位置、五官位置、年龄、性别等属性信息。接口文档地址:https://ai.baidu.com/ai-doc/FACE/Lk37c1tpf
使用百度AI Go SDK实现人脸检测功能非常简单。我们只需要创建一个百度AI Go SDK的客户端,并调用客户端的FaceDetect方法,即可实现人脸检测功能。下面为具体代码实现:
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"mime/multipart"
"net/http"
"os"
)
var (
APIKey = ""
APISecret = ""
IMAGE_URL = "http://m.360buyimg.com/n12/" +
"jfs/t5214/48/1064542573/132776/84daa6a6/590e3529Nf4aa465c.jpg"
)
const URL = "https://aip.baidubce.com/rest/2.0/face/v3/detect"
type Result struct {
FaceNum int `json:"face_num"`
Faces []FaceInfo
ErrorMsg string `json:"error_msg"`
}
type FaceInfo struct {
Location Location
FaceTokens []string `json:"face_token"`
}
type Location struct {
Width int
Top int
Left int
Height int
Rotation int
}
func main() {
// Step 1. Get Token
accessToken, _ := GetToken(APIKey, APISecret)
// Step 2. Face Detect
result, err := FaceDetect(accessToken, IMAGE_URL)
if err != nil {
log.Fatal(err)
}
// Output Result
fmt.Println("===========Person Info===========")
if len(result.Faces) == 0 {
fmt.Println("No Person Detected.")
return
}
for i, face := range result.Faces {
fmt.Println("Person", i+1)
fmt.Printf("Face Token: %v\n", face.FaceTokens)
fmt.Printf("Position: %v\n", face.Location)
}
}
func FaceDetect(token, imageUrl string) (*Result, error) {
url := URL + "?access_token=" + token
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)
fileWriter, err := bodyWriter.CreateFormFile("image", "image.jpg")
if err != nil {
log.Fatal(err)
}
err = DownloadFile(fileWriter, imageUrl)
if err != nil {
log.Fatal(err)
}
contentType := bodyWriter.FormDataContentType()
bodyWriter.Close()
req, err := http.NewRequest("POST", url, bodyBuf)
req.Header.Set("Content-Type", contentType)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
respBody, err := ioutil.ReadAll(resp.Body)
res := &Result{}
json.Unmarshal(respBody, res)
return res, nil
}
func DownloadFile(writer *multipart.Writer, url string) error {
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
fileData, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
fileType := http.DetectContentType(fileData)
_, err = writer.CreateFormFile("image", "image.jpg")
if err != nil {
return err
}
writer.WriteField("Content-Type", fileType)
writer.Write(fileData)
return nil
}
type TokenResult struct {
AccessToken string `json:"access_token"`
}
func GetToken(apiKey, secretKey string) (string, error) {
url := "https://aip.baidubce.com/oauth/2.0/token" +
"?grant_type=client_credentials" +
"&client_id=" + apiKey +
"&client_secret=" + secretKey
client := &http.Client{}
req, err := http.NewRequest("POST", url, nil)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
respBody, err := ioutil.ReadAll(resp.Body)
res := &TokenResult{}
json.Unmarshal(respBody, res)
return res.AccessToken, nil
}
3.2 代码说明
上面的代码段中,我们主要使用了百度AI Go SDK提供的VisionFace的FaceDetect方法进行人脸检测,同时还使用了标准库的net/http、mime/multipart、encoding/json等包进行http请求、文件上传以及json解析。
3.3 运行结果
将上面的代码保存为go文件,并在命令行中执行,我们可以看到如下人脸识别结果。
===========Person Info===========
Person 1
Face Token: [be4d2b511e35b0018e216fc84e8aa6d0]
Position: {183 70 147 183 -3}
4. 总结
本文介绍了如何使用Golang对接百度AI接口实现人脸识别。我们通过先获取Access Token,然后使用其进行人脸检测,同时在代码中结合百度AI Go SDK和标准库的net/http、mime/multipart、encoding/json等包,实现人脸识别功能。希望本文对大家学习Golang和人脸识别有所帮助。