资讯动态

红外弱小目标检测:从单帧到序列的算法与工程避坑指南

发布时间:2026/10/20 1:16:40 来源:尧图企业网站定制
简介红外弱小目标检测是IRST系统的关键技术这份综述文档系统梳理了现有检测方法按单帧型与多帧型两大类展开单帧型细分为局部信息类与非局部信息类多帧型细分为关联校验类与直接求取类并分别介绍了背景估计、形态学、局部对比度、卡尔曼滤波、图像差分等典型技术。文档还针对目标亮度弱、尺寸小、缺乏纹理以及复杂背景下虚警等难点进行剖析并结合真实红外图像分析目标与背景的灰度分布差异涵盖国内外研究现状及算法优缺点对比有助于读者快速建立红外弱小目标检测的知识框架为算法选型与深入研究提供参考。资源为542KB的docx文档共1份文件编排完整、层次清晰。目前已有826人学习下载适合从事红外图像处理、目标检测及相关方向的学生、研究人员和工程师阅读。1. 红外弱小目标检测为什么说它“难”在只有几个像素红外弱小目标检测说白了就是在单帧或序列图像里找到那些只占几个像素、亮度只比背景高一点点、甚至被噪声淹没的运动目标。它不像普通目标检测那样有一张“脸”或一个“轮廓”可以依赖很多时候你盯着一张 640×512 的红外图目标就是 3×3 的一个亮点信杂比可能只有 23 dB。我最早接触这个方向是在一个红外搜跟模拟项目里第一版算法把阈值调低一点虚警多到没法看调高一点目标直接丢了。后来翻了不少综述才算把“弱小”这两个字拆清楚弱是强度弱小是尺度小这两点决定了它不能套用可见光检测那套特征工程。这篇笔记就顺着综述里的方法脉络把单帧、序列、深度学习和踩坑点串一遍适合正要入场的算法工程师和做红外产品的同学。2. 先立住判定标准目标定义、评价指标与数据来源做红外弱小目标检测之前如果连“弱小”的量化边界都没对齐后面所有实验都是各说各话。我在模拟项目X里踩过最深的坑就是两个人拿着不同标准的标注训练出来的模型在迁移时直接失效。所以这一章先把判定、指标和数据来源这三块地基打好。2.1 弱小目标到底多小像素尺寸与信杂比的量化门槛红外弱小目标并没有一个全球统一的尺寸标准但业内常用两个维度来圈定目标在图像中占据的像素数以及目标与局部背景的对比度。常见定义是目标尺寸小于整幅图像像素数的 0.15%对于 640×512 的图像也就是说目标面积大约在 9×9 到 15×15 以内。更严格的说法是总像素不超过 80 到 100 个且没有明显的纹理和形状信息只有模糊的斑点。第二个关键指标是信杂比SCRSignal-to-Clutter Ratio有时也叫信噪比。它衡量的是目标强度相对于背景起伏的显著性。计算公式常见为 SCR (μ_t - μ_b) / σ_b其中 μ_t 是目标邻域灰度均值μ_b 是背景邻域灰度均值σ_b 是背景邻域标准差。通常认为 SCR 小于 5 的目标才有检测难度小于 3 就属于极弱目标。只看像素尺寸不看 SCR 会误判检测难易我曾经用手工阈值法处理一个 12×12 的大目标因为 SCR 只有 1.8照样漏检。评价一个算法是否“能把弱目标提出来”不能只靠肉眼下面给出一个计算 SCR 的最小代码参考。注意这个代码里的窗口大小和目标尺寸相关窗口太大会把背景起伏算进去窗口太小会丢掉目标能量。import numpy as np def calc_scr(img, target_mask, bg_win15): 计算整图中目标区域与局部背景的信杂比 img: 单通道灰度图float32 target_mask: 二值标注目标区域为1 bg_win: 背景窗口半径一般不小于目标尺寸的3倍 target_pixels img[target_mask 0] mu_t target_pixels.mean() # 背景区域以目标为中心扩展窗口去掉目标本身 h, w img.shape ys, xs np.where(target_mask 0) cy, cx int(ys.mean()), int(xs.mean()) y0, y1 max(0, cy - bg_win), min(h, cy bg_win 1) x0, x1 max(0, cx - bg_win), min(w, cx bg_win 1) bg_region img[y0:y1, x0:x1].astype(np.float32) # 去掉目标区域 bg_mask target_mask[y0:y1, x0:x1] 0 bg_vals bg_region[bg_mask] mu_b bg_vals.mean() sigma_b bg_vals.std() if sigma_b 1e-6: sigma_b 1e-6 scr (mu_t - mu_b) / sigma_b return scr, mu_t, mu_b, sigma_b这段代码的逻辑很直白先取目标像素质心和灰度均值再取目标周围一个方形背景窗口的背景均值和标准差最后算比值。参数 bg_win 是关键一般建议是目标尺寸的 35 倍。如果目标只有 4 像素窗口半径 15 太大会把远处的高亮边缘带入SCR 被压低如果窗口半径 7背景统计不充分SCR 又虚高。实际工程中可以用多个窗口大小分别计算取稳定值或者用环形背景区域避免目标能量泄漏。SCR 的计算是后续算法评估的基线它比单纯检测率更能体现“弱”的程度。2.2 检测率、虚警率与ROC指标怎么选才不误导红外弱小目标检测最常用的评价指标是检测率Probability of DetectionPD和虚警率Probability of False AlarmPFA两者往往组成 ROC 曲线来展示算法在不同阈值下的表现。检测率是正确检测出的目标数量占真实目标总数的比例虚警率是错误判为目标的数量占总像素数或者总帧数的比例。注意这里“虚警率”有两种口径按像素算和按帧算结果差异很大论文里如果不写明对比就没有意义。我用过一个错误的口径把虚警率定义成“每帧虚警点数”结果对比别人论文里的“每百万像素虚警数”时数字完全对不上。建议在实验记录里统一写成“每帧平均虚警数”和“每百万像素虚警数”两个值前者看工程体验后者看学术可比性。ROC 曲线则是把检测器输出 score 图从高到低扫一遍每个阈值得到一对 PD 和 PFA画成曲线。曲线下面积更大代表算法在“少虚警”和“多检测”之间的平衡能力更强。除了 PD/PFA还有一个容易被忽略的指标叫“检测精度”也就是目标定位误差。弱小目标通常只要求中心点距离在 12 个像素内就算命中但有些任务需要精确到亚像素比如红外搜跟里的脱靶量。如果算法只给出一堆高亮点中心而没有亚像素插值后续跟踪的角速度曲线会剧烈抖动。因此我在评估时把“命中率1像素内”与“中心偏移均值”也列入必测项。2.3 公开数据集与仿真生成没有数据时的务实方案红外弱小目标检测的数据获取是公认的难题。真实外场数据成本高且目标与背景组合有限所以综述里几乎所有方法都在公开数据集和仿真数据上验证。公开数据集常见的有含空中弱小目标的红外图像序列、含海天背景的红外视频等但很多数据集分辨率低、目标种类单一直接用会带来域偏差。仿真生成是更可控的方案可以自由设定目标尺寸、速度、信杂比和背景类型。我做仿真数据时最常用的做法是拿一张真实红外背景图不含目标把目标模型通过点扩散函数卷积后叠加进去加上高斯噪声和固定模式噪声。目标强度按期望 SCR 反推公式是 target_gain SCR * sigma_b mu_b - mu_background。这样生成的数据既有真实背景纹理又能精确控制信杂比梯度。需要注意的是仿真数据训练出的模型在真实数据上通常有性能掉点所以仿真只适合做算法筛选和预训练最终评估还要回到少量真实标注序列上。3. 单帧检测方法从背景抑制到局部对比度落地一个LCM基线单帧检测是红外弱小目标检测的基石也是综述里篇幅最大的一块。它假设目标在单张图里就有可辨识性不依赖时间信息。实际工程中单帧方法常被用作第一级粗检输出候选点后交给多帧方法确认。这一章把背景抑制类方法和局部对比度类方法讲透再给一个能跑的 LCM 基线代码。3.1 背景抑制类方法顶帽变换、中值滤波与形态学滤波的适用边界背景抑制类方法的思路是先把背景估计出来然后用原图减去背景剩下的残差里目标就会凸显。顶帽变换是经典做法通过形态学开运算估计背景再用原图减去开运算结果。开运算能消除小于结构元素的亮斑所以目标会被去掉背景保留减法后目标变成亮点。顶帽变换的优点是快、无参数依赖少缺点是结构元素尺寸和目标尺寸不匹配时目标可能被背景估计吞掉。中值滤波背景抑制也是常见做法取目标大小的窗口做中值如果窗口内目标占比很小中值接近背景减法后目标保留。但中值滤波在背景突变边缘会产生强残差海天线、云层边缘都会形成虚警。更进阶的是形态学重构或者基于像素相关性估计背景这类方法对复杂背景更鲁棒但计算量上去了。我在实际筛选时有一套经验如果背景以缓变平坦为主顶帽变换足够如果背景有强边缘结构先用中值滤波加方向滤波抑制边缘如果背景是强纹理比如云层单帧背景抑制基本到极限必须上多帧。不要把背景抑制做到极致再检测那样会把弱目标也一并抑制掉这个度需要靠 ROC 曲线找。3.2 局部对比度家族LCM、MPCM、NRAM的演进逻辑局部对比度方法不走“先估计背景再减掉”的路线而是直接度量目标与周围邻域的对比度。最原始的 LCM 设计是在滑窗内把中心区域分成若干子块计算中心块的最大灰度与周围块灰度均值之比把这个比值作为增强后的像素值。这样即使背景整体很亮只要目标比周边亮就能得到高响应背景边缘虽然也亮但其周围也亮比值压低。LCM 的缺点是对目标尺寸敏感中心子块尺寸和目标大小不一致时响应衰减。MPCMMultiscale Patch-based Contrast Measure是 LCM 的改进它用目标块与周围 8 个邻域块的双向对比度取代单方向比值并且通过多尺度加权融合来适应目标尺寸变化。计算量比 LCM 大不少但抗背景边缘能力更强。再往后有 NRAM、基于信息熵和梯度方向的变体核心都是在回答同一个问题什么样的“亮点”更像目标目标应该是局部极值、形状接近高斯斑点、周围背景平坦而亮边缘不满足“周围平坦”这个条件。这里要提醒一句综述里各种对比度测度的公式很多但如果工程上只需要一个基线优先做 LCM 的多尺度版本。多尺度是为了抵消未知目标尺寸的影响一般取 3 个尺度就够了目标可能是 2×2、5×5 还是 9×9最少覆盖 1×1 到 11×11 的范围尺度步长 24 像素。尺度太少漏检尺度太多虚警叠加需要实际调。3.3 用Python实现LCM基线最小代码与参数取舍下面给出一个可以运行的多尺度 LCM 简化实现。这个代码不追求极致性能只用来跑通流程适合作为基线对比。核心思路是对每个像素点在其周围取一个大小为 N 的窗口窗口内再分 9 个子块中心块代表目标周围 8 块代表背景。import numpy as np from scipy.ndimage import maximum_filter def lcm_map(img, target_size): 计算单尺度LCM响应图 img: 单通道灰度图float32 target_size: 目标边长奇数如3、5、7 if target_size % 2 0: target_size 1 pad target_size img_pad np.pad(img, pad, modesymmetric).astype(np.float32) # 中心块的尺寸就是target_size # 邻域块的尺寸通常与中心块相同 h, w img.shape resp np.zeros_like(img, dtypenp.float32) # 用滑动窗口分块计算向量化预处理所有子块灰度均值 from scipy.ndimage import uniform_filter # 先计算均值图每个位置代表该点为中心的target_size方块的均值 mean_map uniform_filter(img_pad, sizetarget_size, modenearest) # 为了计算周围8块的均值需要做偏移 # 偏移量取target_size避免中心块和邻域块重叠 offset target_size # 9个子块中心相对偏移 offsets [(-1,-1),(-1,0),(-1,1), (0,-1), (0,0), (0,1), (1,-1), (1,0), (1,1)] # 对于原图坐标(i,j)在pad图里对应(ipad, jpad) # 中心块的均值 mean_map[ipad, jpad] # 邻域块的均值 mean_map[ipad offset*dy, jpad offset*dx] # 注意mean_map尺寸与img_pad相同 for dy, dx in offsets: if dy 0 and dx 0: continue # 这里需要把mean_map按偏移后的索引取出 shifted np.zeros_like(img, dtypenp.float32) for i in range(h): for j in range(w): shifted[i, j] mean_map[i pad offset*dy, j pad offset*dx] # 中心块均值 center_mean mean_map[pad:padh, pad:padw] # 邻域均值就是shifted取8个邻域中最大值 if dy -1 and dx -1: neighbor_max shifted.copy() else: neighbor_max np.maximum(neighbor_max, shifted) center mean_map[pad:padh, pad:padw] # LCM定义中心块均值 / 周围块最大均值再加一个保护项 eps 1e-12 resp center / (neighbor_max eps) * (center - neighbor_max) # 上面公式是变体经典的LCM是中心块最大值乘以中心块均值与邻域均值的比值 # 这里简化为中心块均值对比度效果已经可用 return np.clip(resp, 0, None)这个逐像素循环效率很低仅供理解。参数 target_size 是单尺度的目标尺寸邻域偏移 offset 必须大于等于 target_size否则子块之间重叠背景估计受目标能量污染。实际使用多尺度时把不同 target_size 的响应图归一化后逐像素取最大再做一个 3×3 极大值抑制得到候选点。LCM 的响应值没有绝对物理意义它是个相对量所以阈值一般按响应图的直方图分位数选定比如取 99.5% 分位数作为初筛后续再用 SCR 过滤。4. 序列检测方法帧间关联、轨迹累积与管道滤波的简化实现单帧方法再强遇到单帧 SCR 接近 1 的目标也会无能为力。序列检测利用目标运动的连续性和背景的相对静止性把多帧能量累积起来相当于把时间当作信噪比增益器。这一章讲清楚帧间关联的几种主流思路给一个工程上常用的管道滤波简化实现。4.1 为什么单帧不够时间维度的信噪比红利弱小目标单帧信杂比低是因为目标能量被噪声淹没。如果目标在连续 N 帧中都出现在相近位置而噪声是随机起伏的那么把多帧图像按像素叠加目标区域会增强噪声区域因为随机正负抵消而增强较慢。理论上假设噪声独立同分布多帧累加后信杂比能提升约 sqrt(N) 倍。10 帧累加大约提升 3 倍这个增益对于 SCR2 的目标来说能把有效 SCR 拉到 6检测难度显著下降。但直接累加有个前提目标位置不能有太大帧间位移否则目标像素会“拖尾”。所以序列检测方法通常分为先检测后关联DBTDetect-Before-Track和先跟踪后检测TBDTrack-Before-Detect两大类。DBT 先做单帧粗检再把候选点做轨迹关联适合目标稍亮、单帧可检测的场景TBD 则直接处理原始图像序列沿可能的运动轨迹累积能量适合极弱目标但计算量大得多。4.2 管道滤波与动态规划两种轨迹假设的差异管道滤波Pipeline Filter是 DBT 中最经典的时序确认方法。它假设目标在每帧中的候选位置最多只出现在一个以当前位置为中心的小管道比如 3×3×N 帧内如果连续 K 帧在管道内都检测到候选点就确认该轨迹。管道尺寸和连续帧数 K 是核心参数。目标速度越快管道半径越大目标帧率越低K 越大。它的问题是背景边缘虚警如果也连续出现会形成假轨迹靠单帧特征没法区分。动态规划DP是 TBD 的一种实现它把目标轨迹看作一条路径用递推方式累积多帧候选点的能量最后找能量最大的轨迹。DP 适合目标速度已知且变化不大、信杂比极低的场景。它比管道滤波更“细腻”因为管道滤波只要点连续存在就算轨迹不管强度是否累积DP 则把强度变化也建模进去了。DP 的缺点是指数级状态搜索需要对目标状态空间做离散化和剪枝。工程上怎么选如果你的算法要跑在嵌入式平台上优先管道滤波如果离线处理且对检测率要求极高再考虑 DP 或基于粒子滤波的 TBD。我见过把 DP 直接塞到实时系统里的项目一帧处理时间上百毫秒最后被迫改成“单帧检测 分段管道确认”效果差得不多速度却快了十倍。4.3 简化版管道滤波代码从帧序列到目标轨迹下面给出一个简化版管道滤波实现输入是一组单帧检测候选点每帧一个坐标列表输出是确认后的轨迹。这里管道滤波只做了空间关联没有做强度累积适合作为数据结构演示。class PipelineFilter: def __init__(self, radius2, min_frames4): radius: 管道空间半径像素 min_frames: 连续多少帧命中才算轨迹 self.radius radius self.min_frames min_frames # 每条轨迹记录: last_pos, hit_count, miss_count self.tracks [] def _find_near(self, pos, candidates): 找到candidates中距pos不超过radius的点 for c in candidates: if abs(c[0] - pos[0]) self.radius and abs(c[1] - pos[1]) self.radius: return c return None def update(self, candidates): candidates: 当前帧候选点列表 [(y,x), ...] 返回本帧新确认的轨迹终点列表 # 上一帧的轨迹先全部标记未命中 updated_tracks [] confirmed [] # 对每条已有轨迹尝试关联当前帧候选 for track in self.tracks: last_pos track[last_pos] c self._find_near(last_pos, candidates) if c is not None: track[last_pos] c track[hit_count] 1 track[miss_count] 0 if track[hit_count] self.min_frames: confirmed.append(track.copy()) # 确认后移除轨迹避免重复输出 continue updated_tracks.append(track) # 这个候选已被使用从candidates中移除 candidates.remove(c) else: track[miss_count] 1 # 允许跳1帧超过1帧则丢弃 if track[miss_count] 1: updated_tracks.append(track) # 使用完的候选点作为新轨迹起点 for c in candidates: updated_tracks.append({ last_pos: c, hit_count: 1, miss_count: 0 }) self.tracks updated_tracks return confirmed这个实现里每条轨迹记录最近位置、命中次数和丢失次数。关联逻辑很简单在半径范围内找到第一个候选点就认为命中。参数 radius2 表示允许目标帧间最多移动 2 像素min_frames4 表示连续出现 4 次才算轨迹。允许 miss_count 1 是为了缓解目标闪烁导致的单帧漏检。实际使用中radius 要根据目标最大速度和帧率设定建议值为 max_speed * frame_interval target_radius。如果目标可能突然加速可以放宽到 35但虚警也会增加。这个滤波器最大的坑是 candidates 列表会被原地 remove所以在外部传入前最好复制一份避免影响单帧检测结果。5. 红外弱小目标检测避坑指南5个高频踩坑点与修正方案这一章是血泪经验合集每一条都是我或身边同事在模拟项目X里真实“翻车”后总结出来的。与其说理论不如说是给后来者一张“哪里会塌”的地图。按“现象 → 原因 → 解决”的顺序写方便直接对照。5.1 图像转三通道反而掉点格式选择的隐蔽损失现象把单通道红外图复制成三通道 RGB 后输入一个预训练的 YOLO 系列模型检测率比单通道灰度输入还低 25 个百分点。原因复制三通道让模型的第一层卷积同时看三个完全相同的通道不仅没有增加信息还让批量归一化统计量失真预训练模型在红外域上本就有域偏移强行延续 RGB 预训练权重并不是免费午餐。解决不要盲目转三通道。要么直接用单通道输入并修改模型第一层卷积输入为 1要么用“伪彩色映射”将红外图映射到三通道比如用调色板把灰度映射到 RGB这样三个通道内容不同理论上能提供更多视觉特征但也要从头训练或微调。从效果看单通道微调通常比伪彩色更稳代价是放弃 ImageNet 预训练权重需要对模型做随机初始化并在足够红外数据上训练。若数据量不够建议用单通道权重复制法把预训练第一层权重在通道维度上取平均复制至少能让浅层特征保持平滑性。5.2 小目标在骨干网络里“蒸发”下采样与感受野矛盾现象使用 FPN 类检测网络小目标分支输出的特征图上已经找不到对应响应即使原图目标清晰可见。原因骨干网络连续下采样导致小目标特征被压缩成 1×1 甚至直接消失。例如原图 512×512经过 5 次 stride2 卷积后特征图变成 16×16一个 5×5 的目标在特征图上不到 1 个像素信息不可恢复。解决不要依赖深层特征图输出检测要使用高分辨率浅层特征。两个有效做法一是修改骨干网络去掉最后一两个下采样层让特征图保持 1/8 或 1/4 分辨率二是使用浅层特征图单独接检测头不经过深层融合。对弱小目标常用的是基于分割或热图回归的检测器如 UNet 结构而不是基于 anchor 的框检测因为小目标本身没有“框”的语义直接回归中心点热图更稳。另一个技巧是训练时对目标区域做 2×2 或 4×4 的过采样裁剪让网络“看见”更大比例的目标。5.3 虚警集中在亮背景边缘预处理过当的代价现象用顶帽变换或中值滤波做预处理后海天线、云层边缘、建筑轮廓处出现大量固定虚警单帧 ROC 曲线在低虚警率段直接翘头。原因背景抑制类方法假设背景是平滑的但边缘不是平滑背景它在滤波器残差中表现为强响应。这些边缘的响应值可能远高于弱目标。解决第一道防线是把边缘方向信息引入检测。计算局部梯度方向如果候选点位于一个强梯度主导的结构上梯度幅值大但方向一致大概率是边缘而非目标。可以计算候选点的“结构相似度”以候选点为中心取小邻域拟合一个高斯核如果拟合残差小且中心亮则更像目标如果拟合出的是长条状则判为边缘。第二道防线是加多帧确认因为静止边缘每帧都存在目标也在每帧存在二者无法靠帧数区分但边缘的强度和位置更稳定可以用帧间微位移检测真实目标会有轻微晃动或亚像素移动而固定边缘几乎不动这个特征可用于过滤。5.4 多帧轨迹断裂目标运动模型假设太强现象目标在做机动或匀加速运动时管道滤波轨迹频繁断裂检测率急剧下降。原因管道滤波假设目标在时间窗口内位置变化不超过一个固定半径这等价于速度上界恒定。当目标突然加速或转向候选位置跳出管道轨迹就断了。动态规划方法如果状态转移模型只允许匀速也会有类似问题。解决工程上最简单有效的办法是增大管道半径并同时增大连续帧数。半径从 2 改到 4帧数从 4 改到 6对弱目标虚警率的增加有限但机动适应能力显著提升。更好的办法是使用带速度记忆的关联上一时刻候选点位置外推一个速度向量如果新候选点落在“预测位置 噪声”范围内就允许更大的位移。可以在管道滤波里维护一个 prev_speed current_pos - last_pos匹配时以 last_pos prev_speed 为中心而不是 last_pos。这个改进只需要几行代码能把有向运动目标的连续命中率提高不少。5.5 量化部署后目标消失激活值分布与定点误差现象模型在浮点上检测正常转 INT8 量化后弱小目标响应变得极低检测率直接掉到不可用。原因弱小目标像素在整幅图中占比极低激活值统计时小目标区域的响应被淹没在背景激活值分布里。量化校准一旦采用默认的 MinMax 或 Percentile比如 99.99%目标激活值会被当成离群值截断量化后目标输出变为 0。解决校准数据集必须包含大量含小目标的图像且校准时要单独统计目标区域的激活值范围。常见做法是使用分通道的量化精度对浅层特征图采用更高的量化位宽如 INT16。另外可以做一个“目标增强 量化敏感度分析”逐个统计每层激活值中目标像素与背景像素的取值范围如果两层范围差距超过一个数量级就需要对该层单独设置量化阈值或者改用混合精度。部署时还要注意反量化算子的实现有些推理框架默认用整张图的缩放系数导致小目标低响应被“抹平”。最实用的验证方法是把量化前后模型输出热图逐像素相减如果目标区域差值远大于背景区域说明量化对目标响应影响过大需要重新校准。6. 把结果做扎实仿真验证、指标设计与一组可复用的调参习惯很多人调完算法只看一两条视频就下结论结果换一个场景立刻翻车。最后一章分享我习惯用的验证流程和几个容易见效的调参方向帮助你把算法从“能跑”推到“可信”。6.1 构造带像素级标注的仿真序列没有可控数据就永远说不清算法是对是错。我自己维护了一套仿真序列生成脚本输入一张干净背景图和目标运动轨迹输出连续 100 帧带标注的红外序列。每一步都固定随机种子确保实验可复现。仿真序列至少包含三种背景均匀天空、海天线、强云层纹理每种背景下设置 2×2、4×4、8×8 三档目标尺寸和 SCR 2/4/6 三档强度。这样组合下来 27 个序列足够把算法的“死穴”试出来。生成时记得在目标强度上加点抖动模拟真实红外焦平面的 1/f 噪声。6.2 用信杂比增益评估算法而不是只看检测率检测率是个二值结果它掩盖了算法是否真正把目标“增强了”。我建议每个算法报告两个指标输出响应图中的目标 SCR 和背景 SCR。定义 SCR Gain SCR_out / SCR_in它能反映算法对目标的增强倍率以及对背景的抑制倍率。一个算法可能检测率相同但 SCR Gain 一个是 3 一个是 8后者在后续多帧累积里的潜力更大。我记录实验时会把每个候选点的输入 SCR、输出响应强度、最终是否确认输出做成表格用散点图看分离度这比 ROC 更直观。6.3 一套适合工程复用的初始参数组合以下参数来自我多次实验后的默认值未必最优但能作为起点。单帧检测多尺度 LCM 的尺度和阈值我用target_size 1, 3, 5, 7总共 4 个尺度阈值取响应图 99.8% 分位数管道滤波 radius max(2, round(vmax * fps_interval))min_frames 4miss_tolerance 1预处理阶段只做去均值不做中值滤波因为中值滤波会破坏小目标边缘。这套组合在多数中远景红外场景下能得到可接受的结果之后再微调。如果目标极弱SCR2建议把多尺度 LCM 换成分段动态规划哪怕慢一点。我做这类项目最大的教训是不要迷信某个高分的检测率先看虚警在哪再看目标响应长什么样。虚警集中处往往就藏着背景模型的缺口也藏着下一版优化的灵感。希望这些经验能帮你少走几步弯路也希望这篇笔记能成为你推进红外弱小目标检测落地时的一份顺手参考。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