1. 为什么选择YOLOv10:从“找茬”到“一眼定乾坤”的进化

如果你玩过“大家来找茬”这个游戏,就知道在两张相似的图片里找出细微的不同有多费眼。传统的目标检测模型,比如YOLO的早期版本,有点像这个游戏的初级玩家:它们需要反复“看”好几遍图片,通过一个叫“非极大值抑制”(NMS)的后处理步骤,把一堆重复的、重叠的预测框合并成一个最准的。这个过程就像你先圈出所有可疑的地方,再一个个对比筛选,虽然最终结果准,但耗时耗力。

而YOLOv10,就像是进化出了“火眼金睛”的顶级玩家。它最大的突破就是彻底干掉了NMS这个步骤,实现了真正的端到端检测。这意味着模型在推理时,对于同一个目标,直接给出一个最优的预测框,不用再事后“开会讨论”该留哪个。我实测下来,这个改动带来的效率提升非常明显,尤其是在处理视频流的时候,延迟感降低了一大截,真正做到了“一眼定乾坤”。

这背后的核心技术,清华大学的研究团队称之为“一致双重分配”。简单来说,就是在训练阶段,模型用“一对多”的方式学习,一个真实物体对应多个预测框,让模型学得更充分、更鲁棒;而在推理阶段,则切换到“一对一”模式,一个物体只输出一个最自信的预测框。这种“训练时博采众长,推理时果断坚决”的设计,完美平衡了精度和速度。

所以,无论你是想给监控视频自动分析人车流量,还是为自己的无人机项目添加自动避障和追踪功能,或者只是想快速搭建一个能识别图片中猫猫狗狗的趣味应用,YOLOv10都是一个起点高、效率高的绝佳选择。它提供了从纳米级(YOLOv10-N)到超大型(YOLOv10-X)共6个预训练模型,你可以根据自己手头的硬件(是从树莓派还是到服务器显卡)和精度要求灵活选择,丰俭由人。

2. 5分钟极速环境搭建:避开我踩过的那些坑

万事开头难,环境配置是劝退很多新手的第一个门槛。别担心,跟着我的步骤来,我把自己趟过的坑都给你标出来,保证你一路绿灯。

首先,我们需要一个干净的Python环境。我强烈推荐使用Anaconda来管理环境,它能有效避免不同项目间包版本的冲突。

# 创建一个新的Python3.9环境,命名为yolov10
conda create -n yolov10 python=3.9 -y
# 激活这个环境
conda activate yolov10

接下来安装核心依赖。这里有个小坑:官方仓库的安装方式有时会因网络问题失败。我推荐使用国内镜像源,并分步安装,更稳妥。

# 首先安装PyTorch,请根据你的CUDA版本选择命令(以CUDA 11.8为例)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 -i https://pypi.tuna.tsinghua.edu.cn/simple

# 然后安装Ultralytics包和Supervision(一个超好用的可视化工具)
pip install ultralytics supervision -i https://pypi.tuna.tsinghua.edu.cn/simple

如果上述ultralytics安装后无法直接使用YOLOv10(因为官方支持在逐步合并中),我们直接从清华大学的官方仓库安装。别被“从源码安装”吓到,其实就一条命令:

pip install git+https://github.com/THU-MIG/yolov10.git -i https://pypi.tuna.tsinghua.edu.cn/simple

为了验证安装是否成功,打开Python解释器,运行下面这行代码,只要不报错,就说明YOLOv10已经成功入驻你的电脑了。

from ultralytics import YOLOv10
print(“YOLOv10 环境准备就绪!”)

最后,我们还需要一个武器库:预训练模型。你可以通过代码自动下载,但更推荐手动下载,避免中途断线。前往YOLOv10的GitHub仓库的Release页面,下载你需要的模型文件,比如yolov10s.pt(小型模型,平衡速度和精度)。把它放在你的项目目录里,比如一个叫weights的文件夹下。

注意:如果你在安装过程中遇到任何“C++编译工具”相关的错误,大概率是因为缺少Windows下的C++构建工具。去安装一个Visual Studio Build Tools或者更轻量的MinGW就能解决。

2.1 可选但推荐的装备:给你的模型装上“涡轮增压”

如果你的电脑配有NVIDIA显卡,那么恭喜你,你可以通过安装CUDA和cuDNN来让YOLOv10在GPU上狂奔,速度相比CPU能有几十倍的提升。这一步稍微复杂点,但绝对值得。

