[TOC]

K210实战-云端训练神经网络模型

一、前言

2021年电赛马上就要开始了,在过去电赛中,当我们遇到需要用视觉的题目时,第一时间想到的就是使用openmv来做视觉处理,虽然说可以勉强达到设计目标,但整体上的性能上还是太弱,尤其在检测目标物体的时候受到环境影响非常大,所以我今天向大家推荐一款新电赛神器-搭载K210芯片的MaixBit开发板,拥有1TOPs算力,可以运行神经网络模型,价格亲民,只要200块就能买到,具体开发板参数介绍:勘智K210芯片介绍

开发板模样:

img

目前Sipeed官网有一个在线模型训练平台,为购买K210产品的用户提供一个在线模型训练,支持目标检测目标分类两种模型,本篇文章将分享如何使用在线云平台训练目标检测模型,并将它导入到K210中运行!下面先讲解一下关于目标检测模型和目标分类模型的概念

  1. 目标分类: 识别图像所属的类别,例如 applecup,无返回坐标。如下图,它是苹果的概率是0.8

img

  1. 物体检测:检测物体在图片中的位置,并输出物体的坐标和物体的大小(即框定识别的物体)。如下图所示,一个苹果是苹果的概率是0.8,当它被检测到时会被框起来。

img

下面正式进入目标检测模型训练正文

二、开发准备(软件+环境)

本章用到的资料已打包成文件夹上传到CSDN:地址

K210的Python开发平台MaixPy,开发方式与OpenMV基本差不多:下载地址,根据自己电脑选择合适版本;

20210522195333

MaixPy界面如下:(基本和OpenMV IDE一样)

20210527225950

Labelimg图片标注软件(软件在我提供的压缩包内),界面如下:(若打不开,将C盘\usr\用户名下的labelImgSettings.pkl删除重新打开)

20210527230359

K210固件下载软件,用于下载固件到K210(软件在我提供的压缩包内),界面如下:

20210522200739

串口调试软件:ATK-XCOM串口调试工具(软件在我提供的压缩包内),界面如下

20210527225905

三、获取训练图片

进行训练首先需要的就是获取目标图片用于训练,此处有两种方法获得图片集,我都做一下介绍

3.1 手机获取图片

手机获取图片的方法主要有两个:1.手机拍摄视频提取图片再转化图片大小,2.手机一张一张拍摄在转化图片大小(转化图片大小是把图片大小转化为224*224大小,因为k210官方推荐的训练图片大小就是这么大,如果使用的不是这个大小,后面会出现问题)

  1. 手机拍摄一段视频,进入在线网页转换为图片:网页地址

通过视频获取图片数据集步骤:点开网页-> 导入视频-> 点击开始后,选择下载ZIP压缩包

20210522224126

提取的所有图片都包含在下载的压缩包里面

  1. 手机拍摄大量图片(这个方法比较累,一张一张拍摄在整合)

以上就是两种获取图片的方法,在获取了需要用于训练的图片素材后,他们的大小我们不能确定,需要通过imgtool软件进行转换,软件在我提供的压缩包内;把图片转换成224*224,具体步骤如下:

把所有图片放在一个images文件夹下(名字要和我一样)

20210527205617

打开Imgtool选择存放图片的文件夹,开始转换

20210527205726

转换后生成一个images_out文件夹,我们删除原先文件夹,把images_out改名为images文件夹

20210527205810

到此完整的图片集就准备好了!

3.2 通过K210进行图片拍取

上一步我们讲解了,用手机获取图片集,但手机的效果并不是最佳,最佳的效果是使用K210直接进行图片拍摄,获取224*224格式的图片,具体步骤如下:

首先确保K210自身固件为出厂固件,固件在我准备的文件夹内,如果不是可以刷一下固件,刷固件步骤可以提前参考下面刷机器码步骤(如果是出厂固件

无需再刷固件),同时需要一张格式化为FAT32的内存卡,用于存储图片

20210527213355

固件准备就绪后,打开maixpy IDE软件,选择拍照文件夹下的photo.py进行打开

20210527213954

打开后点击做下架绿色图标连接K210

20210527214047

连接后,点击绿色播放按钮,程序正常运行,图片数据反馈回MaixPyIDE

20210527214214

我们对准我们需要的训练的目标,按下MaixBit上的Boot按键,图片就可以保存到内存卡里面,下图为我采集的照片,照片已经为224*224大小,所以无需在进行转换便得到图片集

20210527215516

四、获取训练集

经过上一步,我们获取了224*224大小的目标图片集,这一步我们将使用标注软件labelimg对获取的训练集进行标注,步骤如下:

桌面新建文件夹dataset,dataset下在建立一个usb文件夹,文件夹内建立两个文件夹分别叫images和xml,以及一个labels.txt的文本文件(名字一定要对上)

20210527220433

将所有处理过的图片放到images内(图片不能为中文名字)

20210527221108

