无法为 face-api.js 加载模型
Posted
技术标签:
【中文标题】无法为 face-api.js 加载模型【英文标题】:Can't Load Models for face-api.js 【发布时间】:2020-06-27 02:51:03 【问题描述】:我不明白如何加载“模型”以便我的 React Web 应用程序的客户端可以开始分析图像。我什至不明白什么是“模型”。
我从npm i face-api.js
开始。
然后,我通过在顶部输入import * as faceapi from 'face-api.js'
将其导入到我的注册组件中。
在我的componentDidMount()
函数中,我输入了以下代码:
faceapi.nets.ssdMobilenetv1.loadFromUri('/models').then(result =>
console.log(result);
).catch(error =>
console.log(error)
)
这给了我以下错误: SyntaxError:“JSON.parse:JSON 数据的第 1 行第 1 列出现意外字符”
所以我尝试在 face-api.js 目录中查找“models”目录,但找不到任何东西。然后我回到 Github,找到了一个“weights”文件夹(我读到的都是与模型相关的)。我下载了它,并将它的内容放在我的注册组件附近的“模型”文件夹中(见附图)。还是一样的错误。
最终,我只想知道用户是否上传了一张包含人脸的图片。随便一张脸。我不需要更多的东西。我做错了什么?
【问题讨论】:
【参考方案1】:对于我使用 VueJs 的示例,我在 public / dist 目录中添加了模型,并按照 github 示例的说明进行操作。
Promise.all([
faceapi.nets.faceRecognitionNet.loadFromUri('/models'),
faceapi.nets.ssdMobilenetv1.loadFromUri('/models'), faceapi.nets.faceLandmark68Net.loadFromUri('/models'),
])
.then(async () => //some code goes here)
Sample I used
【讨论】:
【参考方案2】:您可以使用loadFromDisk
代替loadFromUri
。
或
您可以将模型的文件扩展名更改为 .dir
而不是 .json
。
【讨论】:
【参考方案3】:当你运行这个时:
faceapi.nets.ssdMobilenetv1.loadFromUri('/models')
它在 public/models 目录中查找模型,但它只会加载 json 文件。(通过检查浏览器中的网络选项卡来验证这一点)。它可能在您的本地计算机上运行,但在您部署时会失败。
在我们的例子中,它在生产中失败了,因为它需要来自 *_shard1 文件的数据,但是我们的服务器无法在没有任何扩展名的情况下获取这些文件。 为了解决这个问题,我们为所有这些文件添加了“.shard”扩展名,并更改了相应 json 文件中的路径: 来自:
...,"paths": ["file_name_shard1"]]
收件人:
...,"paths": ["file_name_shard1.shard"]
在此处找到此解决方案:https://github.com/justadudewhohacks/face-api.js/issues/131
【讨论】:
以上是关于无法为 face-api.js 加载模型的主要内容,如果未能解决你的问题,请参考以下文章
face-api.js with Vue.js and Electron