2023 电赛 E 题 激光笔识别有误--使用K210/Openmv/树莓派/Jetson nano实现激光笔在黑色区域的目标检测

news2024/11/14 4:10:34

1. 引言

1.1 激光笔在黑色区域目标检测的背景介绍

在许多应用领域,如机器人导航、智能家居和自动驾驶等,目标检测技术的需求日益增加。本博客将聚焦于使用K210芯片实现激光笔在黑色区域的目标检测。

激光笔在黑色区域目标检测是一个有趣且具有挑战性的问题。我们将通过使用K210芯片和相关算法,能够准确地检测出激光笔在黑色区域的位置和姿态,以便后续应用。

1.2 K210芯片的概述和优势

K210芯片是由中国公司苏州芯原科技(Sipeed)开发的一款高性能、低功耗的人工智能边缘计算芯片。它采用RISC-V架构,具备强大的计算能力和丰富的外设接口,特别适合用于嵌入式人工智能应用。

K210芯片的主要优势包括:

  • 高性能:K210芯片搭载了双核64位处理器和一颗专门的神经网络加速器,可以实现快速而高效的神经网络推断。
  • 低功耗:K210芯片采用先进的低功耗设计,能够在边缘设备上实现节能运行和长时间使用。
  • 丰富的外设接口:K210芯片具备多种外设接口,如摄像头和显示器接口,方便与其他硬件设备进行连接和交互。
  • 开源优势:K210芯片使用RISC-V架构,而且软硬件都有开源社区支持,提供了更灵活、可定制的开发环境。

2. 硬件准备

2.1 K210芯片介绍

K210芯片是一款先进的人工智能边缘计算芯片,具备强大的计算能力和丰富的外设接口。为了实现激光笔在黑色区域的目标检测,我们需要准备以下硬件设备:

  • K210开发板:选择一款基于K210芯片的开发板,如Sipeed Maixduino等。
  • 摄像头模块:选择一款兼容K210开发板的摄像头模块,常用的有OV2640和GC0328等。
  • 激光笔:准备一支激光笔,用于在黑色区域绘制目标标记。

2.2 连接摄像头和激光笔

在进行目标检测之前,我们需要将摄像头和激光笔连接到K210开发板上。

首先,将摄像头模块插入到K210开发板的摄像头接口上。确保插入牢固,并注意摄像头的方向。

接下来,将激光笔的电源线与K210开发板的电源接口相连。根据激光笔的规格和开发板的接口类型,选择合适的连接方式,如直插或使用杜邦线连接。

完成连接后,确保所有接口插头都插入正确,并且牢固稳定。这样,我们就完成了摄像头和激光笔与K210开发板的硬件连接。

在进行下一步之前,建议对连接进行检查,确保没有松动或错误连接的情况。

3. 软件准备

3.1 K210开发环境搭建

K210 技术文档

为了开始进行激光笔在黑色区域的目标检测,我们需要搭建K210的开发环境。以下是一些主要的步骤和要求:

官方安装方法

  • 安装MaixPy IDE:MaixPy IDE是一个适用于K210芯片的集成开发环境。您可以从官方网站上下载并安装MaixPy IDE。请确保选择适用于您的操作系统的版本,并按照安装向导进行安装。

  • 安装kflash_gui:kflash_gui是一个用于将固件烧录到K210芯片的图形化工具。您可以在GitHub上找到kflash_gui的源代码,并按照说明进行安装。

  • 固件下载:K210芯片使用的固件是MicroPython的一个分支,称为MaixPy固件。您可以从官方网站或GitHub仓库下载MaixPy固件。请根据您的K210开发板型号和硬件配置选择正确的固件版本。固件下载地址

  • 固件烧录:使用kflash_gui工具,将下载好的MaixPy固件烧录到K210芯片上。连接K210开发板到计算机上,并按照kflash_gui的指南选择正确的端口和固件文件,然后开始烧录过程。

  • 连接硬件设备:在进行激光笔目标检测之前,需要连接适当的硬件设备,例如摄像头或传感器等。根据您的具体需求和硬件配置,确保正确连接硬件设备到K210开发板。

3.2 安装相关Python库

