ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

机器学习驱动雷达辐射源识别:从数据处理到评估避坑指南

机器学习驱动雷达辐射源识别:从数据处理到评估避坑指南

简介:雷达辐射源识别是电子侦察与雷达对抗中的关键环节,传统参数匹配法仅利用外部特征,难以处理复杂脉内调制信号。这份PDF综述聚焦机器学习与辐射源智能识别的交叉方向,面向雷达对抗、信号处理及智能感知领域的研究者与相关专业研究生,系统回顾了机器学习理论自20世纪80年代以来的演变,包括基于SVM、随机森林以及深度学习、CNN等代表性方法在雷达辐射源识别中的应用。资源为单个PDF文档,文件大小仅357KB,内容紧凑,便于直接阅读和文献引用。文中不仅总结了当前技术研究状态,还重点讨论了小样本学习能力不足、新型雷达识别需求等难点,并提出未来研究方向与可行解决思路。目前已有176人浏览/学习,适合作为该方向的综述性参考资料,能够帮助读者快速建立知识框架,节省文献检索与梳理时间。

1. 打开一份“基于机器学习的雷达辐射源识别研究综述.pdf”,先别急着翻结论

电子侦察系统截获到一串未知雷达脉冲时,最要紧的是在几秒内回答三个问题:这是谁、它想干什么、我要不要躲。雷达辐射源识别就是干这件事的,而传统做法是把测到的载频、脉宽、重频等参数拿去和情报库做模板匹配,遇到频率捷变、重频参差、新体制雷达就非常吃力。机器学习恰恰擅长在这种“参数不完全规整、边界模糊”的场景下从数据里找规律,于是近几年“基于机器学习的雷达辐射源识别”成了电子侦察算法岗和雷达对抗方向研究生的高频选题。但这篇综述真正值钱的地方不在附录里的模型对比,而在它反复提醒的一句话:这个方向最难的从来不是把准确率从 92% 刷到 95%,而是怎么让模型在真实电磁环境里不翻车。本文我会顺着这种综述的骨架,把问题定义、数据准备、特征体系、模型选型和评估坑一条条拆开,路数也是我实际做这类课题时验证过的。

2. 从“脉冲描述字”到“学习型分类器”:雷达辐射源识别的几个核心问题

2.1 雷达信号怎么变成可计算的数据:PDW、IQ数据与脉内特征

雷达辐射源识别的起点不是频谱图,而是电子侦察接收机输出的脉冲流。接收机对每个脉冲做参数测量,得到一组被称为脉冲描述字(PDW)的结构化数据,常见字段包括载频、脉宽、到达时间、到达角和脉幅。传统识别算法就是拿这些字段到已知雷达参数库里做最近邻匹配,几个维度同时命中就判为对应型号。这套做法在雷达型号少、参数稳定的年代够用,但现代雷达普遍采用频率捷变、脉组参差、重频抖动和脉内调制多样化,PDW 里的少数几个标量已经不足以刻画雷达身份,必须往脉内挖。

脉内特征指的是单个脉冲内部的时间、频率和相位变化规律。比如线性调频信号的瞬时频率是一条斜线,二相编码信号内部有相位跳变点,非线性调频则呈现出曲线变化。这些规律和雷达的激励信号设计强相关,某种程度上比载频、脉宽更“长在雷达身上”。要用机器学习处理脉内数据,首先得有原始波形,也就是对截获信号做正交采样得到的 I/Q 两路数据,再按脉冲起始位置截断成样本。这里很容易回到一个基础问题:机器学习中的数据处理是什么?放到这个场景里,就是把“一部雷达的一次发射”定义成一个样本,把样本变成一定长度的复数序列或二维时频图,再送进模型。定义好“什么是样本”,比选模型重要得多,因为后面所有标签、划分、评估都建立在这个定义之上。

2.2 “识别”到底识别什么:调制类型、具体雷达还是单个雷达个体

