K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)

这篇具有很好参考价值的文章主要介绍了K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

个人觉得K210与openmv最大的区别就是可以跑模型了,虽然不能跑yolov5得这类大型模型,但是还是可以使用一些yolov2、Mobilenet V1等轻量化模型。

一、MaixHub功能介绍

想要训练一个可用得模型,奈何电脑显卡不给力,没关系,我们可以使用Spieed的MaixHub模型在线训练来训练模型。Maixhub 模型训练平台帮助大家快速训练想要的 AI模型, 不需要任何训练环境搭建和代码运行, 只需要选择训练类型,上传(标注)数据集, Maixhub就会自动进行训练,训练结束后下载即可。
MaixHub目前有两种训练:
1、目标分类
识别图片所属的种类,只是识别出图片的种类,并没有显示识别物体的坐标(没有框出来),比如:
2、目标检测
既能识别出物体,又能将识别到的物体的坐标输出出来(框出来),比如:

二、Maixhub模型训练使用方法

首先要确定自己需要训练那种模型,如果只是要识别出物体,那就先目标分类,如果既要识别出物体类别,还要输出识别到的物体坐标,那就选择目标检测。
确定分类。 包括分类数量, 具体分类。 比如这里以识别红色小球和玩具为例:
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)
所以共两个分类: ball 和 toy, 我们也称之为标签(label),
注意!!! 分类名(标签/label)只能使用英文字符下划线

确定分辨率:以下为Maixhub目前支持的分辨率,其它分辨率将会训练失败(使用推荐分辨率识别准确率更高):

目标分类: 224x224(推荐)

目标检测: 224x224(推荐), 240x240

确定采集数据集数量:另外也要满足 Maixhub 的要求:

目标分类: 每类图片数量不低于40张,比如采集 200 张

目标检测: 每类图片数量不低于100张, 比如采集200张
上限为2000张

最后要注意上传的zip文件不能超过20MiB

三、图片采集

采集图片有以下几种方式:
1、使用开发板采集到SD卡, 直接采集成需要的分辨率 (推荐
2、使用现成的图片, 使用预处理工具处理成需要的分辨率, 注意, 处理完后一定要手动检查数据是否符合要求, 不然可能影响训练精准度
3、手机拍照, 然后使用预处理工具处理成需要的分辨率, 注意, 处理完后一定要手动检查数据是否符合要求, 不然可能影响训练精准度

使用开发板进行数据采集
因为之前已经了解了MAIX BIT的拍照原理,所以这里我们主要是用开发板来采集图片。
使用这个脚本来进行采集图片

#根据你的开发板修改摄像头和屏幕配置, 比如lcd.rotation
#准备一张支持 SPI 模式的 SD 卡, 分区为 MBR (msdos), 格式化为 FAT32
#将目录下的boot.py文件拷贝到 SD 卡根目录
#开发板断电, 将SD卡插入开发板
#开发板上电, 程序会自动创建一个目录cap_images_1, 下次上电会创建cap_images_2, 这样就避免了覆盖
#采集一个分类的图片 按开发板上的boot按键,然后松开按键来采集一张图片, 这会将图片保存到cap_images_1/0/0.jpg, 采集的图片的名字会自动增长, 比如0.jpg 1.jpg ...
#长按boot按键切换类别目录 这会创建一个新目录,比如cap_images_1/1/, 后面采集的图片都会被保存到这个新的目录, 比如cap_images_1/1/0.jpg
#开发板断电,取出SD卡插到电脑, 打开文件管理器就可以看到采集的图片了
import sensor, lcd
from Maix import GPIO
from fpioa_manager import fm
from board import board_info
import os, sys
import time
import image

#### image size ####
set_windowing = (224, 224)       

#### sensor config ####

sensor.reset(freq=22000000, dual_buff=False)
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA) # 320x240
try:
    sensor.set_jb_quality(95)         # for IDE display quality
except Exception:
    pass # no IDE support
if set_windowing:
    sensor.set_windowing(set_windowing)

sensor.skip_frames()

#### lcd config ####
lcd.init(type=1, freq=15000000)
lcd.rotation(2)

#### boot key ####
boot_pin = 16 # board_info.BOOT_KEY
fm.register(boot_pin, fm.fpioa.GPIOHS0)
key = GPIO(GPIO.GPIOHS0, GPIO.PULL_UP)

######################################################

