fastreid训练、测试、模型转换(pth转onnx、onnx转rknn)

借鉴了几篇博客,在此给出引用(不分先后顺序):

行人识别fastreid项目官方数据训练测试
FastReID使用教程、踩坑记录
[深度学习] fast-reid入门教程

1. 下载fastreid源码

git clone https://github.com.com/JDAI-CV/fast-reid

conda create -n fastreid python=3.8
cd fast-reid
python3 -m pip install -r docs/requirements.txt

为了加快索引速度,进入/fast-reid/fastreid/evaluation/rank_cylib/目录,
修改Makefile文件的
python3 setup.py build_ext --inplace
python3.8 setup.py build_ext --inplace
执行make all编译文件以加速查询

2. 数据集和预训练模型

fast-reid目录下提供了不同的数据集信息
常用的为Market-1501
包含六个不同摄像机拍摄的1501个行人,其中751人用来训练,750人用来测试
数据集自行下载,目录格式为:

Market-1501
    |--bounding_box_test(750人的19732张图像用于测试)
    |
    |--bounding_box_train(751人的12936张图像用于训练)
    |
    |--gt_bbox(25259张图像手动标注,其余为DPM算法自动生成)
    |
    |--gt_query()
    |
    |--query(750人的3368张图像用于查询)
    |
    |--readme.txt

数据集命名规则:
以 0001_c1s1_000151_01.jpg 为例
0001 表示每个人的标签编号,从0001到1501
c1 表示第一个摄像头有,共有六个摄像头
s1 表示第一个录像片段,每个摄像机都有数个录像段
000151表示c1s1的第000151帧图片,视频帧率为25
01 表示c1s1_000151这一帧上的第1个检测框,由于采用DPM检测器,对于每一帧上的行人可能会出现好几个bbox。00表示手工标注框

2.1 训练

一般使用bounding_box_test和bounding_box_train和query来进行训练和测试
在fast-reid目录下的MODEL_ZOO.md里有预训练模型的下载路径,需下载,我使用的是BoTh(R50)对应的model,下载完成后放到fast-reid/model/
修改fast-reid/config/Market1501目录下的bagtricks_R50.yml

_BASE_: ../Base-bagtricks.yml # 与这个文件拼接在一起使用

DATASETS:
  NAMES: ("Market1501",) # 数据集路径
  TESTS: ("Market1501",) # 数据集路径

OUTPUT_DIR: logs/market1501/bagtricks_R50_bai # 输出结果路径

MODEL:
  WEIGHTS: model/market_bot_R50.pth #预训练模型路径

2.2 训练命令:

python ./tools/train_net.py  --config-file ./configs/Market1501/bagtricks_R50.yml MODEL.WEIGHTS ./model/market_bot_R50.pth

训练结束后会在logs/market1501/bagtricks_R50_bai目录下生成模型和配置文件

2.3 测试生成pth:

python tools/train_net.py --config-file ./logs/market1501/bagtricks_R50_bai/config.yaml --eval-only MODEL.WEIGHTS logs/market1501/bagtricks_R50_bai/model_best.pth MODEL.DEVICE "cuda:0"

model_best.pth为训练过程中最好的权重文件
model_final.pth为训练结束时的权重文件

3. pth转onnx模型

3.1 转换命令

python tools/deploy/onnx_export.py --config-file logs/market1501/bagtricks_R50_bai/config.yaml --name baseline_R50_best --output outputs/onnx_model/ --opts MODEL.WEIGHTS logs/market1501/bagtricks_R50_bai/model_best.pth

3.2 测试onnx:

python tools/deploy/onnx_inference_new.py --model-path outputs/onnx_model/baseline_R50_best.onnx --input datasets/Market-1501-v15.09.15/query/0001_c1s1_001051_00.jpg --output onnx_output/

4. 结果可视化

4.1 修改代码

修改demo/visualize_result.py

    ...
    ...
    parser.add_argument(
        "--num-vis",
        type=int,
        default=100,
        help="number of query images to be visualized",
    )
    ...
    ...
    parser.add_argument(
        "--max-rank",
        type=int,
        default=10,
        help="maximum number of rank list to be visualized",
    )

4.2 命令

执行

python demo/visualize_result.py  --config-file logs/market1501/bagtricks_R50_bai/config.yaml --parallel --dataset-name Market1501 --output demo/vis_rank_list --vis-label --num-vis 100 --rank-sort descending --label-sort descending --max-rank 10 --opts MODEL.WEIGHTS logs/market1501/bagtricks_R50_bai/model_best.pth

在demo/vis_rank_list中有重识别结果
第一例是按照相似度进行rank排列的结果,包含了正确的和错误的,下面一列表示预测正确的结果

5. 得到特征向量

