PaddleX icon indicating copy to clipboard operation
PaddleX copied to clipboard

使用C++代码,windows下使用cpp的代码部署,问题还是比较多

Open xinsuinizhuan opened this issue 4 years ago • 36 comments

第一:detector里面推理出来的坐标信息不对: 图片 这里坐标应该是,左上角坐标和框的长宽,这样才是对的,排查了老半天才发现。 另外,检测里面,没做阈值顾虑和iou过滤,看到阈值过滤是放到了外面,但是iou过滤外面也没做。 第二:seg分量,使用PaddleX.exe里面的样例:视盘分割,训练出来的代码,使用seg模块加载后推理,推理处理的data为1024,但是暗像素访问data[j + imgs[0].cols * i这样必越界,远远大于1024,没法可视化: 图片

可否提供你们测试使用的模型,找了半天都没找到测试使用cpp的模型,然后自己训练的视盘分割,但是不知道是模型训练问题,还是啥问题。 cpp里面提供了,四种类型的推理,det seg clas mask,可否都提供一个代码调试的模型和测试图片?

xinsuinizhuan avatar Sep 26 '21 08:09 xinsuinizhuan

det有了框的信息,自己容易可视化,但是另外的三种,可否提供cpp的可视化的代码部分,都是predict后,就没有了,想看到predict后的图像结果,验证模型可行性,好排查问题,到底是我们自己训练的模型问题,还是代码使用问题。

xinsuinizhuan avatar Sep 26 '21 08:09 xinsuinizhuan

seg模式cpp推理,可视化部分,可否提供一下,怎么可视化? 图片 这种模式是不对的,data的尺寸只有1024,但是,data[j + imgs[0].cols * i暗像素访问,必越界。没法可视化

xinsuinizhuan avatar Sep 26 '21 09:09 xinsuinizhuan

在model_deploy/utils目录下有可视化和过滤相关代码。你参考使用看看是否还有问题?

heliqi avatar Sep 26 '21 09:09 heliqi

utils里面Visualize的参数,numclasses哪里取?

xinsuinizhuan avatar Sep 26 '21 10:09 xinsuinizhuan

使用PaddleX.exe里面的样例:视盘分割,训练出来的模型,不行的。那个data的尺寸是1024不对的。另外一个人像的,可以

xinsuinizhuan avatar Sep 26 '21 10:09 xinsuinizhuan

numclasses是模型的的类别数, model.yaml文件里应该也有, 视盘分割的例子是两个类别, 填2即可

后面这个“data的尺寸是1024不对的” 没看懂啥意思

heliqi avatar Sep 26 '21 12:09 heliqi

numclasses是模型的的类别数, model.yaml文件里应该也有, 视盘分割的例子是两个类别, 填2即可

后面这个“data的尺寸是1024不对的” 没看懂啥意思

我使用paddleX.exe里面自带的视盘分割例子来做seg的cpp推理 pdetector->pppseg->Predict(imgs, &results, 1); std::vector<uint8_t> data = results[0].seg_result->label_map.data; 然后,这里data.size = 1024 但是,下面访问的时候, for (int i = 0; i < imgs[0].rows; i++) { for (int j = 0; j < imgs[0].cols; j++) { log_msg_ex("j + imgs[0].cols * i = %d", j + imgs[0].cols * i); if (data[j + imgs[0].cols * i] == 0) { continue; } _resultMat.atcv::Vec3b(i, j)[0] = data[j + imgs[0].cols * i] * 100; _resultMat.atcv::Vec3b(i, j)[1] = data[j + imgs[0].cols * i] * 100; _resultMat.atcv::Vec3b(i, j)[2] = data[j + imgs[0].cols * i] * 100; } } 是按像素访问data[j + imgs[0].cols * i],像素的下标:j + imgs[0].cols * i,远远大于1024,导致越界崩溃

xinsuinizhuan avatar Sep 26 '21 13:09 xinsuinizhuan

numclasses是模型的的类别数, model.yaml文件里应该也有, 视盘分割的例子是两个类别, 填2即可

后面这个“data的尺寸是1024不对的” 没看懂啥意思

视盘分割,用Visual函数来显示,崩溃: 图片 这个label_map.data()的大小是1024,虽然是赋值给了mask 512*512,但是后面访问mark的是,错误导致。就是这个label_map.data()引起的。 图片 正常,应该label_map.data()尺寸跟mask尺寸一样大 模型配置文件: Model: DeepLabV3P Transforms:

  • Resize: interp: LINEAR keep_ratio: false target_size:
    • 512
    • 512
  • Normalize: is_scale: true max_val:
    • 255.0
    • 255.0
    • 255.0 mean:
    • 0.5
    • 0.5
    • 0.5 min_val:
    • 0
    • 0
    • 0 std:
    • 0.5
    • 0.5
    • 0.5 _Attributes: eval_metrics: miou: 0.913982093334198 fixed_input_shape:
    • -1
    • 3
    • -1
    • -1 labels:
    • background
    • optic_disc model_type: segmenter num_classes: 2 _init_params: num_classes: 2 use_mixed_loss: false completed_epochs: 0 status: Infer version: 2.0.0

xinsuinizhuan avatar Sep 27 '21 01:09 xinsuinizhuan

图片 这个是正常的人像分割visual里面的label_map.data()的尺寸,跟图像大小是一样的,所以正常。但是人像分割里面参数文件Deploy.yaml很简单,没有类别numclasses: Deploy: model: model.pdmodel params: model.pdiparams transforms:

  • target_size:
    • 192
    • 192 type: Resize
  • type: Normalize

xinsuinizhuan avatar Sep 27 '21 01:09 xinsuinizhuan

另外,检测里面,没做阈值顾虑和iou过滤,看到阈值过滤是放到了外面,但是iou过滤外面也没做。

理解你说的iou过滤应该是说nms吧,这个在模型内部已经做过了,检测模型出来的预测结果是已经经过nms的。拿到预测结果之后,可以执行根据score thresh过滤掉低分结果,具体可视化代码如前所述在model_deploy/utils目录下。

FlyingQianMM avatar Sep 27 '21 02:09 FlyingQianMM

2.0.0部署代码的分割可视化之前也测试过没有问题,你的模型是使用哪个版本的paddlex训练得到的?然后部署代码是develop分支的吗?

FlyingQianMM avatar Sep 27 '21 02:09 FlyingQianMM

2.0.0部署代码的分割可视化之前也测试过没有问题,你的模型是使用哪个版本的paddlex训练得到的?然后部署代码是develop分支的吗? paddx版本: 图片 视频分割训练(都是默认): 图片 部署是https://github.com/PaddlePaddle/PaddleX/tree/release/2.0.0/deploy/cpp分支做的 最后部署模型是,paddle发布的模型: 图片

xinsuinizhuan avatar Sep 27 '21 03:09 xinsuinizhuan

gui对应的样例工程,也可以使用python api完成,具体的tutorials在https://github.com/PaddlePaddle/PaddleX/tree/release/2.0.0/tutorials ,使用文档 https://github.com/PaddlePaddle/PaddleX#paddlex-%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3

使用gui导出后部署的问题,我们会尽快复现排查

FlyingQianMM avatar Sep 28 '21 02:09 FlyingQianMM

我们重新测试了PaddleX GUI 2.0和release 2.0分支下的Paddle deploy,检测和分割均可正常可视化。现已将可视化流程整理至FAQ中,可参考下 https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/FAQ/FAQ.md 中的Q4答案。

回头看了下你前面提到的问题,如果你输入给predict()的图片大小是1024x1024,然后预处理阶段会resize到512x512,那么模型返回的预测label map是1024x1014的,请确保你传入给Visualize的img是1024x1024(即原图)。

FlyingQianMM avatar Oct 09 '21 09:10 FlyingQianMM

我们重新测试了PaddleX GUI 2.0和release 2.0分支下的Paddle deploy,检测和分割均可正常可视化。现已将可视化流程整理至FAQ中,可参考下 https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/FAQ/FAQ.md 中的Q4答案。

回头看了下你前面提到的问题,如果你输入给predict()的图片大小是1024x1024,然后预处理阶段会resize到512x512,那么模型返回的预测label map是1024x1014的,请确保你传入给Visualize的img是1024x1024(即原图)。

不是啊,这是我输入的原图: 图片 512*512 我最后画的图: 图片 这是label_map的shape也是512,但是这个data确实1024: 图片

xinsuinizhuan avatar Oct 11 '21 07:10 xinsuinizhuan

我们重新测试了PaddleX GUI 2.0和release 2.0分支下的Paddle deploy,检测和分割均可正常可视化。现已将可视化流程整理至FAQ中,可参考下 https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/FAQ/FAQ.md 中的Q4答案。

回头看了下你前面提到的问题,如果你输入给predict()的图片大小是1024x1024,然后预处理阶段会resize到512x512,那么模型返回的预测label map是1024x1014的,请确保你传入给Visualize的img是1024x1024(即原图)。

难道要我,输入的原图是512,再resize到1024画?

xinsuinizhuan avatar Oct 11 '21 07:10 xinsuinizhuan

我们现已将可视化流程整理至FAQ中,可参考下 https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/FAQ/FAQ.md 中的Q4答案

就确实挺奇怪的,我们也是用的PaddleX GUI 2.0和release 2.0分支下的Paddle deploy。你的可视化代码跟我们开放的一样么?

FlyingQianMM avatar Oct 11 '21 07:10 FlyingQianMM

我们重新测试了PaddleX GUI 2.0和release 2.0分支下的Paddle deploy,检测和分割均可正常可视化。现已将可视化流程整理至FAQ中,可参考下 https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/FAQ/FAQ.md 中的Q4答案。

回头看了下你前面提到的问题,如果你输入给predict()的图片大小是1024x1024,然后预处理阶段会resize到512x512,那么模型返回的预测label map是1024x1014的,请确保你传入给Visualize的img是1024x1024(即原图)。

检测的可视化,确实,如果用你们Visual里面的,确实没问题,只是我们里面的Rect的四个坐标是左上角和长、宽,我刚开始自己画的时候,看的注释是左上角坐标和右下角,所以是错误的,后来把后面坐标看成了长和宽,就对了,所以注释里面还是不对的 图片

xinsuinizhuan avatar Oct 11 '21 08:10 xinsuinizhuan

我们现已将可视化流程整理至FAQ中,可参考下 https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/FAQ/FAQ.md 中的Q4答案

就确实挺奇怪的,我们也是用的PaddleX GUI 2.0和release 2.0分支下的Paddle deploy。你的可视化代码跟我们开放的一样么?

一样的呢: 图片 这里报错: 图片 可否把您的模型给我发一份:[email protected]

xinsuinizhuan avatar Oct 11 '21 08:10 xinsuinizhuan

看的注释是左上角坐标和右下角,所以是错误的,后来把后面坐标看成了长和宽,就对了,所以注释里面还是不对的

你说的注释是指 https://github.com/PaddlePaddle/PaddleX/blob/develop/deploy/cpp/docs/apis/model.md#52-%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%BB%93%E6%9E%9C 或者 https://github.com/PaddlePaddle/PaddleX/blob/develop/deploy/cpp/docs/demo/model_infer.md#%E6%AD%A5%E9%AA%A4%E4%B8%89%E4%BD%BF%E7%94%A8%E7%BC%96%E8%AF%91%E5%A5%BD%E7%9A%84%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E9%A2%84%E6%B5%8B 还是指哪里啊 ?

FlyingQianMM avatar Oct 11 '21 08:10 FlyingQianMM

模型我们也是用样例工程训练得到的,啥也没改,跟你现在这个一样

要不你贴下你的model_infer.cpp,以及运行命令

FlyingQianMM avatar Oct 11 '21 08:10 FlyingQianMM

看的注释是左上角坐标和右下角,所以是错误的,后来把后面坐标看成了长和宽,就对了,所以注释里面还是不对的

你说的注释是指 https://github.com/PaddlePaddle/PaddleX/blob/develop/deploy/cpp/docs/apis/model.md#52-%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%BB%93%E6%9E%9C 或者 https://github.com/PaddlePaddle/PaddleX/blob/develop/deploy/cpp/docs/demo/model_infer.md#%E6%AD%A5%E9%AA%A4%E4%B8%89%E4%BD%BF%E7%94%A8%E7%BC%96%E8%AF%91%E5%A5%BD%E7%9A%84%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E9%A2%84%E6%B5%8B 还是指哪里啊 ?

这里的注释: 图片

xinsuinizhuan avatar Oct 11 '21 08:10 xinsuinizhuan

模型我们也是用样例工程训练得到的,啥也没改,跟你现在这个一样

要不你贴下你的model_infer.cpp,以及运行命令

分割这里有问题: 执行之前,这个data尺寸是对的,512*512 = 262,144 图片 但是,执行之后,就不对了: 图片 感觉是,应该分配的262,144大小,但是只赋值了1024,后面的变成了野数据,会出来一个很大的值,然后再color_map那里就越界了。

xinsuinizhuan avatar Oct 11 '21 08:10 xinsuinizhuan

这个注释是c#案例demo的,写错了。所以你现在是跑的c++的还是c#的?我们测试的是c++的demo可以正常可视化

FlyingQianMM avatar Oct 11 '21 08:10 FlyingQianMM

这个注释是c#案例demo的,写错了。所以你现在是跑的c++的还是c#的?我们测试的是c++的demo可以正常可视化

嗯。我当时是参考的c#的写的C++的可视化。哈哈。

xinsuinizhuan avatar Oct 11 '21 08:10 xinsuinizhuan

这个注释是c#案例demo的,写错了。所以你现在是跑的c++的还是c#的?我们测试的是c++的demo可以正常可视化

嗯。我当时是参考的c#的写的C++的可视化。哈哈。

分割现在的可视化是怎么写的?要不你贴下你的完整model_infer.cpp

FlyingQianMM avatar Oct 11 '21 08:10 FlyingQianMM

模型我们也是用样例工程训练得到的,啥也没改,跟你现在这个一样 要不你贴下你的model_infer.cpp,以及运行命令

分割这里有问题: 执行之前,这个data尺寸是对的,512512 = 262,144 图片 但是,执行之后,就不对了: 图片 感觉是,应该分配的262,144大小,但是只赋值了1024,后面的变成了野数据,会出来一个很大的值,然后再color_map那里就越界了。 这个assign是有问题的,assign后尺寸就变了,变成1024,但是我觉得应该是原图尺寸的大小512512,我改成copy后,尺寸不变,使用人像分割的模型,貌似可以正常。但是,视盘分割,结果不对 图片

xinsuinizhuan avatar Oct 11 '21 09:10 xinsuinizhuan

这个注释是c#案例demo的,写错了。所以你现在是跑的c++的还是c#的?我们测试的是c++的demo可以正常可视化

嗯。我当时是参考的c#的写的C++的可视化。哈哈。

分割现在的可视化是怎么写的?要不你贴下你的完整model_infer.cpp

我的分割,就是简单的这样: // prepare data std::vectorcv::Mat imgs; imgs.push_back(std::move(frame));

// predict
std::vector<PaddleDeploy::Result> results;
pdetector->pppseg->Predict(imgs, &results, 1);

if (results.size() <= 0)
{
	return false;
}

Visualize(imgs[0], *(results[0].seg_result), &_resultMat, 2);

xinsuinizhuan avatar Oct 11 '21 09:10 xinsuinizhuan

贴下完整的可以么

FlyingQianMM avatar Oct 11 '21 09:10 FlyingQianMM

贴下完整的可以么

//初始化网络 //log_msg_ex("new DBDetector"); recogtask->pppseg = PaddleDeploy::CreateModel("seg"); if (recogtask->pppseg == NULL) { recogtask->fd = NULL; } else {

	// model init
	recogtask->pppseg->Init(_cfg_file);

	// inference engine init
	PaddleDeploy::PaddleEngineConfig engine_config;
	engine_config.model_filename = _model_filename;
	engine_config.params_filename = _params_filename;
	engine_config.use_gpu = use_gpu;
	engine_config.gpu_id = gpu_id;
	engine_config.key = "";
	recogtask->pppseg->PaddleEngineInit(engine_config);
}

推理: if (pdetector == NULL) { return false; }

// prepare data
std::vector<cv::Mat> imgs;
imgs.push_back(std::move(frame));

// predict
std::vector<PaddleDeploy::Result> results;
pdetector->pppseg->Predict(imgs, &results, 1);

if (results.size() <= 0)
{
	return false;
}

Visualize(imgs[0], *(results[0].seg_result), &_resultMat, pdetector->numclasses);

xinsuinizhuan avatar Oct 11 '21 09:10 xinsuinizhuan