线上训练模型参考这篇: Maixhub模型训练平台整体流程
下面仅介绍利用Mx-yolov3训练模型并部署在k210上的整体流程。
采集图片
利用K210采集数据集
使用说明:插上合适的SD卡(最大32GB),采集不同类别图像时要在代码相应位置进行修改(有注释提示),程序运行后按下KEY会进行图像采集并存放在相应类别的文件夹中。
#import os
#print(os.listdir())
##import os
##os.remove("1.jpg")
from Maix import GPIO
from fpioa_manager import fm
import utime, sensor, image, lcd
# 自定义变量
KeyState = 0 # 按键中断标志位
PicName = 0 # 拍摄照片号
SetWindowing = (224, 224) # 设置图片大小
# 注册 IO,高速 GPIO 口才有中断
fm.register(12, fm.fpioa.GPIO0)
fm.register(16, fm.fpioa.GPIOHS0)
#摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1) #摄像头后置方式
sensor.set_windowing(SetWindowing) # 设置图片大小
lcd.init() #LCD 初始化
clock = utime.clock()
# 初始化IO
LED_B = GPIO(GPIO.GPIO0, GPIO.OUT, value=1)
KEY = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP)
# 按键中断回调函数
def fun(KEY):
global KeyState
utime.sleep_ms(10) #消除抖动
# 当按键按下后
if KEY.value() == 0:
KeyState = 1
# 开启按键中断,下降沿触发
KEY.irq(fun, GPIO.IRQ_FALLING)
while True:
clock.tick()
img = sensor.snapshot()
# 当按键按下,蓝灯闪烁,并存储照片
if KeyState == 1:
KeyState = 0
LED_B.value(0)
utime.sleep_ms(500)
LED_B.value(1)
# 修改目录“/sd/One”
img.save("/sd/One" + str(PicName) + ".jpg")
print(PicName, "CAPTURED!")
PicName+=1
lcd.display(img)
#print(clock.fps())
LabelImg数据集标注
labelimg使用教程参考: 数据集制作——使用labelimg制作数据集
Mx-yolov3训练模型
我安装的是Mx-yolov3的3.0版本
链接:https://pan.baidu.com/s/1Gl3Qfw5s8LZuu2wc1GTITg 提取码:dvsf
使用教程参考的这一篇:MX-Yolov3本地训练模型的安装和使用
K210端物体检测代码
修改的时候注意以下几点:
- sensor.set_windowing((224, 224)) 和训练模型采集图片时保持一致
- classes 名称修改
- task = kpu.load(“/sd/model.kmodel”) 模型名称修改
- 网络参数修改成Mx-yolov3 计算出的anchor
import sensor,image,lcd,time
import KPU as kpu
#摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing((224, 224))
sensor.set_vflip(1) #摄像头后置方式
lcd.init() #LCD初始化
clock = time.clock()
#模型分类,按照20class顺序
classes = ['One', 'Two']
#下面语句需要将模型(20class.kfpkg)烧写到flash的 0x500000 位置
#task = kpu.load(0x500000)
#将模型放在SD卡中。
task = kpu.load("/sd/model.kmodel") #模型SD卡上
#网络参数
anchor = (3.0078, 1.1641, 3.5278, 1.3924, 3.7373, 1.5579, 4.2359, 1.6781, 4.4162, 1.89)
#初始化yolo2网络,识别可信概率为0.7(70%)
a = kpu.init_yolo2(task, 0.7, 0.3, 5, anchor)
while(True):
clock.tick()
img = sensor.snapshot()
code = kpu.run_yolo2(task, img) #运行yolo2网络
if code:
for i in code:
a=img.draw_rectangle(i.rect())
a = lcd.display(img)
lcd.draw_string(i.x(), i.y(), classes[i.classid()], lcd.RED, lcd.WHITE)
lcd.draw_string(i.x(), i.y()+12, '%f1.3'%i.value(), lcd.RED, lcd.WHITE)
else:
a = lcd.display(img)
print(clock.fps())#打印FPS