0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

V853端侧部署YOLOV5训练自定义模型全流程教程

百问科技 来源:百问科技 2023-06-30 16:07 次阅读

这里以百问网开发板为检测目标,下面展示端侧检测效果

68639c56-1712-11ee-962d-dac502259ad0.png

68d29dd6-1712-11ee-962d-dac502259ad0.png

69164b76-1712-11ee-962d-dac502259ad0.png

下面操作仅演示如何去训练自定义模型、导出模型、转换模型、模型部署。注意:训练模型对于电脑需要有一定的要求,如果电脑性能较弱可能会导致训练效果较差,从而导致模型精度较低。

参考链接:

https://docs.ultralytics.com/yolov5/tutorials/train_custom_data/

1.下载数据标注工具

数据标注工具:https://github.com/heartexlabs/labelImg/releases

69696888-1712-11ee-962d-dac502259ad0.png

点击上述红框下载,下载完成后解压压缩包,双击打开labelImg.exe文件。

6991c01c-1712-11ee-962d-dac502259ad0.png

打开后等待运行,运行完成后会进入如下标注工作界面。

69a31cd6-1712-11ee-962d-dac502259ad0.png

关于LabelImg更多的使用方法,请访问:https://github.com/heartexlabs/labelImg

由于LabelImg会预先提供一些类供您使用,需要手动删除这些类,使得您可以标注自己的数据集。步骤如下所示:

69b9bdb0-1712-11ee-962d-dac502259ad0.gif

进入LabelImg程序目录中的data目录中,打开predefined_classes.txt文件,删除文件中所有预定义的类后保存并退出即可。

2.创建数据集目录

在任意工作目录中创建images文件夹和labels文件夹分别存放图像数据集和标注信息。这里我演示仅使用少量图像样本进行标注,在实际项目中需要采集足够的图像进行标注才拿满足模型的准确率和精度。

例如我在100ask-yolov5-image目录中创建有images文件夹和labels文件夹,如下所示,创建images文件,存放图像数据集,创建labels文件夹,该文件夹用于后续存放标注数据。

6a45eed4-1712-11ee-962d-dac502259ad0.gif

3.标注图像

打开LabelImg软件后,使用软件打开数据集图像文件夹,如下所示:

6a9fe65a-1712-11ee-962d-dac502259ad0.gif

打开后,修改输出label的文件夹为我们创建的数据集目录下的labels文件夹

6ae1c6c4-1712-11ee-962d-dac502259ad0.gif

下面我演示标注过程,以百问网的开发板为例,标注三块开发板


标注过程见原文链接

当你点击Save后即表示标注完成,标注完成后后会在labels目录下生成classes.txt(类别)和图像中标注的类别即位置信息。

下面为LabelImg快捷键目录

Ctrl + u Load all of the images from a directory
Ctrl + r Change the default annotation target dir
Ctrl + s Save
Ctrl + d Copy the current label and rect box
Ctrl + Shift + d Delete the current image
Space Flag the current image as verified
w Create a rect box
d Next image
a Previous image
del Delete the selected rect box
Ctrl++ Zoom in

经过标注大量的图像后,labels文件夹如下图所示

6b36f342-1712-11ee-962d-dac502259ad0.gif

4.划分训练集和验证集

在模型训练中,需要有训练集和验证集。可以简单理解为网络使用训练集去训练,训练出来的网络使用验证集验证。在总数据集中训练集通常应占80%,验证集应占20%。所以将我们标注的数据集按比例进行分配。

在yolov5-6.0项目目录下创建100ask文件夹(该文件夹名可自定义),在100ask文件夹中创建train文件夹(存放训练集)和创建val文件夹(存放验证集)

6bbd3baa-1712-11ee-962d-dac502259ad0.gif

在train文件夹中创建images文件夹和labels文件夹。其中images文件夹存放总数据集的80%的图像文件,labels文件夹存放与images中的文件对应的标注文件。

6bdbfca2-1712-11ee-962d-dac502259ad0.gif

在val文件夹中创建images文件夹和labels文件夹。其中images文件夹存放总数据集的20%的图像文件,labels文件夹存放与images中的文件对应的标注文件。

6bbd3baa-1712-11ee-962d-dac502259ad0.gif

5.创建数据集配置文件

进入yolov5-6.0data目录下,创建data.yaml,文件内容如下所示:

