Tencent / ncnn

ncnn is a high-performance neural network inference framework optimized for the mobile platform
Other
20.56k stars 4.18k forks source link

行人重识别这个项目模型转为ONNX在转为NCNN后识别错误。 #4679

Open lmq5294249 opened 1 year ago

lmq5294249 commented 1 year ago

原项目地址https://github.com/KaiyangZhou/deep-person-reid/tree/master

model | 模型 | モデル

  1. original model osnet_x0_75_msmt17_combineall.pth.zip https://kaiyangzhou.github.io/deep-person-reid/MODEL_ZOO.html

2.我用作者提供的方法进行转换为ONNX模型 https://github.com/KaiyangZhou/deep-person-reid/tree/master/tools CMD为 python export.py -p "./osnet_x0_25_market1501.pth" -hp --imgsz 256 128 --include onnx 转换后为 osnet_x0_75_msmt17_combineall.onnx.zip

这一步可以验证结果为正确 自己写的简单方法,应该是正确的吧!!!(边学边改) detect.py.zip

3.最后在转为NCNN模型 这一步,我在macos安装onnx2NCNN转换工具失败,然后采用网站的NCNN装换 https://convertmodel.com/#input=onnx&output=onnx

osnet_x0_75_msmt17_combineall-sim-opt.zip

4.在NCNN项目上验证结果,是跟ONNX测试验证的结果差远了,不同人形的图片结果相似度很高。扑街了 一些简单参数设置 int input_height = 256; int input_width = 128; const float m_mean_value[3] = { 0.485, 0.456, 0.406}; const float m_norm_value[3] = { 0.229, 0.224, 0.225};

std::vector FastReID::detectMatToVector(const cv::Mat &rgb) { cv::Mat resultMat;

int img_w = rgb.cols;
int img_h = rgb.rows;
ncnn::Mat ncnn_img;
ncnn_img = ncnn::Mat::from_pixels_resize(rgb.data, ncnn::Mat::PIXEL_RGB, img_w,img_h, input_width, input_height);
ncnn_img.substract_mean_normalize(m_mean_value, m_norm_value);

ncnn::Extractor ex = net.create_extractor();
ex.set_num_threads(1);
ex.input("images", ncnn_img);

ncnn::Mat inference_out;
ex.extract("output", inference_out);

if (inference_out.empty()) {
    return resultMat;
}

float *pha_data = (float*)inference_out.data;
cv::Mat onefeature(inference_out.h, inference_out.w, CV_32FC1, pha_data);

cv::Mat mat_1d = onefeature.reshape(1, 1); // 转换为一维的cv::Mat
std::vector<float> vec(mat_1d.ptr<float>(0), mat_1d.ptr<float>(0) + mat_1d.cols); // 拷贝数据到vector中
printf("Value = %f\n",vec.size());

return vec;

}

可以输出图1和图2数据在用下面方法算出相似度 double cosine_similarity(const std::vector& v1, const std::vector& v2) { // 计算向量长度 double len1 = 0.0, len2 = 0.0; for (double x : v1) { len1 += x x; } for (double x : v2) { len2 += x x; }

// 计算点积
double dot = 0.0;
size_t n = fmin(v1.size(), v2.size());
for (size_t i = 0; i < n; i++) {
    dot += v1[i] * v2[i];
}

// 计算余弦相似度
double cos_sim = dot / (sqrt(len1) * sqrt(len2));
return cos_sim;

}

我测试出来的NCNN模型推理结果不对,是不是转换错了??? 哪位大佬能试着将ONNX转为NCNN 看看结果。。。分析一下

本人是辣鸡小白刚学而已,求大佬帮忙看看这个行人重识别项目 @nihui

wzyforgit commented 1 year ago

看这个项目是pytorch的啊,你用pnnx转下试试? pyotrch -> torchscript -> pnnx/ncnn

lmq5294249 commented 1 year ago

看这个项目是pytorch的啊,你用pnnx转下试试? pyotrch -> torchscript -> pnnx/ncnn

怎么将模型由pyotrch 转为 torchscript模型,我试了网上的方法都是错误。可以写一个转换代码吗?

wzyforgit commented 1 year ago

就是你搜一下以trace模式导出torchscript,这样

lmq5294249 commented 1 year ago

就是你搜一下以trace模式导出torchscript,这样

就是你搜一下以trace模式导出torchscript,这样

import torch import torchvision

model = torch.load('/Users/lin/Desktop/deep-person-reid/tools/osnet_x0_75_msmt17_combineall.pth') model.eval()

