海思SS928(SD3403)主控平台迁移YOLOv5-YOLOv7步骤详解

海思SS928(SD3403)主控平台迁移YOLOv5-YOLOv7步骤详解 易百纳技术社区 2024-05-28 16:39:53 683

目录

1. YOLO模型资料

2. 移植过程和优化文档

2.1环境搭建指南

.pt模型转换为.onnx

.onnx转换为.om

2.2模型转换

.pt模型转换为.onnx

.onnx模型转.om

3.使用说明和示例

3.1用户手册

3.2示例代码和测试数据

4.问题排查和故障排除


1. YOLO模型资料

本文档内容以yolov5-7.0工程、yolov5s模型为例。

a. 模型结构

详细的模型结构可以利用netron工具打开.pt或.onnx模型查看。

b. 模型参数即验证结果

易百纳社区

其中,YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x为五种类型的预训练模型,其包含的检测类别相同,均包括以下80类:


'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 
'train','truck','boat', 'traffic light','fire hydrant',
'stop sign','parking meter', 'bench', 'bird', 'cat', 'dog', 
'horse', 'sheep', 'cow','elephant', 'bear', 'zebra', 'giraffe',
'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 
'baseball glove', 'skateboard', 'surfboard','tennis racket', 
'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl',
'banana', 'apple','sandwich', 'orange', 'broccoli', 'carrot', 
'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
'potted plant','bed', 'dining table', 'toilet', 'tv', 'laptop',
'mouse', 'remote', 'keyboard', 'cell phone','microwave', 'oven',
'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase',
'scissors', 'teddy bear','hair drier', 'toothbrush' 
  • Size表示模型支持输入的图像尺寸为640*640。
  • MAP(50-95)表示只有当预测结果置信度阈值为50-95时才算正确的话,模型在coco测试集上的预测精确度。
  • Speed cpu b1表示该模型在cpu上的推理速度是多少。
  • Speed V100 b1表示该模型在gpu上的推理速度是多少,其中V100为英伟达的一种显卡类型。
  • Params表示模型需要训练的参数数量,单位是million。
  • FLOPs表示模型执行推理时每秒需要进行的浮点数运算次数,次数越少说明模型约轻量,模型参数越少。

2. 移植过程和优化文档

通过章节一得到yolo原始模型,其后缀为.pt,要想将其放到SS928芯片上执行推理,必须将其转换为.om模型,.pt模型转为.om模型需要分两步:

1).pt模型转为.onnx;

2).onnx转为.om;


其中,步骤1依赖github开源的yolo工程,步骤2依赖海思提供的atc工具,即资料包中的Ascend-cann-toolkit_6.10.t01spc030b330_linux.x86_64.run。

下面将对步骤1和步骤2的实现进行详细的说明:

2.1环境搭建指南

.pt模型转换为.onnx

1.准备一个纯净的ubuntu18:04的环境;

2.安装anaconda

通过安装Anaconda来创建虚拟环境,可以在同一个系统上创建多个相互独立的 Python 运行环境。每个虚拟环境中都可以安装所需的 Python 包和库,以满足不同项目或应用程序的需求,而且不会影响到系统上其他的 Python 环境,保证了环境隔离。(与全局系统环境和其他虚拟环境都隔离开来)

(1)Anaconda镜像资源下载网址:https://mirrors.bfsu.edu.cn/anaconda/archive/

易百纳社区

(2)选择对应的版本下载,下载完成后在终端输入命令运行.sh文件即可安装:

./Anaconda3-2020.11-Linux-x86_64.sh

注意anaconda版本的选择,不要选择太高的版本,默认安装高版本python。

(3)等待安装,不断回车,输入yes

易百纳社区
(4)输入安装路径,即步骤(5)中的${install_path}

易百纳社区

(5)安装完成之后,根据提示将安装路径添加到环境变量中


sudo vi ~/.bashrc
export PATH=${install_path}/bin:$PATH


