【瑞芯微平台rv1109平台部署yolov5目标检测】

落叶霜霜 2024-08-29 11:01:02 阅读 86

1.yolov5环境安装

1.conda安装

1.1 Anaconda 安装包:在浏览器中打开 https://www.anaconda.com/products/individual 下载适合你的操作系统的 Anaconda 安装包(Python 版本根据需要选择)。建议选择 Python 3.x 版本,因为 Python 2.x 已经不再被支持。

1.2 安装完成后,配置一下系统环境变量,在PATH中新建(路径根据自己安装的路径配置),如下图:

在这里插入图片描述

1.3 重启电脑。

1.4 终端里面输入conda --version,如果可以显示出版本号,证明安装成功。

2. yolov5环境安装

2.1 创建虚拟环境

win+R输入cmd,打开终端,最好是在比如D盘新建个yolo的文件夹,切到这个文件夹中进行后续操作。(python根据自己的版本更换)

<code>conda create -n yolo python=3.10

激活当创建的环境:

conda activate yolo

报错:

激活失败提示:IMPORTANT: You may need to close and restart your shell

after running ‘conda init’。

解决:

我用的是命令提示符,也就是cmd.exe。(如果使用bash、powershell就自己替换)

以管理员身份运行cmd.exe

conda init cmd.exe

再次激活

在这里插入图片描述

2.2 安装pytorch

需要在上一个激活的环境下运行:

<code>conda install pytorch torchvision cudatoolkit=11.3 -c pytorch

2.3 下载yolov5的源码(截至我目前下载是yolov5 7.0版本)

git clone https://github.com/ultralytics/yolov5 # clone

cd yolov5

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r

requirements.txt

3.运行测试

yolov5的git地址:https://github.com/ultralytics/yolov5

在这里插入图片描述

点击右下角

在这里插入图片描述

运行:

在这里插入图片描述

python segment/predict.py --weights yolov5m-seg.pt --data

data/images/bus.jpg

在这里插入图片描述

就可以在runs\predict-seg\exp看到目标识别的图片。

备注:如果要下载预训练权重文件,把刚上面打开的网页拉到最下面

在这里插入图片描述

2.yolov5环境安装

1.labelimg安装以及使用

一、官网下载压缩包

https://github.com/tzutalin/labelImg

框好后,会生成对应的txt文件。

在这里插入图片描述

解压后

在这里插入图片描述

二、安装命令

cd 到labelImg-master文件夹下

<code>conda install pyqt=5

pyrcc5 -o libs/resources.py resources.qrc

conda install lxml

好了,打开

python labelImg.py

在这里插入图片描述

三、标注

1、创建文件夹data\img

img里面存放需要标注的图片,和img并列创建labels

2、如果修改成自动保存模式就不需要自己一步步保存,它会一边标注一边自己保存,数据多的话比较方便

在这里插入图片描述

3、修改标签保存格式

在这里插入图片描述

4、打开目录,创建区块进行标注

在这里插入图片描述

5、ok啦!classes里面是我们标签类别

在这里插入图片描述

需要注意一下,在生成的classes.txt中,一开始是有默认的一些类目(下面有说明怎么删除这些默认类别,建议删除)

在这里插入图片描述

这边的类目和其他图片的txt中比如15 0.104412 0.099678 0.114706 0.154341最前面的标号,就是对应的类目。因为只有file和dir是我自己标注的,其他都是默认的。如果把其他删除,在训练的时候会报错。

报错:

<code>assert mlc < nc, f'Label class {mlc} exceeds nc={nc} in {data}. Possible class labels are 0-{nc - 1}'

AssertionError: Label class 15 exceeds nc=1 in D:\software\yolo\yolov5\data\mask_data.yaml. Possible class labels are 0-0

问题解决:

https://www.jb51.cc/faq/2848565.html

其实就是把自己标注的:

15 0.450777 0.244275 0.088083 0.351145

修改成

0 0.450777 0.244275 0.088083 0.351145

修改最前面的ID,根据自己的类多少。

其实就是要标注对应ID对应就行了。标注起始是0。上面这个报错是因为我把其他不是我设置的类别全删掉导致的。如果不删除就不会出现这个问题。如果删掉就要手动改一下全部非classes.txt,比较麻烦。

这边说明怎么通过修改label中预设的classes.txt。

在label目录下面的data/predefined_classes.txt。

删除默认的类别,添加自己的类目就好了。建议采取这种做法。后续我这个笔记中的模型训练是用的这部分标注出来的数据训练的。

