Toybrick

标题: reid的ckpt.t7模型转rknn,rknn结果不正确问题,结果为负数-65536. [打印本页]

作者: Redly    时间: 2021-10-26 18:27
标题: reid的ckpt.t7模型转rknn,rknn结果不正确问题,结果为负数-65536.
下载deepsort的pytorch库,地址:https://github.com/ZQPei/deep_sort_pytorch.git

想要将reid特征提取模型 ckpt.t7转为rknn模型,大概步骤是:

1. 将ckpt.t7模型转换为onnx模型代码如下:
import argparse
import torch
import numpy as np
import onnx
from deep_sort import build_tracker
from utils.draw import draw_boxes
from utils.parser import get_config

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("--config_deepsort", type=str, default="./configs/deep_sort.yaml", help='Configure tracker')
    parser.add_argument("--cpu", dest="use_cuda", action="store_false", default=True, help='Run in CPU')
    args = parser.parse_args()
    cfg = get_config()
    cfg.merge_from_file(args.config_deepsort)
    use_cuda = args.use_cuda and torch.cuda.is_available()
    torch.set_grad_enabled(False)
    model = build_tracker(cfg, use_cuda=False)
    model.reid = True
    model.extractor.net.eval()
    device = 'cuda' #'cuda'
    output_onnx = 'ckpt.onnx'
    # ------------------------ export -----------------------------
    print("==> Exporting model to ONNX format at '{}'".format(output_onnx))
    input_names = ['input']
    output_names = ['output']
    input_tensor = torch.randn(1, 3, 128, 64, device=device)
    # onnx
    torch.onnx.export(model.extractor.net.cpu(), input_tensor, output_onnx, export_params=True, verbose=True,
                      input_names=input_names, output_names=output_names, opset_version=10,
                      do_constant_folding=True)
2. 验证onnx模型,结果正确。

3. 将onnx转为rknn模型,转换方法为https://github.com/EASY-EAI/yolov5  中的rknn_convert.py,
   rknn正常转换成功,build成功。

4. 问题:推理ckpt.rknn模型时, rknn.inference输出的特征为负数,全部为-65536.
   推理代码如下:
   
RKNN_MODEL = "ckpt.rknn"
IMG_PATH = "images/2_0002.jpg"

model = load_model(RKNN_MODEL)
_rknn = model
img = cv2.imread(IMG_PATH) [:, :, (2, 1, 0)]
size = (64, 128)
_im = cv2.resize(img.astype(np.float32)/255., size)
# data preprocess
ave = [0.485, 0.456, 0.406]
stda = [0.229, 0.224, 0.225]
im = Z_ScoreNorm(_im, ave, stda) # normalization

im = np.transpose(im, (2, 0, 1)) # transform 3*128*64
im = np.expand_dims(im, axis=0) # input (1*3*128*64)
im = im.astype(np.float16)
pred_onx = _rknn.inference(inputs=[im],data_type='float16', data_format='nchw')  # 输入格式为nchw  , data_format='nchw'
print(pred_onx)   


请问有哪位大神能指点一下哪里出问题了吗? 谢谢!
reid特征提取模型,ckpt.t7


作者: jefferyzhang    时间: 2021-10-27 08:35
关了量化和预编译后结果正确么?
作者: Redly    时间: 2021-10-27 09:08
jefferyzhang 发表于 2021-10-27 08:35
关了量化和预编译后结果正确么?

结果没有变化,也不正确。
作者: jefferyzhang    时间: 2021-10-27 10:44
Redly 发表于 2021-10-27 09:08
结果没有变化,也不正确。

rknn api和drv版本分别是多少
作者: Redly    时间: 2021-10-27 11:08
jefferyzhang 发表于 2021-10-27 10:44
rknn api和drv版本分别是多少