首先,打开命令行输入 nvidia-smi,记下你的CUDA Driver Version(比如12.4)。然后去NVIDIA官网,下载一个比这个版本号低的CUDA Toolkit(例如12.1)。安装时,记得把“添加环境变量”勾上。

接着,下载与CUDA版本匹配的cuDNN库,将其压缩包里的binincludelib文件夹复制到CUDA的安装目录(如C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1)下对应位置。

完成这些后,重新安装PyTorch的GPU版本。回到之前的步骤,使用对应CUDA版本的PyTorch安装命令。安装完成后,在Python中运行 import torch; print(torch.cuda.is_available()),如果输出True,那么你的“涡轮增压”就成功开启了!

3. 图片目标检测实战:让你的照片“开口说话”

环境搞定,模型在手,现在让我们开始第一次实战——让模型识别一张图片。这个过程就像教一个刚认识世界的孩子指认物体,而我们只需要写几行简单的“指令”。

首先,准备一张你想要的测试图片,比如一张街景street.jpg,把它放在项目目录下。然后,创建一个Python脚本,比如叫detect_image.py

from ultralytics import YOLOv10
import cv2
import supervision as sv

# 1. 加载模型,指定我们下载的权重文件路径
# 这里以‘yolov10s.pt’为例,你可以在‘n’(纳米)、‘s’(小)、‘m’(中)、‘l’(大)、‘x’(超大)中按需选择
model = YOLOv10(‘weights/yolov10s.pt’)

# 2. 读取图片
image_path = ‘street.jpg’
image = cv2.imread(image_path)

# 3. 执行推理!conf是置信度阈值,只显示置信度高于0.25的检测结果
results = model(source=image, conf=0.25, verbose=False)[0]

# 4. 使用Supervision库将结果转换成易处理的格式
detections = sv.Detections.from_ultralytics(results)

# 5. 准备一个“画师”,给检测到的物体画上框和标签
box_annotator = sv.BoxAnnotator()

# 6. 生成标签文本(物体类别 + 置信度)
labels = [
    f”{model.names[class_id]} {confidence:.2f}”
    for class_id, confidence in zip(detections.class_id, detections.confidence)
]

# 7. 让“画师”在图片副本上作画
annotated_image = box_annotator.annotate(
    scene=image.copy(),
    detections=detections,
    labels=labels
)

# 8. 展示并保存结果
cv2.imshow(‘YOLOv10 Detection Result’, annotated_image)
cv2.waitKey(0) # 按任意键关闭窗口
cv2.destroyAllWindows()
cv2.imwrite(‘street_detected.jpg’, annotated_image)
print(“检测完成,结果已保存为 ‘street_detected.jpg‘”)

运行这个脚本,你会看到一个弹窗,图片中的车辆、行人、交通标志等都被清晰地框出并打上了标签。supervision库让可视化变得极其简单,避免了手动画框写字的繁琐。

3.1 深入理解核心参数:如何调节模型的“敏感度”和“专注度”

第一次运行成功后,你可能会想:为什么有些模糊的物体没检测到?或者为什么同一个物体被框了好几次?这就需要我们了解两个最关键的参数:置信度阈值(conf)交并比阈值(iou)。虽然YOLOv10无需NMS,但训练和导出模型时iou参数仍影响模型行为。

  • 置信度阈值(conf):模型对预测结果的自信程度。设置conf=0.25意味着模型只输出它认为有25%以上把握是正确的检测框。调高它(如0.5),模型会变得更“谨慎”,只报告它非常确定的目标,漏检可能增加,但误检会减少。调低它(如0.1),模型会变得更“敏感”,能发现更多潜在目标,但也会把一些阴影、纹理误认为是物体。
  • 交并比阈值(iou):在训练和模型导出时使用,用于决定两个框重叠到什么程度时被认为是检测的同一个物体。这个值会影响模型学习区分临近物体的能力。对于小目标密集的场景(如无人机航拍),可以适当调低。

你可以像下面这样,在推理时灵活调整conf参数,观察不同效果:

# 尝试不同的置信度阈值
for conf_thresh in [0.1, 0.25, 0.5]:
    results = model(source=image, conf=conf_thresh)[0]
    print(f”置信度阈值 {conf_thresh},检测到 {len(results.boxes)} 个目标”)