综述里大量出现的“识别”其实涵盖了三个层次,读的时候如果没分清,复现实验时特别容易自欺欺人。第一层是雷达信号调制方式识别,只判断这个脉冲是线性调频、相位编码、频率编码还是别的类型,本质是信号分类问题。第二层是雷达型号识别,要求把脉冲归到某部已知雷达型号,比如判断它属于某种舰载搜索雷达还是某种火控雷达,这需要把 PDW 参数、脉内调制、天线扫描特征等综合起来。第三层是辐射源个体识别,也叫雷达指纹识别,目标是区分两部同型号、同批次、参数几乎完全相同的雷达,依据是发射机硬件差异带来的无意调制特征。

不同层次对应不同难度和不同工程价值。调制方式识别是基础,数据集好造、指标好刷,很多论文拿它当主干。型号识别有真实情报价值,但需要可靠的雷达参数库作为弱标签依据,数据获取困难。个体识别最难,对信号质量要求极高,低信噪比下特征很容易被淹没。我通常在课题立项阶段先问清楚:用户是要识别威胁雷达的“类型”,还是要找出特定一部雷达?如果需求含糊,后面所有设计都会飘。综述里最有用的提醒之一也是:先界定任务粒度,再谈算法升级。

2.3 为什么说机器学习不是“换个分类器”这么简单:从人工特征到端到端

早期做雷达辐射源识别,主流的思路是人工设计特征加传统机器学习分类器。特征工程师从脉内信号里提取瞬时频率、包络起伏、高阶累积量等统计量,再用 SVM、决策树这类传统机器学习算法完成分类。这样做的好处是特征物理意义明确,样本量需求小,可解释性也强;缺点是特征设计依赖大量领域知识,换一种雷达体制可能就要重新设计。后来深度学习流行,很多工作转向“端到端”:把 I/Q 波形或时频图直接送进卷积神经网络,让模型自己学特征。这种做法在公开数据集上表现亮眼,也更容易复现,但代价是样本需求变大、调参玄学化、模型可解释性差。

我的看法是,这个领域不存在“传统方法过时了”一说。样本量只有几千的时候,传统机器学习加精心设计的特征可能比 CNN 更稳;样本量到了几万、信号类型覆盖足够广,再上深度网络才划算。综述里经常出现这类对比实验,结论也大同小异:深度模型在全信噪比范围内的平均识别率更高,但在某些低信噪比区间可能不如人工特征方法稳健。这提醒我们,跑通一条机器学习应用流程时,不要只盯着最新模型,先搭一个简单的特征加分类器基线,用基线结果去校准数据质量,再逐步迭代模型复杂度。这个顺序能少走很多弯路。

3. 想复现一篇综述里的实验:数据、特征、模型与指标的一次闭环

3.1 数据从哪来:仿真生成是起点,但别把“干净数据”当成实测环境

几乎所有相关研究的第一步都是准备数据集。真实雷达信号涉及军事保密,公开实测数据极少,常见做法是用软件仿真生成雷达脉冲信号,再叠加噪声和信道效应。仿真生成的好处是可以精确控制调制类型、载频、脉宽、重频、信噪比等参数,让实验具备可重复性;坏处是如果仿真模型太简单,模型学到的“雷达特征”可能只是仿真器在特定参数下的产物,换到实测环境立刻失效。我一般会把仿真分成两级:第一级只加高斯白噪声,用于算法快速迭代;第二级额外加多径、多普勒、相位噪声、接收机滤波器畸变,用于逼近真实接收链路。

对刚入门的人,我的建议是从“用仿真数据跑通一个小实验”开始,这比盲目找公开数据集更可控。雷达信号的公开资源主要集中在通信信号调制识别领域,拿通信信号数据集来训练雷达辐射源识别模型,特征分布差异很大,迁移效果很有限。更务实的做法是自己搭一个信号生成器:定义几种典型雷达调制类型(线性调频、非线性调频、二相编码、频率编码),设定载频和脉宽范围,按不同信噪比批量生成 I/Q 样本。这个环节本身就是机器学习入门阶段极好的练习:你在亲手构造一个带标签的数据集,能直观看到样本形态和标签之间的关系。

表:仿真数据生成时建议控制的变量

