百度AI提供了很是强大的AI接口,能够很是容易实现诸如图片识别,语音识别,文字识别,人脸识别等功能。 下面以人脸识别为例,说明下如何经过Nodejs调取百度AI接口,实现识别人脸的位置、年龄、性别、颜值、情绪等信息。前端
首先使用Express的脚手架建立一个项目。 对于Express不熟悉的同窗能够先看看这篇文档:www.expressjs.com.cn/ios
安装 express脚手架redis
npm install express-generator -g
复制代码
建立项目:express
express myapp
复制代码
项目建立好以后,安装 axios,用来作网络请求。npm
npm i axios -S
复制代码
在正式调用接口前,须要先注册好百度的帐号,而后登陆百度AI开放平台:ai.baidu.com/ 登陆成功后点右上角进入到控制台。axios
调用人脸识别的接口的时候,须要传入一个Access Token参数,因此咱们须要先获取下这个token。浏览器
请求URL数据格式缓存
向受权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上如下参数:bash
服务器返回的JSON文本参数以下:服务器
例如:
{
"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来缓存。
我以Mac说明 到redis官网下载redis:redis.io/ 下载完成后:
在Nodejs使用redis,须要先安装redis库. 参考文档:www.npmjs.com/package/red… 安装:
npm install redis
复制代码
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;
复制代码
实现图片上传功能,来获取图片。
在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
,它是一个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
接口地址:https://aip.baidubce.com/rest/2.0/face/v1/merge?access_token=你的touken
使用post
方法请求,token拼接在url上。
请求参数说明:
必填的参数只有这两个,其余还有:face_field、max_face_num、face_type、liveness_control 详情参看文档:ai.baidu.com/ai-doc/FACE…
其中image_type
的值能够是BASE64
,URL
和FACE_TOKEN
,这里我使用了第一种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);
})
复制代码
完成。