Toybrick

reid的ckpt.t7模型转rknn,rknn结果不正确问题,结果为负数-65536.

Redly

注册会员

积分
69
QQ
发表于 2021-10-26 18:27:16    查看: 13995|回复: 15 | [复制链接]    打印 | 显示全部楼层
下载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

版主

积分
12844
发表于 2021-10-27 08:35:14 | 显示全部楼层
关了量化和预编译后结果正确么?
回复

使用道具 举报

Redly

注册会员

积分
69
QQ
 楼主| 发表于 2021-10-27 09:08:04 | 显示全部楼层
jefferyzhang 发表于 2021-10-27 08:35
关了量化和预编译后结果正确么?

结果没有变化,也不正确。
回复

使用道具 举报

jefferyzhang

版主

积分
12844
发表于 2021-10-27 10:44:50 | 显示全部楼层
Redly 发表于 2021-10-27 09:08
结果没有变化,也不正确。

rknn api和drv版本分别是多少
回复

使用道具 举报

Redly

注册会员

积分
69
QQ
 楼主| 发表于 2021-10-27 11:08:08 | 显示全部楼层
jefferyzhang 发表于 2021-10-27 10:44
rknn api和drv版本分别是多少

onnx1.6.0,rknn-toolkit1.6.0, 是在仿真环境中运行的。
回复

使用道具 举报

jefferyzhang

版主

积分
12844
发表于 2021-10-27 12:02:12 | 显示全部楼层
仿真环境建议你用rknn-toolkit 1.7试下结果有没有区别
回复

使用道具 举报

Redly

注册会员

积分
69
QQ
 楼主| 发表于 2021-10-27 15:57:31 | 显示全部楼层
jefferyzhang 发表于 2021-10-27 12:02
仿真环境建议你用rknn-toolkit 1.7试下结果有没有区别

rknn-toolkit1.7.0 输出结果为0.,1. ...排列,也不是有效特征值。
回复

使用道具 举报

jefferyzhang

版主

积分
12844
发表于 2021-10-27 16:01:10 | 显示全部楼层
Redly 发表于 2021-10-27 15:57
rknn-toolkit1.7.0 输出结果为0.,1. ...排列,也不是有效特征值。

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

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

如果想定位,可以dump出每一层看下从哪一层开始出问题的,请参看rknntoolkit提供的文档
回复

使用道具 举报

Redly

注册会员

积分
69
QQ
 楼主| 发表于 2021-10-27 17:12:57 | 显示全部楼层
jefferyzhang 发表于 2021-10-27 16:01
0 1 是被量化的吧,不量化的结果呢?

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

好的,感谢,我已经向redmine提交问题单了
回复

使用道具 举报

xiaqing10

高级会员

积分
572
发表于 2021-10-28 10:10:07 | 显示全部楼层
本帖最后由 xiaqing10 于 2021-10-28 10:11 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表