2.模型训练

在yolov5的目录下创建如下文件

在这里插入图片描述

修改一下配置文件,我们需要在data目录下创建一个mask_data.yaml的文件:

在这里插入图片描述

这个就根据自己的yolov5的路径,类目个数以及类别名称修改一下就行了,就是个配置文件。

在models下建立一个mask_yolov5s.yaml的模型配置文件,内容如下(就是把yolov5s.yaml文件复制一下,然后修改一下):

<code>nc: 2 # number of classes

只要修改一下这个就行了。改成自己类目的个数。

开始模型训练:

python train.py --data mask_data.yaml --cfg mask_yolov5s.yaml --weights pretrained/yolov5s.pt --epoch 100 --batch-size 4 --device cpu

3. rv1109平台部署yolov5环境,官方onnx模型转换rknn模型验证

1.环境安装

备注:后续经过验证,发现1109板卡rknn模型转换需要使能预编译,而pc环境不支持预编译。

所以需要在ubuntu上安装toolkit将onxx转换成rknn。这步可以跳过直接参考第二步骤的第五小条。

SDK中的rknn toolkit版本比较旧,如果需要最新的,https://github.com/rockchip-linux/rknn-toolkit下载。

各种版本环境安装可能有一点不一样,具体查看Rockchip_Quick_Start_RKNN_Toolkit_V1.7.3_CN.pdf手册。

在Conda下新建一个虚拟环境进行安装。需要安装python的版本是3.6

在虚拟环境下使用以下命令新建一个RKNN环境:

conda create --name=rknn python=3.6.8

执行以下命令进入虚拟环境:

conda activate rknn

进入虚拟环境后,再执行以下命令安装深度学习框架,如Tensorflow,Pytorch,Keras等。

pip install tensorflow==1.14.0

pip install torch==1.6.0+cpu torchvision==0.7.0+cpu -f https://download.pytorch.org/whl/torch_stable.html --user

pip install mxnet==1.5.0

pip install opencv-python

pip install gluoncv

在安装opencv-python的时候报错:

ERROR: Could not build wheels for opencv-python which use PEP 517 and

cannot be installed directly

需要注意:opencv和python是有版本匹配,pip install opencv-python默认是安装最新版本,有可能会与我们python版本不对应导致安装失败。

解决:

pip install --upgrade pip setuptools wheel

pip install opencv-python

发现还是报错:

Please check the install target is valid and see CMake’s output for

more information.(版本匹配问题)

pip install -i https://pypi.douban.com/simple/ pip install opencv-python==4.3.0.38

这个版本是与python3.6相匹配的。

在SDK目录rv1126_rv1109\external\rknn-toolkit\packages\required-packages-for-win-python36下有lmdb-0.95-cp36-cp36m-win_amd64.whl

pip install lmdb-0.95-cp36-cp36m-win_amd64.whl

