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

YOLOv5改进系列(1)——添加CBAM注意力机制

一、如何理解注意力机制

假设你正在阅读一本书,同时有人在你旁边说话。当你听到某些关键字时,比如“你的名字”或者“你感兴趣的话题”,你会自动把注意力从书上转移到他们的谈话上,尽管你并没有完全忽略书本的内容。这就是注意力机制的核心思想:动态地根据重要性来分配注意力,而不是对输入的信息一视同仁地处理。

在计算机视觉或自然语言处理(NLP)中,注意力机制让模型能够灵活地聚焦于输入数据的某些重要部分。例如,在图像分类任务中,模型不需要对整张图像的每一个像素都一视同仁,而是可以专注于那些关键区域,如目标物体的边缘或特征。在句子处理时,模型可以根据句子的上下文,专注于那些对语义理解最为关键的单词或短语,而忽略不太重要的部分。

注意力机制就像在复杂信息处理中自动筛选和重点关注的过程,帮助模型更智能地选择和处理最有用的信息。


作用

  1. 提升准确性:注意力机制聚焦关键信息,提升预测精度。
  2. 增强可解释性:能更清晰展示模型决策过程。
  3. 处理变长数据:适用于文本、语音等不定长序列数据。

不足

  1. 计算开销大:需要计算每个位置的权重,耗时长。
  2. 易过拟合:复杂权重可能导致模型在训练集上表现过好,泛化能力弱。
  3. 数据需求高:需要大量数据训练,否则效果不佳。

二、CBAM注意力机制

论文名称:《CBAM: Convolutional Block Attention Module》

论文地址:https://arxiv.org/pdf/1807.06521

论文代码:GitHub - Jongchan/attention-module: Official PyTorch code for "BAM: Bottleneck Attention Module (BMVC2018)" and "CBAM: Convolutional Block Attention Module (ECCV2018)"

CBAM从通道channel和空间spatial两个作用域出发,实现从通道到空间的顺序注意力结构。空间注意力可使神经网络更加关注在图像分类中决定性作用的像素区域而忽略无关紧要的区域,通道注意力则用于处理特征图通道的分配关系,同时对两个维度进行注意力分配加强了注意力机制对模型性能的提升效果。

2.1 CAM通道注意力模块

shared MLP

  1. 输入特征图(H×W×C)

    • 先将输入的特征图(H×W×C)分别经过基于宽度和高度的最大池化和平均池化,对特征图按两个维度压缩,得到两个1×1×C的特征图。
  2. 池化后的特征图进行处理

    • 将最大池化和平均池化的结果利用共享的全连接层(Shared MLP)进行处理:
      • 先通过一个全连接层下降通道数(C -> C/4)。
      • 然后再通过另一个全连接层恢复通道数(C/4 -> C)。
  3. 生成权重

    • 将共享的全连接层所得到的结果相加后再使用Sigmoid激活函数,生成最终的channel attention feature,得到每个通道的权重值(0~1之间)。
  4. 特征调整

    • 将权重通过逐通道相加到输入特征图上,生成最终调整后的特征图。

代码如下所示:

import torch
import torch.nn as nnclass ChannelAttentionModule(nn.Module):def __init__(self, in_channels, reduction=4):super(ChannelAttentionModule, self).__init__()# 使用最大池化和平均池化self.avg_pool = nn.AdaptiveAvgPool2d(1)  # 输出形状 1x1self.max_pool = nn.AdaptiveMaxPool2d(1)  # 输出形状 1x1# 全连接层用于减少通道数再增加回来self.fc1 = nn.Conv2d(in_channels, in_channels // reduction, 1, bias=False)  # 1x1卷积,降维self.relu = nn.ReLU()  # 激活函数ReLUself.fc2 = nn.Conv2d(in_channels // reduction, in_channels, 1, bias=False)  # 1x1卷积,升维# 使用 Sigmoid 激活函数self.sigmoid = nn.Sigmoid()def forward(self, x):# 输入特征图的形状为 (B, C, H, W)avg_out = self.avg_pool(x)  # 平均池化max_out = self.max_pool(x)  # 最大池化# 使用共享的全连接层(MLP)进行处理avg_out = self.fc2(self.relu(self.fc1(avg_out)))max_out = self.fc2(self.relu(self.fc1(max_out)))# 将池化结果加起来out = avg_out + max_out# 使用Sigmoid激活out = self.sigmoid(out)# 通过逐通道相乘的方式调整输入特征图return x * out# 测试模块
if __name__ == "__main__":# 输入张量 (batch_size, channels, height, width)input_tensor = torch.randn(1, 64, 32, 32)  # 示例输入 (B=1, C=64, H=32, W=32)# 实例化通道注意力模块cam = ChannelAttentionModule(in_channels=64)# 前向传播output = cam(input_tensor)print(output.shape)  # 输出特征图的形状

