跳到主要内容
FallenSigh
返回

SpikeYOLO:从 YOLOv8 到脉冲目标检测的微观架构解析

编辑此页

目标检测需要同时回答两个问题:图像里有什么,以及目标位于什么位置。YOLO 用一次前向传播同时预测类别和边界框,在速度与精度之间取得了很好的平衡。但把普通 YOLO 的激活函数直接替换成脉冲神经元,并不会自动得到一个高效、准确的 SNN 检测器。

SNN(Spiking Neural Network,脉冲神经网络)以离散脉冲传递信息。没有脉冲时,突触计算可以不发生;有脉冲时,权重乘法也可转化为条件累加。这种事件驱动特性对事件相机很有吸引力。不过,脉冲化也带来表示量化误差和时间维计算,尤其是目标检测还要回归精确的框位置,误差更容易影响最终结果。

SpikeYOLO 是 Luo 等人在 ECCV 2024 提出的 SNN 目标检测模型。它的思路不是把 YOLOv8 原样“换成脉冲版”,而是保留 Backbone–Neck–Head 的宏观检测框架,重新设计适合 SNN 的微观特征块,并用 I-LIF 在整数激活训练与二值脉冲推理之间搭桥。本文先从整体数据流入手,再逐步拆解 LIF、I-LIF 和各类卷积块。论文和实现分别见论文与官方仓库。

为什么要重新设计 SNN 版 YOLO?

ANN 特征通常是稠密的实数张量;SNN 特征则是随时间演化的脉冲。二者的数值表示和计算方式并不相同。直接把复杂的 YOLO 模块逐层替换成脉冲神经元,可能导致脉冲在网络深处逐渐衰减,最终特征不足以支撑分类和定位。论文的消融实验也显示,在其设置下,将 YOLOv8 直接转换成脉冲版本,COCO 上的 mAP@50 从 ANN 的 67.2% 降到 46.8%。

SpikeYOLO 因此做了两层改造:一是简化特征提取模块,以更适合脉冲传播的 SNN Block 取代 YOLOv8 中较复杂的重复特征结构;二是引入 I-LIF,训练时允许神经元输出小范围整数,减少二值化损失,推理时再把整数拆成 0/1 脉冲。换句话说,检测器的宏观任务流沿用 YOLOv8,脉冲网络的微观计算单元则重新设计。

论文报告,在 COCO 上,68.8M 参数配置取得 66.2% mAP@50 和 48.9% mAP@50:95;在 Gen1 事件数据集上,23.1M 参数配置取得 67.2% mAP@50。论文还报告了相同架构下相对 ANN 的能效优势。需要注意,这些能耗数字来自论文采用的运算能耗模型,并不等同于在某款 SpikeYOLO 专用芯片上的实测结果。

从输入到检测:SpikeYOLO 的整体结构

SpikeYOLO 的数据流可以先概括为:

图像/事件序列 → Backbone 提取多层特征 → Neck 融合多尺度特征 → P3/P4/P5 检测头 → 类别与边界框

输入统一表示为 X∈RT×C×H×WX\in\mathbb{R}^{T\times C\times H\times W}:静态图像可以沿时间维重复 TT 次;事件相机输入则先在时间窗口内聚合成 TT 个切片。TT 是输入的逻辑时间步数,后文的 DD 则是 I-LIF 允许的最大整数激活值,两者不是同一个参数。

输入 [T, C, H, W]
       │
       ▼
Backbone:下采样 + SNN Block + SPPF
       │          └─ 提取不同分辨率的特征
       ▼
Neck:上采样/拼接,再下采样/拼接
       │
       ├── P3:高分辨率,小目标
       ├── P4:中分辨率,中目标
       └── P5:低分辨率,大目标
                │
                ▼
      anchor-free SpikeDetect
                │
                ▼
       类别分数与边界框

在官方 snn_yolov8.yaml 中,Backbone 以一次 7×77\times7、stride=4 的卷积开始,之后继续下采样;以 640×640 输入为例,三个检测尺度对应约 80×80、40×40 和 20×20 特征图,即 stride 8、16、32。Neck 通过上采样和跨层 concat 建立自顶向下的特征融合,再通过下采样和 concat 建立自底向上的融合。末端 SpikeDetect 接收 P3/P4/P5 三个尺度,使用 YOLOv8 风格的 anchor-free 检测头。

