动手实践:使用Golang对接百度AI接口实现人脸识别

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和人脸识别有所帮助。

后端开发标签