2.2 SAM空间注意力模块

具体流程如下:

将上面CAM模块输出的特征图F'作为本模块的输入特征图

首先,对输入特征图在通道维度下做最大池化和平均池化,将池化后的两张特征图在通道维度堆叠(concat)。

然后,经过一个7×7卷积(7×7比3×3效果更好)操作,降维为1个channel,即叠积核融合通道信息,特征图的shape从b,2,h,w - >b,1,h,w。

最后,将卷积后的结果经过sigmoid函数对特征图的空间权重归一化,再将输入特征图和权重相乘。

class spatial_attention(nn.Module):def __init__(self, kernel_size=7):super(spatial_attention, self).__init__()# 为了保持卷积前后的特征图shape相同,卷积时需要paddingpadding = kernel_size // 2  # 确保7x7卷积后输出形状与输入一致# 7×7卷积融合通道信息,输入[b, 2, h, w],输出[b, 1, h, w]self.conv = nn.Conv2d(in_channels=2, out_channels=1, kernel_size=kernel_size, padding=padding, bias=False)# sigmoid激活函数self.sigmoid = nn.Sigmoid()def forward(self, inputs):# 在通道维度上最大池化 [b, 1, h, w],keepdim保留原有深度x_maxpool, _ = torch.max(inputs, dim=1, keepdim=True)# 在通道维度上平均池化 [b, 1, h, w]x_avgpool = torch.mean(inputs, dim=1, keepdim=True)# 池化后的结果在通道维度上堆叠 [b, 2, h, w]x = torch.cat([x_maxpool, x_avgpool], dim=1)# 卷积融合通道信息, [b, 2, h, w] ==> [b, 1, h, w]x = self.conv(x)# 空间权重归一化x = self.sigmoid(x)# 输入特征图和空间权重相乘outputs = inputs * xreturn outputs
  1. 输入特征图:假设输入一个中间特征图 F∈RC×H×W,其中 C、H、W 分别表示通道数、高度和宽度。

  2. 通道注意力模块

    • 对输入特征图 F 进行全局最大池化(Max Pooling)和全局平均池化(Average Pooling)操作,生成两个不同的空间信息描述。即通过最大池化和平均池化将特征图 F 沿空间维度压缩为1维向量。
    • 将池化后的结果通过一个共享的多层感知机(MLP),以融合不同空间信息并输出通道维度的权重 Mc​(F)。
    • 最后通过公式 (3) 计算通道注意力:

  1. 空间注意力模块
    • 将通道加权后的特征图 F′ 进一步经过空间注意力机制。首先,再次对特征图 F′ 进行全局最大池化和全局平均池化操作,但这次是在通道维度进行操作。
    • 将池化结果拼接后,经过一个卷积操作生成空间注意力图 Ms​(F′),公式 (4) 表示为:

  • 最终将空间注意力图 Ms​(F′) 与特征图 F′ 按元素相乘,得到最终的输出特征图 F′′。
  1. CBAM模块的完整过程:
    • 通道注意力模块和空间注意力模块可以串联使用,先通过通道注意力调整特征,再通过空间注意力调整,完成特征图的两次加权。

三、CBAM注意力机制添加过程

1.在common.py中添加网络结构


将下面代码复制到common.py文件最下面

