基于TensorFlow构建的face-api.js人脸识别【代码+效果展示+在线体验】


前言

gtihub项目地址

无意中看到了一个有趣的AI实时人脸追踪,不懂AI的我简单地尝试了一下。我使用的是基于TensorFlow构建的face-api.js库,事实上它可以嵌入在网站上并让网站拥有功能齐全的实时人脸检测能力,而且可与任何网络摄像头或手机摄像头配合使用。只要照着教程ctrl+c➕ctrl+v🤣相信你也能做出这个效果!
在这里插入图片描述


一、项目架构

ai-
    │  models
   	│  │age_gender_model-shard1
    │  │age_gender_model-weights_manifest.json
    │  │face_expression_model-shard1
    │  │face_expression_model-weights_manifest.json  
    │  │face_landmark_68_model-shard1      
    │  │face_landmark_68_model-weights_m
    │  │face_landmark_68_tiny_model-shar
    │  │face_landmark_68_tiny_model-weig
    │  │face_recognition_model-shard1
    │  │face_recognition_model-shard2
    │  │face_recognition_model-weights_manifest.json
    │  │mtcnn_model-shard1
    │  │mtcnn_model-weights_manifest.json
    │  │ssd_mobilenetv1_model-shard1
    │  │ssd_mobilenetv1_model-shard2
    │  │ssd_mobilenetv1_model-weights_
    │  │tiny_face_detector_model-shard1
    │  │tiny_face_detector_model-weights_
    │index.html
    │fun.js
    │faceapi.min.js

二、环境

window10 ➕vscode➕浏览器

三、具体实现

1️⃣index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./faceapi.min.js"></script>
    <style>
        body {
            margin: 0;
            padding: 0;
            width: 100%;
            height: 100%;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        canvas {
            position: absolute;

        }
    </style>
</head>

<body>
    <video id="video" width="720" height="560" autoplay muted></video>
    <script src="./faceapi.min.js"></script>
    <script src="./fun.js"></script>
</body>

</html>

2️⃣fun.js

代码如下(示例):

const video = document.getElementById("video");

const startVideo = () => {
    navigator.getUserMedia = navigator.getUserMedia = (navigator.getUserMedia ||
        navigator.webkitGetUserMedia ||
        navigator.mozGetUserMedia ||
        navigator.msGetUserMedia);
    navigator.getUserMedia(
        { video: {} },
        (stream) => (video.srcObject = stream),
        (err) => console.log(err)
    );
};

// startVideo();

//console.log(faceapi.nets)
// ageGenderNet
// faceExpressionNet
// faceLandmark68Net
// faceLandmark68TinyNet
// faceRecognitionNet
// ssdMobilenetv1
// tinyFaceDetector
// tinyYolov2

//加载训练好的模型(weight,bias)
// ageGenderNet 识别性别和年龄
// faceExpressionNet 识别表情,开心,沮丧,普通
// faceLandmark68Net 识别脸部特征用于mobilenet算法
// faceLandmark68TinyNet 识别脸部特征用于tiny算法
// faceRecognitionNet 识别人脸
// ssdMobilenetv1 google开源AI算法除库包含分类和线性回归
// tinyFaceDetector 比Google的mobilenet更轻量级,速度更快一点
// mtcnn  多任务CNN算法,一开浏览器就卡死
// tinyYolov2 识别身体轮廓的算法,不知道怎么用

// faceapi.nets.tinyFaceDetector.loadFromUri('http://www.battlesoldier.top/resource/faceApi/weights'),
// faceapi.nets.faceLandmark68Net.loadFromUri('http://www.battlesoldier.top/resource/faceApi/weights'),
// faceapi.nets.faceRecognitionNet.loadFromUri('http://www.battlesoldier.top/resource/faceApi/weights'),
// faceapi.nets.faceExpressionNet.loadFromUri('http://www.battlesoldier.top/resource/faceApi/weights'),
Promise.all([
    faceapi.nets.tinyFaceDetector.loadFromUri('./models'),
    faceapi.nets.faceLandmark68Net.loadFromUri('./models'),
    faceapi.nets.faceRecognitionNet.loadFromUri('./models'),
    faceapi.nets.faceExpressionNet.loadFromUri('./models'),

]).then(startVideo());

video.addEventListener('play', () => {
    // 制作定位 canvas
    const canvas = document.createElement('canvas');
    canvas.style.position = 'absolute';
    document.body.append(canvas);

    // 配置显示尺寸
    const displaySize = { width: video.width, height: video.height };
    faceapi.matchDimensions(canvas, displaySize);

    // 每 100ms 去绘制
    setInterval(async () => {
        // 识别位置, 脸部特征, 表情
        const detections = await faceapi
            .detectAllFaces(video, new faceapi.TinyFaceDetectorOptions())
            .withFaceLandmarks()
            .withFaceExpressions();

        // 调整尺寸
        const resizedDetections = faceapi.resizeResults(detections, displaySize);

        canvas.getContext('2d')?.clearRect(0, 0, canvas.width, canvas.height); // 清空画布
        faceapi.draw.drawDetections(canvas, resizedDetections); // 位置
        faceapi.draw.drawFaceLandmarks(canvas, resizedDetections); // 脸部特征  
        faceapi.draw.drawFaceExpressions(canvas, resizedDetections); // 表情
    }, 100);
});



3️⃣faceapi.min.js

faceapi.min.js👉GitHub下载地址

4️⃣models

models👉GitHub下载地址
🧨注意:全部下载🧨

四、效果图

在这里插入图片描述
在这里插入图片描述

五、在线体验

👉点击AI情绪识别在线体验
如果手机识别,建议横屏,电脑可直接打开

总结✨✨

🎨建议按照项目架构,否则无法调用面部识别模型!

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值