vue2如何使用face-api.js實(shí)現(xiàn)人臉識(shí)別功能
由于開發(fā)需求要實(shí)現(xiàn)人臉識(shí)別,順便在此記錄一下,希望給各位前端愛好者帶來幫助。
1、安裝依賴
首先,確保你已經(jīng)安裝了Vue.js,并且創(chuàng)建了一個(gè)Vue項(xiàng)目。然后,安裝face-api.js及其相關(guān)依賴。由于face-api.js依賴于TensorFlow.js,你可能還需要安裝這個(gè)庫。可以通過npm或yarn來安裝:
npm install face-api.js
這是我安裝的版本

2、下載模型文件
face-api.js需要一些預(yù)先訓(xùn)練好的模型文件來執(zhí)行人臉檢測(cè)和識(shí)別。你需要從GitHub倉庫中下載這些文件,并放置在項(xiàng)目的public目錄下,或者配置一個(gè)正確的路徑指向這些文件??梢詮?a rel="external nofollow" target="_blank" title="face-api.js的GitHub頁面">face-api.js的GitHub頁面下載模型。
- 在這個(gè)頁面上,你會(huì)看到多個(gè)模型文件,例如
ssd_mobilenetv1_model-weights_manifest.json、face_landmark_68_model-weights_manifest.json等。為了使用face-api.js的不同功能,如人臉檢測(cè)、特征點(diǎn)定位、表情識(shí)別等,你需要下載相應(yīng)的模型文件。 - 你可以手動(dòng)下載,也可以直接克隆,你也可以私聊我一下我給你發(fā)。
git clone https://github.com/justadudewhohacks/face-api.js.git
3.克隆完之后你需要把模型文件放到 public下的models沒有models自己創(chuàng)建,你也可以自己規(guī)定路徑,只要路徑正確就行。

到此準(zhǔn)備工作就做完了,當(dāng)然你需要配置好vue框架。
3、封裝組件
為了更好地組織代碼并使其可復(fù)用,我們可以將人臉識(shí)別的功能封裝成一個(gè)Vue組件。下面是一個(gè)更完善的示例,展示了如何創(chuàng)建一個(gè)名為FaceRecognition.vue的自定義組件,該組件負(fù)責(zé)處理視頻流、人臉檢測(cè)、以及展示檢測(cè)結(jié)果。完整代碼塊在這
<template>
<div class="face-recognition">
<video ref="video" width="640" height="480" autoplay></video>
<canvas ref="canvas" width="640" height="480"></canvas>
<div>當(dāng)前人流量:{{ peopleCount }}</div>
</div>
</template>
<script>
import * as faceapi from 'face-api.js';
export default {
name: 'FaceRecognition',
data() {
return {
isLoaded: false,
lastDetections: [], // 上一幀檢測(cè)到的人臉
peopleCount: 0, // 當(dāng)前人流量計(jì)數(shù)
};
},
mounted() {
this.loadModels();
},
methods: {
async loadModels() {
try {
await Promise.all([
faceapi.nets.faceRecognitionNet.loadFromUri('/models'),
faceapi.nets.faceLandmark68Net.loadFromUri('/models'),
faceapi.nets.ssdMobilenetv1.loadFromUri('/models'),
]);
this.isLoaded = true;
this.startVideo();
} catch (error) {
console.error('Failed to load models:', error);
}
},
startVideo() {
if (navigator.mediaDevices && this.isLoaded) {
navigator.mediaDevices.getUserMedia({ video: true })
.then(stream => {
this.$refs.video.srcObject = stream;
this.$refs.video.onloadedmetadata = () => {
this.detectFaces();
};
})
.catch(error => console.error('getUserMedia error:', error));
}
},
async detectFaces() {
const video = this.$refs.video;
const canvas = this.$refs.canvas;
const ctx = canvas.getContext('2d');
const detectionOptions = new faceapi.SsdMobilenetv1Options({ minConfidence: 0.9 });
let recentDetections = [];
const detectionHistoryLength = 5;
setInterval(async () => {
if (video.readyState === video.HAVE_ENOUGH_DATA) {
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
const detections = await faceapi.detectAllFaces(video, detectionOptions).withFaceLandmarks();
// console.log('查看獲取幀',validDescriptors)
// 確保只收集有效的面部描述符
const validDescriptors = detections
console.log('查看獲取幀',validDescriptors)
recentDetections.push(...validDescriptors.map(face => face.descriptor));
// 限制歷史長(zhǎng)度并去重
recentDetections = recentDetections.slice(-detectionHistoryLength);
// console.log('查看獲取幀',recentDetections)
const uniqueDescriptors = Array.from(new Set(recentDetections));
this.peopleCount = uniqueDescriptors.length; // 直接使用去重后的數(shù)組長(zhǎng)度,因已排除undefined,無需JSON.stringify和parse
faceapi.draw.drawDetections(canvas, detections);
faceapi.draw.drawFaceLandmarks(canvas, detections);
}
}, 100);
}
},
beforeDestroy() {
// 清理視頻流
if (this.$refs.video.srcObject) {
this.$refs.video.srcObject.getTracks().forEach(track => track.stop());
}
},
};
</script>
<style scoped>
.face-recognition {
position: relative;
}
</style>4、使用組件
創(chuàng)建文件直接引入組件然后注冊(cè)使用即可
<template>
<div id="app">
<FaceDetection />
</div>
</template>
<script>
import FaceDetection from '@/components/FaceDetection/FaceDetection.vue';
export default {
name: 'App',
components: {
FaceDetection,
},
};
</script>5、實(shí)現(xiàn)邏輯
- 在
mounted()生命周期鉤子中,首先加載模型,然后啟動(dòng)視頻流。 - 創(chuàng)建一個(gè)方法如
detectFaces()來周期性地從視頻流中捕獲幀,使用faceapi.detectAllFaces()來檢測(cè)人臉,并繪制檢測(cè)結(jié)果到<canvas>上。 - 根據(jù)需要,你可以擴(kuò)展此邏輯來實(shí)現(xiàn)更復(fù)雜的人臉識(shí)別功能,比如與已知人臉匹配等。
6、注意事項(xiàng)
- 確保你的應(yīng)用有訪問用戶媒體設(shè)備的權(quán)限。
- 處理好異步加載模型和獲取視頻流的錯(cuò)誤情況。
- 由于瀏覽器的安全策略,你可能需要在HTTPS環(huán)境下運(yùn)行此應(yīng)用,或者在localhost上進(jìn)行開發(fā)。
- 考慮性能優(yōu)化,避免頻繁的重繪導(dǎo)致的性能問題。
7、實(shí)現(xiàn)效果

