Nodejs调用百度AI接口实现人脸识别

百度AI提供了很是强大的AI接口,能够很是容易实现诸如图片识别,语音识别,文字识别,人脸识别等功能。 下面以人脸识别为例,说明下如何经过Nodejs调取百度AI接口,实现识别人脸的位置、年龄、性别、颜值、情绪等信息。前端

1. 项目建立

首先使用Express的脚手架建立一个项目。 对于Express不熟悉的同窗能够先看看这篇文档:www.expressjs.com.cn/ios

安装 express脚手架redis

npm install express-generator -g
复制代码

建立项目:express

express  myapp
复制代码

项目建立好以后,安装 axios,用来作网络请求。npm

npm i axios -S
复制代码

2. 登陆百度AI,建立项目

在正式调用接口前,须要先注册好百度的帐号,而后登陆百度AI开放平台:ai.baidu.com/ 登陆成功后点右上角进入到控制台。axios

点击左侧的人脸识别,进去以后,建立一个项目。在建立页面,根据本身的需求填写就能够。 点击管理项目能够看到项目列表。在这里能够获取到项目的API Key和Secret Key,之后会用到。

3. 获取Access Token

调用人脸识别的接口的时候,须要传入一个Access Token参数,因此咱们须要先获取下这个token。浏览器

获取Access Token

请求URL数据格式缓存

向受权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上如下参数:bash

  • grant_type: 必须参数,固定为client_credentials;
  • client_id: 必须参数,应用的API Key;
  • client_secret: 必须参数,应用的Secret Key;

服务器返回的JSON文本参数以下:服务器

  • access_token: 要获取的Access Token;
  • expires_in: Access Token的有效期(秒为单位,通常为1个月);
  • 其余参数忽略,暂时不用;

例如:

{
  "refresh_token": "25.b55fe1d287227ca97aab219bb249b8ab.315360000.1798284651.282335-8574074",
  "expires_in": 2592000,
  "scope": "public wise_adapt",
  "session_key": "9mzdDZXu3dENdFZQurfg0Vz8slgSgvvOAUebNFzyzcpQ5EnbxbF+hfG9DQkpUVQdh4p6HbQcAiz5RmuBAja1JJGgIdJI",
  "access_token": "24.6c5e1ff107f0e8bcef8c46d3424a0e78.2592000.1485516651.282335-8574074",
  "session_secret": "dfac94a3489fe9fca7c3221cbf7525ff"
}
复制代码

token的有效时间为:2592000ms。最好把token缓存起来。这里我使用redis来缓存。

安装redis

我以Mac说明 到redis官网下载redis:redis.io/ 下载完成后:

  1. 解压:tar zxvf redis-4.0.10.tar.gz
  2. 移动到: mv redis-4.0.10 /usr/local/
  3. 切换到:cd /usr/local/redis-4.0.10/
  4. 编译测试: sudo make test
  5. 编译安装: sudo make install
  6. 启动: redis-server
  7. 新建一个终端窗口,输入命令行redis-cli
  8. 保存数据 set name 'davie'
  9. 获取数据 get name

安装 redis 库

在Nodejs使用redis,须要先安装redis库. 参考文档:www.npmjs.com/package/red… 安装:

npm install redis
复制代码

获取Access Token

var qs = require('querystring');
let axios = require('axios');

var redis = require("redis"),
    client = redis.createClient();
 
client.on("error", function (err) {
    console.log("Error " + err);
});

/**
 * 把token使用redis缓存起来
 */
async function getToken(){

    return new Promise(function(resolve,reject){
        client.get('token',async (err,reply) =>{
            if(err){
                reject(err)
            }else{
                if(reply){
                    resolve(reply)
                }else{
                    let result = await getNewToken();
                    // 缓存token,设置时间
                    // 参考 https://www.npmjs.com/package/redis
                    client.set('token', result.data.access_token, 'EX', result.data.expires_in);
                    resolve(result.data.access_token)
                }
            }
        })
    })
}

