实时面部情绪识别

在数字时代,经常在社交媒体上看到各种各样的滤镜和特效,它们能够让照片和视频变得更加有趣。是否曾经想过如何从头开始创建这些滤镜?现在,有机会学习了,而且这一切都可以在网络浏览器中完成!在本系列文章中,将探讨如何在浏览器中创建类似Snapchat的滤镜,训练AI模型理解面部表情,甚至使用TensorFlow.js和面部追踪技术实现更多功能。

可以下载这个项目的演示版本。为了性能考虑,可能需要在网络浏览器中启用WebGL。还可以下载本系列文章的代码和文件。假设熟悉JavaScript和HTML,并且至少对神经网络有基本的理解。如果是TensorFlow.js的新手,建议先查看这个指南:在浏览器中使用TensorFlow.js开始深度学习。

如果想看到更多在浏览器中使用TensorFlow.js的可能性,可以查看这些AI系列:使用TensorFlow.js的计算机视觉和使用TensorFlow.js的聊天机器人。到目前为止,已经学会了如何在浏览器中实时追踪面部,并应用深度学习来检测和分类面部情绪。下一步,将尝试将这两者结合起来,看看否可以实时地使用网络摄像头进行情绪检测。让开始吧!

添加面部情绪检测

在这个项目中,将使用网络摄像头的实时视频来测试训练有素的面部情绪检测模型。将从面部追踪项目的最终代码的起始模板开始,并用面部情绪检测代码的部分进行修改。

首先,将定义一些全局变量用于情绪检测,就像之前做的那样:

const emotions = [ "angry", "disgust", "fear", "happy", "neutral", "sad", "surprise" ]; let emotionModel = null;

接下来,将在异步块中加载情绪检测模型:

(async () => { // Load Face Landmarks Detection model model = await faceLandmarksDetection.load(faceLandmarksDetection.SupportedPackages.mediapipeFacemesh); // Load Emotion Detection model emotionModel = await tf.loadLayersModel('web/model/facemo.json'); })();

然后,可以添加一个实用函数来运行模型预测,从关键面部点开始:

async function predictEmotion(points) { let result = tf.tidy(() => { const xs = tf.stack([tf.tensor1d(points)]); return emotionModel.predict(xs); }); let prediction = await result.data(); result.dispose(); // Get the index of the maximum value let id = prediction.indexOf(Math.max(...prediction)); return emotions[id]; }

最后,需要从检测中获取关键面部点并在trackFace中传递给情绪预测器:

async function trackFace() { // ... let points = null; faces.forEach(face => { // Add just the nose, cheeks, eyes, eyebrows & mouth const features = [ "noseTip", "leftCheek", "rightCheek", "leftEyeLower1", "leftEyeUpper1", "rightEyeLower1", "rightEyeUpper1", "leftEyebrowLower", "leftEyebrowUpper", "rightEyebrowLower", "rightEyebrowUpper", "lipsLowerInner", "lipsLowerOuter", "lipsUpperInner", "lipsUpperOuter", ]; points = []; features.forEach(feature => { face.annotations[feature].forEach(x => { points.push((x[0] - x1) / bWidth); points.push((x[1] - y1) / bHeight); }); }); }); if (points) { let emotion = await predictEmotion(points); setText(`Detected: ${emotion}`); } else { setText("No Face"); } requestAnimationFrame(trackFace); }

这就是让这一切运行所需的全部。现在,当打开网页时,它应该能够检测到面部并识别不同的情绪。尝试使用它并享受乐趣!

完成线

为了完成这个项目,这是完整的代码:

<html> <head> <title>Real-Time Facial Emotion Detection</title> <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@2.4.0/dist/tf.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/face-landmarks-detection@0.0.1/dist/face-landmarks-detection.js"></script> </head> <body> <canvas id="output"></canvas> <video id="webcam" playsinline style="visibility: hidden; width: auto; height: auto;"></video> <h1 id="status">Loading...</h1> <script> // JavaScript code here... </script> </body> </html>

接下来是什么?什么时候可以戴上虚拟眼镜?

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485