#### main ####
def capture_main(key):
    def draw_string(img, x, y, text, color, scale, bg=None , full_w = False):
        if bg:
            if full_w:
                full_w = img.width()
            else:
                full_w = len(text)*8*scale+4
            img.draw_rectangle(x-2,y-2, full_w, 16*scale, fill=True, color=bg)
        img = img.draw_string(x, y, text, color=color,scale=scale)
        return img

    def del_all_images():
        os.chdir("/sd")
        images_dir = "cap_images"
        if images_dir in os.listdir():
            os.chdir(images_dir)
            types = os.listdir()
            for t in types:
                os.chdir(t)
                files = os.listdir()
                for f in files:
                    os.remove(f)
                os.chdir("..")
                os.rmdir(t)
            os.chdir("..")
            os.rmdir(images_dir)

    # del_all_images()
    os.chdir("/sd")
    dirs = os.listdir()
    images_dir = "cap_images"
    last_dir = 0
    for d in dirs:
        if d.startswith(images_dir):
            if len(d) > 11:
                n = int(d[11:])
                if n > last_dir:
                    last_dir = n
    images_dir = "{}_{}".format(images_dir, last_dir+1)
    print("save to ", images_dir)
    if images_dir in os.listdir():
        img = image.Image()
        img = draw_string(img, 2, 200, "please del cap_images dir", color=lcd.WHITE,scale=1, bg=lcd.RED)
        lcd.display(img)
        sys.exit(1)
    os.mkdir(images_dir)
    last_cap_time = 0
    last_btn_status = 1
    save_dir = 0
    save_count = 0
    os.mkdir("{}/{}".format(images_dir, save_dir))
    while(True):
        img0 = sensor.snapshot()
        if set_windowing:
            img = image.Image()
            img = img.draw_image(img0, (img.width() - set_windowing[0])//2, img.height() - set_windowing[1])
        else:
            img = img0.copy()
        # img = img.resize(320, 240)
        if key.value() == 0:
            time.sleep_ms(30)
            if key.value() == 0 and (last_btn_status == 1) and (time.ticks_ms() - last_cap_time > 500):
                last_btn_status = 0
                last_cap_time = time.ticks_ms()
            else:
                if time.ticks_ms() - last_cap_time > 5000:
                    img = draw_string(img, 2, 200, "release to change type", color=lcd.WHITE,scale=1, bg=lcd.RED)
                else:
                    img = draw_string(img, 2, 200, "release to capture", color=lcd.WHITE,scale=1, bg=lcd.RED)
                    if time.ticks_ms() - last_cap_time > 2000:
                        img = draw_string(img, 2, 160, "keep push to change type", color=lcd.WHITE,scale=1, bg=lcd.RED)
        else:
            time.sleep_ms(30)
            if key.value() == 1 and (last_btn_status == 0):
                if time.ticks_ms() - last_cap_time > 5000:
                    img = draw_string(img, 2, 200, "change object type", color=lcd.WHITE,scale=1, bg=lcd.RED)
                    lcd.display(img)
                    time.sleep_ms(1000)
                    save_dir += 1
                    save_count = 0
                    dir_name = "{}/{}".format(images_dir, save_dir)
                    os.mkdir(dir_name)
                else:
                    draw_string(img, 2, 200, "capture image {}".format(save_count), color=lcd.WHITE,scale=1, bg=lcd.RED)
                    lcd.display(img)
                    f_name = "{}/{}/{}.jpg".format(images_dir, save_dir, save_count)
                    img0.save(f_name, quality=95)
                    save_count += 1
                last_btn_status = 1
        img = draw_string(img, 2, 0, "will save to {}/{}/{}.jpg".format(images_dir, save_dir, save_count), color=lcd.WHITE,scale=1, bg=lcd.RED, full_w=True)
        lcd.display(img)
        del img
        del img0


def main():
    try:
        capture_main(key)
    except Exception as e:
        print("error:", e)
        import uio
        s = uio.StringIO()
        sys.print_exception(e, s)
        s = s.getvalue()
        img = image.Image()
        img.draw_string(0, 0, s)
        lcd.display(img)
main()

采集好图片后,将SD卡中的图片拷贝到电脑, 整理成下面的目录结构, 所有图片的分辨率为224x224
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)

四、标注数据集(目标分类跳过这一步)

注意: 一定要先保证分辨率正确, 再标注
有两种标注方式,一种是vott(击这里下载),另一种是labelimg(点击这里下载 )。这里我标注主要是用labelimg进行标注(注意:labelimg的路径不能有中文,不然会闪退)。
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)
保存后会生成xml格式的文件(即PascalVOC格式),每张图对应一个xml文件。完成后目录结构和文件如下:
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)
或者两级目录
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)

五、打包数据集

将前面处理好的数据集进行打包, 使用zip压缩,暂不支持其它格式, 而且文件不要超过20MiB。
目标分类:
一个文件夹一个分类, 分类名(标签/label)就是文件夹名
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)

目标检测:
labelimg 的输出zip文件结构,新建了一个labels.txt, 输入标记的标签, 每行一个(这是必须的, 否则数据无效), 比如这里:
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)
然后目录结构如下
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)
或者两级labelimg输出
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)

六、上传数据集进行训练

K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)
如果进度一直是0%可以刷新一下,训练完成后点击Download就可以下载训练文件。 下载文件是一个zip压缩文件, 解压后仔细阅读README.txt,使用了中英文对使用方法进行了说明,默认是在有最新版固件的情况下, 将结果文件全部拷贝到SD卡根目录, 断电插入开发板, 然后上电就可以运行了。(注意:提交数据集格式一定要争取,不然会报错不能训练)

