使用 face-api.js 包 (node.js) 时导入 @tensorflow/tfjs-node 的问题
Posted
技术标签:
【中文标题】使用 face-api.js 包 (node.js) 时导入 @tensorflow/tfjs-node 的问题【英文标题】:problem with importing @tensorflow/tfjs-node while working with face-api.js package (node.js) 【发布时间】:2021-05-03 12:59:46 【问题描述】:我使用 @tensorflow/tfjs-node 包作为 face-api.js 包来加快速度(正如他们所说) 那是我的代码:
// import nodejs bindings to native tensorflow,
// not required, but will speed up things drastically (python required)
require('@tensorflow/tfjs-node');
// implements nodejs wrappers for htmlCanvasElement, HTMLImageElement, ImageData
const loadImage,Canvas, Image, ImageData = require('canvas')
const faceapi = require('face-api.js');
// patch nodejs environment, we need to provide an implementation of
// HTMLCanvasElement and HTMLImageElement
faceapi.env.monkeyPatch( Canvas, Image, ImageData )
// patch nodejs environment, we need to provide an implementation of
// HTMLCanvasElement and HTMLImageElement
faceapi.env.monkeyPatch( Canvas, Image, ImageData )
Promise.all([
faceapi.nets.ssdMobilenetv1.loadFromDisk('./models'),
faceapi.nets.faceRecognitionNet.loadFromDisk('./models'),
faceapi.nets.faceLandmark68Net.loadFromDisk('./models')
])
.then(async () =>
const image1= await loadImage("https://enigmatic-waters-76106.herokuapp.com/1.jpeg")
const image2= await loadImage("https://enigmatic-waters-76106.herokuapp.com/8.jpeg")
const result = await faceapi.detectSingleFace(image1).withFaceLandmarks()
.withFaceDescriptor()
const singleResult = await faceapi
.detectSingleFace(image2)
.withFaceLandmarks()
.withFaceDescriptor()
const labeledDescriptors = [
new faceapi.LabeledFaceDescriptors(
'saied',
[result.descriptor]
)
]
const faceMatcher = new faceapi.FaceMatcher(labeledDescriptors)
const bestMatch = faceMatcher.findBestMatch(singleResult.descriptor)
console.log(labeledDescriptors[0].descriptors)
)
当我运行代码时出现此错误
TypeError: forwardFunc_1 不是函数
在 G:\test\node_modules@tensorflow\tfjs-core\dist\tf-core.node.js:3166:55
在 G:\test\node_modules@tensorflow\tfjs-core\dist\tf-core.node.js:2989:22
在 Engine.scopedRun (G:\test\node_modules@tensorflow\tfjs-core\dist\tf-core.node.js:2999:23)
在 Engine.tidy (G:\test\node_modules@tensorflow\tfjs-core\dist\tf-core.node.js:2988:21)
在 kernelFunc (G:\test\node_modules@tensorflow\tfjs-core\dist\tf-core.node.js:3166:29)
在 G:\test\node_modules@tensorflow\tfjs-core\dist\tf-core.node.js:3187:27
在 Engine.scopedRun (G:\test\node_modules@tensorflow\tfjs-core\dist\tf-core.node.js:2999:23)
在 Engine.runKernelFunc (G:\test\node_modules@tensorflow\tfjs-core\dist\tf-core.node.js:3183:14)
在 mul_ (G:\test\node_modules\face-api.js\node_modules@tensorflow\tfjs-core\dist\ops\binary_ops.js:327:28)
在 Object.mul (G:\test\node_modules\face-api.js\node_modules@tensorflow\tfjs-core\dist\ops\operation.js:46:
29)
(使用node --trace-warnings ...
显示警告的创建位置)
(节点:3496)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于 throw
在没有 catch 块的异步函数内部,或者通过拒绝未使用 .cat 处理的承诺
通道()。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志 --unhandled-rejections=strict
(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝编号:1)
(节点:3496)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将终止 Node.js 进程并使用非零退出代码
当我删除“require('@tensorflow/tfjs-node');”时,代码运行良好,但我需要导入@tensorflow/tfjs-node 以加快进程
节点: v14.15.4
npm: 6.14.10
@tensorflow/tfjs-node: v3.0.0 Python 2.7.15(@tensorflow/tfjs-node 需要)
face-api.js: v0.22.2
提前感谢:)
【问题讨论】:
所以错误不是来自您的代码? 正如我所说,如果删除这个 (require('@tensorflow/tfjs-node');) 代码将起作用,但给我一个提示,我应该在我的加快进程的代码 我隐含的意思是:“我们怎样才能调试一个简单的'import'?”,如果你只导入@tensorflow/tfjs-node
,会出现同样的错误吗?
@SimonDehaut 这让我很困惑,简单的一行 require('@tensorflow/tfjs-node') 是什么导致了错误
对不起我的英语不好:)
【参考方案1】:
正如in this github issue解释的那样
您使用的 face-api.js 版本不兼容 tfjs 2.0+ 或 3.0+,只有过时的 1.x。 为什么在添加 tfjs-node 之前它起作用了?因为 face-api.js 实际上包含了 tfjs-core 1.x 的捆绑版本。添加 tfjs-node 后,它会覆盖全局 tf 命名空间,但它的版本要新得多且不兼容。
您必须安装过时的 tfjs-node 1.x 或按照他们给出的指示使用newer port of face-api.js that supports TF 2.0。
【讨论】:
以上是关于使用 face-api.js 包 (node.js) 时导入 @tensorflow/tfjs-node 的问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 face-api.js 进行人脸检测后,有啥方法可以自动裁剪人脸?