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

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

3天内不再提示

我训练了一个模型,让开发板认识自己

全志在线 来源:百问科技 2023-07-10 09:50 次阅读

认识自己,是人类的终极问题;而让AI认识自己,则是人工智能觉醒的第一步。为此,国内知名嵌入式教育专家韦东山老师团队使用做了个有趣的事情——让开发板可以“认识”自己。

c20d1a26-1ca7-11ee-962d-dac502259ad0.pngc22f0cd0-1ca7-11ee-962d-dac502259ad0.png

本文将从数据集的标注开始,进行在100ASK_V853-PRO开发板上部署YOLOV5自训练模型的全过程演示,内容包括训练自定义模型、导出模型、转换模型、模型部署......并在最终实现开发板以自我为目标的检测功能,下面展示“我看我自己”的展示端侧最终检验效果图:

下载数据标注工具

首先来到数据标注工具下载的地方。

c27338ba-1ca7-11ee-962d-dac502259ad0.png

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

c29b5e12-1ca7-11ee-962d-dac502259ad0.png

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

c2b6fcda-1ca7-11ee-962d-dac502259ad0.png

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

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

c2d0aba8-1ca7-11ee-962d-dac502259ad0.gif

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

创建数据集目录

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

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

c32118ea-1ca7-11ee-962d-dac502259ad0.gif

标注图像

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

c384a20c-1ca7-11ee-962d-dac502259ad0.gif

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

c3bdb880-1ca7-11ee-962d-dac502259ad0.gif

下面我演示标注过程,以百问网的开发板为例,标注三块开发板,当你点击Save后即表示标注完成,标注完成后后会在labels目录下生成classes.txt(类别)和图像中标注的类别即位置信息。

c4420428-1ca7-11ee-962d-dac502259ad0.png

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

c45aaa3c-1ca7-11ee-962d-dac502259ad0.gif

划分训练集和验证集

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

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

c4c55e0e-1ca7-11ee-962d-dac502259ad0.gif

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

c32118ea-1ca7-11ee-962d-dac502259ad0.gif

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

c4c55e0e-1ca7-11ee-962d-dac502259ad0.gif

创建数据集配置文件

进入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
c57eb264-1ca7-11ee-962d-dac502259ad0.gif

创建模型配置文件

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

c5b439d4-1ca7-11ee-962d-dac502259ad0.gif

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

c2632394-1ca7-11ee-962d-dac502259ad0.png

修改训练函数

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

printf("hel 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')lo world!");

训练模型

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

c629e9fe-1ca7-11ee-962d-dac502259ad0.png

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

c6541f58-1ca7-11ee-962d-dac502259ad0.png

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

 runs	rainexp7weights

验证模型

修改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)')
c682f35a-1ca7-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
c6a15afc-1ca7-11ee-962d-dac502259ad0.png

打开conda终端输入python val.py

c6d23c80-1ca7-11ee-962d-dac502259ad0.png

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

c6f64904-1ca7-11ee-962d-dac502259ad0.gif

预测图像

在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')
c80f3576-1ca7-11ee-962d-dac502259ad0.png

检测效果如下图所示:

c82ff450-1ca7-11ee-962d-dac502259ad0.jpg

导出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')
c874ca62-1ca7-11ee-962d-dac502259ad0.png

在conda终端输入:

printf("hello world!"); python export.py --include onnx --dynamic
c8a835dc-1ca7-11ee-962d-dac502259ad0.png

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

c8d2985e-1ca7-11ee-962d-dac502259ad0.png

简化模型

简化模型前需要用到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
c9045d26-1ca7-11ee-962d-dac502259ad0.png

查看模型

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

c93eeebe-1ca7-11ee-962d-dac502259ad0.png

验证模型

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

新建文件夹存放固定的输入图像尺寸。假设上述中我设置输入图像尺寸为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')
c987014a-1ca7-11ee-962d-dac502259ad0.png

在conda终端输入:

python detect.py
c9ac09c2-1ca7-11ee-962d-dac502259ad0.png

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

c9ccf902-1ca7-11ee-962d-dac502259ad0.jpg

转换模型

将简化后的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
ca10279a-1ca7-11ee-962d-dac502259ad0.gif

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

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

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

ca3e6b28-1ca7-11ee-962d-dac502259ad0.gif

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

 pegasus generate inputmeta --model best-sim.json --input-meta-output best-sim_inputmeta.yml
cab0274a-1ca7-11ee-962d-dac502259ad0.gif

 pegasus generate postprocess-file --model best-sim.json --postprocess-file-output best-sim_postprocess_file.yml
cae1bdfa-1ca7-11ee-962d-dac502259ad0.gif

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

 vi best-sim_inputmeta.yml

修改过程如下图所示:

cb1dc57a-1ca7-11ee-962d-dac502259ad0.gif

生成量化表文件,使用非对称量化,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
cb4f58ce-1ca7-11ee-962d-dac502259ad0.gif

