用百度云的面部识别接口测测你的颜值

基于大数据的人工智能越来越火,一些大的互联网公司把一些复杂的应用用webapi的形式暴露给开发者,开发者只需要调用这些接口就可以做一些有意思的事情了,但是这些大公司为了减轻服务器压力,有的时候需要二次开发。

百度云的面部识别接口就是这样一个应用,本篇文章就是带着大家用nodejs和百度云的SDK开发一个颜值测试接口,通俗的讲就是基于百度云面部识别接口的二次开发。

首先我们要注册一个百度账号,然后访问百度云的官网,不是百度云盘啊,大家看清楚啊,然后登陆控制台,选择产品服务的人脸识别,如图所示:

然后点击创建应用如图:

然后得到三个数据 appid appkey secrect key:

然后找到Nodejs的SDK文档

通过官网文档的代码如下:

var AipFaceClient = require("baidu-aip-sdk").face;

// 设置APPID/AK/SK
var APP_ID = "你的 App ID";
var API_KEY = "你的 Api Key";
var SECRET_KEY = "你的 Secret Key";

// 新建一个对象,建议只保存一个对象调用服务接口
var client = new AipFaceClient(APP_ID, API_KEY, SECRET_KEY);

var fs = require('fs');

var image = fs.readFileSync("assets/example.jpg").toString("base64");

// 调用人脸检测
client.detect(image).then(function(result) {
    console.log(JSON.stringify(result));
}).catch(function(err) {
    // 如果发生网络错误
    console.log(err);
});

通读这段代码,道理很简单,用上面新建应用得到的appid、appkey、secretkey,生成一个客户端,然后调用fs模块读取图片信息,将图片信息转成base64格式字符串,用客户端将base64格式的字符串传到百度云服务器解析,得到结果,但是这个结果没有颜值分数,我们再次阅读文档:

通读文档发现,分析图片时,需要传递一个参数,face_fields,参数值为beauty。

最终能够得到颜值信息的代码为:

var AipFaceClient = require("baidu-aip-sdk").face;
// 设置APPID/AK/SK
var APP_ID = "你的 App ID";
var API_KEY = "你的 Api Key";
var SECRET_KEY = "你的 Secret Key";
// 新建一个对象,建议只保存一个对象调用服务接口
var client = new AipFaceClient(APP_ID, API_KEY, SECRET_KEY);
var fs = require('fs');
var image = fs.readFileSync("assets/example.jpg").toString("base64");
var options = {};
options["face_fields"] = "beauty";
// 带参数调用人脸检测
client.detect(image, options).then(function(result) {
    console.log(JSON.stringify(result));
}).catch(function(err) {
    // 如果发生网络错误
    console.log(err);
});;

现在我们就能用这个js文件读取照片的颜值信息了,只需要将代码中的图片地址改成你本地图片地址就可以了。但是只能本地读取,如何将其变成一个webapi呢?

我们需要用到express包。开发一个post接口,用户通过向这个接口提交图片,接口返回图片解析后得到的信息。但是用户上传图片还需要用到另外一个npm包formable,改造代码如下(按照mvc的标准模式):

index.js

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const router = require('./router.js');

app.use(express.static('public'));
app.use(bodyParser.urlencoded({extended:false}));
app.use(router);

app.listen('3000',()=>{
    console.log("running in 3000")
})

router.js

const express = require('express');
const router = express.Router();
const path = require('path');
const {upload} = require('./controller.js')
router.post('/upload',upload);

module.exports = router;

controller.js

const path = require('path')
const formidable = require('formidable');
const {imgparser}= require('./imgparser.js');
exports.upload = (req,res)=>{
    let form = new formidable.IncomingForm();
    form.uploadDir = path.join(__dirname,'upload');
    form.parse(req,(err,fields,files)=>{
        // res.json({fields: fields, files: files})
        imgparser(files.qq.path,(err,data)=>{
            if(!err){
                res.json(data);
            }
        })
    })
}

imageparser.js

var AipFaceClient = require("baidu-aip-sdk").face;
var APP_ID = "10639450";
var API_KEY = "UzrsoKDFnRdGRSPxZpSAHrKr";
var SECRET_KEY = "93UQEgIWHbK4XzT7SC7xjuWM9aoZL2lI";
var fs = require('fs');

var client = new AipFaceClient(APP_ID, API_KEY, SECRET_KEY);

exports.imgparser = (imgpath,callback) => {
    var image = fs.readFileSync(imgpath).toString("base64");
    var options = {};
    options["max_face_num"] = "2";
    options["face_fields"] = "age,beauty";

    // 带参数调用人脸检测
    client.detect(image, options).then(function (result) {
        callback(null,JSON.stringify(result));
    }).catch(function (err) {
        // 如果发生网络错误
        callback(err);
    });;
}

以上便是开发一个可以通过图片是被图片中人物颜值的webapi。用postman向这个api发送一张图片看看会返回什么,用postman上传一张黎明的图片:

用postman上传图片时,格式要用form-data格式,

打印结果为:

beauty为66.6...不是很高啊,测了下刘德华73,当然不同图片得分还是不一样的,大家辩证来看,可以偷偷测测自己的照片,怎么说百度也是市值70多亿的大公司,接口还是可以的,笔者分数就不透露了,伤心啊..

快过年了,分享一些轻松好玩的东西给大家,提前祝大家新年愉快啊!!!分数不高可别像笔者一样把电脑砸了啊,不值当,要砸就砸百度。

项目代码地址:https://github.com/clm1100/newnodejsdemo/tree/master/%E7%99%BE%E5%BA%A6%E5%9B%BE%E7%89%87%E6%8E%A5%E5%8F%A3

有兴趣的可以玩一玩。

原文发布于微信公众号 - nodejs全栈开发(geekclass)

原文发表时间:2018-02-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券