vue2如何使用face-api.js實(shí)現(xiàn)人臉識別功能
由于開發(fā)需求要實(shí)現(xiàn)人臉識別,順便在此記錄一下,希望給各位前端愛好者帶來幫助。
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í)行人臉檢測和識別。你需要從GitHub倉庫中下載這些文件,并放置在項(xiàng)目的public目錄下,或者配置一個(gè)正確的路徑指向這些文件??梢詮?a rel="external nofollow" target="_blank" title="face-api.js的GitHub頁面">face-api.js的GitHub頁面下載模型。
- 在這個(gè)頁面上,你會看到多個(gè)模型文件,例如
ssd_mobilenetv1_model-weights_manifest.json
、face_landmark_68_model-weights_manifest.json
等。為了使用face-api.js
的不同功能,如人臉檢測、特征點(diǎn)定位、表情識別等,你需要下載相應(yī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ù)用,我們可以將人臉識別的功能封裝成一個(gè)Vue組件。下面是一個(gè)更完善的示例,展示了如何創(chuàng)建一個(gè)名為FaceRecognition.vue
的自定義組件,該組件負(fù)責(zé)處理視頻流、人臉檢測、以及展示檢測結(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: [], // 上一幀檢測到的人臉 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)); // 限制歷史長度并去重 recentDetections = recentDetections.slice(-detectionHistoryLength); // console.log('查看獲取幀',recentDetections) const uniqueDescriptors = Array.from(new Set(recentDetections)); this.peopleCount = uniqueDescriptors.length; // 直接使用去重后的數(shù)組長度,因已排除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)建文件直接引入組件然后注冊使用即可
<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()
生命周期鉤子中,首先加載模型,然后啟動視頻流。 - 創(chuàng)建一個(gè)方法如
detectFaces()
來周期性地從視頻流中捕獲幀,使用faceapi.detectAllFaces()
來檢測人臉,并繪制檢測結(jié)果到<canvas>
上。 - 根據(jù)需要,你可以擴(kuò)展此邏輯來實(shí)現(xiàn)更復(fù)雜的人臉識別功能,比如與已知人臉匹配等。
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)人臉識別功能的文章就介紹到這了,更多相關(guān)vue face-api.js人臉識別內(nèi)容請搜索腳本之家以前的文章或繼續(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-06Vue實(shí)現(xiàn)導(dǎo)入Excel功能步驟詳解
這篇文章主要介紹了Vue實(shí)現(xiàn)導(dǎo)入Excel功能,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07解決微信瀏覽器緩存站點(diǎn)入口文件(IIS部署Vue項(xiàng)目)
這篇文章主要介紹了解決微信瀏覽器緩存站點(diǎn)入口文件(IIS部署Vue項(xiàng)目),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06vue多級復(fù)雜列表展開/折疊及全選/分組全選實(shí)現(xiàn)
這篇文章主要介紹了vue多級復(fù)雜列表展開/折疊及全選/分組全選實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11Vue3.0實(shí)現(xiàn)圖片預(yù)覽組件(媒體查看器)功能
最近項(xiàng)目中有個(gè)場景,一組圖片、視頻、音頻、文件數(shù)據(jù),要求點(diǎn)擊圖片可以放大預(yù)覽,左右可以切換音視頻、文件,支持鼠標(biāo)及各種鍵控制?縮放,左右旋轉(zhuǎn),移動等功能,這篇文章主要介紹了Vue3.0實(shí)現(xiàn)圖片預(yù)覽組件(媒體查看器),需要的朋友可以參考下2023-12-12利用vuex-persistedstate將vuex本地存儲實(shí)現(xiàn)
這篇文章主要介紹了利用vuex-persistedstate將vuex本地存儲的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04理解Vue2.x和Vue3.x自定義指令用法及鉤子函數(shù)原理
這篇文章主要介紹了理解Vue2.x和Vue3.x的自定義指令的用法及鉤子函數(shù)原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-09-09