在进行激光笔目标检测之前,我们需要安装一些必要的Python库,安装python用于实现将图片进行标注:

labelimg

pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install PyQt5_tools -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install PyQt5_tools -i https://pypi.tuna.tsinghua.edu.cn/simple

安装结束后,在cmd中输入labelimg,出现弹框即为labelimg页面 

 图1  labelimg 初始界面

 图2  labelimg 标注界面 

4. 模型训练与优化

4.1 数据采集和准备

在开始实现激光笔目标检测算法之前,我们需要进行数据采集和准备。以下是一些主要的步骤:

  • 采集黑色区域图片:使用摄像头模块拍摄一系列黑色区域的图片。确保图片中有激光笔绘制的目标标记,并控制光线和背景条件的一致性。

图3 拍摄的激光笔黑色区域 

  • 标注目标位置:对采集到的图片进行目标位置的标注。可以使用图像标注工具(如LabelImg)来标注目标的边界框,并生成对应的标注文件。

  • 划分训练集和测试集:将采集到的数据分为训练集和测试集。通常将数据的80%用于训练,20%用于测试。

  • 数据增强:对训练集进行数据增强操作,以扩充训练数据的多样性。例如,可以进行随机旋转、翻转、缩放和平移等操作。

完成上述步骤后,您就准备好了用于训练和测试激光笔目标检测算法的数据集。

注意:在对数据集进行采集时,采集的数据要与使用场地的图片一致。比如:该模型要在白天使用,那么就在白天拍摄图片;该模型要在晚上使用,那么就在晚上拍摄图片;该模型要在球场使用,那么就在球场拍摄图片。对于收集的数据量,一般来说,对于一个类别,那就在500张左右。

注意:在进行收集图像时,图像的尺寸大小最好为[640,640] ,尺寸太小或太大都会影响识别的准确率。

4.2 模型选择

为了实现激光笔目标检测,我们需要选择合适的目标检测模型,并进行训练。

对于K210来说,不同的型号使用的最佳模型不同,在官方的模型,使用的模型有yolov2、yolov3、

yolov4、yolov7、yolovx。这些模型,对于一般的K210,建议使用yolov3模型进行训练。当然,模型越高,训练的效果越好,但是要看自己的开发板能否实现。

4.3 模型训练

可以在线训练和本地训练两种方法。

K210:

Maixhub 模型训练 - Sipeed Wiki

K210 在线训练 官网

本地模型训练 for Linux - Sipeed Wiki

本地训练 for windows - Sipeed Wiki

Openmv:

OpenVINO应用案例:部署YOLO模型到边缘计算摄像头_将算法部署到摄像机中_同学来啦的博客-CSDN博客

https://github.com/SingTown/Traffic-Sign-FOMO/blob/main/README-CN.md
 

树莓派:

树莓派4B训练yolo模型

Jetson nano:

https://github.com/SingTown/Traffic-Sign-FOMO/blob/main/README-CN.md

选择模型后,我们可以使用已准备好的数据集对模型进行训练。通常,训练目标检测模型的步骤如下:

  1. 加载数据集:将准备好的数据集导入到模型中,包括训练集和测试集。

  2. 模型初始化:根据选择的模型架构,初始化一个空的目标检测模型。

  3. 优化器选择:选择合适的优化器,如Adam或SGD,用于优化模型参数。

  4. 模型训练:使用训练集数据对模型进行训练,并在每个训练周期(epoch)结束后,使用测试集数据评估模型性能。

  5. 模型保存:在训练过程中,选择合适的检查点(checkpoint)来保存训练过程中的模型参数。

注意:在使用训练时,一般不用修改参数,需要修改的参数为训练轮数、识别类别、GPU是否使用、模型文件、输入图像大小。

完成上述步骤后,一个激光笔目标检测模型就可以使用了。

4.4 模型预测

在模型训练好后,就可以使用训练好的模型进行检测,识别激光笔。

 K210 识别代码

from fpioa_manager import * 
import sensor,image,lcd,time  

import KPU as kpu
task = kpu.load(0x300000)   # 加载模型

lcd.init(freq=15000000) 

