alibaba / pipcook

Machine learning platform for Web developers

Home Page:https://alibaba.github.io/pipcook/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

调用 predict 时无法加载 python 插件

ltaoo opened this issue · comments

commented

按照官网 识别图片中的前端组件 示例中的 pipeline.json,能够运行,但会一直卡在 ⚠ Epoch: 0 这个地方,为了能快速得到结果,将官方提供的数据集只保留了两张图片,epochs 也减小为 20,实际运行后确实得到了 output

但是再根据官网安装依赖后,执行官方的预测代码提示

/Users/username/Documents/pipcook/output/node_modules/@pipcook/plugins-pytorch-yolov5-model-define/__init__.py:1
import sys
^^^^^^

SyntaxError: Cannot use import statement outside a module

我的理解 outputrequire('@pipcook/plugins-pytorch-yolov5-model-define'),但是这个包都是 python 代码导致导入失败。

我的版本

~ pipcook --version
Pipcook Tools   v1.3.0 /usr/local/lib/node_modules/@pipcook/pipcook-cli/
Pipcook Daemon  v1.3.0 /Users/username/.pipcook/server/node_modules/@pipcook/daemon

pipeline.json

{
    "plugins": {
      "dataCollect": {
        "package": "@pipcook/plugins-object-detection-pascalvoc-data-collect",
        "params": {
            "url": "https://cdn.weipaitang.com/static/public/2021011222d2e494-36ed-e49436ed-c689-f9c3cfa76212.zip"
        }
      },
      "dataAccess": {
        "package": "@pipcook/plugins-coco-data-access"
      },
      "modelDefine": {
        "package": "@pipcook/plugins-pytorch-yolov5-model-define"
      },
      "modelTrain": {
        "package": "@pipcook/plugins-pytorch-yolov5-model-train",
        "params": {
          "epochs": 20
        }
      },
      "modelEvaluate": {
        "package": "@pipcook/plugins-pytorch-yolov5-model-evaluate"
      }
    }
  }

预测代码

const predict = require('./output');
(async () => {
  const v1 = await predict('./test.jpg');
  console.log(v1); 
})();

非常感谢 😁

Hi @ltaoo 这个问题我们之前也遇到过,原因是目前预测部分还不支持纯 Python 插件,你可以在本地修改下 index.js 中的插件部分,可以在这里使用 Boa 加载插件。

commented

我把 output/index.js_requirePlugin 方法修改为

function _requirePlugin(name) {
  const modPath = pipeline[name];
  const modPkg = require(modPath + "/package.json");
  let mod = null;
  const { pipcook } = modPkg;
  if (pipcook && pipcook.runtime === "python") {
    const currentDir = path.relative(process.cwd(), __dirname);
    const pythonImportPath = path
      .join(currentDir, "node_modules", modPath)
      .replace(/\//g, ".");
    mod = boa.import(pythonImportPath);
  } else {
    mod = require(modPath);
  }
  if (mod && typeof mod.default === "function") {
    return mod.default;
  }
  if (mod && typeof mod.main === "function") {
    return mod.main;
  }
  return mod;
}

能够运行了,但是运行的结果是

Overriding model.yaml nc=80 with nc=2

[None]

这里的 [None] 就是预测的结果,对应上面代码的 v1,这是表示没有识别成功吗,我直接用训练的图片作为测试图片,是因为样本量太少了吗?

@rickycao-qy 能帮忙看看吗~?

@ltaoo 看了下,https://github.com/imgcook/pipcook-plugin-pytorch-yolov5-model/blob/main/__init__.py#L100 插件这里应该需要传入 { data: './test.jpg' },可以试试改成 predict({ data: './test.jpg' })

commented

好像不行,改成 predict({ data: './test.jpg' }); 后,反而会报错

Overriding model.yaml nc=80 with nc=2

(node:43289) UnhandledPromiseRejectionWarning: Error: SystemError: <built-in function imread> returned NULL without setting an error

At:
  ./output/node_modules/@pipcook/plugins-pytorch-yolov5-model-define/__init__.py(100): predict

插件 predict 方法 100 行这里我打印 inputData.data

    def predict(self, inputData):
      print(inputData.data) # { data: 'test.jpg' } 时是 <JSObject object at 0x12bc79490> 'test.jpg' 时是 'test.jpg'
      img_origin = cv2.imread(inputData.data)
      # ...

传了 { data: './test.jpg' }inputData.data 不是 ./test.jpg,只传 './test.jpg'inputData.data 我打印是对的,显示的是 ./test.jpg 这个参数。

好像不行,改成 predict({ data: './test.jpg' }); 后,反而会报错

Overriding model.yaml nc=80 with nc=2

(node:43289) UnhandledPromiseRejectionWarning: Error: SystemError: <built-in function imread> returned NULL without setting an error

At:
  ./output/node_modules/@pipcook/plugins-pytorch-yolov5-model-define/__init__.py(100): predict

插件 predict 方法 100 行这里我打印 inputData.data

    def predict(self, inputData):
      print(inputData.data) # { data: 'test.jpg' } 时是 <JSObject object at 0x12bc79490> 'test.jpg' 时是 'test.jpg'
      img_origin = cv2.imread(inputData.data)
      # ...

传了 { data: './test.jpg' }inputData.data 不是 ./test.jpg,只传 './test.jpg'inputData.data 我打印是对的,显示的是 ./test.jpg 这个参数。

返回了 [None] 说明模型成功完成了预测,目前看你这个 case 应该非常过拟合,如果使用的训练集的数据大概率应该可以识别出来,目前看来很有可能是plugins-pytorch-yolov5-model-define预测逻辑中关于数据处理相关的有一些问题,可以一起看一下,插件开发者也一起排查一下

@rickycao-qy

Overriding model.yaml nc=80 with nc=2

[None]

请问这个问题插件修复解决了吗?

commented

@rickycao-qy

Overriding model.yaml nc=80 with nc=2

[None]

请问这个问题插件修复解决了吗?

@ShanaMaid

Pipcook 2.0 已发布,可以通过示例运行和部署模型,以上问题也已经解决,如果你在使用中有任何问题,可以通过这个 issue 或者钉钉群沟通。
此 issue 先关闭了。