代码实现了隧道衬砌缺陷地质雷达数据深度学习反演。核心流程是:首先通过物理模型模拟生成带有随机缺陷的地质雷达信号数据(包含界面反射、缺陷反射及噪声)及其对应的真实缺陷分布图,构建深度学习所需的数据集。接着,设计了一种生成对抗网络(GAN)与U-Net结合的混合架构,其中U-Net作为生成器,负责从输入的雷达数据中高精度反演出缺陷分布图;一个卷积神经网络(CNN)作为判别器,用于判断缺陷图是真实标签还是生成器的输出,从而驱动生成器提升反演质量。训练过程采用对抗性损失与L1重建损失相结合的方式,交替优化生成器和判别器。训练完成后,系统在独立的测试集上对模型性能进行全面评估,计算均方误差(MSE)、平均绝对误差(MAE)和峰值信噪比(PSNR)等量化指标,并通过可视化对比输入雷达数据、真实缺陷、预测缺陷及误差图,直观展示反演效果。最终,保存训练好的模型并生成系统性能总结报告。

第一步:数据准备。根据隧道衬砌中缺陷的典型物理特征,模拟生成地质雷达的原始信号。在信号中嵌入随机的缺陷反射,并添加一定水平的噪声以模拟真实探测环境。同步生成与每一组雷达信号严格对应的、表示缺陷位置与强度的"真实缺陷分布图",共同构成一个配对的数据集。随后,将数据集随机划分为互不重叠的训练集、验证集和测试集。
第二步:模型构建。设计一个混合神经网络架构。生成器采用具有编码器-解码器结构的U-Net网络,其编码器逐步下采样提取雷达信号的多层次特征,解码器通过上采样和跳跃连接融合深浅层特征,最终输出与输入尺寸相同的缺陷分布图。判别器则是一个深度卷积网络,负责接收"雷达信号与缺陷图的组合",并输出一个判断其为真实样本或生成样本的概率分数。
第三步:对抗训练。进入迭代训练过程。在每一步中,首先用真实数据训练判别器,使其能更好地区分真实缺陷图与生成器伪造的缺陷图。随后,固定判别器,训练生成器:一方面使其生成的缺陷图能"欺骗"判别器(对抗损失),另一方面要求生成的缺陷图在像素级上尽可能接近真实标签(L1重建损失)。两种损失共同引导生成器提升反演精度。此过程在训练集上反复进行多个轮次,并在验证集上监控性能。
第四步:评估与应用。训练完成后,使用完全未参与训练的测试集对模型进行最终评估。通过计算均方误差等量化指标客观衡量反演精度,并通过绘制"雷达信号-真实缺陷-预测缺陷-误差"的对比图,进行定性、直观的效果分析。最后,将训练好的生成器模型保存,形成一个可以接收新地质雷达数据并自动输出缺陷分布图的智能反演工具。

"""
隧道衬砌缺陷地质雷达数据深度学习反演
"""
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader, random_split
import matplotlib.pyplot as plt
import warnings
import os
import time
import gc
from sklearn.metrics import mean_squared_error, mean_absolute_error
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
# 设置随机种子确保可重复性
np.random.seed(42)
torch.manual_seed(42)
if torch.cuda.is_available():
torch.cuda.manual_seed(42)
# 设置计算设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"使用设备: {device}")
# ==================== 第一部分:数据模拟 ====================
class GPRDataset(Dataset):
"""地质雷达数据集类"""
def __init__(self, num_samples=600, time_steps=128, spatial_points=64, noise_level=0.1):
super().__init__()
self.num_samples = num_samples
self.time_steps = time_steps
self.spatial_points = spatial_points
self.noise_level = noise_level
def __len__(self):
return self.num_samples
def __getitem__(self, idx):
np.random.seed((idx * 123) % 10000)
# 1. 生成缺陷分布
defect_map = np.zeros((self.spatial_points, self.time_steps))
# 70%的样本有缺陷
if np.random.random() < 0.7:
center_x = np.random.randint(10, self.spatial_points - 10)
center_t = np.random.randint(15, self.time_steps - 15)
width = np.random.randint(5, 15)
height = np.random.randint(8, 20)
intensity = np.random.uniform(0.7, 1.0)
x_start = max(0, center_x - width // 2)
x_end = min(self.spatial_points, center_x + width // 2)
t_start = max(0, center_t - height // 2)
t_end = min(self.time_steps, center_t + height // 2)
if x_end > x_start and t_end > t_start:
defect_map[x_start:x_end, t_start:t_end] = intensity
# 2. 生成雷达数据
radar_data = np.zeros((self.spatial_points, self.time_steps))
# 界面反射
t0 = 30
for x in range(self.spatial_points):
tx = t0 + abs(x - self.spatial_points/2) * 0.3
tx_idx = min(int(tx), self.time_steps - 1)
# 高斯脉冲
pulse_width = 5
for i in range(-pulse_width, pulse_width + 1):
t_pos = tx_idx + i
if 0 <= t_pos < self.time_steps:
radar_data[x, t_pos] += 0.8 * np.exp(-(i/pulse_width)**2)
# 缺陷反射
defect_positions = np.where(defect_map > 0)
for x, t in zip(defect_positions[0], defect_positions[1]):
amplitude = defect_map[x, t] * 0.4
pulse_width = 3
for i in range(-pulse_width, pulse_width + 1):
t_pos = t + i
if 0 <= t_pos < self.time_steps:
radar_data[x, t_pos] += amplitude * np.exp(-(i/pulse_width)**2)
# 3. 添加噪声
noise = np.random.normal(0, self.noise_level, (self.spatial_points, self.time_steps))
radar_data += noise
# 4. 归一化
radar_data = (radar_data - radar_data.min()) / (radar_data.max() - radar_data.min() + 1e-8)
defect_map = (defect_map - defect_map.min()) / (defect_map.max() - defect_map.min() + 1e-8)
# 5. 转换为张量
radar_tensor = torch.FloatTensor(radar_data).unsqueeze(0)
defect_tensor = torch.FloatTensor(defect_map).unsqueeze(0)
return radar_tensor, defect_tensor
参考文章:
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch) - 哥廷根数学学派的文章
https://zhuanlan.zhihu.com/p/1992956682326790763