class ChannelAttentionModule(nn.Module):def __init__(self, in_channels, reduction=4):super(ChannelAttentionModule, self).__init__()# 使用最大池化和平均池化self.avg_pool = nn.AdaptiveAvgPool2d(1)  # 输出形状 1x1self.max_pool = nn.AdaptiveMaxPool2d(1)  # 输出形状 1x1# 全连接层用于减少通道数再增加回来self.fc1 = nn.Conv2d(in_channels, in_channels // reduction, 1, bias=False)  # 1x1卷积,降维self.relu = nn.ReLU()  # 激活函数ReLUself.fc2 = nn.Conv2d(in_channels // reduction, in_channels, 1, bias=False)  # 1x1卷积,升维# 使用 Sigmoid 激活函数self.sigmoid = nn.Sigmoid()def forward(self, x):b, c, h, w = x.size()  # 获取输入的形状 (batch_size, channels, height, width)# 最大池化和平均池化,输出维度 [b, c, 1, 1]max_pool = self.max_pool(x).view(b, c)  # 调整池化结果维度为 [b, c]avg_pool = self.avg_pool(x).view(b, c)  # 调整池化结果维度为 [b, c]# 第一个全连接层降通道数 [b, c] => [b, c/4]x_maxpool = self.fc1(max_pool)x_avgpool = self.fc1(avg_pool)# 激活函数x_maxpool = self.relu(x_maxpool)x_avgpool = self.relu(x_avgpool)# 第二个全连接层恢复通道数 [b, c/4] => [b, c]x_maxpool = self.fc2(x_maxpool)x_avgpool = self.fc2(x_avgpool)# 将最大池化和平均池化的结果相加 [b, c]x = x_maxpool + x_avgpool# Sigmoid函数权重归一化x = self.sigmoid(x)# 调整维度 [b, c] => [b, c, 1, 1]x = x.view(b, c, 1, 1)# 输入特征图和通道权重相乘 [b, c, h, w]outputs = x * xreturn outputs# def forward(self, x):#     # 输入特征图的形状为 (B, C, H, W)#     b,c,h,w = x.shape#     max_out = self.max_pool(x)  # 最大池化#     avg_out = self.avg_pool(x)  # 平均池化##     # 使用共享的全连接层(MLP)进行处理#     avg_out = self.fc2(self.relu(self.fc1(avg_out)))#     max_out = self.fc2(self.relu(self.fc1(max_out)))##     # 将池化结果加起来#     out = avg_out + max_out##     # 使用Sigmoid激活#     out = self.sigmoid(out)##     # 通过逐通道相乘的方式调整输入特征图#     return x * outclass spatial_attention(nn.Module):def __init__(self, kernel_size=7):super(spatial_attention, self).__init__()# 为了保持卷积前后的特征图shape相同,卷积时需要paddingpadding = kernel_size // 2  # 确保7x7卷积后输出形状与输入一致# 7×7卷积融合通道信息,输入[b, 2, h, w],输出[b, 1, h, w]self.conv = nn.Conv2d(in_channels=2, out_channels=1, kernel_size=kernel_size, padding=padding, bias=False)# sigmoid激活函数self.sigmoid = nn.Sigmoid()def forward(self, inputs):# 在通道维度上最大池化 [b, 1, h, w],keepdim保留原有深度x_maxpool, _ = torch.max(inputs, dim=1, keepdim=True)# 在通道维度上平均池化 [b, 1, h, w]x_avgpool = torch.mean(inputs, dim=1, keepdim=True)# 池化后的结果在通道维度上堆叠 [b, 2, h, w]x = torch.cat([x_maxpool, x_avgpool], dim=1)# 卷积融合通道信息, [b, 2, h, w] ==> [b, 1, h, w]x = self.conv(x)# 空间权重归一化x = self.sigmoid(x)# 输入特征图和空间权重相乘outputs = inputs * xreturn outputsclass CBAM(nn.Module):def __init__(self, c1, c2, ratio=16, kernel_size=7):  # ch_insuper(CBAM, self).__init__()self.channel_attention = ChannelAttentionModule(c1, ratio)self.spatial_attention = spatial_attention(kernel_size)def forward(self, x):out = self.channel_attention(x) * x  # 通道注意力加权# c*h*w (通道数、高度、宽度)out = self.spatial_attention(out) * out  # 空间注意力加权# c*h*w * 1*h*w(空间维度权重)return out

2.在yolo.py中添加CBAM结构

在下面找到 def parse_model(d, ch): 函数,往下找到if m in 这一行 添加CBAM

3.在yolov5s_CBAM.yaml中添加CBAM结构

yolov5s_CBAM.yaml 文件中添加 CBAM 模块。具体来说,有两种常见的添加方式:

  1. 在主干(backbone)的 SPPF(Spatial Pyramid Pooling-Fast)层之前添加一层 CBAM 模块。
  2. 将 Backbone 中所有的 C3 层全部替换为 CBAM 模块。

