ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLOv10 实时目标距离计算实战:基于边界框质心与像素-米换算的完整指南

YOLOv10 实时目标距离计算实战:基于边界框质心与像素-米换算的完整指南 YOLOv10 实时目标距离计算实战基于边界框质心与像素-米换算的完整指南【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10距离计算是计算机视觉空间分析中的常见需求。本文基于当前 YOLOv10 仓库NeurIPS 2024中提供的解决方案模块系统讲解如何利用检测与跟踪结果、以边界框质心为基准在实时视频流中测量两个目标之间的物理距离并完整覆盖交互方式、全部参数含义与底层实现原理。读完本文你将能够直接复现一套可运行的目标间距测量方案并根据场景标定像素与米的换算比例。什么是目标距离计算在指定空间内测量两个对象之间的间距即被称为距离计算。在 Ultralytics YOLO 系列项目中这一功能通过用户选中两个边界框bounding box计算两者质心centroid之间的像素距离再结合每米像素数标定值换算为物理距离米与毫米来实现。当前仓库在 ultralytics/solutions/distance_calculation.py 中提供了DistanceCalculation类它不关心检测模型的内部结构只消费model.track()产出的跟踪结果因此可以与仓库支持的 YOLOv10 等检测模型无缝配合。距离计算的核心价值根据原文档 distance-calculation.md 的总结在目标检测流程中引入距离计算主要有三方面收益定位精度Localization Precision提升计算机视觉任务中的空间定位准确度为后续决策提供更可靠的坐标依据。尺寸估计Size Estimation结合已知比例可进一步估计目标的物理尺寸增强对场景的上下文理解。场景理解Scene Understanding为环境建立三维化的空间感知帮助系统做出更合理的判断。典型落地场景包括车辆跟车距离监测、安防系统中的人员间距告警、物流分拣中的物体间距校验等。快速上手视频流距离计算完整示例以下示例来自原文档并保留了全部关键步骤读取视频 → 逐帧推理跟踪 → 交由DistanceCalculation计算并绘制距离 → 写出结果视频。from ultralytics import YOLO from ultralytics.solutions import distance_calculation import cv2 model YOLO(yolov8n.pt) names model.model.names cap cv2.VideoCapture(path/to/video/file.mp4) assert cap.isOpened(), Error reading video file w, h, fps (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS)) # Video writer video_writer cv2.VideoWriter(distance_calculation.avi, cv2.VideoWriter_fourcc(*mp4v), fps, (w, h)) # Init distance-calculation obj dist_obj distance_calculation.DistanceCalculation() dist_obj.set_args(namesnames, view_imgTrue) while cap.isOpened(): success, im0 cap.read() if not success: print(Video frame is empty or video processing has been successfully completed.) break tracks model.track(im0, persistTrue, showFalse) im0 dist_obj.start_process(im0, tracks) video_writer.write(im0) cap.release() video_writer.release() cv2.destroyAllWindows()代码中的关键环节说明model.track()是距离计算的输入源在 model.py 中track()方法会为模型注册跟踪器默认botsort.yaml见 ultralytics/cfg/trackers/botsort.yaml并强制persistTrue时跨帧保持跟踪 ID 连续。值得注意的是引擎层会为基于 ByteTrack 的跟踪方法自动将置信度兜底为0.1见 model.py因为低置信度预测输入是此类跟踪器的必要前提。start_process(im0, tracks)是计算入口它接收原始帧与跟踪结果内部完成质心提取、距离换算与可视化绘制并返回标注后的帧。当前仓库也支持 YOLOv10 权重仓库在 ultralytics/cfg/models/v10/ 下提供了yolov10n.yaml至yolov10x.yaml全套模型配置将示例中的权重替换为对应 YOLOv10 权重即可复用同一套距离计算流程无需改动其余代码。交互方式鼠标左键选择、右键一键清空DistanceCalculation会在运行时弹出名为Ultralytics Distance Estimation的窗口前提是环境支持imshow交互规则如下鼠标左键点击选中一个边界框。累计选中两个框后立即计算并绘制二者质心连线与距离。鼠标右键点击清空所有已选中的框与已绘制的点方便重新选择。这套交互逻辑实现在 distance_calculation.py 的mouse_event_for_distance中左键事件会遍历当前帧所有xyxy格式的边界框仅当点击坐标落在框内box[0] x box[2] and box[1] y box[3]且该跟踪 ID 尚未被选中时才记录该框右键事件则重置selected_boxes与点击计数。参数详解set_args配置参数set_args负责配置距离计算与画面显示参数。基于 distance_calculation.py 的源码实现完整参数如下名称类型默认值说明namesdictNone类别名称字典用于在框上标注类别标签pixels_per_meterint10每米对应的像素数是像素距离换算为物理距离的标定比例view_imgboolFalse是否实时显示处理后的画面弹出交互窗口line_thicknessint2边界框绘制线宽line_colorRGB(255, 255, 0)两个质心之间连线的颜色黄色centroid_colorRGB(255, 0, 255)每个边界框质心点的颜色洋红色提示pixels_per_meter直接决定换算结果的准确性建议在部署场景中先放置已知物理尺寸的参照物进行标定详见下文调优建议。model.track跟踪参数跟踪结果的质量直接决定距离计算的稳定性。原文档给出了track()的核心参数表名称类型默认值说明sourceim0None图片或视频的输入源persistboolFalse是否在帧间保持跟踪跨帧复用跟踪 IDtrackerstrbotsort.yaml跟踪方法可选bytetrack或botsortconffloat0.3置信度阈值ioufloat0.5IOU 阈值classeslistNone按类别过滤结果如classes0或classes[0,2,3]verboseboolTrue是否显示跟踪结果日志需要补充的底层细节即使在文档层面conf的默认展示为0.3一旦走track()入口model.py 会将其兜底为0.1以适配 ByteTrack 类跟踪器因此距离计算示例中无需显式传入conf。跟踪器配置文件可在 ultralytics/cfg/trackers/ 目录下查看与修改。源码级原理剖析1. 质心Centroid计算在 distance_calculation.py 中质心取边界框对角坐标的中点return int((box[0] box[2]) // 2), int((box[1] box[3]) // 2)即((x_min x_max) / 2, (y_min y_max) / 2)。质心代表目标的几何中心相比框角点它对目标尺度变化更稳健因此被选作距离测量的基准点。2. 像素距离 → 物理距离换算calculate_distance 先用欧氏距离公式计算两个质心间的像素距离pixel_distance math.sqrt((centroid1[0] - centroid2[0]) ** 2 (centroid1[1] - centroid2[1]) ** 2) return pixel_distance / self.pixel_per_meter, (pixel_distance / self.pixel_per_meter) * 1000返回值分别为米和毫米两种单位的距离。换算核心即像素距离 ÷ 每米像素数可见pixels_per_meter是唯一决定量纲正确性的标定参数。3. 可视化绘制距离线与距离文本的绘制由 plotting.py 中的plot_distance_and_line完成具体行为包括在画面左上角绘制白色信息底板标注Distance M: x.xxm与Distance MM: x.xxmm两行文本用line_color以 3 像素线宽连接两个质心用centroid_color以半径为 6 的实心圆分别标记两个质心。4. 关键边界条件在 start_process 中有两处值得注意的防御性处理无跟踪 ID 时跳过若tracks[0].boxes.id is None例如首帧跟踪器尚未产出 ID直接显示/返回画面而不计算距离避免空引用崩溃选中框随帧更新当已选中两个框后每一帧都会用该跟踪 ID 的最新边界框更新选中数据确保质心位置随时间移动而实时刷新距离数值也随之动态变化。调优建议与使用限制标定pixels_per_meter是精度的关键该值本质是图像平面上每米占多少个像素会随相机高度、焦距、视角变化。建议在部署场景中放置已知长度的参照物实测其在画面中的像素跨度后换算得到准确标定值。保持persistTrue距离计算依赖稳定的跟踪 ID 才能在帧间持续更新同一个目标的框位置关闭持久化会导致选中目标 ID 变化、距离无法连续计算。单目图像的固有局限该方案基于图像平面上的欧氏距离未考虑透视畸变与深度信息属于近似测量。若目标在画面中的深度差异大测量误差会随之增大对精度要求苛刻的场景应结合深度相机或透视矫正。显示环境依赖view_imgTrue时程序会弹出窗口并注册鼠标回调需要运行环境支持 GUI源码中通过check_imshow预检纯服务器环境下建议关闭该选项。延伸阅读解决方案模块源码ultralytics/solutions/distance_calculation.py绘制方法实现ultralytics/utils/plotting.py跟踪入口方法ultralytics/engine/model.py跟踪器配置ultralytics/cfg/trackers/botsort.yaml、ultralytics/cfg/trackers/bytetrack.yamlYOLOv10 模型配置ultralytics/cfg/models/v10/yolov10n.yamlAPI 参考文档docs/en/reference/solutions/distance_calculation.md【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表