news 2026/7/29 1:50:25

YOLOv8 + ByteTrack 车辆跟踪计数实战:跨线统计完整流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv8 + ByteTrack 车辆跟踪计数实战:跨线统计完整流程

YOLOv8 + ByteTrack 车辆跟踪计数实战:跨线统计完整流程


这篇教程根据我复现车辆跟踪计数流程时整理,重点演示视频准备、YOLOv8 检测、ByteTrack 跟踪、跨线计数和结果视频导出。

本文整理自我的学习和项目复现过程,尽量按实操顺序保留 notebook 的关键步骤,同时把数据集获取方式调整为适合中文教程发布的写法。

本文会重点跑通以下流程:

  • 准备车辆计数视频
  • 安装 YOLOv8 和 ByteTrack
  • 封装跟踪器参数与匹配逻辑
  • 筛选车辆类别并运行检测
  • 按跨线方向统计车辆数量

如果你正在系统学习目标检测、实例分割、OCR、多目标跟踪或视觉大模型,建议收藏本文;配套 notebook、示例图片和运行环境说明后续会继续整理。如果环境配置卡住,可以在评论区说明具体报错。

📚 文章目录

  • YOLOv8 + ByteTrack 车辆跟踪计数实战:跨线统计完整流程
    • ⚙️ 检查环境
    • 🎬 准备车辆视频
    • 🧩 安装 YOLOv8
    • 🧩 安装 ByteTrack
    • 🔧 封装跟踪参数
    • 🧩 安装 Supervision
    • 🚗 加载检测模型
    • 🏷️ 筛选车辆类别
    • 🖼️ 单帧检测预览
    • 📏 设置计数线
    • 📹 生成计数视频
    • 📌 小结
    • 📚 同系列教程汇总

⚙️ 检查环境

确认 GPU 和工作目录。

!nvidia-smi
importos HOME=os.getcwd()print(HOME)

🎬 准备车辆视频

下载车辆计数示例视频,也可以替换为自己的视频。

%cd{HOME}!wget--load-cookies/tmp/cookies.txt"https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1pz68D1Gsx80MoPg-_q-IbEdESEmyVLm-' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1pz68D1Gsx80MoPg-_q-IbEdESEmyVLm-"-O vehicle-counting.mp4&&rm-rf/tmp/cookies.txt
SOURCE_VIDEO_PATH=f"{HOME}/vehicle-counting.mp4"

🧩 安装 YOLOv8

安装 Ultralytics 并关闭匿名同步。

# Pip install method (recommended)!pip install"ultralytics<=8.3.40"fromIPythonimportdisplay display.clear_output()# 关闭 Ultralytics 匿名同步!yolo settings sync=Falseimportultralytics ultralytics.checks()

🧩 安装 ByteTrack

安装 ByteTrack 及相关依赖。

%cd{HOME}!git clone https://github.com/ifzhang/ByteTrack.git%cd{HOME}/ByteTrack# 兼容旧版依赖!sed-i's/onnx==1.8.1/onnx==1.9.0/g'requirements.txt !pip3 install-q-r requirements.txt !python3 setup.py-q develop !pip install-q cython_bbox !pip install-q onemetric# 兼容旧版依赖!pip install-q loguru lap thopfromIPythonimportdisplay display.clear_output()importsys sys.path.append(f"{HOME}/ByteTrack")importyoloxprint("yolox.__version__:",yolox.__version__)

🔧 封装跟踪参数

定义 ByteTrack 参数和检测框匹配逻辑。

fromyolox.tracker.byte_trackerimportBYTETracker,STrackfromonemetric.cv.utils.iouimportbox_iou_batchfromdataclassesimportdataclass@dataclass(frozen=True)classBYTETrackerArgs:track_thresh:float=0.25track_buffer:int=30match_thresh:float=0.8aspect_ratio_thresh:float=3.0min_box_area:float=1.0mot20:bool=False

🧩 安装 Supervision

安装视频读取、标注和跨线计数工具。

