1. 遥感图像飞机分类项目整体设计与思路拆解遥感图像里的飞机类型分类说白了就是给卫星或航拍图片中的每一架飞机认型号。这件事听起来像是图像分类的一个普通分支但真正上手做过的人都知道它和常规的猫狗分类完全不是一个难度量级。常规图像分类里目标占据画面主体、光照充足、角度端正而遥感场景下飞机目标往往只有几十个像素大小背景是复杂的机场跑道、停机坪标线、油罐车、航站楼阴影再加上拍摄角度俯视、光照多变、云层遮挡稍不留神模型就学偏了。我从几年前开始接触这类任务踩过的坑比想象中多得多这里把整套思路和实操细节完整梳理一遍给准备入坑或正在调优的朋友一个可复现的参考。这个项目的核心价值在于用深度学习模型自动识别遥感图像中飞机的具体类型比如窄体客机、宽体客机、支线客机、货机、军用运输机等大类替代人工判读。它适合有一定深度学习基础、想切入遥感视觉领域的开发者也适合做机场流量分析、航空器普查、遥感数据标注辅助等方向的同学参考。整个方案围绕数据怎么来、模型怎么选、训练怎么稳、部署怎么快四条主线展开下面逐层拆解。1.1 为什么选目标检测加分类的两阶段路线很多人第一反应是直接做一个端到端的图像分类网络把整张遥感图丢进去输出飞机型号。这个思路在小图上可行但在遥感大图上基本走不通。原因很直接一张典型的遥感影像可能是几千乘几千像素飞机只占其中极小一块直接缩放整图会让飞机目标缩到十几个像素特征几乎被背景淹没。所以更稳妥的做法是先检测再分类第一阶段用目标检测网络把每架飞机的边界框抠出来第二阶段对每个裁剪出的小图做细粒度分类。这个两阶段设计的好处在于职责分离。检测阶段只关心哪里有飞机对型号不敏感可以用通用目标检测模型快速收敛分类阶段只关心这架是什么型号输入是已经对齐好的小图分辨率可以放大到合适尺寸特征提取更充分。代价是推理链路变长、需要维护两套模型但对于遥感这种目标小、背景杂的场景这个代价完全值得。我实测过端到端方案和两阶段方案在同一批数据上的表现两阶段在细粒度型号上的准确率明显更稳尤其是窄体机和宽体机这种外形接近的类别端到端经常混淆。1.2 检测与分类的模型选型逻辑检测阶段我优先考虑单阶段检测器比如YOLO系列或者RetinaNet这类。遥感飞机目标密集、排列规整单阶段检测器在速度和精度之间平衡得比较好而且部署友好。两阶段检测器精度可能略高但推理慢对于需要批量处理大图的场景不划算。分类阶段则倾向用轻量级骨干网络比如ResNet的变体或者EfficientNet系列输入尺寸控制在224到320之间既能保留机身轮廓、机翼后掠角、发动机数量这些关键判别特征又不至于让显存爆掉。这里有个容易被忽略的点分类阶段的类别体系要和检测阶段解耦。检测阶段只需要一个飞机大类分类阶段才细分型号。这样检测模型可以复用公开的遥感目标检测预训练权重分类模型则针对具体型号体系单独训练两边互不干扰后续增删型号也不用重训检测器。1.3 数据层面的核心考量遥感飞机数据最大的痛点是标注成本高、类别不均衡。宽体客机数量远少于窄体客机货机和军用机型更是稀缺。如果直接按原始分布训练模型会严重偏向多数类。我的处理策略是分层采样加类别加权损失同时对稀有类别做定向增强。另外遥感图像存在大量相似背景同一条跑道、同一片停机坪如果随机划分训练验证集很容易出现同一场景的图片同时出现在两边导致验证指标虚高。正确做法是按机场或按拍摄区域划分保证验证集里的场景在训练集中没出现过这样评估出来的指标才可信。2. 数据准备与预处理的关键细节数据这一块决定了项目天花板模型再花哨也救不了脏数据。遥感飞机分类的数据准备有几个绕不开的环节影像来源、标注规范、裁剪策略、增强方式。每个环节都有具体的坑下面按实操顺序讲。2.1 影像来源与分辨率匹配遥感影像常见来源包括公开的遥感数据集和自采的航拍数据。公开数据集里飞机目标标注相对规范但型号标签往往粗糙很多只标了飞机而没有细分型号自采数据型号信息更准但标注工作量大。我的建议是公开数据打底、自采数据补型号先用公开数据训练检测器保证找飞机这一步稳再用自采的带型号数据训练分类器。分辨率匹配是个细节活。检测阶段输入尺寸通常较大比如1024分类阶段输入尺寸较小比如256。如果原始影像分辨率很高检测时可以直接用原图或适度下采样分类裁剪时则要从原图对应位置抠出高分辨率小图再缩放而不是从检测用的下采样图上抠否则细节全丢了。这个细节我早期没注意导致分类模型看到的飞机全是糊的准确率怎么调都上不去后来改成从原图裁剪才解决。2.2 标注规范与边界框质量检测标注的边界框要紧贴机身外轮廓包括机翼和尾翼但不要框进周围的阴影和地面标线。框太松会把背景噪声带进分类输入框太紧会切掉机翼尖端而机翼后掠角和翼尖小翼恰恰是区分型号的重要特征。我见过不少标注把机翼切掉一截分类模型直接失去了关键判别依据。标注一致性也很重要。同一批数据如果多人标注要统一是否包含发动机吊舱是否包含垂尾投影这类边界规则否则模型学到的特征会自相矛盾。实操中我会先标一小批做交叉校验统一口径后再批量推进。2.3 裁剪策略与上下文保留分类裁剪不是简单按边界框切一刀就完事。飞机型号判别有时需要一点上下文比如机翼下方的发动机数量、机身长度比例。我的做法是在边界框基础上向外扩10%到15%的边距既保留机身完整轮廓又带入少量周边信息帮助判断同时避免扩太多把相邻飞机框进来。扩边比例可以按验证集表现微调我实测10%左右比较稳。裁剪出来的小图要统一缩放到分类网络输入尺寸。这里注意保持长宽比直接拉伸会让机身比例失真而机身长宽比本身就是型号特征之一。我通常用保持比例的缩放加填充填充色用图像边缘均值避免纯黑边引入伪影。2.4 数据增强的取舍遥感图像的增强和自然图像不太一样。水平翻转、垂直翻转基本安全因为飞机从上方看各个朝向都可能出现但大角度旋转要谨慎因为飞机停放和滑行有相对固定的朝向分布过度旋转可能引入不真实的姿态。颜色抖动可以适度用模拟不同光照和大气条件但对比度拉伸别太猛否则跑道标线和机身涂装的细节会被抹掉。针对稀有类别我会做定向过采样加轻度几何变换而不是简单复制。复制会导致过拟合轻度变换能在不引入失真前提下增加样本多样性。类别加权损失里权重按类别频率的倒数开方来设比直接取倒数更平滑训练更稳。3. 模型训练与调优的实操过程训练环节是整个项目最耗时的部分也是最容易出问题的地方。下面按检测训练、分类训练、联合调优三个阶段讲每个阶段给出关键参数和踩坑记录。3.1 检测模型训练的关键参数检测模型我以YOLO类架构为例。输入尺寸设1024batch size根据显存定一般8到16。学习率用余弦退火初始值1e-3左右warmup若干轮。遥感飞机目标密集正样本多锚框尺寸要针对飞机长宽比重设宽高比集中在2:1到4:1之间这个和通用数据集差别很大直接用默认锚框召回率会偏低。训练轮数不用太多检测任务相对简单几十轮就能收敛。重点看验证集上的召回率而不是mAP因为检测阶段漏检的飞机在分类阶段根本没机会补救召回率优先。我一般把置信度阈值调低一点比如0.25宁可多框一些候选后续用NMS和分类置信度过滤。3.2 分类模型训练的损失与采样分类模型输入256骨干用轻量ResNet变体。损失函数用带类别权重的交叉熵权重按前面说的频率倒数开方设定。优化器用AdamW学习率3e-4权重衰减1e-4训练几十轮配合余弦退火。采样策略上每个batch按类别分层采样保证稀有类别在每个batch里都有代表。验证集严格按场景划分评估指标除了整体准确率还要看每类的召回率和混淆矩阵。遥感飞机分类里最常见的混淆是窄体客机和某些支线机型外形接近、尺寸相近混淆矩阵能直观暴露这类问题指导后续针对性补数据或调特征。3.3 两阶段联合调优的衔接检测和分类分开训完之后要做联合评估。把检测输出裁剪图送进分类器端到端跑一遍验证集看整体型号识别准确率。这里常见的问题是检测框轻微偏移导致分类输入不对齐解决办法是在训练分类器时加入随机抖动增强让分类器对边界框的小幅偏移鲁棒。抖动幅度控制在边界框尺寸的5%以内太大反而破坏特征。另一个衔接细节是置信度阈值联动。检测置信度太低会引入大量背景误检分类器被迫在垃圾输入上做判断太高会漏检。我一般先用验证集扫一遍检测置信度阈值找到召回率和误检率的平衡点再固定这个阈值去评估分类器。3.4 训练过程监控与早停训练监控除了常规的loss和准确率曲线我特别关注验证集每类召回率的变化。整体准确率涨了但某类召回率掉了说明模型在牺牲稀有类换多数类这时候要调类别权重或者补数据。早停策略按验证集整体准确率加稀有类召回率的加权指标来定单纯看准确率容易过拟合多数类。4. 常见问题排查与避坑经验实录这一块是我觉得最有价值的部分很多问题文档里不会写只有实际跑过才知道。下面整理成速查表加详细说明。4.1 典型问题速查表问题现象可能原因排查与解决思路验证准确率高但实际部署效果差训练验证集场景重叠按机场或区域重新划分数据集稀有类别召回率极低类别不均衡未处理分层采样加类别加权损失分类器对检测框偏移敏感分类训练缺少抖动增强加入边界框随机抖动增强检测漏检密集停机坪飞机锚框尺寸不匹配按飞机长宽比重设锚框模型混淆窄体与支线机型特征判别力不足提高输入分辨率或补难例样本训练loss震荡不收敛学习率过高或batch过小降学习率、加warmup、增大batch4.2 场景泄漏这个坑必须重点说场景泄漏是遥感任务里最隐蔽的坑。同一片机场的影像往往成批出现如果随机划分训练集和验证集里会有大量视觉上几乎一样的图片验证指标虚高得离谱。我早期就吃过这个亏验证准确率冲到很高结果换一个机场的数据一测直接掉一大截。后来改成按机场划分指标虽然降了但真实可信。判断有没有泄漏有个简单办法看验证集图片能不能在训练集里找到视觉上高度相似的能找到就说明划分有问题。4.3 小目标检测的实操心得遥感飞机目标小检测时容易漏。除了重设锚框还可以提高检测输入分辨率或者用切片推理把大图切成有重叠的小块分别检测再合并。切片推理对密集停机坪效果明显代价是推理变慢。重叠比例设20%左右能避免目标被切断。另外检测后处理里NMS的IoU阈值别设太高飞机密集时高阈值会把相邻飞机合并掉我一般设0.4到0.5之间。4.4 分类难例的挖掘与利用分类器训到后期提升靠的是难例。我会把验证集里分错的样本挑出来看发现大多是远距离小目标、光照极端的样本、或者被遮挡的飞机。针对这些难例一方面补采类似场景数据另一方面在训练时对难例加大采样权重。难例挖掘这个环节做扎实比盲目加数据量有效得多。4.5 部署阶段的性能取舍部署时检测加分类两套模型串行跑延迟是叠加的。如果对实时性要求不高可以接受如果要提速可以把分类模型量化或者用更轻的骨干。另外检测阶段可以先用低分辨率快速筛候选区域再对候选区域用高分辨率精检这种级联思路能省不少算力。我在实际项目里用过这个策略整体吞吐提升明显精度损失很小。5. 从实验到落地的扩展思考这套方案跑通之后往落地走还有几步要想清楚。第一是类别体系的可扩展性型号体系可能会增删分类模型要能方便地增量训练而不动检测器。第二是误检的兜底机制检测器难免把地面上的飞机形状物体比如某些建筑轮廓误判成飞机分类器置信度低时可以设阈值过滤或者加一个非飞机类别做拒识。第三是数据闭环部署后收集误判样本回流标注持续迭代模型这个闭环建起来模型才会越用越准。我在实际项目里最深的一点体会是遥感飞机分类的难点从来不在模型结构而在数据质量和评估可信度。模型换个 backbone 带来的提升往往不如把场景泄漏修掉、把难例补上来得实在。所以如果你正准备做这个方向先把数据划分和标注规范这两件事做扎实再谈模型调优顺序反了会走很多弯路。另外一个小技巧是分类阶段可以尝试把机身长宽比、机翼后掠角这类几何特征作为辅助输入拼进网络对区分外形接近的型号有奇效这个我在几个批次的数据上都验证过值得一试。