调用 predict 时无法加载 python 插件
ltaoo opened this issue · comments
按照官网 识别图片中的前端组件 示例中的 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
我的理解 output
会 require('@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);
})();
非常感谢 😁
我把 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' })
好像不行,改成 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预测逻辑中关于数据处理相关的有一些问题,可以一起看一下,插件开发者也一起排查一下
Overriding model.yaml nc=80 with nc=2 [None]
请问这个问题插件修复解决了吗?
Pipcook 2.0 已发布,可以通过示例运行和部署模型,以上问题也已经解决,如果你在使用中有任何问题,可以通过这个 issue 或者钉钉群沟通。
此 issue 先关闭了。