使用 face-api 和 Tensorflow.js 在浏览器中进行年龄估计





5.00/5 (5投票s)
在本文中,我们将预测一个人的性别和年龄在浏览器中。
在上一篇文章中,我们学习了如何使用 face-api.js 和 Tensorflow.js 在浏览器中对一个人的情绪进行分类。
如果您还没有阅读那篇文章,我建议您先阅读一下,因为我们将假设您对 face-api.js 有一定的了解,并且我们将基于我们为情绪检测创建的代码进行构建。
性别和年龄检测
我们已经看到使用 face-api.js 预测人类面部表情是多么容易。但是我们还能用它做什么呢?让我们学习如何预测一个人的性别和年龄。
我们将对我们之前的代码进行一些更改。在 HTML 文件中,我们更改了视频标签的尺寸,因为我们需要一些额外的空间来显示绘制的内容。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
<script type="application/x-javascript" src="face-api.js"></script>
</head>
<body>
<h1>Emotions, Age & gender Detection using face-api.js</h1>
<video autoplay muted id="video" width="400" height="400" style=" margin: auto;"></video>
<div id="prediction">Loading</div>
<script type="text/javascript" defer src="index.js"></script>
</body>
</html>
我们还需要在我们的 index.js 文件中导入另一个模型
faceapi.nets.ageGenderNet.loadFromUri('/models')
将年龄和性别添加到预测结果中
const detections = await faceapi
.detectAllFaces(video, new faceapi.TinyFaceDetectorOptions())
.withFaceLandmarks()
.withFaceExpressions()
.withAgeAndGender();
Face-api.js 也有一些绘图功能。让我们在我们的画布上添加绘图
const resizedDetections = faceapi.resizeResults(detections, displaySize);
faceapi.draw.drawDetections(canvas, resizedDetections);
faceapi.draw.drawFaceLandmarks(canvas, resizedDetections);
faceapi.draw.drawFaceExpressions(canvas, resizedDetections);
现在我们已经可以获得我们的预测结果了
resizedDetections.forEach(result => {
const { age, gender, genderProbability } = result;
new faceapi.draw.DrawTextField(
[
`${faceapi.round(age, 0)} years`,
`${gender} (${faceapi.round(genderProbability)})`
],
result.detection.box.bottomRight
).draw(canvas);
});
这是 index.js 文件的最终版本
const video = document.getElementById('video');
Promise.all([
faceapi.nets.tinyFaceDetector.loadFromUri('/models'),
faceapi.nets.faceLandmark68Net.loadFromUri('/models'),
faceapi.nets.faceRecognitionNet.loadFromUri('/models'),
faceapi.nets.faceExpressionNet.loadFromUri('/models'),
faceapi.nets.ageGenderNet.loadFromUri('/models')
]).then(startVideo);
function startVideo() {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
if (navigator.getUserMedia) {
navigator.getUserMedia({ video: true },
function(stream) {
var video = document.querySelector('video');
video.srcObject = stream;
video.onloadedmetadata = function(e) {
video.play();
};
},
function(err) {
console.log(err.name);
}
);
} else {
document.body.innerText ="getUserMedia not supported";
console.log("getUserMedia not supported");
}
}
video.addEventListener('play', () => {
const canvas = faceapi.createCanvasFromMedia(video);
document.body.append(canvas);
const displaySize = { width: video.width, height: video.height };
faceapi.matchDimensions(canvas, displaySize);
setInterval(async () => {
const predictions = await faceapi
.detectAllFaces(video, new faceapi.TinyFaceDetectorOptions())
.withFaceLandmarks()
.withFaceExpressions()
.withAgeAndGender();
const resizedDetections = faceapi.resizeResults(predictions, 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);
resizedDetections.forEach(result => {
const { age, gender, genderProbability } = result;
new faceapi.draw.DrawTextField(
[
`${faceapi.round(age, 0)} years`,
`${gender} (${faceapi.round(genderProbability)})`
],
result.detection.box.bottomRight
).draw(canvas);
});
}, 100);
});
下一步是什么?
本系列文章向您介绍了 TensorFlow.js,并帮助您开始在浏览器中进行机器学习。我们构建了一个项目,向您展示了如何开始在浏览器中训练您自己的人工视觉 AI,并使其识别狗的品种、人类面部表情、年龄和性别。虽然这些本身已经令人印象深刻,但本系列仅仅是一个起点。在浏览器中,AI 和 ML 有着无限的可能性。例如,我们在本系列中没有做的一件事就是离线训练 ML 模型并将其导入到浏览器中。请随意在任何示例的基础上进行构建,或创建您自己有趣的东西。不要忘记分享您的想法!