[Vision Board创客营]--使用openmv识别阿尼亚

文章目录

  • [Vision Board创客营]使用openmv识别阿尼亚
    • 介绍
    • 环境搭建
    • 训练模型
      • 上传图片
      • 生成模型
    • 使用
    • 结语

[Vision Board创客营]使用openmv识别阿尼亚

🚀🚀五一和女朋友去看了《间谍过家家 代号:白》,入坑二刺螈(QQ头像也换阿尼亚了😄 😆 😊 😃),刚好不知道做什么项目来交作业,突然想到可以做一个阿尼亚识别器,于是有了这篇文章。

🚀🚀水平较菜,大佬轻喷。😰😰😰

介绍

🚀🚀Vision-Board 开发板是 RT-Thread 推出基于瑞萨 Cortex-M85 架构 RA8D1 芯片,为工程师们提供了一个灵活、全面的开发平台,助力开发者在机器视觉领域获得更深层次的体验。

🚀🚀Vision Board搭载全球首颗 480 MHz Arm Cortex-M85芯片,拥有Helium和TrustZone技术的加持。SDK包里集成了OpenMV机器视觉例程,配合MicroPython 解释器,使其可以流畅地开发机器视觉应用。

img

环境搭建

🚀🚀环境搭建可以查看这个Vision Board 环境搭建文档(https://docs.qq.com/doc/DY2hkbVdiSGV1S3JM),特别需要注意的就是,版本一定要新,我使用之前老版的RASC是不行的,如果开发过程中遇到奇奇怪怪的问题,可以首先检查自己版本的问题。

🚀🚀我们使用openmv只需要烧录官方的openmv demo就好了,官方视频教程以及文档已经很详细了,我就不重复介绍了,只需要把demo烧录进来就好了。

训练模型

🚀🚀训练模型我们使用的是edge impulse (https://studio.edgeimpulse.com/),首先准备大量的阿尼亚图片作为数据集,这里我测试的时候只选了11张,肯定是太少了,大家可以多几张,这样效果会更准确,识别精度更高,我这里只是测试学习用的,大家请勿模仿。

在这里插入图片描述

🚀🚀然后我们还需要准备一份其他的图片用来训练,因为训练模型必须两类及以上,这里我选择了几张花园宝宝的图片(就不一一展示了),大家可以自己更换其他的:

在这里插入图片描述

🚀🚀之后我们进入edge impulse,进行简单的设置,选择One label per data item(每个数据项一个标签)以及M7,然后就可以上传图片进行训练了。

在这里插入图片描述

上传图片

🚀🚀选择图片进行上传,我们先上传阿尼亚的图片。

🚀🚀这个地方注意,如果上传失败,大概率网络问题,要关闭加速器(神奇,我特地开的加速器😰)。

在这里插入图片描述

🚀🚀再上传其他的,如下所示:

在这里插入图片描述

生成模型

🚀🚀之后就到impulse design里面训练模型,差不多一直默认就好,比较简单。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

🚀🚀训练结束就好了,然后直接生成模型。

在这里插入图片描述

🚀🚀就会有一个压缩包下载,我们打开压缩包就能发现模型,到这里,训练模型部分就结束了。

在这里插入图片描述

使用

🚀🚀然后我们把labels.txt和trained.tflite放入openmv的SD里面去,同时需要新建一个captures文件夹用来存放图片,复制py文件到openmv IDE 里面去,就可以直接运行了,这里我对自动生成的程序做了一点修改,加上了LED灯,拍摄以及红框,结果如下(简陋的代码,甚至没封装,太懒了😭😭😭):

# This work is licensed under the MIT license.
# Copyright (c) 2013-2023 OpenMV LLC. All rights reserved.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Hello World Example
#
# Welcome to the OpenMV IDE! Click on the green run arrow button below to run the script!import sensor, image, time, os, tf, uos, gc
from machine import LEDsensor.reset()                         # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565)    # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA)      # Set frame size to QVGA (320x240)
sensor.set_windowing((240, 240))       # Set 240x240 window.
sensor.skip_frames(time=2000)          # Let the camera adjust.net = None
labels = None
led = LED("LED_BLUE")try:# load the model, alloc the model file on the heap if we have at least 64K free after loadingnet = tf.load("trained.tflite", load_to_fb=uos.stat('trained.tflite')[6] > (gc.mem_free() - (64*1024)))
except Exception as e:print(e)raise Exception('Failed to load "trained.tflite", did you copy the .tflite and labels.txt file onto the mass-storage device? (' + str(e) + ')')try:labels = [line.rstrip('\n') for line in open("labels.txt")]
except Exception as e:raise Exception('Failed to load "labels.txt", did you copy the .tflite and labels.txt file onto the mass-storage device? (' + str(e) + ')')clock = time.clock()last_capture_time = time.time()
while(True):clock.tick()img = sensor.snapshot()for obj in net.classify(img, min_scale=1.0, scale_mul=0.8, x_overlap=0.5, y_overlap=0.5):img.draw_rectangle(obj.rect())# This combines the labels and confidence values into a list of tuplespredictions_list = list(zip(labels, obj.output()))x1, y1, w1, h1 = obj.rect()margin = 10  # 设置一个边距,避免紧贴头像边缘x1 += marginy1 += marginw1 -= margin * 2h1 -= margin * 2if (predictions_list[0][1] > 0.95):img.draw_rectangle((x1, y1, w1, h1), color=(255, 0, 0))  # 在检测到的对象周围绘制红色矩形框led.on()print("Anya")print("********")if time.time() - last_capture_time >= 2:  # 检查距离上次拍照是否已经超过两秒img.save("/captures/Anya_capture_%s.jpg" % str(time.time()))  # 使用时间戳作为文件名保存图片last_capture_time = time.time()  # 更新上次拍照时间print("Shooting a photo of Anya was successful")else:led.off()print("Other")print("********")

🚀🚀然后我们运行看一下结果:

🚀🚀我们注意到4个地方,一个是终端打印了Anya,第二个是拍照功能,第三个是红框,第四个是LED灯亮了。

在这里插入图片描述

🚀🚀我们打开文件夹看一下拍摄的图片:

在这里插入图片描述

🚀🚀差不多到这里就结束了,模型训练其实还不是很准,大家可以多高一点数据集,不要像我这样懒。

结语

🚀🚀因为是第一次接触,所以很多地方不太懂,请大家见谅,不过这个确实很好玩,哈哈哈!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在prompt使用占位符实现提高信息替换成功率和替换位置准确率【prompt】【LLM】

文章目录 问题占位符解决 问题 造数据集的时候遇到的,llm不能很好的帮你替换,替换的内容不对,或者是替换的位置不对,比如这里就是替换位置不对,只盯着doc2替换,无视你的替换位置的变化。 待处理文本 {&quo…

函数作用域(局部变量和全局变量)(狠狠爱住啦)

在Python中,变量可以分为局部变量和全局变量两种类型,它们的作用域不同,对于程序的执行有着不同的影响。 在函数内部定义的变量属于局部作用域,在函数外部定义的变量属于全局作用域。在函数内部,可以使用 global 关键…

小程序地理位置接口申请教程来啦4步学会

小程序地理位置接口有什么功能? 如果我们提审后驳回理由写了“当前提审小程序代码包中地理位置相关接口( chooseAddress、getLocation )暂未开通,建议完成接口开通后或移除接口相关内容后再进行后续版本提审”,如果你也碰到类似问题&#xff…

电火灶是燃气灶吗?节能、环保效果怎么样?

随着科技的进步,厨房中的传统设备也逐步被新型、高效且环保的设备所替代。电火灶,作为一种新型的电火烹饪设备,逐渐进入人们的视野。那么,电火灶是否与传统的燃气灶有所区别?其节能与环保效果又如何呢?下面…

使用 Spring Boot 构建 RESTful API 的最佳实践

在现代的软件开发中,构建高效、稳定的 RESTful API 是非常重要的一环。Spring Boot 是一个流行的 Java 开发框架,它提供了简化开发的工具和约定,使得构建 RESTful API 变得更加简单和快速。 本文将介绍使用 Spring Boot 构建 RESTful API 的…

2024.5.8 关于 SpringCloud —— Ribbon 的基本认知

目录 Ribbon 负载均衡原理 工作流程 Ribbon 负载均衡规则 Ribbon 负载均衡自定义化 代码方式修改规则 配置文件方式修改规则 小总结 Ribbon 设定饥饿加载 Ribbon 负载均衡原理 工作流程 order-service 使用 RestTemplate 发送请求,随后该请求将会被 Ribbon 所…

【强训笔记】day20

NO.1 思路&#xff1a;先判断能对砍几个回合&#xff0c;取最小值&#xff0c;因为回合数是整数&#xff0c;所以可能存在都大于0的情况&#xff0c;再判断一下如果都存活就再对砍一次&#xff0c;直到一家存活或者都死亡。 代码实现&#xff1a; #include<iostream>u…

土地档案管理关系参考论文(论文 + 源码)

【免费】javaEE土地档案管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89296786 土地档案管理关系 摘 要 研究土地档案管理关系即为实现一个土地档案管理系统。土地档案管理系统是将现有的历史纸质档案资料进行数字化加工处理&#xff0c;建成标准化的…

TikTok海外运营:云手机的四种快速变现方法

随着TikTok用户基数的持续扩大&#xff0c;这个平台已成为全球创业者和品牌的新战场。其用户群接近20亿&#xff0c;并以年轻用户为主力军&#xff0c;市场渗透率逐年攀升。无论是大型组织、知名品牌&#xff0c;还是个人创业者&#xff0c;都无法忽视TikTok所带来的巨大商机。…

视频监控系统中,中心录像服务器的录像文件实际大小和理论值相差很大的问题解决

目录 一、现象描述 二、视频监控的录像文件计算 &#xff08;一&#xff09;计算方法 1、仅视频部分 2、视频和音频部分 3、使用平均码率 &#xff08;二&#xff09;计算工具 1、关注威迪斯特公众号 2、打开“计算容量”的小工具 三、原因分析 &#xff08;一&…

SharePoint 使用renderListDataAsStream方法查询list超过5000时的数据

问题&#xff1a; 当SharePoint List里的数据超过5000时&#xff0c;如果使用常用的rest api去获取数据&#xff0c;例如 await this.sp.web.lists.getByTitle(Document Library).rootFolder.files.select(*, listItemAllFields).expand(listItemAllFields).filter(listItemA…

Python多线程与互斥锁模拟抢购余票的示例

一、示例代码&#xff1a; from threading import Thread from threading import Lock import timen 100 # 共100张票def task():global nmutex.acquire() # 上锁temp ntime.sleep(0.1)n temp - 1print(购票成…

语音网关有哪些?

语音网关是一种网络设备&#xff0c;它使得通过传统的电话网络&#xff08;如公共交换电话网络&#xff0c;PSTN&#xff09;和现代的数据网络&#xff08;如互联网或私有数据网络&#xff09;进行的语音通信成为可能。语音网关的主要作用是在模拟或数字电话信号与数据网络的数…

python基础--推导式和拆包

推导式和拆包 推导式 这是一个快速地生成数据的方式 比如在数组里面存1, 3, 5…99 [x for x in range(1, 100) if x % 2 0]只一个不可以生成元组, 可以用于列表, 字典和集合 这一个循环是可以嵌套的 [(x, y) for x in range(1, 3) for y in range(3)] [(1, 0), (1, 1), (…

论文 学习 Transformer : Attention Is All You Need

目录 概述&#xff1a; 对摘要的理解&#xff1a; 框架解析 按比例缩放的点积注意力 多头注意力机制 前馈神经网络与位置编码 概述&#xff1a; transformer 是一个encoder ——decoder 结构的用于处理序列到序列转换任务的框架&#xff0c;是第一个完全依赖自注意力机制…

1分钟搞定Pandas DataFrame创建与索引

1.DataFrame介绍 DataFrame 是一个【表格型】的数据结构,可以看作是【由Series组成的字典】(共用同一个索引)。DataFrame 由按一定顺序排列的多列数据组成。设计初衷是将 Series 的使用场景从一维扩展到多维。DataFrame 既有行索引,也有列索引。 行索引:index 列索引:co…

2万字干货:如何从0到1搭建一套会员体系(2)

2.用户等级 还是一样&#xff0c;我们为什么要搭建用户等级&#xff1f; 一个国家有几亿人口的时候你怎么来管理&#xff1f;老祖宗秦始皇给出了我们答案&#xff1a;郡县制。发展到现在则演进成了省-市-区县-乡镇(街道)-村(社区)5层行政治理结构。 产品同理&#xff0c;当你…

贪心算法----摆动序列

今日题目&#xff1a;leetcode376 点击跳转题目 观察样例2&#xff1a; 发现最长摆动序列都是极大值和极小值 再加上两个端点&#xff0c;那么我们保证每次都能选择到每个极值点&#xff0c;就能从局部最优推广全局最优了&#xff01; 但是还有一些细节情况需要注意&#xff…

P2036 PERKET

题目描述: Perket 是一种流行的美食。为了做好 Perket&#xff0c;厨师必须谨慎选择食材&#xff0c;以在保持传统风味的同时尽可能获得最全面的味道。你有 &#x1d45b;n 种可支配的配料。对于每一种配料&#xff0c;我们知道它们各自的酸度 &#x1d460;s 和苦度 &#x1…

Android内核之解决报错:error: ISO C90 forbids mixing declarations and code(七十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…