借鉴了几篇博客,在此给出引用(不分先后顺序):
行人识别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()