到此這篇關(guān)于vue2使用face-api.js實(shí)現(xiàn)人臉識(shí)別功能的文章就介紹到這了,更多相關(guān)vue face-api.js人臉識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue SPA單頁應(yīng)用首屏優(yōu)化實(shí)踐
這篇文章主要介紹了Vue SPA單頁應(yīng)用首屏優(yōu)化實(shí)踐,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06
Vue實(shí)現(xiàn)導(dǎo)入Excel功能步驟詳解
這篇文章主要介紹了Vue實(shí)現(xiàn)導(dǎo)入Excel功能,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
解決微信瀏覽器緩存站點(diǎn)入口文件(IIS部署Vue項(xiàng)目)
這篇文章主要介紹了解決微信瀏覽器緩存站點(diǎn)入口文件(IIS部署Vue項(xiàng)目),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
vue多級(jí)復(fù)雜列表展開/折疊及全選/分組全選實(shí)現(xiàn)
這篇文章主要介紹了vue多級(jí)復(fù)雜列表展開/折疊及全選/分組全選實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
Vue3.0實(shí)現(xiàn)圖片預(yù)覽組件(媒體查看器)功能
最近項(xiàng)目中有個(gè)場(chǎng)景,一組圖片、視頻、音頻、文件數(shù)據(jù),要求點(diǎn)擊圖片可以放大預(yù)覽,左右可以切換音視頻、文件,支持鼠標(biāo)及各種鍵控制?縮放,左右旋轉(zhuǎn),移動(dòng)等功能,這篇文章主要介紹了Vue3.0實(shí)現(xiàn)圖片預(yù)覽組件(媒體查看器),需要的朋友可以參考下2023-12-12
利用vuex-persistedstate將vuex本地存儲(chǔ)實(shí)現(xiàn)
這篇文章主要介紹了利用vuex-persistedstate將vuex本地存儲(chǔ)的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
理解Vue2.x和Vue3.x自定義指令用法及鉤子函數(shù)原理
這篇文章主要介紹了理解Vue2.x和Vue3.x的自定義指令的用法及鉤子函數(shù)原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-09-09

