【瑞芯微平台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
上一篇: 人工智能和机器学习 3(复旦大学计算机科学与技术实践工作站)python机器学习、Pytorch库入门、d2l学习+<机器学习、神经网络————原理、理论>
下一篇: 【大模型】大模型中的稀疏与稠密——一场效率与性能的较量
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。