4. 视频目标检测实战:打造你的迷你智能监控系统

图片检测只是小试牛刀,让模型处理连续的视频帧,才是真正释放其威力的地方。想象一下,让电脑自动分析一段行车记录仪视频,统计车辆和行人;或者监控一段走廊视频,发现异常闯入。我们来一步步实现它。

视频检测的本质,就是把视频拆成一帧帧的图片,对每一帧进行检测,然后再把带标注的帧拼合回去。听起来复杂,但用OpenCV和我们的检测代码,流程非常清晰。

from ultralytics import YOLOv10
import supervision as sv
import cv2
import numpy as np

# 初始化模型和画师
model = YOLOv10(‘weights/yolov10m.pt’) # 视频处理可用中型模型,效果更好
box_annotator = sv.BoxAnnotator()

def predict_and_annotate(frame):
    “”“对单帧图像进行预测并绘制标注框”“”
    results = model(source=frame, conf=0.3, verbose=False)[0] # 视频可适当提高置信度
    detections = sv.Detections.from_ultralytics(results)
    # 生成标签
    labels = [
        f”{model.names[class_id]} {confidence:.2f}”
        for class_id, confidence in zip(detections.class_id, detections.confidence)
    ]
    # 绘制到帧上
    annotated_frame = box_annotator.annotate(
        scene=frame.copy(),
        detections=detections,
        labels=labels
    )
    return annotated_frame

# 1. 打开视频文件或摄像头
# 视频文件模式:
video_path = ‘traffic.mp4’
cap = cv2.VideoCapture(video_path)
# 摄像头实时模式(0代表默认摄像头):
# cap = cv2.VideoCapture(0)

# 2. 获取视频属性,为输出视频做准备
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
# 定义视频编码器并创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*‘mp4v’) # 或 ‘avc1’
out = cv2.VideoWriter(‘output_video.mp4’, fourcc, fps, (frame_width, frame_height))

print(“开始处理视频,按 ‘q‘ 键可提前退出显示窗口...”)

while True:
    # 读取一帧
    ret, frame = cap.read()
    if not ret:
        print(“视频处理完毕或摄像头断开。”)
        break

    # 进行目标检测和标注
    processed_frame = predict_and_annotate(frame)

    # 将处理后的帧写入输出视频文件
    out.write(processed_frame)

    # 实时显示处理结果(可选,会消耗性能)
    cv2.imshow(‘Real-time Detection’, processed_frame)

    # 按下‘q’键退出循环
    if cv2.waitKey(1) & 0xFF == ord(‘q’):
        break

# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
print(f”视频处理完成,结果保存在 ‘output_video.mp4‘”)

运行这段代码,你会得到一个包含了所有检测框的新视频。如果使用的是摄像头,那么你将看到一个实时的目标检测窗口,效果非常震撼。

4.1 性能优化技巧:让视频检测“飞”起来

处理视频时,尤其是高分辨率或需要实时性的场景,性能至关重要。这里分享几个我实战中总结的提速技巧:

  1. 调整推理尺寸:YOLO模型默认将输入图像缩放到640x640进行推理。对于高清视频,这有时是性能瓶颈。你可以通过imgsz参数调小,如imgsz=320,能大幅提升速度,但会略微损失对小目标的检测精度。
    results = model(source=frame, conf=0.3, imgsz=320)
    
  2. 跳帧处理:对于非严格实时的分析任务(如事后分析录像),可以每N帧处理一帧,能成倍减少计算量。
  3. 使用更小的模型:在速度优先的场景下,果断换用yolov10n.ptyolov10s.pt
  4. 启用GPU:确保你的PyTorch使用的是GPU版本,这是最有效的提速手段。

你可以创建一个简单的性能测试循环,来评估不同设置下的处理速度(帧率FPS):