train: 100ask	rainimages  # train images 
val: 100askvalimages  # val images

nc: 3  # number of classes
names: ['T113', 'K510', 'V853']  # class names

6cb46358-1712-11ee-962d-dac502259ad0.gif

6.创建模型配置文件

进入models目录下,拷贝yolov5s.yaml文件,粘贴并models目录下重命名为100ask_my-model.yaml,例如:

6cdfa6e4-1712-11ee-962d-dac502259ad0.gif

修改100ask_my-model.yaml中类的数目为自己训练模型的类数目。

6.修改训练函数

打开yolov5-6.0项目文件夹中的train.py,修改数据配置文件路径,如下图红框所示:

parser.add_argument('--cfg', type=str, default='models/100ask_my-model.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default=ROOT / 'data/data.yaml', help='dataset.yaml path')

7.训练模型

在conda终端的激活yolov5环境,激活后进入yolov5-6.0项目文件夹。执行python train.py,如下图所示:

6d0d9536-1712-11ee-962d-dac502259ad0.png

程序默认迭代300次,等待训练完成...

6d4145fc-1712-11ee-962d-dac502259ad0.png

训练完成后结果会保存在runs rain目录下最新一次的训练结果,如上图所示,此次训练的最好模型和最后训练的模型保存在以下目录中

runs	rainexp7weights

8.验证模型

修改val.py函数,修改如下

   parser.add_argument('--data', type=str, default=ROOT / 'data/data.yaml', help='dataset.yaml path')
   parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'runs/train/exp7/weights/best.pt', help='model.pt path(s)')

6d5e4fda-1712-11ee-962d-dac502259ad0.png

修改models文件夹下的yolo.py

class Model(nn.Module):
   def __init__(self, cfg='100ask_my-model.yaml', ch=3, nc=None, anchors=None):  # model, input channels, number of classes

6db76bc4-1712-11ee-962d-dac502259ad0.png

打开conda终端输入python val.py

6dd4d470-1712-11ee-962d-dac502259ad0.png

执行完成后的结果保存在runsvalexp文件下。

6df3fa30-1712-11ee-962d-dac502259ad0.gif

9.预测图像

在data目录中新建100ask-images文件夹存放待检测的图像和视频文件。

修改detect.py函数中,模型的路径与检测图像路径。

parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'runs/train/exp7/weights/best.pt', help='model path(s)')
parser.add_argument('--source', type=str, default=ROOT / 'data/100ask-images', help='file/dir/URL/glob, 0 for webcam')

6f9c3014-1712-11ee-962d-dac502259ad0.png

检测效果如下图所示:

6fbf3e56-1712-11ee-962d-dac502259ad0.jpg

10.导出ONNX模型

修改export.py函数

parser.add_argument('--data', type=str, default=ROOT / 'data/data.yaml', help='dataset.yaml path')
parser.add_argument('--weights', type=str, default=ROOT / 'runs/train/exp7/weights/best.pt', help='weights path')

6fe7c75e-1712-11ee-962d-dac502259ad0.png

在conda终端输入:

python export.py --include onnx --dynamic

7009ef82-1712-11ee-962d-dac502259ad0.png

导出的模型会与输入的模型位于同一路径下,假设我输入的模型位于:runs rainexp7weights

70423dc4-1712-11ee-962d-dac502259ad0.png

11.简化模型

简化模型前需要用到onnxruntime依赖包,输入以下命令安装:

pip install onnxruntime==1.13.1 -i https://pypi.doubanio.com/simple/

简化命令如下:

python -m onnxsim <输入模型> <输出模型> --input-shape <输入图像尺寸>

例如:

输入模型路径为runs/train/exp7/weights/best.onnx,输出模型路径为runs/train/exp7/weights/best-sim.onnx

输入图像尺寸固定为640x640。

python -m onnxsim runs/train/exp7/weights/best.onnx runs/train/exp7/weights/best-sim.onnx --input-shape 1,3,640,640

706219be-1712-11ee-962d-dac502259ad0.png

13.查看模型

访问:https://netron.app/

7096218c-1712-11ee-962d-dac502259ad0.png

可以看到输入已经固定为640x640,可看到模型有 4 个输出节点,其中 ouput 节点为后处理解析后的节点;在实际测试的过程中,发现 NPU 量化操作后对后处理的运算非常不友好,输出数据偏差较大,所以我们可以将后处理部分放在 CPU 运行;因此在导入模型时保留 350498646 三个后处理解析前的输出节点即可。