4.在yolo.py中修改yolov5s.yaml为yolov5s_CBAM.yaml

5.添加成功结果展示

6.修改train下的parse_opt开始训练

相关文章:

YOLOv5改进系列(1)——添加CBAM注意力机制

一、如何理解注意力机制 假设你正在阅读一本书,同时有人在你旁边说话。当你听到某些关键字时,比如“你的名字”或者“你感兴趣的话题”,你会自动把注意力从书上转移到他们的谈话上,尽管你并没有完全忽略书本的内容。这就是注意力机…...

无头单向非循环java版的模拟实现

【本节目标】 1.ArrayList的缺陷 2.链表 1. ArrayList的缺陷 上节课已经熟悉了 ArrayList 的使用&#xff0c;并且进行了简单模拟实现。通过源码知道&#xff0c; ArrayList 底层使用数组来存储元素&#xff1a; public class ArrayList<E> extends AbstractList<…...

Bert Score-文本相似性评估

Bert Score Bert Score 是基于BERT模型的一种方法。它通过计算两个句子在BERT模型中的嵌入编码之间的余弦相似度来评估它们的相似度。BERTScore考虑了上下文信息和语义信息&#xff0c;因此能够更准确地衡量句子之间的相似度。 安装 pip install bert-score 使用例子 一个…...

Pyenv管理Python版本,conda之外的另一套python版本管理解决方案

简介 Pyenv 是一个 python 解释器管理工具&#xff0c;可以对计算机中的多个 python 版本进行管理和切换。为什么要用 pyenv 管理python呢&#xff0c;用过的 python 人都知道&#xff0c;python 虽然是易用而强大的编程语言&#xff0c;但是 python 解释器却有多个版本&#…...

快速实现AI搜索!Fivetran 支持 Milvus 作为数据迁移目标

Fivetran 现已支持 Milvus 向量数据库作为数据迁移的目标&#xff0c;能够有效简化 RAG 应用和 AI 搜索中数据源接入的流程。 数据是 AI 应用的支柱&#xff0c;无缝连接数据是充分释放数据潜力的关键。非结构化数据对于企业搜索和检索增强生成&#xff08;RAG&#xff09;聊天…...

css的页面布局属性

CSS Flexbox&#xff08;Flexible Box Layout&#xff09;是一种用于页面布局的CSS3规范&#xff0c;它提供了一种更加高效的方式来布置、对齐和分配容器内元素的空间&#xff0c;即使它们的大小是未知或者动态变化的。Flexbox很容易处理一维布局&#xff0c;即在一个方向上&am…...

RTE 大会报名丨AI 时代新基建:云边端架构和 AI Infra ,RTE2024 技术专场第二弹!

所有 AI Infra 都在探寻规格和性能的最佳平衡&#xff0c;如何构建高可用的云边端协同架构&#xff1f; 语音 AI 实现 human-like 的最后一步是什么&#xff1f; AI 视频的爆炸增长&#xff0c;给新一代编解码技术提出了什么新挑战&#xff1f; 当大模型进化到实时多模态&am…...

【React】入门Day01 —— 从基础概念到实战应用

目录 一、React 概述 二、开发环境创建 三、JSX 基础 四、React 的事件绑定 五、React 组件基础使用 六、组件状态管理 - useState 七、组件的基础样式处理 快速入门 – React 中文文档 一、React 概述 React 是什么 由 Meta 公司开发&#xff0c;是用于构建 Web 和原生…...

<<机器学习实战>>10-11节笔记:生成器与线性回归手动实现

10生成器与python实现 如果是曲线规律的数据集&#xff0c;则需要把模型变复杂。如果是噪音较大&#xff0c;则需要做特征工程。 随机种子的知识点补充&#xff1a; 根据不同库中的随机过程&#xff0c;需要用对应的随机种子&#xff1a; 比如 llist(range(5)) random.shuf…...

链表OJ经典题目及思路总结(一)

目录 前言1.移除元素1.1 链表1.2 数组 2.双指针2.1 找链表的中间结点2.2 找倒数第k个结点 总结 前言 解代码题 先整体&#xff1a;首先数据结构链表的题一定要多画图&#xff0c;捋清问题的解决思路&#xff1b; 后局部&#xff1a;接着考虑每一步具体如何实现&#xff0c;框架…...