参数取值范围举例说明
采样率100 MHz ~ 1 GHz越高脉内细节越丰富,数据量越大
载频2 GHz ~ 18 GHz 折算到中频通常先在中频上仿真,避免直接仿真射频
脉宽1 us ~ 100 us决定脉内采样点数
调制方式LFM、NLFM、BPSK、频率编码至少覆盖 4 类以上才有区分价值
信噪比-10 dB ~ 20 dB按 2 dB 或 5 dB 步进,用于画识别率曲线
辐射源个体数每类 3 ~ 5 部个体识别任务必须有多部同型号发射机

3.2 特征体系怎么选:时域、频域、时频图与“指纹”

数据准备好之后,下一步是决定模型“看什么”。这里存在两种路线:一种是手工提取特征,把信号压缩成一维特征向量;另一种是把原始波形或时频图直接作为模型输入。手工特征里,时域方面有脉冲包络的上升沿、下降沿、顶降、脉内起伏等,它们反映发射机调制器和功放特性;频域方面有功率谱形状、中心频率偏移、带宽、带外辐射等;高阶统计量方面有四阶累积量、六阶累积量,这些对高斯噪声有天然的抑制作用,常用于调制分类。时频图则是把一维信号变成二维图像,常见做法是短时傅里叶变换、小波变换和科恩类分布。

时频图是当前主流路线,因为它保留了信号频率随时间变化的细节,CNN 可以直接把图像特征提出来。但时频分布的选择很有讲究:短时傅里叶变换计算快、无交叉项干扰,但时间和频率分辨率受窗长限制;Wigner-Ville 分布时频聚集性好,但对多分量信号会产生交叉项,在低信噪比下很容易造假象。我常用的折中是 Choi-Williams 分布或平滑伪 Wigner-Ville 分布,它们抑制交叉项的效果更好,代价是计算量上升。无论选哪种,预处理参数必须固定并记录在实验文档里,否则别人复现时换了窗长,结果可能差出十个点。

要给“指纹识别”单独留一个位置。辐射源个体识别的关键特征是无意调制,比如相位噪声谱、功放的非线性失真、本振泄漏等。这些特征非常细微,经过时频分析后往往落在图像的某些局部纹理上。所以在做个体识别时,我会额外关注高分辨率的时频细节,甚至直接用高采样率的 I/Q 片段做输入,而不是先降采样成小尺寸图像。特征工程在这里依然不可替代,只是从“人工设计”变成了“用网络结构去适配”。

3.3 模型选型:从SVM、随机森林到CNN、RNN、Transformer

模型选择是整个综述阅读体验里最眼花缭乱的部分。传统机器学习算法里,SVM 在中小样本、高维特征场景下依然是强基线,配合 RBF 核和交叉验证,对人工提取的特征向量能给出相当不错的性能;随机森林则更适合特征之间存在非线性关系的情况,还能输出特征重要性,方便反推哪些特征有效。这些传统方法在样本量几千甚至几百时不会比深度学习差太多,而且训练开销小,模型可解释性高。所以我的流程一般是:先跑 SVM 和随机森林,把特征有效性的下限摸清,再上深度模型。

深度学习模型的选择要看输入形态。若输入是时频图,CNN 是最直接的选择,连续卷积层可以提取局部时频纹理,再通过全连接层做分类。若输入是脉冲序列或需要捕捉脉冲间的时序关系,RNN、LSTM、GRU 这类循环网络可以建模上下文,适用于重频参差、脉组变化等场景。Transformer 近年也被引入,它对长序列建模能力强,但雷达辐射源识别样本量普遍不大,Transformer 容易过拟合,往往需要预训练或强数据增强。我的经验是,不要因为某个模型在图像竞赛里刷榜就硬搬到雷达信号上,先把信号特点搞清楚:样本短、信噪比低、类别之间区分度不均匀、还可能存在开集情况,这些约束比模型结构本身更影响效果。

表:不同模型家族在雷达辐射源识别中的适用性对比

