【RT-DETR实战】156、改进六:设计轻量级混合编码器(MobileViT思想)
一、从一次显存溢出说起
上周在部署RT-DETR到边缘设备时,又遇到了那个老问题:模型跑到一半显存爆了。客户给的硬件是Jetson Orin Nano,16GB内存看着不少,但实际跑起640x640的输入,backbone加上编码器一加载,显存直接冲到14GB,预处理和后处理都没空间了。
盯着nvidia-smi里那个刺眼的“OOM”,我意识到传统的Transformer编码器在边缘端确实太“重”了。
问题出在编码器的自注意力机制上。标准Transformer的计算复杂度是O(N²),输入特征图稍微大一点,内存和计算量就成倍上涨。
之前试过剪枝、量化,虽然有点效果,但模型精度掉得厉害,客户不买账。这次决定换个思路——能不能重新设计编码器本身的结构?
二、MobileViT的启发:当CNN遇见Transformer
翻论文时看到MobileViT,眼前一亮。它的核心思想很巧妙:用CNN的方式理解Transformer。传统ViT是把图片打成patch直接送进Transformer,MobileViT却先走一层CNN提取局部特征,再用Transformer处理全局关系,最后用CNN把特征“翻译”回空间敏感的形式。
这个“CNN-Transformer-CNN”的三明治结构有个好处:Transformer处理的序列长度大大缩短。因为第一层CNN已经把空间下采样了,输入Transformer的token数少了很多,计算量自然降下来。
更重要的是,最后那层CNN能把全局上下文信息重新映射到空间
