手把手在K210上部署自己在线训练的YOLO模型

小白花了两天时间学习了一下K210,将在线训练的模型部署在K210(代码后面给出)上,能够识别卡皮巴拉水杯(没错,卡皮巴拉,情绪稳定,真的可爱!)。数据集是用K210拍摄的图片存储在SD卡中(拍照采集数据集代码后面会给出),然后传至云端训练。将过程记录作为笔记学习,希望能对大家的学习有所帮助。

本文分为在线训练部署代码两部分。

在线训练

在线训练进入MaiHub官网(需要注册账号)。

点击开始训练

如果之前没用过的话,点击新建训练

我是检测卡皮巴拉水杯,所以选的图像检测,只是想试试的小伙伴建议跟我选一样,后面给出的代码可以直接运行。

此时点击准备数据集

没使用过的伙伴直接点击创建数据集就行

新建好数据集后会发现多出了新建那个名字,选择该数据集点击确定就行。

数据集下面有采集数据和标注数据两个步骤,先点击采集数据。

采集数据下面出现5个选项,我采用的是上传图片,因为是用K210搭配摄像头拍摄的图片。然后点击选择图片,会弹出文件框,将采集的图片全选上传。

这个图片我建议用K210搭配摄像头拍摄采集,因为这样的图片更符合实际摄像头读取的图片。
采集代码如下,每按一次按键就拍摄一张图片:

import sensor, lcd, image
from Maix import GPIO
from fpioa_manager import fm
from machine import UART
import time

# 配置LED蓝、红引脚
fm.register(12, fm.fpioa.GPIO0, force=True)
fm.register(14, fm.fpioa.GPIO1, force=True)
LED_B = GPIO(GPIO.GPIO0, GPIO.OUT, value=1) # 构建LED对象
LED_R = GPIO(GPIO.GPIO1, GPIO.OUT, value=1) # 构建LED对象

# 配置按键引脚
fm.register(16, fm.fpioa.GPIO1)
KEY = GPIO(GPIO.GPIO1, GPIO.IN)

# 摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1) # 设置为后置模式

lcd.init() # LCD初始化

# clock = time.clock()

i = 0 # 图像命名索引

while True:
    # clock.tick()
    img = sensor.snapshot()  # 拍摄照片
    lcd.display(img) # 实时显示摄像头图像
    # print(clock.fps()) #打印 FPS
    if KEY.value() == 0: # 按键按下
        # 蓝灯亮提示正在拍照
        LED_B.value(0)
        print(i)
        # 拍摄并保存相关文件,按顺序命名
        file_name = "/sd/example{}.jpg".format(i)
        img.save(file_name)
        LED_B.value(1) # 蓝灯灭提示拍照完成
        i += 1 # 索引递增
        time.sleep(0.5) # 添加短暂延时,防止按键抖动
        

我拍了131张图片,前121张作为训练集,后10张作为验证集。

图片上传完成之后就标注数据

将所有的标签标注完就可以了

基本上都是默认设置,但我使用的是K210,所以部署平台是nncase,之后创建任务开始训练。

部署代码

训练完成后选择手动部署,会下载一个压缩包。压缩包解压后有3个文件如下:

一开始我是将这三个文件放在SD卡进行运行,后来老是报错运行内存不足,试了很多办法(没错,你们试过的方法我都试过,包括增大GC内存,降低分辨率等等)都没用,就自己写了个调用.kmodel的代码,可以直接运行。代码如下:
 

import sensor,lcd,time
import KPU as kpu

#设置摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
input_size = (224, 224)
sensor.set_windowing(input_size)
sensor.set_vflip(1)    #设置摄像头后置

# 新添加
input_size = (224, 224)
labels = ['卡皮巴拉']

lcd.init() #LCD初始化

clock = time.clock()

#1、从Flash加载模型。将模型烧录到开发板Flash。烧录方法参考pdf教程。
#task = kpu.load(0x300000)

#2、从SD加载模型卡上。将kmodel文件通过读卡器拷贝到SD卡。
# task = kpu.load("/sd/facedetect.kmodel")
task = kpu.load("/sd/model-110097.kmodel")
#模型描参数
# anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
anchor = [2.69, 3.02, 3.28, 2.98, 4.56, 4.03, 2.0, 1.72, 3.72, 3.66]
#初始化yolo2网络
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)

while(True):
    clock.tick()
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img) #运行yolo2网络

    #识别到卡皮巴拉就画矩形表示
    if code:
        for i in code:
            print(i)
            #b = img.draw_rectangle(i.rect())
            pos = i.rect()
            img.draw_rectangle(pos)
            img.draw_string(pos[0], pos[1] + pos[3] + 5, "ka pi ba la", scale=2, color=(255, 0, 0))  # 在方框下方显示标签名字
            img.draw_string(pos[0], pos[1], "%.2f" %(i.value()), scale=2, color=(255, 0, 0), mono_space = False)

    #LCD显示
    lcd.display(img)

    print(clock.fps())   #打印FPS

代码很简单,不懂的地方可以评论交流。

运行效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/502989.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++:一次性搞定vector模拟实现中必须关注的细节

vector模拟实现的细节 1. vector的模拟实现源码2. 重要接口注意事项2.1 const修饰2.2 begin()和end()2.3 构造函数(1)迭代器区间初始化(2)构造函数冲突问题发现​问题分析问题​解决问题 (3)特殊的构造函数…

LDR6023,大功率OTG快充芯片,引领充电新时代!

