loria 发表于 2024-12-26 11:16:47

【行空板人工智能】基于YOLO的实时水果检测项目

本帖最后由 loria 于 2025-1-17 15:09 编辑

一:项目简介
本文分享的是基于YOLO训练出来的水果目标检测模型部署在行空板上运行的项目,旨在实现从实时视频流中框出画面中的所有水果并显示其名称。

二:项目效果
话不多说,先放上效果视频
https://b23.tv/mtCbZ6s

根据终端的显示针对图像尺寸为640*640 的图片,每次推理大约耗费2-3秒,对于行空板的性能来说,是比较好的效果。

三:软硬件
接下来,我将分享项目的制作过程。
使用到的软件是Mind+
使用到的硬件有:
(1)行空板M10
行空板M10是一款专为Python学习和使用设计的新一代国产开源硬件,采用单板计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。同时,其自带Linux操作系统和Python环境,还预装了常用的Python库,让广大师生只需两步就能进行Python教学。

(2)USB摄像头

四:项目准备
行空板部署YOLO系列项目需要python3.1.0以上的环境,为了更好的管理不同版本的python环境,推荐使用MiniConda
请参考此篇帖子的环境配置教程:如何在行空板上运行 YOLOv10n?
请按照这篇帖子的教程完成到Step 7 安装utralytics
除了utralytics库本项目还需要使用onnx、onnxruntime、opencv -python 和pinpong库
请依次在终端输入以下命令(注意行空板需要联网)
pip install onnx
pip install onnxruntime
pip install opencv-python
pip install pinpong
五:项目实现
做好准备后,可以编写代码实现项目了。我将模型文件和运行代码都放入了一个名叫fruit的文件夹中,将文件夹拖入Mind+右侧项目中的文件中,右键选中上传到行空板

可以在行空板中的文件找到上传的fruit文件,其中“best.pt”是YOLO水果检测模型文件,“best.onnx”是onnx格式的模型


选中名为“fruites_video.py”的文件,选择在编辑区打开

fruits_video.py是模型推理py文件,详细的内容如下。简单来说实现的功能是读取摄像头的每一帧画面裁剪成240*240的尺寸,作为输入进行推理,根据推理结果框出画面中的水果并显示其类别名称# -*- coding: UTF-8 -*-

# MindPlus
# Python

# 导入必要的库
import cv2# 用于图像处理和视频捕获
from pinpong.board import Board, Pin# 用于与MindPlus硬件板进行交互
from ultralytics import YOLO# 用于加载和运行YOLO模型
from pinpong.extension.unihiker import *# 导入UniHiker扩展模块

# 初始化MindPlus硬件板
Board().begin()

# 加载导出的ONNX模型,用于目标检测任务
onnx_model = YOLO("best.onnx", task='detect')

# 使用OpenCV打开默认摄像头
vd = cv2.VideoCapture(0)
vd.set(cv2.CAP_PROP_BUFFERSIZE, 1)# 设置缓冲区大小,提高稳定性

# 创建一个全屏窗口用于显示结果
cv2.namedWindow('winname', cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty('winname', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)

# 循环捕获视频帧
while True:
    if vd.isOpened():# 检查摄像头是否成功打开
      ret, frame = vd.read()# 读取一帧图像
      if not ret:# 如果读取失败
            break# 退出循环

      # 获取原始图像的尺寸
      h, w, c = frame.shape

      # 计算中心裁剪的起始和结束坐标
      # 这里假设图像是正方形的,如果不是,需要调整代码
      start_x = (w - h) // 2
      start_y = (h - h) // 2
      end_x = start_x + h
      end_y = start_y + h

      # 从原始图像中裁剪出中心区域
      crop_frame = frame

      # 将裁剪出的图像缩放到 200x200 的尺寸
      resized_frame = cv2.resize(crop_frame, (240, 240))

      # 使用裁剪和缩放后的图像进行推理
      results = onnx_model(resized_frame)

      # 绘制检测框和标签
      for det in results.boxes.data.tolist():
            x1, y1, x2, y2, conf, cls = det
            label = f"{onnx_model.names} {conf:.2f}"
            cv2.rectangle(resized_frame, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), 2)
            cv2.putText(resized_frame, label, (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

      # 显示结果
      cv2.imshow("winname", resized_frame)

      # 打印检测框和标签信息
      for det in results.boxes.data.tolist():
            x1, y1, x2, y2, conf, cls = det
            label = f"{onnx_model.names} {conf:.2f}"
            print(f"Box: ({x1}, {y1})-({x2}, {y2}), Confidence: {conf:.2f}, Class: {label}")

      key = cv2.waitKey(1)# 等待1毫秒,检测按键事件
      if key == 27:# 如果按下ESC键
            break# 退出循环

# 释放资源
vd.release()
cv2.destroyAllWindows()# 关闭所有OpenCV创建的窗口

打开fruits_video.py文件后点击运行即可

运行成功后,终端显示如下

六:项目反思
根据实践结果,行空板部署实时目标检测项目,训练模型时输入尺寸在128*128及以内FPS有较好的数据效果。本项目可以进一步在模型上进行优化以降低画面延迟率




页: [1]
查看完整版本: 【行空板人工智能】基于YOLO的实时水果检测项目