本项目实现了一个面向无人机射频信号识别的深度学习框架 SE-DCNet,核心思想是融合:
- 1D 时域分支(IQ 序列)
- 2D 时频分支(STFT 图)
- SE 注意力融合模块(自适应重标定融合特征)
同时,仓库提供了多组消融/对照模型(1D-CNN、2D-EfficientNet、ResNet、TCN)以及噪声鲁棒性测试脚本,便于复现实验与对比分析。
SE-DCNet/
├── dataset.py # 数据读取与双分支特征构建(支持训练期随机加噪)
├── model.py # SE-DCNet 与各对照模型定义
├── prepare_labels.py # 按类别扫描数据并生成 train/val/test 标签文件
├── train.py # 训练入口(支持多模型切换)
├── test.py # 分类评估与混淆矩阵生成
├── test_robustness.py # 不同 SNR 下的鲁棒性评估
├── results/ # 已生成的图表结果
└── weight/ # 预训练权重
推荐 Python 3.9+。
安装依赖:
pip install torch torchvision numpy h5py scipy matplotlib seaborn scikit-learn tqdm如果你使用 CUDA,请安装与你 CUDA 版本匹配的 torch/torchvision。
prepare_labels.py 默认从 ./Dataset 扫描类别子目录,目录名需以 T 开头,例如:
Dataset/
├── T10000/
│ ├── xxx.mat
│ └── yyy.mat
├── T10001/
│ └── ...
└── ...
生成的 train.txt / val.txt / test.txt 每行格式为:
绝对路径,类别索引,offset
其中:
绝对路径指向.mat数据文件类别索引为从 0 开始的整数标签offset为采样起始偏移
先按需修改 prepare_labels.py 中的数据根目录,再运行:
python prepare_labels.py脚本会自动按 6:2:2 划分并生成:
train.txtval.txttest.txt
- 分支 A(1D):多层 Conv1D 提取长序列 IQ 时域特征
- 分支 B(2D):EfficientNet-B0 提取 STFT 时频特征(输入改为 2 通道)
- 融合:特征拼接后进入
SEBlock做通道重标定 - 分类器:全连接 + BN + Dropout
DroneNet_1D_Only:仅 1D 分支DroneNet_2D_Only:仅 2D 分支(EfficientNet)DroneNet_ResNet_Only:仅 2D 分支(ResNet18)DroneNet_TCN_Only:仅时域 TCN
train.py 支持命令行切换模型:
python train.py --model SE_Dual
python train.py --model 1D_Only
python train.py --model 2D_Only
python train.py --model ResNet_Only
python train.py --model TCN_Only训练过程中会:
- 自动从
train.txt/val.txt/test.txt推断类别数 - 保存最优权重
best_drone_model_<ModelName>.pth - 输出训练曲线与历史:
<ModelName>_loss.png<ModelName>_acc.png<ModelName>_history.json
python test.py将输出:
- 分类报告(Precision/Recall/F1)
- 混淆矩阵图(默认保存为
confusion_matrix_Dual.png)
python test_robustness.py默认在 SNR [-10, -5, 0, 5, 10] dB 上评估多模型,输出:
robustness_comparison.pngrobustness_results.json- 控制台 LaTeX 表格数据(可直接用于论文)
当前仓库权重位于 weight/:
best_drone_model_CNN_Only.pthbest_drone_model_EfficientNet_Only.pthbest_drone_model_ResNet_Only.pthbest_drone_model_TCN_Only.pthbest_drone_model_SEdual.pth
注意:部分脚本默认从项目根目录加载权重文件名。若你直接使用 weight/ 目录,请任选一种方式:
- 将对应权重复制到项目根目录;
- 修改
test.py/test_robustness.py中的model_path或paths为weight/xxx.pth。
仓库已包含若干可视化结果:
ablation_bar.pngconfusion_matrix_SE-DCNet.pngrobustness_comparison.pngSE-DCNet_acc.pngSE-DCNet_loss.png
请检查:
- 权重是否在脚本指定路径
- 文件名是否完全一致(例如
SEdual与SE_Dual的差异)
train.py 会自动推断类别数,但 test.py / test_robustness.py 中当前写死为 9 类。若你数据集类别数变化,需要同步修改:
class_namesnum_classes
请确认 .mat 文件中包含 IQ 数据键:
- 优先读取
RF0_I/RF0_Q - 否则读取文件前两个键作为 I/Q 通道
如果本项目对你的研究有帮助,欢迎在论文或项目中引用本仓库并注明 SE-DCNet。