YOLOv8部署在RK3588上(亲测可行)

1.下载源码,用于训练:

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

1.1 创建数据集文件夹,文件格式如下:

datasets
  |VOCdevkit  
  |    |images
  |    |   |train
  |    |   |val
  |    |   |test
  |    |
  |    |labels
  |        |train
  |        |val
  |        |test

1.2

/ultralytics/ultralytics/cfg/datasets/目录下新建一个AUV.yaml

path: /ultralytics/datasets/VOCdevkit/
train:
  - images/train
val:
  - images/val
test:
  - images/test

# Classes
names:
  0: eif4
  1: 4_AUV
  2: circle_AUV
  3: 6_AUV
  4: 8_AUV
  5: birds

2.训练:

2.1 将模型的SiLU激活函数转换为ReLU

此部分参考博文:

https://blog.youkuaiyun.com/A_l_b_ert/article/details/141610417?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ECtr-3-141610417-blog-145823312.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ECtr-3-141610417-blog-145823312.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=6

由于SiLU激活函数会导致某些数据集模型输出的置信度为固定50%,所以改为ReLU:
ultralytics/nn/modules/conv.py中的Conv类进行修改,
default_act = nn.SiLU() # default activation
改为default_act = nn.ReLU() # default activation
修改/home/baiwei/ultralytics/ultralytics/cfg/models/v8/目录下
yolov8.yaml中的nc为自己的标签种类数

2.2 开始训练

主目录下新建train.py如下:

from ultralytics import YOLO
model = YOLO("yolov8s.pt")
results = model.train(data="AUV.yaml", epochs=200, batch=16)

或者主目录ultralytics下执行以下命令,但是如果下载了瑞芯微提供的转换RKNN模型代码ultralytics_yolov8后,需使用上述新建train.py的方式(防止环境紊乱,如不按此方法,会导致转出的onnx模型检测头更改失败)

yolo detect train data=./ultralytics/cfg/datasets/AUV.yaml model=./yolov8s.pt epochs=100 imgsz=640 batch=16 device=0


/*
data    新建的yaml文件,里面为数据集路径和标签
model   预训练模型路径
epochs  训练轮数
imgsz   输入网络图片大小,此处为640*640
batch   批处理大小
device  gpu号
*/

或者更改/ultralytics/ultralytics/cfg/目录下的defaut.yaml
这个yaml中的参数更多,有许多参数可以调
然后执行如下命令(同理如果下载了瑞芯微提供的转换RKNN模型代码ultralytics_yolov8后,需使用上述新建train.py的方式):

yolo cfg=./ultralytics/cfg/default.yaml

程序先自动下载yolov8n.pt用于检查数据集是否合规,然后自动下载yolov8s.pt作为预训练模型,在yolov8s.pt的基础上继续训练我们的数据
等待运行完毕后在/home/baiwei/ultralytics/runs/detect/train/weights/文件夹下生成best.pt为最佳模型
如果识别中断可用如下命令继续训练:

yolo task=detect mode=train model=../ultralytics_yolov8/runs/detect/train2/weights/last.pt data=./ultralytics/cfg/datasets/AUV.yaml epochs=100 save=True resume=True

识别命令:
yolo task=detect mode=predict model=/home/baiwei/ultralytics_yolov8/runs/detect/train6/weights/best.pt source=图片或视频或文件夹路径或摄像头有为0 save=true


3.下载瑞芯微修改后的源码,用于导出onnx:

瑞芯微主要修改了检测头等部分以适应rknpu

3.1 在ultralytics主目录下下载

git clone https://github.com/airockchip/ultralytics_yolov8.git

方法1

conda create -n *** python=3.8新建一个环境
然后:

cd ultralytics-main
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install -e .

运行:

yolo export model=best.pt format=rknn

方法2