这里的“沿用 YOLOv8”指的是 Backbone–Neck–Head 的总体组织方式,不是逐层照搬原版 YOLOv8:例如特征块、时序维、脉冲神经元和检测分支都做了适配。对应的网络配置可查看官方 YAML。

SpikeYOLO 论文 Figure 1:宏观 Backbone-Neck-Head 与微观 SNN Block 架构
图:SpikeYOLO 论文 Fig. 1。摘自 Luo et al., ECCV 2024,arXiv:2407.20708,CC BY 4.0。

Backbone:逐级降采样,构造语义层次

Backbone 的任务是把输入变成从细节到语义逐渐抽象的特征。以官方 snn_yolov8.yaml 的 s scale、640×640 输入为例,MS_GetT 先补上时间维;随后首层用 7×77\times7、stride=4 卷积降至 160×160。注意首层直接处理连续输入,不先执行 mem_update;从后续层开始才进入脉冲神经元和 SNN 卷积。

之后 Backbone 每个 stage 通过 stride=2 卷积继续降采样,并在 stage 内堆叠脉冲块:stride 4、8 阶段主要使用 MS_AllConvBlock(SNN-Block-1),stride 16、32 阶段主要使用 MS_ConvBlock(SNN-Block-2)。在 s scale 下,四个阶段的通道数分别为 64、128、256、512;最深层再接 SpikeSPPF 汇聚多尺度上下文。Neck 会从 stride 8、16、32 三处取特征作为横向连接。

Neck:自顶向下传语义,再自底向上补细节

Neck 可以看作 FPN 与 PAN 风格的双向特征融合。先从 Backbone 最深层开始:用 1×11\times1 SNNConv 调整通道、上采样 2 倍,再与 stride 16 的 Backbone 特征 concat;经过 SNN Block 融合后继续上采样,与 stride 8 特征 concat,形成高分辨率的 P3 路径。

接着,Neck 把 P3 路径用 stride=2 卷积降采样,与前面的 stride 16 特征再次 concat,融合出 P4;再降采样一次,与最深层特征 concat,得到 P5。这样,P3 保留较多空间细节,P5 拥有较强的语义信息,P4 则位于两者之间。以 s scale 为例,送入检测头的特征大致为 P3 [128,80,80]、P4 [256,40,40]、P5 [512,20,20](格式为 [C,H,W])。

Head:三个尺度分别预测类别与边界框

Head 接收 P3/P4/P5 三张特征图,在每个尺度上分别运行分类分支和边界框回归分支。SpikeYOLO 使用 anchor-free 方式,不为每个位置预设一组宽高不同的 anchor box;每个网格位置根据预测的类别分数和四边距离恢复目标框。回归分支采用 DFL 分布表示,再通过积分和网格参考点解码为 (x,y,w,h)(x,y,w,h)。三个尺度的预测合并后形成最终候选结果。检测头内部的分支结构和 DFL 计算会在后文单独展开。

下面先从单个神经元的状态更新开始,再回到卷积块如何把这些神经元组织起来。

LIF 神经元

LIF神经元因其在生物可行性和计算复杂性之间的平衡,是构建SNN最受欢迎的神经元。

离散的 LIF 方程

积分:U[t]=H[t−1]+X[t]放电:S[t]=Θ ⁣(U[t]−Vth)软复位/泄漏:H[t]=β(U[t]−S[t])\begin{aligned} \text{积分}:\quad U[t] &= H[t-1] + X[t] \\[2pt] \text{放电}:\quad S[t] &= \Theta\!\left(U[t] - V_{th}\right) \\[2pt] \text{软复位/泄漏}:\quad H[t] &= \beta\left(U[t] - S[t]\right) \end{aligned}

其中:

论文的 LIF 更新式是软复位,而不是“发放后直接设为固定复位电位”的硬复位。原先的 LIF 示意图画的是硬复位公式,因此本文暂不将它作为配图,避免图文不一致。

I-LIF 神经元

SpikeYOLO 提出 Integer Leaky Integrate-and-Fire(I-LIF)。与普通 LIF 在每个时间步输出 0/1 不同,I-LIF 在训练阶段输出 00 到 DD 的整数,以缓解二值脉冲带来的量化误差。

I-LIF 的方程

