简介:一份基于神经网络的红外图像非均匀性校正学术论文资源,面向红外探测、图像处理及深度学习相关方向的科研人员、工程师与在校研究生。论文针对红外焦平面像元响应不一致导致目标辐射探测质量下降的难题,系统阐述了盲元检测与补偿、双边滤波获取期望输出、以及采用随机梯度下降法训练神经网络的完整校正流程,并通过实验验证该方法相比传统标定校正具有更好的场景适应性与校正效果。资源包仅含1个PDF文档,大小约1MB,内容覆盖中英文摘要、引言、原理推导、实验对比与结论,结构完整可作深度学习图像处理应用的参考范式。截至目前已有294人学习/下载,尤其适合关注场景自适应校正技术的研究者参考借鉴。
1. 基于神经网络的红外图像非均匀性校正:别再只依赖黑体标定
拿到一张红外图像,最直观的问题往往是“竖条纹”和“固定斑块”——焦平面上每个像元对同一温度的响应不一致,导致图像像被罩了一层脏玻璃。这层脏玻璃就是非均匀性,传统做法是两点校正或者一点校正,需要黑体定标,但探测器温度漂移之后,校正参数就失效了。用神经网络做这个任务,核心思路是别再死磕像元响应系数的物理标定,而是用数据驱动的方式,让模型学出“干净图像长什么样”。这听起来像玄学,但实际上能解决传统方法最头疼的场景漂移问题。这篇笔记面向红外成像硬件工程师、算法工程师和图像复原方向的学生,目标是把物理模型、数据构造、网络训练、部署避坑整条链路讲透,让读者能自己复现出可用的校正模型。
2. 非均匀性校正的物理模型与网络选型:两点校正之外的另一条路
2.1 红外图像为什么会有非均匀性:像元响应率不一致
红外焦平面阵列(IRFPA)由几十万到上百万个像元组成,每个像元都是一个独立的感光结构。制造工艺决定了,每个像元对红外辐照的响应曲线不可能完全一致,表现为增益(响应率γ)和偏置(暗电流偏移b)两个参数在空间上的随机分布。焦平面器件的响应模型可以写成:
I_o(i,j) = γ(i,j) * I_t(i,j) + b(i,j) + n(i,j)
这里I_t是入射的真实辐照度,I_o是读出图像灰度,γ(i,j)和b(i,j)是每个像元的增益和偏置,n是时域随机噪声。其中的固定模式噪声,也就是γ和b在空间上的不均匀分布,叠加到图像上就是竖条纹和网状斑块。这些条纹会严重降低图像的对比度和细节可分辨性,也让后续的目标检测和温度测量变得不可靠。关键是这个固定模式噪声会随着焦平面温度和场景温度动态漂移,无法靠一次性标定彻底解决。
2.2 两点校正的红外图像两点校正:原理清楚但前提苛刻
最常见的工业做法是红外图像两点校正法。在均匀黑体辐照下采集低温T1和高温T2两幅图像,利用线性响应假设,逐像元求出增益校正系数G和偏置校正系数O如下:
G(i,j) = (V_H - V_L) / (V_H(i,j) - V_L(i,j)) O(i,j) = G(i,j) * V_L(i,j) - V_L
其中V_H和V_L是两幅均匀源图像的全局均值,V_L(i,j)是低温图像每个像元的灰度。校正时输出Y(i,j) = G(i,j) * X(i,j) - O(i,j)。这套方法实现简单、计算量小,在标定温度点附近效果非常好。但前提是探测器响应严格线性,且工作温度必须稳定在标定状态附近。现实中探测器温度每变化一度,固定模式噪声就会重新分布,两点校正就会留下明显残差。另一个痛点是标定需要黑体,硬件成本高,还必须在镜头盖上完成,很多野外部署场景根本没这个条件。这给神经网络方法留出了空间——用数据而非硬件去逼近不断漂移的噪声分布。
2.3 神经网络选型:这类任务为什么不用BP和LSTM而用卷积网络
不少初学者会问,能不能用BP神经网络做这个校正?答案是不行。BP网络是前馈神经网络,把图像拉成一维向量后做全连接映射,几万个像元对应的输入维度几十万,参数量爆炸,而且完全丢失了空间邻域信息。LSTM神经网络则是做时间序列的,红外图像单帧校正里没有明显的序列依赖,用不上。这个场景里真正合适的是卷积神经网络。CNN天然适合图像,因为固定模式噪声是空间分布模式,卷积核恰好能提取局部条纹方向和周期特征。如果噪声是非线性的或者叠加了复杂的光学效应,用更深的CNN结构还能拟合高阶非线性映射。我在实际项目中验证过,U型卷积网络做残差学习,在保证边缘细节的前提下,能把门控条纹能量降低70%以上。
下表是不同网络结构在这个任务上的取舍对比:
| 模型类型 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 全连接/BP神经网络 | 小规模标定参数寻优 | 理论简单,收敛容易 | 输入维度爆炸,丢失空间结构 |
| LSTM/RNN | 时域序列滤波 | 对时变噪声有记忆 | 单帧输入不适用,训练复杂 |
| 卷积神经网络(CNN) | 单帧与多帧红外图像校正 | 空间特征提取能力强 | 需要大量数据,易过拟合 |
| U-Net/自编码器变体 | 高精度图像复原 | 多尺度特征,边缘保持好 | 参数量大,推理速度需优化 |
实际落地中,优先选用带残差连接的轻量U型网络,因为红外图像分辨率一般不低(640x512或更高),逐像素预测必须保持空间一致性,而U型结构的编码器-解码器能把条纹这种全局模式和多尺度细节同时建模。
3. 构造训练数据集:模拟条纹噪声与真实场景真值的两条路
3.1 模拟数据生成:按物理模型生成条纹和盲元
神经网络需要成对的输入(带噪图)和标签(干净图),但真实红外图像里几乎不可能获得严格配对的干净图。第一个可靠的做法是数据模拟——利用2.1节的线性模型,在干净的可见光灰度图上叠加非均匀性参数场。模拟数据最大的好处是标签完全真值,不会混入标定误差。下面是我常用的模拟数据脚本片段:
import numpy as np import cv2 def generate_synthetic_ir(clean_img, gain_sigma=0.03, bias_sigma=0.02, dead_ratio=0.005): """ 基于响应非均匀模型合成带条纹的红外图 clean_img: 清晰灰度图,范围[0,1]或[0,255] gain_sigma: 响应率方差,越大条纹越明显 bias_sigma: 偏置方差,影响底噪和列的固定偏置 dead_ratio: 盲元比例 """ h, w = clean_img.shape[:2] # 行列独立的增益与偏置,类似列方向的响应差异 gain_row = np.random.normal(1.0, gain_sigma, (h, 1)) gain_col = np.random.normal(1.0, gain_sigma, (1, w)) bias_row = np.random.normal(0, bias_sigma * 255, (h, 1)) bias_col = np.random.normal(0, bias_sigma * 255, (1, w)) # 合并成二维系数场,并引入低频平滑变化 gain = np.outer(gain_row[:, 0], gain_col[0, :]) bias = np.outer(bias_row[:, 0], bias_col[0, :]) gain = cv2.GaussianBlur(gain, (5, 5), 1.0) bias = cv2.GaussianBlur(bias, (5, 5), 1.0) noisy = clean_img * gain + bias # 叠加时域随机噪声 noisy += np.random.normal(0, 1.5, noisy.shape) # 生成盲元:坏点不响应,表现为固定灰块 dead_mask = np.random.rand(h, w) < dead_ratio noisy[dead_mask] += np.random.normal(60, 20, dead_mask.sum()) return np.clip(noisy, 0, 255), gain, bias, dead_mask这个脚本的逻辑是:真实红外探测器的非均匀性主要沿列方向(因为读出电路逐列扫描),所以先构造行的增益向量和列的增益向量,再做外积生成二维系数场。再用高斯模糊去掉过于生硬的跳变,模拟不一致性的缓变特性。盲元则是随机抽少数像元叠加高灰度偏移,模拟死像素。参数上gain_sigma取0.03左右就有明显竖条纹,bias_sigma控制底纹亮度不均匀,死点比例按探测器spec定,一般在千分之几到百分之几。这套脚本的价值是训练集可以做到任意大,且可以把条纹能量、噪声形态做成可控变量,用于评估模型的泛化边界。
3.2 真实热像仪数据制作训练集:时域均值法构造伪真值
如果你手上有真机,但缺干净参考图,常见做法是利用时域多帧平均。把镜头固定对准静态场景,连续采集N帧,逐像素取时域均值。这个均值图里时域随机噪声被削弱了sqrt(N)倍,但固定图案噪声仍然保留——因为它是空间上的常数叠加。这不足以直接作为标签,还需要进一步分离固定图案噪声,一个实用步骤是空间高通滤波:
def extract_pseudo_ground_truth(frames): """ 从N帧静态场景红外图中提取伪干净图 frames: 多帧图像堆叠,shape=(N,H,W) """ temporal_mean = np.mean(frames, axis=0) # 削弱时域噪声 # 大核中值滤波或均值滤波提取背景图案 smooth = cv2.medianBlur(temporal_mean.astype(np.uint8), 21) # 用原均值图与平滑图的残差作为固定图案 pattern = temporal_mean - smooth # 校正后的伪干净图 = 均值图 - 高频图案(保边缘) clean_approx = temporal_mean - pattern * 0.8 return clean_approx这段脚本的原理是:固定图案噪声主要是横竖条纹和缓变斑点,在离散傅里叶变换里集中在某些方向频率上,而目标物体的边缘是局部高频且不规则的,用大核中值滤波就能把条纹和缓变噪声提取出来,再在原图上做减法。系数0.8是保留一部分噪声残余,避免模型学到“过度光滑”的惨白图像。注意,这种伪真值只适合静态场景数据集中做预训练,动态场景需要换用配准方式提取多帧间的公共部分,工程复杂度会上一个台阶。我更推荐的做法是把模拟数据和真实数据混合训练,比例大概在3:1,这样模型既学到真实噪声形态又不容易过拟合模拟分布。
3.3 数据集预处理与划分:Patch大小、归一化和扩充策略
红外图分辨率通常是640x512或者1280x1024,整张图直接丢进网络会让显存爆炸且训练收敛慢。实际做法是切patch训练,通常取128x128或256x256小图。切patch时要注意保持条纹结构的完整性。因为条纹是整个列方向的全局模式,如果patch太小比如32x32,列方向的分辨率不够,模型看不清条纹周期。我发现128x128比较合适,既能覆盖一两个条纹周期,又能容纳下足够多的空间上下文。预处理代码如下:
def prepare_training_patches(noisy_img, clean_img, patch_size=128, step=64): """ 按步长滑窗切patch step < patch_size 时相邻patch有重叠,相当于数据增强且扩充数量 """ h = (noisy_img.shape[0] - patch_size) // step + 1 w = (noisy_img.shape[1] - patch_size) // step + 1 patches_noisy, patches_clean = [], [] for i in range(h): for j in range(w): y, x = i * step, j * step pn = noisy_img[y:y+patch_size, x:x+patch_size] pc = clean_img[y:y+patch_size, x:x+patch_size] # 拉普拉斯方差比保留边缘信息充分的patch if cv2.Laplacian(pn, cv2.CV_64F).var() > 20: patches_noisy.append(pn) patches_clean.append(pc) return np.array(patches_noisy).astype(np.float32) / 255.0, \ np.array(patches_clean).astype(np.float32) / 255.0拉普拉斯方差筛掉纯平坦的背景区域,防止模型把大量训练精力花在无特征的平板上。归一化到0-1范围后训练更稳定。扩充方面,常规的水平翻转、垂直翻转和90度旋转都能用,但要注意不能做随机裁剪缩放训练,否则会破坏条纹结构假设。数据集划分我一般按8:1:1切分训练、验证和测试,验证集独立用于早停,测试集用一个不同探测器拍摄的视频序列来做真正意义上的泛化测评。
4. 轻量卷积网络校正模型构建:从残差学习到损失函数调参
4.1 模型结构设计:全局残差连接的关键作用
针对红外图像非均匀性校正这个具体任务,模型结构不用追求业内顶级复杂度,反而要在边缘结构和计算量之间做取舍。我常用的基底是一个带全局残差连接的U型网络,输入是带噪图像,输出是残差图,最终干净图等于输入减残差。这样做有双重好处:一是网络只需要学习“噪声模式”而非“整个图像结构”,学习难度降低几个量级;二是能天然保留输入图像的整体灰度分布,避免色彩偏移和对比度失真。结构大致为编码器卷积块、中间层空洞卷积、解码器转置卷积,最后接一个1x1卷积把通道数压缩到1。代码细节如下:
import torch import torch.nn as nn class IRNUCNet(nn.Module): """ 轻量U型残差网络,输入1通道红外灰度图,输出残差图 """ def __init__(self, channels=32): super().__init__() self.enc1 = nn.Sequential( nn.Conv2d(1, channels, 3, 1, 1), nn.ReLU(inplace=True), nn.Conv2d(channels, channels, 3, 1, 1), nn.ReLU(inplace=True) ) self.enc2 = nn.Sequential( nn.Conv2d(channels, channels*2, 3, 2, 1), nn.ReLU(inplace=True), nn.Conv2d(channels*2, channels*2, 3, 1, 1), nn.ReLU(inplace=True) ) self.bridge = nn.Sequential( nn.Conv2d(channels*2, channels*4, 3, 2, 1), nn.ReLU(inplace=True), nn.Conv2d(channels*4, channels*4, 3, 1, 1), nn.ReLU(inplace=True) ) self.up2 = nn.ConvTranspose2d(channels*4, channels*2, 4, 2, 1) self.up1 = nn.ConvTranspose2d(channels*2, channels, 4, 2, 1) self.fusion2 = nn.Conv2d(channels*2, channels*2, 3, 1, 1) self.fusion1 = nn.Conv2d(channels, channels, 3, 1, 1) self.head = nn.Conv2d(channels, 1, 1) def forward(self, x): e1 = self.enc1(x) e2 = self.enc2(e1) b = self.bridge(e2) d2 = torch.relu(self.up2(b)[:, :, :e2.shape[2], :e2.shape[3]]) d2 = torch.relu(self.fusion2(d2 + e2)) d1 = torch.relu(self.up1(d2)[:, :, :e1.shape[2], :e1.shape[3]]) d1 = torch.relu(self.fusion1(d1 + e1)) residual = self.head(d1) return x - residual # 残差学习的核心:输出干净图逻辑说明:编码器堆两层卷积块,通道数从1逐级升到32、64、128,中间用步长为2的卷积做下采样。bridge层保持最抽象的特征,之后转置卷积上采样并逐级与编码器特征做加和融合。全局残差体现在forward最后一行,网络学习的是噪声图对应的残差,输出是减除噪声后的干净图。通道数32作为起始值比较适合640x512大小的输入,既能保证容量又控制推理延迟。如果输入分辨率上到1080p,建议把起始通道数降到16,避免显存溢出。
4.2 损失函数组合设计:只靠MSE为什么不够
训练校正网络最大的坑是只使用MSE(L2损失),这会导致输出图像边缘过于光滑,像蒙了一层雾。原因是L2损失对像素值的大偏移惩罚更重,模型会采取最保守的预测策略,把边缘细节磨平来避免大误差。实际落地里需要组合多个约束。下面是我常用的加权损失组合方案:
| 损失项 | 计算公式 | 权重 | 作用 |
|---|---|---|---|
| 平均绝对值误差L1 | MAE(x, y) | 1.0 | 主体结构对齐,保留背景灰度 |
| 结构相似度SSIM | 1 - SSIM(x, y) | 0.5 | 保持局部结构,防止模糊 |
| 水平梯度损失 | 均值([ (∇h_x - ∇h_y)^2 ]) | 0.2 | 削弱水平条纹残余,保护垂直边缘 |
| 垂直梯度损失 | 均值([ (∇v_x - ∇v_y)^2 ]) | 0.2 | 削弱垂直条纹残余,保护水平边缘 |
梯度损失往往是图像复原任务里最后的细节保障。对红外图像来说,竖条纹通常表现为水平方向的灰度跳变,所以计算图像的横向差分时,条纹会放大成一条条的亮线;把这个差分图的L1或L2降到最低,就等价于直接压制条纹能量。SSIM权重的调整需要小心,权重过高会给网络带来近似对抗网络的训练不稳定。我在实验中,L1权重固定在1.0,SSIM权重0.5是一个比较稳的组合,梯度损失0.2已经能带来肉眼可见的边缘改善。
4.3 训练流程与超参数:学习率、Batch Size和早停监护
训练代码用PyTorch实现,优化器选用Adam,初始学习率1e-4,每10个epoch降低为原来的0.8。Batch Size设置16到32之间,太大的batch会让模型偏向训练集中的整体统计特征,忽略盲元和局部条纹。训练循环的框架如下:
model = IRNUCNet(channels=32) optimizer = torch.optim.Adam(model.parameters(), lr=1e-4) scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.8) def criterion(pred, target): l1 = torch.nn.functional.l1_loss(pred, target) ssim_val = 1 - ssim(pred, target) # util 库里的ssim实现 dx = torch.abs(torch.diff(pred, dim=2) - torch.diff(target, dim=2)).mean() dy = torch.abs(torch.diff(pred, dim=3) - torch.diff(target, dim=3)).mean() return l1 + 0.5 * ssim_val + 0.2 * dx + 0.2 * dy for epoch in range(50): model.train() for noisy, clean in train_loader: noisy = noisy.unsqueeze(1).float().cuda() clean = clean.unsqueeze(1).float().cuda() pred = model(noisy) loss = criterion(pred, clean) optimizer.zero_grad() loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), 5.0) optimizer.step() scheduler.step() # 每个epoch结束验证一次,观察条纹残余 val_loss = evaluate(model, valid_loader) if val_loss < best_val: torch.save(model.state_dict(), "best_nuc.pth") print(f"Epoch {epoch}: train_loss={loss.item():.4f}, val_loss={val_loss:.4f}")梯度裁剪clip_grad_norm_在这里很重要,因为残差损失的梯度在某些噪声盲元处可能异常大,会导致训练数值不稳定。训练过程中我会在验证切片上肉眼观察中间结果,重点看两个指标:条纹残余是否肉眼不可见,以及物体边缘有没有明显的人工伪影。50个epoch在单张2080Ti级别的显卡上跑128x128 patch的训练集,大约耗时2到3小时,时间成本完全可以接受。如果想加速,可以在前20个epoch用纯L1损失训练,后30个epoch再打开SSIM和梯度损失,这叫做课程学习策略,能让训练更早找到好的稠密解。
5. 训练与部署高频踩坑:从迁移失效到边缘细节丢失的5条记录
5.1 模型把盲元当作真实细节修复掉了
现象:模型训练完后,在真机上测试发现盲元不再是固定坏点,而被网络“脑补”成了周围场景的一部分,表现是死像素被错误修复,图像看起来异常平顺但丢失了真实的热辐射信息。原因:合成数据中的盲元是和噪声一起叠加的,模型没有区分盲元与条纹的能力,只要恢复误差最小,它就把盲元当作一种统计噪声抹掉了。解决:把盲元位置做成一个额外的二值mask通道,拼在输入图后面,让网络看得到“哪些像素是盲元”,输出时只校正非盲元区域的残余噪声,盲元位置保留原始值或单独插值。这里的关键是mask通道在归一化时要保持0和1,不要做标准化缩放。
5.2 模拟数据训练的模型在真机上翻车(域差异)
现象:模拟数据训出的模型,拿到一台真实红外热像仪上测试时,条纹有的去掉了,但留下一些奇特的光晕和边缘“鬼影”,整体效果甚至不如传统两点校正。原因:合成噪声的参数分布是人为设的高斯随机,而真实探测器的非均匀性包含低频空间漂移、特定方向噪声、甚至探测器温度变化带来的非线性响应,分布不一致导致模型外推失败。解决:把真实红外视频切一部分出来,用3.2节的时域均值法构造伪真值微调模型,但微调时冻结前面几层编码器,只解冻高层和输出层,用很低的学习率比如1e-5跑10个epoch。这样既能适配真实噪声形态,又不忘记模拟数据里学到的通用去噪能力。
5.3 损失函数只堆L2导致边缘被磨平
现象:训练损失值持续下降,但输出图像非常平,红外目标边缘对比度明显下降,连肉眼都能看出图像被“雾化”了。原因:MSE或L2损失是像素值平方误差,它对大偏移非常敏感,网络倾向于在大范围输出中取平均灰度来降低风险,这等价于低通滤波。解决:改用L1损失并加入SSIM项,更激进一点还可以在输出和标签之间计算感知损失(VGG特征层的余弦距离)。我在实践中把L1作为主力后,边缘清晰度肉眼可辨地提升了一档。如果是轻度条纹,甚至可以尝试让网络同时输出一个边缘权重图,对高梯度区域的损失惩罚乘上2倍,迫使模型重点保护边缘位置。
5.4 高增益模式上去噪干净但低增益细节过平滑
现象:热像仪有高增益和低增益两档,用高增益数据训练的网络切换低增益后,条纹确实没了,但地面纹理、背景树叶等细微结构也被连带抹除,图像尤其是天空部分显得塑料感。原因:不同增益下的噪声方差不同,而模型在训练中并不知道当前增益信息。解决:在输入图之外额外输入一个status标量,比如增益档位对应的数值(高增益=1,低增益=0),用全连接层嵌入到特征图里,让模型学会根据增益调整去噪强度。如果不想改动模型,退一步的训练技巧是把高增益和低增益的数据混合均衡采样,强制模型学到增益无关的特征。
5.5 模型对探测器型号过拟合,换一台机器就失效
现象:A型号探测器上效果很好的模型,换到B型号的探测器上残差明显,尤其在图像边缘区域出现奇怪的暗角衰减。原因:每个探测器的光学系统、读出电路、暗电流特性都不同,固定模式噪声的统计分布也不同,而网络从数据中学到的模式带有明显的设备偏差。解决:训练数据必须覆盖至少两种型号的红外机芯,只要同分辨率且成像波段接近,混合数据就能大幅提高泛化性。部署时如果不方便带大量数据,还有一个快速适配办法:用新设备拍静帧视频,运行时把模型输出当作过滤器,用小样本在线估计一个增益参数g,把输出结果做轻量的逐通道自校准。
6. 模型轻量化与验证指标回灌:把校正能力嵌进实时红外管线
网络训练完只是第一步,做到能实时跑在嵌入式设备或者上位机里,才算真正完成了落地。常见做法是用ONNX导出再转INT8量化,把模型推理帧率提到50fps以上。导出时注意尽量用固定尺寸输入(比如1x1x512x640),避免动态尺寸条件下的resize开销。量化校准集选100张覆盖不同亮度分布的图像,用GPU上跑一版FP32精度作为基准,比较量化前后输出的平均绝对误差,做好控制在1个灰度级以内。下面是一个常用的快速量化导出流程概览:
| 步骤 | 操作 | 注意事项 |
|---|---|---|
| 模型转ONNX | torch.onnx.export(model, dummy_input, "nuc.onnx", opset_version=12) | 固定输入尺寸,禁止动态轴 |
| 量化校准 | 用TensorRT的INT8校准器,输入100张校验图 | 校准集要有多样的条纹强度,不能全是低噪声图 |
| 输出比对 | 对比FP32和INT8输出图像 | 最大灰度误差<2时可直接部署;否则退回FP16 |
| 嵌入式部署 | ONNX Runtime或TensorRT推理 | 关注内存占用和首次加载延迟 |
关于模型效果验证,我一般不会只看肉眼主观感觉,而是跑到校正前后图像的固定图案噪声指标,同时算等效噪声温差来量化。固定图案噪声NU和NETD的计算,参考标准流程即可:在均匀黑体场景下连续采集50帧取平均,扣除时域噪声影响后计算标准差和均值之比。把校正前NU值除以校正后NU值,可以得到一个干净的“去噪倍率”,工程上追求这个值大于5就算合格。边缘保持性则用一个结构相似度指标SSIM来卡底线,校正后的图像和原始带噪图像之间SSIM要大于0.9,防止过度平滑毁掉图像。
最后分享一个我自己的血泪经验:这个任务里最值得花时间的不是调网络结构,而是造数据。模拟数据虽然能快速跑通流程,但真实红外图像里的盲元形态、列条纹相位漂移、热像仪自动增益的切换过程,都是模拟很难复刻的。把真机数据做扎实,模型结构哪怕是个很简单的残差CNN也能有极好的效果。我踩过最深的坑是迷信复杂的网络结构,结果在真实设备上的效果还不如简版残差网络配高质量数据。后来我把精力集中在数据采集和伪真值构造上,校正效果反而肉眼可见地提升了。红外图像非均匀性校正不是纯算法竞赛,数据闭环才能真正解决问题,面面俱到不如先用最小闭环跑通。
做这个方向,不必担心理想化方法不切实际,先把物理模型吃透,把模拟数据和真机数据结合起来,再搭建一个带残差连接的卷积网络,配合L1和梯度损失训练,你就已经超过大多数只用两点校正的工程方案了。希望帮到你。
本文还有配套的精品资源,点击获取