在科技日新月异的当下,数据交互方式已经深入我们生活的每一个角落,对日常生活和工作产生着无可替代的影响。然而,在OTG技术诞生之前,数据交互的过程常常显得繁琐且耗时。想象一下,需要将数码相机中的照片导入笔记本电脑…

《科技创新与应用》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答: 问:《科技创新与应用》是什么级别期刊? 答:省级;主管单位:黑龙江省科学技术协会;主办单位:黑龙江省创联文化传媒有限公司 问:《科技创新与应用》是核心期刊…

查找链表中的中间结点

略。。。。。 提升题的难度,不知道输入数据节点的个数。 方法一:对链表进行两次遍历。第一次遍历时,我们统计链表中的元素个数 N;第二次遍历时,我们遍历到第 N/2 个元素时,将该元素返回即可。 方法二&am…

粉丝免费福利第一期-海浪型手机支架

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师,大模型,爬虫、ACM算法 💒 公众号&#xff…

不小心将某个分支的本地代码推到另外一个远程分支上

不小心将某个分支的本地代码推到另外一个远程分支上,是不会产生效果的,若提示了“Everything up-to-date ”,说明没有内容被提交到了远程,某个分支的本地代码仍然在本地仓库。 若想将改动的代码提交到另外一个远程分支上&#xf…

不懂技术的老板,如何避免过度依赖核心技术人员

在这个日新月异、技术驱动的时代,即使作为非技术背景的老板,也深知核心技术人员的价值。然而,过度依赖某几位核心技术人员,不仅可能带来经营风险,还可能限制企业的创新与发展。那么,不懂技术的老板&#xf…

【python基础教程】2. 算法的基本要素与特性

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:python基础教程 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、…

创建第一个51文件

1.找一个文件目录创建一个main.c 比如我的 F:\my_project\project_of_51\0.first_of_51 什么你不会? 先把这里的文件扩展名打开; 再创建一个文本文件,重新命名为main.c // 修改.c 后弹出一个确认修改的框,选确认即可 2.kei操作: 1&#xf…

学生成绩管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文(设计)学生选题参考合集推荐收藏(包含Springboot、jsp、ssmvue等技术项目合集) 1. 管理员功…

Taskflow:条件任务(Conditional Tasking)

基本使用 条件任务评估一组指令&#xff0c;并返回要执行的下一个后续任务的整数索引。 该索引是根据其继任者结构的顺序定义的&#xff0c;首先&#xff0c;创建一个最简单的if else条件模块: #include <taskflow/taskflow.hpp>int main() {tf::Taskflow taskflow;tf:…

暴力破解pdf文档密码

首先安装pdfcrack工具包 apt install pdfcrack 默认密码字典存储在/usr/share/wordlists里&#xff0c;是gz文件&#xff0c;将它解压并copy到pdf目录 然后使用pdfcrack破解 密码在最后一行user-password的单引号里

计算机网络——31数据链路层和局域网引论和服务

数据链路层和局域网 WAN&#xff1a;网络形式采用点到点链路 带宽大&#xff0c;距离远&#xff08;延迟大&#xff09; 贷款延迟积大 如果采用多点连接方式 竞争方式&#xff1a;一旦冲突代价大令牌等协调方式&#xff1a;在其中协调节点的发送代价大 点到点链路的链路层服…

基于SpringBoot和Vue的教学管理系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的教学管理系统的设计与实现 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&#x1f…

理解游戏服务器架构-逻辑底层架构

目录 前言 什么是逻辑底层架构 逻辑底层架构的职责 1&#xff09;Thread-线程 线程管理 线程通讯 线程安全锁机制 2&#xff09;Network-网络 网络模型 网络消息协议 断线重连 网络安全 防范重复消息 防范篡改消息内容 防范篡改内存数据 网络承载 3&#xff0…

使用nvm管理nodejs版本

文章目录 1、下载NVM2、选择NVM安装3 、查询版本号&常用命令4、nvm命令安装指定版本node4.1 安装指定node4.2 查看是否安装成功4.3 切换node版本到你想要的版本4.4 再次查看nvm版本列表4.5 nvm其他常用命令 这个是每个全能前端经常会用到的&#xff0c;之前用过现在重装了&…

基于SSM的戒烟网站(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的戒烟网站&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMv…

新能源汽车充电桩常见类型及充电桩站场的智能监管方案

随着新能源汽车市场的迅猛发展&#xff0c;充电桩作为支持其运行的基础设施&#xff0c;也呈现出多样化的类型。这些充电桩不仅在外形和功能上存在差异&#xff0c;更在充电速度、充电方式以及使用场景等方面展现出独特的优势。 一、充电桩类型及区别 1、慢充桩&#xff08;交…

Android 12系统源码_多窗口模式(一)和多窗口模式相关方法的调用顺序

前言 从 Android 7.0 开始&#xff0c;Google 推出了一个名为“多窗口模式”的新功能&#xff0c;允许在设备屏幕上同时显示多个应用&#xff0c;多窗口模式允许多个应用同时共享同一屏幕&#xff0c;多窗口模式&#xff08;Multi Window Supports&#xff09;目前支持以下三种…

在 IntelliJ IDEA 中使用 Terminal 执行 git log 命令后的退出方法

前言 IntelliJ IDEA 是一款广受欢迎的集成开发环境&#xff0c;它内置了强大的终端工具&#xff0c;使得开发者无需离开IDE就能便捷地执行各种命令行操作&#xff0c;包括使用 Git 进行版本控制。在 IDEA 的 Terminal 中执行 git log 命令时&#xff0c;由于该命令会显示项目的…