0
vue基于face-api.js实现人脸识别
黄粱一梦2024-07-100
介绍
Face-api.js
是一个 JavaScript API
,是基于 tensorflow.js
核心 API 的人脸检测和人脸识别的浏览器实现。它实现了一系列的卷积神经网络(CNN),它实现了三种卷积神经网络(CNN)架构,用于完成人脸检测、识别和特征点检测任务。
安装
npm install face-api.js
下载引入模型文件
下载model文件
model文件需要在github上的faceapi仓库中下载, 找到weights文件夹进行下载
下载之后放在public文件夹下面
使用
import * as faceapi from "face-api.js";
// 初始化
async init() {
const modelsPath = "/weights";
// 加载模型
await faceapi.nets.ssdMobilenetv1.loadFromUri(modelsPath);
await faceapi.nets.faceLandmark68Net.loadFromUri(modelsPath);
await faceapi.nets.faceRecognitionNet.loadFromUri(modelsPath);
}
// 校验当前图片信息
let checkPicture = async (base64Str) => {
// console.log('收到的base64文本', base64Str);
let val = base64Str;
const byteCharacters = window.atob(val.replace(/^data:image\/\w+;base64,/, ""));
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const blob = new Blob([byteArray], { type: "image/jpeg" });
const img = await faceapi.bufferToImage(blob);
// 进行人脸检测
const detection = await faceapi.detectSingleFace(img).withFaceLandmarks();
if (detection) {
// 存在检测到的人脸
const detections = await faceapi.detectAllFaces(img).withFaceLandmarks();
let done = false
detections.forEach((element) => {
const { landmarks } = element;
const leftEye = landmarks.getLeftEye()[0];
const rightEye = landmarks.getRightEye()[3];
const mouth = landmarks.getMouth();
const imageWidth = img.width;
const imageHeight = img.height;
if (
(leftEye.x < imageWidth / 3 && rightEye.x < imageWidth / 3) || // 左右眼位于图像左侧
(leftEye.x > (2 * imageWidth) / 3 && rightEye.x > (2 * imageWidth) / 3) || // 左右眼位于图像右侧
(mouth[0].y < imageHeight / 3 && mouth[6].y < imageHeight / 3) || // 嘴巴位于图像上方
(mouth[0].y > (2 * imageHeight) / 3 && mouth[6].y > (2 * imageHeight) / 3) // 嘴巴位于图像下方
) {
console.log("半张人脸");
done = true
return
} else {
console.log("完整人脸");
done = true
return
}
});
return done
} else {
// 未检测到人脸
console.log("图片不包含人脸");
return false;
}
}
// 剪裁照片上传之后判断照片是否是通过校验的
let confirmClipping = async () => {
let clipBase = cropper.getDataURL()
pageData.isShowModel = false
submitData.file = clipBase
submitData.base64 = clipBase
// console.log('剪裁之后的文本', submitData.base64);
pageData.isShowLoading = true
let done = await checkPicture(submitData.base64)
pageData.isShowLoading = false
console.log('人脸校验是否通过', done);
if (!done) {
resetCliapHandler()
ElMessage.error("请上传五官清晰照片")
}
resetFileInput()
}
版权声明
本文系作者 @黄粱一梦 转载请注明出处,文中若有转载的以及参考文章地址也需注明。\(^o^)/~
Preview