基于YOLACT的目标跟踪算法移植与测试

news/2024/11/22 18:57:33/

基于YOLACT的目标跟踪算法移植与测试

一、初始化开发环境(基于x86架构CPU的开发环境中完成)

1.1 初始化开发环境

1.下载SOPHON SDK开发包

#下载SOPHON SDK
wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/06/15/16/Release_230501-public.zipunzip Release_<Date>-public.zip
cd Release_<Date>-public
cd tpu-mlir_<Date>_xxxx/

2.配置Docker容器开发环境

#如果是首次使用Docker, 可执行下述命令进行安装和配置(仅首次执行):
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
#从 DockerHub https://hub.docker.com/r/sophgo/tpuc_dev 下载所需的镜像
docker pull sophgo/tpuc_dev:latest

确保安装包在当前目录, 然后在当前目录创建容器如下:

docker run --privileged --name myname -v $PWD:/workspace -it sophgo/tpuc_dev:latest
# myname只是举个名字的例子, 请指定成自己想要的容器的名字

后文假定用户已经处于docker里面的/workspace目录。

1.2 配置docker容器开发环境

  1. 加载tpu-mlir及配置环境变量
tar zxf tpu-mlir_xxxx.tar.gz
source tpu-mlir_xxxx/envsetup.sh
  1. 下载Yolact算法移植代码:
git clone https://github.com/sophon-ai-algo/examples.git
# Yolact示例项目代码位置 /examples/simple/yolact
  1. 通过脚本下载需要的数据和模型:
# 进入项目
cd examples/simple/yolact/
# 执行脚本下载数据和模型
./scripts/download.sh
  1. 把图片文件放入目录中,并创建工作目录:
cp -rf $TPUC_ROOT/regression/dataset/COCO2017 .
cp -rf $TPUC_ROOT/regression/image .
# 创建工作目录
mkdir workspace && cd workspace

这里的 $TPUC_ROOT 是环境变量, 对应tpu-mlir_xxxx目录。

二、模型转换(基于x86架构CPU的开发环境中完成)

2.1 pytorch模型转onnx模型

由于yolact源码包含了训练部分代码和切片操作,需要将训练部分和切片操作代码去掉,提前返回features。如之前下载的是yolact的源码,应该使用example示例中修改好的代码yolact.py替换原源码中的yolact.py进行模型的转换。

由于tpu-mlir目前只支持ONNX、TFLite和Caffe模型直接转换F32和Int8,PyTorch、PaddlePaddle和TensorFlow则需要转换为中间格式ONNX才能通过MLIR转换F32和Int8模型。

注:TPU-MLIRv23.05.01已经支持pytorch直接转为mlir。如何直接将pytorch转为mlir,可参考4. 编译TORCH模型 — TPU-MLIR 1.1 文档 (sophgo.com):

#使用示例项目代码中自带的模型转换脚本,可以将pytorch模型转为onnx模型:
python3 ../scripts/converter/convert.py --input ../data/models/yolact_base_54_800000.pth --mode onnx --cfg yolact_base#移动onnx模型到当前目录
mv ../scripts/converter/yolact_base_54_800000.onnx .

2.2 ONNX转MLIR

# 创建模型转换命令脚本并执行
vi onnx2mlir.sh
sh onnx2mlir.sh

模型转换命令如下:

# onnx2mlir.sh中的内容
model_transform.py \--model_name Yolact \--model_def ./yolact_base_54_800000.onnx \--input_shapes [[1,3,550,550]] \--mean 0.0,0.0,0.0 \--scale 0.0039216,0.0039216,0.0039216 \--keep_aspect_ratio \--pixel_format rgb \--test_input ../COCO2017/000000000632.jpg \--test_result yolact_top_outputs.npz \--mlir yolact.mlir 

model_transform.py 主要参数说明如下(完整介绍请参见TPU-MLIR开发参考手册用户界面章节):

参数名必选?说明
model_name指定模型名称
model_def指定模型定义文件, 比如.onnx.tflite.prototxt文件
input_shapes指定输入的shape, 例如[[1,3,640,640]]; 二维数组, 可以支持多输入情况
resize_dims原始图片需要resize之后的尺寸; 如果不指定, 则resize成模型的输入尺寸
keep_aspect_ratio在Resize时是否保持长宽比, 默认为false; 设置时会对不足部分补0
mean图像每个通道的均值, 默认为0.0,0.0,0.0
scale图片每个通道的比值, 默认为1.0,1.0,1.0
pixel_format图片类型, 可以是rgb、bgr、gray、rgbd四种情况
output_names指定输出的名称, 如果不指定, 则用模型的输出; 指定后用该指定名称做输出
test_input指定输入文件用于验证, 可以是图片或npy或npz; 可以不指定, 则不会正确性验证
test_result指定验证后的输出文件
excepts指定需要排除验证的网络层的名称, 多个用,隔开
mlir指定输出的mlir文件名称和路径
post_handle_type将后处理融合到模型中,指定后处理类型, 比如yolo、ssd