!pip install supervision==0.1.0fromIPythonimportdisplay display.clear_output()importsupervisionprint("supervision.__version__:",supervision.__version__)
fromsupervision.draw.colorimportColorPalettefromsupervision.geometry.dataclassesimportPointfromsupervision.video.dataclassesimportVideoInfofromsupervision.video.sourceimportget_video_frames_generatorfromsupervision.video.sinkimportVideoSinkfromsupervision.notebook.utilsimportshow_frame_in_notebookfromsupervision.tools.detectionsimportDetections,BoxAnnotatorfromsupervision.tools.line_counterimportLineCounter,LineCounterAnnotator
fromtypingimportListimportnumpyasnp# converts Detections into format that can be consumed by match_detections_with_tracks functiondefdetections2boxes(detections:Detections)->np.ndarray:returnnp.hstack((detections.xyxy,detections.confidence[:,np.newaxis]))# converts List[STrack] into format that can be consumed by match_detections_with_tracks functiondeftracks2boxes(tracks:List[STrack])->np.ndarray:returnnp.array([track.tlbrfortrackintracks],dtype=float)# matches our bounding boxes with predictionsdefmatch_detections_with_tracks(detections:Detections,tracks:List[STrack])->Detections:ifnotnp.any(detections.xyxy)orlen(tracks)==0:returnnp.empty((0,))tracks_boxes=tracks2boxes(tracks=tracks)iou=box_iou_batch(tracks_boxes,detections.xyxy)track2detection=np.argmax(iou,axis=1)tracker_ids=[None]*len(detections)fortracker_index,detection_indexinenumerate(track2detection):ifiou[tracker_index,detection_index]!=0:tracker_ids[detection_index]=tracks[tracker_index].track_idreturntracker_ids

🚗 加载检测模型

加载 YOLOv8 车辆检测模型。

# 参数设置MODEL="yolov8x.pt"
fromultralyticsimportYOLO model=YOLO(MODEL)model.fuse()

🏷️ 筛选车辆类别

只保留 car、motorcycle、bus、truck 等类别。

# 类别 ID 到类别名的映射CLASS_NAMES_DICT=model.model.names# 关注车辆类别:car、motorcycle、bus、truckCLASS_ID=[2,3,5,7]

🖼️ 单帧检测预览

在单帧上检查检测框和类别标签。

# 创建视频帧生成器generator=get_video_frames_generator(SOURCE_VIDEO_PATH)# create instance of BoxAnnotatorbox_annotator=BoxAnnotator(color=ColorPalette(),thickness=4,text_thickness=4,text_scale=2)# acquire first video frameiterator=iter(generator)frame=next(iterator)# model prediction on single frame and conversion to supervision Detectionsresults=model(frame)detections=Detections(xyxy=results[0].boxes.xyxy.cpu().numpy(),confidence=results[0].boxes.conf.cpu().numpy(),class_id=results[0].boxes.cls.cpu().numpy().astype(int))# format custom labelslabels=[f"{CLASS_NAMES_DICT[class_id]}{confidence:0.2f}"for_,confidence,class_id,tracker_idindetections]# annotate and display frameframe=box_annotator.annotate(frame=frame,detections=detections,labels=labels)%matplotlib inline show_frame_in_notebook(frame,(16,16))

📏 设置计数线

定义跨线统计位置和输出视频路径。

# 参数设置LINE_START=Point(50,1500)LINE_END=Point(3840-50,1500)TARGET_VIDEO_PATH=f"{HOME}/vehicle-counting-result.mp4"
VideoInfo.from_video_path(SOURCE_VIDEO_PATH)

📹 生成计数视频

逐帧检测、跟踪并统计车辆通过数量。

fromtqdm.notebookimporttqdm# create BYTETracker instancebyte_tracker=BYTETracker(BYTETrackerArgs())# create VideoInfo instancevideo_info=VideoInfo.from_video_path(SOURCE_VIDEO_PATH)# 创建视频帧生成器generator=get_video_frames_generator(SOURCE_VIDEO_PATH)# create LineCounter instanceline_counter=LineCounter(start=LINE_START,end=LINE_END)# create instance of BoxAnnotator and LineCounterAnnotatorbox_annotator=BoxAnnotator(color=ColorPalette(),thickness=4,text_thickness=4,text_scale=2)line_annotator=LineCounterAnnotator(thickness=4,text_thickness=4,text_scale=2)# open target video filewithVideoSink(TARGET_VIDEO_PATH,video_info)assink:# loop over video framesforframeintqdm(generator,total=video_info.total_frames):# model prediction on single frame and conversion to supervision Detectionsresults=model(frame)detections=Detections(xyxy=results[0].boxes.xyxy.cpu().numpy(),confidence=results[0].boxes.conf.cpu().numpy(),class_id=results[0].boxes.cls.cpu().numpy().astype(int))# filtering out detections with unwanted classesmask=np.array([class_idinCLASS_IDforclass_idindetections.class_id],dtype=bool)detections.filter(mask=mask,inplace=True)# tracking detectionstracks=byte_tracker.update(output_results=detections2boxes(detections=detections),img_info=frame.shape,img_size=frame.shape)tracker_id=match_detections_with_tracks(detections=detections,tracks=tracks)detections.tracker_id=np.array(tracker_id)# filtering out detections without trackersmask=np.array([tracker_idisnotNonefortracker_idindetections.tracker_id],dtype=bool)detections.filter(mask=mask,inplace=True)# format custom labelslabels=[f"#{tracker_id}{CLASS_NAMES_DICT[class_id]}{confidence:0.2f}"for_,confidence,class_id,tracker_idindetections]# updating line counterline_counter.update(detections=detections)# annotate and display frameframe=box_annotator.annotate(frame=frame,detections=detections,labels=labels)line_annotator.annotate(frame=frame,line_counter=line_counter)sink.write_frame(frame)

