矿区的夜班里,最怕的不是黑暗,而是那种看着可见光画面一片灰白、什么细节都丢失的瞬间——扬尘一起,前向摄像头基本等于半瞎;到了下午低角度逆光,对比度被阳光压得死死的,连路沿都看不清。我前几年扎在矿山自动驾驶感知系统里,被这个问题反复折腾,最后真正把整体可靠性拉上去的,恰恰是一套红外感知算法与应用方案。红外波段不依赖外部光源,对粉尘的穿透能力也明显优于可见光,配合视觉和激光雷达,才算是把矿区的全天候感知拼图补齐了。这篇文章就把我从红外相机选型、图像预处理、目标检测网络设计到车载部署、实车测试踩坑的完整经验整理一遍,给正在做矿区无人化运输或类似户外无人驾驶的朋友做个参考。
1. 矿山工况里可见光看不透的那些瞬间——红外感知的不可替代性
1.1 粉尘、夜班、逆光:可见光在矿区的三大失效场景
矿区和普通公路最大的区别在于环境极度“脏乱差”,而且作业时间几乎覆盖全天。先说扬尘:电铲装车、破碎站卸料、重卡在土路上交错行驶,扬起来的粉尘浓度可以瞬间让可见光相机的有效探测距离从标称的百米级掉到几十米甚至十几米。激光雷达在这种环境里也没好到哪去,尘团会产生大量杂散点云,让目标聚类和跟踪变得很不稳定。我们曾在某个石灰石矿做过对比测试:同样的粉尘浓度下,可见光车牌识别距离从80米降到约30米,而红外热像仪仍能稳定分辨出前方车辆的轮廓,有效感知距离能维持在100米以上。
再是夜班。矿区重卡基本24小时运转,夜班往往没有完整的照明系统,靠车灯照明只能覆盖车前三四十米,对于40吨级以上矿卡来说,这个反应距离是不太够用的。可见光在弱光下要么增益拉高导致噪点爆炸,要么靠补光灯但光斑不均匀,远处目标仍然模糊。红外是纯被动热辐射成像,完全不依赖环境光,夜间的人和车因为与环境温差明显,反而更容易被检测到。
最后是逆光。矿区的道路往往穿行在采坑和排土场之间,早上和傍晚太阳角度很低,可见光相机的动态范围再大也容易被强光直射,造成大面积过曝,暗部细节全丢。红外成像不受太阳光强影响,因为它接收的是热辐射而非反射光,所以逆光场景下依然能保持稳定的成像质量。这三大失效场景凑在一起,就决定了矿山自动驾驶的感知系统里,红外不是一个锦上添花的“选配”,而是一个必要的“补盲”组件。
1.2 红外感知的定位:不是替代谁,而是做“温差线索”的补充
很多同行一开始容易误判,觉得有了激光雷达和毫米波,再加红外是不是多余。我一开始也这么想过,后来实测数据告诉我:红外解决的不是“有没有障碍物”的问题,而是“在恶劣环境下能不能稳定发现障碍物”的问题。激光雷达测距精度高、能看到三维几何,但遇到粉尘、雨雾和黑暗时,点云质量会明显下降;毫米波雷达能穿透粉尘雨雾,但横向分辨率很差,很难区分行人和金属反射物;可见光纹理信息丰富,但恰恰在最需要的时候掉链子。
红外的核心价值在于它的物理特性:接收8到14微米波段的辐射,对大气中的气溶胶散射不敏感,所以穿透粉尘的能力比可见光强得多;同时它是被动成像,既不怕逆光也不怕黑夜。但它也有两个短板:一是没有色彩和纹理,无法通过视觉特征识别标识牌、标线这类零温差信息;二是单目红外的测距能力很弱,基本要靠几何先验或者多传感器融合来补充距离。所以在整体感知架构里,我习惯把红外称为“热红外补盲传感器”,它的输出通常不是独立决策,而是作为一个高可靠性的目标假设来源,和激光雷达、毫米波做决策级融合。
2. 热成像数据链路上的算法设计:从非均匀校正到多任务网络
2.1 先解决图像质量问题:NUC、坏元校正与温漂补偿
红外相机拿到的原始数据是探测器像元响应值,不是可以直接丢给深度学习的干净图像。任何一颗非制冷红外探测器的像元之间都存在响应差异,尤其随着工作温度变化,每一帧的响应都会漂移。如果不做校正,图像上会出现固定的“饼干纹”噪声,目标检测模型很容易对着这些固定花纹过拟合。所以算法链路的第一步,一定是非均匀校正,业内俗称NUC(Non-Uniformity Correction)。
最常见的NUC是两点校正加一点温漂补偿:在相机出厂时用两个不同温度的黑体标出每个像元的增益和偏置,之后在使用过程中通过内置快门周期性做平场校正,快门挡在探测器前,获取一个均匀辐射源,实时更新校正参数。我在项目里遇到的坑是,有的相机默认快门校正间隔太长,矿区昼夜温差又大,早上和下午的温漂差异足以导致图像出现明显的明暗条纹。后来我们把快门校正从“定时触发”改成了“温度漂移超过阈值触发”,并且加了开机预热判断——开机后前两三分钟红外噪声偏大,这个时间段如果要启动自动驾驶功能,必须先等机芯温度稳定。
坏元问题也需要单独处理。任何探测器都有少量响应异常的像元,显示出来就是固定亮或固定暗的点。我们在算法流程里加了一个坏元表和动态坏元检测,一旦发现某个像元在连续多帧内响应值超出统计范围,就标记为坏元,用周围邻域的均值插值替代。处理完之后,图像才进入归一化、增强和网络推理环节。这里提醒一句:训练集里的红外图像必须是经过完整校正链路的图像,不能拿“毛坯图”去训练,否则模型学到的特定噪声位置会在新相机上完全失效。
2.2 目标检测与分割:在低对比度热图上认出矿卡、人员和边坡
红外图像的特点可以概括为单通道、低纹理、热对比度不稳定。同样是夏天地表温度接近40度的时候,一个站立人员的体温与背景温差可能只有两三度,在热图上看起来非常“平”,这时候容易漏检。后来我们的做法是,不直接使用普通的8位灰度图训练,而是把原始温度矩阵作为额外通道,和归一化图像一起送进网络。这样网络可以学习到“绝对温差”这个信息,对白天高温场景下的人车检测提升非常明显。
目标检测这部分,我建议直接选择轻量化的单阶段检测器,比如YOLO系列,但要针对红外图做几个改造:一是在数据增强阶段增加随机对比度拉伸,模拟不同环境温度下的热图差异;二是把输入分辨率从常用的640×640降到512×640,因为红外图像边缘纹理本身就不多,过度放大反而引入噪声;三是考虑在骨干网络中加入一个轻量级的注意力模块,让网络更关注温度异常区域。我们在某矿区部署的模型参数量只有不到4兆,但在640×512的热图上跑到了不错的mAP,而且对人员的召回率比训练前提高了十几个百分点。
语义分割部分主要覆盖三类目标:道路边界、边坡/挡墙、可行驶区域。有意思的是,矿区的道路和边坡在热图上往往有温差——日照下土质边坡升温比路面快,夜间又比路面降温快,所以红外分割的效果在很多时候比可见光更稳定。我们采用的方案是共享骨干网络的双分支结构:一个分支做检测框回归,另一个分支做像素级分割,两个任务共享特征提取层,在嵌入式设备上能省下不少算力。分割输出直接给到路径规划模块,作为可行驶区域的软约束,检测框则给到目标跟踪与决策模块。
2.3 时序与多帧:高温目标、运动趋势与误判抑制
红外图像里最容易出现的一类误检,就是高温物体被当成近处障碍物。矿区环境到处都是热源:排气管、发动机舱、刹车鼓,甚至被太阳晒烫的岩石。单帧检测会不断给出“疑似障碍物”,如果不做时序处理,车辆防撞系统会频繁触发误报警,驾驶员根本没法用。我们为此设计了一个基于时序的候选目标置信度管理机制:对每一个检测框,保存它在过去十帧内的检出历史、位置稳定性和温差变化趋势。只有连续多帧检出且位置没有剧烈跳动的目标才会被提升为“有效障碍物”,孤立出现的高温点则直接丢弃。
运动趋势分析在矿区也很实用。比如我们可以从连续热图像序列中计算稀疏光流,判断一个目标是在移动还是静止。行人检测场景中,红外下人的轮廓虽然清晰,但夜间姿态变化大,光流反而能帮助跟踪器稳定关联。另外,我们还在做一个很有意思的方向:通过不同区域温度梯度变化来判断设备异常,比如轴承过热、轮胎发热。这算是红外感知在自动驾驶之外的增值应用,但同一套数据链路基本可以复用。
3. 最容易翻车的四个工程细节:标定、同步、融合与散热
3.1 红外相机与激光雷达/毫米波雷达的联合标定
红外图像没有颜色和纹理,和可见光做特征点匹配非常吃力,传统棋盘格标定板在热图里基本看不清格点。这个坑我踩过。实践中我们用自制的“加热靶标”——在一块铝板上贴若干条加热丝,形成高低温交替的图案,再把整个铝板加热到比环境高20度左右,这样红外图里就能看到清晰的条纹和角点。标定时把靶标放在激光雷达和红外相机的共同视场内,激光雷达点云中的靶标也会因为反射率差异形成点簇,手动或半自动选取对应的角点和点云中心,然后通过最小二乘法求解两个传感器之间的外参。
需要注意,红外相机的镜头通常存在一定的热畸变,尤其在刚开机或环境温度剧烈变化时,内参也会轻微漂移。所以不能只做一次内参标定就不管了,最好每隔几个月或大温差季节交替时重新标定一次。外参标定的结果直接决定了红外检测框能否准确投影到激光雷达坐标系里。我们第一次标定完,投影误差大概在1.5个像素左右,勉强能用;后来又优化了靶标制作和角点提取算法,把误差压到了0.5个像素以内,融合质量明显提升。
3.2 时间同步与触发模式:帧级同步是红线
多传感器融合里最容易被低估的是时间同步。矿区车辆速度虽然不算高,但遇到紧急制动场景,几十毫秒的时间差就相当于几十厘米的位置偏差。如果红外相机和激光雷达各自用本地时钟,不做任何同步,那么运动目标在融合时就会出现“重影”或“错位”,这在矿山这种非结构化环境里是很危险的。
我们的做法是采用硬件触发加时间戳对齐双保险。硬件上,用一根触发电缆连接激光雷达和红外相机,激光雷达每帧扫描开始时输出脉冲信号,触发红外相机曝光,这样两者的采集时刻基本对齐。软件上,所有传感器数据统一打上PTP时间戳,然后以激光雷达的主帧为基准,对红外和毫米波数据做插值或最近邻对齐。实测下来,通过硬件触发后时间戳差能稳定控制在1到2毫秒内,比纯软件同步好了一个数量级。
3.3 决策级融合策略:先各检各的,再按证据合并
在融合策略上,我不太建议一上来就做低层级的像素融合。红外分辨率和激光雷达点云密度差太多,强行融合容易把各种外参误差叠加放大,反而降低可靠性。我更倾向“独立检测、决策级合并”的思路:可见光、红外、激光雷达各自跑自己的检测器,输出目标框或目标点云簇,然后再做一个轻量级的融合模块。
融合模块的逻辑其实不复杂:先根据外参把红外检测框投影到激光雷达坐标系下,再计算它与点云聚类结果或其它传感器检测结果之间的交并比和距离;如果两个传感器都认为这是障碍物,则综合置信度提升;如果只有红外检出,而激光雷达在该区域点云稀疏,则保留该目标但标记为“低置信度目标”,交给后续跟踪器继续确认;反过来,如果红外检出一个高温区域而激光雷达确认那里只是平坦地面,则把这个检测框直接抑制掉。这种设计让整个感知系统不会因为某一个传感器在特定环境下的失效而整体崩溃。
3.4 车载环境下的红外相机散热与窗片污染
红外相机最怕的不是冷,而是热。探测器自身温度升高会产生更大的噪声,严重时图像上会出现明显噪点,甚至导致温度测量失准。在矿区,驾驶室顶上放一个红外相机,夏天暴晒后外壳温度能超过60度,如果相机没有主动散热,图像质量会明显劣化。我们早期的方案是给相机加遮阳罩加风扇,效果一般;后来改成在相机外壳与安装支架之间加导热垫,把热量传导到车顶铝制支架上,同时风冷风扇改为温控调速,机芯温度基本稳定在45度以下,图像质量才算稳定下来。
窗片污染这个问题更隐蔽。矿区的灰尘、油污、泥浆会附着在红外相机前方的保护窗片上,导致透过率下降,图像变模糊。由于红外是热成像,光靠图像增强很难弥补。我们最终在窗片附近加装了一个气嘴,定期用压缩空气吹扫,同时结合图像质量评估算法——如果整个图像的梯度能量持续低于某个阈值,就自动触发清洁并上报给运维系统。这个功能救了我们很多次,因为在矿区的土路上跑一天,窗片上的泥点真的会多到让你怀疑人生。
4. 一套可落地的红外感知应用方案:硬件选型、算力分配与系统架构
4.1 传感器选型参考:分辨率、帧率、测温范围怎么挑
我不是卖相机的,但可以把项目里选型的心得列出来供参考。首先要选探测器类型:非制冷氧化钒微测辐射热计是主流,性价比高,不需要制冷机,适合车载。分辨率上,建议至少640×512,这个分辨率能在三四十米外认出人的轮廓,如果预算有限也可以先上384×288,但检测距离会明显缩短。帧率选25或30帧就够了,矿区目标运动速度相对不快,60帧意义不大,反而增加数据带宽和算力消耗。
测温范围方面,矿区自动驾驶不需要超过150度的高温档,选-20到+150度即可。反而要注意的是测温精度,如果需要做人车识别,不需要绝对温度多准,但相对温差一定要稳定,否则同一目标在不同环境温度下在热图上表现差异很大。镜头视场角建议前视选90度左右,兼顾两侧行人检测,如果只做远距离前向感知,60度更合适。防护等级一定要IP67以上,接头用航空插头,否则矿区的灰尘和冲洗设备用的高压水枪会教你做人。
4.2 算法模型在车载嵌入式平台的部署与加速
红外模型本身不大,但和前视摄像头、激光雷达的点云处理算法放在同一块域控制器上,算力分配就很关键。我们使用的域控制器有一块约200TOPS的车载AI芯片,方案是给红外检测模型分配一条独立的推理流水线,与激光雷达点云处理并行的同时,共享内存队列做数据交换。模型经过INT8量化后,单帧推理耗时大约12毫秒,加上图像预处理和NUC校正,端到端延迟控制在60毫秒以内,完全满足矿卡50公里/小时下的反应距离要求。
部署时需要注意几个细节:一是GStreamer这种图像数据链路要尽量避免CPU拷贝,最好用零拷贝直接送到GPU或NPU的显存;二是红外图像预处理里的坏元校正、直方图均衡,尽量放到硬件加速器上做,否则CPU会被拉满;三是模型推理线程必须实时监测帧间隔,一旦发现连续几帧超时,就要上报感知异常,而不是让自动驾驶系统在“蒙眼”状态下继续跑。
4.3 从感知输出到车辆控制的接口与安全冗余设计
感知算法最后要进入车辆控制,必须定义一套清晰的接口。我们采用目标列表加栅格地图双通道的方式:目标列表包括分类、置信度、位置、速度、温度特征等字段,以UDP组播方式发布到决策模块;同时把语义分割结果投影到二维栅格地图,给出可行驶区域和危险区域,供规划模块做局部路径调整。这里特别强调,红外感知结果不应直接、单独触发紧急制动,它更适合作为一个“增强信号”参与仲裁,否则高温排气筒这类非障碍目标会引起频繁刹车。
安全冗余方面,我们设计了三个层次的异常监控:第一层监控相机本身,包括机芯温度、快门校正状态、图像亮度方差;第二层监控算法输出,包括检测框数量是否异常、帧率是否稳定;第三层监控融合结果,如果红外与激光雷达的检测一致性长期为零,则判定其中一个传感器故障并自动降级。这套机制让整个感知系统的故障检出率和高可用性提升了不少,也是我认为比“模型多准”更重要的存量工作。
5. 实测复盘:我在矿区测试中踩过的那些坑
5.1 夏季午后热浪引起的远距离误检
第一次上矿区路试,正值夏天午后两点,红外画面里出现了一个持续晃动的“障碍物”,位置在道路尽头大约150米外。可见光和激光雷达都确认那里空无一物,但红外检测器却固执地给出一个目标框。后来排查发现,这是地面受热后产生的热浪,导致热图像远处背景像水面一样扭曲,局部区域温度梯度异常被网络识别成目标了。
解决办法分两步:一是在训练数据中加入大量真实采集的热浪扰动样本,让网络学到这种场景应当输出“背景”;二是在时序模块里增加一个“高频闪烁抑制”,因为热浪引起的目标框往往逐帧闪烁或位置跳动,而真实障碍物位置连续稳定。这套组合在后续的测试里基本把热浪误检率降到接近零。
5.2 排气管高温区域遮挡了真实障碍物
还有一次夜间测试,红外明明在前方检出了一个高温目标,位置恰好是前车排气管的位置,但激光雷达点云显示该区域有一个较矮的物体,而可见光图像里什么也看不清。决策模块差点把那个目标当成障碍物触发绕行。事后分析,红外检测到的确实是前车排气管的高温区域,但那个区域的几何尺寸比真实车辆小很多,且温度特征过于突出,单靠红外无法判断这是一个刚性物体还是热气流。
我们的处理方式是在融合模块增加一层“高温区域验证”:如果红外检出的目标中心对应激光雷达点云数量很少,且目标尺寸明显小于车辆物理尺寸,则将其标记为“疑似热源”而不是“障碍物”,只有该热源持续存在且伴随一定空间占位时,才升级为障碍物。这一招对矿区这种热源密集的场景特别管用。
5.3 低对比度条件下人员和背景融为一体
矿区的冬天日照充足,但因为背景温度低,人体温度反而很高,红外下人形很亮,很容易检测。真正难的是夏天傍晚,环境温度接近人体温度,红外图像里的人形对比度非常低,几乎融入到背景里。我们经历过一次,人员在车辆侧面3米处,红外检测模型连续十几帧没有检出,好在激光雷达点云抓住了人形轮廓,系统预警并停车了。
这个案例让我意识到,红外感知不能只依赖单帧对比度,要充分利用时间维度的差分。人在移动时,热图像对应区域的温度和背景会不断变化,通过帧间差分可以把静态背景消除,凸显出运动目标。后来我们在预处理流程里增加了轻量的帧间差分并行分支,把这个差分图像同时送入检测网络,人形以及其它运动目标的召回率提升明显,尤其是在低对比度场景下。
6. 这套红外感知方案往后还能怎么扩展
红外感知的价值在矿区验证扎实后,其实可以向更多方向延伸。比如电动化矿卡换电、充电站的温度安全监控,完全可以用同一套红外感知算法检测电池舱异常发热;矿区的传送带、破碎机等固定设备,也可以用红外热像进行预测性维护,温度曲线的异常往往是故障的早期信号。这些不需要重新开发感知栈,只要把现有红外数据流和算法框架迁移过去,就能实现。
另一个值得研究的方向是红外与毫米波雷达的深度融合。毫米波对金属目标敏感,红外对温差目标敏感,两者都不受光照影响,组合在一起可以做全天候的“热-毫米波”感知,尤其适合夜间的行人和非机动车检测。我们目前在矿区边缘测试中已经做了一些早期验证,误报率和漏报率比单传感器都有明显下降。
最后想说的是,红外感知在矿山自动驾驶里的关键不在于堆多贵的硬件,也不在于追多新的网络结构,而在于把成像链路上的每一个细节都做扎实:校正、标定、同步、散热、时序滤波。我踩过的坑,基本都是那些看起来不起眼、但却能导致系统失效的工程细节。如果你正在做类似的全天候感知方案,建议在项目一开始就把这些工程约束纳入设计里,而不是等测试时再回头补课。