当前位置: 首页 > news >正文

【Yolov5+Deepsort】训练自己的数据集(1)| 目标检测追踪 | 轨迹绘制

📢前言:本篇是关于如何使用YoloV5+Deepsort训练自己的数据集,从而实现目标检测与目标追踪,并绘制出物体的运动轨迹。本章讲解的为第一个内容:简单介绍YoloV5+Deepsort中所用到的目标检测,追踪及sort&Deppsort算法。本文中用到的数据集均为自采,实验动物为斑马鱼。文尾附Deepsort原论文。

💬源码如下:

GitHub - mikel-brostrom/yolo_tracking: A collection of SOTA real-time, multi-object tracking algorithms for object detectors

GitHub - Sharpiless/Yolov5-Deepsort: 最新版本yolov5+deepsort目标检测和追踪,能够显示目标类别,支持5.0版本可训练自己数据集

目录

Ⅰ简述目标检测

0x00 什么是目标检测

0x01 一般步骤

0x02 常用算法

Ⅱ 简述目标追踪

0x00 什么是目标追踪

0x01 一般步骤

0x02 常用算法

Ⅲ sort算法

0x00 卡尔曼滤波

0x01 匈牙利算法

Ⅳ Deepsort

0x00 算法的一般流程


Ⅰ简述目标检测

0x00 什么是目标检测

目标检测是计算机视觉领域的一个重要任务,它旨在识别图像或视频中的特定对象,并通过在目标周围绘制边界框(bounding box)来标记它们的位置。

这种技术在许多实际应用中都有广泛的应用,如自动驾驶、安防监控、智能交通、人脸识别、工业质检等。

0x01 一般步骤

1. 输入图像:

  • 首先,目标检测算法会接收一个输入图像或视频帧。

2. 特征提取

  • 然后,算法会通过卷积神经网络(CNN)等方法对图像进行特征提取。这些特征可以是边缘、纹理、颜色等图像的局部或全局特征。

3. 候选区域生成

  • 接下来,目标检测算法会根据特征图选择一些可能包含目标的候选区域,通常称为区域提议(Region Proposals)。常用的方法包括Selective Search、R-CNN等。

4. 目标分类与定位:

  • 在得到候选区域后,算法会对每个区域进行目标分类和边界框的回归。目标分类是指确定区域中是否包含目标(如车、人、动物等),而边界框回归则是调整候选框的位置和大小以更准确地围绕目标。

5. 后处理:

  • 最后,算法会进行一些后处理步骤,例如非极大值抑制(NMS),以剔除重叠的边界框并保留最可信的检测结果。

目标检测有许多不同的算法和架构,其中一些著名的方法包括Faster R-CNN、YOLO、SSD(SINGLE SHOT MULTIBOX DETECTOR)、RetinaNet等。每种方法都有其优缺点和适用场景,取决于应用需求和计算资源。

0x02 常用算法

RCNN系列:

  • RCNN(Region-based Convolutional Neural Networks): 首先通过选择性搜索(Selective Search)算法提取候选区域,然后对每个候选区域进行卷积神经网络(CNN)特征提取和目标分类。

  • Fast R-CNN: 在RCNN的基础上引入ROI池化(ROI Pooling)层,使得特征提取更高效。

  • Faster R-CNN: 引入RPN(Region Proposal Network),将候选区域的提取和目标分类合并为一个端到端的网络,大大加快了检测速度。

YOLO系列

  • YOLOv1:将目标检测看作回归问题,通过一个CNN直接预测目标的边界框和类别概率。
  • YOLOv2 / YOLO9000:在YOLOv1基础上改进,引入Darknet-19网络和多尺度预测,提高检测精度。YOLO9000是在YOLOv2的基础上通过联合训练多个数据集实现了多标签分类和检测。
  • YOLOv3:进一步改进YOLOv2,采用更深的Darknet-53网络和FPN,提高小目标检测性能。

SSD(Single Shot Multibox Detector):一种单阶段目标检测算法,通过在不同尺度的特征图上预测边界框和类别概率来实现目标检测。

RetinaNet:结合了Focal Loss和FPN,用于解决目标检测中类别不平衡问题,提高了检测性能。 

EfficientDet:高效的目标检测算法,通过改进网络结构和优化目标函数,实现高精度和高效率的目标检测。

Ⅱ 简述目标追踪

0x00 什么是目标追踪