conda init

(6)输入conda可查看是否安装成功,若输出下图即为安装成功

易百纳社区

3.创建conda虚拟环境


conda info list #查看当前所有conda虚拟环境
conda create -name py375 python==3.x.x #创建特定python版本的虚拟环境
conda activate py375 #激活虚拟环境
conda deactivate #退出虚拟环境
conda remove -n py375 --all #删除虚拟环境

4.配置.pt转.onnx的环境


git clone https://github.com/ultralytics/yolov5  
conda create -name yolov5 python==3.8.1 
conda activate yolov5
cd yolov5
pip install -r requirements.txt

.onnx转换为.om

1.ATC工具依赖环境安装

这里的ATC工具即资料包中的Ascend-cann-toolkit_6.10.t01spc030b330_linux.x86_64.run,用来实现onnx到om的模型转换。

(1)安装依赖


sudo apt-get install -y gcc g++ cmake make unzip build-essential zlib1g-dev libbz2-dev libsqlite3-dev libssl-dev libxslt1-dev libffi-dev

(2)检查依赖是否安装成功


gcc --version
g++ --version
cmake --version
make --version
unzip --version
dpkg -l build-essential | grep build-essential | grep ii
dpkg -l zlib1g-dev| grep zlib1g-dev| grep ii
dpkg -l libbz2-dev| grep libbz2-dev| grep ii
dpkg -l libsqlite3-dev| grep libsqlite3-dev| grep ii
dpkg -l libssl-dev| grep libssl-dev| grep ii
dpkg -l libxslt1-dev| grep libxslt1-dev| grep ii
dpkg -l libffi-dev| grep libffi-dev| grep ii

不报错即可,可单行运行也可以通过shell脚本运行全部。

(3)ATC工具/CANN软件包安装


