Javascript Can';t加载face-api.js的模型,尽管推断了模型

Javascript Can';t加载face-api.js的模型,尽管推断了模型,javascript,node.js,express,face-api,Javascript,Node.js,Express,Face Api,我正在尝试做一个人脸检测的应用程序。但尽管有加载模型。我得到的错误是“SsdMobilenetv1-推断前的负载模型” 我正在从服务器发送前端HTML文件。在客户端,我正在尝试进行人脸检测。我将非常感谢您的友好回复。问候 这是我的express服务器 Index.js const express = require("express") const path = require('path') const app = express() const hbs = require

我正在尝试做一个人脸检测的应用程序。但尽管有加载模型。我得到的错误是“SsdMobilenetv1-推断前的负载模型” 我正在从服务器发送前端HTML文件。在客户端,我正在尝试进行人脸检测。我将非常感谢您的友好回复。问候

这是我的express服务器

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) })
因为声誉不好,我不能直接发布图片,但这里是我文件夹结构的链接


我认为客户端脚本中只有两个部分与此问题相关,因此让我们重点关注这些部分:

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) })
因此,我们有一个
承诺。所有的
在顶部,它安排了3个函数的执行,
ssdMobilenetv1
其中,在调用
faceapi.detectSingleFace
之前调用它们。但是,问题是,
中的这3个函数承诺了。所有
都将异步执行,而主线程将继续并尝试调用
faceapi.DetectIngleFace
,即使
ssdMobilenetv1
仍在运行

最简单的解决方案是将
detectSingleFace
放入
Promise的成功回调。所有

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
已经完成。

成功了!!!我很感激。由于异步的特性,这一点应该很明显。detectSingleFace在加载SsdMobilenetv1之前正在运行。非常感谢你的帮助