YOLOv10实战:从零搭建图片与视频目标检测系统(含完整代码)
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库,将其压缩包里的bin、include、lib文件夹复制到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 性能优化技巧:让视频检测“飞”起来
处理视频时,尤其是高分辨率或需要实时性的场景,性能至关重要。这里分享几个我实战中总结的提速技巧:
- 调整推理尺寸:YOLO模型默认将输入图像缩放到640x640进行推理。对于高清视频,这有时是性能瓶颈。你可以通过
imgsz参数调小,如imgsz=320,能大幅提升速度,但会略微损失对小目标的检测精度。results = model(source=frame, conf=0.3, imgsz=320) - 跳帧处理:对于非严格实时的分析任务(如事后分析录像),可以每N帧处理一帧,能成倍减少计算量。
- 使用更小的模型:在速度优先的场景下,果断换用
yolov10n.pt或yolov10s.pt。 - 启用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继承了一套非常成熟的训练流程。
整个过程可以概括为三步:准备数据、配置训练、启动训练。
第一步:准备数据
你需要收集包含你目标物体的图片,并进行标注。标注工具推荐使用LabelImg或Roboflow。标注完成后,数据应组织成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应用构建者。无论是简单的图片识别,还是复杂的视频流分析系统,甚至是针对特定场景定制化的检测方案,这套从环境到训练、从推理到部署的完整流程,都为你提供了坚实的技术基础。剩下的,就是发挥你的想象力,去创造更多的可能性了。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)