目标追踪是计算机视觉领域的一项任务,旨在从视频序列中连续地跟踪特定目标的运动轨迹。与目标检测不同,目标追踪要在时间上保持目标的一致性,而不仅仅是在单个图像中检测目标的存在。

0x01 一般步骤

1. 目标初始化: 首先,目标追踪算法会在视频序列的第一帧中检测和识别目标,并为目标分配唯一的ID。这个过程称为目标初始化。

2. 目标预测: 在之后的视频帧中,目标追踪算法会使用目标在上一帧中的位置和运动信息,对目标在当前帧的位置进行预测。通常,预测可以基于一些简单的运动模型或者基于目标的历史运动轨迹。

3. 目标更新: 接下来,算法会使用目标检测或特征匹配等技术来确定当前帧中目标的准确位置。这个过程可以使用像素级的区域匹配、相关滤波器、深度学习特征提取等方法。

4. 目标关联: 一旦目标在当前帧中被确定,算法需要将其与之前帧中的目标进行关联,以保持目标的一致性。这可能涉及到目标ID的跟踪,确保目标的唯一标识在整个视频序列中保持一致。

5. 后处理: 最后,目标追踪算法会进行一些后处理步骤,例如滤波或者平滑处理,以减少噪声或者不稳定性,并提高追踪的准确性和稳定性。

目标追踪在许多实际应用中都有广泛的应用,例如视频监控、自动驾驶、视频分析、虚拟现实等。

0x02 常用算法

卡尔曼滤波器(Kalman Filter): 卡尔曼滤波是一种递归的状态估计算法,通常用于目标运动预测和位置估计。它结合了观测数据和系统动力学模型,对目标的状态进行预测和更新。

粒子滤波器(Particle Filter): 粒子滤波是一种蒙特卡洛方法,它使用一组随机粒子来估计目标的状态。粒子滤波在非线性系统和非高斯噪声下表现较好。

单目标跟踪器:

  • MedianFlow: 基于KLT(Kanade-Lucas-Tomasi)光流和匹配的简单单目标跟踪器。
  • KCF(Kernelized Correlation Filters): 使用核相关滤波器来实现快速的单目标跟踪。
  • TLD(Tracking-Learning-Detection): 结合目标检测和跟踪,能够在目标丢失时重新检测目标。
  • MIL(Multi Instance Learning): 采用多实例学习方法跟踪目标。

多目标跟踪器:

  • SORT(Simple Online and Real Time Tracking): 在多目标跟踪中,通过卡尔曼滤波和匈牙利算法进行目标关联。
  • DeepSORT: 在SORT的基础上加入深度学习特征,提高目标关联的准确性和鲁棒性。
  • IOU Tracker: 使用目标边界框的IoU(Intersection over Union)来进行目标关联的简单方法。

深度学习方法:

  • Siamese网络: 使用孪生网络进行目标匹配,常用于目标跟踪任务。
  • SiamRPN、SiamFC、SiamMask: 基于Siam网络的不同变种,用于目标跟踪和目标分割。

在线学习方法:

  • 在线提升: 在线增强学习器,不断地更新模型来适应目标外观的变化。
  • Online SVM(Support Vector Machine): 在线学习SVM,用于目标分类和跟踪。

Ⅲ sort算法

SORT(Simple Online and Realtime Tracking)是一种用于多目标跟踪的简单而有效的算法,它在实时场景下能够进行在线目标追踪。

SORT算法基于卡尔曼滤波匈牙利算法的多目标跟踪器。

0x00 卡尔曼滤波

卡尔曼滤波是一种递归状态估计算法,主要用于估计目标在时间上的运动状态,例如位置和速度。

  • 在SORT算法中,卡尔曼滤波的作用是用于对目标的状态进行预测和更新
  • 在目标追踪过程中,卡尔曼滤波能够对目标的运动轨迹进行预测,并根据实际的检测结果对目标状态进行更新。

卡尔曼滤波的作用可分为两个主要方面:

1.目标预测

  • 在目标追踪过程中,目标在每一帧中都会进行位置预测。卡尔曼滤波通过使用之前帧中的目标状态和运动信息,预测目标在下一帧中的位置和速度。这样能够使得目标跟踪器对目标的未来位置有一个较好的估计。

2.状态更新

  • 在进行目标关联时,SORT算法会使用匈牙利算法将当前帧的检测结果与之前帧中的目标进行关联。关联的结果可能会包含一些噪声或误匹配,而卡尔曼滤波可以在一定程度上消除这些误差。通过将检测结果与卡尔曼滤波预测的状态进行融合,得到目标的最终位置和速度,并对目标状态进行更新。