14.验证模型

模型需要修改为简化后的模型路径。

新建文件夹存放固定的输入图像尺寸。假设上述中我设置输入图像尺寸为640x640,那么此时我在data目录下新建100ask-images-640文件夹存放640x640的图像作为待测数据。

修改detect.py函数

   parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'runs/train/exp7/weights/best-sim.onnx', help='model path(s)')
   parser.add_argument('--source', type=str, default=ROOT / 'data/100ask-images-640', help='file/dir/URL/glob, 0 for webcam')

70c439e6-1712-11ee-962d-dac502259ad0.png

在conda终端输入:

python detect.py

70efce44-1712-11ee-962d-dac502259ad0.png

通过输出信息可知:检测结果存储在runsdetectexp6

检测结果如下:

711b4aba-1712-11ee-962d-dac502259ad0.png

15.转换模型

15.1 创建工作目录

将简化后的best-sim.onnx模型传入配置到NPU模型转换工具的虚拟机中,创建模型工具目录,包含模型文件,量化文件夹data(存放量化图片),dataset.txt文件(存放量化图片的路径)。

buntu@ubuntu2004:~/100ask-yolov5-test$ tree
.
├── best-sim.onnx
├── data
│ └── test01.jpg
└── dataset.txt

1 directory, 5 files

工作目录如下所示:

716a45b6-1712-11ee-962d-dac502259ad0.gif

15.2 导入模型

导入模型前需要知道我们要保留的输出节点,由之前查看到我们输出的三个后处理节点为:350498646

pegasus import onnx --model best-sim.onnx --output-data best-sim.data --output-model best-sim.json --outputs "350 498 646"

导入生成两个文件,分别是是 yolov5s-sim.datayolov5s-sim.json 文件,两个文件是 YOLO V5 网络对应的芯原内部格式表示文件,data 文件储存权重,cfg 文件储存模型。

7197d17a-1712-11ee-962d-dac502259ad0.gif

15.3 生成 YML 文件

YML 文件对网络的输入和输出的超参数进行描述以及配置,这些参数包括,输入输出 tensor 的形状,归一化系数 (均值,零点),图像格式,tensor 的输出格式,后处理方式等等

pegasus generate inputmeta --model best-sim.json --input-meta-output best-sim_inputmeta.yml

72d80d48-1712-11ee-962d-dac502259ad0.gif

pegasus generate postprocess-file --model best-sim.json --postprocess-file-output best-sim_postprocess_file.yml

73064c3a-1712-11ee-962d-dac502259ad0.gif

修改 best-sim_inputmeta.yml 文件中的的 scale 参数为 0.0039216(1/255),目的是对输入 tensor 进行归一化,和网络进行训练的时候是对应的。

vi best-sim_inputmeta.yml

修改过程如下图所示:

733edeec-1712-11ee-962d-dac502259ad0.gif

15.4 量化

生成量化表文件,使用非对称量化,uint8,修改 --batch-size 参数为你的 dataset.txt 里提供的图片数量。如果原始网络使用固定的batch_size,请使用固定的batch_size,如果原始网络使用可变batch_size,请将此参数设置为1。

pegasus quantize --model best-sim.json --model-data best-sim.data --batch-size 1 --device CPU --with-input-meta best-sim_inputmeta.yml --rebuild --model-quantize best-sim.quantize --quantizer asymmetric_affine --qtype uint8

73af32d2-1712-11ee-962d-dac502259ad0.gif

15.5 预推理

利用前文的量化表执行预推理,得到推理 tensor

pegasus inference --model best-sim.json --model-data best-sim.data --batch-size 1 --dtype quantized --model-quantize best-sim.quantize --device CPU --with-input-meta best-sim_inputmeta.yml --postprocess-file best-sim_postprocess_file.yml

74108e42-1712-11ee-962d-dac502259ad0.gif

15.6 导出模板代码与模型

输出的模型可以在 ovxilb/100ask-best-sim_nbg_unify 文件夹中找到network_binary.nb模型文件。

pegasus export ovxlib --model best-sim.json --model-data best-sim.data --dtype quantized --model-quantize best-sim.quantize --batch-size 1 --save-fused-graph --target-ide-project 'linux64' --with-input-meta best-sim_inputmeta.yml --output-path ovxilb/100ask-best-sim/100ask-simprj --pack-nbg-unify --postprocess-file best-sim_postprocessmeta.yml --optimize "VIP9000PICO_PID0XEE" --viv-sdk ${VIV_SDK}