import time
start_time = time.time()
frame_count = 0
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    # 处理帧...
    processed_frame = predict_and_annotate(frame)
    frame_count += 1
    # 计算并打印实时FPS
    elapsed_time = time.time() - start_time
    fps = frame_count / elapsed_time
    cv2.putText(processed_frame, f”FPS: {fps:.2f}”, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

5. 进阶之路:从使用到定制,打造专属检测器

跑通了官方模型,你可能已经不满足了:我想识别特定的商品、特殊的零件、或者某种珍稀动物,该怎么办?这就需要训练你自己的定制模型。别怕,YOLOv10继承了一套非常成熟的训练流程。

整个过程可以概括为三步:准备数据、配置训练、启动训练

第一步:准备数据 你需要收集包含你目标物体的图片,并进行标注。标注工具推荐使用LabelImgRoboflow。标注完成后,数据应组织成YOLO格式:

your_dataset/
├── images/
│   ├── train/  # 训练集图片
│   └── val/    # 验证集图片
└── labels/
    ├── train/  # 对应训练集的txt标注文件
    └── val/    # 对应验证集的txt标注文件

每个txt文件一行代表一个物体,格式为:class_id x_center y_center width height,坐标和宽高都是相对于图片尺寸的归一化值。

然后,创建一个数据集配置文件custom_data.yaml

path: /path/to/your_dataset  # 数据集根目录
train: images/train  # 训练集相对路径
val: images/val      # 验证集相对路径

# 类别数量和名称
nc: 3  # 你的目标类别数,例如3
names: [‘cat’, ‘dog’, ‘person’]  # 你的类别名称列表

第二步:配置并启动训练 训练代码其实非常简单,YOLOv10帮你封装了所有复杂过程。

from ultralytics import YOLOv10
import os

# 设置环境变量,避免一些可能的警告
os.environ[“KMP_DUPLICATE_LIB_OK”]=”TRUE”

# 加载一个预训练模型作为起点(迁移学习,效果更好更快)
model = YOLOv10(‘yolov10s.pt’)

# 开始训练!
results = model.train(
    data=‘custom_data.yaml’,  # 数据集配置
    epochs=100,               # 训练轮数,通常50-100
    imgsz=640,               # 输入图像大小
    batch=16,                # 批大小,根据GPU内存调整
    workers=4,               # 数据加载线程数
    device=‘0’,              # 使用GPU 0,如果是CPU则设为‘cpu’
    project=‘my_custom_yolov10’,  # 项目名称,所有输出会保存到这里
    name=‘exp1’,                   # 实验名称
    save_period=10,          # 每10个epoch保存一次中间权重
)

训练开始后,你可以在my_custom_yolov10/exp1目录下找到所有输出,包括损失曲线、精度指标、以及最好的模型权重best.pt。使用tensorboard可以实时查看训练过程的可视化图表。

第三步:使用你的专属模型 训练完成后,使用你自己的模型就和使用官方模型一模一样:

my_model = YOLOv10(‘my_custom_yolov10/exp1/weights/best.pt’)
results = my_model(‘your_image.jpg’)

5.1 模型导出与部署:让模型在更多平台上奔跑

训练好的PyTorch模型(.pt)虽然好用,但在实际部署时,我们可能需要将它转换成其他格式,以适配不同的推理引擎或硬件平台。YOLOv10提供了极其便捷的导出功能。

导出为ONNX格式:ONNX是一种开放的模型交换格式,可以被TensorRT, OpenVINO, ONNX Runtime等多种后端支持。

yolo export model=best.pt format=onnx opset=13 simplify

或者用Python代码:

from ultralytics import YOLOv10
model = YOLOv10(‘best.pt’)
model.export(format=‘onnx’, opset=13, simplify=True)

导出为TensorRT引擎:如果你在NVIDIA Jetson等边缘设备上追求极致性能,可以导出为TensorRT格式。这通常需要先导出ONNX,再用TensorRT的trtexec工具转换。

trtexec --onnx=best.onnx --saveEngine=best.engine --fp16 --workspace=2048

导出为OpenVINO IR格式:用于在Intel CPU、集成显卡或神经计算棒上高效推理。

yolo export model=best.pt format=openvino

导出的模型,就可以被集成到C++应用程序、移动端App或者Web后端服务中。例如,你可以参考网络搜索中提到的C++ TensorRT部署项目,将模型部署成一个高性能的Windows桌面应用,完全脱离Python环境运行。

走到这一步,你已经从一个YOLOv10的使用者,变成了一个能够解决实际问题的AI应用构建者。无论是简单的图片识别,还是复杂的视频流分析系统,甚至是针对特定场景定制化的检测方案,这套从环境到训练、从推理到部署的完整流程,都为你提供了坚实的技术基础。剩下的,就是发挥你的想象力,去创造更多的可能性了。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