0x01 匈牙利算法

匈牙利算法是用于解决二分图最优匹配问题的经典算法,它能够在多个候选匹配中找到最佳的匹配组合,以最小化总匹配成本。  

  • 在SORT算法中,匈牙利算法的作用是将当前帧的目标检测结果与之前帧中的跟踪目标进行关联,以确定目标在连续帧中的唯一ID。

SORT中的匈牙利算法的具体作用如下:

1.目标关联

  • 在每一帧中,进行目标检测,得到新的目标边界框。同时,之前帧中的每个已跟踪目标也有一个预测位置。
  • SORT算法会使用匈牙利算法,将当前帧的检测结果与之前帧中的目标进行关联。将目标检测与预测的目标进行匹配,得到最佳的匹配组合。

2.成本计算

  • 匈牙利算法会计算目标检测与预测目标之间的成本,成本通常由目标边界框之间的IoU(Intersection over Union)计算得出。IoU度量了两个边界框的重叠程度,可以用来评估目标检测与预测目标的相似程度。

3.最优匹配

  • 匈牙利算法的目标是找到一种最佳匹配,使得总成本最小。通过最小化目标检测与预测目标之间的成本,找到最佳的匹配组合,确定目标在连续帧中的唯一ID。

4.目标ID更新

  • 在完成匈牙利算法后,已跟踪目标的ID会随着匹配的结果进行更新。如果一个目标检测与之前的某个目标匹配,该目标将被赋予相应的ID,从而在多个连续帧中保持一致的跟踪。

🚩简单来说:

在sort算法中,

卡尔曼滤波的主要作用是利用当前时刻的运动变量来预测下一时刻的运动变量,同时第一次的检测结果用于初始化卡尔曼滤波的运动状态

匈牙利算法主要作用是将一组检测框和卡尔曼预测的框进行匹配,以找到卡尔曼预测的框与其最匹配的检测框,从而实现目标的追踪

Ⅳ Deepsort算法

DeepSORT(Deep Learning-based SORT)是基于深度学习的多目标跟踪算法,是SORT的改进版。

0x00 算法的一般流程

1.目标检测

  • 在每一帧中,使用目标检测算法(如YOLO、Faster R-CNN、SSD等)来检测图像中的目标,并得到目标的边界框(bounding box)和类别信息。

2.深度特征提取

  • 对于每个检测到的目标,使用预训练的深度学习模型(如ResNet、MobileNet等)来提取目标区域的特征向量。这些特征向量能够表示目标的语义信息和视觉特征。

3.目标关联

  • 利用匈牙利算法将当前帧的检测结果与之前帧中的跟踪目标进行关联。匈牙利算法通过最小化匹配的总成本来找到最佳的匹配,成本通常由目标检测与预测目标之间的外观相似性和运动一致性计算得出。

4.卡尔曼滤波预测

  • 对于每个已跟踪的目标,使用卡尔曼滤波来预测其下一帧的位置。卡尔曼滤波利用目标的历史运动信息和观测数据,预测目标在下一帧中的位置和速度。

5.特征匹配

  • 将当前帧的检测结果与之前帧中的跟踪目标进行特征匹配。采用余弦相似度或欧氏距离等度量方法,比较特征向量之间的相似性。

6.外观相似性分数计算

  • 计算目标检测结果与跟踪目标之间的外观相似性分数。综合考虑特征匹配和运动一致性,为每个匹配组合分配相似性分数。

7.最终关联

  • 根据外观相似性分数,选择最佳的目标关联组合。这样能够确定目标在连续帧中的唯一ID,实现多目标的连续跟踪。

8.卡尔曼滤波更新

  • 对于成功匹配的目标,使用卡尔曼滤波来更新其状态。通过融合检测结果和卡尔曼滤波预测的信息,得到目标的最终位置和速度,并对目标状态进行更新。

9.状态估计不确定性更新

  • 根据卡尔曼滤波的结果,更新目标的状态估计不确定性。这样可以根据目标的可信度来调整匹配的权重。

10.目标确认和删除

  • 对于一些没有成功匹配到检测结果的目标,或者匹配结果置信度较低的目标,进行确认和删除操作。可以根据跟踪器的置信度阈值来决定是否保留目标。