运行成功画面如下
在这里插入图片描述

转成mlir文件后, 会生成一个 ${model_name}_in_f32.npz 文件, 该文件是模型的输入文件。
在这里插入图片描述

2.3 MLIR转F32模型

# 创建模型转换命令脚本并执行
vi mlir2bmodel_f32.sh
sh mlir2bmodel_f32.sh

将mlir文件转换成f32的bmodel, 操作方法如下:

# mlir2bmodel_f32.sh中的内容
model_deploy.py \--mlir yolact.mlir \--quantize F32 \--chip bm1684x \--tolerance 0.99,0.99 \--test_input Yolact_in_f32.npz \--test_reference yolact_top_outputs.npz \--model Yolact_1684x_f32.bmodel

model_deploy.py 的主要参数说明如下(完整介绍请参见TPU-MLIR开发参考手册用户界面章节):

参数名必选?说明
mlir指定mlir文件
quantize指定默认量化类型, 支持F32/F16/BF16/INT8
chip指定模型将要用到的平台, 支持bm1684x/bm1684/cv183x/cv182x/cv181x/cv180x
calibration_table指定校准表路径, 当存在INT8量化的时候需要校准表
tolerance表示 MLIR 量化后的结果与 MLIR fp32推理结果相似度的误差容忍度
test_input指定输入文件用于验证, 可以是图片或npy或npz; 可以不指定, 则不会正确性验证
test_reference用于验证模型正确性的参考数据(使用npz格式)。其为各算子的计算结果
compare_all验证正确性时是否比较所有中间结果, 默认不比较中间结果
excepts指定需要排除验证的网络层的名称, 多个用,隔开
fuse_preprocess是否将预处理放入模型中做,目前只支持CV18xx系列的芯片,后面的章节会进行介绍
customization_format指定输入到模型的图像格式,与预处理有关,一般不需要指定
aligned_input是否将对输入数据做对齐,只支持CV18xx系列的芯片,后面的章节会进行介绍
model指定输出的model文件名称和路径

运行成功画面如下
在这里插入图片描述

编译完成后, 会生成名为 ${model_name}_1684x_f32.bmodel 的文件。
在这里插入图片描述

2.4 MLIR转INT8模型

2.4.1 生成校准表

转INT8模型前需要跑calibration, 得到校准表; 输入数据的数量根据情况准备100~1000张左右。

然后用校准表, 生成对称或非对称bmodel。如果对称符合需求, 一般不建议用非对称, 因为 非对称的性能会略差于对称模型。

这里用现有的100张来自COCO2017的图片举例, 执行calibration,这一步可能等待的时间较长:

vi run_cali.sh
sh run_cali.sh

run_cali.sh的内容如下:

run_calibration.py yolact.mlir \--dataset ../COCO2017 \--input_num 100 \-o yolact_cali_table

运行成功画面如下:
在这里插入图片描述

运行完成后会生成名为 ${model_name}_cali_table 的文件, 该文件用于后续编译INT8 模型的输入文件。
在这里插入图片描述

2.4.2 编译为INT8对称量化模型

# 创建模型转换命令脚本并执行
vi mlir2bmodel_int8_sym.sh
sh mlir2bmodel_int8_sym.sh

转成INT8对称量化模型的命令如下:

# mlir2bmodel_int8_sym.sh内容如下
model_deploy.py \--mlir yolact.mlir \--quantize INT8 \--calibration_table yolact_cali_table \--chip bm1684x \--test_input Yolact_in_f32.npz \--test_reference yolact_top_outputs.npz \--tolerance 0.85,0.45 \--model Yolact_1684x_int8_sym.bmodel

运行成功画面如下:
在这里插入图片描述

编译完成后, 会生成名为 ${model_name}_1684x_int8_sym.bmodel 的文件。
在这里插入图片描述

2.4.3 编译为INT8非对称量化模型

# 创建模型转换命令脚本并执行
vi mlir2bmodel_int8_asym.sh
sh mlir2bmodel_int8_asym.sh

转成INT8对称量化模型的命令如下:

# mlir2bmodel_int8_asym.sh内容如下
model_deploy.py \--mlir yolact.mlir \--quantize INT8 \--asymmetric \--calibration_table yolact_cali_table \--chip bm1684x \--test_input Yolact_in_f32.npz \--test_reference yolact_top_outputs.npz \--tolerance 0.90,0.55 \--model Yolact_1684x_int8_asym.bmodel

运行成功画面:
在这里插入图片描述

编译完成后, 会生成名为 ${model_name}_1684x_int8_asym.bmodel 的文件。
在这里插入图片描述

三、Yolact模型推理测试

