回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

基于行空板的图像分类在线模型应用 简单

头像 auroraAA 2024.08.15 309 0

一、实践目标

本项目借助浦育在线平台训练石头剪刀布的手势模型,之后使用行空板和外接摄像头,进行实时的手势识别,并将识别结果显示在屏幕上。

 

二、知识目标

了解在线上平台训练模型的方式

 

三、实践准备

硬件清单:

截屏2024-08-15 上午11.37.31.png

 

软件使用:Mind+编程软件x1

 

四、实践过程

1、在线图像采集与模型训练

1、打开浦育网站,点击”AI体验“,打开”图像分类“:https://www.openinnolab.org.cn/pjlab/aifrontlab

 

image.png

 

2、打开摄像头采集图像,或上传提前准备好的图片到不同分类下

 

image.png

 

3、数据采集完成后,点击训练,训练完毕后测试效果,并下载onnx模型

 

image.png

 

2、硬件搭建

1、将摄像头接入行空板的USB接口。

 

image.png

 

2、通过USB连接线将行空板连接到计算机。

 

image.png

3、软件编写

第一步:打开Mind+,远程连接行空板

 

image.png

 

第二步:在“行空板的文件”中新建一个名为AI的文件夹,在其中再新建一个名为“基于行空板的图像分类在线模型应用”的文件夹,导入下载的onnx模型文件。

 

image.png

 

第三步:编写程序

在上述文件的同级目录下新建一个项目文件,并命名为“main.py”。

 

示例程序:

代码
# -*- coding: UTF-8 -*-   # 指定源代码文件使用的字符编码为UTF-8

# MindPlus                 # MindPlus环境相关的配置
# Python                   # 该脚本使用Python语言

import sys                 # 导入sys模块,用于与Python解释器交互
sys.path.append("/root/mindplus/.lib/thirdExtension/nick-xeduhub_main-thirdex")  # 添加自定义路径到sys.path,便于导入特定模块
sys.path.append("/root/mindplus/.lib/thirdExtension/winster-cvshow-thirdex")     # 添加另一个自定义路径到sys.path
import re                  # 导入正则表达式模块,用于字符串匹配
import cv2                 # 导入OpenCV库,用于图像和视频处理
import sys                 # 冗余导入,可以删除
from unihiker import GUI   # 从unihiker模块中导入GUI类
from XEdu.hub import Workflow as wf  # 从XEdu.hub模块中导入Workflow类并重命名为wf
import os                  # 导入os模块,用于操作系统相关的功能

# 定义一个格式化任务输出的函数
def format_valve_output(task):
    try:
        output_result = ""
        output_result = task.format_output(lang="zh")  # 调用任务对象的format_output方法并指定语言为中文
        return output_result  # 返回格式化后的输出结果
    except AttributeError:
        return "AttributeError: 请检查输入数据是否正确"  # 如果发生AttributeError异常,返回错误提示

para_task1 = {}  # 初始化一个空的字典,用于存储任务参数
u_gui = GUI()  # 创建一个GUI对象
TuXiangLuJing = (str("Mind+.png"))  # 定义保存图像的文件路径
BiaoQianMing = ["stone","jiandao","bu"]  # 定义标签名称列表
init_para_task1 = {"task":"mmedu"}  # 初始化任务参数
init_para_task1["checkpoint"] = "model.onnx"  # 设置模型检查点参数
task1 = wf(**init_para_task1)  # 使用参数初始化Workflow对象
vd = cv2.VideoCapture()  # 创建一个VideoCapture对象,用于捕获视频
vd.open(0)  # 打开默认摄像头
vd.set(cv2.CAP_PROP_BUFFERSIZE, 1)  # 设置视频缓冲区大小
print("打开摄像头中...")  # 输出提示信息
while not (vd.isOpened()):
    pass  # 等待摄像头打开
print("摄像头已打开")  # 输出提示信息