初识chatgpt

GPT到底是什么 首先&#xff0c;我们需要了解GPT的全称&#xff1a;Generative Pre-trained Transformer&#xff0c;即三个关键词&#xff1a;生成式 预训练 变换模型。 &#xff08;1&#xff09;什么是生成式&#xff1f; 即能够生成新的文本序列。 &#xff08;2&#…...

【60天备战2024年11月软考高级系统架构设计师——第33天:云计算与大数据架构——大数据处理框架的应用场景】

随着大数据技术的发展&#xff0c;越来越多的企业开始采用大数据处理框架来解决实际问题。理解这些框架的应用场景对于架构师来说至关重要。 大数据处理框架的应用场景 实时数据分析&#xff1a;使用Apache Kafka与Apache Spark结合&#xff0c;可以实现对实时数据流的处理与…...

如何设计具体项目的数据库管理

### 例三&#xff1a;足协的数据库管理算法 #### 角色&#xff1a; - **ESFP学生**&#xff1a;小明 - **ENTP老师**&#xff1a;张老师 #### 主题&#xff1a;足协的数据库管理算法 --- **张老师**&#xff1a;小明&#xff0c;今天我们来讨论一下足协的数据库管理算法。你…...

对于 Vue CLI 项目如何引入Echarts以及动态获取数据

&#x1f680;个人主页&#xff1a;一颗小谷粒 &#x1f680;所属专栏&#xff1a;Web前端开发 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、数据画卷—Echarts介绍 1.1 什么是Echarts&#xff1f; 1.2 Echarts官网地址 2、Vue CLI 项目…...

【Linux笔记】在VMware中,为基于NAT模式运行的CentOS虚拟机设置固定的网络IP地址

一、配置VMware虚拟网络 1、打开VMware虚拟网络编辑器&#xff1a; 点击VMware主界面上方的“编辑”菜单&#xff0c;选择“虚拟网络编辑器”。 2、选择NAT模式网络&#xff1a; 在虚拟网络编辑器中&#xff0c;选择VMnet8&#xff08;或其他NAT模式的网络&#xff09;。 取消勾…...

一文上手Kafka【中】

一、发送消息细节 在发送消息的特别注意: 在版本 3.0 中&#xff0c;以前返回 ListenableFuture 的方法已更改为返回 CompletableFuture。为了便于迁移&#xff0c;2.9 版本添加了一个方法 usingCompletableFuture&#xff08;&#xff09;&#xff0c;该方法为 CompletableFu…...

Ubuntu如何如何安装tcpdump

在Ubuntu上安装tcpdump非常简单&#xff0c;可以通过以下步骤完成&#xff1a; 打开终端。 更新包列表&#xff1a; 首先&#xff0c;更新你的包管理器的包列表&#xff1a; sudo apt update 安装tcpdump&#xff1a; 使用以下命令安装tcpdump&#xff1a; sudo apt install …...

3-3 AUTOSAR RTE 对SR Port的作用

返回总目录->返回总目录<- 一、前言 RTE作为SWC和BSW之间的通信机构,支持Sender-Receiver方式实现ECU内及ECU间的通信。 对于Sender-Receiver Port支持三种模式: 显式访问:若运行实体采用显示模式的S/R通信方式,数据读写是即时的;隐式访问:当多个运行实体需要读取…...

hive/impala/mysql几种数据库的sql常用写法和函数说明

做大数据开发的时候&#xff0c;会在几种库中来回跳&#xff0c;同一个需求&#xff0c;不同库函数和写法会有出入&#xff0c;在此做汇总沉淀。 1. hive 1. 日期差 DATEDIFF(CURRENT_DATE(),wdjv.creation_date) < 30 30天内的数据 2.impala 3. spark 4. mysql 1.时间差…...

论文阅读:LM-Cocktail: Resilient Tuning of Language Models via Model Merging

论文链接 代码链接 Abstract 预训练的语言模型不断进行微调,以更好地支持下游应用。然而,此操作可能会导致目标领域之外的通用任务的性能显著下降。为了克服这个问题,我们提出了LM Cocktail,它使微调后的模型在总体上保持弹性。我们的方法以模型合并(Model Merging)的形…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...