积分:U[t]=H[t−1]+X[t]整数发放:S[t]=Clip⁡(round⁡(U[t]),0,D)软复位/泄漏:H[t]=β(U[t]−S[t])\begin{aligned} \text{积分}:\quad U[t] &= H[t-1] + X[t] \\[2pt] \text{整数发放}:\quad S[t] &= \operatorname{Clip}(\operatorname{round}(U[t]), 0, D) \\[2pt] \text{软复位/泄漏}:\quad H[t] &= \beta\left(U[t] - S[t]\right) \end{aligned}

其中:

论文中的离散方程是概念定义;官方训练实现还明确了状态更新顺序:mem_update 在首个时间步令 mem = x[0],之后按 mem = (mem_old - spike.detach()) * decay + x[t] 更新,再用 MultiSpike4 将膜电位取整并裁剪到 [0,4][0,4]。因此,解释方程时应把“先减去已发放量,再乘泄漏系数”的软复位顺序说清楚。对应代码见 mem_update 与 MultiSpike4。

训练和推理的区别

训练阶段

整数值发放,降低二值化带来的信息损失。

S[t]=Clip⁡(round⁡(U[t]),0,D)S[t] = \operatorname{Clip}(\operatorname{round}(U[t]), 0, D)

推理阶段

推理时,把整数输出拆到 DD 个虚拟时间步中的二值脉冲。例如,一个时间步输出 2,可以用两个值为 1 的脉冲表示:

S[t]=2→(1,1)S[t] = 2 \rightarrow (1, 1)

每个展开后的脉冲只取 0 或 1,后续卷积就可以对实际发放的位置做稀疏累加(AC),而不必计算整数激活与权重之间的乘累加(MAC)。

论文进一步将时间步数从 TT 扩展为 T×DT\times D,并要求整数输出与展开后的二值脉冲数量满足

∑d=1DS[t,d]=S[t]\sum_{d=1}^{D}S[t,d]=S[t]

其中 S[t,d]∈{0,1}S[t,d]\in\{0,1\}。论文给出的是数量约束;官方二值推理代码 yolo_spikformer_bin.py 使用 cumulative/unary 展开:对整数值 vv,前 vv 个虚拟步为 1,其余为 0。该分支的 mem_update 会先对输入时间维求和,再量化并展开;原训练分支则逐时间步更新膜电位,两者不是逐行等价的实现。官方 README 特别说明,二值推理版使用对应的二值推理权重,不能简单替换原整数模型文件后继续加载原 checkpoint。

SpikeYOLO 论文 Figure 3:I-LIF 训练整数激活与推理二值脉冲展开
图:论文 Fig. 3 以 $T=3,D=2$ 展示 I-LIF:每个整数发放对应 $D$ 个二值虚拟步,因此推理序列长度扩展为 $T\times D=6$。摘自 Luo et al., ECCV 2024,arXiv:2407.20708,CC BY 4.0。

SpikeYOLO 的微观架构

一些常见的卷积

卷积(互相关版)

深度学习中的卷积运算被定义为

Yi,j,o=∑c=0Cin−1∑m=0Kh−1∑n=0Kw−1Wo,c,m,nXi+m,j+n,cY_{i, j, o} = \sum_{c=0}^{C_{in} - 1}\sum_{m=0}^{K_h - 1}\sum_{n=0}^{K_w - 1}W_{o, c, m, n}X_{i + m, j + n, c}

深度学习中的普通卷积会同时沿着空间维度和输入通道维度进行加权求和。

以下公式假设 stride 为 1,并忽略 padding 和 bias。

深度卷积(Depthwise Conv)

深度卷积被定义为

Yi,j,c=∑m=0Kh−1∑n=0Kw−1Wm,n,cdwXi+m,j+n,cY_{i, j, c} = \sum_{m=0}^{K_h - 1}\sum_{n=0}^{K_w - 1}W_{m, n, c}^{dw}X_{i + m, j + n, c}

其中:

深度卷积的求和只遍历空间维度m,nm, n,不对通道cc进行求和,各通道独立卷积。深度卷积运算缺少通道间的特征融合 ,并且运算前后通道数无法改变。

深度卷积逐通道使用独立卷积核,输入与输出通道数相同
图:Depthwise Conv 在每个通道内独立进行空间卷积,不跨通道求和。

逐点卷积(Pointwise Conv)

逐点卷积被定义为