11.轨迹维护

  • 对于成功匹配的目标,更新目标的运动轨迹。

12.重复

  • 对于下一帧,重复上述过程,进行目标检测、特征提取、目标关联、更新等操作。

END


📝因为作者的能力有限,所以文章可能会存在一些错误和不准确之处,恳请大家指出!

 📃参考文献:

[1] Simple Online and Realtime Tracking with a Deep Association Metric

[1703.07402] Simple Online and Realtime Tracking with a Deep Association Metric (arxiv.org)

相关文章:

【Yolov5+Deepsort】训练自己的数据集(1)| 目标检测追踪 | 轨迹绘制

📢前言:本篇是关于如何使用YoloV5Deepsort训练自己的数据集,从而实现目标检测与目标追踪,并绘制出物体的运动轨迹。本章讲解的为第一个内容:简单介绍YoloV5Deepsort中所用到的目标检测,追踪及sort&Depp…...

express学习笔记4 - 热更新以及express-boom

我们每次改动代码的时候都要重启项目,现在我们给项目添加一个热更新 npm install --save-dev nodemon # or using yarn: yarn add nodemon -D 在package.json添加一行代码 "dev": "nodemon ./bin/www" 重启项目 然后随便做改动&#xff…...

Ajax_02学习笔记(源码 + 图书管理业务 + 以及 个人信息修改功能)

Ajax_02 01_Bootstrap框架-控制弹框的使用 代码 <!-- 引入bootstrap.css --> <link href"https://cdn.jsdelivr.net/npm/bootstrap5.2.2/dist/css/bootstrap.min.css" rel"stylesheet"><button type"button" class"btn btn…...

Python-数据类型转换

当涉及数据类型转换时&#xff0c;Python提供了多种内置函数来执行不同类型之间的转换 以下是每个方法的详细说明和示例案例 整数和浮点数转换&#xff1a; int(x, base10): 将给定的参数x转换为整数。x可以是一个整数、浮点数或字符串。如果x是字符串&#xff0c;则可以提供…...

DASCTF 2023 0X401七月暑期挑战赛 Web方向 EzFlask ez_cms MyPicDisk 详细题解wp

EzFlask 源码直接给了 CtrlU查看带缩进的源码 import uuidfrom flask import Flask, request, session # 导入黑名单列表 from secret import black_list import jsonapp Flask(__name__) # 为 Flask 应用设置一个随机的 secret_key app.secret_key str(uuid.uuid4())# 检查…...

数据结构-链表

&#x1f5e1;CSDN主页&#xff1a;d1ff1cult.&#x1f5e1; &#x1f5e1;代码云仓库&#xff1a;d1ff1cult.&#x1f5e1; &#x1f5e1;文章栏目&#xff1a;数据结构专栏&#x1f5e1; 目录 目录 代码总览&#xff1a; 接口slist.h&#xff1a; slist.c: 1.什么是链表 1.1链…...

大数据Flink(五十五):Flink架构体系

文章目录 Flink架构体系 一、 Flink中的重要角色 二、Flink数据流编程模型 三、Libraries支持...

使用矢量数据库打造全新的搜索引擎

在技术层面上&#xff0c;矢量数据库采用了一种名为“矢量索引”的技术&#xff0c;这是一种组织和搜索矢量数据的方法&#xff0c;可以快速找到相似矢量。其中关键的一环是“距离函数”的概念&#xff0c;它可以衡量两个矢量的相似程度。 1.矢量数据库简介 矢量数据库是专门…...

算法提高-树状数组

算法提高-树状数组 241. 楼兰图腾&#xff08;区间求和 单点修改&#xff09;242. 一个简单的整数问题&#xff08;差分推公式 实现 维护区间修改单点求和&#xff09;243. 一个简单的整数问题2&#xff08;区间修改和区间求和&#xff09;AcWing 244. 谜一样的牛&#xff08;…...

Django ORM详解:最全面的数据库处理指南

概要 深度探讨Django ORM的概念、基础使用、进阶操作以及详细解析在实际使用中如何处理数据库操作。这篇文章旨在帮助大家全面掌握Django ORM&#xff0c;理解其如何简化数据库操作&#xff0c;并透过表象理解其内部工作原理。 Django ORM简介 在深入讨论Django的ORM&#xff…...

Istio 安全 授权管理AuthorizationPolicy