async function getNewToken(){
    const param = qs.stringify({
        'grant_type': 'client_credentials',
        'client_id': '这里换成你的API Key',
        'client_secret': '这里换成你的Secret Key'
    });
    return  axios.get('https://aip.baidubce.com/oauth/2.0/token?'+ param)
}

module.exports = getToken;
复制代码

4. 图片上传

实现图片上传功能,来获取图片。

添加图片上传页面

在views目录下新建home.jade,代码以下:

extends layout

block content
  h1= title
  div 图片上传
  form(action="/upload", method="post" enctype="multipart/form-data")
    input(type="file" name="avatar")
    input(type="submit" value="提交")
复制代码

这个页面是使用jade写的,你也可使用ejs或其余模板。

路由到home页面,修改routes/index.js

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('home', { title: 'Express' }); //渲染home页面
});
复制代码

测试一下,启动服务器

npm start
复制代码

在浏览器地址栏输入:http://localhost:300 能够看到一个图片上传页面。

安装multer中间件

为了实现图片上传,咱们还须要multer,它是一个Nodejs的图片上传中间件。 文档:www.npmjs.com/package/mul… 安装multer:

npm install --save multer
复制代码

设置图片上传目录:

var multer  = require('multer')
var upload = multer({ dest: 'public/uploads/' })
复制代码

实现图片上传接口:

routes/index.js中添加:

router.post('/upload',upload.single('avatar'),(req,res)=>{
  let imgUlr = 'http://localhost:3000/uploads/' + req.file.filename
})
复制代码

在前端图片上传页面选择图片提交后,就会把数据提交到这个接口,图片会被保存到public/uploads/目录下。

上传后的图片名称为: req.file.filename,因此一个可访问的图片地址就是:'http://localhost:3000/uploads/' + req.file.filename

5. 调用人脸识别接口

接口地址:https://aip.baidubce.com/rest/2.0/face/v1/merge?access_token=你的touken 使用post方法请求,token拼接在url上。

请求参数说明:

  • image:图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断
  • image_type:
    • BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
    • URL:图片的 URL地址( 可能因为网络等缘由致使下载图片时间过长);
    • FACE_TOKEN: 人脸图片的惟一标识,调用人脸检测接口时,会为每一个人脸图片赋予一个惟一的FACE_TOKEN,同一张图片屡次检测获得的FACE_TOKEN是同一个

必填的参数只有这两个,其余还有:face_field、max_face_num、face_type、liveness_control 详情参看文档:ai.baidu.com/ai-doc/FACE…

其中image_type的值能够是BASE64,URLFACE_TOKEN,这里我使用了第一种BASE64。 那就须要把上传的图片转成base64.

图片转base64

安装 image-to-base64

https://www.npmjs.com/package/image-to-base64
复制代码

使用方法:

const image2base64 = require('image-to-base64');
image2base64("path/to/file.jpg") // you can also to use url
    .then(
        (response) => {
            console.log(response); //cGF0aC90by9maWxlLmpwZw==
        }
    )
    .catch(
        (error) => {
            console.log(error); //Exepection error....
        }
    )
复制代码

请求接口

async function getFaceResult(imgUrl,response){
  try {
    let token = await getToken();
    let imgBase64 =  await image2base64(imgUrl) // you can also to use url
    
    let faceResult = await axios.post('https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token='+ token,
    {
      image:imgBase64,
      image_type:"BASE64",
      face_field:'age,beauty,expression,face_shape,gender,glasses,landmark,landmark150,race,quality,eye_status,emotion,face_type'
    })
    response.render('index',faceResult.data.result.face_list[0])
  } catch (error) {
    response.send(error)
  }
}
复制代码

图片上传后调用:

router.post('/upload',upload.single('avatar'),(req,res)=>{
  let imgUlr = 'http://localhost:3000/uploads/' + req.file.filename
  getFaceResult(imgUlr,res);
})
复制代码

完成。

相关文章
相关标签/搜索