# LoRa_RFFI **Repository Path**: hylan-j/LoRa_RFFI ## Basic Information - **Project Name**: LoRa_RFFI - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 47 - **Forks**: 29 - **Created**: 2024-12-15 - **Last Updated**: 2025-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 自述 本课题构建了基于深度学习技术的LoRa射频指纹识别(RFFI)系统。还提供了包含从60个LoRa设备收集的信号的数据集。不同子数据集的详细收集设置可以在章节[数据集描述](#jump1)中找到。[代码示例](#jump2)部分介绍了一些重要函数的用法,详细用法请仔细阅读代码注释。 ## 引用 如果数据集/代码的一部分对您的项目有贡献,请引用: ``` [1] G. Shen, J. Zhang, A. Marshall, and J. Cavallaro. “Towards Scalable and Channel-Robust Radio Frequency Fingerprint Identification for LoRa,” IEEE Trans. Inf. Forensics Security, 2022. ``` ``` @article{shen2021towards, title={Towards Scalable and Channel-Robust Radio Frequency Fingerprint Identification for LoRa}, author={Shen, Guanxiong and Zhang, Junqing and Marshall, Alan and Cavallaro, Joseph}, journal={IEEE Trans. Inf. Forensics Security}, year={2021} } ``` ## 数据集描述 ### 实验设备 实验中包括60种商用LoRa器件(LoPy4,mbed SX1261 shields,FiPy,Dragino SX1276 shields)。下表提供了它们的更多细节。 | 设备索引 | 型号 | 芯片组 | | ------------ | --------------------- | ------- | | 1 - 45 | Pycom LoPy4 | SX1276 | | 46 - 50 | mbed SX1261 shield | SX1261 | | 51 - 55 | Pycom FiPy | SX1272 | | 56 - 60 | Dragino SX1276 shield | SX1276 | 所有的LoRa报文都由USRP N210软件定义无线电(SDR)捕获。 ### 数据集结构 数据集由26个子数据集组成,每个子数据集是一个HDF5文件。每个HDF5文件包含多个LoRa信号(前导部分IQ样本)和相应的设备标签。由于HDF5不支持复数,我们将信号i支路(实部)和q支路(虚部)连接起来,然后保存。下图显示了原始HDF5数据集的结构。 ### 训练数据集 下表总结了每个训练数据集的基本信息。所有训练数据集都是在发射器和接收器之间有视线(LOS)的住宅房间中收集的。 | 训练数据集路径 | 设备 | 每个设备采集的包数 | 增强 | | ----------------------------------------- | ------- | ---------------------------- | ---------------------------------- | | Dataset/Train/dataset_training_aug.h5 | 1 - 30 | 1,000 | Yes, both multipath & Doppler | | Dataset/Train/dataset_training_aug_0hz.h5 | 1 - 30 | 1,000 | Yes, only multipath ($f_d$ = 0 Hz) | | Dataset/Train/dataset_training_no_aug.h5 | 1 - 30 | 500 | No | ### 测试/注册数据集 测试/注册数据集在一个住宅房间、一个办公楼和一个会议室收集。平面图如下图所示: 下表总结了每个测试/注册数据集的基本信息。 | 测试数据集路径 | 设备 | 每个设备采集的包数 | 采集环境 | | --------------------------------------------------- | ------- | ---------------------------- | ---------------------------------------------- | | Dataset/Test/dataset_seen_devices.h5 | 1 - 30 | 400 | Residential room, LOS, stationary | | Dataset/Test/dataset_rogue.h5 | 41 - 45 | 200 | Residential room, LOS, stationary | | Dataset/Test/dataset_residential.h5 | 31 - 40 | 400 | Residential room, LOS, stationary | | Dataset/Test/dataset_other_device_type.h5 | 46 - 60 | 400 | Residential room, LOS, stationary | | Dataset/Test/channel_problem/A.h5 | 31 - 40 | 200 | Location A, LOS, stationary | | Dataset/Test/channel_problem/B.h5 | 31 - 40 | 200 | Location B, LOS, stationary | | Dataset/Test/channel_problem/C.h5 | 31 - 40 | 200 | Location C, LOS, stationary | | Dataset/Test/channel_problem/D.h5 | 31 - 40 | 200 | Location D, NLOS, stationary | | Dataset/Test/channel_problem/E.h5 | 31 - 40 | 200 | Location E, NLOS, stationary | | Dataset/Test/channel_problem/F.h5 | 31 - 40 | 200 | Location F, NLOS, stationary | | Dataset/Test/channel_problem/B_walk.h5 | 31 - 40 | 200 | Location B, LOS, object moving | | Dataset/Test/channel_problem/F_walk.h5 | 31 - 40 | 200 | Location F, NLOS, object moving | | Dataset/Test/channel_problem/moving_office.h5 | 31 - 40 | 200 | LOS, mobile in the office | | Dataset/Test/channel_problem/moving_meeting_room.h5 | 31 - 40 | 200 | NLOS, mobile in the meeting room | | Dataset/Test/channel_problem/B_antenna.h5 | 31 - 40 | 200 | Location B, LOS, stationary, parallel antenna | | Dataset/Test/channel_problem/F_antenna.h5 | 31 - 40 | 200 | Location F, NLOS, stationary, parallel antenna | ## 代码示例 ### 1. 开始之前 #### a) 安装所需软件包 请找到“requirement.txt”文件来安装所需的软件包。 #### b) 下载数据集 请下载数据集并将其放在项目文件夹中,下载链接为 'https://ieee-dataport.org/open-access/lorarffidataset'. #### c) 操作系统 这个项目完全建立在Windows操作系统上。在其他操作系统上可能会出现意想不到的问题。 ### 2. 快速启动 在安装正确版本的软件包并下载数据集后,您可以直接运行‘main.py’文件进行RFF提取器训练/流氓设备检测/分类任务。您可以更改第364行中的变量‘run_for’来指定要执行的任务。例如,如果您将‘run_for’设置为‘ train ’,该程序将训练RFF提取器并保存它。 ### 3. 加载数据集 建议使用我们提供的“LoadDataset”类函数来加载原始HDF5文件。您需要在运行它之前指定数据集路径、设备范围和数据包范围。下面是一个加载HDF5文件的例子: ```python import numpy as np from dataset_preparation import LoadDataset LoadDatasetObj = LoadDataset() data, label = LoadDatasetObj.load_iq_samples(file_path = './dataset/Train/dataset_training_aug.h5', dev_range = np.arange(0,30, dtype = int), pkt_range= np.arange(0,100, dtype = int)) ``` 这个例子将总共提取($10\times100=1000$)个LoRa信号。更具体地说,它将从范围内的每个设备中提取100个数据包。函数‘load_iq_samples’返回两个数组,data和label。data是一个大小为(1000,8192)的complex128数组,label是一个大小为(1000,1)的int32数组。下图展示了这两个数组的结构。 请注意,加载的标签从0开始,而不是1,以适应深度学习。换句话说,设备1被标记为0,设备2被标记为1,以此类推。 ### 4. 生成信道独立频谱图 信道无关谱图有助于减轻接收信号中的信道效应,使LoRa-RFFI系统对信道变化具有更强的鲁棒性。我们提供了将IQ样本阵列转换为信道独立谱图的功能。下面的代码块给出了一个例子: ```python from dataset_preparation import ChannelIndSpectrogram ChannelIndSpectrogramObj = ChannelIndSpectrogram() # The input 'data' is the loaded IQ samples in the last example. ch_ind_spec = ChannelIndSpectrogramObj.channel_ind_spectrogram(data) ``` 返回的‘ch_ind_spec’是一个大小为(1000,102,62,1)的数组。请注意,数组的大小受到STFT参数的影响,这些参数可以在代码中更改。请参阅我们的论文或代码注释,以找到信道无关谱图的详细推导。 ### 5. 训练一个RFF提取器 函数‘train_feature_extractor()’可以使用三元组损失训练RFF提取器。 ```python import numpy as np from deep_learning_models import TripletNet, identity_loss from sklearn.model_selection import train_test_split from keras.callbacks import EarlyStopping, ReduceLROnPlateau from keras.optimizers import RMSprop feature_extractor = train_feature_extractor() ``` 您还可以指定训练数据集路径、训练设备范围、训练数据包范围和增强期间的信噪比范围。否则,将使用默认值。示例如下: ```python feature_extractor = train_feature_extractor(file_path = './dataset/Train/dataset_training_aug.h5', dev_range = np.arange(0,10, dtype = int), pkt_range = np.arange(0,1000, dtype = int), snr_range = np.arange(20,80)): ``` ### 6. 非法设备检测 函数test_rogue_device_detection()执行非法设备检测任务。在运行该函数之前,必须指定RFF提取器路径。请看下面的例子: ```python import numpy as np from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import roc_curve, auc fpr, tpr, roc_auc, eer = test_rogue_device_detection('./models/Extractor_1.h5') ``` 该函数返回假阳性率(FPR)、真阳性率(TPR)、曲线下面积(AUC)和等错误率(EER)。这些都是流氓设备检测任务中重要的评估指标。它们的定义请参考我们的论文。 以下代码行使用返回的结果绘制ROC曲线: ```python import matplotlib.pyplot as plt # Plot the ROC curves. plt.figure(figsize=(4.8, 2.8)) plt.xlim(-0.01, 1.02) plt.ylim(-0.01, 1.02) plt.plot([0, 1], [0, 1], 'k--') plt.plot(fpr, tpr, label='Extractor 1, AUC = ' + str(round(roc_auc,3)) + ', EER = ' + str(round(eer,3)), C='r') plt.xlabel('False positive rate') plt.ylabel('True positive rate') plt.title('ROC curve') plt.legend(loc=4) # plt.savefig('roc_curve.pdf',bbox_inches='tight') plt.show() ``` ### 7. 分类 函数‘test_classification()’执行分类任务。在运行该函数之前,必须指定注册数据集、测试数据集和RFF提取器的路径。这里有一个简单的例子: ```python from sklearn.metrics import accuracy_score from sklearn.neighbors import KNeighborsClassifier import numpy as np pred_label, true_label, acc = test_classification(file_path_enrol = './dataset/Test/dataset_residential.h5', file_path_clf = './dataset/Test/channel_problem/A.h5', feature_extractor_name = './models/Extractor_1.h5') ``` 这个示例返回预测标签、真实标签和总体分类精度。我们可以进一步绘制混淆矩阵来查看细粒度的分类结果: ```python import matplotlib.pyplot as plt import seaborn as sns # Plot the confusion matrix. conf_mat = confusion_matrix(true_label, pred_label) classes = test_dev_range + 1 # xticklabels plt.figure() sns.heatmap(conf_mat, annot=True, fmt = 'd', cmap='Blues', cbar = False, xticklabels=classes, yticklabels=classes) plt.xlabel('Predicted label', fontsize = 20) plt.ylabel('True label', fontsize = 20) ``` ## 许可证 数据集和代码遵循知识共享署名-非商业-相同方式共享4.0国际许可协议。 ## 联系 如果您有任何问题,请联系以下电子邮件地址: gxshen AT seu.edu.cn
Junqing.Zhang AT liverpool.ac.uk