符柏铖 发表于 2022-5-2 21:57:47

使用Mx-Yolov3与Maixhub,本地及线上训练K210模型文件过程

详细介绍了使用Mx_Yolov3训练K210模型文件的过程,包括本地及线上训练的过程。

## 一、功能介绍

目前提供两种训练:

- 目标分类: 识别图片所属的种类, 比如图中是苹果还是杯子, 没有坐标。 如下图,识别到了苹果,是苹果的概率为0.8




- 目标检测: 检测图片中物体的位置, 并且输出这个物体的坐标和物体大小(即框出认识的物体)。 如下图, 识别到了苹果, 并且框出了位置, 是苹果的概率为0.8



## 二、确定方案

1. 首先确定要训练哪种模型。
在上面支持的模型中选择一个,如果不需要检测物体坐标, 用目标分类, 需要坐标则目标识别,
两者处理数据要做的工作和格式都不一样, 后者会复杂很多。

2. 确定分类。 包括分类数量, 具体分类。 比如这里以识别红色小球和玩具为例:




所以共两个分类: `ball` 和 `toy`, 我们也称之为`标签(label)`,

> 注意!分类名(标签/label)只能使用英文字符和下划线

3. 确定分辨率。 图片的分辨率也十分重要,不管是在采集、训练,还是使用时, 都需要十分注意, 稍不注意,模型可能就无法使用或者识别精度低。
以下为Maixhub目前支持的分辨率,其它分辨率将会训练失败:

目标分类、目标检测: `224x224`(推荐)

确定采集数据集(这里就是所有图片的统称)数量。 即确定好每个分类的图片数量,方便后面采集图片快速准确进行,

## 三、获取,处理数据集

### 1.采集数据

1. 图片数据的采集可以使用任意的图片采集工具。某些特定的图片数据,可能需要用k210主控板的摄像头来拍摄,这样数据使用会比较准确。

2. 手机拍照, 然后使用预处理工具处理成需要的分辨率

3. 可以使用网络爬虫在网络上按名称爬取图片,在Mx_yolo_v3的“工具集”菜单中,使用图片爬取工具可以爬取需要的照片。

> 注:要把无效图片去除,否则会影响训练!



得到图片数据后,将其导入电脑:



### 2.处理图片分辨率

打开`Image_tool.exe`软件,看到以下界面,点击`选择图像文件夹...`,选择存放采集照片的文件夹,设置分辨率为`224*224`。





等待处理完毕后,即可得到`224*224`分辨率的图片:



### 3.对图片进行更名

打开 拖把更名器 文件夹中的`xTools.exe`

点击菜单栏中的`序号`,接下来按照下图步骤操作即可:



应用更改后即可得到按照序号排列的文件名:



### 4.标注图片

> 此步骤仅`目标检测`需要操作!

> `目标分类`可跳过此步骤。

新建一个`mask`文件夹,里面新建`images`和`xml`文件夹,将先前处理好的图片数据丢入`images`文件夹。

打开`LabelImg`软件:

1. 更改图片所在文件夹;
2. 更改标签所在文件夹;



1. 点击 `Create RectBox` 进行标注;
2. 在图片上拖选出需要识别的标注部分;
3. 输入`标签/label`名,点击OK;
4. 点击 `Save` 保存;
5. 点击`Next Images` 标注下一张图片;



到此数据集的处理和准备工作完毕,接下来就可以开始训练模型了!

## 四、训练模型

## 1.目标分类

### 1.1 线上Maixhub平台

#### 打包数据集

将数据集按以下分支保存,

并将其压缩为`zip`文件:

``` Java
datasets.zip
            |
            datasets
                  |
                     ----mask
                  |      |
                  |         ---0.jpg
                  |      |
                  |         ---1.jpg
                  |      |
                  |         ---2.jpg
                  |
                     ----redbull
                           |
                            ---0.jpg
                           |
                            ---1.jpg
```




压缩文件命名为`datasets.zip`,注意大小不要超过20MB。

#### 训练过程