模型类型输入形式样本量要求可解释性适用场景
SVM一维特征向量低较高人工特征基线和对比实验
随机森林一维特征向量低较高特征筛选和快速验证
CNN时频图/IQ序列中中调制类型和型号识别主流
RNN/LSTM脉冲序列/时间序列中高较低脉间参数建模、雷达工作模式识别
Transformer序列高低长序列建模,目前性价比不高

3.4 指标别只看“准确率”:混淆矩阵、拒判率与低SNR曲线

综述论文里最常见的评估方式是画一条“识别准确率随信噪比变化”的曲线,这本身没有错,但只看这条曲线会漏掉大量信息。雷达辐射源识别的样本天然存在类别不平衡:某些常见雷达的脉冲数量远多于罕见雷达,如果只看总准确率,模型很可能把少数的稀有雷达全部判错,却依然拿到 90% 以上的分数。正确的做法是同时给出每个类别的准确率、召回率和 F1-score,并画出混淆矩阵,找出最容易混淆的雷达对。同频段、同调制方式的两部雷达被混淆是正常的,如果模型把不同频段的雷达也混起来,说明特征提取环节有问题。

另一个容易被忽略的指标是拒判率。实际侦察环境中,遇到不属于已知库的雷达是常态,模型必须有能力输出“未知”,而不是强行把它归到某个已知型号。这属于开集识别评估,方法和闭集分类不同,会在后面详细讲。工程上我习惯用漏警概率和虚警概率来描述系统性能:漏警是“它就是某部重点雷达但我没报”,虚警是“它不是但我报错了”。这两者的代价完全不对等,必须结合任务场景设定阈值。所有机器学习模型,本质上都在调一个门限,雷达侦察里这个门限选在哪,往往比算法选哪个更重要。

4. 跑通一个最小可复现的雷达辐射源识别实验:四步走与关键参数

4.1 生成一套带标注的雷达脉冲数据:仿真参数就是你的实验边界

我建议从最简单的任务开始:识别线性调频、二相编码、四相编码和非线性调频四种调制方式,每类生成若干脉冲,划分出训练集和测试集。这个任务数据容易生成、类别差异明显、结论可预期,适合用来把整个流程跑通。下面这段代码演示了如何生成一个线性调频脉冲和一个二相编码脉冲的 I/Q 数据,逻辑并不复杂,但它的价值在于让你对“样本长什么样”建立直觉。

import numpy as np def gen_lfm_pulse(pw=10e-6, fs=100e6, f0=10e6, bw=10e6): n = int(pw * fs) t = np.arange(n) / fs k = bw / pw # 线性调频信号:瞬时频率随时间线性变化 iq = np.exp(1j * (2 * np.pi * (f0 * t + 0.5 * k * t ** 2))) return iq def gen_bpsk_pulse(pw=10e-6, fs=100e6, f0=10e6, chip_len=1e-6): n = int(pw * fs) t = np.arange(n) / fs code_len = int(pw / chip_len) phase_code = np.random.choice([0, 1], size=code_len) phase = 2 * np.pi * f0 * t for idx, bit in enumerate(phase_code): start = int(idx * chip_len * fs) end = int((idx + 1) * chip_len * fs) phase[start:end] += np.pi * bit # BPSK:相位 0 或 pi return np.exp(1j * phase) def add_noise(iq, snr_db): signal_power = np.mean(np.abs(iq) ** 2) noise_power = signal_power / (10 ** (snr_db / 10)) noise = np.sqrt(noise_power / 2) * (np.random.randn(*iq.shape) + 1j * np.random.randn(*iq.shape)) return iq + noise

这段代码里最关键的是add_noise的参数含义:snr_db的单位是分贝,噪声功率是根据信号平均功率反推出来的,这样生成的结果与信号本身幅度无关,保证不同脉冲的噪声水平可比。gen_bpsk_pulse里的码元宽度chip_len控制了相位跳变的密度,码元越窄,脉内跳变越多,相同条件下识别难度越大。实际实验时,还应该把载频、脉宽、采样率、码元序列等参数批量抽取,形成覆盖多种情况的均衡数据集,而不是只生成“最好认”的脉冲。

