前言
最近在玩K210,所以就用K210训练识别数字和红绿灯的yolov5s模型玩玩了,准确率还是挺高的,有90%以上
一、平台软件
我这里使用的IDE是MaixPy IDE,也是一款开源的软件:MaixPy IDE 安装与使用 - Sipeed Wiki
模型训练用的是MaixHub:MaixHub
二、 采集数据集
你可以选择训练集或者是设备采集好的图片,我这里选择的是用K210拍摄的图片,因为是K210搭载模型去识别,所以不能使用手机拍摄的照片,不然识别率会很低
三、标注数据
快捷键分别是W、S、delete
四、训练模型
K210选择的是nncase平台,选择完平台后就可以点击创建训练任务了
五、模型结果
六、部署模型
模型训练完成后点击部署,选择手动部署,下载模型文件,完成后就得到了训练模型文件,可以下载到sd卡运行,或者上传到开发板运行。
七、模型代码
import sensor, image, lcd, time
import KPU as kpu
import gc, sys
from machine import UART
from fpioa_manager import fm
#设置RXRT引脚
fm.register(9, fm.fpioa.UART1_TX, force=True)
fm.register(10, fm.fpioa.UART1_RX, force=True)
uart_A = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)
FH1 = (‘A’)
FH2 = (‘B’)
FH3 = (‘C’)
FH4 = (‘D’)
FH5 = (‘E’)
FH6 = (‘F’)
FH7 = (‘R’)
FH8 = (‘G’)
input_size = (224, 224)
labels = [‘4’, ‘5’, ‘6’, ‘1’, ‘2’, ‘3’]
anchors = [1.66, 2.28, 2.34, 3.28, 3.13, 4.56, 1.41, 1.81, 1.81, 2.75]
input_size = (224, 224)
labels2 = [‘red’]
anchors2 = [1.88, 1.47, 2.19, 1.81, 1.25, 1.03, 2.62, 2.06, 1.47, 1.44]
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=input_size)
img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))
lcd.display(img)
def main1(anchors, labels = None, model_addr=“/sd/m.kmodel”, sensor_window=input_size, 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:
List_score01 = [0]*6
task = None
task = kpu.load(model_addr)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) # threshold:[0,1], nms_value: [0, 1]
while(True):
img = sensor.snapshot()
t = time.ticks_ms()
objects = kpu.run_yolo2(task, img)
t = time.ticks_ms() - t
if objects:
for obj in objects:
pos = obj.rect()
img.draw_rectangle(pos)
List_score01[int(labels[obj.classid()])-1] += 1
if(List_score01[0] >= 1):
uart_A.write(FH1)
print(1)
List_score01[0] = 0
if(List_score01[1] >= 2):
uart_A.write(FH2)
print(2)
List_score01[1] = 0
if(List_score01[2] >= 5):
uart_A.write(FH3)
print(3)
List_score01[2] = 0
if(List_score01[3] >= 2):
uart_A.write(FH4)
print(4)
List_score01[3] = 0
if(List_score01[4] >= 3):
uart_A.write(FH5)
print(5)
List_score01[4] = 0
if(List_score01[5] >= 5):
uart_A.write(FH6)
print(6)
List_score01[5] = 0
img.draw_string(pos[0], pos[1], "%s : %.2f" %(labels[obj.classid()], obj.value()), 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)
def main2(anchors, labels = None, model_addr=“/sd/m.kmodel”, sensor_window=input_size, 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:
i = 0
task = None
task = kpu.load(model_addr)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) # threshold:[0,1], nms_value: [0, 1]
while(True):
img = sensor.snapshot()
t = time.ticks_ms()
objects = kpu.run_yolo2(task, img)
t = time.ticks_ms() - t
if objects:
for obj in objects:
pos = obj.rect()
num = obj.classid()
if num == 0:
i += 1
if i > 5:
uart_A.write(FH7)
time.sleep(2)
i = 0
print(1)
img.draw_rectangle(pos)
img.draw_string(pos[0], pos[1], "%s : %.2f" %(labels2[obj.classid()], obj.value()), scale=2, color=(255, 0, 0))
else:
uart_A.write(FH8)
print("N")
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:
## main(anchors = anchors, labels=labels, model_addr=0x300000, lcd_rotation=0)
#main(anchors = anchors, labels=labels, model_addr=“/sd/model-49012.kmodel”)
#except Exception as e:
#sys.print_exception(e)
#lcd_show_except(e)
#finally:
#gc.collect()
while(True):
read_data = uart_A.readchar()
print(read_data)
if read_data == 7:
main1(anchors = anchors, labels=labels, model_addr=“/sd/model-49012.kmodel”)
#print()
if read_data == 6:
main2(anchors = anchors, labels=labels, model_addr=“/sd/model-49061.kmodel”)
八、在Maixpy上运行模型和烧录模型到设备K210
打开 MaixPy IDE
, 连接开发板
编辑文件,然后在顶端Tool
(工具)菜单中, 使用顶端Tool
(工具)菜单中的发送文件
功能来发送文件,会保存到开发板并且文件名和电脑上的文件名相同
当然也可以点击将打开的文件保存为 boot.py
来将代码保存到开发板的boot.py
文件,中,下次开发板开机上电会自动执行这个文件