python demo/demo.py --config-file logs/market1501/bagtricks_R50_bai/config.yaml --parallel --input ./datasets/Market-1501-v15.09.15/query/*.jpg --output ./demo_output_bai --opts MODEL.WEIGHTS logs/market1501/bagtricks_R50_bai/model_best.pth

在demo_output_bai文件中生成每张图像对应的特征向量

6. 查看单个特征项链数据代码

import numpy as np

test = np.load("/fast-reid/demo_output_bai/0001_c1s1_001051_00.npy")
print(test)

7. 测试生成的onnx和pth差距

代码:

import numpy as np

# a和b为两个不同模型(pth和onnx)跑出来的两个值
a=np.load("fast-reid/demo_output_bai/0001_c1s1_001051_00.npy")
b=np.load("fast-reid/onnx_output/0001_c1s1_001051_00.npy")

# 检查两个张量是否在某个容忍度范围内近似相等,返回值为True认为在容忍度范围内相似,否则返回False
# rtol:相对容忍度  atol:绝对容忍度
print(np.testing.assert_allclose(a,b,rtol=1e-3,atol=1e-6))

我的打印为:

Traceback (most recent call last):
  File "test_allclose.py", line 9, in <module>
    print(np.testing.assert_allclose(a,b,rtol=1e-3,atol=1e-6))
  File "/home/zhaochenhui/anaconda3/envs/fastreid/lib/python3.7/site-packages/numpy/testing/_private/utils.py", line 1531, in assert_allclose
    verbose=verbose, header=header, equal_nan=equal_nan)
  File "/home/zhaochenhui/anaconda3/envs/fastreid/lib/python3.7/site-packages/numpy/testing/_private/utils.py", line 844, in assert_array_compare
    raise AssertionError(msg)
AssertionError:
Not equal to tolerance rtol=0.001, atol=1e-06

Mismatched elements: 338 / 2048 (16.5%)
Max absolute difference: 2.5317073e-05
Max relative difference: 0.402423
 x: array([[ 0.001825, -0.003885, -0.013718, ...,  0.016855,  0.016276,
         0.004705]], dtype=float32)
 y: array([[ 0.001833, -0.003885, -0.01372 , ...,  0.016872,  0.016285,
         0.004708]], dtype=float32)

显然有错误,但是不知道问题出在了哪里,欢迎留言指正
如果不进行rknn模型转换,到这里就结束了

8. onnx转rknn模型

8.1 虚拟机环境创建

8.1.1 按照《03_RKNN Toolkit2 环境搭建》搭建环境

(1)VMwar17下载
我参考的博客,在此引用该博文:
https://blog.csdn.net/qq_74731410/article/details/135824895

(2)使用Vmware虚拟机软件运行ubuntu20环境:
安装好Vmware后点击左上角 文件->扫描虚拟机载入ubuntu20,开机密码:topeet

(3)安装Miniconda
Miniconda3-latest-Linux-x86_64.sh安装包拷贝到虚拟机ubuntu上
使用./Miniconda3-latest-Linux-x86_64.sh命令进行安装,根据提示,输入回车和yes, 等待安装完成
右键打开新的终端,发现用户名前出现(base),就代表安装成功了
终端中输入conda create -n rknn python=3.8创建新的环境,接着输入y继续
使用conda activate rknn激活相应的rknn环境
pip install numpy==1.16.6 -i https://pypi.tuna.tsinghua.edu.cn/simple

8.1.2 在虚拟机安装rknn-toolkit2

我是直接下载的1.5.2版本的,下载地址
https://github.com/rockchip-linux/rknn-toolkit2/tree/v1.5.2
给出最新版本克隆地址
git clone https://github.com/rockchip-linux/rknn-toolkit2.git
在conda环境中执行以下安装命令

unzip rknn-toolkit2-1.5.2.zip  
pip install -r ./doc/requirements_cp38-1.5.2.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install ./packages/rknn_toolkit2-1.5.2+b642f30c-cp38-cp38-linux_x86_64.whl

验证是否安装成功
在终端输入以下内容不报错代表成功

python
from rknn.api import RKNN

进入

8.2 代码

在创建的rknn环境下执行以下代码:

from rknn.api import RKNN

if __name__ == '__main__':
    rknn = RKNN(verbose=True, verbose_file="log.txt")

    # 调用config接口配置要生成的RKNN模型
    rknn.config(
        mean_values=[[123.675, 116.28, 103.53]],  # mean_values表示预处理要减去的均值化参数
        std_values=[[58.395, 58.395, 58.395]],  # std_values 表示预处理要除的标准化参数
        quantized_dtype="asymmetric_quantized-8",  # quantized_dtype表示量化类型
        quantized_algorithm='normal',  # quantized_algorithm表示量化的算法
        quantized_method='channel',  # quantized_method 表示量化的方式
        quant_img_RGB2BGR=False,  #
        target_platform="rk3588", # target_platform表示RKNN模型的运行平台
        float_dtype="float16",  # float_dtype表示RKNNM哦性中的默认浮点数类型
        optimization_level=3, # optimization_level表示模型优化等级
        custom_string="this is my rknn model ",  # custom_string表示添加的自定义字符串信息
        remove_weight=False,  # remove_weight表示生成一个去除权重信息的从模型
        compress_weight=False, # compress_weight表示压缩模型权重,可以减小模型体积
        inputs_yuv_fmt=None, # 表示RKNN模型输入数据的YUV格式
        single_core_mode=False,  #表示构建的RKNN模型运行在单核心模式,只适用于RK3588
    )
    # 添加load_xxx接口进行常用深度学习模型的导入
    rknn.load_pytorch(
        model="./model_best.ptht",  # model表示加载模型的地址
        input_size_list=[[1, 3, 224, 224]],  # input_size_list表示模型输入节点对应图片的尺寸和通道数
    )

    # 使用build接口来构建RKNN模型
    rknn.build(
        do_quantization=True,  # do_quantization 表示是否对RKNN模型进行量化操作,
        dataset="dataset.txt",  # dataset 表示要量化的图片,txt里面写图片路径
        rknn_batch_size=1  #
    )

    # 调用export_rknn接口导出RKNN模型
    rknn.export_rknn(
        export_path="model_best.rknn" # export_path表示导出的RKNN模型路径
    )
    rknn.release()

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值