Yi,j,o=∑c=0Cin−1Wo,cpwXi,j,cY_{i, j, o} = \sum_{c=0}^{C_{in} - 1}W_{o, c}^{pw}X_{i, j, c}

其中:

逐点卷积通常用于融合不同通道。

逐点卷积使用 1×1 卷积核混合输入通道
图:Pointwise Conv 在每个空间位置混合通道,常用于改变通道数。

倒置可分离卷积(SepConv)

论文将空间混合器写成如下抽象形式:

SepConv(U)=Convdw2(Convpw2(SN(Convdw1(SN(Convpw1(SN(U)))))))SepConv(U) = Conv_{dw2}(Conv_{pw2}(SN(Conv_{dw1}(SN(Conv_{pw1}(SN(U)))))))

其中 Pointwise/Depthwise 卷积和脉冲神经元交替组合;较大的 depthwise kernel(论文设为 7×77\times7)扩大空间感受野,后续的 3×33\times3 depthwise 卷积进一步融合局部空间信息。需要区分论文公式与代码版本:官方训练实现 yolo_spikformer.py 的 SepConv 使用 pointwise 扩张、可配置 kernel 的 depthwise 卷积,以及 SepRepConv(depthwise 3×33\times3 后接 pointwise 投影);二值推理版 yolo_spikformer_bin.py 则显式包含末尾的逐通道卷积。讨论具体算子顺序时,应注明对应的实现分支。

论文中的算子定义见公式 (4);官方训练分支的 SepConv 实现在 yolo_spikformer.py,二值推理分支则在 yolo_spikformer_bin.py。两者结构有差异,不应把其中一个代码片段当作两种模型共用的定义。

重参数化卷积(RepConv)

论文把通道混合中的 RepConv 定义为:

RepConv(U)=Convpw2(Convdw1(Convpw1(U)))RepConv(U) = Conv_{pw2}(Conv_{dw1}(Conv_{pw1}(U)))

其结构是 pointwise 1×11\times1 → depthwise 3×33\times3 → pointwise 1×11\times1。论文称该结构可在推理阶段重参数化为标准卷积。官方 Python 实现中的 RepConv 则以 BNAndPadLayer 和分解卷积组织计算;不要把它与 Ultralytics 原生 RepConv 类混为一谈。

标准脉冲卷积(SNNConv)

一个标准脉冲卷积被定义为

SNNConv(U)=BatchNorm(Convk×k(SN(U)))SNNConv(U) = BatchNorm(Conv_{k\times k}(SN(U)))
标准脉冲卷积由神经元、卷积与批归一化组成
图:标准 SNNConv 的计算顺序是脉冲神经元、卷积、BatchNorm。

官方实现中的 MS_StandardConv.forward() 按 mem_update → Conv2d → BatchNorm 的顺序计算,并在卷积前合并时间维、卷积后恢复时间维。可对照 yolo_spikformer.py。

Meta SNN Block

SpikeYOLO 借鉴 Meta-SpikeFormer 的 meta SNN block。它和 Transformer block 一样把特征处理拆成“空间/token 混合”和“通道混合”,但这里的空间混合器是脉冲卷积,而不是自注意力。

一个meta SNN Block可以写作

U′=U+SepConv(U)U′′=U′+ChannelConv(U′)\begin{aligned} U' &= U + SepConv(U) \\ U'' &= U' + ChannelConv(U') \end{aligned}

两个加号都是残差连接:先用 SepConv 混合空间信息,再对结果做 ChannelConv 并再次残差相加。残差支路让输入特征可以直接向后传播,降低深层 SNN 特征退化风险。官方实现的 MS_ConvBlock 和 MS_AllConvBlock 都遵循这一双残差骨架。

SpikeYOLO Meta SNN Block 的双残差、空间混合和通道混合结构
图:Meta SNN Block 先做 SepConv 空间混合并残差相加,再选择标准卷积或 RepConv 做通道混合并再次残差相加。

SNN-Block-1 和 SNN-Block-2

SNN-Block-1 和 SNN-Block-2 的区别主要在于 ChannelConv(通道混合器)的实现。

对于 SNN-Block-1:

ChannelConv1(U′)=Conv(SN(Conv(SN(U′))))ChannelConv1(U') = Conv(SN(Conv(SN(U'))))

对于 SNN-Block-2:

