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

声明:本文谢绝转载!

CSDN地址:https://blog.csdn.net/weixin_58068682
个人博客:https://amnesia-f.gitee.io/

一、功能介绍

目前提供两种训练:

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

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

    二、确定方案

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

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

    确定分类1.png
    确定分类2.png

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

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

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

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

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

    三、获取,处理数据集

    1.采集数据

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

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

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

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

    数据采集爬虫.png

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

    2.处理图片分辨率

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

    打开文件夹.png

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

    处理图片完成.png

    处理图片完成1.png

    3.对图片进行更名

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

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

    序号更名.png

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

    更名完成.png

    4.标注图片

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

    目标分类可跳过此步骤。

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

    打开LabelImg软件:

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

    标注软件选择文件夹.png

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

    标注软件标注过程.png

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

    四、训练模型

    1.目标分类

    1.1 线上Maixhub平台

    打包数据集

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

    并将其压缩为zip文件:

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

    打包数据集1.png

    打包数据集2.png

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

    训练过程

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

    注册平台.png

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

    激活账号.png

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

    模型训练1.png

    选择物体分类,点击 Next :

    模型训练2.png

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

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

    模型训练4.png

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

    模型训练5.png

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

    训练结果下载压缩包.png

    分类识别效果1.jpg

    1.2 线下Mx_Yolo_v3训练

    保存数据集

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

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

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

    进行训练

    打开Mxyolov3,点击图像分类

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

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

    yolo图像分类.png

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

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

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

    yolo图像分类训练1.jpg

    yolo图像分类训练2.png

    测试模型

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

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

    yolo图像分类测试模型.jpg

    转换模型

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

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

    yolo图像分类模型转换.png

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

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

    2.目标检测

    1.1 线上 Maixhub 平台

    打包数据集

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

    ball
    toy
    

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

    然后目录结构如下:

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

    或者两级labelimg输出:

    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
    

    label文件.png

    训练过程

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

    参考四、 1. 1.1 训练过程处步骤即可。

    1.2 线下 Mx_yolo_v3 训练

    打开软件,选择目标识别

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

    yolo目标检测界面.jpg

    点击开始训练即可;

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

    模型转换

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

    五、上传程序

    目标分类

    使用以下代码:

    1. 需要在代码15行及70行修改引用的kmodel文件:model_addr="/sd/fruit.kmodel"
    2. 需要在代码68行修改你的label名:labels = ["apples", "bananas"]
    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[max_index].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()
    

    目标检测

    根据实际情况修改即可:

    六、出错问题

    1.内存不足

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

    解决办法:刷mini固件,下载地址

    2.锚点错误

    File "main.py", line 30, in <module>
    ValueError: [MAIXPY]kpu: region_layer_init err!
    

    目标分类锚点错误.png

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

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

    3.转换失败

    模型转换失败.jpg

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

    七、下载资源

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

  • mini固件:下载地址

  • 其他软件及代码等文件:
    可以在评论区留下邮箱,网盘多有空间及文件类型限制,分享过于麻烦。

  • 八、参考文档

  • Maixhub 模型训练平台使用说明

  • 博派史上最强K210板教程6——模型训练

  • 来源:Chak Aciano

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用Mx-Yolov3与Maixhub,本地及线上训练K210模型文件

    发表评论