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

news2024/11/15 13:50:15

基于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.zip

unzip 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.coloradmin.cn/o/673379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据就业路线

✨博文作者&#xff1a;烟雨孤舟 &#x1f496; 喜欢的可以 点赞 收藏 关注哦~~ ✍️ 作者简介: 一个热爱大数据的学习者 ✍️ 笔记简介&#xff1a;作为大数据爱好者&#xff0c;以下是个人总结的学习笔记&#xff0c;如有错误&#xff0c;请多多指教&#xff01; 数仓&#x…

English Learning - L3 作业打卡 Lesson7 Day46 2023.6.19 周一

English Learning - L3 作业打卡 Lesson7 Day46 2023.6.19 周一 引言&#x1f349;句1: If your life were a book and you were the author, how would you want your story to go?成分划分弱读连读语调 &#x1f349;句2: That’s the question that changed my life foreve…

ps beta爱国版下载全过程

​前言&#xff1a; 前段时间也是写了一篇ps beta版本下载的全过程呀&#xff0c;当时那篇文章还没有将软件变成永久免费试用&#xff0c;所以ps beta只能进行7天的免费使用&#xff0c;很多朋友可能意犹未尽呀&#xff0c;所以现在继续&#xff0c;将软件变成永久免费使用​。…

步长(stride) | 填充(padding) | 扩长(dilation)

这几个名词中文真的好难翻译&#xff0c;不是大佬就不要造名词了&#xff0c;后面还是老老实实用英文吧&#xff01;&#xff08;标题是机翻的 。&#xff09; stride stride 很好理解&#xff0c;stride 就是卷积核移动的步长。 如下图&#xff1a; stride1 stride2 paddi…

【嘉立创EDA】复合焊盘的引线居中对齐,typc接口引线对齐方法

文章路标👉 文章解决问题主题内容小结文章解决问题 1️⃣ 嘉立创EDA中对齐工具越发完善,但一些特殊的器件引线中,由于对齐属性设置等原因,部分引线无法与焊盘完全居中对齐,影响了线路的表象美观度与里内信号铺面。本文主要讲述如何应用嘉立创EDA的其他技巧将器件引线与…

基於Hadoop HA 在kerberos中配置datax

概要 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 概要 前言一、基於HADOOP HA 搭建datax二、基於HADOOP HA 配置好的datax去配置kerberos1.在datax的配置文件中進行配置2.在shell腳本中加入認證語句 总结 前言…

detrex | 面向detr系列的目标检测开源框架

DETR作为Transformer应用于目标检测领域的开山之作&#xff0c;后续有大量的算法都是在其基础上改进而来&#xff0c;如Deformable-DETR&#xff0c;DAB-DETR&#xff0c;DN-DETR&#xff0c;DINO等。这些模型尽管都是采用DETR的基本架构&#xff0c;但其改进创新却各有千秋&am…

人工智能时代,你知道ai绘画如何使用吗?

在数字时代的今天&#xff0c;人工智能正逐渐渗透到我们生活的方方面面&#xff0c;艺术创作也不例外。ai绘画软件作为一种创新的工具&#xff0c;为艺术爱好者、设计师和创作者提供了崭新的创作方式。但是&#xff0c;对于初次接触这类软件的人来说&#xff0c;可能会感到一些…

EMC学习笔记(四)地的设计

地的设计 1.接地的含义2.接地目的3.基本的接地方式3.1 单点接地3.2 多点接地3.3 浮地3.4 以上各种方式组成的混合接地方式 4.关于接地方式的一般选取原则4.1 单板接地方式 接地是抑制电磁干扰、提高电子设备EMC性能的重要手段之一。正确的接地既能提高产品抑制电磁干扰的能力&a…

静音或取消静音?苹果AirPods17Beta版推出全新功能

近期&#xff0c;苹果的AirPods系列耳机推出了一些新功能&#xff0c;iOS 17 Beta版用户已可解锁尝试。 其中&#xff0c;第一项功能是静音或取消静音&#xff0c;适用于AirPods Pro&#xff08;第一代和第二代&#xff09;、AirPods&#xff08;第三代&#xff09;和AirPods …

【C++11】右值引用和移动语义 万能引用和完美转发

文章目录 1 右值引用和移动语义1.1 左值引用和右值引用1.2 右值引用的使用场景1.3 新的类功能 2 万能引用与完美转发2.1 万能引用的基本介绍和使用2.2 完美转发2.3 完美转发的实际应用场景 3 可变参数模板3.1基本语法3.2递归函数方式展开参数包3.3逗号表达式展开参数包3.4 可变…

javaee sql注入问题

jsp页面 <% page language"java" contentType"text/html; charsetutf-8"pageEncoding"utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> &…

第三章 GoogLeNet网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

基于Java软件科技公司信息管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

STM32启动模式

M3/M4/M7内核复位后&#xff0c;做的第一件事&#xff1a; 从地址0x00000000处取出堆栈指针MSP的初始值&#xff0c;该值就是栈顶地址。从地址0x00000004处取出程序计数器指针PC的初始值&#xff0c;该值是复位向量。 芯片厂商可能会把0x00000000和0x00000004地址映射到其它的…

ADC(模数转换)详解

ADC&#xff08;模数转换&#xff09;详解 前言ADC的定义ADC简介ADC特性ADC时钟工作模式单通道单次转换练习多通道扫描模式单次转换 前言 在STM32微控制器中&#xff0c;ADC代表模数转换器&#xff08;Analog-to-Digital Converter&#xff09;。ADC是一种用于将模拟信号转换为…

【Linux】程序地址空间?进程地址空间

目录 程序地址空间回顾进程地址空间什么是进程地址空间&#xff1f;进程地址空间与PCB、物理内存、页表和磁盘之间的关系为什么要存在虚拟地址空间&#xff1f;重新理解地址空间 程序地址空间回顾 了解进程的运行&#xff1a; 1 #include <stdio.h>2 #include <unist…

Web安全——HTML基础

HTML 一、对于前端以及后端的认识以及分析二、HTML认知1、网页的组成2、浏览器3、Web标准 三、简单的HTML页面架构四、HTML常见标签1、meta标签2、标题标签3、文本属性4、form表单5、a 标签6、锚文本7、img 标签8、table 表格9、列表标签9.1、无序列表9.2、有序列表 10、框架的…

个人工作总结和计划怎么写

工作总结和计划怎么写1 20__年就快结束&#xff0c;回首年的工作&#xff0c;有硕果累累的喜悦&#xff0c;有与同事协同攻关的艰辛&#xff0c;也有遇到困难和挫折时惆怅&#xff0c;时光过得飞快&#xff0c;不知不觉中&#xff0c;充满希望的_年就伴随着新年伊始即将临近。可…

C++ 重载函数

文章目录 前言一、什么是重载函数&#xff1f;二、重载函数的类型&#xff0c;作用。1. 构造函数重载&#xff1a;2. 运算符重载&#xff1a;3. 函数重载&#xff1a;4. 成员函数重载&#xff1a; 总结 前言 一、什么是重载函数&#xff1f; 在C中&#xff0c;函数重载&#x…