ChannelConv2(U′)=RepConv(SN(RepConv(SN(U′))))ChannelConv2(U') = RepConv(SN(RepConv(SN(U'))))

因此,SNN-Block-1 和 SNN-Block-2 的主要差别是通道混合器:前者使用扩张比为 4 的标准 3×33\times3 卷积;后者使用 RepConv,扩张比按 stage 配置。官方代码分别对应 MS_AllConvBlock 和 MS_ConvBlock;在低层特征阶段使用 Block-1,在更深阶段使用 Block-2。论文的消融实验显示,把早期 Block-1 换成 Block-2,或把深层 Block-2 换成 Transformer block,都没有优于基线。

SpikeYOLO 逐层解析

下面逐层追踪官方 snn_yolov8.yaml。为了让形状具体可读,固定使用 s scale、640×640 输入、nc=80;其他 scale 会改变通道数,输入尺寸也会改变空间尺寸。表中形状只写 [C,H,W],省略 batch 和时间维:整数训练版的完整特征通常是 [T,B,C,H,W],二值推理版还可能在神经元处展开 DD 个虚拟时间步,但不会改变这里列出的空间/通道形状。s scale 的深度系数为 0.33,YAML 中重复数 3、6、9、3 实际缩放为 1、2、3、1。

卷积输出的空间尺寸按下式计算:

Hout=⌊Hin+2p−ks⌋+1,Wout=⌊Win+2p−ks⌋+1H_{out}=\left\lfloor\frac{H_{in}+2p-k}{s}\right\rfloor+1, \qquad W_{out}=\left\lfloor\frac{W_{in}+2p-k}{s}\right\rfloor+1

其中 kk、ss、pp 分别为 kernel、stride、padding。后文的 SNNConv 记作“神经元 → 卷积 → BN”;除输入 stem 外,MS_StandardConv 会先通过 mem_update 生成脉冲特征。

几个会反复出现的操作可写成:

SNNConv⁡(X)=BN⁡(Conv⁡(SN⁡(X)))Concat⁡C(X,Y)=[X;Y]CXup=NearestUpsample⁡×2(X)\begin{aligned} \operatorname{SNNConv}(X) &= \operatorname{BN}(\operatorname{Conv}(\operatorname{SN}(X))) \\ \operatorname{Concat}_C(X,Y) &= [X;Y]_C \\ X_{up} &= \operatorname{NearestUpsample}_{\times2}(X) \end{aligned}

Backbone:第 0–9 层

层模块 / 输入 → 输出计算细节
0MS_GetT:[3,640,640] → [3,640,640]为输入补时间维。此 YAML 的 T=1T=1;若设置更大的 TT,静态图像会沿时间维重复。
1MS_DownSampling:[3,640,640] → [64,160,160]首层 7×77\times7、stride=4、padding=2 卷积 + BN。它直接处理连续输入,不在卷积前放脉冲神经元。输出尺寸由卷积尺寸公式得到。
2MS_AllConvBlock ×1:[64,160,160] → [64,160,160]Backbone 的第一个 SNN-Block-1,通道混合扩张比 r=4r=4;不改变空间分辨率。
3MS_DownSampling:[64,160,160] → [128,80,80]先 mem_update,再 3×33\times3、stride=2、padding=1 卷积 + BN。
4MS_AllConvBlock ×2:[128,80,80] → [128,80,80]两个 SNN-Block-1;输出作为 Neck 的高分辨率横向特征(P3 路径)。
5MS_DownSampling:[128,80,80] → [256,40,40]mem_update 后接 3×33\times3、stride=2、padding=1 卷积 + BN。
6MS_ConvBlock ×3:[256,40,40] → [256,40,40]三个 SNN-Block-2,mlp_ratio=3、SepConv kernel=7;输出作为 Neck 的中分辨率横向特征(P4 路径)。
7MS_DownSampling:[256,40,40] → [512,20,20]mem_update 后接 3×33\times3、stride=2、padding=1 卷积 + BN。
8MS_ConvBlock ×1:[512,20,20] → [512,20,20]深层 SNN-Block-2,mlp_ratio=2、SepConv kernel=7。
9SpikeSPPF:[512,20,20] → [512,20,20]先 1×11\times1 SNNConv 将通道减半到 256;连续三次 5×55\times5、stride=1 最大池化;拼接池化前及三次池化结果([1024,20,20]);再用 1×11\times1 SNNConv 融合回 512 通道。空间尺寸不变。