3.1 准备示例程序

将Yolact_1684x_f32.bmodel、Yolact_1684x_int8_asym.bmodel、Yolact_1684x_int8_sym.bmodel三个文件移动到/data/models下

# 退回至yolact目录
mv Yolact_1684x_f32.bmodel Yolact_1684x_int8_asym.bmodel Yolact_1684x_int8_sym.bmodel ../data/models
cd ../python

3.2 部署测试

# sail解码 + bmcv预处理 + sail推理 + opencv后处理
# 下面的model参数Yolact_1684x_int8_asym.bmodel、Yolact_1684x_int8_sym.bmodel
python3 yolact_bmcv.py --cfgfile configs/yolact_base.cfg --model ../data/models/Yolact_1684x_f32.bmodel --is_video 0 --input_path ../image/
# 执行完毕后,在当前目录生成result bmcv文件夹,检测结果保存在该文件夹下。# opencv解码 + opencv预处理 + sail推理 + opencv后处理
# 下面的model参数Yolact_1684x_int8_asym.bmodel、Yolact_1684x_int8_sym.bmodel
python3 yolact_sail.py --cfgfile configs/yolact_base.cfg --model ../data/models/Yolact_1684x_f32.bmodel --is_video 0 --input_path ../image/
# 执行完毕后,在当前目录生成result_cv文件夹,检测结果保存在该文件夹下。

3.3 效果对比

3.3.1 f32模型推理结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3.2 int8对称量化模型推理结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3.3 int8非对称量化模型推理结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/512983.html

相关文章

【算法与数据结构】15、LeetCode三数之和

文章目录 一、题目二、双指针法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、双指针法 思路分析&#xff1a;我们使用双指针法&#xff0c;但这道题因为要求数组三个元素的和&#xff0c;一共用到了三个指…

华硕服务器主板型号命名规则,华硕ROG系列主板命名规则详解_华硕 Maximus V Formula_主板评测-中关村在线...

ROG玩家国度系列主板命名规则详解&#xff1a; 玩家国度系列主板的命名方式虽然不是很常规&#xff0c;并且目前市售ROG系列主板仅有8款&#xff0c;但也遵循了一定的规则。 ROG主板的命名公式为ABC&#xff0c;AB共同代表了主板的芯片组名称&#xff0c;C代表主板所属系列。 芯…

技嘉z77主板msata速度_z77-d3h_技嘉z77d3h说明书_技嘉z77 d3h msata

前言 台式机,一种一般主机、显示器等设备都是相对独立的计算机;一种一般需要放置在电脑桌或者专门的工作台上的计算机;一种我们最初结识什么是个人电脑的计算机;一种让我们挚爱有如娇妻一样的计算机! 正文 拿到Z77已经有一段时间,这两天都在整理一些测试资料,先放出Z77主…

z77用m2固态_Z77也能用M.2固态

本帖最后由 风暴幻影 于 2017-6-24 09:07 编辑 自己的古董机器还在用Z77主板,朋友淘汰了一个M.2接口的东芝固态给我,如何利用起来呢?高人给推荐了一个解决方案:kryoM.2 evo PCIe 3.0 x4 Adapter fr M.2 NGFF PCIe SSD, M-Key mit Passivkhler。 53246_4(1).jpg (91.85 KB, …

免费编辑pdf的方法,想在这里分享一下

将pdf文档打开&#xff0c;另存为word格式&#xff0c;然后在word里编辑&#xff0c;编辑完另存为pdf格式就行了哇。亲测&#xff0c;很简单实用&#xff0c;不用再充值pdf编辑器的会员了&#xff01;

免费的pdf编辑器

很明确的说哦&#xff0c;国内市面上&#xff0c;想要好的&#xff0c;就不可能免费&#xff0c;想要免费的&#xff0c;就可能没有那么好总需要做取舍不过免费版市面上的确存在&#xff0c;但只有编辑、注释、签名、加密等等功能&#xff0c;不够强大&#xff0c;但对于一般用…

有没有免费的可以编辑PDF的软件?

你还在寻找免费的可以编辑PDF的软件吗&#xff1f;反正我是没有遇到过真正的免费的可以编辑的PDF编辑器&#xff0c;不过便宜的倒是有一个&#xff0c;可以看看文章。按我的理解&#xff0c;编辑PDF应该是可以像Word一样随意添加删除原文&#xff0c;修改文本的颜色字体字号等&…

PDF怎么编辑修改内容的免费方法

虽然我们都知道PDF的出现就是因为相较office文档格式更稳定&#xff0c;但也并不是不能修改&#xff0c;一般除了扫描类的PDF都是可以直接修改文字内容的&#xff0c;而且操作方法也很简单。 对于PDF的修改必须等用到PDF编辑器&#xff0c;目前市面上的各种各样的PDF编辑工具非…