将训练时的v8源码的/ultralytics/ultralytics/cfg/datasets/AUV.yaml复制到/ultralytics_yolov8/ultralytics/cfg/datasets
将训练好的best.pt放到ultralytics_yolov8主目录下
修改/ultralytics_yolov8/ultralytics/cfg/目录下defaut.yaml中的modeldata

model: /home/baiwei/ultralytics_yolov8/best.pt
data: /home/baiwei/ultralytics_yolov8/ultralytics/cfg/datasets/AUV.yaml
/*
model 训练好的best.pt路径
data  yaml文件,其中是数据集路径和标签
*/

同样修改ultralytics_yolov8/ultralytics/cfg/models/v8/yolov8.yaml中的nc为标签种类数

或者主目录下执行:

export PYTHONPATH=./
python ./ultralytics/engine/exporter.py

3.2 结果

执行完毕后会在主目录下生成best.onnx模型,此时可打开查看该onnx模型,如不太一样则转化错误
原文链接:https://github.com/airockchip/rknn_model_zoo/tree/main/examples/yolov8

270                     name: 270
                        tensor: float32[1,64,80,80]

onnx::ReduceSum_276     name: onnx::ReduceSum_276
                        tensor: float32[1,80,80,80]

282                     name: 282
                        tensor: float32[1,1,80,80]

287                     name: 287
                        tensor: float32[1,64,40,40]

onnx::ReduceSum_293     name: onnx::ReduceSum_293
                        tensor: float32[1,80,40,40]

299                     name: 299
                        tensor: float32[1,1,40,40]

304                     name: 304
                        tensor: float32[1,64,20,20]

onnx::ReduceSum_310     name: onnx::ReduceSum_310
                        tensor: float32[1,80,20,20]

316                     name: 316
                        tensor: float32[1,1,20,20]

4.按照《03_RKNN Toolkit2 环境搭建》搭建环境

4.1 VMwar17下载

我参考的博客,在此引用该博文:
https://blog.youkuaiyun.com/qq_74731410/article/details/135824895

4.2 使用Vmware虚拟机软件运行ubuntu20环境:

安装好Vmware后点击左上角 文件->扫描虚拟机载入ubuntu20,开机密码:topeet

4.3 安装Miniconda

Miniconda3-latest-Linux-x86_64.sh安装包拷贝到虚拟机ubuntu上
使用./Miniconda3-latest-Linux-x86_64.sh命令进行安装,根据提示,输入回车和yes, 等待安装完成
右键打开新的终端,发现用户名前出现(base),就代表安装成功了

4.4 创建激活环境

终端中输入conda create -n rknn210 python=3.8创建新的环境,接着输入y继续
使用conda activate rknn210激活相应的rknn环境
pip install numpy==1.16.6 -i https://pypi.tuna.tsinghua.edu.cn/simple

5 在虚拟机安装rknn-toolkit2

我是直接下载的2.3.0版本的,下载地址
1.5.2版本https://github.com/rockchip-linux/rknn-toolkit2/tree/v1.5.2
2.1.0版本https://github.com/airockchip/rknn-toolkit2.git
2.3.0版本https://github.com/airockchip/rknn-toolkit2.git

进入rknn-toolkit2-2.1.0\rknn-toolkit2-2.1.0\rknn-toolkit2\packages文件夹下
在conda环境中执行以下安装命令


conda create -n rknn python=3.8
conda activate rknn
unzip rknn-toolkit2-1.5.2.zip 
pip install -r requirements_cp38-2.1.0.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install ./packages/rknn_toolkit2-1.5.2+b642f30c-cp38-cp38-linux_x86_64.whl

conda create -n rknn210 python=3.8
conda activate rknn210
unzip rknn-toolkit2-2.1.0.zip  
pip install -r ./doc/requirements_cp38-1.5.2.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install rknn_toolkit2-2.1.0+708089d1-cp38-cp38-linux_x86_64.whl


conda create -n rknn230 python=3.10
conda activate rknn230
cd x86_64
unzip rknn-toolkit2-2.3.0.zip 
pip install -r requirements_cp310-2.3.0.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install rknn_toolkit2-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

