k210——Maixhub 云端模型训练
一、前言
k210的模型训练可以在Maixhub 上进行,只需要准备好需要训练的数据集, 不需要搭建训练环境和代码, 上传训练数据即可快速训练出模型。
Maixhub 有分类模型和目标检测模型训练,我们只要确定训练的类型,然后制作数据集,上传到云端进行训练就可以了。
二、获取数据集
数据集可以直接在Maixhub 云端制作,也可以用labelimg标注,用labelimg标记要按照Maixhub要求的文件格式上传压缩包,具体可以在Maixhub里面看见,如果直接在Maixhub上传图片在那里标注也可以。
数据集图片可以拍摄一小段视频,然后到这个网站转成图片的格式https://www.img2go.com/,这样很方便,不用一张一张拍很麻烦,视频最好三十多秒不要超过四十秒,因为每次下载最多下载四百张图片,超出不能下载,又得重新拍,大概10秒一百张左右,视频转成图片的时候要记得修改图片的大小,比如我需要的图片是224*224就改成这个。
然后就点击创建任务,修改相应的参数,然后就可以开始训练了
训练得很快,训练结束后就可以开始部署了,我选择手动部署
下载得到模型文件,解压后文件夹里面有以下三个文件
可以将.kmodel下载到sd卡,这里我是将.kmodel文件用kflash_gui软件下载到flash里面,k210的flash是0x300000,所以在下载的时候要注意修改一下地址
main.py是脚本文件,可以直接将其复制到maixpy IDE软件里面运行,然后就看到识别效果了,这里我结合了串口通信,用usb转ttl模块,识别到一次物体就从k210上发送数据到串口助手里。以下是代码和实验结果。
三、代码和结果
代码的编写流程和main.py的差不多,lcd初始化,摄像头初始化,加载模型在YOLO初始化,进入while循环,读取图像,运行YOLO,画矩形框,显示标签,串口发送,打印到lcd。
import sensor, image, lcd, time
import KPU as kpu
import gc, sys
from machine import UART
from fpioa_manager import fm
#重映射串口
fm.register(10, fm.fpioa.UART1_TX, force=True)
fm.register(9, fm.fpioa.UART1_RX, force=True)
uart_A = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)#串口初始化
labels = ['bottle'] #标签
anchors = [3.81, 5.5, 3.58, 5.3, 4.03, 5.78, 2.98, 4.12, 4.19, 5.66] #锚点
lcd.init(type=1) #初始化LCD
sensor.reset() #初始化单目摄像头
sensor.set_pixformat(sensor.RGB565) #设置帧格式
sensor.set_framesize(sensor.QVGA) #设置帧大小
sensor.set_windowing((224, 224))
sensor.set_hmirror(0) #设置摄像头镜像
sensor.set_vflip(0) #设置摄像头垂直翻转
sensor.run(1) #使能摄像头,开始抓取图像
task = kpu.load(0x300000) #从flash或者文件系统中加载模型,不需要关键词,传入参数即可,比如0x300000;"/sd/m.kmodel"
kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) #初始化yolov2
while(True):
img = sensor.snapshot() #读取一帧图像
t = time.ticks_ms() #记录当前时间
objects = kpu.run_yolo2(task, img) #运行yolo2, 返回一个kpu_yolo2_find 列表
t = time.ticks_ms() - t #记录当前时间,与上一次的做差,得到运行一帧需要的时间
if objects:
for obj in objects: #列表不为空的话,遍历并画出个矩形框
pos = obj.rect() #rect类的变量为左上角点的坐标和矩形的宽和高,(x,y,width,height)
a = img.draw_rectangle(pos) #在图像上绘制一个矩形。此处为作为元组传递回坐标框出矩形
#传回的是检测到的图像的四个坐标
img.draw_string(pos[0], pos[1], "%s : %.2f" %(labels[obj.classid()], obj.value()), scale=2, color=(255, 0, 0))#矩形框左上角显示标签和准确率
uart_A.write(labels[obj.classid()]+'\r\n') #将识别到的物体标签发送到串口助手
img.draw_string(0, 200, "t:%dms" %(t), scale=2, color=(255, 0, 0)) #在图像上显示时间
lcd.display(img) #将图像打印到lcd上
a = kpu.deinit(task) #反初始化,kpu_load 返回 kpu_net 对象
效果:
版权归原作者 山野的风. 所有, 如有侵权,请联系我们删除。