YOLOv8 车辆速度估计实战:透视变换、跟踪与速度计算

发布时间:2026/7/29 6:12:02
YOLOv8 车辆速度估计实战:透视变换、跟踪与速度计算 YOLOv8 车辆速度估计实战透视变换、跟踪与速度计算这篇教程根据我复现车辆速度估计流程时整理重点演示视频准备、检测跟踪、透视变换、距离映射和速度估算。本文整理自我的学习和项目复现过程尽量按实操顺序保留 notebook 的关键步骤同时把数据集获取方式调整为适合中文教程发布的写法。本文会重点跑通以下流程安装 YOLOv8 和 Supervision准备车辆视频配置道路透视区域和真实尺寸将画面坐标映射到鸟瞰坐标基于跟踪轨迹估算车辆速度如果你正在系统学习目标检测、实例分割、OCR、多目标跟踪或视觉大模型建议收藏本文配套 notebook、示例图片和运行环境说明后续会继续整理。如果环境配置卡住可以在评论区说明具体报错。 文章目录YOLOv8 车辆速度估计实战透视变换、跟踪与速度计算⚙️ 检查环境 安装依赖 导入依赖 准备车辆视频 设置检测参数 定义透视区域️ 查看透视区域️ 坐标变换工具 估算车辆速度 小结 同系列教程汇总⚙️ 检查环境先确认 GPU 和基础运行环境。!nvidia-smi 安装依赖安装 YOLOv8 和 Supervision。!pip install-q supervisionultralytics8.3.40# 关闭 Ultralytics 匿名同步!yolo settings syncFalse 导入依赖导入视频处理、检测、跟踪和速度计算模块。importcv2importnumpyasnpimportsupervisionassvfromtqdmimporttqdmfromultralyticsimportYOLOfromsupervision.assetsimportVideoAssets,download_assetsfromcollectionsimportdefaultdict,deque 准备车辆视频下载或准备车辆行驶视频。download_assets(VideoAssets.VEHICLES) 设置检测参数配置模型、阈值、输入分辨率和视频路径。SOURCE_VIDEO_PATHvehicles.mp4TARGET_VIDEO_PATHvehicles-result.mp4CONFIDENCE_THRESHOLD0.3IOU_THRESHOLD0.5MODEL_NAMEyolov8x.ptMODEL_RESOLUTION1280 定义透视区域在道路画面中定义源四边形和真实世界尺寸。SOURCEnp.array([[1252,787],[2298,803],[5039,2159],[-550,2159]])TARGET_WIDTH25TARGET_HEIGHT250TARGETnp.array([[0,0],[TARGET_WIDTH-1,0],[TARGET_WIDTH-1,TARGET_HEIGHT-1],[0,TARGET_HEIGHT-1],])frame_generatorsv.get_video_frames_generator(source_pathSOURCE_VIDEO_PATH)frame_iteratoriter(frame_generator)framenext(frame_iterator)️ 查看透视区域把透视区域画在原始帧上确认范围合理。annotated_frameframe.copy()annotated_framesv.draw_polygon(sceneannotated_frame,polygonSOURCE,colorsv.Color.red(),thickness4)sv.plot_image(annotated_frame)️ 坐标变换工具定义透视变换类将图像坐标转成鸟瞰坐标。classViewTransformer:def__init__(self,source:np.ndarray,target:np.ndarray)-None:sourcesource.astype(np.float32)targettarget.astype(np.float32)self.mcv2.getPerspectiveTransform(source,target)deftransform_points(self,points:np.ndarray)-np.ndarray:ifpoints.size0:returnpoints reshaped_pointspoints.reshape(-1,1,2).astype(np.float32)transformed_pointscv2.perspectiveTransform(reshaped_points,self.m)returntransformed_points.reshape(-1,2)view_transformerViewTransformer(sourceSOURCE,targetTARGET) 估算车辆速度运行 YOLOv8 检测、跟踪和速度计算并输出结果视频。modelYOLO(MODEL_NAME)video_infosv.VideoInfo.from_video_path(video_pathSOURCE_VIDEO_PATH)frame_generatorsv.get_video_frames_generator(source_pathSOURCE_VIDEO_PATH)# tracer initiationbyte_tracksv.ByteTrack(frame_ratevideo_info.fps,track_threshCONFIDENCE_THRESHOLD)# annotators configurationthicknesssv.calculate_dynamic_line_thickness(resolution_whvideo_info.resolution_wh)text_scalesv.calculate_dynamic_text_scale(resolution_whvideo_info.resolution_wh)bounding_box_annotatorsv.BoundingBoxAnnotator(thicknessthickness)label_annotatorsv.LabelAnnotator(text_scaletext_scale,text_thicknessthickness,text_positionsv.Position.BOTTOM_CENTER)trace_annotatorsv.TraceAnnotator(thicknessthickness,trace_lengthvideo_info.fps*2,positionsv.Position.BOTTOM_CENTER)polygon_zonesv.PolygonZone(polygonSOURCE,frame_resolution_whvideo_info.resolution_wh)coordinatesdefaultdict(lambda:deque(maxlenvideo_info.fps))# open target videowithsv.VideoSink(TARGET_VIDEO_PATH,video_info)assink:# loop over source video frameforframeintqdm(frame_generator,totalvideo_info.total_frames):resultmodel(frame,imgszMODEL_RESOLUTION,verboseFalse)[0]detectionssv.Detections.from_ultralytics(result)# filter out detections by class and confidencedetectionsdetections[detections.confidenceCONFIDENCE_THRESHOLD]detectionsdetections[detections.class_id!0]# filter out detections outside the zonedetectionsdetections[polygon_zone.trigger(detections)]# refine detections using non-max suppressiondetectionsdetections.with_nms(IOU_THRESHOLD)# pass detection through the trackerdetectionsbyte_track.update_with_detections(detectionsdetections)pointsdetections.get_anchors_coordinates(anchorsv.Position.BOTTOM_CENTER)# calculate the detections position inside the target RoIpointsview_transformer.transform_points(pointspoints).astype(int)# store detections positionfortracker_id,[_,y]inzip(detections.tracker_id,points):coordinates[tracker_id].append(y)# format labelslabels[]fortracker_idindetections.tracker_id:iflen(coordinates[tracker_id])video_info.fps/2:labels.append(f#{tracker_id})else:# calculate speedcoordinate_startcoordinates[tracker_id][-1]coordinate_endcoordinates[tracker_id][0]distanceabs(coordinate_start-coordinate_end)timelen(coordinates[tracker_id])/video_info.fps speeddistance/time*3.6labels.append(f#{tracker_id}{int(speed)}km/h)# annotate frameannotated_frameframe.copy()annotated_frametrace_annotator.annotate(sceneannotated_frame,detectionsdetections)annotated_framebounding_box_annotator.annotate(sceneannotated_frame,detectionsdetections)annotated_framelabel_annotator.annotate(sceneannotated_frame,detectionsdetections,labelslabels)# add frame to target videosink.write_frame(annotated_frame) 小结这篇教程完整整理了YOLOv8 车辆速度估计的核心复现流程。实际操作时建议先确认 GPU、依赖版本、数据集路径和模型权重路径再逐段运行 notebook。后续我会继续按源项目顺序整理同系列中的目标检测、实例分割、OCR、多目标跟踪和视觉大模型教程。 同系列教程汇总Google Gemini 3.5 Flash 零样本目标检测教程从提示词到可视化结果GLM-OCR 文档识别实战教程从验证码、公式到车牌 OCRRF-DETR ByteTrack 多目标跟踪实战教程从命令行到 Python 视频轨迹可视化SAM 3 图像分割实战教程文本、框和点提示的多种分割方式YOLOv8 车辆速度估计实战透视变换、跟踪与速度计算