木子呢 发表于 2024-12-13 15:48:39

在行空板M10上运行 YOLOv10:高效物体检测的分步指南

对于有兴趣在紧凑型硬件平台上部署高级对象检测算法的开发人员、教育工作者和业余爱好者,本指南提供了全面的概述。如果您希望探索 AI 与嵌入式系统的集成,尤其是在[行空板M10](https://www.dfrobot.com.cn/goods-3404.html) 单板计算机上使用 YOLOv10 算法,您会发现它特别有用。您将学习如何设置环境、优化模型以提高性能以及实现实际应用。这使它成为提高您在 AI 和嵌入式系统开发方面的技能的宝贵资源。
## 1. 简介
### 1.1 YOLOv10简介
YOLO(You Only Look Once)系列是目前主流的端侧物体检测算法之一,最早由Joseph Redman等人提出,随着时间的推移,已经发布了多个版本,每个版本在性能和速度上都有“看似”的提升。

本文介绍的是运行在行空板M10板子上的 YOLOv10。YOLOv10 由清华大学研究团队提出,遵循 YOLO 系列的设计原则,致力于打造实时、端到端的高性能物体检测器。YOLOv10 弥补了 YOLO 系列在后处理和模型架构方面的不足,通过消除非极大值抑制 (NMS) 操作和优化模型架构,YOLOv10 在达到 SOTA 性能的同时,显著降低了计算开销。在标准物体检测基准上进行的大量实验表明,YOLOv10 在各个模型规模上在计算量-精度权衡方面显著优于之前的 SOTA 模型。如下图所示,YOLOv10-S / X 比性能相近的 RT-DETR R18 / R101 快 1.8 倍 / 1.3 倍。相比于YOLOv9-C,在同等性能​​下,YOLOv10-B将延迟降低了46%。此外,YOLOv10还展现出极高的参数利用效率,YOLOv10-L/X的参数量分别减少了1.8倍和2.3倍,性能比YOLOv8-L/X高出0.3 AP和0.5 AP;YOLOv10-M的参数量分别减少了23%和31%,但性能却与YOLOv9-M/YOLO-MS相近。

yolov10性能参数对比
### 1.2 行空板M10介绍
[行空板M10](https://www.dfrobot.com.cn/goods-3404.html)是专为Python学习使用而设计的新一代国产开源硬件,采用单板机架构,集成LCD彩屏、WiFi蓝牙、各类常用传感器、丰富的扩展接口,自带Linux操作系统和Python环境,预装常用Python库,学生和老师只需两步即可开始Python教学。

行空板M10基于主频 1.2GHz 的 RK3308 Arm 64 位四核处理器,配备 512MB DDR3 内存和 16GB eMMC 硬盘,运行 Debian 10 操作系统。还支持 2.4G Wi-Fi 和蓝牙 4.0,采用 RTL8723DS 芯片。行空板M10还集成了主频 108MHz 的 GD32VF103C8T6 RISC-V 协处理器、64KB Flash 和 32KB SRAM。

行空板M10具有各种板载组件,包括 Home 按钮、A/B 按钮、2.8 英寸触摸彩色屏幕(分辨率为 240x320)、电容式硅麦克风、PT0603 光敏三极管光传感器、无源蜂鸣器和蓝色 LED。它还具有 ICM20689 六轴传感器,其中包括三轴加速度计和三轴陀螺仪。

接口方面,行空板M10提供了丰富的连接方式,拥有一个 USB Type-C 接口,用于将 CPU 连接到 PC 进行编程或为主板供电,还有一个 USB TYPE-A 接口,用于连接外部 USB 设备。此外,该板还具有一个 microSD 卡接口,可用于扩展存储空间,一个支持三个 10 位 PWM 通道和两个 12 位 ADC 通道的 3Pin I/O,一个独立的 4Pin I2C 接口,以及 19 个与 micro:bit 兼容的独立 I/O 金手指,支持各种通信协议和功能。

### 1.3 在行空板M10上使用 YOLOv10 进行物体检测
在本文中,我们将使用 DFRobot 开发的行空板M10 运行 YOLOv10,并尝试通过转换为 ONNX 格式来加速它。

在行空板上部署 YOLOv10 具有重要的实际意义和教育意义:

**1. 便携性与部署灵活性:** 行空板M10 体积小巧,适合嵌入到空间受限的设备中,实现便携的物体检测部署。相比大型计算机,行空板M10更适合现场和移动场景。

**2. 性价比高:** 行空板M10成本相对较低,适合预算有限的项目和教育用途。通过在行空板M10上运行 YOLOv10,可以进行低成本的物体检测应用开发和实验。

**3. 学习与实验平台:** 行空板M10提供了丰富的接口和板载组件,非常适合作为学习与实验平台。通过在 行空板M10上运行 YOLOv10,学生和开发者可以深入了解嵌入式系统与人工智能的融合,了解资源受限环境下的优化和加速算法。

**4. 技术挑战与创新:**在资源有限的 行空板 上运行 YOLOv10 需要克服与计算性能和内存限制相关的挑战。这为开发人员提供了探索和创新的机会,可以尝试各种优化技术,例如模型压缩、量化和硬件加速。

## 2.准备:设置运行YOLOv10的环境
为了在行空板M10上成功运行 YOLOv10,我们将使用 Ultralytics 提供的库进行部署。首先,我们需要确保 行空板M10上的 Python 环境满足 YOLOv10 的要求,具体升级到 Python 3.8 或更高版本。为此,我们建议使用 MiniConda 进行版本管理,以便轻松切换和管理不同的 Python 环境。

步骤如下:
**1. 安装 MiniConda:**首先,在行空板M10上下载并安装 MiniConda。MiniConda 是一个轻量级 Python 发行版,专门用于简化 Python 环境和软件包安装的管理。

**2. 创建新环境:**使用 MiniConda 创建一个 Python 3.8 或更高版本的虚拟环境。这可以确保我们部署 YOLOv10 不会受到系统默认 Python 环境的影响,避免出现兼容性问题。

**3.激活环境:**激活新创建的虚拟环境,使其成为当前工作环境。

**4. 安装 Ultralytics 库:**在激活的虚拟环境中,使用 pip 命令安装 Ultralytics 提供的 YOLO 库。这将下载并安装所有必要的依赖项和组件,使我们能够顺利运行 YOLOv10。

通过以上步骤,我们成功地将 YOLOv10 部署到了 行空板上,充分利用了其强大的物体检测能力。这种方式不仅保证了 YOLOv10 的高效运行,还便于环境管理和版本控制,为后续的开发和实验打下了稳定的基础。另外,通过使用 MiniConda 进行版本管理,我们可以更灵活地应对不同项目的 Python 环境需求,提高开发效率。

以下是详细步骤:

### 步骤1检查当前Python版本:
在终端中输入:
```
python --version
```

终端显示:
```
Python 3.7.3
```
Ultralytics 不支持低版本的 Python,因此需要升级 Python。我们选择使用 MiniConda 进行版本管理和升级。

注意:不要使用 Anaconda,因为它在行空板M10上运行时可能会出现错误。

### 第 2 步下载 MiniConda:
在终端中输入:
```
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-aarch64.sh
```
下载完成后终端显示:
```
Saved “Miniforge3-Linux-aarch64.sh” )
```

### 步骤 3 安装 MiniConda:
在终端中输入:
```
sudo bash Miniforge3-Linux-aarch64.sh
```
按照提示按ENTER或者yes键即可。终端最后显示:
```
Added mamba to /root/.bashrc

==> For changes to take effect, close and re-open your current shell. <==

Thank you for installing Miniforge3!
```

在终端中输入:
```
source ~/.bashrc
```
安装完成后在终端输入:
```
conda
```
终端显示:

### 步骤4激活Conda:
在终端中输入:
```
conda activate
```
终端显示变化如下:
#### root@unihiker:

到:

####(base)root@unihiker:

表示 Conda 激活成功。

### 步骤5 在Conda中创建YOLO环境:
将环境命名为“yolo”,并选择 Python 版本 3.11。在终端中输入:
```
conda create -n yolo python==3.11
```
在此过程中,显示​​屏显示:


输入“y”

环境创建完成后,终端显示:

### 步骤6激活YOLO环境:
在终端中输入:
```
conda activate yolo
```
终端显示变化如下:

#### (基地)根@unihiker:

到:

#### (yolo)root@unihiker:

表示成功激活YOLO环境。
### 步骤 7 安装 Ultralytics:
在终端中输入:
```
pip install ultralytics
```
完成后终端显示:

### 步骤 8 安装 Pillow 库:
在终端中输入:
```
pip install pillow
```
如果已经安装,终端显示:
```
Requirement already satisfied: pillow in /root/miniforge3/envs/yolo/lib/python3.11/site-packages (10.3.0)
```

### 步骤9安装OpenCV:
在终端中输入:
```
pip install opencv-python
```
如果已经安装,终端显示:
```
Requirement already satisfied: opencv-python in /root/miniforge3/envs/yolo/lib/python3.11/site-packages (4.9.0.80)

Requirement already satisfied: numpy>=1.21.2 in /root/miniforge3/envs/yolo/lib/python3.11/site-packages (from opencv-python) (1.26.4)
```

### 步骤 10 安装 Hugging Face 库:
在终端中输入:
```
pip install huggingface
```


### 步骤11 安装Hugging Face Hub库:
在终端中输入:
```
pip install huggingface_hub
```



## 3.快速入门:运行原生 YOLOv10
### 步骤1从GitHub下载项目:
YOLOv10项目网址:https://github.com/THU-MIG/yolov10

在终端中输入:
```
git clone https://github.com/THU-MIG/yolov10.git
```
下载 YOLOv10 项目。然后在终端中输入以下内容进入目录:
```
cd yolov10
```
### 步骤2 准备所需文件:
重量文件:

####


### 步骤3创建Python文件:
快速启动.py

示例代码:
```
Python

from ultralytics import YOLO

# Load a pretrained YOLO model (recommended for training)

model = YOLO("yolov10n.pt")

# Perform object detection on an image using the model

results = model("https://ultralytics.com/images/bus.jpg")

# Save results to disk

results.save(filename=f"result_bus.jpg")
```

### 步骤4 确认YOLO环境已激活:
在终端中输入:
```
conda activate yolo
```
确认终端显示:




### 步骤 5 运行你编写的 Python 脚本:
在终端中输入:
```
python quick_start.py
```
终端显示:



使用原生的YOLOv10n模型进行单张图片推理大约需要7秒。

自动下载了我们为 YOLO 推理准备的图像“bus.jpg”,如下所示:

最终模型推理结果存储为“result_bus.jpg”:


## 4. 优化:转换为 ONNX 格式
运行原生的YOLOv10n的时候速度比较慢,所以我们需要将其转换为ONNX格式,以加快其运行速度。

本节介绍如何将yolov10n.pt转换为ONNX格式,以加速其运行。以下是详细步骤:

### 步骤1 移动到上一节创建的YOLO目录:
在终端中输入:
cd yolov10

### 步骤2 创建一个名为export_onnx.py的Python文件,内容如下:
```
Pythonfrom ultralytics import YOLO # Load a modelmodel = YOLO("yolov10n.pt")# load an official model # Export the modelmodel.export(format="onnx")
```

### 步骤3确认YOLO环境已激活:
在终端中输入:
```
conda activate yolo
```
确认终端显示:


### 步骤 4 运行你编写的 Python 脚本:
在终端中输入:
```
python export_onnx.py
```
终端显示:


可以看到转换后的文件“yolov10n.onnx”已被自动保存。


### 步骤5 编写文件来运行ONNX模型:
创建一个名为predict_onnx.py的文件,并写入以下代码:
```
Pythonfrom ultralytics import YOLO # Load the exported NCNN modelonnx_model = YOLO("yolov10n.onnx", task = 'detect') # Run inferenceresults = onnx_model("https://ultralytics.com/images/bus.jpg") # Save results to diskresults.save(filename=f"result_bus_onnx.jpg")
```

### 步骤6 运行推理代码:
在终端中输入:
```
python predict_onnx.py
```
终端显示:

该目录生成预测结果:


可以看到使用ONNX模型进行物体检测大概需要6.5秒,比原生模型快了0.5秒。

## 5.进一步优化:减小输入图像尺寸
显然,目前的推理速度仍然很慢。

如果想要提升推理速度,可以减小输入图片大小。在导出 ONNX 模型时,我们可以设置 imgsz 参数来指定输入图片大小。如果输入图片大小不确定,我们也可以设置 dynamic 参数为 True,让导出的 ONNX 可以接受任意大小的图片输入进行推理。具体步骤如下:

### 步骤1 移动到上一节创建的YOLO目录:
在终端中输入:
```
cd yolov10
```
### 步骤2 创建一个名为export_onnx.py的Python文件,内容如下:
这一步我们将动态参数设置为True。
```
Pythonfrom ultralytics import YOLO # Load a modelmodel = YOLO("yolov10n.pt")# load an official model # Export the modelmodel.export(format="onnx", dynamic = True)
```
### 步骤3确认YOLO环境已激活:
在终端中输入:
```
conda activate yolo
```
确认终端显示:


### 步骤 4 运行你编写的 Python 脚本:
在终端中输入:
```
python export_onnx.py
```
终端显示:

可以看到文件“yolov10n.onnx”已自动保存。

### 步骤5 编写文件来运行ONNX模型:
创建一个名为predict_onnx.py的文件,并写入以下代码:

```
Pythonfrom ultralytics import YOLOimport cv2 # Load the exported NCNN modelonnx_model = YOLO("yolov10n.onnx", task = 'detect') image = cv2.imread('bus.jpg')print(image.shape) # Run inferenceprint('original')results = onnx_model("bus.jpg")results.save(filename='bus_640.jpg')print(256)results = onnx_model("bus.jpg", imgsz = 256)results.save(filename='bus_256.jpg')print(128)results = onnx_model("bus.jpg", imgsz = 128)results.save(filename='bus_128.jpg')print(64)results = onnx_model("bus.jpg", imgsz = 64)results.save(filename='bus_64.jpg')
```

本代码中我们分别测试了原始尺寸图像、256尺寸图像、128尺寸图像、64尺寸图像的运行情况。

### 步骤6 运行推理代码:
在终端中输入:
```
python predict_onnx.py
```
终端显示:

原图大小为1080*810,原生YOLOv10n最大预测尺寸为640,耗时约6秒,结果如下:

当输入大小为448时,耗时约为秒。结果如下:

当输入大小为320时,耗时约为1.2秒,结果如下:

当输入大小为256时,所需时间约为0.8秒。

当输入大小为128时,所需时间约为0.4秒。



## 总结:
** 注意:**性能基于 bus.jpg 图像。如果您有自己的数据集,可能需要进一步测试。

本次测试准确率判断标准为:

## 6.与YOLOv8n的比较
使用官方代码,图像大小与运行时间对比如下:

**注意:**准确度是使用 bus.jpg 测试的。如果您有自己的数据集,可能需要进一步测试。

## 7. 结论
#### 行空板M10可以运行 YOLOv10n

使用行空板M10,用简单的代码即可运行YOLOv10n,速度比YOLOv8n稍快。

#### 本文介绍如何在行空板M10上完成YOLOv10的部署

YOLOv10 虽然是基于 Ultralytics 开发的,但是单纯安装 Ultralytics 库并不能直接运行 YOLOv10,还是需要 clone 官方仓库。

#### 推荐的分辨率配置

如果使用行空板M10进行图片物体检测,可以考虑使用448的输入分辨率,单张图片的处理时间大概为2.5秒,准确率已经很不错了。如果使用行空板M10进行视频物体检测,考虑到行空板M10的算力,建议使用128的输入分辨率,单张图片的处理时间大概为0.28秒,不过此时表现一般。可以考虑使用YOLOv8n的128输入分辨率,准确率表现更佳。同样,准确率表现是基于bus.jpg的测试,如果你有自己的数据集,可能还需要进一步测试。

#### 持续优化,敬请期待

我们会持续优化YOLOv10n在行空板M10上的运行,敬请期待。


地下铁 发表于 2024-12-16 13:16:23

好文章!马上来试试。谢谢作者。
页: [1]
查看完整版本: 在行空板M10上运行 YOLOv10:高效物体检测的分步指南