1. 先从需求说起无人机“看到”火灾难在我们以为的那些点做了大半年无人机烟火识别的项目最大的感受是真正难的从来不是模型跑得有多快而是训练数据能不能真实覆盖无人机在巡检时的实际视角。手头这个项目——无人机航拍火灾烟雾识别数据集编号10443期就是专门解决这个问题的。它做的是森林防火巡检、工业厂区安全预警里最刚需的一件事让无人机在空中直接判断地面有没有烟火危险而且是自动识别不是飞手盯着屏幕找人眼去看。森林防火和厂区安防不一样无人机飞在高处看到的是俯视视角下的林冠、厂房屋顶、烟囱、储罐区。地面上摄像头看到的烟雾是侧视的轮廓清晰、背景单纯无人机看到的是俯视甚至倾斜视角烟雾从树冠缝隙里冒出来或者在厂区建筑背后飘散太阳底下和云影里的烟几乎一样。普通监控数据集训练出来的模型换个视角基本就废了。所以我们当时的想法也很明确要做一个专门面向无人机航拍场景的烟火识别数据集用来做森林防火巡检、工业厂区安全预警这类任务让模型真正见过“空中视角下的烟和火”。这套数据适用的场景很明确森林火灾巡检重点看林区冒烟点、明火区域、工业厂区安全预警看厂区里的异常烟雾、火焰尤其是危化品仓储区和生产装置区、安防监控的延伸场景比如秸秆焚烧监控、景区防火、输电线路周边山火隐患巡查。适合谁来用正在做无人机烟火识别算法训练的开发者、做森林防火信息化项目的团队、需要给自有巡检无人机配识别能力的安防集成商以及想用现成数据快速验证模型效果的学生和研究组。数据集的价值在于省掉最耗时最枯燥的数据采集和标注环节拿到手可以直接进训练流程。2. 数据集怎么设计才能扛住真实巡检场景2.1 为什么说“空地两重天”航拍视角和监控摄像头视角根本不是一个世界先聊一个很多新手容易踩的问题。地面固定摄像头识别烟火现在开源数据集不少模型也成熟。但搬到无人机上事情完全变了样。我随便举几个区别地面摄像头位置固定画面背景长时间不变烟雾出现就是一个明显的“新物体”无人机在移动画面里的地物本身就在不断变化树冠在晃、车在跑、云影在移、水面在反光烟雾混在里面非常容易被当成背景变化或者漏掉。无人机飞行高度从几十米到几百米同样一股烟在100米高度看是明显的一团到了300米高度可能就只有几个像素的大小地面摄像头的视角是平的烟雾侧面受光轮廓清晰无人机俯视时看到的是烟雾从某个点源上升扩散的样子边缘是絮状的、半透明的和地物纹理叠在一起极其考验模型对小目标和半透明目标的感知能力。这些差异决定了训练数据必须来自真实航拍视角而且要有高度的层次。我做这个数据集的时候前期心里是没底的。市面上能找到的烟火数据大多是地面视角航拍数据零散不成体系要自己飞着拍成本又高。后来我们下定决心通过多种渠道收集和整理其中有一部分是团队自采一部分来自公开的灾害应急影像记录还有一部分通过仿真合成方式补充极端场景——所谓合成不是简单贴图而是把真实烟雾素材按物理扩散规律叠加到真实航拍底图上保留光照方向和相对尺度关系。这样凑出来的样本才勉强覆盖了实际巡检要面对的多数情况。你可以理解成地面视角的数据像是站在路边看冒烟的楼航拍视角的数据像是飞在天上看整个林区哪里不对劲两者训练的模型各有用途互相替代不了。2.2 五个维度锁定数据边界在整理这套10443期数据时我给自己定了一个原则宁可样本量做得扎实一点也不要为了凑数量把大量简单场景堆进去。数据覆盖了五个关键维度场景类型森林山地、草原、农田、工业厂区、城郊结合部五大类其中工业厂区细分为储罐区、生产车间、露天堆场三个子类森林场景覆盖密林、疏林、防火隔离带。光照条件上午顺光、中午顶光、傍晚逆光、阴天散射光、雾霾天每一类都保留了一定比例。烟雾识别对光照极其敏感尤其是逆光下的白烟和人眼看到的情况一样模型也容易把高光区域误判成烟。烟的类型白烟、灰烟、黑烟按燃烧物类型和含水率区分。森林燃烧初期多为白烟和水汽混合体石化厂火灾多为黑烟秸秆焚烧多为灰白烟。不同类型烟气在航拍影像里的纹理和透明度差异很大必须分开覆盖。目标尺度用分辨率占比来衡量最小目标烟雾面积仅占整幅画面约0.5%对应400米高度下的小规模初发烟点最大目标占画面30%以上对应近距离大范围火场烟柱。这样做是为了让模型在低空精细巡查和高空广域扫描两种模式之间都能工作。干扰物这一步对实际部署最致命。数据里刻意保留了大量“长得像烟但不是烟”的东西——地面扬尘、水雾、云影、工厂正常排放的白色蒸汽、农田灌溉的水汽、冬季的炊烟。为了让模型不至于草木皆兵干扰样本和真实烟火样本的比例大概在1比3左右实践证明这个比例非常关键。2.3 数据量构成与划分逻辑这套数据按期来编号10443期这套总共包含图像样本12000多张经过清洗和去重之后有效样本10800张。标注之后按照任务类型划分出训练集、验证集和测试集比例大致是7:2:1。有一点我特别强调划分时不是随机切分而是按场景和时间来源做分组切分确保同一场景的连续帧只出现在同一个集合里。如果直接随机切分你看起来测试集表现很好其实里面大量图片和训练集出自同一段视频序列模型等于“开卷考试”到了新场景马上露馅。标注格式上同时输出了XML和TXT两种格式分别兼容VOC系列检测框架和YOLO系列检测框架后面转成COCO格式也就一两条命令的事。类别体系按目标危险性分了三个类别smoke烟雾、fire明火、smoke_fire烟伴生火。为什么不把火焰单独列一个fire类就完事因为实际巡检里绝大多数初发火灾先看到的是烟等看到明火往往已经烧成规模了。森林防火真正要抓的是“烟早识别”所以烟雾是核心类别明火是辅助确认类别烟伴生火是模型需要重点输出预警的复合状态。3. 数据标注这个过程比想象中更容易翻车3.1 标注规范怎么定边界、遮挡、半透明怎么处理数据集的可用性一半取决于采集一半取决于标注质量。我之前接过一个别人的烟火数据集模型怎么调都差一口气最后发现是标注框画得乱七八糟有的框只框住了浓烟的中心淡烟边缘全部没算进去有的把整片云影也框进去了有的框画了一个巨大的矩形把周围的山体树木全包进去。老实说如果标注不规范后续做任何训练都是在垃圾数据上做文章不可能有好结果。所以10443期数据的标注规范我们在开工前就定得非常死。核心规定三条第一目标框必须紧贴烟雾或火焰的视觉最外边界淡烟边缘哪怕只有一点点能看出轮廓的也要算进框里宁可框大一点不能框小了漏掉边缘特征第二半透明烟雾透过背景纹理依然可辨识的判定为烟雾目标标注框覆盖烟雾主体区域但框内允许存在背景纹理穿透第三多簇烟雾相互连接时按烟雾源点拆分标注不能一个大框包住所有烟源保证模型能区分不同起火点。第四对于距离远、像素极小、肉眼判断困难的烟雾目标统一标注为“疑似烟雾”类别训练时保留评估时单独统计。这些规则听起来简单执行起来全靠质检流程兜底。每个标注人员完成任务后会由另一名质检员做全量复核争议样本打个标记放到讨论池里集体裁决。碰到最极端的情况比如目标只有七八个像素、无法判断到底是烟还是石头反光就按干扰物处理宁可不标也不能错标——错标对模型的误导远大于漏标。3.2 烟雾类目标标注的麻烦比你想的多一倍如果只标“fire”和“smoke”两种工作会轻松很多但落地效果一定不好。森林防火巡检的场景下烟雾在不同阶段的形态差异巨大。初发烟是淡淡的、一缕一缕的风向一变就散持续燃烧阶段的烟是浓密的、有明确上升柱体的火场发展到后期烟层铺开高度降低像一层雾一样贴着地表蔓延。这三种形态全叫“smoke”模型会学得非常痛苦。所以标注规范里我又加了一层细分在属性标记上把烟雾分为“浓烟”“淡烟”“扩散烟”三类。浓烟指视觉不透明、边缘清晰的烟柱或烟团淡烟指半透明、轮廓模糊、背景可穿透的烟扩散烟指贴地面或沿山谷铺开的低层烟层。这三个子类和烈火状态直接关联淡烟通常是燃烧初期或者阴燃阶段扩散烟往往意味着火已经过了一段时间浓烟则是正在剧烈燃烧。模型在预测时输出烟类别之外还带一个属性判断预警系统收到告警时能直接看到“疑似初期阴燃烟”还是“持续性浓烟”这对现场指挥的响应策略制定非常有用。说个实操中翻过车的地方。最开始我们图省事用了通用目标检测数据集的标注工具直接开干结果发现烟雾这种边缘模糊的目标根本没法画得准。后来换成了支持多边形标注和半透明叠加显示的工具标注员可以随时切换影像增强模式把烟从背景里“提”出来再画框标注质量明显上来了。顺带说一句标注阶段屏幕亮度统一调到一个固定值不要有的工位屏幕调得很亮有的调得很暗同一张图标注出来的框位置和大小会明显漂移。3.3 数据清洗那些没上场的图片其实救了模型一命原始素材12000多张有效入库10800张剩下将近1200张去哪了全部被清洗掉了。清洗规则有三条过度模糊的剔掉分辨率低于640的剔掉场景重复度超过阈值的按批次抽稀。最容易被忽略的是第三条。无人机巡检的原始视频一录就是十几分钟按帧抽图之后同一个火场可能出现几十上百张高度相似的图片。如果不做抽稀训练集里同一个场景的相似样本占了过大权重模型对这个场景“背得滚瓜烂熟”换个场景就抓瞎。另外凡是画面里同时出现超过5个烟火目标的极端画面单独归入“密集场景”子目录不做随机抽样而是作为独立训练批次使用防止模型在大规模火场中反而不会检测。还有一个特别容易被忽略的清洗项航拍影像的时间戳和地理位置水印。有些原始素材录屏自带OSD信息画面角落有日期、坐标、高度、电量之类的字符模型会把这些字符区域当成“特征”训练出来的模型跑到没水印的部署环境里精度断崖式下跌。我们的处理方式是把所有带水印的图像统一裁剪掉边缘区域或者用邻近像素做修补确保进训练集的数据是干净的。4. 模型选型与训练参数实测记录4.1 选模型这事别一上来就追着大模型跑数据准备好了模型选型是个绕不开的话题。不少刚接触这个领域的朋友一上来就问“你是不是用的某某最新大模型”真不是。烟火识别这种任务部署环境往往是机载边缘计算盒子或者地面站的小型GPU服务器算力、功耗、内存都有限。你可以在离线服务器上用大模型做实验刷精度但最后真正上无人机的模型还是要落地到推理速度和模型体积的现实约束里。我们的对比实验横跨了YOLO系列几个版本包括较新的通用检测框架变体和RT-DETR系列。最终在10443期数据上做训练和验证综合精度和推理速度双阶段模型在极小目标上的召回率确实比单阶段好一点但推理速度撑不住巡检场景实时处理的需求单阶段模型在速度和精度之间最均衡。同类规格下我自己测试的结论是这样的训练出来的模型权重体积控制在30MB以内在机载NPU设备上推理速度做到20毫秒到40毫秒一帧这个水平对于无人机巡检完全够用——正常巡检巡航速度下视频流每秒25帧模型只要不丢掉关键时刻的判断短时间的延迟完全能接受。这里插一句理论基础。为什么双阶段模型在小目标上有优势因为它第一步先产生候选区域第二步再在候选区域里做精细分类和回归等于先粗筛一遍“哪里可能有目标”再放大去看小目标不容易在第一轮筛选就被丢掉。而单阶段模型一步到位速度虽快天然对小目标更不友好。所以我们在数据里做了大量小目标样本的补充增强反过来弥补单阶段模型的短板。你要是时间充裕、算力管够也可以试试用双阶段模型先跑一轮然后把它的一些高置信度检测结果作为伪标签辅助单阶段模型做蒸馏训练这是进阶玩法我后面有机会单独写。4.2 训练策略重点不是调参是数据喂法同样的数据喂给同一个模型不同人训练出来的效果可以差很多。核心差别在几个点上。第一输入分辨率。我实测过输入分辨率从640提升到1280模型在极小目标上的召回率提升非常明显提升幅度大概是20%左右但训练时间也翻了将近三倍。对于10443期这种以中远景和小目标为主的数据最终定在960这个折中档位。如果你部署设备算力确实紧张800左右也可接受再低就建议在算法里加一个针对远距离目标的放大检测分支了。第二Mosaic增强和复制粘贴增强配合使用。烟火目标往往是稀疏的大目标一张图里可能就一两团烟模型很容易陷入“每个图就看那么一小块”的过拟合。复制粘贴增强是把不同图里的烟火目标随机“粘贴”到另一张图中让模型在多重尺寸和背景下反复见这些东西。我们做了消融实验加了复制粘贴增强后测试集上的mAP50提升了约6个百分点这个提升幅度在自采数据集上不算小。第三正负样本比例。训练时从每张图里采样正样本和负样本烟火目标天然稀少负样本的Anchor数量远远多于正样本。通过控制正负样本损失权重让模型把注意力集中到预测置信度在0.3到0.6之间的模糊样本上而不是花大量算力在0.01置信度的背景框上。这一步对误报率的控制很关键它决定了模型在“这团是烟还是阴影”的模糊二选一里到底偏向哪个方向。第四多尺度训练。每隔几个迭代批次随机切换输入尺寸让模型见惯不同尺度下的目标形态。这对航拍场景尤其重要——飞机高度从80米爬到200米同一个烟柱在画面里大小完全不一样模型如果只在固定尺度训练高度一变化就抓瞎。4.3 效果验证不是看mAP一个数只看一个mAP指标是不够的。10443期数据的测试集包含多个典型巡检场景我做了详细的分类评估。森林场景、工业厂区场景分开算指标为什么因为这两个场景的难点完全不同。森林场景的难点是背景杂乱树冠纹理和烟雾的边缘混在一起而且太阳透过树叶产生的大量高光斑块特别容易被误判成烟工业厂区场景的难点是人工结构的直线边缘和蒸汽排放干扰烟囱排汽、冷却塔白汽、堆场扬尘都是天然的“假烟火”。从实测来看在森林场景测试子集上烟雾类别的mAP50做到接近86%mAP50-95大概在71%左右而明火类别的mAP50因为火焰形态更完整可以做到92%以上。工业厂区子集上烟雾的mAP50略低一些大概在82%——原因就是蒸汽干扰多。这个差异本身就是有价值的信息厂区部署时一定要叠加额外的逻辑判断比如烟源位置是否在厂区限定区域内、烟雾运动方向是否持续、前后帧之间烟雾面积是否在增长用业务规则把一部分误报滤掉。再补充一组容易忽略的数据夜间场景的测试准确率显著低于白天主要是因为绝大多数样本是白天采集夜间火光数据量不够。后面我们专门用红外成像或者低照度增强的样本做了补充训练夜间表现才慢慢拉起来。你如果准备自己复现务必注意这一点。5. 真实场景部署最头疼的四个问题5.1 误报重灾区不是火的“烟”比真正的烟多实际巡检过程中模型在野外跑起来之后最先暴露的问题永远是误报。我的现场记录里误报排名前四的来源分别是晨昏时段地面雾气、山谷顺光下的扬尘、化工厂正常排放的白汽、以及大型养殖场或垃圾填埋场的发酵水汽。最夸张的一次模型把连续好几帧的云影误报成森林火灾预警SDK输出的置信度甚至到了0.75以上。解这个问题的思路不是把阈值提上去——提高阈值虽然能压误报但真实的小目标和淡烟也一并被压掉了。更合理的方案是做时间序列的后处理。单帧检测结果只作为证据不直接触发预警连续多帧检测到同一个位置区域的目标并且置信度稳定或者上升才判定为有效预警。这个方案在实测里把误报率压低了差不多60%而且对真实火灾的识别几乎没有影响——火灾烟雾一旦出现形态通常不会在几秒内消失。5.2 小目标检测为什么这么难从有效感受野说起森林巡检场景里很多烟火目标在画面里就二三十个像素大小。模型在高层特征图上做预测时每个位置的特征实际上对应原图一片很大的区域目标太小特征图里能分给它的信息就那几个像素的值一旦被周围背景“淹没”就检不出来。在训练的时候我们在高分辨率特征图对应的检测层上额外增加了权重让模型更早地“看到”小尺寸目标的信息。同时在倍率放大的低层特征图后面追加了一个轻量级的特征融合模块把底层细节信息向上传递和高层语义信息做融合。这套组合拳在数据上测出来的结果是12像素到24像素大小的目标召回率提升了约15个百分点。还有一个训练技巧叫“小目标复制粘贴增强”原理很简单从训练集中挑出那些尺寸在20像素以下的真实烟火目标复制三到五份随机粘贴到其他图像的合适区域——比如林间空地、山脊线附近、厂房屋顶边缘——然后微调标注框。这样相当于在不动原始数据分布的前提下把极小目标样本的占比翻了一倍多。早期我踩过坑直接把小目标放大之后再贴效果反而差因为放大会改变纹理细节的频域特征模型学到的是“模糊的大烟”不是真正的小烟。5.3 飞行动态模糊问题旋翼震动和运动拖影无人机不是静止的监控杆。飞行姿态持续变化画面里既有飞机自身运动产生的整体位移也有旋翼震动造成的高频抖动还有曝光时间偏长时的运动拖影。烟火目标本身边缘模糊一旦再叠加上运动模糊人眼都看不清的图模型自然会漏。这个问题的处理方式有两个层面一是在训练数据里引入动态模糊增强用随机运动模糊核处理部分清晰样本模拟巡航中拍到的拖影效果二是在部署端调整拍摄策略悬停检测模式下把曝光时间调短宁可提高ISO牺牲一点画质也要保证边缘锐度足够让模型判断。这两个手段数据层面和硬件层面双管齐下实测动态场景的漏检率降了不少。5.4 光照突变这个隐藏陷阱无人机转向时太阳角度在画面里的变化非常剧烈。上一帧还是顺光下一帧整个视野都是逆光烟雾在逆光下几乎变成透明的。还有水面反射、镜面反射都可能在画面局部产生高亮区域模型极容易把高亮误判成明火。处理光照突变时的对策是训练数据里把逆光的比例加大到15%以上同时在预处理阶段做一些直方图均衡和光照归一化。模型部署时的预处理环节和训练时保持一致这一点在做模型转换的时候特别容易被忽略——训练时用了归一化部署代码里漏掉性能掉好几个点。5.5 常见问题快速对照表现象可能原因处理方向晴天把云影报成烟干扰样本比例不足补充云影、地形阴影样本夜间漏检严重可见光样本过曝/欠曝增加红外或低照度增强样本低空效果好、高空全漏训练样本尺度覆盖不够增加高空大视野样本比例厂区蒸汽频繁误报白色半透明目标特征混淆单独做蒸汽负样本集转弯时误报率飙升运动模糊和光照突变导致部署端调整曝光策略模型跑在边缘设备上速度慢模型体积大、算力吃紧蒸馏、剪枝、量化三板斧6. 几件实测下来最有用的“小事情”最后分享几个这套数据集用下来个人觉得最值得注意的点。一个是关于数据集的“期号”。它的编号是10443期我理解这是该系列数据集某一时期整理发布的版本。这种系列化命名意味着后续大概率会继续迭代更新所以拿来跑模型做预研是够用的但一旦你的业务进入相对稳定的运行阶段我还是建议在自有场景里做增量采集和补充标注哪怕一个季度补几百张有针对性的样本模型的长期表现都远比“一口吃成胖子”的数据策略要稳得多。另一个是数据集不可替代的一个作用——作为模型回归测试的基准集。每次算法迭代、网络结构调整就把这套数据里的固定评测子集跑一遍看关键指标有没有劣化。这套数据场景覆盖宽、干扰物足、标注规范做基准非常合适。我到现在每次改动预处理逻辑或者数据增强策略都会拿出其中的评测子集先跑一轮确认没回退再上新场景训练。它等于是我们的“烟火识别回归测试金标准”这个用法可能比单纯拿去做首轮训练还有价值。第三个点也是我反复跟团队强调的模型输出永远只是一个信号不要把它当结论。航线巡检的完整闭环应该是“检测到疑似目标、锁定坐标、变焦确认、拍照存档、推送给值班员复核”。只有把模型和“人审”这个环节配合好整条链路才真正稳定可靠。这套数据集训练出的模型帮我们把这个闭环的前面几步跑通了最后面那一步靠的是流程设计和人员响应但这已经是另一篇文章的话题了。数据、模型、部署、回归验证一圈走下来感触最深的是这个领域没有什么一步到位的银弹每一个环节抠细一点最后的效果就扎实一分。希望这篇实践记录对正在做无人机安防识别、森林防火巡检相关项目的朋友有帮助。