把池化过程写成公式,令 z0=Conv⁡1×1(X)z_0=\operatorname{Conv}_{1\times1}(X),并令 zi=MaxPool⁡5×5(zi−1)z_i=\operatorname{MaxPool}_{5\times5}(z_{i-1})(i=1,2,3i=1,2,3),则

SPPF⁡(X)=Conv⁡1×1(Concat⁡C(z0,z1,z2,z3))\operatorname{SPPF}(X)=\operatorname{Conv}_{1\times1}\left(\operatorname{Concat}_C(z_0,z_1,z_2,z_3)\right)

Block-1 / Block-2 内部均遵循前文的双残差式:V=X+SepConv(X)V=X+\mathrm{SepConv}(X),然后 Y=V+ChannelConv(V)Y=V+\mathrm{ChannelConv}(V)。MS_AllConvBlock 的通道混合器由两个标准 3×33\times3 SNNConv 组成,通道先扩张再投影回原维度;MS_ConvBlock 则以两个 RepConv 代替这对标准卷积。

Neck:第 10–25 层

层模块 / 输入 → 输出计算细节
10MS_StandardConv:[512,20,20] → [256,20,20]1×11\times1 SNNConv 做通道投影,作为顶层语义分支。
11Upsample ×2:[256,20,20] → [256,40,40]最近邻上采样,只扩大空间尺寸。
12MS_ConvBlock:[256,40,40] → [256,40,40]SNN-Block-2,mlp_ratio=3,先处理上采样后的语义特征。
13Concat(layer 6):[256,40,40] + [256,40,40] → [512,40,40]沿通道维拼接 Backbone 的 P4 特征,融合高层语义与中层空间细节。
14MS_StandardConv:[512,40,40] → [128,40,40]1×11\times1 SNNConv 压缩/投影通道。
15Upsample ×2:[128,40,40] → [128,80,80]最近邻上采样到 P3 分辨率。
16MS_AllConvBlock:[128,80,80] → [128,80,80]SNN-Block-1,mlp_ratio=4。
17Concat(layer 4):[128,80,80] + [128,80,80] → [256,80,80]拼接 Backbone 的高分辨率特征。
18MS_StandardConv:[256,80,80] → [128,80,80]1×11\times1 SNNConv 投影通道。
19MS_AllConvBlock:[128,80,80] → [128,80,80]SNN-Block-1,mlp_ratio=4;这是送往检测头的 P3 特征。
20MS_StandardConv:[128,80,80] → [128,40,40]3×33\times3、stride=2 SNNConv,下采样回 P4 尺度。
21Concat(layer 14):[128,40,40] + [128,40,40] → [256,40,40]与 Neck 自顶向下路径保留的 P4 特征拼接。
22MS_ConvBlock:[256,40,40] → [256,40,40]SNN-Block-2,mlp_ratio=3;输出 P4 检测特征。
23MS_StandardConv:[256,40,40] → [256,20,20]3×33\times3、stride=2 SNNConv,下采样到 P5 尺度。
24Concat(layer 10):[256,20,20] + [256,20,20] → [512,20,20]与来自 SPPF 的顶层语义分支拼接。
25MS_ConvBlock:[512,20,20] → [512,20,20]SNN-Block-2,mlp_ratio=1;输出 P5 检测特征。

上述 concat 都是沿通道维拼接,不是逐元素相加。Neck 的数据路径可以概括成 P5 上采样融合 P4 → 再上采样融合 P3 → 下采样回融 P4 → 再下采样回融 P5。它让每个检测尺度都同时拥有来自 Backbone 和其他尺度的特征。

第 26 层:SpikeDetect

第 26 层 SpikeDetect 的输入是 [19,22,25] 三个特征:P3 [128,80,80]、P4 [256,40,40]、P5 [512,20,20]。SpikeDetect 延续 YOLOv8 的 anchor-free 设计。每个尺度有两个独立分支:cv2 回归框分布,cv3 预测类别;每条分支先经过两个 3×33\times3 SpikeConv,再用 1×11\times1 卷积输出。以默认 reg_max=16 为例,回归分支输出 4×16=644\times16=64 个分布值,类别分支输出 nc=80 个类别分数,所以每个网格点的原始输出通道为 64+80=14464+80=144。