752adcba-1712-11ee-962d-dac502259ad0.gif

可以进入下图所示目录中将network_binary.nb模型文件拷贝出来备用。

76474a5c-1712-11ee-962d-dac502259ad0.gif

16.端侧部署

这里引用上一篇《100ASK-V853-PRO开发板支持yolov5模型部署》我们编写的yolov5端侧部署程序,这里进入端侧部署程序文件夹中拷贝一份新程序进行修改。主要修改vnn_post_process.cpp程序。

16.1 修改draw_objects函数

修改draw_objects函数中的类名,这里我训练的模型的类别分别是T113、K510、V853

76b6058c-1712-11ee-962d-dac502259ad0.png

类别名称需要yolov5-6.0项目data目录下data.yaml对应

76d7774e-1712-11ee-962d-dac502259ad0.png

16.2 修改generate_proposals函数

修改generate_proposals函数中的类类别数量为您类别数量。假设我训练的类别总共有T113、K510、V853,这3个类别,修改为3即可。

76efd8c0-1712-11ee-962d-dac502259ad0.png

修改后的文件如下所示:

771b7a7a-1712-11ee-962d-dac502259ad0.gif

16.3 编译

 book@100ask:~/workspaces/tina-v853-open$ source build/envsetup.sh
 ...
 book@100ask:~/workspaces/tina-v853-open$ lunch
 ...1
 ...

进入menuconfig,输入

make menuconfig

进入如下目录中,选中yolov5-100ask配置,

> 100ask 
    > NPU
        <*> yolov5-100ask......................................... yolov5-100ask demo

778acf56-1712-11ee-962d-dac502259ad0.png

编译并生成镜像

 book@100ask:~/workspaces/tina-v853-open$ make
 ...
 book@100ask:~/workspaces/tina-v853-open$ pack

编译完成后使用全志烧写工具烧录镜像。

16.4 测试

主机端:

传入640*640的图像文件和network_binary.nb模型文件

book@100ask:~/workspaces/testImg$ adb push test-100ask.jpg /mnt/UDISK
test-100ask.jpg: 1 file pushed. 0.6 MB/s (51039 bytes in 0.078s)
book@100ask:~/workspaces/testImg$ adb push network_binary.nb /mnt/UDISK
network_binary.nb: 1 file pushed. 0.7 MB/s (7409024 bytes in 10.043s)

开发板端:

进入/mnt/UDISK/目录下

root@TinaLinux:/# cd /mnt/UDISK/
root@TinaLinux:/mnt/UDISK# ls
lost+found     network_binary.nb  overlay       test-100ask.jpg

运行yolov5检测程序

yolov5-100ask network_binary.nb test-100ask.jpg

77b54114-1712-11ee-962d-dac502259ad0.png

执行完成后会在当前目录下生成输出文件yolov5_out.jpg

root@TinaLinux:/mnt/UDISK# ls
lost+found     overlay       yolov5_out.jpg
network_binary.nb  test-100ask.jpg

主机端:

拉取开发板端的输出图像yolov5_out.jpg

book@100ask:~/workspaces/testImg$ adb pull /mnt/UDISK/yolov5_out.jpg ./
/mnt/UDISK/yolov5_out.jpg: 1 file pulled. 0.8 MB/s (98685 bytes in 0.116s)

17.检测效果图

77e00be2-1712-11ee-962d-dac502259ad0.png


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像
    +关注

    关注

    2

    文章

    1091

    浏览量

    40676
  • 模型
    +关注

    关注

    1

    文章

    3415

    浏览量

    49473
  • 数据集
    +关注

    关注

    4

    文章

    1212

    浏览量

    24989

原文标题:V853端侧部署YOLOV5训练自定义模型 全流程教程