利用前文的量化表执行预推理,得到推理 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
cb99805c-1ca7-11ee-962d-dac502259ad0.gif

输出的模型可以在 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}
cc5d6d5a-1ca7-11ee-962d-dac502259ad0.gif

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

cd559a7a-1ca7-11ee-962d-dac502259ad0.gif

端侧部署

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

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

cde6fc4a-1ca7-11ee-962d-dac502259ad0.png

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

ce16cf24-1ca7-11ee-962d-dac502259ad0.png

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

ce3334a2-1ca7-11ee-962d-dac502259ad0.png

修改后的文件如下所示:

ce4d1c1e-1ca7-11ee-962d-dac502259ad0.gif

 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
ced452ec-1ca7-11ee-962d-dac502259ad0.png

编译并生成镜像

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

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

在主机端传入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
cf0b5fbc-1ca7-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)

检测效果图

c20d1a26-1ca7-11ee-962d-dac502259ad0.png

本文内容均转载自百问科技

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

    关注

    4982

    文章

    18281

    浏览量

    288438
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79541
  • 开发板
    +关注

    关注

    25

    文章

    4429

    浏览量

    93992
  • 模型
    +关注

    关注

    1

    文章

    2704

    浏览量

    47685
  • 数据集
    +关注

    关注

    4

    文章

    1178

    浏览量

    24351

原文标题:我训练了一个模型,让开发板认识自己

文章出处:【微信号:gh_79acfa3aa3e3,微信公众号:全志在线】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    新拿的开发板

    开发板
    jf_05871894
    发布于 :2022年10月02日 21:12:06

    自己一个开发板咋样?

    开发板
    YS YYDS
    发布于 :2023年04月26日 18:20:43

    自己一个fpga开发板

    本帖最后由 eehome 于 2013-1-5 09:49 编辑 想自己一个fpga的开发板,有谁有这方面经验的,拿出来分享下!(有哪些外设)
    发表于 09-04 20:36

    下大家,如果自己想在开发板开发

    下大家,如果自己想在开发板开发类似gps
    发表于 07-30 11:02

    自己制作单片机开发板

    自己一个51的开发板 但是对单片机刚刚入手 不知道要买什么元器件 想用面包或者万能
    发表于 12-12 16:48

    安心开发板

    开发板也充分发挥了安心号的性能,能让开发者对该芯片深刻了解。开发板尺寸长13cm,宽10cm,四角四螺丝定位孔,可将
    发表于 01-15 13:22

    SpeedBoard开发板

    开发板,学习者需要掌握的知识点比较多,很多知识点不好理解。尤其对于非电类专业的学生则无从下手,即使步学习,耗费大量的时间也不能够很好的掌握。在软件方面,市面上的开发板,针对
    发表于 03-01 21:28

    如何自己制作51开发板

    直想要自己制作块51开发板或者51项目板子,但没有相关的资料,从来也没有做过板子。有没有大神可以贡献
    发表于 11-24 23:21

    Pytorch模型训练实用PDF教程【中文】

    及优化器,从而给大家带来清晰的机器学习结构。通过本教程,希望能够给大家带来清晰的模型训练结构。当模型
    发表于 12-21 09:18

    【YOXIOS X3开发板(基于Linux的GUI)试用连载】基于此开发板的疫情情况实时公示牌

    项目名称:基于此开发板的疫情情况实时公示牌试用计划:申请理由本人在嵌入式开发领域有两年经验,可以熟练了解产品性能,对于产品可以做出有效评估。可以依靠自己自身的经验以及
    发表于 07-27 15:03

    【Sipeed M2 Dock开发板试用体验】开箱帖之刚好遇见

    最近对Python正好想温习下,有幸能参加Sipeed矽速科技 M2 Dock开发板的试用,借助 M2 Dock 与 开源 Python 编程语言来实现跨平台统和简化 Linux 嵌入式设备上
    发表于 06-14 22:25

    【Sipeed M2 Dock开发板试用体验】之家猫检测模型训练

    ,还是挺简单,结合的图片和视频,很容易就明白,下面就是连串的图片了,不做文字解说,看就懂。1、创建项目2、创建数据集3、上传图片4、整理数据5、标注数据6、创建训练任务7、
    发表于 06-26 21:19

    K210开发板部署到开发板上后,会提示“Out of Memory”无法完成检测任务如何解决?

    您好,想问下嘉楠官方有没有出套基于K210开发板进行目标检测的训练流程呢?
    发表于 09-14 08:35

    iTOP-RK3588开发板更新RKNN模型

    RKNN 是 Rockchip NPU 平台(也就是开发板)使用的模型类型,是以.rknn 结尾的模型文件。 RKNN SDK 提 供 的 demo 程 序 中 默 认 自 带 了 RKNN 模 型
    发表于 09-21 11:39

    让开发板上的LED灯闪烁起来吧

    这节课给大家讲一下如何让开发板上网络编号为 D4 LED 灯闪烁起来,先看一下开发板上关于 LED 的原理图
    发表于 11-11 17:17 13次下载