打开Maixhub注册地址:(https://www.maixhub.com/register),注册一个账号:



> 注册成功后记得去邮箱激活账号。



回到首页,点击网页顶部的`模型训练`



选择`物体分类`,点击 Next :



上传前面打包好的数据集:



上传完成后点击`Submit`,之后耐心等待即可:



等待一段时间训练完成后,来到此界面,点击 Download 下载训练好的模型文件:



下载回来得到以下文件,将其全部丢入K210板的sd卡中,上电之后即可实现简单的目标分类功能:







### 1.2 线下Mx_Yolo_v3训练

#### 保存数据集

将数据集按以下分支保存,

线下训练无需打包为压缩包。

``` Java
images
      |
      ----apples
      |      |
      |       ---0.jpg
      |      |
      |       ---1.jpg
      |      |
      |       ---2.jpg
      |
      ----bananas
            |
            ---0.jpg
            |
            ---1.jpg
```

#### 进行训练

打开`Mxyolov3`,点击`图像分类`

点击`选择`,选取到刚才调整好的`images`文件夹,再点击`提取`,此时正常来说可以显示出你的各label名称,比如我的是`apples,bananas`。

其他配置参数可以保持默认无需更改,如果需要更高的识别率可以调整训练次数的多少。



点击开始训练,耐心等待一段时间即可。

跑完训练过程后,会出现两个结果图,关闭即可,等待信息栏出现over,end等字样即代表训练过程完成,会自动弹出存放模型文件的文件夹。

> 需记录下此文件夹路径,后面需要用到,一般在Mx_yolo安装目录下的`Model_file`文件夹中。




#### 测试模型

点击右上角的`测试模型`,选择刚才训练完毕后弹出的文件夹中的`weights.h5`文件,得到以下结果。

可以看到有关苹果的图片被标注上apples,说明模型可以正常使用。



#### 转换模型

Mx_yolo_v3中训练出的模型无法直接在K210板上使用,需要转换为kmodel文件,

在软件中内置了模型转换软件,点击右上角的`转换模型`,进入以下界面:



1. 模型输入路径选择刚才弹出的`Model_file`文件夹下的`weights.tflite`文件;
2. 模型输出路径选择你需要导出的文件所在路径;
3. 量化图片路径选择你的图片数据集。

转换成功后即可放入sd卡在K210板中运行。

## 2.目标检测

### 1.1 线上 Maixhub 平台

#### 打包数据集

新建一个`labels.txt`, 输入标记的标签, 每行一个, 比如这里:

``` Java
ball
toy
```

这是必须的, 否则数据会无效。

然后目录结构如下:

``` Java
datasets.zip
            |
            datasets
                  |
                     ----images
                  |      |
                  |      |---0.jpg
                  |      |
                  |         ---1.jpg
                  |
                  |------xml
                  |      |---0.xml
                  |      |
                  |      |---1.xml
                  |
                     ----labels.txt
```

或者两级labelimg输出:

``` Java
datasets.zip
          |
         datasets
                  |
                  |---images
                  |      |
                  |       ----ball
                  |      |       |
                  |      |      ---0.jpg
                  |      |       |
                  |      |      ---1.jpg
                  |      |
                  |       ----toy
                  |      |      |
                  |      |       ---0.jpg
                  |       ---pic0.jpg
                  |---xml
                  |   |
                  |      ----ball
                  |   |      |
                  |   |         ---0.xml
                  |   |      |
                  |   |         ---1.xml
                  |   |
                  |      ----toy
                  |   |       |
                  |   |      ---0.xml
                  |      ----pic0.xml
                   --labels.txt
```



#### 训练过程

目标检测与目标分类的线上训练过程完全相同,仅需更改为对应模式即可,

参考`四、 1.1.1训练过程`处步骤即可。

### 1.2 线下 Mx_yolo_v3 训练

打开软件,选择`目标识别`

1. 选择网络为`Yolov2-K210`;
2. 训练图片地址选择为你图片训练集的路径;
3. 训练标签地址选择为你为图片标注后保存的xml文件路径;
4. 点击`自动提取`,将提取出种类名称,即label;
5. 点击`计算`,将自动计算出锚点,即author,后面会用到。
6. 其他配置可保持默认不变,建议取消勾选数据校验,容易闪退。



点击`开始训练`即可;

等待训练完成后会出现类似于目标分类后的曲线图,关闭后再稍等片刻即可。

#### 模型转换

此步骤与前面大同小异,参考`四、 1.1.2测试模型、转换模型`处步骤。

## 五、上传程序

## 目标分类

使用以下代码:

1. 需要在代码15行及70行修改引用的kmodel文件:`model_addr="/sd/fruit.kmodel"`
2. 需要在代码68行修改你的label名:`labels = ["apples", "bananas"]`

``` Python
import sensor, image, lcd, time
import KPU as kpu
import gc, sys


def lcd_show_except(e):
    import uio
    err_str = uio.StringIO()
    sys.print_exception(e, err_str)
    err_str = err_str.getvalue()
    img = image.Image(size=(224,224))
    img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))
    lcd.display(img)

def main(labels = None, model_addr="/sd/fruit.kmodel", sensor_window=(224, 224), lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):
    sensor.reset()
    sensor.set_pixformat(sensor.RGB565)
    sensor.set_framesize(sensor.QVGA)
    sensor.set_windowing(sensor_window)
    sensor.set_hmirror(sensor_hmirror)
    sensor.set_vflip(sensor_vflip)
    sensor.run(1)

    lcd.init(type=1)
    lcd.rotation(lcd_rotation)
    lcd.clear(lcd.WHITE)

    if not labels:
      with open('labels.txt','r') as f:
            exec(f.read())
    if not labels:
      print("no labels.txt")
      img = image.Image(size=(320, 240))
      img.draw_string(90, 110, "no labels.txt", color=(255, 0, 0), scale=2)
      lcd.display(img)
      return 1
    try:
      img = image.Image("startup.jpg")
      lcd.display(img)
    except Exception:
      img = image.Image(size=(320, 240))
      img.draw_string(90, 110, "loading model...", color=(255, 255, 255), scale=2)
      lcd.display(img)

    try:
      task = None
      task = kpu.load(model_addr)
      while(True):
            img = sensor.snapshot()
            t = time.ticks_ms()
            fmap = kpu.forward(task, img)
            t = time.ticks_ms() - t
            plist=fmap[:]
            pmax=max(plist)
            max_index=plist.index(pmax)
            img.draw_string(0,0, "%.2f : %s" %(pmax, labels.strip()), scale=2, color=(255, 0, 0))
            img.draw_string(0, 200, "t:%dms" %(t), scale=2, color=(255, 0, 0))
            lcd.display(img)
    except Exception as e:
      raise e
    finally:
      if not task is None:
            kpu.deinit(task)


if __name__ == "__main__":
    try:
      labels = ["apples", "bananas"]
      # main(labels=labels, model_addr=0x300000)
      main(labels=labels, model_addr="/sd/fruit.kmodel")
    except Exception as e:
      sys.print_exception(e)
      lcd_show_except(e)
    finally:
      gc.collect()
```

## 目标检测

根据实际情况修改即可:

![目标检测代码截图.png](https://cdn.jsdelivr.net/gh/Amnesia-f/jsDelivr_CDN/post/使用Mx_Yolo_v3训练K210模型文件/目标检测代码截图.png)

## 六、出错问题

## 1.内存不足

``` Python
SYSCALL: Out of memory

Traceback (most recent call last):
File "main.py", line 24, in <module>
ValueError: kpu: load error:2006, ERR_NO_MEM: memory not enough
```

解决办法:刷mini固件,

## 2.锚点错误

``` Python
File "main.py", line 30, in <module>
ValueError: kpu: region_layer_init err!
```



此问题为使用目标分类模型,但没有使用到锚点所报的错。

解决方法:参考上文提供的代码,使用Python纯代码编写程序。

## 3.转换失败



解决方法:无,更换电脑重试。

## 七、下载资源

- Mx_Yolo-v3安装包:https://www.aliyundrive.com/s/Vknz8mtKqMj
> 提取码zl04

- mini固件:

- 其他软件及代码等文件:




## 八、参考文档

- (https://www.maixhub.com/ModelTrainingHelp_zh.html)

- [博派史上最强K210板教程6——模型训练](https://mc.dfrobot.com.cn/thread-307935-1-1.html)

宣坝 发表于 2022-5-8 10:47:37

大神,请收下我的膝盖,我用线下的方法,但是训练出来的模型可以测试成功,但是调用还是失败,说是格式不对,可我确实是kmodel,不明所以,timber_123,这是我的WEI信
页: [1]
查看完整版本: 使用Mx-Yolov3与Maixhub,本地及线上训练K210模型文件过程