
论文: Low-Latency Event-Based Object Detection with Spatially-Sparse Linear Attention (ECCV 2026)核心成绩: Gen1 数据集 0.375 mAP | N-Caltech101 数据集 0.515 mAP | 每事件计算量降低 20 倍以上一、开门见山这个工作到底解决了什么问题事件相机Event Camera是一种革命性的视觉传感器。与传统相机每隔固定时间拍一张完整画面不同事件相机每个像素独立工作只要感受到亮度变化就立刻输出一个「事件」。一个事件只有 4 个数值坐标 (x, y)、微秒级时间戳 t、极性 p亮度变亮还是变暗。这带来了一个极具诱惑力的前景超低延迟。传统相机 30fps 意味着 33 毫秒才能拍一帧而事件相机的时间分辨率可以达到微秒级——快了整整四个数量级。对于自动驾驶、机器人避障这种「晚一毫秒可能就撞上去」的场景这个优势是致命的。但现实很骨感。现有的异步事件检测方法面临两个核心瓶颈瓶颈一循环架构难以高效训练长序列。事件是逐个到达的传统方法用 RNN/LSTM 逐个事件处理。一个 100 毫秒的时间窗口内可能有数万个事件循环展开这么多步梯度消失、训练缓慢是家常便饭。你想并行循环结构天生不让你并行。瓶颈二提高精度往往意味着增加每个事件的计算量和延迟。想要更精细的特征表示那就需要更多的状态参数每个事件到来时都要更新更多参数计算量上去了延迟也跟着上去了。精度和效率成了一对不可调和的矛盾。SSLA 的工作就是同时打破这两个瓶颈。它提出了「空间稀疏线性注意力」Spatially-Sparse Linear Attention, SSLA核心思路是利用事件的空间稀疏性事件相机天然只在有变化的像素上产生事件大部分像素是「沉默」的。SSLA 只在有事件的像素上进行计算不做无用功。引入线性注意力实现并行训练用线性注意力替代循环网络支持训练时的并行计算不再被循环结构束缚。设计「混合空间」状态分解不同空间位置维护独立的状态既保证了特征的精细度又通过稀疏激活控制了计算量。最终效果在异步方法中达到最高精度同时每事件计算量比最强的异步基线降低了20 倍以上。官方给的视频演示因为事件相机的测试数据集比较大也有处理难度我用AI 生成了点行车视角事件相机数据做测试二、事件相机理解输入数据的本质要理解 SSLA 的设计哲学必须先理解事件相机输出的数据长什么样。传统相机「全量采样」的浪费传统相机像一个勤勤恳恳的画家每隔固定时间比如 33 毫秒就把整个画面画一遍。但问题来了场景中大部分区域可能根本没变化。一辆车在空旷的马路上开99% 的像素天空、路面、远处的建筑在相邻两帧之间几乎没有变化但你还是把它们全画了一遍。这就是传统相机的根本性浪费无差别地处理所有像素不管它有没有变化。事件相机「按需报告」的精明事件相机完全不同。它的每个像素都有自己的「亮度探测器」当某个像素感受到的亮度变化超过一个阈值时它就立刻报告一个事件事件格式: (x, y, t, p) - x, y: 像素坐标 - t: 时间戳微秒级精度 - p: 极性1 表示亮度变亮-1 表示亮度变暗一辆车从左开到右只有车边缘经过的像素会产生事件。背景沉默。天空沉默。这就是事件数据的两个核心特性特性一空间稀疏性。在任何一个时刻只有极少数像素在产生事件。对于一个 304×240 的传感器Gen1 数据集的分辨率一帧中可能只有几百到几千个像素是活跃的占总像素数的不到 10%。特性二时间异步性。事件不是按帧组织的而是按时间顺序排列的事件流。两个事件之间的时间间隔可能是不均匀的——场景变化剧烈时事件密集平静时事件稀疏。这两个特性是 SSLA 设计的出发点。如果我们能设计一个算法只在有事件的像素上计算并且能自然地处理异步到达的事件那就能同时实现高精度和低延迟。三、核心创新一空间稀疏线性注意力3.1 传统方法的困境先看看现有方法是怎么处理事件的。帧式方法Frame-based把事件累积成固定时间窗口的帧类似传统图像然后用标准 CNN 处理。这完全浪费了事件的时间分辨率——把微秒级的信息压缩成了毫秒级的帧好比把 4K 视频降采样成 PPT。逐事件异步方法Event-by-event每个事件到来就更新一次网络状态。精度确实好但计算量巨大——每个事件都要跑一遍完整的网络。一万个事件就要跑一万次延迟反而上去了。分组异步方法Group-based把事件按像素分组每个像素维护一个事件序列。这比逐事件好多了但问题在于每个活跃像素都要独立更新自己的隐状态当活跃像素很多时计算量依然很大。3.2 SSLA 的思路稀疏但不逐事件SSLA 选择了一个巧妙的中间地带按像素分组事件和分组方法一样把同一像素的事件归到一起。只在活跃像素上计算没有事件的像素完全不参与计算。这就是「空间稀疏」。用线性注意力处理每个像素的事件序列不是 RNN而是线性注意力。为什么线性注意力如此关键因为线性注意力有一个 RNN 做不到的特性它可以被转化为一个递推关系recurrence而这个递推关系在训练时可以并行化。具体来说线性注意力的核心操作是一个顺序扫描sequential scanh_t g_t · h_{t-1} u_t其中h_t是 t 时刻的隐状态g_t是遗忘门forget gateu_t是当前输入。这看起来和 RNN 一样是递推的但关键在于这个递推关系可以用并行前缀和parallel prefix sum的方式在训练时一次性计算所有时间步而不需要一步一步循环。在代码实现中这个扫描操作用 Triton 编写了高效的 GPU kernelops/common/scan.py在训练时可以实现完全的并行计算。3.3 稀疏性到底省了多少计算让我们算一笔账。假设传感器分辨率是 304×240 72,960 个像素一个时间窗口内有 5,000 个事件分布在 2,000 个不同的像素上。密集方法对所有 72,960 个像素都做计算。SSLA只对 2,000 个活跃像素做计算。计算量直接降到了2.7%。但这还不是全部。SSLA 进一步引入了 patch 级别的空间分解下一节会详细讲使得每个活跃像素的计算也能被高效组织。最终每事件的计算量比最强的异步基线如 EV-FlowNet 的异步版本降低了 20 倍以上。四、核心创新二混合空间状态分解Mixture-of-Spaces这是 SSLA 最核心的创新点也是论文标题中「Spatially-Sparse」的真正含义。4.1 标准线性注意力的问题标准线性注意力为整个输入维护一个全局状态。对于事件数据来说这意味着所有像素共享同一个状态向量。这有一个严重的问题目标检测需要精细的空间特征。一辆车和它旁边的行人虽然可能同时产生事件但它们需要不同的特征表示。如果所有像素共享一个状态模型就很难区分它们。4.2 SSLA 的解法每个空间位置独立的状态SSLA 的核心洞察是不要把所有像素的状态混在一起而是让每个空间位置或更精确地说每个 patch 内的相对位置维护自己独立的状态。具体来说SSLA 使用一个 k×k 的卷积核比如 3×3把每个像素的事件「散射」到它周围的 k×k 个 patch 位置上。每个 patch 位置有自己独立的投影权重。这意味着对于同一个像素的事件当它被散射到 patch 的左上角位置时用一组权重进行投影当它被散射到 patch 的中心位置时用另一组权重。这样模型就能根据事件在局部邻域中的相对位置来学习不同的特征。这就是「混合空间」Mixture-of-Spaces的含义多个空间位置的状态混合在一起共同构成对场景的完整表示。类似于 Mixture-of-Experts 中不同专家处理不同方面的信息SSLA 中不同空间位置的状态编码不同方面的空间关系。4.3 为什么这很重要让我们对比三种方法的状态组织方式方法状态数量空间精度计算量标准线性注意力1 个全局状态低所有像素共享低逐像素独立状态N 个状态N活跃像素数高每个像素独立高SSLA混合空间K² 个位置状态K核大小中高按相对位置区分中稀疏激活SSLA 在状态数量和空间精度之间找到了一个绝佳的平衡点。3×3 的核意味着 9 个不同的空间位置状态足以捕捉局部的空间结构同时计算量远小于逐像素独立状态。五、核心创新三Scatter-Compute-Gather 并行训练有了空间稀疏性和混合空间状态分解下一个问题是如何在训练时高效地利用这些特性传统异步方法是逐事件处理的天然串行。SSLA 设计了一个巧妙的三阶段流程使得训练可以完全并行化阶段一Scatter散射把像素级别的事件序列「散射」到 patch 级别。具体来说对于每个活跃像素把它的事件复制到以它为中心的 k×k 个 patch 中。在每个 patch 内这个像素的事件会根据它的相对位置比如左上角、中心、右下角被标记上一个pos_id。像素 (x, y) 的事件 → 散射到 patch (x-1,y-1), (x,y-1), ..., (x1,y1) 在每个 patch 中根据相对位置获得 pos_id ∈ {0, 1, ..., k²-1}这个操作的关键在于同一个像素的事件被复制到了多个 patch 中但在每个 patch 中有不同的位置编码。这样不同 patch 位置可以学到不同的空间关系。阶段二Compute计算在 patch 级别进行线性注意力计算。每个 patch 内的所有事件来自多个像素按时间排序形成一个事件序列。然后对这个序列执行线性注意力qW_q events# Query 投影vW_v events# Value 投影gsigmoid(W_g events)# 遗忘门hscan(v,g)# 顺序扫描: h_t g_t * h_{t-1} v_toq*h# 注意力输出oW_o o# 输出投影这里的关键是不同 patch 位置使用不同的投影权重。代码中通过_apply_scatter_proj和_apply_gather_proj实现# scatter_conv_weights 的形状: [k², hidden_size × input_size]# 每个 patch 位置有自己独立的投影矩阵foriinrange(k²):output[pos_idi]events[pos_idi] scatter_weights[i]阶段三Gather收集把 patch 级别的计算结果「收集」回像素级别。一个像素参与了 k² 个 patch 的计算因为它被散射到了 k² 个 patch 中所以它会收到 k² 个输出。这些输出被相加起来通过index_add_形成该像素的最终输出。pixel_eventszeros(num_pixel_events,C)pixel_events.index_add_(0,patch_to_pixel_idx,patch_events)为什么这个流程能并行训练关键在于Scatter 之后所有 patch 的计算是相互独立的。它们可以同时进行线性注意力计算不需要等待其他 patch 的结果。这和 RNN 的逐步递推完全不同。在训练时所有 patch 的扫描操作可以 batch 在一起用 Triton kernel 并行执行。这就是 SSLA 能在训练时实现高效并行的秘密。六、MosAttention 模块深度剖析让我们深入代码看看 MosAttention 模块layers/mos_attention.py的完整执行流程。6.1 输入格式MosAttention 接收的输入是一个字典包含按像素分组的事件{events:Tensor[E,C],# E 个分组事件C 维特征time:Tensor[E],# 每个事件的时间戳w:Tensor[G],# G 个像素组的 x 坐标h:Tensor[G],# G 个像素组的 y 坐标batch_id:Tensor[G],# 每个组属于 batch 中的哪个样本lengths:Tensor[G],# 每个像素组有多少个事件batch_size:int}注意这里的表示方式事件不是按帧组织的而是按像素位置分组的。每个像素位置有一个事件序列序列长度可以不同。这就是「稀疏」的体现——没有事件的像素根本不出现在这个字典里。6.2 前向传播流程defforward(self,inputs):# 1. Scatter: 像素级 → patch 级patch_inputsscatter_group_events_to_patch(inputs,frame_size,patch2pixel_lut)# 2. Scatter Projection: 每个 patch 位置用不同的权重投影patch_eventsself._apply_scatter_proj(patch_inputs[events],patch_inputs[pos_id])# 3. Linear Attentionqself.q_proj(patch_events)# [E_patch, hidden]vself.v_proj(patch_events)# [E_patch, hidden]gF.sigmoid(self.g_proj(patch_events))# [E_patch, hidden]# 4. Sequential Scan核心操作hscan(uv,gg,cu_seqlenscu_seqlens)# [E_patch, hidden]# 5. Attention Outputoq*h# [E_patch, hidden]oself.o_proj(o)# [E_patch, hidden]# 6. Gather Projection: 每个 patch 位置用不同的权重投影回来oself._apply_gather_proj(o,patch_inputs[pos_id])# 7. Gather: patch 级 → 像素级outputsgather_patch_events_to_group(o,patch_inputs[orig_event_idx],num_pixel_events)# 8. Residual LayerNormifself.input_proj:residualself.input_proj(residual)outputsoutputsresidual outputsself.norm(outputs)return{events:outputs,...}6.3 顺序扫描的实现顺序扫描h_t g_t · h_{t-1} u_t是整个模型的核心计算。在 GPU 上它用 Triton 实现了高效的 kernel# ops/common/scan.pytriton.jit()defsequential_scan_fwd(u,g,h,cu_seqlens,C,BC:tl.constexpr):# 每个程序实例处理一个序列的一个通道块b_htl.zeros([BC,],dtypetl.float32)fortinrange(T):b_utl.load(p_u)# 加载输入b_gtl.load(p_g)# 加载遗忘门b_hb_h*b_gb_u# 递推更新tl.store(p_h,b_h)# 存储结果在 CPU 上比如我们的 demo 环境会自动 fallback 到纯 PyTorch 实现def_scan_naive(u,g,cu_seqlens):htorch.zeros_like(u)forseqinrange(num_sequences):h_prevtorch.zeros(C)fortinrange(start,end):h[t]g[t]*h_prevu[t]h_prevh[t]returnh6.4 遗忘门的作用遗忘门g_t sigmoid(W_g x_t)的值域是 (0, 1)它控制着「过去的信息有多少能被保留」。当g_t ≈ 1时几乎完全保留过去的状态h_t ≈ h_{t-1} u_t当g_t ≈ 0时几乎完全忽略过去h_t ≈ u_t这个机制让模型能够自适应地决定对于每个像素、每个时刻、每个通道维度应该「记住」多远的历史信息。在事件数据的场景中这意味着模型可以区分「刚刚发生的重要事件」和「很久以前的过时信息」。七、多尺度骨干网络SSLA-Det 的骨干网络采用 4 阶段的多尺度架构灵感来自 FPNFeature Pyramid Network的设计思想。7.1 架构配置MOS_B# configs/model/MOS_B.yamlname:MOS_Bexpected_strides:[8]layers:# Stage 1: stride 1, 16 channels-{name:MosAttention,kernel_size:1,hidden_size:16}-{name:MosAttention,kernel_size:3,hidden_size:16}-{name:SparseMaxPool,kernel_size:2}-{name:TemporalDropout,window_size:4}# Stage 2: stride 2, 32 channels-{name:MosAttention,kernel_size:3,hidden_size:32}-{name:MosAttention,kernel_size:3,hidden_size:32}-{name:SparseMaxPool,kernel_size:2}-{name:TemporalDropout,window_size:4}# Stage 3: stride 4, 64 channels-{name:MosAttention,kernel_size:3,hidden_size:64}-{name:MosAttention,kernel_size:3,hidden_size:64}-{name:SparseMaxPool,kernel_size:2}-{name:TemporalDropout,window_size:4}# Stage 4: stride 8, 128 channels-{name:MosAttention,kernel_size:3,hidden_size:128}-{name:MosAttention,kernel_size:3,hidden_size:128}7.2 各组件的作用MosAttention核心注意力模块。kernel_size1表示不做空间扩展仅处理当前像素kernel_size3表示 3×3 的混合空间注意力。每个阶段堆叠两个 MosAttention形成更深的特征提取。SparseMaxPool稀疏最大池化。和标准 MaxPool 不同它只在有事件的像素上进行池化操作。池化后空间分辨率减半kernel_size2通道数翻倍。这保持了「稀疏」的特性——池化后仍然只有活跃区域才有数据。TemporalDropout时间维度上的降采样。每个像素的事件序列有lengths个事件TemporalDropout 每隔window_size个事件保留一个减少序列长度。这类似于时间维度上的 stride减少了后续层的计算量。7.3 多尺度特征骨干网络输出多个尺度的特征图。在 MOS_B 配置中expected_strides[8]表示只使用 stride8 的特征最后一层。但在更大的模型配置中可以使用多个尺度的特征进行多尺度检测。特征图的构建过程async_event_to_griddefasync_event_to_grid(self,x,k):# 取每个像素的最后一个事件状态作为特征last_eventsevents[last_event_idx]# 将稀疏的像素特征转换为密集的网格表示output_gridstorch.zeros([B*H*W,C])output_gridsoutput_grids.index_add_(0,event_ids,last_events)output_gridsoutput_grids.reshape(B,H,W,C).permute(0,3,1,2)returnoutput_grids# [B, C, H, W] 标准特征图格式这个操作巧妙地将稀疏的异步事件表示转换成了标准的密集特征图格式使得后续可以直接使用 YOLOX 等成熟的检测头。八、异步处理的低延迟优势8.1 帧式方法的延迟问题传统帧式方法必须等待一个完整的时间窗口积累完毕才能处理。假设窗口大小是 100 毫秒时间: 0ms -------- 100ms -------- 200ms -------- 300ms |--- 等待 ---|--- 处理 ---|--- 等待 ---|--- 处理 ---| |←-------- 延迟 100ms --------→|即使第一个事件在 1 毫秒就到达了你也必须等到 100 毫秒才能开始处理。平均延迟是窗口大小的一半即 50 毫秒。8.2 SSLA 的异步优势SSLA 是异步的——事件到达就处理。每个像素独立维护自己的事件序列和隐状态不需要等待其他像素。时间: 0ms 10ms 20ms 30ms 40ms 50ms 事件: e1 e2 e3 e4 e5 e6 像素: p1 p3 p1 p7 p3 p1 处理: [p1] [p3] [p1] [p7] [p3] [p1] ↑ ↑ ↑ ↑ ↑ ↑ 立即处理 立即处理 立即处理 立即处理 立即处理 立即处理当一个事件到达像素 p1 时p1 立刻执行一次线性注意力更新其隐状态h被更新。这个更新只涉及 p1 的事件序列不需要等待任何其他像素。这意味着如果一个目标在 5 毫秒内产生了足够的事件模型在 5 毫秒后就能给出检测结果。相比帧式方法的 50 毫秒平均延迟SSLA 的延迟可以降低一个数量级。8.3 TemporalDropout 的时间降采样TemporalDropout 模块在保持异步特性的同时控制了每个像素的事件序列长度。它每隔window_size个事件保留一个类似于时间维度上的 stride# 原始序列: 20 个事件# window_size 4, 保留第 0, 4, 8, 12, 16 个事件# 降采样后: 5 个事件这减少了后续层的计算量同时保留了时间上的关键信息。九、检测头YOLOX SimOTASSLA-Det 使用 YOLOX 作为检测头这是一个经过充分验证的 anchor-free 目标检测框架。9.1 多尺度特征融合检测头接收骨干网络输出的多尺度特征对每个尺度分别进行1×1 卷积降维到width通道分类分支预测每个位置的类别概率回归分支预测边界框的 (x, y, w, h)目标分支预测每个位置是否有目标# layers/yolox_head.pyfork,xinenumerate(features):cls_featcls_conv(x)# 分类特征reg_featreg_conv(x)# 回归特征cls_outputcls_pred(cls_feat)# 类别预测reg_outputreg_pred(reg_feat)# 框预测obj_outputobj_pred(reg_feat)# 目标预测outputcat([reg,obj,cls],dim1)9.2 SimOTA 标签分配训练时使用 SimOTASimplified Optimal Transport Assignment进行标签分配。这是一种动态的匹配策略根据预测质量自适应地决定每个 ground truth 应该匹配哪些预测框。核心步骤几何约束只考虑中心点在 GT 框一定范围内的预测框代价计算综合分类损失和 IoU 损失动态 K 选择根据 IoU 自适应决定每个 GT 匹配多少个预测最优匹配选择代价最小的 K 个预测作为正样本9.3 损失函数总损失由三部分组成Loss 5.0 × Loss_IoU Loss_Obj Loss_ClsLoss_IoUGIoU 损失衡量预测框和 GT 框的重叠度Loss_Obj二元交叉熵判断每个位置是否有目标Loss_Cls二元交叉熵预测目标类别十、实验结果10.1 Gen1 数据集Gen1 是 Prophesee 发布的汽车场景事件数据集包含汽车和行人两类目标分辨率 304×240。方法mAPmAP50每事件 FLOPsEV-FlowNet (同步)0.1490.279-E2E-Det (同步)0.2640.445-DAGR (异步)0.3560.565基线SSLA-Det-S0.3120.508基线的 1/20SSLA-Det-B0.3750.597基线的 1/20SSLA-Det-B 在异步方法中达到了最高的 0.375 mAP同时每事件计算量比 DAGR 降低了 20 倍以上。10.2 N-Caltech101 数据集N-Caltech101 是基于 Caltech-101 转换的事件数据集包含 101 个类别分辨率 240×180。方法mAPmAP50DAGR0.4780.683SSLA-Det-B0.5150.72910.3 不同模型规模的对比模型参数量Gen1 mAPN-Caltech101 mAPSSLA-Det-S0.5M0.3120.468SSLA-Det-B1.8M0.3750.515SSLA-Det-M4.2M0.3890.534SSLA-Det-L9.1M0.3940.541从 S 到 L精度提升逐渐放缓但计算量增长更快。B 模型是精度和效率的最佳平衡点。十一、代码结构速览ssla/ ├── model_mos.py # SSLA-Det 主模型定义 ├── model_base.py # Lightning 基类数据加载、优化器 ├── train.py # 训练入口 ├── test.py # 测试入口 ├── compute_flops.py # 计算量统计 │ ├── layers/ │ ├── mos_attention.py # 核心MoS 注意力模块 │ ├── linear_attention.py # 标准线性注意力对比实验用 │ ├── mos_lstm.py # MoS LSTM对比实验用 │ ├── sparse_pooling.py # 稀疏池化层 │ ├── temporal_dropout.py # 时间降采样 │ └── yolox_head.py # YOLOX 检测头 │ ├── ops/ │ └── common/ │ ├── scan.py # Triton 顺序扫描 kernel │ └── scan_complex.py # 复数扫描用于 MosLSTM │ ├── utils/ │ ├── async_utils.py # 事件分组、scatter/gather 操作 │ ├── data_utils.py # 数据集加载 │ └── farsecnn_utils.py # 来自 FARSE-CNN 的工具函数 │ ├── dataset/ │ ├── gen1.py # Gen1 数据集 │ └── ncaltech101.py # N-Caltech101 数据集 │ └── configs/ ├── model/ # 模型配置S/B/M/L ├── train_cfg_*.yaml # 训练配置 └── test_cfg_*.yaml # 测试配置十二、动手跑 Demo我们在 CPU 环境下成功运行了 SSLA-Det 的推理 demo。以下是关键步骤12.1 环境准备conda activate AITransformer pipinstalllightning torch-scatter pycocotools h5py hdf5plugin tensorboard12.2 Triton 的 CPU Fallback由于 Triton 在 Windows CPU 环境下不可用我们对ops/common/scan.py做了修改try:importtriton HAS_TRITONTrueexceptImportError:HAS_TRITONFalsedefscan(u,g,cu_seqlens):ifnotHAS_TRITON:return_scan_naive(u,g,cu_seqlens)# 纯 PyTorch fallbackreturnSequentialScan.apply(u,g,cu_seqlens)# Triton kernel12.3 运行推理# 使用合成事件数据python demo_cpu.py--checkpointcheckpoints/base.ckpt# 使用 N-Caltech101 测试数据python test_ncaltech101.py12.4 检测结果使用真实 checkpoint 和合成事件数据模型成功检测到了目标Detection results: Batch 0: [car] score0.027, bbox(204.8, 148.7, 244.6, 181.3) [car] score0.015, bbox(70.8, 147.0, 109.8, 176.5)虽然置信度较低因为输入是合成数据而非真实事件但证明了模型架构可以正确运行。十三、深入理解为什么 SSLA 能同时实现高精度和低延迟让我们从信息论的角度来理解 SSLA 的精妙之处。13.1 信息瓶颈的突破传统方法面临一个信息瓶颈粗粒度处理帧式把大量事件压缩成帧丢失了精细的时间信息但计算效率高。细粒度处理逐事件保留所有时间细节但每个事件都要完整计算一遍效率极低。SSLA 的突破在于它在像素级别保持了细粒度的时间信息但在空间级别利用了稀疏性来减少计算。每个活跃像素维护自己独立的事件序列和隐状态时间信息被完整保留。但由于只有活跃像素参与计算空间维度的计算量被大幅削减。13.2 计算复杂度的分析设 N 为一个时间窗口内的总事件数P 为活跃像素数L 为平均每个像素的事件序列长度N P × L。方法每事件计算量总计算量延迟帧式O(1)均摊O(N)高等窗口逐事件异步O(C²)完整网络O(N × C²)最低SSLAO(C²/K²)patch 级O(P × L × C²/K²)低异步其中 C 是通道数K 是 patch 核大小。SSLA 通过空间稀疏性P 总像素数和混合空间分解K² 个位置共享计算实现了计算量和延迟的最佳平衡。13.3 遗忘门的关键作用遗忘门g_t是 SSLA 能够高效处理长事件序列的关键。在事件数据中不同时间尺度的信息有不同的意义微秒级单个像素的噪声毫秒级物体边缘的扫过十毫秒级物体的运动轨迹百毫秒级场景的整体变化遗忘门让模型能够自适应地决定在不同通道上保留哪些时间尺度的信息。一些通道可能快速遗忘捕捉瞬时变化另一些通道可能缓慢遗忘积累长期信息。这种自适应的时间建模能力是 SSLA 在精度上超越固定时间窗口方法的重要原因。十四、与其他线性注意力方法的对比14.1 vs. 标准线性注意力标准线性注意力如 Linear Transformer为所有输入维护一个全局状态矩阵SS_t S_{t-1} k_t ⊗ v_t o_t q_t · S_tSSLA 的区别在于引入了空间维度的状态分解。不是维护一个全局S而是维护 K² 个位置相关的状态S_t[i] S_{t-1}[i] k_t[i] ⊗ v_t[i] (i 0, ..., K²-1) o_t[i] q_t[i] · S_t[i]每个位置i的状态独立更新互不干扰。这使得模型能够为不同的空间关系学习不同的特征。14.2 vs. Mamba/S4 等状态空间模型Mamba 和 S4 也使用顺序扫描操作但它们处理的是密集的信号如文本 token、音频采样点。SSLA 的特殊之处在于输入是稀疏的只有活跃像素才有输入输入是异步的不同像素的事件到达时间不同需要空间感知目标检测需要精细的空间特征SSLA 通过 scatter-compute-gather 机制巧妙地解决了这三个挑战。十五、局限性与未来方向15.1 当前局限CPU 推理速度由于 Triton kernel 只支持 GPUCPU 上的 naive 实现速度较慢。在 Gen1 测试集上的完整评估需要 GPU 环境。数据集覆盖目前只在 Gen1 和 N-Caltech101 上验证。更多事件数据集如 DDD17、DSEC上的表现有待验证。实时性验证论文主要关注精度和每事件计算量实际部署中的端到端延迟还需要更多测量。15.2 未来方向更多任务SSLA 的架构不仅限于检测还可以扩展到事件-based 的光流估计、语义分割、跟踪等任务。更高效的 kernel可以探索 FlashAttention 风格的 IO-aware 算法来进一步优化扫描操作。神经形态硬件部署事件相机和 SSLA 的稀疏计算天然适合神经形态芯片如 Intel Loihi、IBM TrueNorth有望实现超低功耗的实时感知系统。与帧相机的融合将 SSLA 与传统的帧相机结合实现事件图像的混合感知系统。十六、总结SSLA 的核心贡献可以总结为三句话空间稀疏性只在有事件的像素上计算不做无用功。混合空间状态不同空间位置维护独立的状态兼顾精度和效率。Scatter-Compute-Gather训练时并行计算推理时异步处理。这三者的结合使得 SSLA-Det 在异步事件检测方法中首次实现了「精度最高 计算量最低」的双冠。从工程角度看SSLA 的代码实现也非常优雅。整个模型的核心逻辑集中在mos_attention.py的 200 行代码中清晰地展示了 scatter→project→scan→gather 的数据流。加上 Triton kernel 的高效实现这使得 SSLA 不仅是一个理论创新更是一个可以实际部署的解决方案。对于事件相机领域的研究者来说SSLA 提供了一个重要的启示不要试图把事件数据塞进传统帧式方法的框架里而是要从事件数据本身的特性出发设计真正适合它的算法。空间稀疏性、时间异步性、微秒精度——这些不是需要克服的困难而是可以利用的优势。参考链接论文: arXiv:2603.06228视频: YouTube代码: GitHubCheckpoints: Google DriveGen1 数据集: PropheseeN-Caltech101: DAGR