这个和cka考试里面的网络策略是类似的。它是可以实现更加细颗粒度限制的。 本质其实就是设置谁可以访问&#xff0c;谁不可以访问。默认命名空间是没有AuthorizationPolicy---允许所有的客户端访问。 这里是没有指定应用到谁上面去&#xff0c;有没有指定使用哪些客户端&#…...

04 Ubuntu中的中文输入法的安装

在Ubuntu22.04这种版本相对较高的系统中安装中文输入法&#xff0c;一般推荐使用fctix5&#xff0c;相比于其他的输入法&#xff0c;这款输入法的推荐词要好得多&#xff0c;而且不会像ibus一样莫名其妙地失灵。 首先感谢文章《滑动验证页面》&#xff0c;我是根据这篇文章的教…...

faac内存开销较大,为方便嵌入式设备使用进行优化(valgrind使用)

faac内存开销较大&#xff0c;为方便嵌入式设备使用进行优化&#xff0c;在github上提了issues但是没人理我&#xff0c;所以就搞一份代码自己玩吧。 基于faac_1_30版本&#xff0c;原工程https://github.com/knik0/faac faac内存优化: faac内存开销较大&#xff0c;为方便嵌入…...

分数线划定(c++题解)

题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才&#xff0c;A 市对所有报名的选手进行了笔试&#xff0c;笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的 150% 划定&#xff0c;即如果计划录取 m 名志愿者&#xf…...

React 在 html 中 CDN 引入(包含 antd、axios ....)

一、简介 cdn 获取推荐 https://unpkg.com&#xff0c;unpkg 是一个快速的全球内容交付网络&#xff0c;适用于 npm 上所有内容。 【必备】react 相关 cdn。附&#xff1a;github 官方文档获取、现阶段官方文档 CDN 网址。 <script crossorigin src"https://unpkg.com…...

数据结构----异或

数据结构----异或 一.何处用到了异或 1. 运算符 //判断是否相同 用到了异或&#xff0c;看异或结果如果是0就是相同&#xff0c;不是0就是不同//注意&#xff1a; 不能给小数用&#xff0c;小数没有相等的概念&#xff0c;所以小数判断是否相同都是进行相减判断2.找一堆数中…...

PHP Smarty模板的语法规则是怎样的?

首先&#xff0c;你要知道Smarty模板是以模板格式来编写的。模板格式类似于HTML&#xff0c;但它的语法更加简洁明了。 以下是PHP Smarty模板的语法规则和代码例子&#xff1a; 变量&#xff1a;在Smarty模板中&#xff0c;你可以使用变量来显示动态内容。变量通常以“{$”符…...

Socks IP轮换:为什么是数据挖掘和Web爬取的最佳选择?

在数据挖掘和Web爬取的过程中&#xff0c;IP轮换是一个非常重要的概念。数据挖掘和Web爬取需要从多个网站或来源获取数据&#xff0c;而这些网站通常会对来自同一IP地址的请求进行限制或封锁。为了避免这些问题&#xff0c;数据挖掘和Web爬取过程中需要使用Socks IP轮换技术。在…...

优化|当机器学习上运筹学:PyEPO与端对端预测后优化

分享者&#xff1a;唐博 编者按&#xff1a;​ 这篇文章我想要写已经很久了&#xff0c;毕竟“端对端预测后优化”&#xff08;End-to-End Predict-then-Optimize&#xff09;正是我读博期间的主要研究方向&#xff0c;但我又一直迟迟没能下笔。想说自己杂事缠身&#xff08;实…...

Cocos Creator的 Cannot read property ‘applyForce‘ of undefined报错

序&#xff1a; 1、博主是看了这个教程操作的时候出的bug>游戏开发 | 17节课学会如何用Cocos Creator制作3D跑酷游戏 | P9 代码控制对象移动_哔哩哔哩_bilibili 2、其实问题不是出在代码上&#xff0c;但是发现物体就是不平移 3、node全栈的资料》node全栈框架 正文…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

麒麟系统使用-进行.NET开发

文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的&#xff0c;如果需要进行.NET开发&#xff0c;则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET&#xff0c;所以要进…...

【前端实战】如何让用户回到上次阅读的位置?

目录 【前端实战】如何让用户回到上次阅读的位置&#xff1f; 一、总体思路 1、核心目标 2、涉及到的技术 二、实现方案详解 1、基础方法&#xff1a;监听滚动&#xff0c;记录 scrollTop&#xff08;不推荐&#xff09; 2、Intersection Observer 插入探针元素 3、基…...