4.2 用短时傅里叶变换把IQ变成时频图,并做归一化

拿到 I/Q 脉冲后,直接把它送进 CNN 会出现一个很尴尬的问题:网络要同时学习信号的时间结构、频率结构以及幅度尺度变化,对数据量和网络容量要求都很高。更稳妥的做法是先用短时傅里叶变换把一维信号变成二维时频图,让模型看到“频率随时间变化”的全貌,比如线性调频在时频图上就是一条斜线,二相编码则是一组分段恒定的横线。短时傅里叶变换有两个核心参数需要调:窗函数和窗长。窗长越长,频率分辨率越高,但时间分辨率越差,对脉内相位跳变的定位就越模糊。

import numpy as np def iq_to_spectrogram(iq, fs=100e6, fft_size=256, hop_ratio=0.25): # 把 I/Q 信号切成帧,逐帧做 FFT,得到时频矩阵 frame_len = fft_size hop_len = int(fft_size * hop_ratio) n_frame = (len(iq) - frame_len) // hop_len + 1 specgram = np.zeros((fft_size // 2, n_frame), dtype=np.float32) window = np.hamming(fft_size) for frame_idx in range(n_frame): start = frame_idx * hop_len frame = iq[start:start + frame_len] * window spectrum = np.fft.fft(frame)[:fft_size // 2] specgram[:, frame_idx] = np.abs(spectrum) ** 2 # 转成对数幅度,并用分位数截断压缩动态范围 log_spec = 10 * np.log10(specgram + 1e-12) vmin, vmax = np.percentile(log_spec, [1, 99]) norm_spec = np.clip((log_spec - vmin) / (vmax - vmin), 0, 1) return norm_spec

这里有两个容易被忽略的动作。第一,我用np.hamming加窗,避免帧边缘频谱泄漏;第二,对幅度谱取对数并做分位数截断。雷达信号动态范围极大,直接输入线性幅度谱会让少数强散射点主导训练,截断后每个样本的能量分布被压到相近尺度,CNN 的收敛稳定性会好很多。hop_ratio控制帧之间的重叠程度,重叠越多,时频图的时间维度越平滑,但计算量也越大。对脉宽 10 us、采样率 100 MHz 的脉冲,256 点 FFT、75% 重叠大约能得到 110 个时间帧,配合 128 条频率线,正好是一张适合 CNN 的小图。

4.3 训练一个浅层CNN做辐射源/调制识别:先跑起来再谈调参

时频图生成后,训练一个浅层 CNN 做分类是成本最低的起点。下面这段用 PyTorch 实现的示例只用了三层卷积,效果未必最好,但它能让你快速验证“数据管线是否通畅、评估流程是否正确”。很多初学者一上来就堆 ResNet、注意力机制,结果花了大量时间调参,最后发现问题是标签切错了。先用小网络把流程跑通,再逐步加深,是我一直坚持的工程习惯。

import torch.nn as nn class SimpleCnn(nn.Module): def __init__(self, num_classes=4): super().__init__() self.features = nn.Sequential( nn.Conv2d(1, 16, kernel_size=3, padding=1), nn.BatchNorm2d(16), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(16, 32, kernel_size=3, padding=1), nn.BatchNorm2d(32), nn.ReLU(), nn.MaxPool2d(2), nn.AdaptiveAvgPool2d((1, 8)), ) self.classifier = nn.Sequential( nn.Flatten(), nn.Linear(32 * 1 * 8, 64), nn.ReLU(), nn.Dropout(0.3), nn.Linear(64, num_classes) ) def forward(self, x): return self.classifier(self.features(x))

网络结构不是这段代码的重点,重点是它体现出的几个原则。第一,卷积层后面紧跟批归一化,对雷达信号这种样本间幅度差异较大的输入,批归一化能显著稳定训练。第二,用AdaptiveAvgPool2d把最终特征图压成固定尺寸,这样输入时频图尺寸即使略有不同,网络也能工作。第三,全连接层加了 Dropout,这是对付小数据过拟合最便宜的手段。训练超参数方面,学习率我一般从 1e-3 起步,批量大小取 32 或 64,训练轮数不超过 50 并配合早停;如果训练准确率很高但验证准确率很低,首先不是改模型,而是回头看数据划分是不是出现了跨样本泄漏。

