基于node.js 实现百度ai人脸检测功能(api)

2023-11-18

基于node.js 实现百度ai人脸检测功能(api)

很有幸和老师同学们一起尝试学习百度ai的相关技术文档,自己做了一个很ez的人脸检测的小网页,和大家分享一下。

百度ai技术文档 百度ai人脸检测技术文档

1.首先根据技术文档中的要求我们要获取access_token
这个我们只需要去注册自己的百度智能云的id账号,然后进入人脸识别页面页面,创建自己的应用,就可以获取到自己的API Key 以及Secret Key,拿到这个就可以去根据实例代码获取我们要的access_token了。
示例图如下:
在这里插入图片描述
根据百度ai技术文档提供的获取access_token的方法,可以获取到如下相关信息。

注意这是一个node的项目,相关模块需要用npm/cnpm安装,我想有node基础的同学就不用我阐述了。

官方获取access_token代码如下:

var https = require('https');
var qs = require('querystring');

const param = qs.stringify({
    'grant_type': 'client_credentials',
    'client_id': 'xCRoucNpcqBSL3Ssvyz9003z',
    'client_secret': 'wTxCPkMOnNZmat4PxWMgu8wU2QA8ZvGK'
});

https.get({
        hostname: 'aip.baidubce.com',
        path: '/oauth/2.0/token?' + param,
        agent: false
    },
    function (res) {
        // 在标准输出中查看运行结果
        res.pipe(process.stdout);
    }
);

注意:client_id 和 client_secert 分别填入你获取到的API Key 以及Secret Key。这样运行这个js文件, 用node命令运行,dos返回结果


/*{
    "refresh_token": "25.229e474f1ddaa3dd8bf615a0640c1db5.315360000.1886430622.282335-17511300",
    "expires_in": 2592000,
    "session_key": "9mzdWrktAR59shMTTbnfWJ2QNQo6NqrQQiSZlE94z70aI5ttomvuXYJVIPzSXw2n3cMf7hgoug5m4hhhYoeIUTlDmx+byA==",
    "access_token": "24.ae8755d49cf860037da7cb9f4868af07.2592000.1573662622.282335-17511300",
    "scope": "vis-ocr_ocr brain_ocr_idcard public brain_all_scope vis-faceverify_faceverify_h5-face-liveness vis-faceverify_FACE_V3 vis-faceverify_idl_face_merge brain_cvpaas-app-scope wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian ApsMisTest_Test\u6743\u9650 vis-classify_flower lpq_\u5f00\u653e cop_helloScope ApsMis_fangdi_permission smartapp_snsapi_base iop_autocar oauth_tp_app smartapp_smart_game_openapi oauth_sessionkey smartapp_swanid_verify smartapp_opensource_openapi smartapp_opensource_recapi fake_face_detect_\u5f00\u653eScope",
    "session_secret": "c66f9aa948dc1c44b542d8798626ad6d"
}
*/

这里获取到的"access_token"就是我们要的数据

2.然后请求官方api,人脸识别的接口,这个会在你创建的应用下面有,分为v2和v3版本。
示例图如下:
在这里插入图片描述
如图可以看到人脸识别接口的api,以及接口是v3
然后完善我们后台的请求接口 /face

let express = require('express');
let https = require('https');
let request = require('request');
var router = express.Router();


//人脸识别接口
var token = "24.ae8755d49cf860037da7cb9f4868af07.2592000.1573662622.282335-17511300";

//url  林更新
var str = 'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1219144778,2690834063&fm=26&gp=0.jpg';

router.post('/', (req, res) => {
    let options = {
        host: 'aip.baidubce.com',
        path: '/rest/2.0/face/v3/detect?access_token="' + token + '"',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        }
    };

    let contents = JSON.stringify({     
       // url  图片类型
        image: str,
        image_type: "URL",
        "face_field": 'age,beauty,expression,face_shape,gender,glasses,race',
        //这里根据文档填入你想要获取到的参数
    });

    let req_baiduai = https.request(options, function (res_baiduai) {
        res_baiduai.setEncoding('utf8');
        res_baiduai.on('data', function (chunk) {
            res.send(chunk)
            var testResult = JSON.parse(chunk);
            console.log(chunk)
            res.end();
        })
    });
    req_baiduai.write(contents);
    req_baiduai.end();
});
module.exports = router;