📌 小结

这篇教程完整整理了YOLOv8 车辆跟踪计数的核心复现流程。实际操作时,建议先确认 GPU、依赖版本、数据集路径和模型权重路径,再逐段运行 notebook。

后续我会继续按源项目顺序整理同系列中的目标检测、实例分割、OCR、多目标跟踪和视觉大模型教程。

📚 同系列教程汇总

  • Google Gemini 3.5 Flash 零样本目标检测教程:从提示词到可视化结果

  • GLM-OCR 文档识别实战教程:从验证码、公式到车牌 OCR

  • RF-DETR + ByteTrack 多目标跟踪实战教程:从命令行到 Python 视频轨迹可视化

  • SAM 3 图像分割实战教程:文本、框和点提示的多种分割方式

  • YOLOv8 + ByteTrack 车辆跟踪计数实战:跨线统计完整流程

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 1:49:47

MOMENT:时间序列分析中的预训练基础模型实践

1. MOMENT&#xff1a;时间序列分析的新范式第一次看到MOMENT这个项目时&#xff0c;我正为一个工业设备预测性维护项目焦头烂额。传统的时间序列模型在跨设备泛化表现上始终差强人意&#xff0c;直到发现这套开源基础模型&#xff0c;才真正体会到"预训练微调"范式在…

作者头像 李华
网站建设 2026/7/29 1:46:02

JavaEE(JVM、多线程、网络编程)核心知识点全梳理

# JavaEE初阶核心知识点全梳理&#xff08;面试复习版&#xff09;> 本文基于《Java后端极速唤醒计划》的Day 1-2内容&#xff0c;结合多份PDF学习资料&#xff0c;系统整理了JavaEE初阶必须掌握的**JVM、多线程、网络编程、HTTP/HTTPS**四大核心模块。目标读者是“学过但遗…

作者头像 李华
网站建设 2026/7/29 1:45:54

【2026必藏】6款智能降AI率网站全网首测,一键实现AI检测丝滑过审!

步入 2026 年&#xff0c;学术圈的风向早已彻底改变。曾经让人焦头烂额的查重问题&#xff0c;如今已不再是唯一的心头大患。随着 AI 检测技术的不断进化&#xff0c;高校对论文的审查标准也愈发严苛&#xff0c;AI 痕迹的识别能力已经精准到连句式结构和用词习惯都能被一网打尽…

作者头像 李华
网站建设 2026/7/29 1:43:55

Grok CLI教程生成功能:命令行中的智能技术学习助手

在日常开发工作中&#xff0c;我们经常需要快速获取技术指导或代码示例&#xff0c;但频繁切换浏览器和文档页面会打断工作流。最近&#xff0c;xAI 发布的 Grok CLI 工具带来了一个创新功能——/tutorial命令&#xff0c;让开发者能够直接在命令行中生成完整的技术教程和代码示…

作者头像 李华
网站建设 2026/7/29 1:43:25

AI工具≠副业收入,深度拆解:为什么你用ChatGPT接单却持续亏损?

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;AI工具≠副业收入&#xff1a;一个被严重误读的等式 当“用ChatGPT月入过万”“Stable Diffusion接单暴利”成为社交平台高频标签&#xff0c;大量技术新手误将AI工具的易用性等同于变现确定性。这种认知偏差…

作者头像 李华
网站建设 2026/7/29 1:41:59

UE5项目性能优化

PDF版本&#xff1a; 链接: https://pan.baidu.com/s/1dT_7VgqElu4J_CE84aRpVQ 提取码: bymm 1. 如何使用UE5 Profiler识别CPU瓶颈 在UE5中&#xff0c;识别CPU瓶颈的核心在于区分是游戏逻辑&#xff08;Game Thread&#xff09;还是渲染准备&#xff08;Render Thread&#xf…

作者头像 李华