4.4 按“辐射源/个体”划分数据,而不是按“脉冲样本”划分

这是整个实验流程中最重要的一条设计原则,也是我见过失效案例最多的一步。很多人从一部雷达的连续脉冲里切出几百个样本,然后随机分成训练集和测试集,模型在测试集上拿到 95% 的准确率,看起来很漂亮。但仔细想:同一个脉冲里的相邻片段,时频图几乎一样,这种随机划分本质上是在测试“模型记没记住这些片段”,而不是“模型认不认识这部雷达”。评估正确性的唯一标准,是训练集中的任何样本与测试集中的任何样本不能来自同一部雷达、同一次发射批次,否则就是数据泄漏。

正确的做法是先把辐射源 ID 编号,比如雷达 A、雷达 B、雷达 C 分别生成多段数据,再按照辐射源 ID 划分布局:训练集放 A、B、C 的一部分,测试集放 A、B、C 留出的另一部分,针对个体识别任务,甚至要专门让测试集出现训练时没见过的同型号雷达。只有后一种情况,模型测出来的性能才更接近真实战场中“遇到一部新雷达,我能不能认出它的型号”的语义。这个坑我在第四节提前讲,是因为它直接决定了整个实验的可信度,比选什么模型重要一个量级。

5. 做雷达辐射源识别的避坑指南:数据泄漏、仿真失真与评估偏差

5.1 数据泄漏:同一辐射源既进训练又进测试,指标好看但没有意义

现象:训练准确率和验证准确率都接近 100%,看似完美,但换一批新采集的数据后性能断崖式下跌。原因几乎都是数据划分粒度出错:数据集里的样本是从少数几个辐射源的长脉冲流里切出来的,随机划分后,训练集中包含某部雷达的脉冲片段,测试集中也包含同一部雷达的其它片段。模型实际上在“认片段特征”而非“认雷达类型”,这种泄漏在时频图和指纹特征下表现得尤其隐蔽。解决:所有划分必须发生在辐射源 ID 或信号批次层面,而不是样本层面;对个体识别任务,还要保证训练和测试的采集时间、环境条件不完全重叠。

5.2 仿真数据“太干净”:没建出接收机的非理想性

现象:仿真信噪比低至 -5 dB 时模型还能到 90% 识别率,拿采集卡录一段真实信号回来一测,掉到 60%。原因:仿真器通常只加高斯白噪声,而真实接收链路存在本振相位噪声、幅度不平坦、滤波器群延迟、ADC 量化误差,这些非理想效应会改变信号的细微结构,尤其对指纹类特征影响巨大。解决:在建仿真环境时加入“接收机模型”,至少包括相位噪声谱、带外抑制和 ADC 有效位数;更务实的做法是预留小批量实测数据作为最终验证集,仿真数据只用于开发和调参。

5.3 时频图预处理不一致:窗长、时频分布换来换去,实验结果无法复现

现象:论文里报告 87% 的识别率,复现时改成默认窗长只有 70%。原因:时频图对窗函数、窗长、重叠比例、FFT 点数极其敏感。比如线性调频信号在短窗下频率分辨率变差,斜线变粗;在长窗下跳变点的时间定位又变模糊。不同预处理参数得到的是不同形态的图,模型学到的特征完全不同。解决:把预处理参数当成实验设计的一部分写进文档,每个数据集只需调一组参数;固定后用脚本统一生成缓存,后续实验全部加载同一份时频图,不再重复计算。这也是“机器学习中的数据处理是什么”最真实的回答:数据处理不只是清洗,它在决定模型上限。

5.4 把“闭集分类”当成“辐射源识别”来评测

