使用 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 进行人脸检测后,有啥方法可以自动裁剪人脸?

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

无法为 face-api.js 加载模型

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

教程 | face-api.js:在浏览器中进行人脸识别的JavaScript接口

如何在用户开心并使用 face-api 检测到人脸时拍摄图像