简介:目标检测是计算机视觉的核心任务之一,其原理是通过算法自动识别图像或视频中特定目标的位置和类别。YOLO系列模型因其出色的速度与精度平衡,成为该领域的主流技术。其技术价值在于能够实现实时、高精度的多目标识别,广泛应用于自动驾驶、安防监控、工业质检和智能交互等场景。本文聚焦于一个具体而微妙的实践环节——为YOLOv11模型构建高质量的自定义数据集。以“石头剪刀布”手势识别这一经典入门项目为例,深入剖析了从图像采集、数据标注到YOLO格式转化的全流程。文中详细解读了YOLO格式的归一化坐标计算原理,并介绍了如何利用数据增强策略提升模型的泛化能力。通过这个案例,读者可以掌握为目标检测模型“量身定制”数据的关键方法,为后续的模型训练与部署奠定坚实的数据基础。
1. 项目缘起:从“石头剪刀布”到YOLOv11的实战起点
最近在整理一些基础的计算机视觉教学案例时,我一直在想,有没有一个既简单直观,又能完整覆盖目标检测全流程的入门项目?太复杂的工业场景容易让初学者迷失在数据清洗和调参的细节里,而经典的“猫狗分类”又显得有点过时。直到我重新审视了那个几乎人人都会的游戏——“石头剪刀布”。这个想法听起来有点“不务正业”,但仔细一想,它其实是一个绝佳的练手项目:目标类别清晰(石头、剪刀、布三种手势),姿态相对固定,背景可以自由控制,非常适合用来理解YOLO这类目标检测模型从数据准备到模型训练、再到推理部署的每一个环节。
特别是当YOLOv11发布后,其更简洁高效的网络结构和更友好的训练接口,让个人开发者和小团队也能快速上手。但无论模型如何迭代,高质量的数据集始终是模型性能的基石。网上虽然有不少公开的手势数据集,但要么类别混杂,要么标注风格不统一,直接拿来训练一个干净、标准的“石头剪刀布”检测器,效果往往不尽如人意。因此,我决定自己动手,从零开始构建一个专门用于YOLOv11训练的“石头剪刀布”手势数据集。这个过程不仅涉及图像采集和标注,更关乎如何为YOLO格式“量身定制”数据,以及如何利用最新的工具链来提升效率。接下来,我就把这次从构思到落地的完整过程,包括踩过的坑和总结的经验,毫无保留地分享出来。
2. 数据集构建全流程:采集、标注与YOLO格式转化
构建数据集绝非简单的拍照和画框,它是一个系统工程,需要严谨的规划和细致的操作。我们的目标是得到一个能被YOLOv11直接高效利用的数据集。
2.1 图像采集策略与多样性控制
采集是第一步,也是决定数据集质量上限的关键。我并没有使用复杂的多摄像头系统,而是坚持“单设备、多场景”的原则,使用一部普通的智能手机完成。
核心采集原则:
- 主体多样性:邀请了约10位不同年龄、性别、手部大小、肤色的朋友参与拍摄,确保模型能学习到手势本身的特征,而非个别人的手部特征。
- 背景复杂性:分别在纯色背景(白墙)、办公室桌面(杂乱)、户外公园、室内灯光下、窗外自然光下等场景拍摄。背景的复杂性能有效提升模型的泛化能力,避免过拟合到单一环境。
- 姿态与尺度变化:对于每种手势(石头、剪刀、布),拍摄了手部距离镜头由近到远的多张照片,涵盖了从特写到全身入镜的不同尺度。同时,手势的角度也做了轻微旋转(正对、左侧、右侧),但避免极端角度导致手势难以辨认。
- 光照条件:涵盖了顺光、侧光、逆光(剪影效果)以及室内暖光、冷光等不同条件。光照是影响模型鲁棒性的重要因素。
- 拍摄设备与参数:统一使用手机主摄像头,关闭AI美化功能,以JPEG格式存储。分辨率设置为1920x1080,保证足够清晰度的同时,不至于让单张图片体积过大影响后续处理速度。
最终,我采集了约1500张原始图片,经过初步筛选(剔除模糊、手势不标准、意外入镜干扰物过多的图片),保留了约1200张作为标注候选集。
注意:不必一味追求图片数量。一个包含500张高质量、高多样性的图片的数据集,远胜于一个5000张但重复度高、背景单一的“垃圾”数据集。质量优于数量。
2.2 标注工具选型与YOLO格式详解
标注工具我选择了Roboflow。虽然CVAT、LabelImg等开源工具也很流行,但Roboflow的云端协作、自动预处理和一键格式导出功能,对于个人和小团队项目来说效率提升巨大。
标注过程中的关键细节:
- 标签定义:我们只定义三个类别:
rock(石头)、scissors(剪刀)、paper(布)。确保标签名简单、无空格、无特殊字符。 - 边界框(Bounding Box)绘制准则:
- 紧密度:框体应紧紧贴合手势的轮廓,特别是“剪刀”手势的两个手指尖端和“布”手势的手指边缘,避免包含过多无关的背景区域。
- 完整性:必须确保整个手势都在框内,即使是指尖。
- 一致性:对于同一手势的不同尺度,框体相对于手势的比例应尽量保持一致。这需要标注者在过程中不断回顾和修正。
YOLO格式深度解析:这是很多新手容易混淆的地方。YOLO格式的标注文件(.txt)与图片文件(.jpg)同名,并一一对应。 每一行代表一个目标物体,格式为:<class_id> <x_center> <y_center> <width> <height>
<class_id>: 类别索引,从0开始。例如,我们定义0: rock, 1: scissors, 2: paper。<x_center> <y_center> <width> <height>: 这四个值都是归一化后的,即相对于图片宽度和高度的比例值,范围在[0, 1]之间。
计算示例: 假设一张图片宽为img_width=640像素,高为img_height=480像素。我们标注了一个“石头”手势,其边界框的左上角像素坐标为(x_min=100, y_min=60),右下角坐标为(x_max=220, y_max=200)。
- 计算框的中心点像素坐标:
x_center_pixel = (x_min + x_max) / 2 = (100+220)/2 = 160y_center_pixel = (y_min + y_max) / 2 = (60+200)/2 = 130 - 计算框的宽度和高度(像素):
width_pixel = x_max - x_min = 220 - 100 = 120height_pixel = y_max - y_min = 200 - 60 = 140 - 归一化:
x_center = x_center_pixel / img_width = 160 / 640 = 0.25y_center = y_center_pixel / img_height = 130 / 480 ≈ 0.2708width = width_pixel / img_width = 120 / 640 = 0.1875height = height_pixel / img_height = 140 / 480 ≈ 0.2917
因此,该标注行内容为:0 0.25 0.2708 0.1875 0.2917
Roboflow会自动完成这个计算和保存过程。理解这个格式对于后续可能需要的脚本处理(如格式转换、数据分析)至关重要。
2.3 数据增强与数据集划分
在Roboflow中,我应用了一系列数据增强(Augmentation)策略来进一步扩充和强化数据集,这对于小样本学习尤其有效:
- 基础增强:随机水平翻转(Horizontal Flip)。注意,“石头”和“布”手势翻转后语义不变,但“剪刀”手势左右手形态不同,需谨慎。由于我们数据集中左右手都有,因此可以启用。
- 色彩空间增强:随机调整亮度(±20%)、对比度(±20%)、饱和度(±20%)和色调(±5%)。这模拟了不同光照和相机设置下的成像效果。
- 几何变换:随机旋转(±15°)和随机缩放裁剪(Zoom ±10%)。轻微的旋转和缩放能提升模型对角度和尺度变化的适应性。
- 模拟成像缺陷:添加随机高斯噪声(Noise)和随机模糊(Blur)。这能让模型对低质量图像输入更有鲁棒性。
应用增强后,数据集从1200张扩充到了约3000张(增强倍数可设置)。
数据集划分: 我按照机器学习领域的常用比例进行划分:
- 训练集(Train): 70% - 用于模型参数的学习。
- 验证集(Validation): 20% - 用于在训练过程中监控模型性能,调整超参数,防止过拟合。
- 测试集(Test): 10% - 用于在模型训练完成后,最终评估其泛化能力。测试集在训练过程中绝对不可见。
划分完成后,Roboflow可以直接导出为“YOLOv11 PyTorch”格式,得到一个包含以下结构的文件夹:
rock-paper-scissors-yolov11/ ├── train/ │ ├── images/ # 训练图片 │ └── labels/ # 对应的YOLO格式标签 ├── valid/ # 同train结构 └── test/ # 同train结构 ├── data.yaml # 数据集配置文件这个data.yaml文件是YOLO训练的关键,内容如下:
path: /path/to/rock-paper-scissors-yolov11 # 数据集根目录 train: train/images # 训练集路径(相对path) val: valid/images # 验证集路径 test: test/images # 测试集路径 # 类别信息 names: 0: rock 1: scissors 2: paper # 类别数量 nc: 3至此,一个为YOLOv11量身定制的“石头剪刀布”数据集就准备好了。
3. YOLOv11环境配置与核心网络结构浅析
有了高质量的数据集,接下来就需要一个强大的模型框架。YOLOv11作为Ultralytics家族的最新成员,在易用性和性能上找到了很好的平衡。
3.1 基于Anaconda的纯净环境搭建
我强烈建议使用Anaconda来管理Python环境,它能有效解决依赖冲突问题。
创建并激活独立环境:
# 创建一个名为yolov11,Python版本为3.9的虚拟环境 conda create -n yolov11 python=3.9 -y conda activate yolov11选择Python 3.9是因为它在稳定性与对新库的兼容性之间取得了很好的平衡。
安装PyTorch: 这是最核心也最容易出错的步骤。需要根据你的CUDA版本(如果有NVIDIA GPU)去 PyTorch官网 获取正确的安装命令。以CUDA 11.8为例:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118如果没有GPU,则安装CPU版本:
pip install torch torchvision torchaudio安装后,可以在Python中运行
import torch; print(torch.__version__); print(torch.cuda.is_available())来验证。安装Ultralytics YOLOv11: Ultralytics将YOLOv11集成在了其统一的
ultralytics包中,安装非常简单:pip install ultralytics这个命令会自动安装YOLOv11运行所需的所有依赖,包括OpenCV、Pillow、Matplotlib等。
验证安装:
yolo checks这个命令会检查环境配置,包括PyTorch、CUDA等,并下载一个小的预训练模型进行快速推理测试,确保一切就绪。
踩坑记录:我曾遇到过因为系统中存在多个版本的OpenCV导致
ultralytics导入失败的问题。解决方法就是在一个全新的conda环境中操作,避免历史残留。如果遇到奇怪的图像处理错误,可以尝试先pip uninstall opencv-python opencv-python-headless,再重新安装ultralytics,它会自动安装兼容的版本。
3.2 YOLOv11网络结构亮点与我们的任务适配
YOLOv11并非对网络结构进行了颠覆性改变,而是在YOLOv8的基础上,进一步优化了效率、精度和易用性。对于我们这个“石头剪刀布”分类任务,理解其几个关键特点有助于我们后续的调参:
- 更高效的骨干网络(Backbone):YOLOv11可能采用了经过优化的CSPDarknet变体或类似的轻量化设计,在保持特征提取能力的同时,减少了计算量。这对于我们希望在边缘设备(如树莓派)上部署的需求很友好。
- 增强的特征金字塔网络(FPN/PAN):这是目标检测模型的标准组件,用于融合不同尺度的特征。YOLOv11对其路径聚合方式可能做了微调,以更好地处理我们数据集中手势尺度变化较大的情况(从近处的特写到远处的小手)。
- 解耦头(Decoupled Head):这是YOLOX、YOLOv6等引入并被v8继承的优秀设计。它将分类(Class)和回归(Box)任务的分支分开,让网络更专注于各自的目标。对于我们的三分类问题,这个结构能更清晰地学习手势的类别特征和位置特征。
- Anchor-Free机制:YOLOv8开始就全面转向了Anchor-Free(如TOOD、YOLOX),YOLOv11延续了这一设计。这意味着模型直接预测目标中心点以及宽高,而不是像早期YOLO那样基于预设的Anchor框进行偏移预测。这简化了训练流程,减少了对数据集聚类分析(生成Anchor)的依赖,对于我们的自定义数据集更加方便。
- 损失函数优化:可能使用了更先进的分类损失(如Varifocal Loss的变体)和回归损失(如CIoU、EIoU),这些损失函数对边界框的匹配质量评估更精细,有助于提升我们手势框的定位精度。
对于“石头剪刀布”这个相对简单的任务,我们不需要修改网络结构。预训练的YOLOv11模型(如yolo11n.pt,yolo11s.pt)已经具备了强大的特征提取能力,我们通过微调(Fine-tuning)即可获得很好的效果。选择模型大小时,需要在速度和精度间权衡:nano(n)最快最轻,small(s)和medium(m)则更准。
4. 模型训练、验证与性能调优实战
环境就绪,数据就位,模型选型明确,接下来就是最激动人心的训练环节。
4.1 训练脚本详解与关键参数解析
YOLOv11的训练接口极其简洁,一个Python脚本或命令行就能搞定。但我更推荐使用Python脚本,因为它更灵活,便于记录实验参数。
from ultralytics import YOLO # 1. 加载一个预训练模型(这里以YOLOv11n为例) model = YOLO('yolo11n.pt') # 也可以尝试 'yolo11s.pt', 'yolo11m.pt' # 2. 开始训练 results = model.train( # 数据配置 data='path/to/your/rock-paper-scissors-yolov11/data.yaml', # 上一步生成的配置文件 epochs=100, # 训练轮数,根据数据集大小调整,100是个不错的起点 imgsz=640, # 输入图片尺寸,YOLO经典尺寸,保持默认即可 batch=16, # 批次大小,取决于GPU内存。RTX 3060 12G可设16-32 workers=8, # 数据加载线程数,通常设为CPU核心数 # 优化器与学习率 optimizer='auto', # 自动选择优化器(通常是SGD或AdamW) lr0=0.01, # 初始学习率,这是最重要的超参数之一 lrf=0.01, # 最终学习率因子 (lr0 * lrf) momentum=0.937, # SGD动量 weight_decay=0.0005, # 权重衰减,防止过拟合 # 数据增强(可在此覆盖data.yaml中的部分设置,或使用默认增强) hsv_h=0.015, # 色调增强幅度 hsv_s=0.7, # 饱和度增强幅度 hsv_v=0.4, # 明度增强幅度 degrees=0.0, # 旋转角度,已在Roboflow中增强,这里可设为0或小值 translate=0.1, # 平移 scale=0.5, # 缩放 shear=0.0, # 剪切 # 模型保存与验证 save=True, # 保存训练过程中的检查点 save_period=-1, # 每N轮保存一次,-1表示只在最后保存最佳和最后一轮 cache=False, # 是否缓存数据集到内存/磁盘以加速,RAM足够大可以设为True或'ram' device='0', # 使用GPU 0,如果是CPU则设为'cpu',多卡可设为'0,1' project='rps_train', # 项目文件夹名称 name='exp1', # 实验名称 exist_ok=True, # 允许覆盖已有的实验文件夹 pretrained=True, # 使用预训练权重(强烈建议) verbose=True, # 打印详细输出 )关键参数深度解读:
epochs: 对于1200张原图+增强后约3000张的数据集,100个epoch通常足够。可以通过观察验证集损失曲线来判断是否早停(early stop)。batch: 在GPU内存允许的情况下,越大越好。大的batch size能使梯度估计更稳定。如果出现CUDA out of memory错误,就减小batch或imgsz。lr0(初始学习率):这是最重要的超参数!0.01是常用起点。如果训练初期损失剧烈震荡或变成NaN,说明学习率太大,可尝试0.001。如果损失下降极其缓慢,可尝试增大。data中的data.yaml: 确保路径正确,且names和nc与你的数据集匹配。device: 明确指定设备可以避免一些奇怪的错误。即使只有一张卡,也建议显式指定‘0’。
4.2 训练过程监控与可视化
训练开始后,Ultralytics会在rps_train/exp1目录下生成大量有用的文件和可视化结果。
- 终端输出:你会看到每个epoch的训练损失(box_loss, cls_loss等)和验证指标(mAP@0.5, mAP@0.5:0.95, precision, recall)。重点关注
metrics/mAP_0.5,它表示IoU阈值为0.5时的平均精度,是我们任务的主要指标。 - TensorBoard/MLflow日志:YOLOv11默认集成日志。在训练目录下运行
tensorboard --logdir .,然后在浏览器打开localhost:6006,可以实时查看所有损失曲线、指标曲线、验证集预测样例等,这是调参的“眼睛”。 - 权重文件:
best.pt: 训练过程中在验证集上表现最好的模型权重。last.pt: 最后一轮训练结束时的模型权重。train_results.png/csv: 训练结果的汇总图表和数据。
如何判断模型是否在良好学习?
- 训练损失平稳下降:
train/box_loss和train/cls_loss应随着epoch增加而稳步下降,最终趋于平缓。 - 验证损失同步下降后平稳:
val/box_loss和val/cls_loss也应下降,但可能在后期略有上升(过拟合迹象)。理想情况是训练和验证损失曲线靠得近。 - 验证指标持续提升:
metrics/mAP_0.5应随着训练逐步上升,最终稳定在一个较高值(对于我们的简单任务,达到0.95以上是合理期望)。 - 过拟合检查:如果训练损失持续下降而验证损失开始上升,验证mAP停止增长甚至下降,就是过拟合了。需要增加数据增强强度、使用更轻量级的模型、或增加
weight_decay。
4.3 模型验证与性能分析
训练完成后,使用最佳模型best.pt在独立的测试集上进行最终评估,这是检验模型泛化能力的黄金标准。
from ultralytics import YOLO # 加载训练好的最佳模型 model = YOLO('rps_train/exp1/weights/best.pt') # 在测试集上评估 metrics = model.val(data='path/to/your/rock-paper-scissors-yolov11/data.yaml', split='test', # 指定使用测试集 imgsz=640, batch=16, conf=0.25, # 置信度阈值 iou=0.6, # NMS的IoU阈值 device='0') print(metrics.box.map) # 打印mAP@0.5:0.95 print(metrics.box.map50) # 打印mAP@0.5评估结果会生成一个详细的报告,包括:
- 混淆矩阵(confusion_matrix.png):直观展示模型在每个类别上的分类情况。理想情况下,对角线(正确预测)的值应该很高,非对角线的值(混淆错误)应该很低。例如,查看“剪刀”和“布”是否容易混淆。
- F1-置信度曲线(F1_curve.png):F1分数随置信度阈值变化的曲线。可以帮助我们选择一个最优的置信度阈值,在精度和召回率之间取得平衡。
- 精确率-召回率曲线(PR_curve.png):每个类别的PR曲线,曲线下面积(AP)就是该类别的平均精度。曲线越靠近右上角越好。
- 标签分布与预测分布对比:检查模型预测的框体分布(宽高比、位置)是否与真实标签分布一致。
针对“石头剪刀布”数据集的特定分析:
- 尺度敏感性:检查小目标(远处的手)和大目标(近处的手)的检测精度(AP_s, AP_m, AP_l)。如果小目标AP低,可能需要增加更多小尺度手势的样本,或在训练时使用更小的
imgsz(如320)进行多尺度训练(但YOLOv11命令行参数可能需要查找对应项)。 - 背景干扰:查看在复杂背景(如办公室杂物)下的错误检测案例。如果背景中的某些物体被误检为手势,说明需要增加更多包含此类干扰背景的负样本(不包含手势的图片)或加强背景增强。
5. 模型推理、部署与结果保存
模型通过测试集验证后,就可以投入实际使用了。YOLOv11的推理接口同样非常简洁。
5.1 单张图片与视频流推理
from ultralytics import YOLO import cv2 model = YOLO('rps_train/exp1/weights/best.pt') # 1. 单张图片推理 results = model('path/to/test_image.jpg', imgsz=640, conf=0.5) # conf为置信度阈值 result = results[0] # 第一张图片的结果 # 可视化并保存结果 annotated_frame = result.plot() # 生成带框和标签的图片 cv2.imwrite('output.jpg', annotated_frame) # 访问结构化预测结果 boxes = result.boxes.xyxy # 边界框坐标 [x1, y1, x2, y2] confidences = result.boxes.conf # 置信度 class_ids = result.boxes.cls # 类别ID class_names = result.names # 类别名称映射字典 for box, conf, cls_id in zip(boxes, confidences, class_ids): x1, y1, x2, y2 = box.tolist() cls_name = class_names[int(cls_id)] print(f"Detected {cls_name} with confidence {conf:.2f} at [{x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f}]") # 2. 视频流推理(例如摄像头) cap = cv2.VideoCapture(0) # 0代表默认摄像头 while cap.isOpened(): ret, frame = cap.read() if not ret: break # 推理 results = model(frame, imgsz=640, conf=0.5, verbose=False) # verbose=False关闭控制台输出 annotated_frame = results[0].plot() cv2.imshow('Rock-Paper-Scissors Detection', annotated_frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()5.2 批量推理与结果保存策略
在实际项目中,我们经常需要处理整个文件夹的图片或视频,并将结果(如图片、标签、统计信息)系统化地保存下来。
import os from pathlib import Path from ultralytics import YOLO import csv model = YOLO('rps_train/exp1/weights/best.pt') source_dir = 'path/to/your/test_images_folder' output_dir = 'inference_results' os.makedirs(output_dir, exist_ok=True) # 创建CSV文件记录所有检测结果 csv_file = open(os.path.join(output_dir, 'detections.csv'), 'w', newline='') csv_writer = csv.writer(csv_file) csv_writer.writerow(['image_path', 'x1', 'y1', 'x2', 'y2', 'confidence', 'class_name']) # 遍历源文件夹中的所有图片 for img_path in Path(source_dir).glob('*.jpg'): results = model(str(img_path), imgsz=640, conf=0.25, save=False, save_txt=False) # 先不自动保存 result = results[0] # 保存可视化图片 annotated_img = result.plot() output_img_path = os.path.join(output_dir, f'annotated_{img_path.name}') cv2.imwrite(output_img_path, annotated_img) # 保存YOLO格式的标签文件(可选) output_label_path = os.path.join(output_dir, f'{img_path.stem}.txt') with open(output_label_path, 'w') as f: for box, conf, cls_id in zip(result.boxes.xyxyn, result.boxes.conf, result.boxes.cls): # 注意这里用xyxyn(归一化坐标) x_center, y_center, width, height = box.tolist() f.write(f'{int(cls_id)} {x_center} {y_center} {width} {height} {conf}\n') # 将检测结果写入CSV for box, conf, cls_id in zip(result.boxes.xyxy, result.boxes.conf, result.boxes.cls): x1, y1, x2, y2 = box.tolist() cls_name = result.names[int(cls_id)] csv_writer.writerow([str(img_path), x1, y1, x2, y2, conf.item(), cls_name]) print(f'Processed: {img_path.name}') csv_file.close() print(f'All results saved to: {output_dir}')结果保存的几种形式及其用途:
- 带标注框的图片(
annotated_*.jpg):用于人工复查、演示和报告。 - YOLO格式标签文件(
*.txt):保存了归一化的坐标和置信度。这非常有用,可以用于:- 模型再训练:作为新的训练数据(伪标签)。
- 后续分析:计算在特定数据集上的统计指标。
- 与其他系统集成:标准化格式易于解析。
- 结构化数据文件(
detections.csv):将检测结果表格化,便于导入数据库或使用Excel、Pandas进行深入分析,例如统计每个类别的出现频率、平均置信度等。
5.3 模型导出与轻量化部署
训练好的PyTorch模型(.pt)虽然好用,但在某些生产环境(如移动端、嵌入式设备、某些Web后端)中,可能需要转换成其他格式。
导出为ONNX格式: ONNX是一种开放的模型交换格式,被许多推理引擎(如OpenVINO, TensorRT, ONNX Runtime)支持。
yolo export model=rps_train/exp1/weights/best.pt format=onnx imgsz=640这将在相同目录下生成一个best.onnx文件。你可以使用ONNX Runtime进行高速推理,其Python API如下:
import onnxruntime as ort import numpy as np import cv2 # 加载ONNX模型和预处理图片 session = ort.InferenceSession('best.onnx') # ... (图片预处理,缩放到640x640,归一化,转换维度为[1,3,640,640]) ... inputs = {session.get_inputs()[0].name: preprocessed_img} outputs = session.run(None, inputs) # outputs 包含了预测结果,需要根据模型输出结构进行后处理(如非极大值抑制NMS)注意:ONNX导出和推理涉及图片预处理(归一化、BGR2RGB等)和后处理(从输出张量中解析框、分数、类别,并执行NMS),这比直接使用
ultralytics的API要复杂。Ultralytics的model.export()方法会尝试包含预处理和后处理,但为了最大兼容性,有时需要自定义。
导出为TensorRT引擎(如果部署在NVIDIA GPU上): TensorRT可以提供极低的推理延迟。
yolo export model=best.pt format=engine device=0 imgsz=640这需要你的环境已安装TensorRT。导出的.engine文件只能在相同GPU架构和TensorRT版本的环境下运行。
对于“石头剪刀布”这种轻量级应用,如果是在树莓派或手机端,可以考虑使用NCNN(腾讯开源的移动端推理框架)或TFLite(TensorFlow Lite)格式。Ultralytics可能不直接支持导出为这些格式,通常需要先导出为ONNX,再使用相应的转换工具(如ONNX转NCNN,ONNX转TFLite)进行二次转换。
整个项目从数据准备到模型部署的闭环走下来,你会发现,用一个像“石头剪刀布”这样目标明确的小项目切入,能够非常扎实地掌握现代目标检测的完整流程。其中,数据集的构建质量直接决定了模型性能的天花板,而YOLOv11这样的现代框架则大大降低了从想法到实现的技术门槛。最后,别忘了妥善保存你的数据集、训练配置、模型权重和推理脚本,这些都是宝贵的资产,可以为下一个更复杂的项目打下坚实的基础。
本文还有配套的精品资源,点击获取