注意: 如果要使用BASE64 图片类型
需要修改上述代码:
var fs = require(‘fs’);
var image = fs.readFileSync(’./ab.png’).toString(‘base64’);
添加fs模块获取你要测试的本地图片并且转换为base64格式

修改body请求体
//base 64 图片类型
image: image,
image_type: “BASE64”,

3.通过前端获取到我们的后台接口/face返回的请求百度的数据
其中数据是通过ajax获取到的,并且通过js全局变量返回到全局环境以便于之后的渲染操作。

 $.ajax({
        //几个参数需要注意一下
        type: "post", //方法类型
        // dataType: "json", //预期服务器返回的数据类型
        url: "http://localhost:2019/face", // url
        // data: $('#form1').serialize(),
        success: function (res) {
            {

                console.log(res); //打印服务端返回的数据(调试用);
                a += res;
                alert("提交成功!!!");
                return a;
            }
        },
        async: false,
        error: function () {
            alert("提交异常!");
        },
    });

4.布局前端页面

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
    <link rel="icon" href="../images/bg.jpg" type="images/x-ico" />
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <script src="./js/vue.js"></script>
</head>
<style>
    * {
        margin: 0;
        padding: 0
    }

    html,
    body {
        width: 100%;
        height: 100%;
        background-image: url(../images/007.jpg);
        background-size: cover;
        overflow-y: hidden;
    }

    video {
        position: absolute;
        left: 100px;
        border: 10px solid white;
    }

    canvas {
        position: absolute;
        left: 150px;
        bottom: -20px;
    }

    button {
        position: absolute;
        width: 100px;
        height: 30px;
        top: 330px;
        left: 260px;
    }

    .result {
        position: absolute;
        width: 370px;
        height: 500px;
        right: 200px;
        top: 30px;
        /* border: 5px solid white; */
        text-align: center;
        padding: 20px;
        color: white;
        /* background: black; */
    }

    p {
        text-align: left;
        font-size: 20px;
        font-weight: 600;
        color: white;
        line-height: 30px;
    }
</style>

<body>
    <video id="video" width="400" height="300" autoplay></video>
    <button id="snap">Snap Photo</button>
    <canvas id="canvas" width="400" height="300"></canvas>

    <div class="result">
        <h1>人脸属性</h1>
        <p>"face_num":{{ msg0 }}</p>
        <p>"face_token":{{ msg1 }}</p>
        <p>"face_probability":{{ msg2 }}</p>
        <p>"age":{{ msg3 }}</p>
        <p>"beauty":{{ msg4 }}</p>
        <p>"expressiton":{{ msg5 }}</p>
        <p>"face_shape":{{ msg6 }}</p>
        <p>"gender":{{ msg7 }}</p>
        <p>"glasses":{{ msg8 }}</p>
        <p>"race":{{ msg9 }}</p>
    </div>