x = torch.rand(1, 3, 256, 128)

script_model = torch.jit.trace(model, x) script_model = script_model.cpu()

torch.save(script_model, 'osnet_x0_75_torchscript.pt')

然后报错 Traceback (most recent call last): File "save_net.py", line 6, in model.eval() AttributeError: 'collections.OrderedDict' object has no attribute 'eval'

实际上我第一次使用这个方式转换,各种懵圈。试了几次代码都跑不通。

ouxiand commented 1 year ago

@lmq5294249 处理完了吗?同样的问题

ouxiand commented 1 year ago

请教下处理结果

lmq5294249 commented 1 year ago

没处理完,目前是模型转为torchscript模型失败。我试着写由pyotrch 转为 torchscript模型,遇到各种问题,也查看了原项目的相关代码加以帮助还是有问题,我把一些代码发上来给大神们看看。。。 本人辣鸡小白,没试过这种转换方式pyotrch -> torchscript -> pnnx/ncnn 下面自己弄的代码求大神改一改。 https://kaiyangzhou.github.io/deep-person-reid/pkg/models.html save_net.py.zip


有没有大神试着在这个项目做下ONNX模型转NCNN模型测试,我也不确定是否是我写的代码有问题导致结果有问题。(ONNX自己转换后测试是OK的,NCNN模型转换也没遇到BUG,但是测试结果异常)

lmq5294249 commented 1 year ago

@wzyforgit @nihui

ouxiand commented 1 year ago

@lmq5294249
pt2torchscript.zip 转好像没问题 就是pnnx的测试结果也是异常的(和你onnx结果一致,什么图片都是0.99**** )

wzyforgit commented 1 year ago

你倒是搜那个报错是啥意思咯 https://stackoverflow.com/questions/49941426/attributeerror-collections-ordereddict-object-has-no-attribute-eval

ouxiand commented 1 year ago

@lmq5294249 搞定没?onnx和pnnx好像也是错误的结果,你这边有进展不?

lmq5294249 commented 1 year ago

还没解决。估计我是解决不来 同一组图片onnx验证是对的。 osnet_x0_75_msmt17_combineall.onnx.zip (https://github.com/Tencent/ncnn/files/11418898/osnet_x0_25_msmt17_combineall.onnx.zip) 截屏2023-05-08 15 32 46

但是从onnx转NCNN,我测试过其他的人形重识别其他开源项目的models也是有问题。 https://github.com/linghu8812/yolov5_fastreid_deepsort_tensorrt

然后用你提供的pt2torchscript,再用pnnx转为ncnn后也是错的。 同一组图片ONNX测试结果是0.4649 转为NCNN是测试结果是0.9883 离谱的要命,输出的数据也是很大不同。 我怀疑转NCNN时,部分算子异常了出错了。我试过用mobilenetv2模型结果也是错的。 截屏2023-05-08 15 38 31

ouxiand commented 1 year ago

@nihui 大佬帮忙看看 同样的问题

znsoftm commented 1 year ago

mobilenetV3 转换后的输出也是错的

nihui commented 3 months ago

针对onnx模型转换的各种问题,推荐使用最新的pnnx工具转换到ncnn In view of various problems in onnx model conversion, it is recommended to use the latest pnnx tool to convert your model to ncnn

pip install pnnx
pnnx model.onnx inputshape=[1,3,224,224]

详细参考文档 Detailed reference documentation https://github.com/pnnx/pnnx https://github.com/Tencent/ncnn/wiki/use-ncnn-with-pytorch-or-onnx#how-to-use-pnnx

zengweigit commented 3 weeks ago

针对onnx模型转换的各种问题,推荐使用最新的pnnx工具转换到ncnn In view of various problems in onnx model conversion, it is recommended to use the latest pnnx tool to convert your model to ncnn

pip install pnnx
pnnx model.onnx inputshape=[1,3,224,224]

详细参考文档 Detailed reference documentation https://github.com/pnnx/pnnx https://github.com/Tencent/ncnn/wiki/use-ncnn-with-pytorch-or-onnx#how-to-use-pnnx

都是最新的pnnx版本,大哥帮忙看下具体问题啊,别人提问题你就是更新最新版本 。。。。。

Edward-YS commented 2 weeks ago

原项目地址https://github.com/KaiyangZhou/deep-person-reid/tree/master

model | 模型 | モデル

  1. original model osnet_x0_75_msmt17_combineall.pth.zip https://kaiyangzhou.github.io/deep-person-reid/MODEL_ZOO.html

您好! 请问您转换osnet.pth是打算在Android上实现reid吗?