sensor.reset()  
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA) 

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 = ['light']

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()    #使用摄像头拍摄一张照片

     code = kpu.run_yolo2(task, img)  #task为 kpu_load 返回的 kpu_net 对象
                                      #img为从sensor 采集到的图像
                                      #run_yolo2返回的值为kpu_yolo2_find 的列表
     if code:
         for i in code:
             a=img.draw_rectangle(i.rect()) #在图像上绘制一个矩形。此处为作为元组传递回坐标框出矩形
                                            #传回的是检测到的图像的四个坐标

             a = lcd.display(img) #在液晶屏上显示被框框框起来的image

             print("物体是:",classes[i.classid()]) # 打印出识别的类别
             print("概率为:",100.00*i.value()) # 打印出置信度

     else:
         a = lcd.display(img) # 如果没有识别出物体,则继续呈现图像

a = kpu.deinit(task) #反初始化。kpu_load 返回 kpu_net 对象

5. 最终效果 

 

图4 模型识别结果

 注意:模型识别的准确度与图片标注的质量和图片数量有关。

硬性的标准其实限制不了无限可能的我们,所以啊!少年们加油吧!

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

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

相关文章

redis发布订阅模型

文章目录 发布与订阅1.频道订阅和退订1.1订阅频道subscribe**伪代码** 1.2 退订频道伪代码 2.模式订阅和退订2.1订阅模式psubscribe2.2 退订模式 3.发送消息3.1 消息发送频道订阅者伪代码 3.2消息发送模式订阅者伪代码 总结的Publish4.查看订阅消息4.1 pubsub channels4.2 pubs…

从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树

目录 从前序与中序遍历序列构造二叉树从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树 题目链接 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返…

深度学习Redis(2):持久化

前言 在上一篇文章中,介绍Redis的内存模型,从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 本文将先说明上述几种技术分别解决了Redis高可用的什么问题;然后详细介绍Redis的持…

8.3 作业 c高级

1.递归实现&#xff0c;输入一个数&#xff0c;输出这个数的每一位&#xff1a; #include<myhead.h>void print_digit(int num) {if(num<10){printf("%d",num);puts("");}else{print_digit(num/10); //递归打印除最后一位外的数printf("%…

10.物联网操作系统之低功耗管理

一。低功耗管理概念及其应用 1.STM32低功耗设计详解 STM32的电源管理系统主要分为&#xff1a; 备份域 调压器供电电路 ADC电源电路 2.低功耗模式 1.运行模式 2.睡眠模式 3.停机模式 4.待机模式 &#xff08;1&#xff09;睡眠模式 在睡眠模式中&#xff0c;仅关闭了内核时钟&…

【计算机网络】网络层协议 -- ICMP协议

文章目录 1. ICMP协议简介2. ICMP协议格式3. ping命令4. ping命令与端口号没有关系&#xff01;&#xff01;&#xff01;5. traceroute命令 1. ICMP协议简介 ICMP&#xff08;Internet Control Message Protocol&#xff0c;控制报文协议&#xff09;&#xff0c;用于在IP主机…

22.Netty源码之解码器

highlight: arduino-light 抽象解码类 https://mp.weixin.qq.com/s/526p5f9fgtZu7yYq5j7LiQ 解码器 Netty 常用解码器类型&#xff1a; ByteToMessageDecoder/ReplayingDecoder 将字节流解码为消息对象&#xff1b;MessageToMessageDecoder 将一种消息类型解码为另外一种消息类…

关于时间的基本概念

年的标准——纪元 Era Epoch 在中国古代&#xff0c; 皇帝会订立年号来纪年&#xff0c; 比如贞观就是唐太宗订立的年号&#xff0c; 于是天下使用贞观元年&#xff0c;贞观二年的方式来纪年。皇帝可以因为各种原因更换年号&#xff0c;比如武则天在位21年&#xff0c; 使用了…

【vue】 el-table解决分页不能筛选全部数据的问题

前言 最近开发前端项目表格的时候&#xff0c;使用的是el-table&#xff0c;用到了对应的筛选功能&#xff0c;如下图所示 但发现实际只能筛选当前页&#xff0c;通过百度查找相关文章&#xff0c;发现原因是把筛选条件定义在列上&#xff0c;解决方法&#xff1a;所以我们把f…

