使用K210训练yolov5s模型识别数字和红绿灯

前言
最近在玩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文件,中,下次开发板开机上电会自动执行这个文件

1、识别数字


2、识别红绿灯