5.1 验证是否安装成功

在终端输入以下内容不报错代表成功

python
from rknn.api import RKNN

6 转换为rknn模型

进入rknn_model_zoo-2.3.0\examples\yolov8\python文件夹,先打开yolov8.py,进行适配参数修改:

CLASSES:目标种类标签
coco_id_list:种类序号
parser_add_argument('--target', type=str, default='rk3588', help='target RKNPU platform')

在虚拟机的rknn230环境下rknn_model_zoo/examples/yolov8/python/目录下修改convert.py

DATASET_PATH = '../../../datasets/COCO/coco_subset_20.txt'
DEFAULT_RKNN_PATH = './best.rknn'

/*
DATASET_PATH:数据集路径文件
DEFAULT_RKNN_PATH:生成的rknn模型路径
*/

执行以下代码将onnx转换为rknn模型,生成的模型在model文件夹下:

python convert.py best.onnx rk3588
或者
python convert.py best.onnx rk3588 i8 best.rknn
/*
i8为int8
u8为uint8
fp为fp32
*/

7 验证onnx模型

在虚拟机rknn_moodel_zoo/examples/yolov8/python/中执行以下代码测试onnx是否正确
修改yolov8.py中的CLASSEScoco_id_list
修改/rknn_model_zoo/examples/yolov8/model/coco_80_labels_list.txt为自己的标签种类
修改同目录下的dataset.txt为自己数据集中的一张照片

python yolov8.py --model_path best.onnx --img_save

8 验证rknn模型

在3588上修改/rknn_model_zoo_main/examples/yolov8/model/coco_80_labels_list.txt为自己的标签种类
修改同目录下的dataset.txt为自己数据集中的一张照片
将转换好的rknn模型放在/rknn_model_zoo_main/examples/yolov8/model/
/userdata/baiwei/rknn_model_zoo_main/目录下执行以下代码

./build-linux.sh -t rk3588 -a aarch64 -d yolov8

会在install/rk3588_linux_aarch64/rknn_yolov8_demo/下生成验证rknn模型程序:rknn_yolov8_demo
执行该程序验证rknn模型

./rknn_yolov8_demo <model_path> <image_path>
【资源介绍】 基于RK3588部署yolov5s模型源码(实时摄像头检)+部署说明文档.zip 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 yolov5模型(.pt)RK3588(S)上的部署(实时摄像头检) - 所需: - 安装了Ubuntu20系统的RK3588 - 安装了Ubuntu18的电脑或者虚拟机 <details> <summary>一、yolov5 PT模型获取</summary> [Anaconda教程](https://blog.youkuaiyun.com/qq_25033587/article/details/89377259)\ [YOLOv5教程](https://zhuanlan.zhihu.com/p/501798155)\ 经过上面两个教程之后,你应该获取了自己的`best.pt`文件 </details> <details> <summary>二、PT模型转onnx模型</summary> - 将`models/yolo.py`文件中的`class`类下的`forward`函数由: ```python 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.dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]: self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i) if isinstance(self, Segment): # (boxes + masks) xy, wh, conf, mask = x[i].split((2, 2, self.nc + 1, self.no - self.nc - 5), 4) xy = (xy.sigmoid() * 2 + self.grid[i]) * self.stride[i] # xy wh = (wh.sigmoid() * 2) ** 2 * self.anchor_grid[i] # wh y = torch.cat((xy, wh, conf.sigmoid(), mask), 4) else: # Detect (boxes only) xy, wh, conf = x[i].sigmoid().split((2, 2, self.nc + 1), 4) xy = (xy * 2 + self.grid[i]) * self.stride[i] # xy wh = (wh * 2) ** 2 * self.anchor_grid[i] # wh y = torch.cat((xy, wh, conf), 4) z.append(y.view(bs, self.na * nx * ny, self.no)) return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x) ``` 改为: ```python def forward(self, x): z = [] # inference
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值