想训练自己的 YOLOv8 模型并部署到爱芯派吗?
前言
我们在合集系列中的【YOLOv8 目标检测:训练自定义数据集并部署到爱芯派(一)】认识并体验 2023 年最新的 YOLOv8 目标检测模型并训练了自定义的数据集,而在这一章我们将学习:如何训练自己的 YOLOv8 模型并部署到爱芯派上使用。
- 以下视频为 YOLOv8 户外检测实拍效果
https://www.bilibili.com/vide...
仓库地址:https://github.com/prophet-mu...
流程导读
我们怎么使用 YOLOv8 训练自己的数据集,并在 爱芯派硬件 上实现 目标检测?
来让流程导读告诉我们实现的过程以及步骤!
流程图
我们将通过四大块多个小块的步骤来实现我们的目标!
步骤概括
● 数据收集和预处理:首先,我们需要收集大量相关数据,并对其进行清洗和预处理,以便用于训练模型。
● 模型选择和训练:接下来,我们需要选择合适的模型并使用预处理后的数据对其进行训练。
● 模型评估:在模型训练完成后,我们需要对其进行评估,以确保其性能符合预期。
● 模型部署:最后我们将训练好的模型部署到生产环境中,以便实际应用。
环境
● 系统 ubuntu20.04
● nvidia 独立显卡 GPU(可选)
● 良好的网络(重要)
● Python:3.8.10
工具
● vscode(开发工具)
● Git
● Docker
● 预训练模型:YOLOv8s (测试模型性能和效果)
训练自己的 YOLOv8 模型
流程导读
第一步:【认识数据集】以目标检测任务为例,数据集是用来训练模型的。数据集通常包含大量带有标注信息的图像,这些标注信息指示了图像中各个目标的位置和类别。
第二步:【制作数据集】在准备数据集时,我们需要收集大量相关图像,并对其进行标注。这一步非常重要,因为模型的性能很大程度上取决于数据集的质量。
第三步:【训练模型】有了准备好的数据集后,我们就可以使用它来训练我们自己的目标检测模型了,而在训练过程中模型会学习如何根据输入图像预测其中各个目标的位置和类别。
我们已经在上一篇的【YOLOv8 目标检测:训练自定义数据集并部署到爱芯派(一)】中认识并制作了自定义数据集,而接下来则是训练 YOLOv8 模型。
训练模型
制作数据中把步骤修改完毕后开始训练模型。
第一步:先用以下命令开始训练 yolov8s
模型。
在这里可以修改
model
模型,比如说想要更大的模型如 yolov8x 或更小的模型 yolov8s,你还可以根据自己的显存大小来修改batch
的大小,如果发生了爆显存就进行缩小。
这里使用的是 2060(6G)采用的batch
为 4,其中的epoch
代表迭代次数设定是为 20 次。
yolo task=detect mode=train model=你的路径/yolov8s.pt data=你的路径/rebar.yaml batch=-1 epochs=20
第二步:数据集加载成功则开始训练模型,如果没有加载成功请检查数据集路径。
第三步:训练完成后可以在 ./runs/detect/train/
文件夹下查看训练的日志。
指标参考:
目标检测算法的评估指标:mAP定义及计算方式
目标检测模型的评价指标(Acc, Precision, Recall, AP, mAP, RoI)
模型预测
第一步:使用以下命令预测图片,但注意需要将图片和模型的路径修改为自己的路径。
yolo task=detect mode=predict model=./runs/detect/train/weights/best.pt source=../datasets/rubbish/images/IMG_20210311_213716.jpg save
第二步:可以在 runs/detect/predict
目录下看到预测的图片。
如果觉得精度不够可以尝试增加训练的 epoch 或数据集数量等,具体的优化方案在下一节。
参考资料:什么是数据增强(Data Augmentation)?如何实现?详细教程
在 爱芯派 上部署自己的 YOLOv8 模型
在开始部署模型到 爱芯派
上并使用前我们先了解为什么要部署模型?
为什么要部署模型
部署模型的意义是将训练好的模型应用到实际场景中,以便进行预测或分类等任务。这样可以更好地利用模型的价值,提高生产效率和准确性。
接下来将详细介绍如何将模型部署到爱芯派。
模型导出
- 修改模型导出文件
第一步:修改 ultralytics/nn/modules.py class Detect(nn.Module):
def forward(self, x):
shape = x[0].shape # BCHW
dfl = []
cls = []
cls_idx = []
for i in range(self.nl):
if self.export:
dfl.append(self.cv2[i](x[i]))
xi = self.cv3[i](x[i])
cls.append(xi)
cls_idx.append(torch.argmax(xi, dim=1, keepdim=True))
else:
x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1)
if self.training:
return x
elif self.dynamic or self.shape != shape:
self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5))
self.shape = shape
if self.export:
return dfl, cls, cls_idx
else:
box, cls = torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2).split((self.reg_max * 4, self.nc), 1)
dbox = dist2bbox(self.dfl(box), self.anchors.unsqueeze(0), xywh=True, dim=1) * self.strides
y = torch.cat((dbox, cls.sigmoid()), 1)
return y if self.export else (y, x)
第二步:修改 ultralytics/yolo/engine/exporter.py class Exporter:
(注释掉)
# self.output_shape = tuple(y.shape) if isinstance(y, torch.Tensor) else tuple(tuple(x.shape) for x in y)
# LOGGER.info(f"\n{colorstr('PyTorch:')} starting from {file} with input shape {tuple(im.shape)} BCHW and "
# f"output shape(s) {self.output_shape} ({file_size(file):.1f} MB)")
- 导出模型
使用以下命令导出 onnx
模型并注意加上 opset=11
这个参数,注意路径与模型名称。
yolo task=detect mode=export model=./runs/detect/train/weights/best.pt format=onnx opset=11
导出的 onnx
模型在 runs/detect/train/weights
目录下。
准备模型转换的量化数据集
模型量化是一种将神经网络的浮点算法转换为定点算法的技术,以损失推理精度为代价,将网络中连续取值或离散取值的浮点型参数(权重或张量)线性映射为定点近似(int8 / uint8)的离散值,取代原有的 float32 格式数据,同时保持输入输出为浮点型,从而达到减少模型尺寸大小、减少模型内存消耗及加快模型推理速度等目标。
模型量化为定点与浮点等数据之间建立一种数据映射关系,使得以较小的精度损失代价获得了较好的收益。
模型量化需要数据集的原因是为了用来确定对于每一层卷积输出feature map的量化因子,对于权值一般是直接取最大绝对值去做量化因子。
进入数据集的图片目录使用以下命令打包图片为 .tar
。
注意文件的扩展名是 .tar
以及记得修改路径。
cd ~/m3axpi/datasets/raber/images/
tar -cvf raber.tar *.jpg
注意:onnx
模型需转换为 joint
模型才能在爱芯派运行,我们使用 pulsar
模型转换工具,以及 pb、tflite、weights、paddle
等模型,同样需要转换为 onnx
模型才能使用 pulsar
模型转换工具。
模型转换
- 准备工作
第一步:掌握 Docker :Docker 教程
第二步:完成转换的 ONNX
模型
- 拉取 Docker
第一步:使用以下命令拉取带有模型转换工具的容器,没有安装 docker 请自行安装。
安装 docker 直接用一键命令安装简单省事:
wget http://fishros.com/install -O fishros && . fishros
第二步:拉取 Docker
docker pull sipeed/pulsar:0.6.1.20
- 进入 Docker
使用以下命令进入容器,如果需要保留该容器请删除 --rm
参数。
注意:一定要设置共享内存,将工作空间的目录挂载到容器的 data 目录。
docker run -it --net host --rm --shm-size 16g -v $PWD:/data sipeed/pulsar
docker run -it --net host --rm --gpus all --shm-size 16g -v $PWD:/data sipeed/pulsar
在 config
下创建一份命名为 rebar.prototxt
的文件,修改对应的数据集地址。
# my_config.prototxt
# 基本配置参数:输入输出
input_type: INPUT_TYPE_ONNX
output_type: OUTPUT_TYPE_JOINT
# 选择硬件平台
target_hardware: TARGET_HARDWARE_AX620
# CPU 后端选择,默认采用 AXE
cpu_backend_settings {
onnx_setting {
mode: DISABLED
}
axe_setting {
mode: ENABLED
axe_param {
optimize_slim_model: true
}
}
}
# input
src_input_tensors {
color_space: TENSOR_COLOR_SPACE_RGB
}
dst_input_tensors {
color_space: TENSOR_COLOR_SPACE_RGB
}
# neuwizard 工具的配置参数
neuwizard_conf {
operator_conf {
input_conf_items {
attributes {
input_modifications {
affine_preprocess {
slope: 1
slope_divisor: 255
bias: 0
}
}
# input_modifications {
# input_normalization {
# mean: [0,0,0]
# std: [0.5,0.5,0.5]
# }
# }
}
}
}
dataset_conf_calibration {
path: "/config/rebar.tar" # 数据集图片的 tar 包,用于编译过程中对模型校准
type: DATASET_TYPE_TAR # 数据集类型:tar 包
size: 256 # 编译过程中校准所需要的实际数据个数为 256
}
dataset_conf_error_measurement {
path: "/config/rebar.tar" # 用于编译过程中对分
type: DATASET_TYPE_TAR
size: 4 # 对分过程所需实际数据个数为 4
batch_size: 1
}
}
dst_output_tensors {
tensor_layout:NHWC
}
# pulsar compiler 的配置参数
pulsar_conf {
ax620_virtual_npu: AX620_VIRTUAL_NPU_MODE_111
batch_size: 1
debug : false
}
移动导出的模型文件 best.onnx
到 onnx
目录。
使用以下命令进行模型转换.(注意修改模型文件的名字改为自己的模型名字)
- 转换模型
pulsar build --input onnx/best.onnx --output rebar.joint --config config/rebar.prototxt --output_config rebar.prototxt
转换时间较长请耐心等待。
转换完成可以在工作目录下找到转换后的模型 rebar.joint
。
使用 Python 部署
上文更多的是阐述部署到 爱芯派
前的各项准备,而接下来介绍的则是如何使用 Python
进行部署,但部署前我们先来认识 爱芯派
并了解使用基础。
参考资料说明:浏览以下文章快速了解
爱芯派
硬件以及上手指南。M3axpi 官方介绍:wiki.sipeed.com/m3axpi
MAIX-III AXera-Pi 系列文章:开箱之硬件初体验
MAIX-III AXera-Pi 系列文章:上手之丝滑玩转 AI 板卡【一】
MAIX-III AXera-Pi 系列文章:上手之丝滑玩转 AI 板卡【二】
- 模型部署是什么?
模型部署是指将训练好的模型应用到生产环境中,以便实际使用。
这一过程通常包括以下几个步骤:
1. 导出模型:首先你需要将训练好的模型导出为一种可以在生产环境中使用的格式,常见的格式包括ONNX、TensorFlow SavedModel
和TorchScript
等。
2. 选择部署平台:接下来你需要选择一个合适的部署平台,这可以是本地服务器、云服务器或边缘设备等。
3. 配置运行环境:然后你需要在部署平台上配置运行环境,以便能够运行导出的模型,这可能包括安装相关软件和库等。
4. 集成模型:最后你需要将导出的模型集成到应用程序中,并进行测试以确保其正常工作。
第一步:修改提供的 yolov8s_rebar.json
文件,把转换好的模型和 json
拷入到爱芯派的 home
目录下,自行修改成自己的模型文件名字,以及修改检测类别与数量。
{
"MODEL_TYPE": "MT_DET_YOLOV8",
"MODEL_PATH": "/home/rebar.joint",
"CLASS_NAMES": [
"rebar"
],
"CLASS_NUM": 1,
"NMS_THRESHOLD": 0.45,
"PROB_THRESHOLD": 0.35
}
第二步:修改 predict.py
文件,把代码中的 json
改成自己的并拷入爱芯派中运行。
import time
from ax import pipeline
pipeline.load([
'libsample_vin_ivps_joint_vo_sipy.so',
'-p', '/home/yolov8s_rebar.json',#修改成你的json
'-c', '2',
])
while pipeline.work():
time.sleep(0.001)
tmp = pipeline.result()
if tmp and tmp['nObjSize']:
for i in tmp['mObjects']:
print(i)
# if tmp['nObjSize'] > 10: # try exit
# pipeline.free()
pipeline.free()
本文以 Windows10 系统为例,首先参考以下三篇文章学习连接爱芯派(推荐使用 SSH 进行登录).
如何使用爱芯派网口进行 SSH 通信(推荐)
爱芯派系统使用手册
如何在 Mobaxterm 使用 SSH
第一步:确保成功连接后,如图进行操作进入爱芯派。
第二步:使用以下指令进入爱芯派的 home
目录。
cd ..
cd home
第三步:将识别所需的 rebar.joint、rebar.json、rebar.py
放入 home
目录里,然后执行下面的指令运行目标检测代码。
python3 rebar.py
第四步:当出现以下画面表示程序运行成功。
铛铛铛:YOLOV8 目标检测成功部署并在 爱芯派
上运行。
To Be Continue
当你跟着一起学习完这篇文章的内容后,相信你一定对整个流程有了一个清晰的认识,后续文章将会详细讲解实战部分,包括如何优化模型效果提高模型的精度,如何检测更多类别更多标签,如何制作一个实际的功能与应用,下次见!
常见问题汇总
1. 模型转换错误 RuntimeError
如果发生下图错误,那就是你的 onnx
模型有错误,检查下模型导出的 python
有没有改对。
如果发生如下错误,很有可能是用于量化的数据集有错误:图片有问题。
比如放了不是 jpg
的 jpg
的乱七八糟图片进去,YOLO 的代码写的好会修正过来,但转模型的代码就没这么客气了,所以在训练模型时发现有些图片出现警告的情况是需要留意的,考虑把图片和对应的标注文件删掉。
2. 如果训练时提示 yolo not found 则按照以下步骤
第一步:先在终端输入以下指令
gedit ~/.bashrc
第二步:在文本的最后输入被红框框出来的部分并点击保存
第三步:注意这里要将 alex
改为你自己的电脑名称
export PATH=/home/alex/.local/bin/:$PATH
第四步:再输入下面的指令更新
source ~/.bashrc
3. 训练时如果出现报错: OSError: [WinError 1455] 页面文件太小,无法完成操作 Error loading
只需要修改 anaconda
所在盘符的虚拟内存,将其增大即可。
详细操作步骤参考:OSError: [WinError 1455] 页面文件太小,无法完成操作。
4. 模型预测效果不好
- 数据集问题
神经网络 loss 值很小,但是实际预测效果很差:很可能是过拟合导致的,也就是数据集太少,可以通过增加数据集的样本量解决这个问题。
- 修改训练时的 batch 和 epochs
尝试对你的深度学习模型采用不同的 batch 和 epochs 进行多次训练,如果训练完成之后效果不好,建议在已经训练好的模型的基础上继续进行多个 epochs 的训练。
下图为 epochs 为 50 时训练的效果:
下图为 epochs 为 150 时训练的效果:
下图为 epochs 为 250 时训练的效果:
可以看出随着 epochs 的增加,本模型的精度不断提升,效果也逐渐增强。
当然 epochs 也不能过大,随着 epochs 数量增加,神经网络中的权重的更新次数也在增加,过大的 epochs 会导致曲线从欠拟合变得过拟合,因此到底需要多少个 epochs,还需要结合自己的数据集进行判断。
回顾往期文章
MAIX-III AXera-Pi 系列文章(1):新一代 3.6T 视觉 AI Linux 板卡面世
MAIX-III AXera-Pi 系列文章(2):丰富多采的 AI 应用
MAIX-III AXera-Pi 系列文章(3):Debian 系统 & 开箱案例
MAIX-III AXera-Pi 系列文章:开箱之硬件初体验
MAIX-III AXera-Pi 系列文章:上手之丝滑玩转 AI 板卡【一】
MAIX-III AXera-Pi 系列文章:上手之丝滑玩转 AI 板卡【二】
YOLOv8 目标检测:训练自定义数据集并部署到爱芯派(一)
还想了解更多内容?
内容 | 链接 |
---|---|
AXera-Pi 产品介绍 | https://mp.weixin.qq.com/s/JIvVprWlQPvE7bTxozAG_Q |
AXera-Pi 产品资料 | wiki.sipeed.com/m3axpi |
海外购买渠道 | https://fr.aliexpress.com/item/1005005016931077.html |
国内购买渠道 | https://item.taobao.com/item.htm?id=682169792430 |
AI 开发工具链 | https://pulsar-docs.readthedocs.io/ |
AI 示例仓库 | https://github.com/AXERA-TECH/ax-samples |
Python API | https://github.com/junhuanchen/ax-pipeline-api |
系统 BSP SDK | https://github.com/sipeed/axpi_bsp_sdk |
基础 C++ SDK | https://github.com/sipeed/libmaix |
进阶 C++ SDK | https://github.com/AXERA-TECH/ax-pipeline |
AXERA 技术交流群 | 专供 AI ISP 技术交流:139953715 |
荔枝 MaixPy3 AI 交流群 | 产品开箱小白答疑:756313869 |
AI 训练平台 | http://maixhub.com |
在线文档 | http://wiki.sipeed.com |
交流社区 | http://bbs.sipeed.com |
开源组织 | http://github.com/sipeed |
官方推特 | https://twitter.com/SipeedIO |
商业邮箱 | support@sipeed.com |