现象:模型在已知雷达库上准确率很高,一旦送入一部新体制雷达的信号,它依然会输出一个已知型号,而且置信度不低。原因:绝大多数分类模型用的是 Softmax 输出,它的数学本质是把样本在所有已知类别间分配概率,根本没有“不知道”这个选项。雷达辐射源识别现实中必须面对开集环境,未知雷达出现频率不低。解决:在模型之外加一层开集拒判逻辑,常见做法有三种:一是对 Softmax 置信度做阈值判断;二是用原型网络或度量学习,让样本靠近某个已知类别的原型中心才判为该类;三是用自编码器重建误差作为“熟悉度”指标,重建误差大则判为未知。

5.5 只看平均准确率,被多数类评估带偏

现象:某类雷达样本特别多,模型把所有样本都判成这一类,平均准确率依然可能超过 85%。原因:平均准确率没有体现类别间的样本量差异。雷达侦察数据天然长尾,常用雷达样本多,特殊用途雷达样本少。解决:报告宏平均 F1 和加权 F1 两个指标,并固定看混淆矩阵;训练时对样本较少的类别提高损失权重,或使用难例挖掘策略;评估时把信噪比作为二维轴,画出每个类别在不同信噪比下的识别率,避免“总体不错、重点目标全丢”的假象。

6. 综述落地后的进阶技巧:开集识别、小样本与可解释性的最后几百米

6.1 给模型加一个“拒判开关”:阈值怎么找更可靠

闭集分类模型不能直接上线,至少要加一个拒判机制。最朴素的办法是取 Softmax 最大概率作为置信度,在验证集上画出“拒判率-准确率”曲线,再根据任务接受度选阈值。但 Softmax 置信度经常过于自信,更好的办法是结合重建误差或特征距离。我常用的组合是:提取全连接层前一层的特征向量,计算它到每个已知类别原型的余弦距离,距离最近的类别得分若低于阈值,就判为未知。阈值选择必须在一个包含未知雷达的验证集上进行,否则你调的阈值只是在假装安全。

6.2 数据增广要克制:别为了样本量毁掉指纹细节

时频图可以做的增广很多:时间平移、小幅频率拉伸、加入随机噪声、混合样本等。这些操作在调制类型识别任务上有效,但在个体识别任务上很危险——插值或拉伸会改变无意调制的精细结构,相当于把指纹磨掉了。我的建议是把增广分为两级:第一级只做不影响物理特征的操作,比如整图平移、遮挡部分频率段模拟干扰;第二级才做加噪和混叠,且只在调制识别和小样本任务里使用。增广的本质是注入先验知识,不能为了凑数据量而制造与真实特征矛盾的样本。

6.3 可解释性检查:模型会不会只是拿“信号时长”在分类

模型上线前,我会做一次“线索检查”:把测试样本通过 Grad-CAM 画在时频图上,看模型注意力集中在哪。如果注意力集中在整段时间轴上,而不是调制变化区域,那它可能只是在用脉冲宽度或能量做分类,这是典型的捷径学习。另一种检查是把信号裁剪掉前半段或后半段,看识别结果是否剧烈变化;如果一点都不变,说明模型可能只依赖某个局部强特征,这既有隐患也值得进一步挖掘。可解释性不是写报告用的,是帮人发现模型是否在偷懒的工具。

6.4 部署约束比算法精度更“硬”:时频图计算可能成为瓶颈

最后分享一个我自己的教训。以前我把一个识别准确率不错的 CNN 模型部署到实时处理板卡上,模型推理很快,但时频图生成环节把整条链路卡住了——窗函数、加窗、FFT、对数压缩,在通用处理器上循环实现非常慢,处理实时脉冲流完全跟不上。后面我把时频图预处理改成定点化计算,并在 FPGA 里用流水线实现加窗和 FFT,才把吞吐提上来。这件事让我养成一个习惯:算法设计阶段就估算预处理延迟,不要把时频分析当成免费的“特征转换”。做雷达辐射源识别,算法、数据和工程是三个捆绑在一起的问题,综述给你的是地图,但路还得自己走。希望这些经验能帮你在雷达辐射源识别这个方向上少踩几个坑。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进