资讯动态

YOLOv10 之 VisionEye 视觉眼:基于 Ultralytics 的对象精准定位与视觉映射实战指南

发布时间:2026/9/15 13:28:10 来源:尧图企业网站定制
YOLOv10 之 VisionEye 视觉眼基于 Ultralytics 的对象精准定位与视觉映射实战指南【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10导读VisionEye 是 Ultralytics 目标检测框架内置的一种可视化映射能力它让计算机像人眼一样锁定画面中的目标从指定视点出发将每个检测目标的中心点与一个固定汇聚点连接起来形成视觉聚焦式的标注效果。本文以 docs/en/guides/vision-eye.md 为核心结合仓库中ultralytics/utils/plotting.py的Annotator.visioneye源码实现完整讲解 VisionEye 对象映射、与目标跟踪结合、与距离计算结合三种实战用法以及全部可调参数。读者学完后可直接在自己的视频或摄像头流上复现这三种标注方案。VisionEye 对象映射是什么VisionEye视觉眼对象映射的核心思路是计算机不仅能检测出画面中的物体还能以人眼观察的方式对物体进行定点聚焦。它模拟了人眼从某一观察位置注视特定对象时的那种透视关系——在画面中选定一个汇聚点center point然后为每一个检测框计算检测框的中心点bounding box centroid在汇聚点与每个目标中心点之间画一条连线在汇聚点和目标中心点分别画实心圆点标记。最终输出的画面中所有目标都像被一双眼睛从同一个视点注视着视觉上一目了然非常适用于需要强调以某视角关注多个目标的监控、演示与可视化场景。从仓库源码看该能力由Annotator类的visioneye方法实现位于 ultralytics/utils/plotting.py#L579-L594def visioneye(self, box, center_point, color(235, 219, 11), pin_color(255, 0, 255), thickness2, pins_radius10): Function for pinpoint human-vision eye mapping and plotting. Args: box (list): Bounding box coordinates center_point (tuple): center point for vision eye view color (tuple): object centroid and line color value pin_color (tuple): visioneye point color value thickness (int): int value for line thickness pins_radius (int): visioneye point radius value center_bbox int((box[0] box[2]) / 2), int((box[1] box[3]) / 2) cv2.circle(self.im, center_point, pins_radius, pin_color, -1) cv2.circle(self.im, center_bbox, pins_radius, color, -1) cv2.line(self.im, center_point, center_bbox, color, thickness)可以看到该方法的实现非常直观目标中心点center_bbox直接取检测框左上角(x1, y1)与右下角(x2, y2)的中点然后分别绘制汇聚点圆粉色pin_color与目标中心点圆黄色color最后用同色直线将二者相连。整条视觉眼链路建立在检测框坐标之上因此可以无缝接入检测、跟踪、距离计算等任意下游流程。运行环境准备VisionEye 属于 Ultralytics 的可视化工具无需额外安装特殊依赖只需安装 Ultralytics 包本仓库即为其源码安装后即可导入ultralytics安装 OpenCV示例中直接使用import cv2读取视频、写入输出文件准备一个视频文件如path/to/video/file.mp4或摄像头设备。示例统一从ultralytics.utils.plotting导入两个核心符号from ultralytics.utils.plotting import colors, Annotatorcolors预置的颜色调色板实例定义于 ultralytics/utils/plotting.py#L96-L96可按索引colors(int(cls))为每个类别/跟踪 ID 分配稳定颜色Annotator标注器类封装了对图像的所有绘制操作构造时传入line_width2控制线宽其内部会依据图像尺寸自动计算线宽与字体大小见 ultralytics/utils/plotting.py#L113-L118。方案一VisionEye 对象映射纯检测这是最基础的用法每一帧先执行检测再对每个检测框调用annotator.visioneye(box, center_point)。完整示例代码继承自原文档import cv2 from ultralytics import YOLO from ultralytics.utils.plotting import colors, Annotator model YOLO(yolov8n.pt) names model.model.names cap cv2.VideoCapture(path/to/video/file.mp4) w, h, fps (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS)) out cv2.VideoWriter(visioneye-pinpoint.avi, cv2.VideoWriter_fourcc(*MJPG), fps, (w, h)) center_point (-10, h) while True: ret, im0 cap.read() if not ret: print(Video frame is empty or video processing has been successfully completed.) break results model.predict(im0) boxes results[0].boxes.xyxy.cpu() clss results[0].boxes.cls.cpu().tolist() annotator Annotator(im0, line_width2) for box, cls in zip(boxes, clss): annotator.box_label(box, labelnames[int(cls)], colorcolors(int(cls))) annotator.visioneye(box, center_point) out.write(im0) cv2.imshow(visioneye-pinpoint, im0) if cv2.waitKey(1) 0xFF ord(q): break out.release() cap.release() cv2.destroyAllWindows()关键点说明汇聚点选择示例中center_point (-10, h)将视点放在画面左下角之外x 坐标为负、y 坐标等于画面高度模拟从下方角落向上注视的人眼视角。你可以改为画面中心(w // 2, h // 2)、画面顶端(w // 2, 0)或任意坐标决定整体视觉汇聚方向检测框坐标results[0].boxes.xyxy为(N, 4)的张量格式是(x1, y1, x2, y2)与visioneye方法期望的box参数完全一致类别标注box_label用于绘制检测框与类别名标签颜色按类别索引从colors调色板中取视频写回用cv2.VideoWriter以 MJPG 编码将标注帧写回visioneye-pinpoint.avi同时用cv2.imshow实时预览按q键退出。方案二VisionEye 对象映射 目标跟踪在检测基础上叠加多目标跟踪tracking可以持续锁定同一物体VisionEye 的连线也会跟随物体移动呈现出眼睛始终盯着移动目标的效果。完整示例代码继承自原文档import cv2 from ultralytics import YOLO from ultralytics.utils.plotting import colors, Annotator model YOLO(yolov8n.pt) cap cv2.VideoCapture(path/to/video/file.mp4) w, h, fps (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS)) out cv2.VideoWriter(visioneye-pinpoint.avi, cv2.VideoWriter_fourcc(*MJPG), fps, (w, h)) center_point (-10, h) while True: ret, im0 cap.read() if not ret: print(Video frame is empty or video processing has been successfully completed.) break annotator Annotator(im0, line_width2) results model.track(im0, persistTrue) boxes results[0].boxes.xyxy.cpu() if results[0].boxes.id is not None: track_ids results[0].boxes.id.int().cpu().tolist() for box, track_id in zip(boxes, track_ids): annotator.box_label(box, labelstr(track_id), colorcolors(int(track_id))) annotator.visioneye(box, center_point) out.write(im0) cv2.imshow(visioneye-pinpoint, im0) if cv2.waitKey(1) 0xFF ord(q): break out.release() cap.release() cv2.destroyAllWindows()与方案一的差异使用model.track(im0, persistTrue)替代model.predict(im0)persistTrue表示跨帧维持跟踪 ID通过results[0].boxes.id获取每个目标的跟踪 ID当id为None跟踪器未初始化时跳过标注避免空指针标签从类别名换成跟踪 ID 字符串颜色按colors(int(track_id))分配不同物体在视觉眼连线中呈现不同颜色便于区分检测框的box_label与visioneye都在Annotator实例上完成跟踪结果直接复用方案一的坐标管道。方案三VisionEye 距离计算VisionEye 与距离计算结合后可以在视觉眼连线的同时实时估算每个目标与汇聚点之间的像素距离并以米为单位标注在目标中心点旁。完整示例代码继承自原文档import cv2 import math from ultralytics import YOLO from ultralytics.utils.plotting import Annotator, colors model YOLO(yolov8s.pt) cap cv2.VideoCapture(Path/to/video/file.mp4) w, h, fps (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS)) out cv2.VideoWriter(visioneye-distance-calculation.avi, cv2.VideoWriter_fourcc(*MJPG), fps, (w, h)) center_point (0, h) pixel_per_meter 10 txt_color, txt_background, bbox_clr ((0, 0, 0), (255, 255, 255), (255, 0, 255)) while True: ret, im0 cap.read() if not ret: print(Video frame is empty or video processing has been successfully completed.) break annotator Annotator(im0, line_width2) results model.track(im0, persistTrue) boxes results[0].boxes.xyxy.cpu() if results[0].boxes.id is not None: track_ids results[0].boxes.id.int().cpu().tolist() for box, track_id in zip(boxes, track_ids): annotator.box_label(box, labelstr(track_id), colorbbox_clr) annotator.visioneye(box, center_point) x1, y1 int((box[0] box[2]) // 2), int((box[1] box[3]) // 2) # Bounding box centroid distance (math.sqrt((x1 - center_point[0]) ** 2 (y1 - center_point[1]) ** 2))/pixel_per_meter text_size, _ cv2.getTextSize(fDistance: {distance:.2f} m, cv2.FONT_HERSHEY_SIMPLEX,1.2, 3) cv2.rectangle(im0, (x1, y1 - text_size[1] - 10),(x1 text_size[0] 10, y1), txt_background, -1) cv2.putText(im0, fDistance: {distance:.2f} m,(x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 1.2,txt_color, 3) out.write(im0) cv2.imshow(visioneye-distance-calculation, im0) if cv2.waitKey(1) 0xFF ord(q): break out.release() cap.release() cv2.destroyAllWindows()距离计算的实现逻辑拆解目标中心点x1, y1 (box[0] box[2]) // 2, (box[1] box[3]) // 2与visioneye内部计算的center_bbox完全一致保证连线端点与距离测点重合欧氏距离math.sqrt((x1 - center_point[0]) ** 2 (y1 - center_point[1]) ** 2)计算目标中心与汇聚点的像素距离像素-米换算pixel_per_meter 10是每米像素数标定系数距离除以该系数即得到米为单位的估算值。该系数需要根据你的相机安装高度、镜头视场角等实际场景标定是距离数值是否可信的关键前提文本绘制先用cv2.getTextSize测量文本尺寸再以txt_background白色画填充矩形作背景最后用txt_color黑色写入Distance: xx.xx m文本保证文字在任何背景上都清晰可读。仓库还提供了另一种更完整的距离标注方案Annotator.plot_distance_and_line方法见 ultralytics/utils/plotting.py#L534-L577它同时输出米与毫米两种单位的距离文本、并在两个目标中心点之间绘制连线与圆点适合目标与目标之间的相对距离测算可参考 distance-calculation 指南 获取完整用法。visioneye参数详解Annotator.visioneye的全部可调参数如下与源码签名一一对应参数名类型默认值说明colortuple(235, 219, 11)目标中心点圆与连线的颜色默认黄色pin_colortuple(255, 0, 255)汇聚点VisionEye 视点圆点的颜色默认品红thicknessint2汇聚点与目标中心点之间连线的线宽像素pins_radiusint10汇聚点圆与目标中心点圆的半径像素使用建议需要同时处理大量小目标时可适当减小pins_radius如 4~6与thickness如 1避免圆点互相遮挡在明亮或暗色背景场景中可自定义color与pin_color以增强对比度center_point是汇聚点的核心配置传入画面内的坐标即可得到全目标向该点汇聚的视觉眼效果。注意事项读取终止条件循环中通过cap.read()的返回值判断视频是否结束结束时打印提示信息并正常释放资源推理结果格式results[0].boxes.xyxy需要先.cpu()再使用便于在 CPU 侧逐框遍历跟踪器可用性model.track依赖仓库内置的 ByteTrack / BoTSORT 跟踪器配置见 cfg/trackers首次调用会自动加载对应跟踪配置参数化调优三个示例分别采用yolov8n.pt与yolov8s.pt实际项目中可按精度/速度需求替换为本仓库 cfg/models/v10 中定义的 YOLOv10 系列权重model.track、model.predict的更多推理参数置信度阈值、IOU 阈值、设备等可参考 predict 模式文档真实感前提示例中的距离值为像素距离 / 每米像素数的估算结果仅在同一相机、固定机位与统一标定系数下具备相对参考意义不应视为精确物理测距。总结VisionEye 对象映射把检测—聚焦—可视化串成一条完整链路model.predict/model.track负责定位目标Annotator.box_label负责框选标注Annotator.visioneye负责绘制人眼视点连线。三者组合即可快速产出具备透视聚焦感的监控或演示画面并可叠加基于欧氏距离的目标距离估算。其全部绘制逻辑浓缩在 ultralytics/utils/plotting.py#L579-L594 的visioneye方法中参数透明、逻辑直观方便按业务场景二次定制。【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价