
车站这个场景远比大多数人想象的有意思。站台上的楼层标识、换乘指引、出站口导视看起来就是一块块普通的牌子但对室内导航、无障碍路径规划、智能巡检机器人这些应用来说它们是地面上最关键的信息锚点。楼层标识一旦识别错后面接的导航链路、语音播报、AR指引全都会跟着错。这个项目做的就是一件事在“站厅、站台、换乘通道、出入口”这些复杂场景下把各种楼层标识找出来、认出来、分好类。方案上采用了YOLO11作为检测底座结合C3k2模块、MambaOut模块和SFSC特征融合结构组成了一套名为YOLO11-C3k2-MambaOut-SFSC的识别方案。整套方案从数据标注、网络改造、训练调参到落地导出都有完整的实操路径适合做小目标检测、交通枢纽视觉应用、轻量化检测模型改进的同行参考。1. 先弄明白车站楼层标识到底难在哪很多人第一反应是识别个楼层牌有什么难的但真正到车站里拍一圈数据、跑一轮基线模型就知道问题没这么简单。楼层标识这个任务本质上是一个“检测细粒度分类”的混合问题模型既要框出标识的位置又要判断它属于哪一类。而车站环境的特殊性又把这个问题难度往上拉了好几个档次。1.1 要识别的不是“一块牌子”这么简单我把车站里跟“楼层”相关的标识物做了实地调研和归类最后整理成9个目标类别楼层数字牌例如单独的地下一层、二层标识、楼层平面图、扶梯指引、升降梯指引、换乘方向指示牌、出站口导向牌、楼层功能性标识卫生间、售票处、服务台方向、临时纸质标识、电子屏楼层信息。这里面有些是静态的有些是动态刷新的有些是临时贴上去的。类别之间视觉差异很大但又有交叉比如换乘方向指示牌和出站口导向牌在一些老车站里长得非常像底色一样、字体大小一样区别只在箭头指向和文字内容上。这也是我不能简单用图像分类模型去解决的原因。分类模型只能回答“这张图里有没有楼层标识”回答不了“标识在哪个位置”。而在实际的导航业务里位置信息比类别信息更关键——机器人需要知道标识牌在哪个墙面上、在哪个立柱上、距离自己多远。所以一开始我就把任务定成目标检测用边界框同时输出“在哪”和“是什么”。1.2 这些难点决定了模型结构梳理了真实场景后我把难点归纳成下面几类它们直接决定了后续模型要怎么改小目标占比极高。车站的楼层标识在监控摄像头或机器人第一视角画面里常常只占图像面积的2%到5%。尤其是走廊尽头的悬挂式指示牌小到几乎只有十几个像素。这对特征提取网络的要求很高浅层特征保不住边缘细节深层特征又丢了位置信息。反光与光照变化。车站大量使用玻璃、不锈钢、抛光石材标识牌贴着这些材质一到下午阳光斜射反光区域能把整个牌面内容“洗白”模型看到的就是一块亮斑。地下站则相反灯光不足、色温偏冷标识牌蒙上一层暗蓝色调。同一个类别的同一个牌子在不同时间、不同角度下可能长得完全不像。遮挡和透视变形。人流密集时段乘客会挡住标识牌的一部分机器人低速行进时视角偏低看到的指示牌是严重透视变形的梯形而不是正对着的矩形。类别不平衡明显。楼层数字牌和扶梯指引这类高频标识占了数据量的大头而临时纸质标识和电子屏楼层信息占比很少容易被模型忽略。这些难点单个处理都不难但叠加在一起就对模型的“多尺度特征表达能力”和“局部细节建模能力”提出了很高的要求。这也是我后来在YOLO11基线上加入C3k2-MambaOut-SFSC结构的主要原因。1.3 为什么不用纯分类或纯检测路线这个项目里还有一层考虑楼层标识的“识别”不只是框出来还包括后续的“分类”和“信息结构化”。比如识别到一块楼层平面图业务层希望知道平面图里的电梯位置、安全出口位置识别到一块换乘指引牌希望知道它指向的是几号线还是某个出口。这些下游逻辑我放在了后处理里检测模型只负责做到“精确检出 粗分类”粗分类的边界框会送入一个轻量的OCR/视觉理解流程做精细化解析。在模型层面就体现为一个很小的改动检测头的分类分支从单标签改成多标签输出让同一个框同时输出“它是楼层平面图”“它包含扶梯方向信息”这样的多标签结果。这个设计在后续对接业务时省了很大力气。2. 模型怎么搭从YOLO11到C3k2-MambaOut-SFSC模型这部分是项目里改动最大的地方。我在选型时比较过几套方案包括纯YOLO11原版、加了Transformer模块的变体以及把骨干替换成其他结构的方案。最后选择了“YOLO11为主体 C3k2强化骨干 MambaOut提供轻量长距离建模能力 SFSC做多尺度融合”的组合方式。下面把每一块的原因和实现细节说清楚。2.1 为什么拿YOLO11当底座YOLO11是当前YOLO系列里综合体验很好的一代训练生态成熟导出部署方便检测头是Anchor-Free设计省去了候选框调参的痛苦。更重要的是它在保持高精度的同时模型结构非常规整适合做模块级改造。我在项目里对比过同代几个知名检测器YOLO11的FPS和mAP平衡点最让我满意尤其是在中等显卡上就能跑得很舒服不需要动不动就上多卡集群。改装模型最怕的就是“牵一发而动全身”。YOLO11这种CSP风格的骨干结构模块之间的接口非常标准化所以我加入新模块时不需要重写整个网络只需要替换或插入对应位置。这种可扩展性是我选择它作为基线的核心理由。2.2 C3k2常用模块的重新组织C3k2这个名字看起来很复杂拆开看其实是指“CSP Bottleneck with 2 convolutions”并且允许根据需求调整卷积核尺寸。它的基本思路是把输入特征图分成两条路径一条走主干变换一条走捷径连接最后拼接起来。这种“一半算一半不直接算”的CSP思想可以在不增加太多计算量的前提下让梯度流更丰富特征重用更充分。在这个项目里我不仅保留了C3k2还重新组织了它在不同Stage里的分布。理解这个很关键楼层标识的小目标问题需要骨干网络在前几层就有足够的感受野和边缘信息保留能力如果全是小卷积核的串行堆叠到了深层信息会变得过于抽象小目标的位置细节就丢了。因此我在Stage 3和Stage 4里适当增加了C3k2中瓶颈分支的宽度和深度同时在Stage 4开始引入可变形卷积的变体让采样点可以跟着标识牌的形状自适应调整。改造后模型对倾斜的、透视变形的指示牌框得明显更准。2.3 MambaOut轻量长距离建模的工程解读先说明一个背景MambaOut这个词在学术圈里其实代表一种“反思”——有的研究观点认为视觉任务里并不一定需要原生Mamba那套状态空间机制用常规卷积加池化也能达到类似的效果。这个思想在我看来非常适合工程落地我需要的不是真的塞一个会带来大量序列化计算和难调的Mamba模块而是借它“轻量全局建模”的思路让网络在不显著掉速的前提下能感知到远处上下文信息。具体的做法是在骨干网络的Stage 4之后插入一个轻量模块用全局平均池化提取上下文统计量再用深度卷积做局部细节增强最后通过一个线性层把全局与局部信息融合起来。整个模块的结构偏向“池化 深度卷积 线性注意力”的组合计算开销很小和同尺寸的普通卷积相比FPS几乎没有下降但换来了更大的有效感受野。说句实在话车站楼层标识的检测并不需要特别夸张的全局感知能力真正让我决定保留它的是“暗光低对比度”场景。原版模型在这种环境下容易把楼层牌和背后的墙面融成一团加入这个模块后模型能够利用墙面纹理、相邻标识的相对位置这些上下文信息把目标从背景里“拉”出来尤其是格式统一的悬挂式指示牌效果提升明显。2.4 SFSC多尺度特征的选择与融合SFSC是我在整个结构里最想强调的一块全称按项目里的设定是Selective Feature Selection and Concatenation即“选择性特征筛选与拼接”。这个模块解决的是检测模型里老生常谈但一直没有完美解决的问题不同尺度目标需要不同层的特征该信谁该怎么信以楼层数字牌为例大而醒目的数字牌在浅层特征里就很明显而远处墙上的小型指示牌只有在多层特征充分融合后才能被稳定感知。通用Neck的做法是把多尺度特征简单加和或沿通道拼接再让卷积自己学权重。SFSC的做法稍微“聪明”一点对骨干网络输出的三个有效特征层P3、P4、P5分别做上采样到同一尺寸再各自经过全局平均池化和1x1卷积生成一组“通道级重要性权重”用于告诉网络“这层特征是时候更加信任了”。之后按照权重对各层特征进行加权合并再经过1x1卷积压缩回目标通道数。这种设计的核心思想其实是“让融合过程可学习”而不是靠网络在后期卷积里隐式地学。在实际实验中SFSC最明显的收益是“类别边界更清晰”换乘方向指示牌和出站口导向牌此前容易混淆加入SFSC之后两个类别之间的误分率降低了将近一半。我猜测原因是SFSC的通道筛选机制能更加聚焦到用于区分指示方向箭头的细节纹理上。2.5 完整结构串联效果整套网络结构可以看作一个三段式的联动骨干网络改得更深更宽负责主体信息提取MambaOut模块嵌在骨干末端负责上下文建模和背景分离SFSC模块放在颈部负责跨尺度特征融合和关键纹理筛选。检测头和分类头与YOLO11原版保持一致只是输出维度按项目类别数做了调整。从参数量的角度看改进后的模型比YOLO11原版增加了约18%的参数但推理速度只下降了10%左右。对一个部署在机器人嵌入式设备上的识别任务来说这个性价比是可以接受的。阶段 | 使用模块 | 核心作用 骨干特征提取 | C3k2、可变形卷积变体 | 增强局部纹理细节应对小目标与透视形变 上下文建模 | 轻量MambaOut风格模块 | 扩大感受野改善低对比度目标检出 多尺度融合 | SFSC | 按通道权重选择关键特征减少类别混淆 检测与分类 | Anchor-Free头 | 输出边界框与多标签类别3. 数据与标注别让模型输在起跑线模型架构改得再多数据不行照样白搭。这个项目里我花在数据上的时间最多。真实车站数据的采集周期长、覆盖场景杂而且车站方面对拍摄设备和角度有一定限制所以数据要分好几路来凑。3.1 数据来源与采集细节数据来源我梳理成三条线第一条是通过内部协作在某几座不同类型的车站采集的真实照片覆盖白天、夜晚、高峰、平峰时段这是主力数据第二条是利用自己的拍摄设备在商场、办公楼、地铁站等类似场景里补拍主要用来丰富“悬挂式指示牌”和“电子屏”两个类别的样本量第三条是对公开数据集里楼梯间、消防通道标识等相似目标做迁移补充。采集时有一些很实际的讲究。不能只站在平视角度拍因为机器人视角往往更低拍出来的标识牌形变更大。也不能只拍晴天阴天、雨天、逆光这种“坏天气”数据比晴天的金贵得多因为它能逼模型学到不变的特征。我通常会让拍摄人员拿着设备走在通道正中央、靠墙侧、转角处三个视角各拍一轮这样后续做透视增强时就有足够的变化基础。3.2 标注规范边界框到底怎么打标注规范是这类项目里最容易埋坑的地方。楼层标识的边界到底该框到哪儿我刚开始让几个同学各自标了一批数据结果发现有的框把整个墙面都包进去了有的只框了牌子上的字模型训练完完全找不到规律。后来我重新定了规则边界框必须紧贴标识牌的物理外沿但不包含背后的墙面和周边的装饰物。如果标识牌本身就有凹凸边框则边框内侧边缘为界对于电子屏则框住整个屏幕发光区域。遇到被遮挡的标识遮挡少于三分之一时框出完整目标超过三分之一则不标注。这条规则花了半天时间讨论但带来的收益很大后期模型输出的框位明显稳定了。3.3 数据增强与类别平衡标注完成后的原始数据量大概在2.8万张左右。这个量对一般目标检测任务已经够用了但我面对的是9个小类别、且分布严重不均匀的情况楼层数字牌和扶梯指引占了近一半临时纸质标识和电子屏楼层信息总共不到6%。我处理类别不平衡不只是简单复制样本更关键的是用增强策略。除了常规的旋转、翻转、缩放之外我重点加了三种针对性增强一种是透视变换增强专门模拟机器人低位视角的梯形形变一种是色彩抖动增强模拟车站不同时段灯光色温变化还有一种是“局部反光模拟”用高亮度的椭圆形掩膜随机覆盖到标注框区域内模拟玻璃和石材的反光干扰。训练集和验证集按约85比15划分划分时严格按“车站”维度隔离确保同一块牌子不会同时出现在训练集和验证集里否则指标虚高得厉害部署到新站点时立刻现原形。4. 训练配置与关键参数很多读者可能更关心网络结构但在我个人经验里训练策略对最终结果的影响一点不比网络结构小。这个项目的训练大概分了三轮每轮之间参数都有针对性调整下面说一些关键决策。4.1 硬件与运行环境训练在单张24GB显存的显卡上完成PyTorch框架CUDA版本为常见的稳定版本用官方YOLO仓库作为底座代码然后在此基础上改模型结构。24GB显存对YOLO11这个体量的模型来说比较充裕批次大小可以直接拉到64吞吐量上去了训练时间也短了不少。如果显存只有16GB甚至更小建议把批次降到32或者把输入分辨率从1280降到1024否则容易显存溢出。推理和部署环节则在另一台设备上做测试是一块算力比较一般的板卡。这也很关键如果只在高性能显卡上测推理速度得出的FPS在真实边缘设备上完全没有参考意义。4.2 超参选择从经验值到实测调整超参方面我用了几个比较靠谱的经验值。初始学习率0.01使用SGD优化器加动量0.937权重衰减0.0005。这几个数值直接沿用YOLO系列的默认经验在自己项目里先跑一版再根据损失曲线微调。学习率方面有个重要心得从头训练和微调使用的学习率策略完全不同微调时初始学习率最好降到0.001甚至更低否则会快速破坏预训练骨干里已经学到的通用特征。我第二轮微调时就把初始学习率压到了0.001整体稳定性好很多。训练轮数上第一轮从头训练跑了300个epoch第二轮迁移微调跑了150个epoch第三轮在加装SFSC等模块后单独训练颈部相关参数跑了100个epoch。整体下来大概花了不到两天时间对个人项目来说完全可以在中午休息时启动训练第二天早上看结果。4.3 两阶段训练策略两阶段训练的核心想法是“地基和装修分开做”。第一阶段冻结骨干网络的大部分参数只训练颈部、头部以及新加入的SFSC模块让新模块先学会“在已有特征上做融合”第二阶段再解冻整个网络用较小学习率全量微调让骨干网络适应新模块带来的梯度流向变化。这样操作有一个很大的好处可以避免在训练一开始就同时下调整个复杂网络的所有层导致梯度方向混乱、前期震荡严重。两个阶段用到的数据增强策略也不一样。第一阶段的增强强度可以弱一点让模型先学稳定特征第二阶段再把透视变换、反光模拟、色彩抖动全部打开让模型进入“抗干扰模式”。我做过对比直接在300个epoch里全程开启高强度增强最终mAP反而低于两阶段策略约1.2个百分点。不是说增强不好而是增强时机需要讲究。5. 实验结果与效果对比结构改完、数据备好、训练完成接下来就是看结果说话。我从两个维度来评估这套方案一是跟YOLO11原始版本的量化指标对比二是看真实场景下的实际表现和错误模式。5.1 量化指标对比测试集包含了从验证集之外单独抽出的1000张真实车站图片这些图片没有参与训练且覆盖了多个不同风格的站点。主要对比两个模型在mAP50、mAP50-95和推理速度上的差异模型 | mAP50 | mAP50-95 | 推理速度 YOLO11基线 | 84.3 | 66.2 | 62 FPS YOLO11-C3k2-MambaOut-SFSC | 89.8 | 74.3 | 55 FPS在一个目标检测项目里mAP50从84.3提升到89.8提升了5.5个百分点已经是肉眼可见的差距。mAP50-95的涨幅达到8.1个百分点说明模型在“严格定位”上的改善更大框位更准。推理速度从62 FPS降到55 FPS对满帧率视频流稍有一点影响但对机器人巡检这种有几帧延迟完全可接受的场景没有压力。5.2 分场景的实测表现指标只能说明整体水平实际部署时不同场景的差异非常有意思。在新建的高架站和地下站模型表现最好因为室内灯光均匀、标识牌设备较新、风格统一在老旧车站标识牌样式五花八门且很多被磨损、贴纸覆盖模型表现打了折扣。让我最意外的是“地面贴纸式楼层标识”这个类别原本担心会被频繁误检实际效果反而很好因为它的色彩特征和地面纹理差异足够大。反光场景是另一个值得单独说的点。下午时段阳光从落地窗照进站厅玻璃栏杆上的楼层指示牌会形成大面积反光。基线模型在这个场景下漏检率超过30%而改进后的模型把漏检率压到了10%左右。MambaOut模块提供的上下文感知能力在这里发挥了主要作用模型在整块高亮区域里依然能够根据周边结构推断出“这里应该有一块标识牌”。5.3 错误分析哪些情况还在翻车模型不是万能的至少有三个场景目前还做得不够好。第一是标识牌被大面积遮挡超过三分之二面积被行人或行李箱挡住的时候边界框会偏移甚至丢失目标第二是电子屏幕内容切换瞬间画面出现动态模糊模型会误认为标识消失第三是极高的仰视角度当机器人从低处向上拍摄高悬的指示牌时形变过于剧烈即使有透视增强也难以完全覆盖这种极端分布。我把这些错误情况整理成了一个小型“难例数据集”准备在下一轮迭代里做针对性难例挖掘而不是简单粗暴地扩充数据量。这也是我强烈建议项目里做的事情保留所有失败案例建立一个难例库用它们来辅助分析瓶颈比盲目加数据要高效得多。6. 常见问题与排查技巧实录这个项目从头到尾踩了不少坑我把最典型的几个问题、排查思路和处理方式记录下来算是一份现场排障实录。6.1 小目标大量漏检怎么办第一版模型跑出来最明显的毛病就是“远距离小标识几乎全漏”。一开始我以为是数据不够、标注不齐但排查后发现核心问题在输入分辨率上。原版配置默认输入是640x640小目标在这个分辨率下可能只占4x4像素根本没信息量。我把输入调整为1280x1280后小目标漏检少了三分之一代价是训练时间和推理时间都明显上升。如果分辨率调大了还漏检那就需要从结构上想办法。我在骨干浅层增加了C3k2的宽度让浅层特征通道数更丰富保证小目标的细节信息有足够空间去表达。还有一个很有用的技巧把深层的特征上采样后回接到浅层给浅层补上下文信息。这个小改动在很多小目标场景里都有效可以优先尝试。6.2 反光玻璃上的标识老是被漏检反光问题最开始出现在验证集上明明是真实验证集的图片指标也不低但一测试就发现监控摄像机拍的画面里反光牌总是被漏掉。排查后发现我用的增强手段只做了“亮度提升”没有模拟“高亮遮罩”模型没见过真正的反光形态。解决方式分两步。第一步是在数据增强里加入反光模拟做法是用一个随机的半透明椭圆叠加到标识框附近亮度值远高于周围区域第二步是收集实际反光数据加入训练集。两步一起上之后模型对反光场景的鲁棒性提升明显。这类“先感知到视觉模式再补充真实样本”的套路在处理各种光影问题里都可以复用。6.3 模型在验证集上过拟合某个版本训练时训练损失一直降低但验证集指标在100个epoch后开始下滑典型过拟合。排查下来发现原因有两个一是模型骨干的参数在第二阶段解冻后太多训练数据相对不足二是数据增强强度第二阶段开太大导致训练集分布偏移。调整思路是把第二阶段的增强强度回调到基线水平同时给骨干部分的参数增加一点权重衰减再辅以随机失活。调整之后验证集指标重新走高过拟合现象消失。说实话很多深度学习工具都有“正则化”参数的开关但知道什么时候加、加多少才是真正靠经验积累出来的。6.4 导出部署时精度掉点训练指标很好但一导出到推理框架mAP直接掉了两个多点。第一次遇到时我还以为是导出工具的问题后来逐层排查发现是“批处理统计层”和“标准化层折叠”在导出时被过度简化了。解决办法是导出时选择“带原始批处理统计”的选项并对模型的标准化层做保留不追求极端简化。同时用校准数据集重新生成量化校准表而不是用默认随机校准。经过这些调整部署后的精度损失降到了0.5个百分点以内。这个经验在各类边缘设备的模型导出上都通用值得记下来。7. 落地部署的一些补充建议实验做完了、模型训好了最后一步是如何把它稳妥地部署到实际场景里。车站这类场景对设备的稳定性要求格外高不可能每隔几分钟就重启一次也不可能接受无休止的误报。所以部署环节我专门再补充几条建议。7.1 模型导出时注意层融合策略模型导出到推理引擎时层融合是一个非常影响最终效果的操作。过度融合会带来精度损失不完全融合又会导致推理帧率上不去。我的经验是优先融合标准化层和卷积层这是收益最高且精度影响最小的融合而涉及上采样和注意力操作的融合要特别谨慎一旦融合出现问题会出现“指标没问题、但单张图发疯”的诡异现象。导出后一定要记得用训练时的预处理方式做推理校准。很多部署掉点其实是预处理不一致造成的例如训练时用了灰度增强推理时没有对应实现模型自然会“水土不服”。7.2 后处理与业务联动模型输出边界框之后还需要跟业务逻辑做联动。我的做法是把检测结果按类别路由楼层平面图类别直接送入OCR子系统解析信息换乘方向类别检测到之后不做OCR直接匹配数据库电子屏类别额外增加一个“内容变化检测”逻辑避免屏幕切换造成重复报警。检出结果还会根据连续多帧做时序去噪消除单帧误检的影响。因为车站的标识位置相对固定我额外写了一个“空间先验”过滤层对一个站点来说楼层平面图大概率出现在墙面上而不会出现在吊顶或地面上。模型检测结果与站点空间先验冲突时降低该输出的置信度。这套后处理不涉及模型本身但带来的可用性提升非常显著。做检测项目做得久了就会越来越明白模型在竞赛榜单上的领先和真实场景里的可用是两码事。我个人体会最深的一点是这个项目里真正的增量不是某一个模块本身有多新颖而是C3k2、MambaOut、SFSC这三者的组合恰好覆盖了“细节保留、上下文感知、跨尺度融合”三个检测短板。如果你也在做类似的车站导视识别、室内指示牌检测、或者是其它小目标密集场景的识别任务完全可以直接拿这套方案当起点去调试。数据采集和标注规范照着我上面说的做结构替换也照着这个思路来大概率能得到一份还算满意的结果。最后再分享一个小技巧改造模型时每加一个模块都要单独跑一轮消融实验否则到最后你根本分不清是哪个改动带来的收益下一次迁移到新场景时又会从头再来一遍。