#增加用户对软件包的可执行权限。
chmod +x *.run
#检查软件包的一致性和完整性。
./*.run --check
#执行如下命令进行安装
./*.run --install
#若出现如下关键信息,这说明安装成功   
[INFO] xxx install success

易百纳社区

#提示执行如下命令生效环境变量,运行后仅在当前终端会话中临时生效,将指令写入到~/.bashrc中,每次启动终端都会自动运行该指令。

易百纳社区

vi ~/.bashrc
source /usr/local/Ascend/ascend-toolkit/svp_latest/x86_64-linux/script/setenv.sh

#测试atc工具是否安装成功

atc --help

显示如下则为安装成功

易百纳社区

易百纳社区

(4)ATC工具/CANN软件包卸载


#进入软件包所在路径,执行以下命令进行卸载     
./*.run --uninstall  
#卸载完成后,显示如下信息,说明卸载成功。
[INFO] xxx uninstall success

至此,模型转换的环境配置完成,但推理代码的编译运行需要配置交叉编译环境。

2.交叉编译环境配置

(1)依赖安装

配置默认使用bash


sudo dpkg-reconfigure dash #选择 no

安装依赖

sudo apt-get install make libc6-i386 lib32z1 lib32stdc++6 zlib1g-dev libncurses5-dev ncurses-term libncursesw5-dev g++ u-boot-tools texinfo texlive gawk libssl-dev openssl bc p7zip-full gperf bison flex diffutils git unzip
sudo apt-get install zlib1g-dev liblzo2-dev uuid-dev pkg-config automake
sudo apt-get install texlive

(2)交叉编译工具安装

安装交叉编译工具


tar -xvf aarch64-mix210-linux.tgz
sudo ./aarch64-mix210-linux.install
#安装完成后需要添加安装路径到环境变量中(~/.bashrc)
export PATH="/opt/linux/x86-arm/aarch64-mix210-linux/bin:$PATH"

在命令行窗口输入aarch按Tab键查看是否能补齐,若如下图所示补齐即为安装成功。

易百纳社区

3.安装python相关依赖库

原资料中要求,在conda虚拟环境中利用pip进行安装。pip是Python包管理器,它是Python的官方包管理工具。能够方便地安装、管理和卸载Python包和依赖项。使用pip可以轻松地将第三方库安装到相应的Python环境中。

(1)虚拟环境创建


#创建虚拟环境
conda create -n py375 python==3.7.5 
#激活虚拟环境
conda activate py375

(2)pip安装依赖包


#pip换源
mkdir ~/.pip 
touch ~/.pip/pip.conf
vi ~/.pip/pip.conf
#添加以下内容并保存
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

换源前安装速度

易百纳社区

换源后安装速度

易百纳社区

运行以下指令安装依赖库


#安装google.protobuf, 版本号>=3.13.0
pip install protobuf 
#安装psutil, 版本号5.7.0
pip install psutil==5.7.0 
#安装numpy, 版本号>=1.13.3
pip install numpy 
#安装scipy, 版本号1.4.1
pip install scipy==1.4.1 
#安装decorator, 版本号>=4.4.0
pip install decorator 
#安装sympy, 版本号>=1.5.1
pip install sympy 
#安装cffi, 版本号1.12.3
pip install cffi==1.12.3 
#安装pyyaml
pip install pyyaml 
#安装pathlib2
pip install pathlib2 
pip install kconfiglib wheel pycryptodome pyelftools

上述所有环境已打包成docker镜像,保存为tar包(见资料包中ybn_hasi_ss928.tar),后续进行模型转换不需要再进行相应环境配置,执行下述docker指令即可:

注意,这里要求开发环境所要求的硬件及操作系统要满足以下要求。


硬件:内存最小30GB

操作系统:Ubuntu 18.04 x86_64

需要用到sudo命令,请用户自行获取所需的sudo权限。


#加载tar包导入镜像
docker load < ${PATH}/ybn_hasi_ss928.tar
#确认有无
docker images | grep ybn
#创建容器运行进入docker环境中,已将需要用到的代码即模型打包进镜像中,需要的话可自己设置挂载路径
docker run -it -v ${本机挂载路径}:${镜像内挂载路径} --name test ybn_hasi_ss928:1.0 /bin/bash
#创建后再次进入容器
docker exec -it test /bin/bash

易百纳社区

2.2模型转换

同上面的环境配置说明一样分两个步骤来进行说明:

.pt模型转换为.onnx

由于芯片不支持五维的transpose算子,pt转onnx过程不能按照yolo提供的官方步骤,操作如下:

以下指令均在激活的docker容器中运行。


cd /root/hasi_ss928/yolov5-7.0-patch/
conda activate yolov5
#在yolov5源码路径下运行以下命令,导出原始onnx模型,若无报错则代表当前环境正常
python export.py --weights yolov5s.pt --include onnx
#导入定制rpn算子补丁,本质为修改/models/yolo.py中的代码来去掉五维transpose操作并加入filter、sort、nms后处理
git apply --reject 0001-yolov5-rpn.patch
#重新导出onnx模型
python export.py --weights yolov5s.pt --include onnx

.onnx模型转.om

利用atc工具链Ascend-cann-toolkit_6.10.t01spc030b330_linux.x86_64.run实现onnx到om的转换。


docker exec -it test /bin/bash
#推理代码目录
cd /root/hasi_ss928/yolo/model
#运行atc指令实现onnx转om
bash onnx2om.sh
#生成的om模型存放路径:/root/yolo/model/yolov5s_original.om

onnx2om.sh中atc转换参数说明:


#执行模型转换onnx->om
atc --dump_data=0 --input_shape="images:1,3,640,640" --log_level=0 --online_model_type=0 --batch_num=1 --input_format=NCHW --output="./model/yolov5s" --soc_version=SS928V100 --insert_op_conf=./insert_op.cfg --framework=5 --compile_mode=0 --save_original_model=true --model="./yolov5s.onnx" --image_list="images:./data/image_ref_list.txt"

atc参数含义

以下是指令中参数的详细解释:

atc: 命令行工具,用于将模型转换为适用于芯片处理器的模型格式。

--dump_data=0:是否导出ATC转换模型过程中的数据到文件,0为不导出。

--input_shape="images:1,3,640,640":每次推理一张图像,3通道,图像大小为640*640。input_shape需要与image_list的量化校准文件数据匹配。

--log_level=0:仅输出必要的日志信息。

--online_model_type=0:板载端执行推理时,推理模型本身不输出调试相关的内容,没有网络结构和算子信息。

--batch_num=1:推理输入图像的数目。

--input_format=NCHW: 指定模型输入的数据格式为NCHW或NHWC

N:每次推理输入图像的数目。

C:Channels,图像通道,例如彩色RGB图像的Channels为3。

H:Height,图像高度,即垂直高度方向的像素个数。

W:Width,图像宽度,即水平宽度方向的像素个数。

其中caffe/onnx框架为NCHW,Tensorflow为NHWC。

--output=./yolov5n_om: 指定转换后的模型输出路径和文件名,这里将转换后的om模型保存为当前运行路径下的"yolov5n_om"文件中。

--soc_version=SS928V100: 指定 SoC 版本,这里使用的是SS928V100。

--insert_op_conf=./insert_op_conf_yolov5n.cfg:AIPP( Artificial Intelligence Pre-Processing)人工智能预处理使能并配置参数,用于在芯片硬件上完成数据预处理,包括通道转换、色域转换(转换图像格式)等,数据预处理之后再进行真正的模型推理。

优点:无需cpu运行相关代码对图像进行预处理操作,减小cpu开销;图像数据不需要从cpu再传输到硬件,减少将数据从CPU传输到AI处理器的开销;

--framework=0: 制定原始模型的框架类型,0 表示使用的是 Caffe 框架,5表示使用onnx框架。

--compile_mode=0:默认值。

--save_original_model:output参数基础上加后缀 “*_original.om”格式结尾。

--model=./yolov5n.onnx: 指定原始模型文件路径。

--image_list:--insert_op_conf配置图像预处理,即输入为图片时,文件内容为图片文件路径,一行一个图片文件路径,一行表示一个batch。图片大小不限,ATC根据输入的height × width缩放。    

3.使用说明和示例

经过章节二得到可以在芯片上运行推理的om模型,基于该推理模型编写的芯片推理代码见docker容器中的/root/yolo目录。

3.1用户手册

1.准备输入图片


#进入docker容器
docker exec -it test /bin/bash
#切换到/data目录下执行transferPic.py脚本,将*.bmp或*.jpg转换为*.bin,同时将图片分辨率缩放为模型输入所需的640×640。
 cd /root/hasi_ss928/yolo/data
 python ../script/transferPic.py 5

2.编译推理代码


#修改src/sample_process.cpp中的配置模型、bin文件默认路径
#交叉编译代码,并在板载端运行
mkdir build & cd build 
cmake .. & make -j4
 #生成的可执行文件在./out下

3.芯片执行推理


#将二进制可执行文件上传到板载芯片中
chmod +x ${PATH}/out/main
 ./main 5 //yolov5
 #生成的结果.txt在./out中

易百纳社区

4.推理结果可视化


#将结果文件复制到开发环境(docker容器环境)中的/root/hasi_ss928/yolo/out目录下
 cd /root/hasi_ss928/yolo/out/
 #执行画框指令
 python ../script/drawbox.py -i ../data/dog_bike_car.jpg -t yolov5_detResult.txt

易百纳社区

3.2示例代码和测试数据

示例代码及测试数据均在文件夹/root/hasi_ss928/yolo中,请按照a中提供步骤测试整个推理流程。

代码链接: https://pan.baidu.com/s/1d7JzEsJA6b5TwQmQi0ow1w?pwd=scj4

提取码: scj4

4.问题排查和故障排除

问题1:

易百纳社区

解决方案:共享库路径加入环境变量中后运行source ~/.bashrc指令

问题2:

易百纳社区

解决方案:未加载接口驱动文件,加载驱动


rmmod /ko/ot.pqp.ko
insmod /ko/svp_npu/ot_svp_npu.ko

SS928相关平台

易百纳社区

海鸥派

海鸥派基于SS928解决方案,搭载四核 Cortex-A55 架构,算力支持 10.4Tops INT8,同时支持 4K@60fps H.265/H.264,能够发挥强劲的端侧计算性能。集成星闪、5G、EtherCAT、千兆以太⽹等高速数据通信连接。

易百纳社区EB-SS928-DC-393

EB-SS928-DC-393解决方案主控采用的是 SS928V100,内置内核A55,算力最高支持 10.4 Tops INT8,同时支持最高 4K@60 的 ISP 图像处理能力,支持4 路 MIPI-CSI 接口,1 路 MIPI-DSI 接口, 1 路 HDMI 2.0 输出接口,分辨率可达 4K@60fps。

点我下单:

https://www.ebaina.com/ai/58

https://www.ebaina.com/ai/48


声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 4 3 评论 打赏
评论
2个
内容存在敏感词
手气红包
  • 涛涛8856 2024-06-03 15:03:17
    回复
    你好,请问出现这个问题 [INFO] start to process file:../data/bus_yolov5.bin [Func]:svp_npu_runtime_impl_process_aicpu_task_sync [Line]:1807 [Info]:Error, get aicpu task failed [Func]:svp_npu_runtime_send_task [Line]:1204 [Info]:Error, svp_npu_runtime_impl_process_aicpu_task_sync failed [Func]:svp_npu_model_execute [Line]:737 [Info]:Error, runtime execute model failed [ERROR] execute model failed, modelId is 0 是什么原因啊 。
    • Mzz 回复 涛涛8856 2024-06-04 10:25:55
      回复
      看一下输入输出,模型路径啥的是否一致?
    • 涛涛8856 回复 Mzz 2024-06-04 11:35:07
      回复
      是一致的啊,不太明白这个报错的原因。
    • bulingda 回复 涛涛8856 2024-06-05 16:54:37
      回复
      请问你的这个问题解决了吗?
    • bulingda 回复 涛涛8856 2024-06-17 11:11:41
      回复
      可能是当前sdk中的so库和板子中的ko库版本不对应导致的。
  • qu 2024-06-03 15:03:00
    回复
    您好,这个0001-yolov5-rpn.patch文件是从哪里来的? 能共享下吗?
    • 涛涛8856 回复 qu 2024-06-03 15:05:42
      回复
      这个文件在作者提供镜像中,这个路径/root/hasi_ss928/yolov5-7.0-patch 可以找到的。
    • qu 回复 涛涛8856 2024-06-03 15:24:38
      回复
      镜像从哪里下载? 用其他板子的yolov5-7.0-patch转的onnx,报ERROR][Create][33] Op[DecBbox] not support Onnx. Only support framework[Abstract, Caffe].。
    • 涛涛8856 回复 qu 2024-06-03 15:35:24
      回复
      代码链接: https://pan.baidu.com/s/1d7JzEsJA6b5TwQmQi0ow1w?pwd=scj4 提取码: scj4 , 下载内容里 ybn_hasi_ss928.tar 为镜像文件。 load 一下就可以。
    • Mzz 回复 涛涛8856 2024-06-04 10:23:41
      回复
      你们加入后处理算子都实现了么,为什么我换个分辨率结果有点不对
    • Mzz 回复 qu 2024-06-04 10:24:52
      回复
      用作者的镜像不会转换错误,但是明明算子文档里面onnx不支持DecBbox,能转换成功有点意外,我自己的环境就不行
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
易百纳技术社区
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区