矽速科技 · 2023年04月11日 · 广东

YOLOv8 目标检测:训练自定义数据集并部署到爱芯派(二)

想训练自己的 YOLOv8 模型并部署到爱芯派吗?

前言

我们在合集系列中的【YOLOv8 目标检测:训练自定义数据集并部署到爱芯派(一)】认识并体验 2023 年最新的 YOLOv8 目标检测模型并训练了自定义的数据集,而在这一章我们将学习:如何训练自己的 YOLOv8 模型并部署到爱芯派上使用。

  • 以下视频为 YOLOv8 户外检测实拍效果

https://www.bilibili.com/vide...

仓库地址:https://github.com/prophet-mu...

流程导读

我们怎么使用 YOLOv8 训练自己的数据集,并在 爱芯派硬件 上实现 目标检测?
来让流程导读告诉我们实现的过程以及步骤!

流程图

我们将通过四大块多个小块的步骤来实现我们的目标!

1680848814960.jpg

步骤概括

数据收集和预处理:首先,我们需要收集大量相关数据,并对其进行清洗和预处理,以便用于训练模型。
模型选择和训练:接下来,我们需要选择合适的模型并使用预处理后的数据对其进行训练。
模型评估:在模型训练完成后,我们需要对其进行评估,以确保其性能符合预期。
模型部署:最后我们将训练好的模型部署到生产环境中,以便实际应用。

环境

● 系统 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 次。

参考资料:深度学习中 Epoch、Batch 以及 Batch size 的设定

yolo task=detect mode=train model=你的路径/yolov8s.pt data=你的路径/rebar.yaml batch=-1 epochs=20

1681114954905.jpg

第二步:数据集加载成功则开始训练模型,如果没有加载成功请检查数据集路径。

1681114990486.jpg
1681115071437.jpg

第三步:训练完成后可以在 ./runs/detect/train/ 文件夹下查看训练的日志。

1681115100430.jpg

指标参考:
目标检测算法的评估指标: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

1681115285333.jpg

第二步:可以在 runs/detect/predict 目录下看到预测的图片。

1681204482194.jpg

如果觉得精度不够可以尝试增加训练的 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)    

1681198706108.jpg

第二步:修改 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)")

1681198803495.jpg

  • 导出模型

使用以下命令导出 onnx 模型并注意加上 opset=11 这个参数,注意路径与模型名称。

yolo task=detect mode=export model=./runs/detect/train/weights/best.pt format=onnx opset=11

1681198990108.jpg

导出的 onnx 模型在 runs/detect/train/weights 目录下。

准备模型转换的量化数据集

模型量化是一种将神经网络的浮点算法转换为定点算法的技术,以损失推理精度为代价,将网络中连续取值或离散取值的浮点型参数(权重或张量)线性映射为定点近似(int8 / uint8)的离散值,取代原有的 float32 格式数据,同时保持输入输出为浮点型,从而达到减少模型尺寸大小、减少模型内存消耗及加快模型推理速度等目标。
模型量化为定点与浮点等数据之间建立一种数据映射关系,使得以较小的精度损失代价获得了较好的收益。
模型量化需要数据集的原因是为了用来确定对于每一层卷积输出feature map的量化因子,对于权值一般是直接取最大绝对值去做量化因子。

进入数据集的图片目录使用以下命令打包图片为 .tar

注意文件的扩展名是 .tar 以及记得修改路径

cd  ~/m3axpi/datasets/raber/images/ 
tar -cvf raber.tar *.jpg

1681199119194.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

1681199489517.jpg

  • 进入 Docker

使用以下命令进入容器,如果需要保留该容器请删除 --rm 参数。
注意:一定要设置共享内存,将工作空间的目录挂载到容器的 data 目录。

docker run -it --net host --rm --shm-size 16g -v $PWD:/data sipeed/pulsar

1681199588699.jpg

docker run -it --net host --rm --gpus all --shm-size 16g -v $PWD:/data sipeed/pulsar

1681199634146.jpg

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.onnxonnx 目录。
使用以下命令进行模型转换.(注意修改模型文件的名字改为自己的模型名字

  • 转换模型
pulsar build --input onnx/best.onnx --output rebar.joint --config config/rebar.prototxt --output_config rebar.prototxt

转换时间较长请耐心等待。

1681199762640.jpg

转换完成可以在工作目录下找到转换后的模型 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 SavedModelTorchScript 等。
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

第一步:确保成功连接后,如图进行操作进入爱芯派。

1681204631459.jpg

第二步:使用以下指令进入爱芯派的 home 目录。

cd ..
cd home

第三步:将识别所需的 rebar.joint、rebar.json、rebar.py 放入 home 目录里,然后执行下面的指令运行目标检测代码。

python3 rebar.py

1681201786428.jpg

第四步:当出现以下画面表示程序运行成功。

1681201827570.jpg

铛铛铛:YOLOV8 目标检测成功部署并在 爱芯派 上运行。

1681201943435.jpg

To Be Continue

当你跟着一起学习完这篇文章的内容后,相信你一定对整个流程有了一个清晰的认识,后续文章将会详细讲解实战部分,包括如何优化模型效果提高模型的精度,如何检测更多类别更多标签,如何制作一个实际的功能与应用,下次见!

常见问题汇总

1. 模型转换错误 RuntimeError

如果发生下图错误,那就是你的 onnx 模型有错误,检查下模型导出的 python 有没有改对。

1681202128126.jpg

如果发生如下错误,很有可能是用于量化的数据集有错误:图片有问题。

比如放了不是 jpgjpg 的乱七八糟图片进去,YOLO 的代码写的好会修正过来,但转模型的代码就没这么客气了,所以在训练模型时发现有些图片出现警告的情况是需要留意的,考虑把图片和对应的标注文件删掉。

1681202170065.jpg

2. 如果训练时提示 yolo not found 则按照以下步骤

第一步:先在终端输入以下指令

gedit ~/.bashrc 

第二步:在文本的最后输入被红框框出来的部分并点击保存

1681202277337.jpg

第三步:注意这里要将 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 时训练的效果:

1681202664407.jpg

下图为 epochs 为 150 时训练的效果:

1681202725361.jpg

下图为 epochs 为 250 时训练的效果:

1681202757805.jpg

可以看出随着 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 APIhttps://github.com/junhuanchen/ax-pipeline-api
系统 BSP SDKhttps://github.com/sipeed/axpi_bsp_sdk
基础 C++ SDKhttps://github.com/sipeed/libmaix
进阶 C++ SDKhttps://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
推荐阅读
关注数
7443
内容数
92
人工智能边缘计算软硬件解决方案,提供高性能、低成本、低功耗、易使用的硬件选型方案.
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息