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);
})
複製代碼

完成。

相關文章
相關標籤/搜索