K210入门,模型训练+MaixPy调用模型
本人使用的是Maix Dock,不同开发板自行进行微调
模型训练
首先先去GITHUB上将yolo-for-k210项目转移到码云方便下载。
跳转链接github →yolo-for-k210
然后看着作者的介绍一步一步把自己的环境搭建好再把相关工具下载好,比如:ncc,注意在准备环境的时候要 把pip源更换成国内源! 然后按照提示一步一步走下去…
MaixPY
将训练好的模型转换成Kmodel后,去下载对应的固件,这里我使用的是官方的 maixpy_v0.5.0_22_g7ac6b09.bin 对应的下载链接在这里 → 固件下载链接
在下载好固件后将固件和模型依次烧入到板子里我发现,板子是不能正常工作的所以这里将模型和固件打包到一个文件下成为一个新文件 (.kfpkg)
这里注意将kmodel的地址设置为0x300000,固件的地址设置为0x000000。然后将 .kfpkg 烧入到板子里。
然后打开MaixPY将下列代码放入工作区↓
from fpioa_manager import *
from Maix import GPIO #从包 Maix 导入了 GPIO 这个类
import sensor,image,lcd,time #导入sensor、image、lcd、time模块
import KPU as kpu
task = kpu.load(0x300000) #从flash或者系统文件中加载模型,这里为模型在 flash 中的偏移大小为:0x3000000
fm.register(board_info.LED_R, fm.fpioa.GPIO0) #把 fm.fpioa.GPIO0 注册到了 引脚 board_info.LED_R
led_r=GPIO(GPIO.GPIO0, GPIO.OUT) #把GPIO0设置成输出
lcd.init(freq=15000000) #初始化LCD(freq为SPI通信速率)
sensor.reset() #初始化单目摄像头
sensor.set_pixformat(sensor.RGB565) #设置帧格式
sensor.set_framesize(sensor.QVGA) #设置帧大小
sensor.set_hmirror(1) #开启水平镜像
sensor.set_vflip(1) #开启垂直镜像
sensor.set_windowing((224, 224))
sensor.set_brightness(2) #设置亮度(范围为[-2~2])
#sensor.set_contrast(-1) #设置对比度(范围为[-2,+2])
#sensor.set_auto_gain(1,2) #设置摄像自动增益模式
sensor.run(1) #图像捕捉控制(1:开始捕捉;0:关闭捕捉)
clock = time.clock() #获取clock对象
classes = ['huanxiong']
anchor = (1, 1.2, 2, 3, 4, 3, 6, 4, 5, 6.5)
a = kpu.init_yolo2(task, 0.17, 0.3, 5, anchor) #为yolov2网络模型传入初始化参数
#(task, 0.17, 0.3, 5, anchor)分别为 kpu网络对象、概率阙值、box_iou门限、锚点数、锚点参数与模型参数一致
while(True):
clock.tick() #记录开始时间(ms)
img = sensor.snapshot() #使用摄像头拍摄一张照片
#lcd.display(img) #在液晶屏上显示一张 image
code = kpu.run_yolo2(task, img) #task为 kpu_load 返回的 kpu_net 对象
#img为从sensor 采集到的图像
#run_yolo2返回的值为kpu_yolo2_find 的列表
print("FPS当前为:",clock.fps()) #clock.fps于clock.tick搭配使用计算帧率
if code:
for i in code:
a=img.draw_rectangle(i.rect()) #在图像上绘制一个矩形。此处为作为元组传递回坐标框出矩形
#传回的是检测到的图像的四个坐标
a = lcd.display(img) #在液晶屏上显示被框框框起来的image
led_r.value(0) #如果检测到物体就亮LED灯
print("物体是:",classes[i.classid()])#打印出识别的类别
print("概率为:",100.00*i.value())#打印出置信度
for i in code:
lcd.draw_string(i.x(), i.y(), classes[i.classid()], lcd.RED, lcd.WHITE)
#在左上角打印出id
lcd.draw_string(i.x(), i.y()+12, '%f1.3'%i.value(), lcd.RED, lcd.WHITE)
#在左上角打印出置信度
else:
a = lcd.display(img) #如果没有识别出物体,则继续呈现图像
led_r.value(1) #如果没有检测到物体就灭LED灯
a = kpu.deinit(task) #反初始化。kpu_load 返回 kpu_net 对象
这里加上了控制板子上的LED灯代码,实现识别到图像LED亮灯,没识别到图片LED灯灭的功能,后期可以再拓展为识别到图像通过wifi与上位机进行通讯。
训练集是一组干脆面君
效果图如下:
识别到目标:
没识别到目标:
后期模型的识别精度还可以调整,或者使用YOLOV4或者更优秀的模型。
————————————————
版权声明:本文为CSDN博主「Yiiiiiiu、」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45010829/article/details/109398701