百度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
點擊左側的人臉識別,進去以後,建立一個項目。在建立頁面,根據本身的需求填寫就能夠。 點擊管理項目能夠看到項目列表。在這裏能夠獲取到項目的API Key和Secret Key,之後會用到。調用人臉識別的接口的時候,須要傳入一個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);
})
複製代碼
完成。