在SDK目录rv1126_rv1109\external\rknn-toolkit\packages下有rknn_toolkit-1.6.0-cp36-cp36m-win_amd64.whl(备注:我从github下载最新的rknn toolkit的时候,对应的whl并没有一起下过来,https://github.com/rockchip-linux/rknn-toolkit/releases需要自己再下载一下对应的安装包)该步骤的安装包要和跟文档的一致,不然后面rknn还是安装不成功的。rknn-toolkit-lite目录下也有一个package,里面也有类似的whl,注意这是不同的。不要安装错了。

pip install rknn_toolkit-1.6.0-cp36-cp36m-win_amd64.whl

报错提示有些版本不兼容,但是还是安装成功了(暂时先不管了):

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.

mxnet 1.5.0 requires requests<2.19.0,>=2.18.4, but you have requests 2.22.0 which is incompatible.

matplotlib 3.3.4 requires pillow>=6.2.0, but you have pillow 5.3.0 which is incompatible.

然后验证是否安装成功:

python

from rknn.api import RKNN

没有报错就是安装成功。

2.官方demo验证

1.官方demo onnx->rknn

这边先用官方的准备的onnx模型转换成rknn模型,然后在rv1109平台上运行。

通过https://github.com/rockchip-linux/rknn-toolkit下载最新的demo,因为我需要用的是yolov5,而SDK里面是yolov3。

rknn-toolkit-master\rknn-toolkit-master\examples\onnx\yolov5目录下修改test.py

默认的平台是rk1808,修改target_platform为rv1109和rv1126,如果只是写rv1109应该也可以。

复制代码

rknn.config(reorder_channel='0 1 2',code>

mean_values=[[0, 0, 0]],

std_values=[[255, 255, 255]],

optimization_level=3,

target_platform =['rv1109', 'rv1126'],

output_optimize=1,

quantize_input_node=QUANTIZE_ON)

复制代码

修改rknn.init_runtime函数,设置平台为rv1109,device_id可以不填,那个是PC模拟挂载多个板卡才需要指定。

ret = rknn.init_runtime(‘rv1109’)

激活当创建虚拟环境:

conda activate rknn

切换到对应的目录下,然后执行:

python test.py

在这里插入图片描述

可以看到RKNN model已经导出。但是后续的运行失败了,是因为我在pc上运行,但是我设置的平台是rv1109,平台不匹配导致。不用管它。

rknn在rv1109板卡运行

在SDK下rv1126_rv1109\external\rknpu\rknn\rknn_api\examples\rknn_yolov5_demo有对应的demo

在这个demo中已经有转换好的rknn,可以根据readme配置一下build.sh中的编译器路径就行了。

修改build.sh

<code>GCC_COMPILER=略rv1126_rv1109/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf

根据自己交叉编译器路径配置一下。

./build.sh

执行成功,在当前目录生成一个install目录。

把目录通过adb放到板卡的/userdata下,并修改执行权限chmod 777 -R 文件夹

./rknn_yolov5_demo model/rv1109_rv1126/yolov5s_relu_rv1109_rv1126_out_opt.rknn model/test1.bmp

在这里插入图片描述

执行成功会在当前目录生成一个out.bmp。

在这里插入图片描述

以上是执行官网自带的rknn

替换rknn运行

把刚转换生成的yolov5s.rknn以及bus.bmp(该图片在第一步demo中有,不过是jpg的,要转成bmp格式)放到板卡的目录下,执行

<code>./rknn_yolov5_demo yolov5s.rknn bus.bmp

运行后报错:

This RKNN model is not a pre-compiled model, but the npu driver is mini driver.

Mini driver only support rknn models with pre-compiled mode.

Create RKNN model fail, error=-14

rknn_init error ret=-14

该错误是板子上的库是Mini driver, 所以只能加载预编译的模型,在转换模型的时候,打开预编译开关precompile。

打开刚才的test.py,增加一个pre_compile=True

ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET)

修改成:

ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET, pre_compile=True)

备注:Mini driver 库大小比 full driver 小很多,以 RV1109/RV1126 1.6.0 驱动为例,full driver 大小为 87MB,mini driver 大小为 7.1MB,可以有效的节省 flash 大小。Full driver 支持 RKNN Toolkit 的联机调试功能,mini driver 不支持。

又报错:

E The pre_compile is not supproted on Windows or MacOS platform. Please use export_rknn_precompile_model() to convert rknn to precompile mode.

Build yolov5 failed!

在这里插入图片描述

不支持windows系统。

使用export_rknn_precompile_model模型预编译

由于我这边第四步行不通,可能是硬件这边不支持,所以我在ubuntu下又安装了rknn toolkit,来代替第一步,使能预编译,转换官方的rknn模型。这步可以跳过不用看,这边只是做了记录,以防万一。

首先使能NTB通信:

/etc/init.d/.usb_config,在这个文件中增加一行:usb_ntb_en,然后重启开发板。

然后在虚拟环境中执行

python -m rknn.bin.list_devices

正常情况会显示对应的设备,但是我的没有显示。可能是硬件没有连接好。这个方法暂时不考虑。

如果这步骤可以正常显示设备

将第一步转换出的rknn模型(不是预编译模型)放在rknn-toolkit-master\examples\common_function_demos\export_rknn_precompile_model目录下

修改export_rknn_precompile_model.py为对应的平台

ret = rknn.init_runtime(target=‘rv1109’, rknn2precompile=True)

再执行该脚本,应该就可以了。

5.Ubuntu安装rknn toolkit

1.Ubuntu安装rknn toolkit

Ubuntu版本是18.04,最好是这个版本,其他版本安静环境的时候会出现版本不匹配问题

下载安装anaconda

<code>wget https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2022.05-Linux-x86_64.sh

bash Anaconda3-2022.05-Linux-x86_64.sh

安装过程中,看到>>>就按回车,看到more就按空格,yes|no就输入yes。等待安装完成。

创建虚拟环境:

conda create -n rknn python=3.6.8

激活

conda activate rknn

可能会出现需要conda init bash的情况,然后重启一下就可以激活了。