打开labelimg,选择open dir打开图片集目录

20210527221236

点击change save dir选择标注数据(.xml文件)输出目录

20210527221300

点击view->auto save mode自动保存,方便我们标注

20210527221446

之后按下快捷键W进行图片标注,框选出目标物体,然后标签写入usb

20210527222258

标注后按下快捷键D切换下一个,快捷键A切换上一个,重复以上步骤,一直到标注完成

标注完成后,我们在labels.txt内写入所有的标签(标注了几种写几种,换行隔开),此处我只标注了一种,所以填一个usb;

20210527222813

标注完成之后,我们可以看到文件夹的内容框架如下:

20210527221029

之后我们将整个文件夹压缩为ZIP格式文件,到这用于目标检测模型的训练集就做好了!

五、网络平台训练

在准备好训练集后,我们下一步就是将模型上传到Sipeed的模型平台进行训练,具体步骤如下:

5.1 获取机器码

使用Sipeed的模型平台需要有k210的机器码才能训练,机器码是每个k210独有的一个标识码,获取过程如下

5.1.1 下载固件

打开kflash_gui,通过kflash下载bin文件到K210,bin文件在MaixBit文件夹下固件下面的key_gen.bin文件

20210522184414

5.1.2 串口读取

固件下载完成之后,打开XCOM软件,连接串口,设置波特率115200,按下开发板上的复位按钮,串口会发送机器码信息,如下图

20210522202243

此处的机器码就是当前机器的机器码了,把它保存住,留着后面使用,注意一点此时的k210固件是刷机器码的固件,我们需要刷回支持运行模型的固件,在固件文件夹内我准备了两个固件,一个是出厂固件,一个是官方推荐的运行模型的固件,我们刷入官方推荐的固件,为之后运行模型做准备!

文件名 说明 备注
maixpy_vx.y.z_x_xxx*.bin 默认版本的 MaixPy 固件,包含了大多数功能, 支持连接 MaixPy IDE, 出厂默认固件版本
maixpy_vx.y.z_x_xxx*_minimum_with_ide_support.bin MaixPy 固件最小集合, 支持连接 MaixPy IDE, 不包含OpenMV的相关算法和各种外设模块 运行各种模型,建议使用这个

5.2 提交训练集到模型平台

获取了机器码后,下一步我们进入到Sipeed的官网:Sipeed,进入到官网后注册一个账号(步骤略过),点击官网的模型平台->选择模型训练,在下图位置填入机器码,并且选择物体检测;

20210528232814

然后点击next,上传模型压缩包(ZIP格式),再点击next一直到submit,提交后我们就可以在自己的主页中看到模型正在排队,等排到我们的时候就会开始训练了,我的训练集给了200张,训练差不多要半个小时,下图是训练完成的界面

20210528233635

到此模型训练就结束了

六、模型导入

6.1 压缩包文件信息

模型训练结束后下一步就是把模型导入到k210中运行,首先把我们训练好的模型压缩包下载下来,压缩包内容如下:

20210528234117

其中startup.jpg是启动界面图片,无需关注,report是模型训练的结果

20210528234816

两个曲线的对应关系

Loss曲线趋势 结果
train loss 不断下降,valid loss不断下降 说明网络仍在学习,还有优化空间
train loss 不断下降,valid loss趋于不变 说明网络过拟合(max pool或者正则化)
train loss 趋于不变,valid loss不断下降 说明数据集100%有问题,检查数据集有没有出错
train loss 趋于不变,valid loss趋于不变 说明学习遇到瓶颈,需要减小学习率或批量数目;或者是数据集有问题(数据集标注错误数据比较多);
train loss 不断上升,valid loss不断上升 说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题;

这里我的训练集做的不是很好,因为摄像头太模糊了,但也勉强可以使用

m.kmodel是模型数据,系统关键文件;

labels.txt是模型的标注信息;

boot.py是官方提供的调用模型的脚本,用于启动模型

6.2 K210调用模型

知道压缩包文件的作用后,我们开始通过k210调用模型,这里有两种模型调用方式

1.从SD卡启动模型

准备一个sd卡,把上面的文件全部拷贝进去,插入k210上电启动,k210会从sd卡中的boot.py进行启动,调用模型,开始检测

2.从内部Flash启动模型

若没有SD卡,则可以将模型导入到内部Flash指定位置,然后通过修改Boot.py内读取模型的位置,直接启动,具体步骤如下

打开kflash,下载位置填入0x300000后下载

20210529104543

改变boot.py里面的代码,注释掉从SD卡启动的代码,取消从flash启动的代码,通过MaixPy开始运行就可以检测模型了

20210529104732

七、实验现象

K210运行了模型之后,对准目标物到中心位置时检测率很高,但因为我的数据集少的原因,在侧面检测的识别率不高,运行一段时间没有误检测的情况,效果比我之前用Openmv好很多!!!

八、K210系列文章

wechat