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
中的model
和data
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中的CLASSES
和coco_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>