总结

以上就是MaixHub在线训练模型大致过程,整体下来还是比较简单的,建议是先进行一次物体分类的训练再进行物体检测的训练。
常见问题:
1、物体分类训练完成后运行训练文件,发现识别到了物体,但是显示的是其它物体的名称,这个时候可以更改boot.py里面的labels的顺序。

labels = ["Recyclable_waste_out", "Other_waste", "Kitchen_waste", "Hazardous_waste_out"]

2、…有待补充…
K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)文章来源地址https://www.toymoban.com/news/detail-448639.html

到了这里,关于K210学习笔记(十一)——MaixHub在线训练模型(旧版在线炼丹)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Yahboom亚博K210线上模型训练

          Yahboom亚博K210开发板 的官方套件资料介绍使用方法比较笼统,在实际项目开发的过程中,对于小白来说很不友好,而且 B站等视频平台也没有亚博开发板的使用教程 。本次使用 Maixhub平台 对亚博K210进行开发,限于本人学识和开发经验,对开发过程还是比较浅,对深层

    2024年02月14日
    浏览(37)
  • k210部署自行训练的口罩识别模型

    因为培训需要,开坑K210,前后忙活了3天终于把自行训练的口罩模型部署成功了,实测还行,分享一下经(ni)验(keng): 本人学过一段时间python,见过别人玩开源硬件(没动过手),接触过一点人工智能项目的理论知识(观课议课),先自己体验一下半个项目的过程。 1.资

    2023年04月09日
    浏览(44)
  • Canmv K210开发板训练自己的模型

    关于Canmv开发板的介绍: CanMV K210 AI开发板全网首发,项目代码完全开源,千套开发板限时优惠! 本文参考:使用CanMV进行多物体识别   便宜!便宜!便宜!淘宝200即可买到一个能带摄像头和LCD屏等等的开发板,到手即用,对于我们这种学生党来作为学习、打比赛等在性价

    2024年02月01日
    浏览(44)
  • 神经网络:训练模型+转化为k210上跑的kmodel

    目录 前言 第一种 第二种 第三种 第四种 结语

    2024年02月16日
    浏览(37)
  • Maix Bit(K210)保姆级入门上手教程---自训练模型之云端训练

    Maix Bit(K210)保姆级入门上手教程—环境搭建 Maix Bit(K210)保姆级入门上手教程—外设基本使用 这是K210快速上手系列文章,主要内容是,介绍MaixHub这个线上训练模型的使用,以及如何部署到K210中。 阅读本文的前提:读者对基本的监督式学习有一定的了解,之道学习率、迭

    2024年02月16日
    浏览(80)
  • K210 Mx-yolov3模型训练和物体识别

    一、简介        (1)硬件准备:               K210开发板:拥有1TOPS算力,可以运行神经网络模型,同时其提供在线模型训练平台(maixhub),支持物体分类和物体识别。        (2)软件环境               Mx-yolov3:(用于在本地训练模型)             

    2024年02月15日
    浏览(40)
  • 智能送药小车(二)——K210物体检测,训练模型与部署

    线上训练模型参考这篇: Maixhub模型训练平台整体流程 下面仅介绍利用Mx-yolov3训练模型并部署在k210上的整体流程。 利用K210采集数据集 使用说明:插上合适的SD卡(最大32GB),采集不同类别图像时要在代码相应位置进行修改(有注释提示),程序运行后按下KEY会进行图像采集

    2024年02月14日
    浏览(41)
  • 【K210】K210学习笔记五——串口通信

    本人大四学生,电赛生涯已经走到尽头,一路上踩过不少坑,但运气也不错拿了两年省一,思来想去,决定开始写博客,将电赛经验分享一二,能力有限,高手轻喷。 往期的博客讲述了 K210 的感光元件模块 sensor 的配置,机器视觉模块 image 中部分函数的使用(目前是用 find

    2024年04月28日
    浏览(46)
  • 【K210】K210学习笔记二——image

    本人大四学生,电赛生涯已经走到尽头,一路上踩过不少坑,但运气也不错拿了两年省一,思来想去,决定开始写博客,将电赛经验分享一二,能力有限,高手轻喷。 本篇主要是介绍 K210 上的 image 机器视觉模块。如果你要使用 K210 来进行一些颜色追踪( 比如识别黑色,传回

    2024年02月16日
    浏览(44)
  • Mx-yolov3+Maixpy+ K210进行本地模型训练和目标检测

    我接触K210同样也是因为一次比赛,需要进行目标检测并对垃圾进行分类,在接触到K210之前我一直使用各种YOLO版本检测,并部署到树莓派和nano上,一次偶然的机会,我发现了K210,这里要感谢我的一位学长,是他带着我开始了K210的学习,让我从盲目的命令行指令转到Maxipy上使

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包