onnx1.6.0,rknn-toolkit1.6.0, 是在仿真环境中运行的。
作者: jefferyzhang    时间: 2021-10-27 12:02
仿真环境建议你用rknn-toolkit 1.7试下结果有没有区别
作者: Redly    时间: 2021-10-27 15:57
jefferyzhang 发表于 2021-10-27 12:02
仿真环境建议你用rknn-toolkit 1.7试下结果有没有区别

rknn-toolkit1.7.0 输出结果为0.,1. ...排列,也不是有效特征值。
作者: jefferyzhang    时间: 2021-10-27 16:01
Redly 发表于 2021-10-27 15:57
rknn-toolkit1.7.0 输出结果为0.,1. ...排列,也不是有效特征值。

0 1 是被量化的吧,不量化的结果呢?

你如果是FAE客户,可以直接向redmine提交问题单。
或者加入rknn qq群向他们直接提问。

如果想定位,可以dump出每一层看下从哪一层开始出问题的,请参看rknntoolkit提供的文档
作者: Redly    时间: 2021-10-27 17:12
jefferyzhang 发表于 2021-10-27 16:01
0 1 是被量化的吧,不量化的结果呢?

你如果是FAE客户,可以直接向redmine提交问题单。

好的,感谢,我已经向redmine提交问题单了
作者: xiaqing10    时间: 2021-10-28 10:10
本帖最后由 xiaqing10 于 2021-10-28 10:11 编辑

可以用下我转的,试试?
不需要做预处理归一化吗,我转的时候已经写进去了。

作者: Redly    时间: 2021-10-28 18:52
xiaqing10 发表于 2021-10-28 10:10
可以用下我转的,试试?
不需要做预处理归一化吗,我转的时候已经写进去了。
...

非常感谢!
我用您给的模型测试,结果是正确的。
我在转模型的时候没有做归一化预处理,只是在rknn推理的时候做了归一化预处理。
请问,您是在onnx转rknn的时候做的归一化预处理吗?能稍微详细说明一下是怎么做的吗?
感谢感谢!!!
作者: xiaqing10    时间: 2021-10-29 09:23
Redly 发表于 2021-10-28 18:52
非常感谢!
我用您给的模型测试,结果是正确的。
我在转模型的时候没有做归一化预处理,只是在rknn推理的 ...

不管啥时候做归一化都可以啊,偷懒的话转的时候做,不偷懒的话推断的时候做,两者取其一即可,反正是预处理而已。
作者: Redly    时间: 2021-10-29 16:14
xiaqing10 发表于 2021-10-29 09:23
不管啥时候做归一化都可以啊,偷懒的话转的时候做,不偷懒的话推断的时候做,两者取其一即可,反正是预处 ...

我看了您给我的rknn模型结构,发现我转的最后reshape之后接的是L2_Normalize, 与您的不一样。
想问一下,torch7转onnx时,您是怎么设置的呢?还有onnx转rknn的时候,rknn.config中mean/std参数是不是就是[0.485, 0.456, 0.406], [0.229, 0.224, 0.225] ?附件是我转的模型,麻烦您帮忙看看

作者: blue    时间: 2022-12-13 11:32
Redly 发表于 2021-10-28 18:52
非常感谢!
我用您给的模型测试,结果是正确的。
我在转模型的时候没有做归一化预处理,只是在rknn推理的 ...

您的这个模型在板子上推理时间是多少呀,我的时间490ms-900ms,不等,时间正常吗
作者: lfb6054    时间: 2023-3-13 11:09
xiaqing10 发表于 2021-10-28 10:10
可以用下我转的,试试?
不需要做预处理归一化吗,我转的时候已经写进去了。
...

你是怎么转的啊,求方法

作者: RaoDD    时间: 2024-3-20 10:36
blue 发表于 2022-12-13 11:32
您的这个模型在板子上推理时间是多少呀,我的时间490ms-900ms,不等,时间正常吗 ...

我在11267上用这个模型也是差不多这个时间,目标多了的话,2s+了,耗时太大了啊,这个怎么优化




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3