HadoopWEB页面上传文件报错Couldn‘t upload the file course_info.txt

HadoopWEB页面上传文件报错Couldn’t upload the file course_info.txt 右键F2检查发现&#xff1a;文件上传PUT操作的IP地址是节点IP别名识别不到导致 解决方法&#xff1a;在WEB页面访问浏览器所在机器上面配置hosts映射地址(注意:配置的是浏览器访问的地址不是hadoop节点所在…

【项目 进程12】2.25 sigprocmask函数使用 2.26sigaction信号捕捉函数 2.27SIGCHILD信号

文章目录 2.25 sigprocmask函数使用2.26 sigaction信号捕捉函数内核实现信号捕捉的过程信号捕捉特性 2.27SIGCHILD信号 2.25 sigprocmask函数使用 阻塞信号集有时称作信号掩码。 联想&#xff1a;fcntl函数可以修改fd属性。 ./sigprocmask & //将程序设置为后台运行&…

JWT应用功能

JWT 一、 JWT 实现无状态 Web 服务 1、什么是有状态 有状态服务&#xff0c;即服务端需要记录每次会话的客户端信息&#xff0c;从而识别客户端身份&#xff0c;根据用户身份进行请求的处理&#xff0c;典型的设计如tomcat中的session。 例如登录&#xff1a;用户登录后&am…

SpringCloud《Eureka、Ribbon、Feign、Hystrix、Zuul》作用简单介绍

概述 SpringCloud是一个全家桶&#xff0c;包含多个组件。 本文主要介绍几个重要组件&#xff0c;也就是Eureka、Ribbon、Feign、Hystrix、Zuul这几个组件。 一、业务场景介绍 业务流程&#xff0c;支付订单功能 订单服务改变为已支付订单服务调用库存服务&#xff0c;扣减…

Webpack开启本地服务器;HMR热模块替换;devServer配置;开发与生成环境的区分与配置

目录 1_开启本地服务器1.1_开启本地服务器原因1.2_webpack-dev-server 2_HMR热模块替换2.1_认识2.2_开启HMR2.3_框架的HMR 3_devServer配置3.1_host配置3.2_port、open、compress 4_开发与生成环境4.1_如何区分开发环境4.2_入口文件解析4.3_区分开发和生成环境配置 1_开启本地服…

743. 网络延迟时间

有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信号从源节点传递到目标节点的时间。 现在&#xff0c;…

iMX6ULL驱动开发 | OLED显示屏SPI驱动实现(SH1106,ssd1306)

周日业余时间太无聊&#xff0c;又不喜欢玩游戏&#xff0c;大家的兴趣爱好都是啥&#xff1f;我觉得敲代码也是一种兴趣爱好。正巧手边有一块儿0.96寸的OLED显示屏&#xff0c;一直在吃灰&#xff0c;何不把玩一把&#xff1f;于是说干就干&#xff0c;最后在我的imax6ul的lin…

泛微最近的漏洞利用工具

WeaverExploit_All 0x01 介绍 泛微最近的漏洞利用工具&#xff08;PS&#xff1a;2023&#xff09; 集成了QVD-2023-5012、CVE-2023-2523、CVE-2023-2648、getloginid_ofsLogin 漏洞利用 新增&#xff1a;WorkflowServiceXml 内存马注入、uploaderOperate文件上传漏洞、Del…

go-zero超强工具goctl的常用命令api,rpc,model及其构建的服务解析

goctl api 详情移步&#xff1a; go-zero的路由机制解析 基于go-zero的api服务刨析并对比与gin的区别 goctl rpc goctl支持多种rpc&#xff0c;较为流行的是google开源的grpc&#xff0c;这里主要介绍goctl rpc protoc的代码生成与使用。 protoc是grpc的命令&#xff0c;作用…

SpringBoot的pom文件、容器、组件

一、pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4…

springboot-mybatis的增删改查

目录 一、准备工作 二、常用配置 三、尝试 四、增删改查 1、增加 2、删除 3、修改 4、查询 五、XML的映射方法 一、准备工作 实施前的准备工作&#xff1a; 准备数据库表 创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动…