无法为 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 加载模型的主要内容,如果未能解决你的问题,请参考以下文章

无法为 Codeigniter 加载模型

face-api.js with Vue.js and Electron

如何从 face-api.js 中提取检测到的人脸

找不到 face-api.js 的 404 页面

使用 face-api.js 进行人脸检测后,有啥方法可以自动裁剪人脸?

使用 face-api.js 包 (node.js) 时导入 @tensorflow/tfjs-node 的问题