</body>
<script type="text/javascript">
    var aVideo = document.getElementById('video');
    var aCanvas = document.getElementById('canvas');
    var ctx = aCanvas.getContext('2d');

    navigator.getUserMedia = navigator.getUserMedia ||
        navigator.webkitGetUserMedia ||
        navigator.mozGetUserMedia ||
        navigator.msGetUserMedia; //获取媒体对象(这里指摄像头)
    navigator.getUserMedia({
        video: true
    }, gotStream, noStream); //参数1获取用户打开权限;参数二是一个回调函数,自动传入视屏流,成功后调用,并传一个视频流对象,参数三打开失败后调用,传错误信息

    function gotStream(stream) {

        // video.src = URL.createObjectURL(stream); // 老写法
        aVideo.srcObject = stream;

        aVideo.onerror = function () {
            stream.stop();
        };
        stream.onended = noStream;
        aVideo.onloadedmetadata = function () {
            // alert('摄像头成功打开!');
        };
    }

    function noStream(err) {
        alert(err);
    }

    document.getElementById("snap").addEventListener("click", function () {
        ctx.drawImage(aVideo, 0, 0, 320, 240); //将获取视频绘制在画布上
    });

    //cancas 保存图片
    


    var a = "";
    $.ajax({
        //几个参数需要注意一下
        type: "post", //方法类型
        // dataType: "json", //预期服务器返回的数据类型
        url: "http://localhost:2019/face", // url
        // data: $('#form1').serialize(),
        success: function (res) {
            {

                console.log(res); //打印服务端返回的数据(调试用);
                a += res;
                alert("提交成功!!!");
                return a;
            }
        },
        async: false,
        error: function () {
            alert("提交异常!");
        },
    });
    var testResult = JSON.parse(a);
    // var datalist = JSON.parse()

    var vm = new Vue({

        el: '.result', // 表示 我们 new的这个实例要去控制页面上的哪个区域
        data: { //data中存放的是el中要用到的数据
            msg0: testResult.result.face_num,
            msg1: testResult.result.face_list[0].face_token,
            msg2: testResult.result.face_list[0].face_probability,
            msg3: testResult.result.face_list[0].age,
            msg4: testResult.result.face_list[0].beauty,
            msg5: testResult.result.face_list[0].expression,
            msg6: testResult.result.face_list[0].face_shape,
            msg7: testResult.result.face_list[0].gender,
            msg8: testResult.result.face_list[0].glasses,
            msg9: testResult.result.face_list[0].race,


            //通过vue提供的指令就可以简单的把数据渲染到页面上,不提倡操作dom
        }
    });
</script>
<script>



</script>

</html>

其中数据是通过vue渲染上去的,可能拿数据比较粗鲁,但是因为时间原因,嘻嘻嘻,希望大家理解。

最后的效果如下:
在这里插入图片描述
测试
如果你使用的图片是url形式,只需要在网上找一些明星照片然后填入url地址就可以,如果你使用base64格式图片,可以在摄像头开启之后拍摄一张图片,(我是用canvas画布将拍照效果保存页面上,你可以直接右键保存到你的项目的文件夹下)然后再次刷新页面就会出现效果。
有什么问题可以私聊我

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于node.js 实现百度ai人脸检测功能(api) 的相关文章