文章出处:【微信号:baiwenkeji,微信公众号:百问科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于YOLOv8实现自定义姿态评估模型训练

    Hello大家好,今天给大家分享一下如何基于YOLOv8姿态评估模型,实现在自定义数据集上,完成自定义姿态评估模型
    的头像 发表于 12-25 11:29 3025次阅读
    基于<b class='flag-5'>YOLOv</b>8实现<b class='flag-5'>自定义</b>姿态评估<b class='flag-5'>模型</b><b class='flag-5'>训练</b>

    maixcam部署yolov5s 自定义模型

    maixcam部署yolov5s 自定义模型 本博客将向你展示零基础一步步的部署好自己的yolov5
    发表于 04-23 15:43

    龙哥手把手教你学视觉-深度学习YOLOV5

    利用labview部署yolov5导出的模型,能利用摄像头动态检测输出目标检测结果。根据工业视觉外观检测的速度和准确性要求,龙哥视觉结合labview编程平台推出了labview+yolov5
    发表于 09-03 09:39

    怎样使用PyTorch Hub去加载YOLOv5模型

    autoshape=False. 要加载具有随机初始化权重的模型(从头开始训练),请使用pretrained=False. 在这种情况下,您必须提供自己的训练脚本。或者,请参阅我们的 YOLO
    发表于 07-22 16:02

    V853 NPU 转换部署 YOLO V5 模型

    模型V853 平台的转换与部署流程模型的准备YOLO v5 目前开源于 Github,
    发表于 11-29 09:26

    V853 在 NPU 转换 YOLO V3 模型

    V853开发板购买链接:KFB-V853_Allwinner的KFB-V853_KFB-V853[参数 价格 pdf 中文资料]_华秋商城NPU 转换 YOLO
    发表于 12-19 10:36

    V853常用模型跑分数据

    V853常用模型跑分数据序号算法模型FPSBW(MB/s)1inception_v1(224x224)57.371443.312inception_
    发表于 12-23 09:28

    yolov5训练部署链路教程

    本教程针对目标检测算法yolov5训练部署到EASY-EAI-Nano(RV1126)进行说明。
    的头像 发表于 01-05 18:00 3393次阅读
    <b class='flag-5'>yolov5</b><b class='flag-5'>训练</b><b class='flag-5'>部署</b><b class='flag-5'>全</b>链路教程

    在C++中使用OpenVINO工具包部署YOLOv5模型

    下载并转换YOLOv5训练模型的详细步骤,请参考:《基于OpenVINO™2022.2和蝰蛇峡谷优化并部署YOLOv5
    的头像 发表于 02-15 16:53 5842次阅读

    使用旭日X3派的BPU部署Yolov5

    本次主要介绍在旭日x3的BPU中部署yolov5。首先在ubuntu20.04安装yolov5,并运行yolov5并使用pytoch的pt模型
    的头像 发表于 04-26 14:20 1043次阅读
    使用旭日X3派的BPU<b class='flag-5'>部署</b><b class='flag-5'>Yolov5</b>

    【教程】yolov5训练部署链路教程

    本教程针对目标检测算法yolov5训练部署到EASY-EAI-Nano(RV1126)进行说明,而数据标注方法可以参考我们往期的文章《Labelimg的安装与使用》。
    的头像 发表于 01-29 15:25 3719次阅读
    【教程】<b class='flag-5'>yolov5</b><b class='flag-5'>训练</b><b class='flag-5'>部署</b><b class='flag-5'>全</b>链路教程

    v853参数 v853v853s的差别 v853是什么封装的

    v853参数 v853v853s的差别 v853是什么封装的 
    的头像 发表于 08-21 17:33 4757次阅读

    YOLOv5网络结构训练策略详解

    前面已经讲过了Yolov5模型目标检测和分类模型训练流程,这一篇讲解一下yolov5
    的头像 发表于 09-11 11:15 2524次阅读
    <b class='flag-5'>YOLOv5</b>网络结构<b class='flag-5'>训练</b>策略详解

    基于YOLOv8的自定义医学图像分割

    YOLOv8是一种令人惊叹的分割模型;它易于训练、测试和部署。在本教程中,我们将学习如何在自定义数据集上使用
    的头像 发表于 12-20 10:51 933次阅读
    基于<b class='flag-5'>YOLOv</b>8的<b class='flag-5'>自定义</b>医学图像分割

    在树莓派上部署YOLOv5进行动物目标检测的完整流程

    卓越的性能。本文将详细介绍如何在性能更强的计算机上训练YOLOv5模型,并将训练好的模型部署到树
    的头像 发表于 11-11 10:38 1912次阅读
    在树莓派上<b class='flag-5'>部署</b><b class='flag-5'>YOLOv5</b>进行动物目标检测的完整<b class='flag-5'>流程</b>