尽管推断了模型,但仍无法加载 face-api.js 的模型
Can't Load Models for face-api.js despite infereing the models
我正在尝试制作人脸检测应用。但尽管加载模型。我收到错误 “SsdMobilenetv1 - 推理前加载模型”
我正在从服务器发送前端 HTML 文件。在客户端前端,我正在尝试进行人脸检测。我将非常感谢您的友好回应。问候!!!
这是我的快递服务器
Index.js
const express = require("express")
const path = require('path')
const app = express()
const hbs = require("hbs")
const publicFolder = path.join(__dirname, '../public')
const viewsPath = path.join(__dirname, "../views")
app.use(express.static(publicFolder));
app.set("view engine", "hbs");
app.set("views", viewsPath);
app.get('/', (req, res) => {
res.render('index.hbs')
})
app.listen(7000, () => {
console.log("Listening On port")
})
这是前端的脚本文件face.js
const MODEL_URL = "/weights";
Promise.all([
faceapi.nets.ssdMobilenetv1.loadFromUri(MODEL_URL),
faceapi.nets.faceRecognitionNet.loadFromUri(MODEL_URL),
faceapi.nets.faceLandmark68Net.loadFromUri(MODEL_URL),
]).then((val) => {
// console here gives an array of undefined
console.log(val)
}).catch((err) => {
console.log(err)
})
const img = document.getElementById('img')
const inputField = document.getElementById('imgUpload')
const canvas = document.getElementById('canvas')
const inputChangeListner = function (e) {
var selectedFile = e.target.files[0];
var reader = new FileReader();
img.title = selectedFile.name;
reader.onload = function (event) {
console.log(event)
img.src = event.target.result;
};
reader.readAsDataURL(selectedFile);
}
inputField.onchange = inputChangeListner
faceapi.detectSingleFace(img).then((value) => {
console.log(value)
}).catch((err) => { console.log(err) })
由于声誉不佳,我无法直接 post 图片,但这是 link 我的文件夹结构
我认为您的 client-side 脚本中只有两个部分与此问题相关,所以让我们关注那些:
const MODEL_URL = "/weights";
Promise.all([
faceapi.nets.ssdMobilenetv1.loadFromUri(MODEL_URL),
faceapi.nets.faceRecognitionNet.loadFromUri(MODEL_URL),
faceapi.nets.faceLandmark68Net.loadFromUri(MODEL_URL),
]).then((val) => {
// console here gives an array of undefined
console.log(val)
}).catch((err) => {
console.log(err)
})
// ...
faceapi.detectSingleFace(img).then((value) => {
console.log(value)
}).catch((err) => { console.log(err) })
所以,我们在顶部有一个 Promise.all
,它安排执行 3 个函数,其中 ssdMobilenetv1
,is obligatory 在调用 [=14= 之前调用].但是,问题是,Promise.all
中的这 3 个函数将异步执行,而主线程将继续并尝试调用 faceapi.detectSingleFace
,即使 ssdMobilenetv1
仍在继续。
最简单的解决方案是将 detectSingleFace
放入 Promise.all
的成功回调中:
const MODEL_URL = "/weights";
Promise.all([
faceapi.nets.ssdMobilenetv1.loadFromUri(MODEL_URL),
faceapi.nets.faceRecognitionNet.loadFromUri(MODEL_URL),
faceapi.nets.faceLandmark68Net.loadFromUri(MODEL_URL),
]).then((val) => {
// console here gives an array of undefined
console.log(val);
faceapi.detectSingleFace(img).then((value) => {
console.log(value)
}).catch((err) => { console.log(err) });
}).catch((err) => {
console.log(err)
});
因为在回调中,您可以确定 faceapi.nets.ssdMobilenetv1
已完成。
我正在尝试制作人脸检测应用。但尽管加载模型。我收到错误 “SsdMobilenetv1 - 推理前加载模型” 我正在从服务器发送前端 HTML 文件。在客户端前端,我正在尝试进行人脸检测。我将非常感谢您的友好回应。问候!!!
这是我的快递服务器
Index.js
const express = require("express")
const path = require('path')
const app = express()
const hbs = require("hbs")
const publicFolder = path.join(__dirname, '../public')
const viewsPath = path.join(__dirname, "../views")
app.use(express.static(publicFolder));
app.set("view engine", "hbs");
app.set("views", viewsPath);
app.get('/', (req, res) => {
res.render('index.hbs')
})
app.listen(7000, () => {
console.log("Listening On port")
})
这是前端的脚本文件face.js
const MODEL_URL = "/weights";
Promise.all([
faceapi.nets.ssdMobilenetv1.loadFromUri(MODEL_URL),
faceapi.nets.faceRecognitionNet.loadFromUri(MODEL_URL),
faceapi.nets.faceLandmark68Net.loadFromUri(MODEL_URL),
]).then((val) => {
// console here gives an array of undefined
console.log(val)
}).catch((err) => {
console.log(err)
})
const img = document.getElementById('img')
const inputField = document.getElementById('imgUpload')
const canvas = document.getElementById('canvas')
const inputChangeListner = function (e) {
var selectedFile = e.target.files[0];
var reader = new FileReader();
img.title = selectedFile.name;
reader.onload = function (event) {
console.log(event)
img.src = event.target.result;
};
reader.readAsDataURL(selectedFile);
}
inputField.onchange = inputChangeListner
faceapi.detectSingleFace(img).then((value) => {
console.log(value)
}).catch((err) => { console.log(err) })
由于声誉不佳,我无法直接 post 图片,但这是 link 我的文件夹结构
我认为您的 client-side 脚本中只有两个部分与此问题相关,所以让我们关注那些:
const MODEL_URL = "/weights";
Promise.all([
faceapi.nets.ssdMobilenetv1.loadFromUri(MODEL_URL),
faceapi.nets.faceRecognitionNet.loadFromUri(MODEL_URL),
faceapi.nets.faceLandmark68Net.loadFromUri(MODEL_URL),
]).then((val) => {
// console here gives an array of undefined
console.log(val)
}).catch((err) => {
console.log(err)
})
// ...
faceapi.detectSingleFace(img).then((value) => {
console.log(value)
}).catch((err) => { console.log(err) })
所以,我们在顶部有一个 Promise.all
,它安排执行 3 个函数,其中 ssdMobilenetv1
,is obligatory 在调用 [=14= 之前调用].但是,问题是,Promise.all
中的这 3 个函数将异步执行,而主线程将继续并尝试调用 faceapi.detectSingleFace
,即使 ssdMobilenetv1
仍在继续。
最简单的解决方案是将 detectSingleFace
放入 Promise.all
的成功回调中:
const MODEL_URL = "/weights";
Promise.all([
faceapi.nets.ssdMobilenetv1.loadFromUri(MODEL_URL),
faceapi.nets.faceRecognitionNet.loadFromUri(MODEL_URL),
faceapi.nets.faceLandmark68Net.loadFromUri(MODEL_URL),
]).then((val) => {
// console here gives an array of undefined
console.log(val);
faceapi.detectSingleFace(img).then((value) => {
console.log(value)
}).catch((err) => { console.log(err) });
}).catch((err) => {
console.log(err)
});
因为在回调中,您可以确定 faceapi.nets.ssdMobilenetv1
已完成。