我不明白如何加载“模型”,以便我的 React Web 应用程序的客户端可以开始分析图像。我什至不太明白什么是“模型”。
我从做
npm i face-api.js
开始。
然后,我通过在顶部输入
import * as faceapi from 'face-api.js'
将其导入到我的 SignUp 组件中。
在我的
componentDidMount()
函数中,我输入了以下代码:
faceapi.nets.ssdMobilenetv1.loadFromUri('/models').then(result => {
console.log(result);
}).catch(error => {
console.log(error)
})
这给了我以下错误: 语法错误:“JSON.parse:JSON 数据第 1 行第 1 列出现意外字符”
所以我尝试在face-api.js目录中寻找“models”目录,但找不到任何东西。然后我回到Github,发现了一个“weights”文件夹(我读到与模型相关)。我下载了它,并将其内容放在我的注册组件附近的“模型”文件夹中(参见附图)。还是同样的错误。
最终,我只想知道用户是否上传了包含人脸的图片。任何面孔。除此之外我不需要任何东西。我做错了什么?
当您运行此命令时:
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
对于我使用 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})
Smarann Educations 的上述回复非常有用,除了我做了以下更改以使我的在生产服务器上工作:
按照 Smarann Educations 的建议,我在分片文件中输入了“.bin”扩展名,而不是“.shard”扩展名。同样,在相应的 json 文件中,我按照 Smarann Educations 的建议将路径更新为“.bin”而不是“.shard”。这个“.bin”建议位于 Smarann Educations 在其回复中提供的链接的评论之一中
我将所有 loadFromUri('/models') 语句修改为 loadFromUri('./models') - 因此,将 '/models' 替换为 './models' (注意斜杠之前的点)
我在反应中遇到了同样的问题,但在开发和生产服务器中。因此,要在本地(在本地主机上)修复它,只需将模型文件夹放入公共文件夹中即可。
要在服务器上修复,您应该将模型文件夹放入
build/static
。
所以我在 package.json
脚本中添加了:
"replace_models":
"node -e \"const fs = require('fs-extra');
fs.copy('./build/models', './build/static/models').then(
() => {fs.removeSync('./build/models');
return console.log('success!')}
).catch(err => console.error(err))\"
"
然后:
"build": "react-scripts build && npm run replace_models"
他们将如何在 c# mvc 中执行此操作,执行时不会出现 models、dist 等文件夹?
您可以使用
loadFromDisk
代替 loadFromUri
。
或
您可以将模型的文件扩展名更改为
.dir
而不是 .json
。