输入尺度回归分支原始输出分类分支原始输出拼接后
P3 [128,80,80][64,80,80][80,80,80][144,80,80]
P4 [256,40,40][64,40,40][80,40,40][144,40,40]
P5 [512,20,20][64,20,20][80,20,20][144,20,20]

第 ll 个尺度的两个预测分支可写作:

Rl=Conv⁡1×164(SpikeConv⁡3×3(SpikeConv⁡3×3(Fl))),Cl=Conv⁡1×180(SpikeConv⁡3×3(SpikeConv⁡3×3(Fl)))R_l=\operatorname{Conv}_{1\times1}^{64}\left(\operatorname{SpikeConv}_{3\times3}(\operatorname{SpikeConv}_{3\times3}(F_l))\right),\quad C_l=\operatorname{Conv}_{1\times1}^{80}\left(\operatorname{SpikeConv}_{3\times3}(\operatorname{SpikeConv}_{3\times3}(F_l))\right)

其中 FlF_l 是该尺度输入特征,RlR_l 是 4×164\times16 个框分布通道,ClC_l 是 80 个类别通道。

框分支随后通过 DFL(Distribution Focal Loss)积分模块。对每条边 q∈{l,t,r,b}q\in\{l,t,r,b\} 的 16 个离散位置做 softmax,再用固定权重求期望:

dq=∑j=015j⋅softmax⁡(Rl,q)jd_q=\sum_{j=0}^{15}j\cdot\operatorname{softmax}(R_{l,q})_j

四个距离经 dist2bbox 相对网格参考点解码为 (x,y,w,h)(x,y,w,h),再乘以该特征层的 stride;类别分支则经过 sigmoid。源码中的 make_anchors 生成的是特征图网格中心点(参考点),不是 YOLOv5 那类预设宽高的 anchor box。需要注意,DFL 的 softmax、加权求和和框解码仍包含常规数值运算,因此检测头并非从头到尾都是二值脉冲累加。

推理时,三个尺度共有 80×80+40×40+20×20=840080\times80+40\times40+20\times20=8400 个网格位置。DFL 将每个位置的 64 个框分布解码成 4 个框坐标,再与 80 个类别分数拼接,因此 nc=80 时输出形状为 [B,84,8400],其中 84=4+8084=4+80。训练模式则返回每个尺度尚未解码的原始预测张量。

官方 SpikeDetect 的两个分支、reg_max、DFL 与解码实现可见yolo_spikformer.py;网络配置将第 19、22、25 层的特征送入检测头,见snn_yolov8.yaml。

附录

LIF 相关名词解释

英文术语中文名称含义
Membrane Potential膜电位神经元内部的状态变量,反映输入累积后的电位水平
Resting Potential静息电位没有有效输入时,膜电位趋向的基准值
Membrane Time Constant膜时间常数决定膜电位变化与衰减速度的参数,经典 RC 模型中 τm=RmCm\tau_m=R_m C_m
Leak泄漏膜电位逐渐向静息电位回归的过程
Integration积分累积当前和历史输入的过程
Firing Threshold发放阈值膜电位达到该值时触发脉冲的阈值
Spike / Spike Train脉冲 / 脉冲序列单次发放事件 / 一段时间内的发放事件序列
Reset复位神经元发放后对膜电位执行的状态更新
Hard Reset硬复位将膜电位直接设置为复位电位
Soft Reset软复位从膜电位中减去阈值,保留超出部分
Synaptic Weight突触权重决定输入脉冲对目标神经元影响大小的权重
Leak Factor泄漏系数离散模型中控制历史状态保留程度的系数
Time Step时间步数字仿真中一次状态更新所对应的离散时间单位
Refractory Period不应期发放后的一段特殊时期;基础 LIF 模型不一定显式实现
Surrogate Gradient替代梯度训练时用于近似不可导脉冲函数梯度的方法

SNN 与 I-LIF 术语

