在许多应用领域,如机器人导航、智能家居和自动驾驶等,目标检测技术的需求日益增加。本博客将聚焦于使用K210芯片实现激光笔在黑色区域的目标检测。
激光笔在黑色区域目标检测是一个有趣且具有挑战性的问题。我们将通过使用K210芯片和相关算法,能够准确地检测出激光笔在黑色区域的位置和姿态,以便后续应用。
K210芯片是由中国公司苏州芯原科技(Sipeed)开发的一款高性能、低功耗的人工智能边缘计算芯片。它采用RISC-V架构,具备强大的计算能力和丰富的外设接口,特别适合用于嵌入式人工智能应用。
K210芯片的主要优势包括:
K210芯片是一款先进的人工智能边缘计算芯片,具备强大的计算能力和丰富的外设接口。为了实现激光笔在黑色区域的目标检测,我们需要准备以下硬件设备:
在进行目标检测之前,我们需要将摄像头和激光笔连接到K210开发板上。
首先,将摄像头模块插入到K210开发板的摄像头接口上。确保插入牢固,并注意摄像头的方向。
接下来,将激光笔的电源线与K210开发板的电源接口相连。根据激光笔的规格和开发板的接口类型,选择合适的连接方式,如直插或使用杜邦线连接。
完成连接后,确保所有接口插头都插入正确,并且牢固稳定。这样,我们就完成了摄像头和激光笔与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开发板。
在进行激光笔目标检测之前,我们需要安装一些必要的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 初始界面
在开始实现激光笔目标检测算法之前,我们需要进行数据采集和准备。以下是一些主要的步骤:
采集黑色区域图片:使用摄像头模块拍摄一系列黑色区域的图片。确保图片中有激光笔绘制的目标标记,并控制光线和背景条件的一致性。
图3 拍摄的激光笔黑色区域
标注目标位置:对采集到的图片进行目标位置的标注。可以使用图像标注工具(如LabelImg)来标注目标的边界框,并生成对应的标注文件。
划分训练集和测试集:将采集到的数据分为训练集和测试集。通常将数据的80%用于训练,20%用于测试。
数据增强:对训练集进行数据增强操作,以扩充训练数据的多样性。例如,可以进行随机旋转、翻转、缩放和平移等操作。
完成上述步骤后,您就准备好了用于训练和测试激光笔目标检测算法的数据集。
注意:在对数据集进行采集时,采集的数据要与使用场地的图片一致。比如:该模型要在白天使用,那么就在白天拍摄图片;该模型要在晚上使用,那么就在晚上拍摄图片;该模型要在球场使用,那么就在球场拍摄图片。对于收集的数据量,一般来说,对于一个类别,那就在500张左右。
注意:在进行收集图像时,图像的尺寸大小最好为[640,640] ,尺寸太小或太大都会影响识别的准确率。
为了实现激光笔目标检测,我们需要选择合适的目标检测模型,并进行训练。
对于K210来说,不同的型号使用的最佳模型不同,在官方的模型,使用的模型有yolov2、yolov3、
yolov4、yolov7、yolovx。这些模型,对于一般的K210,建议使用yolov3模型进行训练。当然,模型越高,训练的效果越好,但是要看自己的开发板能否实现。
可以在线训练和本地训练两种方法。
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
选择模型后,我们可以使用已准备好的数据集对模型进行训练。通常,训练目标检测模型的步骤如下:
加载数据集:将准备好的数据集导入到模型中,包括训练集和测试集。
模型初始化:根据选择的模型架构,初始化一个空的目标检测模型。
优化器选择:选择合适的优化器,如Adam或SGD,用于优化模型参数。
模型训练:使用训练集数据对模型进行训练,并在每个训练周期(epoch)结束后,使用测试集数据评估模型性能。
模型保存:在训练过程中,选择合适的检查点(checkpoint)来保存训练过程中的模型参数。
注意:在使用训练时,一般不用修改参数,需要修改的参数为训练轮数、识别类别、GPU是否使用、模型文件、输入图像大小。
完成上述步骤后,一个激光笔目标检测模型就可以使用了。
在模型训练好后,就可以使用训练好的模型进行检测,识别激光笔。
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 对象
-
图4 模型识别结果
注意:模型识别的准确度与图片标注的质量和图片数量有关。
硬性的标准其实限制不了无限可能的我们,所以啊!少年们加油吧!