while True:
    ret, grab = vd.read()  # 读取摄像头图像
    if vd.grab():  # 如果成功抓取到图像
        grab = cv2.resize(grab, (240, 320))  # 调整图像大小
        cv2.imwrite(TuXiangLuJing, grab)  # 将图像保存到指定路径
        u_gui.clear()  # 清除GUI内容
        u_gui.draw_image(image=TuXiangLuJing, x=0, y=50)  # 在GUI中绘制保存的图像
        txt = u_gui.draw_text(text="识别中...", x=0, y=0, font_size=20, color="#0000FF")  # 在GUI中绘制文本

        para_task1["data"] = TuXiangLuJing  # 更新任务参数中的数据路径

        if 'task1' in globals() or 'task1' in locals():  # 检查task1是否已初始化
            rea_result_task1 = task1.inference(**para_task1)  # 进行推理操作
        else:
            print("init", 'task1')  # 输出初始化信息
            task1 = wf(**init_para_task1)  # 重新初始化Workflow对象
            rea_result_task1 = task1.inference(**para_task1)  # 进行推理操作

        output_result_task1 = format_valve_output(task1)  # 格式化推理结果
        JieGuoXuHao = output_result_task1["标签"]  # 获取标签结果
        result = (BiaoQianMing[JieGuoXuHao])  # 根据标签索引获取对应的标签名称
        print(result)  # 输出标签名称
        txt.config(text=(str("识别结果:") + str(result)))  # 更新GUI文本内容

4、运行调试

第一步:运行主程序

运行“main.py”程序,可以看到初始时屏幕上显示着摄像头拍摄到的实时画面,将摄像头画面对准石头剪刀布,可以看到识别结果显示在了屏幕上。

 

image.png

 

5、程序解析

在上述的“main.py”文件中,我们主要通过opencv库来调用摄像头,从摄像头中读取图像,然后使用在线平台训练得到的模型对图像进行识别分类,并在图像上显示推理结果。整体流程如下,

① 初始化:

· 设置必要的系统路径以确保能够导入自定义库和模块。

· 导入需要的库,包括 cv2(用于图像处理)、unihiker.GUI(用于图形用户界面)、以及 XEdu.hub.Workflow(用于工作流和推理任务)。

· 定义辅助函数 format_valve_output,用于格式化任务的输出。

· 设置任务参数和路径,包括图像路径 TuXiangLuJing 和任务标签 BiaoQianMing。

· 初始化一个 Workflow 对象 task1,并设置模型检查点路径。

 

② 摄像头准备:

· 初始化并打开默认的摄像头设备,设置摄像头的缓冲区大小以优化读取速度。

· 等待摄像头完全打开后,输出提示信息确认摄像头已准备就绪。

 

③ 主循环:

· 程序进入一个无限循环,每次循环中执行以下操作:

· 从摄像头捕获一帧图像并调整图像大小。

· 保存调整后的图像到指定路径 TuXiangLuJing。

· 在 GUI 界面上绘制图像并显示“识别中...”的文本提示。

· 更新推理任务的参数以包含当前捕获的图像路径。

· 执行推理任务,调用 task1.inference 获取结果。

· 使用 format_valve_output 函数格式化推理任务的输出结果。

· 从格式化的结果中获取预测标签的序号并从标签列表 BiaoQianMing 中获取对应的标签名称。

· 在控制台上打印识别结果,并在 GUI 上更新文本显示,显示识别结果。

 

④ 结束:

· 如果在任何时候检测到用户输入退出信号(例如按下特定键),程序将跳出循环。

· 在程序退出前,释放摄像头设备以释放资源。

五、拓展

1、关于本项目更多操作细节,可参考此链接:

https://gitee.com/liliang9693/ext-xedu-hub/blob/master/%E7%A4%BA%E4%BE%8B/%E6%89%8B%E5%8A%BF%E8%AF%86%E5%88%AB.md#443%E7%BC%96%E5%86%99%E7%A8%8B%E5%BA%8F-%E6%91%84%E5%83%8F%E5%A4%B4%E5%AE%9E%E6%97%B6%E8%AF%86%E5%88%AB

评论

user-avatar