英文术语中文名称含义
SNN (Spiking Neural Network)脉冲神经网络用离散脉冲在神经元之间传递信息的网络;神经元还保存随时间更新的内部状态。
Firing Rate发放率一段时间内发放脉冲的比例或频率;它会影响事件驱动计算量。
Timestep (TT)时间步SNN 离散状态更新的逻辑步数。静态图像可沿时间维重复,事件流也可切成 TT 个输入帧。
Maximum Integer Value (DD)最大整数发放值I-LIF 单次训练输出的上限;二值推理时,一个整数激活最多对应 DD 个虚拟二值脉冲步。
I-LIF整数 LIF 神经元训练时输出 0…D0\ldots D 的整数以减轻量化误差,推理时再展开为二值脉冲。
Cumulative / Unary Coding累积式/一元编码将整数 vv 表示为 vv 个 1 和其余 0;官方二值推理实现按这种方式展开虚拟时间步。
AC / MAC累加 / 乘累加AC 是加法累积;MAC 是乘法后累积。二值 spike 与权重相乘可通过“有 spike 才累加”实现稀疏 AC。
Batch Normalization (BN)批归一化根据训练统计量缩放/平移特征;推理时常可与卷积权重融合。

记号提醒:TT 是模型的逻辑时间步数,DD 是 I-LIF 整数输出的最大值;论文中的二值推理长度可写为 T×DT\times D。不要把 DD 当成卷积通道数或模型宽度系数。

卷积与特征融合术语

英文术语中文名称含义
Feature Map特征图卷积网络中间张量的空间表示;常用 [C,H,W] 描述通道数、高度和宽度。
Channel (CC)通道特征图的特征维度;普通卷积会对输入通道加权求和,生成输出通道。
Kernel / Stride / Padding卷积核 / 步长 / 填充卷积窗口大小、窗口移动距离和边界补值方式;stride 大于 1 时通常会降低空间分辨率。
Standard Convolution标准卷积同时混合空间邻域和输入通道,输出通道数由卷积核决定。
Depthwise Convolution深度卷积每个输入通道各自做空间卷积,不在通道间求和;SpikeYOLO 用它降低空间混合的计算量。
Pointwise Convolution逐点卷积1×11\times1 卷积,在每个空间位置混合通道,常用于扩张、压缩或投影通道数。
SepConv倒置可分离卷积先用 pointwise 扩张通道,再用 depthwise 卷积做空间混合,之后投影回目标通道数;SpikeYOLO 将其用于 SNN Block 的空间混合。
RepConv重参数化卷积SpikeYOLO 论文中的分解卷积模块,由 pointwise、depthwise、pointwise 操作组成;论文描述其可在推理阶段重参数化。不要与 Ultralytics 原生同名模块混淆。
Residual / Shortcut残差 / 捷径连接将模块输入直接加到变换结果上,例如 Y=X+F(X)Y=X+F(X),帮助保留输入信息。
Concat拼接沿通道维把多个特征图合并;与逐元素相加不同,拼接会增加通道数。
SPPF快速空间金字塔池化通过连续最大池化构造不同有效感受野,并拼接后融合,使特征图保持原空间尺寸。
FPN / PAN特征金字塔 / 路径聚合网络FPN 通常自顶向下传递高层语义;PAN 再自底向上融合定位细节。SpikeYOLO Neck 采用上采样、concat、下采样的双向融合路径。

检测头术语

英文术语中文名称含义
P3 / P4 / P5多尺度特征层三种分辨率的检测特征。本文 640 输入的示例中分别为 80×80、40×40、20×20;高分辨率层通常更有利于小目标。
Detection Stride检测步长输入图像尺寸与某检测特征图尺寸的比例;P3/P4/P5 对应 stride 8/16/32。它不同于单个卷积层的 stride 参数。
Anchor-free无锚框不为每个位置枚举预设宽高的 anchor box;SpikeYOLO 在网格参考点上预测类别和边界框距离。
Anchor Point网格参考点特征图网格中心在输入坐标系中的位置;源码变量虽名为 anchors,这里表示参考点,而非预设尺寸的锚框。
nc类别数数据集中的目标类别数量。每个位置有 nc 个分类分数。
reg_max回归分箱上限每条边用多少个离散位置表示距离;默认 16,所以四边共有 4×16=644\times16=64 个回归 logits。
DFL (Distribution Focal Loss)分布焦点损失/积分解码训练时监督边界距离的离散分布;推理时对分布做 softmax,并用 0…150\ldots15 加权求期望,恢复连续距离。
NMS (Non-Maximum Suppression)非极大值抑制根据分数和框重叠度过滤重复候选框的后处理步骤;它不属于卷积特征提取本身。

编辑此页
分享这篇文章:

上一篇
从裸机到上位机:WCH CH585 无线鼠标的固件架构与三条链路