随机推荐

  • 解决“Pick up system reserved threshold 500ms because of config missing”

    skywalking启动日志一直刷 Pick up system reserved threshold 500ms because of config missing 如下图 原因缺少动态的配置项 skywalking支持动态配置的配置项如
  • 【总结】为什么对累积奖励减去baseline项能起到减小方差的作用?

    深度强化学习实验室 论坛 http deeprlhub com 来源 https zhuanlan zhihu com p 98506549 作者 风清云 很多论文的工作都专注于减少policy gradient的方差 以得到更加优质且稳定
  • TT100K数据集

    http cg cs tsinghua edu cn traffic sign data model code data zip
  • 字符转ASCLL码输出

    今天做EDA课程设计时 同学的串口通信程序涉及到字符和ASCLL码的转化 我看着他一个字符的对着ASCLL表 然后再敲进程序 真心急 想想都大三了 C语言都大一学的了 而现在经常遇到的问题 很多大学生都直接用非常笨的方法去弄 却不知道使用自
  • USB转串口那些事儿—USB转串口工作原理及应用

    一 简介 USB转串口即实现计算机USB接口到物理串口之间的转换 可以为没有串口的计算机或其他USB主机增加串口 使用USB转串口设备等于将传统的串口设备变成了即插即用的USB设备 USB虚拟串口应用特点 USB应用广泛 支持热插拔 传输速
  • Postman接口测试——我看过最详细+全面的文章教程了【转载】

    Postman简介 一般简单的接口测试我们可以直接在浏览器里面进行调试 但是涉及到一些权限设置的就无法操作了 因此我们需要接口测试的相关工具 Postman 是一个接口测试和 http 请求的工具 官网地址 https www getpos
  • Mac电脑花屏

    原因 GPU 加速导致 和电脑的独显有关 解决办法 打开谷歌浏览器 点击上图的三个点 选择设置 在高级设置中选择系统 关掉硬件加速模式
  • 十大优秀编程项目,让你的简历金光闪闪

    全文共3241字 预计学习时长6分钟 被问到如何学习编程时 最常听到的问题就是 有没有什么新项目的好点子 一些老套的答案有 做一个象棋游戏 或者 命令行界面 这些答案没有错 但这些例子不符合现代编程的需要 现代软件编写需要经常使用软件服务化
  • 【华为OD机试真题2023B卷 JAVA&JS】阿里巴巴找黄金宝箱(V)

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 阿里巴巴找黄金宝箱 V 知识点数组哈希表滑窗 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上 无意中发现了强盗集团的藏宝地 藏宝地
  • 尤克里里整理

    尤克里里 如何按弦 如何弹奏 带数字的四线谱 如何按弦 如何弹奏 带数字的四线谱 数字代表品格数 1就是1品 2就是2品 数字标记在几弦上面 就按住几弦的几品
  • 计算机毕设项目 大数据个性化音乐推荐算法分析

    文章目录 0 前言 1 研究目的 2 研究方法 2 1 传统推荐算法 2 2 基于LightGBM决策树模型的推荐算法 3 研究结论 0 前言 基于大数据个性化音乐推荐算法分析 提示 适合用于课程设计或毕业设计 工作量达标 源码开放 项目分
  • 告别卡顿,教你正确清理手机APP缓存垃圾,释放空间

    智能手机已经成为我们生活中不可或缺的重要工具 让我们随时随地保持联系 获取信息和娱乐 但是 使用过多的应用程序可能会导致手机变得缓慢并占用存储空间 这些应用程序产生大量的缓存和垃圾文件 如果不及时清理 将会影响手机的性能和速度 今天 我们将
  • 集团如何实现数字化转型?永洪BI助力由由集团

    随着 互联网 的边界不断拓宽 生活性服务业正驶入数字化转型快车道 中国信息通信研究院发布的 中国数字经济发展报告 2022 显示 2021年 我国数字经济发展取得新突破 数字经济规模达到45 5万亿元 占 GDP 比重达到39 8 三大产业
  • Chrome中安装扩展的三种方式

    chrome浏览器安装扩展有多种方式 请看以下介绍 1 从chrome网上应用商店安装 优雅法 在google chrome中打开chrome网上应用商店 https chrome google com webstore 搜索需要的扩展 在
  • 详解list.toArray(new String[0])

    List
  • 使用树莓派(raspberry pi)搭建网站(nginx+php+mysql+ddclient)

    标签 树莓派 raspberrypi php 网站 mysql 分类 Linux技术 最近在研究学习PHP 有时候想随时就学习 所以就决定搭建一个网站 随时可以进行学习 因为要24小时在线 要低功耗和安静 所以选择了树莓派 我们开始吧 ng
  • 四元素与旋转矩阵

    如何描述三维空间中刚体的旋转 是个有趣的问题 具体地说 就是刚体上的任意一个点P x y z 围绕过原点的轴 i j k 旋转 求旋转后的点P x y z 旋转矩阵 旋转矩阵乘以点P的齐次坐标 得到旋转后的点P 因此旋转矩阵可以描述旋转 x
  • 数据治理-数据质量-数据质量管理方法和工具

    常用质量管理工具 目前 在质量管理领域 有一系列常用的数据质量管理工具 主要分为传统的质量管理工具 新的质量管理工具和其他质量管理工具 传统的质量管理七大工具 传统的七种工具包含分层法 检查表 帕累托图 因果分析图 直方图 散布图 控制图
  • 2017最新整理深度学习神经网络算法全套

    https pan baidu com s 1cHGAv0 from groupmessage adapt pc fr ftw list path 2F
  • 基于node.js 实现百度ai人脸检测功能(api)

    基于node js 实现百度ai人脸检测功能 api 很有幸和老师同学们一起尝试学习百度ai的相关技术文档 自己做了一个很ez的人脸检测的小网页 和大家分享一下 百度ai技术文档 百度ai人脸检测技术文档 1 首先根据技术文档中的要求我们要