安装python依赖

pip install tensorflow==1.14.0

pip install torch==1.6.0+cpu torchvision==0.7.0+cpu -f https://download.pytorch.org/whl/torch_stable.html --user

pip install mxnet==1.5.0

pip install -i https://pypi.douban.com/simple/ pip install opencv-python==4.3.0.38

pip install gluoncv

下载rknn toolkit package

git地址:https://github.com/rockchip-linux/rknn-toolkit/releases

在这里插入图片描述

安装对应的轮子rknn_toolkit-1.7.3-cp36-cp36m-linux_x86_64.whl

<code>pip install rknn_toolkit-1.7.3-cp36-cp36m-linux_x86_64.whl

验证是否安装成功:

在这里插入图片描述

没有报错就算成功

然后在Ubuntu下将onxx转换成rknn

修改rknn-toolkit-master/examples/onnx/yolov5下的test.py,打开预编译

<code>ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET)

修改成:

ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET, pre_compile=True)

然后执行

python test.py

就可以看到rknn模型导出成功。

参考上面第三步替换一下rknn模型,就执行成功了。

在这里插入图片描述

4.rv1109平台部署自己训练的yolov5数据模型

1.在yolov5上将pt 转 onnx(window)

备注(目前这个章节使用的是yolov5 7.0版本)

<code>(后续经过验证,rv1109直接跑v7.0版本的yolov5最后在报段错误,跑V5.0就不会,可以直接参考第三点)

首先将之前训练好的best.pt放到yolov5目录下

python export.py --weights best.pt --img 640 --batch 1 --include onnx

在这里插入图片描述

可以看到生成了best.onnx

使用rknn toolkit将onnx转rknn(linux)

在rknn-toolkit工程文件夹中浏览至./examples/onnx/yolov5,将我们在2.2中转换得到的best.onnx复制到该文件夹下,修改该文件夹下的test.py中的内容为自己模型的名字,要修改的地方如下:

在这里插入图片描述

运行:

<code>python test.py

提示报错:

在这里插入图片描述

问题解决:

在通过yolov5 export出onnx的时候,修改export.py 把opset_version的值修改为12。

把转换出来的rknn放到rk1109平台运行:

报错:

在这里插入图片描述

开始段错误了。好烦,不过我用的是yolov5 7.0版本。查询一下资料,好像rknn toolkit目前这1.7版本对应的是对应是yolov5 5.0。没办法,搞个5.0版本的。

rv1109 部署yolov5 5.0版本 pt -> onnx -> rknn

3.1 下载yolov5 5.0版本

yolov5不同版本训练得到的pt模型会决定rknn模型转换的成功与否。我之前使用yolov5 (v7.0)训练出来的pt转换rknn后,在板卡运行就一直报段错误,但是用yolov5(V5.0)就可以正常运行。

yolov5的节点id为:c5360f6e7009eb4d05f14d1cc9dae0963e949213

yolov5 git地址:https://github.com/ultralytics/yolov5

在右上角搜索这个commit id并进入“In this repository”,如图所示:

在这里插入图片描述

进入commits,点击右边的commit id,再次进入后点击Browse files,如下三图所示:

<code> commit id:

在这里插入图片描述

Browse files:

在这里插入图片描述

对应版本的源码:

在这里插入图片描述

以上,yolov5的源码下载完成。

3.2 下载yolov5 5.0的模型

由于yolov5 (v5.0)源码中未包含预训练模型,因此需要自己下载

下载地址:https://github.com/ultralytics/yolov5/releases

找到V5.0,然后点击 v5.0 release

在这里插入图片描述

在这里插入图片描述

3.3 模型训练生成best.pt(这边请参考 yolov5训练自己的数据集)

<code>python train.py --data mask_data.yaml --cfg mask_yolov5s.yaml --weights pretrained/yolov5s.pt --epoch 1 --batch-size 4 --device cpu

其中epoch是训练的次数,我这边先设置为1,跑通一下流程,后续再加大一下训练次数。

报错:

yolov5 RuntimeError: result type Float can't be cast to the desired output type __int64

问题解决:

修改utils/loss.py文件中的两处内容:

for i in range(self.nl):

anchors = self.anchors[i]

修改为:

for i in range(self.nl):

anchors, shape = self.anchors[i], p[i].shape

indices.append((b, a, gj.clamp_(0, gain[3] - 1), gi.clamp_(0, gain[2] - 1))) # image, anchor, grid

修改为:

indices.append((b, a, gj.clamp_(0, shape[2] - 1), gi.clamp_(0, shape[3] - 1))) # image, anchor, grid

然后再训练就提示成功

在这里插入图片描述

3.4 把best.pt转成best.onnx

注意:在训练时不要修改yolo.py的这段代码,训练完成后使用export.py进行模型导出转换时一定要进行修改,不然会导致后面的rknn模型转换失败!

并且如果export.py后,再次用train.py训练模型,要修改回来。不然训练模型会报错。

models/yolo.py文件的后处理部分,将class Detect(nn.Module) 类的子函数forward由

<code>def forward(self, x):

z = [] # inference output

for i in range(self.nl):

x[i] = self.m[i](x[i]) # conv

bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85)

x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()

if not self.training: # inference

if self.grid[i].shape[2:4] != x[i].shape[2:4] or self.onnx_dynamic:

self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)

y = x[i].sigmoid()

if self.inplace:

y[..., 0:2] = (y[..., 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i] # xy

y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # wh

else: # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953

xy = (y[..., 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i] # xy

wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # wh

y = torch.cat((xy, wh, y[..., 4:]), -1)

z.append(y.view(bs, -1, self.no))

return x if self.training else (torch.cat(z, 1), x)

修改为:

def forward(self, x):

z = [] # inference output

for i in range(self.nl):

x[i] = self.m[i](x[i]) # conv

return x

复制代码

把生成的best.pt放到yolov5目录下,执行:

python export.py --weights best.pt --img 640 --batch 1 --include onnx

报错:

--> Config model

done

--> Loading model

W Call onnx.optimizer.optimize fail, skip optimize

W Please confirm that your onnx opset_version <= 11 (current opset_verison = 13)!!!

E Calc node Resize : /model.11/Resize output shape fail

E Catch exception when loading onnx model: best.onnx!

E Traceback (most recent call last):

E File "rknn/base/RKNNlib/onnx_ir/onnx_numpy_backend/shape_inference.py", line 65, in rknn.base.RKNNlib.onnx_ir.onnx_numpy_backend.shape_inference.infer_shape

E File "rknn/base/RKNNlib/onnx_ir/onnx_numpy_backend/ops/resize.py", line 232, in rknn.base.RKNNlib.onnx_ir.onnx_numpy_backend.ops.resize.Resize

E AttributeError: 'str' object has no attribute 'size'

E During handling of the above exception, another exception occurred:

E Traceback (most recent call last):

E File "rknn/base/RKNNlib/app/importer/import_onnx.py", line 118, in rknn.base.RKNNlib.app.importer.import_onnx.Importonnx.run

E File "rknn/base/RKNNlib/converter/convert_onnx.py", line 115, in rknn.base.RKNNlib.converter.convert_onnx.convert_onnx.__init__

E File "rknn/base/RKNNlib/converter/convert_onnx.py", line 1161, in rknn.base.RKNNlib.converter.convert_onnx.convert_onnx._shape_inference

E File "rknn/base/RKNNlib/onnx_ir/onnx_numpy_backend/shape_inference.py", line 70, in rknn.base.RKNNlib.onnx_ir.onnx_numpy_backend.shape_inference.infer_shape

E File "rknn/api/rknn_log.py", line 323, in rknn.api.rknn_log.RKNNLog.e

E ValueError: Calc node Resize : /model.11/Resize output shape fail

E Please feedback the detailed log file <log_feedback_to_the_rknn_toolkit_dev_team.log> to the RKNN Toolkit development team.

E You can also check github issues: https://github.com/rockchip-linux/rknn-toolkit/issues

问题解决:

修改export.py,把opset_version的值改为12:再重复一下执行export.py,就可以了。

3.5 best.onnx转成best.rknn和上面一样

3.6 在rv1109设备上部署

在rv1109的SDK中rv1126_rv1109\external\rknpu\rknn\rknn_api\examples\rknn_yolov5_demo

修改include文件中的头文件postprocess.h

#define OBJ_CLASS_NUM 2 #这里的数字修改为数据集的类的个数

修改model目录下的coco_80_labels_list.txt文件, 改为自己的类并保存

修改build.sh

GCC_COMPILER=自己设备的交叉编译器的路径/bin/arm-linux-gnueabihf

执行

./build.sh

执行成功会在当前目录生成install。

将install生成的文件用adb PUSH放到设备中,然后将best.rknn以及需要检测图片放在一个目录中,执行

./rknn_yolov5_demo best.rknn test.bmp



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。