CS-INFNet 超详细原理解析(包含RGF + 完整数学公式) 📐 完整数学框架 ...
创建于:2025年10月11日
创建于:2025年10月11日
CS-INFNet 超详细原理解析(包含RGF + 完整数学公式)
📐 完整数学框架
问题定义
去眩光任务可以建模为:
给定: I_flare = I_clean + F(I_clean, L)
其中 F 是眩光函数,L 是光源
目标: 恢复 I_clean
约束: 有配对的NIR图像 I_nir,提供场景结构先验
🔬 RGF (Region-aware Guided Filter) - 污染图生成
RGF基于一个物理观察:
眩光会破坏RGB和NIR之间的梯度一致性,因为眩光主要影响可见光(RGB),而NIR受影响小。
数学定义
梯度一致性 (Gradient Consistency):
C(x, y) = (∇I_rgb · ∇I_nir) / (|∇I_rgb| · |∇I_nir| + ε)
其中:
物理含义:
Step 1: 计算梯度
使用Sobel算子计算梯度:
K_x = [[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]]
K_y = [[-1, -2, -1],
[ 0, 0, 0],
[ 1, 2, 1]]
∇I_x = I ⊗ K_x # 卷积
∇I_y = I ⊗ K_y
RGB梯度 (转为亮度后计算):
L_rgb = 0.299·R + 0.587·G + 0.114·B # 转灰度
∇L_rgb^x = L_rgb ⊗ K_x
∇L_rgb^y = L_rgb ⊗ K_y
NIR梯度:
∇I_nir^x = I_nir ⊗ K_x
∇I_nir^y = I_nir ⊗ K_y
Step 2: 计算梯度方向一致性
dot_product = ∇L_rgb^x · ∇I_nir^x + ∇L_rgb^y · ∇I_nir^y
mag_rgb = √((∇L_rgb^x)² + (∇L_rgb^y)² + ε)
mag_nir = √((∇I_nir^x)² + (∇I_nir^y)² + ε)
consistency = dot_product / (mag_rgb · mag_nir + ε)
值域: consistency ∈ [-1, 1]
Step 3: 不一致性 = 污染
inconsistency = 1.0 - consistency
inconsistency = clamp(inconsistency, 0, 1) # 限制到[0,1]
物理含义:
Step 4: 径向衰减 (Radial Decay)
眩光有径向衰减特性(从光源中心向外衰减):
brightness = max(R, G, B)
(cx, cy) = weighted_centroid(brightness, top_k=5%)
dist(x, y) = √((x - cx)² + (y - cy)²)
max_dist = √(H² + W²)
dist_norm = dist / max_dist # [0, 1]
radial_decay = exp(-dist_norm · α) # α=2是衰减系数
数学形式:
D(x, y) = exp(-α · ||p - c|| / ||p_max - c||)
其中:
Step 5: 综合RGF
RGF = inconsistency · radial_decay · brightness
RGF = (RGF - RGF.min()) / (RGF.max() - RGF.min() + ε)
完整数学表达:
RGF(x,y) = normalize(
(1 - C(x,y)) · D(x,y) · L(x,y)
)
其中:
三个因子的作用:
组合效果: 同时满足三个条件才是强眩光
RGF高 ⟺ 梯度不一致 ∧ 靠近光源 ∧ 高亮度
零样本RGF相关性只有0.717,需要学习提升。
策略: 物理先验 + 神经网络残差
class RGFEnhancedNet:
def forward(self, rgb, nir):
# 1. 零样本RGF(物理先验,冻结)
cx, cy = estimate_center(rgb)
RGF_physics = PhysicalRGF(rgb, nir, cx, cy) # 不可学习
text# 2. 学习残差修正 residual = RefineNet(rgb, nir, RGF_physics) # CNN学习 # 3. 融合 α = sigmoid(learnable_weight) # 可学习融合权重 P_final = RGF_physics + α · residual return clamp(P_final, 0, 1)
数学形式:
P(x,y) = RGF_0(x,y) + α · R_θ(x,y | I_rgb, I_nir, RGF_0)
其中:
训练目标:
min_θ ||P(x,y) - P_gt(x,y)||² + λ₁||R_θ||₁
🏗️ Stage 1: Coarse Restoration Net (粗修复网络)
NAFBlock: 无非线性激活的基础块
传统网络使用ReLU/GELU等激活函数,但NAFNet用SimpleGate替代:
class SimpleGate(nn.Module):
def forward(self, x):
x1, x2 = x.chunk(2, dim=1) # 拆成两半
return x1 * x2 # 元素级相乘
数学形式:
SimpleGate(x) = x[:, :C/2] ⊙ x[:, C/2:]
其中 ⊙ 表示Hadamard积(元素级乘法)
为什么有效?
NAFBlock 完整结构
class NAFBlock(nn.Module):
def forward(self, inp):
x = inp
text# 1. 深度可分离卷积 + SimpleGate x = LayerNorm(x) x = Conv1×1(x) # 升维: C → 2C x = DWConv3×3(x) # 深度卷积 x = SimpleGate(x) # 降维: 2C → C x = SCA(x) # 空间通道注意力 x = Conv1×1(x) # 投影回C y = inp + β · x # 残差连接(可学习权重β) # 2. FFN (Feed-Forward Network) x = LayerNorm(y) x = Conv1×1(x) # C → 2C x = SimpleGate(x) # 2C → C x = Conv1×1(x) # 保持C return y + γ · x # 残差连接(可学习权重γ)
数学表达:
h₁ = x + β · Conv₁(SCA(SG(DWConv(Conv₀(LN(x))))))
y = h₁ + γ · Conv₃(SG(Conv₂(LN(h₁))))
其中:
SCA (Spatial Channel Attention)
class SCA(nn.Module):
def forward(self, x):
# 全局平均池化
attn = AdaptiveAvgPool2d(1)(x) # (B, C, H, W) → (B, C, 1, 1)
text# 通道注意力 attn = Conv1×1(attn) # (B, C, 1, 1) → (B, C, 1, 1) # 应用注意力 return x * attn # 广播乘法
数学形式:
SCA(x) = x ⊙ σ(Conv(GAP(x)))
其中:
核心思想
RGB特征向NIR特征"提问":哪里是真实场景?
class CrossSpectralFusionBlock:
def forward(self, rgb_feat, nir_feat, pollution):
# 1. Query from RGB, Key/Value from NIR
Q = Conv1×1(rgb_feat) # RGB提问
K = Conv1×1(nir_feat) # NIR键
V = Conv1×1(nir_feat) # NIR值
text# 2. 简化注意力(避免N×N矩阵) attn = σ(Q ⊙ K / √C) # 元素级注意力 out = attn ⊙ V # 加权NIR特征 # 3. 残差融合 out = rgb_feat + γ · out # 4. 拼接融合 fused = Conv([rgb_feat, out]) # 5. 污染自适应(关键!) P_resized = resize(pollution, size=(H_feat, W_feat)) fused = P · fused + (1 - P) · rgb_feat return fused
数学表达:
A = σ((Q ⊙ K) / √d_k)
V_attended = A ⊙ V
F_fused = Conv(concat(F_rgb, F_rgb + V_attended))
F_out = P ⊙ F_fused + (1 - P) ⊙ F_rgb
物理直觉:
class CoarseRestorationNet:
def forward(self, rgb_flare, nir, P):
# 输入拼接
x = concat([rgb_flare, nir]) # (B, 4, H, W)
text# 编码器 (4 levels) x0 = Intro(x) # (B, C, H, W) x1 = Encoder₁(x0) # (B, 2C, H/2, W/2) x2 = Encoder₂(x1) # (B, 4C, H/4, W/4) x3 = Encoder₃(x2) # (B, 8C, H/8, W/8) # 跨谱融合(最深层) nir_feat = NIR_Encoder(nir) # 单独处理NIR到相同尺度 x3 = CrossFusion(x3, nir_feat, P) # 解码器 x = Decoder₃(x3) # (B, 4C, H/4, W/4) x = Decoder₂(cat([x, x2])) # Skip connection x = Decoder₁(cat([x, x1])) x = Decoder₀(cat([x, x0])) # (B, C, H, W) # 输出投影 residual = Outro(x) # (B, 3, H, W) # 残差学习 + 污染自适应 rgb_coarse = rgb_flare + P · residual return rgb_coarse, { 'level0': x0, # 多尺度特征(供INR使用) 'level1': x1, 'level2': x2, 'level3': x3 }
关键设计:
🌊 Stage 2: Cross-Spectral INR (跨谱隐式神经表示)
核心思想
将图像看作连续函数而非离散像素网格:
传统方法:
Image = 离散网格 I[h, w] ∈ ℝ^(H×W×3)
INR方法:
Image = 连续函数 f: ℝ² → ℝ³
f(x, y) = RGB值
优势:
SIREN: Sinusoidal Representation Networks
普通MLP难以拟合高频细节,SIREN用sin激活解决:
class SIRENLayer(nn.Module):
def forward(self, x):
return sin(ω₀ · Linear(x))
数学形式:
h_{l+1} = sin(ω₀ · W_l · h_l + b_l)
为什么用sin?
权重初始化(关键!):
W₁ ~ Uniform(-1/n, 1/n)
W_l ~ Uniform(-√(6/n)/ω₀, √(6/n)/ω₀)
原因: 确保sin的输入分布合理,输出在有效范围
坐标(x, y)直接输入MLP表达能力有限,需要频率编码:
γ(x) = [sin(2⁰πx), cos(2⁰πx),
sin(2¹πx), cos(2¹πx),
...,
sin(2^(L-1)πx), cos(2^(L-1)πx)]
数学形式:
PE(p) = [sin(2^0·π·p), cos(2^0·π·p), ..., sin(2^(L-1)·π·p), cos(2^(L-1)·π·p)]
作用:
维度变化:
(x, y) ∈ ℝ²
↓ PE (L=64)
γ(x, y) ∈ ℝ^(2×64×2) = ℝ^256
class CrossSpectralINR(nn.Module):
def forward(self, coords, rgb_feat, nir_feat, pollution):
# 1. 位置编码
pos_enc = PositionalEncoding(coords) # (B, N, 256)
text# 2. 特征投影(统一维度) rgb_emb = Linear(rgb_feat) # (B, N, D) nir_emb = Linear(nir_feat) # (B, N, D) p_emb = Linear(pollution) # (B, N, D/4) # 3. 跨谱融合 fused = CrossSpectralFusion(rgb_emb, nir_emb, pollution) # 4. 拼接条件 siren_input = concat([pos_enc, fused, p_emb]) # 5. SIREN预测RGB残差 rgb_delta = SIREN(siren_input) # (B, N, 3) return rgb_delta
数学完整表达:
PE(p) = [sin(2^k·π·p), cos(2^k·π·p)]_{k=0}^{L-1}
F_rgb' = W_rgb · F_rgb
F_nir' = W_nir · F_nir
P' = W_P · P
A = σ(F_rgb' ⊙ F_nir' / √d)
F_fused = w(P) ⊙ (A ⊙ F_nir') + (1 - w(P)) ⊙ F_rgb'
h₀ = concat([PE(p), F_fused, P'])
h_{l+1} = sin(ω₀ · W_l · h_l + b_l)
ΔI = W_out · h_L
I_fine = I_coarse + ΔI
核心: 污染自适应的注意力机制
class CrossSpectralFusion:
def forward(self, rgb_feat, nir_feat, pollution):
# 1. 轻量注意力
Q = Linear(rgb_feat)
K = Linear(nir_feat)
V = Linear(nir_feat)
textA = σ(Q ⊙ K / √D) # 元素级注意力 V_att = A ⊙ V # 2. 污染自适应权重 w = σ(Linear(pollution)) # (B, N, D) # 3. 自适应融合 fused = w ⊙ V_att + (1 - w) ⊙ rgb_feat # 4. 残差 + 投影 fused = Linear(fused) + rgb_feat return fused
物理直觉:
P → 0 (干净区域):
w → 0, fused ≈ rgb_feat (保留RGB)
P → 1 (强眩光区域):
w → 1, fused ≈ nir_feat (依赖NIR)
INR全图推理太慢,采用误差引导采样:
def selective_sampling(rgb_coarse, rgb_gt, P, N=2048):
# 1. 计算误差
error = |rgb_coarse - rgb_gt|.mean(dim=1) # (B, H, W)
text# 2. 高误差区域 + 眩光区域 high_error_mask = (error > threshold) | (P > 0.5) # 3. 采样N个点 for b in range(B): ys, xs = where(high_error_mask[b]) if len(ys) < N: # 不足N个,随机补充 补充随机点 else: # 超过N个,随机选N个 idx = randperm(len(ys))[:N] ys, xs = ys[idx], xs[idx] # 归一化到[-1, 1] coords = stack([ 2 * xs / (W - 1) - 1, # 注意用(W-1)! 2 * ys / (H - 1) - 1 ]) coords = clamp(coords, -1, 1) # 严格限界 return coords
数学形式:
M(x,y) = 𝟙[||I_coarse - I_gt|| > τ ∨ P(x,y) > 0.5]
S = {(x_i, y_i) | (x,y) ∼ M, i=1..N}
x_norm = 2·x/(W-1) - 1
y_norm = 2·y/(H-1) - 1
关键: 使用(W-1)而非W,确保:
x=0 → x_norm=-1
x=W-1 → x_norm=1 ✓
错误写法 x/W:
x=W-1 → (W-1)/W = 1-1/W < 1 ✗
x=W → 1 (但x=W已越界!)
🎯 损失函数设计
Edge Consistency Loss (边缘一致性)
物理约束: RGB和NIR的边缘应对齐
def nir_edge_consistency_loss(pred_rgb, nir, P):
# 1. 计算梯度
∇pred = Sobel(pred_rgb)
∇nir = Sobel(nir)
text# 2. 梯度方向一致性 consistency = (∇pred · ∇nir) / (|∇pred| · |∇nir| + ε) # 3. 损失 loss = 1 - consistency # 4. 污染加权(眩光区域更重要) loss = P · loss return loss.mean()
数学表达:
L_edge = 𝔼_{x,y}[P(x,y) · (1 - C_edge(x,y))]
C_edge = (∇I_pred · ∇I_nir) / (||∇I_pred|| · ||∇I_nir|| + ε)
Energy Consistency Loss (能量一致性)
物理约束: RGB和NIR的局部能量(亮度)应相关
def nir_energy_consistency_loss(pred_rgb, nir, P):
# 1. 转灰度
pred_gray = 0.299·R + 0.587·G + 0.114·B
text# 2. 局部能量(5×5窗口平均) E_pred = AvgPool5×5(pred_gray) E_nir = AvgPool5×5(nir) # 3. 标准化(确保可比性) E_pred_norm = (E_pred - μ_pred) / (σ_pred + ε) E_nir_norm = (E_nir - μ_nir) / (σ_nir + ε) # 4. L2损失 loss = (E_pred_norm - E_nir_norm)² # 5. 污染加权 loss = P · loss return loss.mean()
数学表达:
L_energy = 𝔼_{x,y}[P(x,y) · ||E_norm(I_pred) - E_norm(I_nir)||²]
E(I) = I ⊗ G_{5×5} (局部能量)
E_norm = (E - μ) / σ (标准化)
L_coarse = L1(rgb_coarse, rgb_gt)
L_fine = L1(rgb_fine, rgb_gt)
L_nir = L1(rgb_pred, rgb_gt) +
λ_edge · L_edge(rgb_pred, nir, P) +
λ_energy · L_energy(rgb_pred, nir, P)
L_total = L_coarse + 2.0 · L_fine + 0.1 · L_nir
数学完整表达:
L_{total} = ||I_{coarse} - I_{gt}||1 +
2·||I{fine} - I_{gt}||1 +
0.1·(||I{pred} - I_{gt}||1 +
0.5·L{edge} +
0.3·L_{energy})
评估去眩光质量(检测幻觉):
def NEC(pred_rgb, nir):
# 1. 计算边缘
edge_rgb = Sobel(pred_rgb)
edge_nir = Sobel(nir)
text# 2. Pearson相关系数 corr = Pearson(edge_rgb.flatten(), edge_nir.flatten()) return corr
数学定义:
NEC = Corr(∇I_{pred}, ∇I_{nir})
= Cov(∇I_{pred}, ∇I_{nir}) / (σ_{pred} · σ_{nir})
解释:
🔄 两阶段训练策略
训练时间表
Epoch 0-29:
# 只训练Coarse Net
loss = loss_coarse + 0.1 · loss_nir
INR参数不更新(但前向传播,loss权重=0)
Epoch 30-100:
# Coarse + INR联合训练
loss = loss_coarse + 2.0 · loss_fine + 0.1 · loss_nir
INR开始真正训练
为什么这样设计?
DDP 配置(关键修复)
错误配置 (导致CUDA非法内存访问):
DDPStrategy(find_unused_parameters=True) # ✗
正确配置:
DDPStrategy(
find_unused_parameters=False, # 关键!
gradient_as_bucket_view=True, # 减少显存拷贝
static_graph=False
)
原因:
解决方案:
loss_fine = INR(...)
if epoch < 30:
loss_fine = loss_fine * 0.0 # 不贡献loss,但有梯度
📊 完整数据流
输入: I_flare (RGB) + I_nir (NIR)
│
├─> [RGF] 污染估计
│ ├─> 梯度一致性: (1 - C)
│ ├─> 径向衰减: exp(-d/d_max)
│ ├─> 亮度加权: · L
│ └─> P (污染图)
│
├─> [Stage 1: Coarse Net]
│ ├─> 输入: concat(I_flare, I_nir)
│ ├─> U-Net编码: 4 levels
│ ├─> 跨谱融合: CrossFusion(RGB_feat, NIR_feat, P)
│ ├─> U-Net解码: 4 levels + skip connections
│ ├─> 残差输出: I_coarse = I_flare + P·R
│ └─> 多尺度特征: {level0, level1, level2, level3}
│
├─> [Stage 2: INR] (epoch ≥ 30)
│ ├─> 误差引导采样: S ~ (error > τ) ∨ (P > 0.5)
│ ├─> 特征采样: F_rgb, F_nir ← grid_sample(features, S)
│ ├─> 位置编码: PE(S) ∈ ℝ^256
│ ├─> 跨谱融合: CrossFusion(F_rgb, F_nir, P)
│ ├─> SIREN: ΔI ← SIREN(PE, F_fused, P)
│ └─> 精修复: I_fine = I_coarse + ΔI
│
└─> [损失计算]
├─> L_coarse = L1(I_coarse, I_gt)
├─> L_fine = L1(I_fine, I_gt)
└─> L_nir = L1 + λ_edge·L_edge + λ_energy·L_energy
输出: I_clean (去眩光图像)
● 🌟 理论扩展: Neural Implicit Radial Field (NIRF)
基于你提供的文档 flare_removal_theory_analysis.md,我补充神经隐式径向场的理论:
方案B: 神经隐式径向场 (NIRF)
这是文档中提到的原创性方案,结合了极坐标思想和NeRF技术:
核心思想
眩光 = 径向场函数
F(r, θ | features) → (intensity, color_shift, blur)
其中:
数学框架
r(x, y) = √((x - cx)² + (y - cy)²)
θ(x, y) = atan2(y - cy, x - cx)
r_norm = r / r_max ∈ [0, 1]
θ_norm = (θ + π) / (2π) ∈ [0, 1]
位置编码 (与CS-INR类似):
PE(r, θ) = [sin(2^k·π·r), cos(2^k·π·r),
sin(2^k·π·θ), cos(2^k·π·θ)]_{k=0}^{L-1}
NIRF MLP:
class NIRF(nn.Module):
def forward(self, r, θ, features):
# 位置编码
pos_enc = PE(r, θ)
text# 拼接条件 input = concat([pos_enc, features]) # SIREN预测 h = SIREN(input) # 输出眩光属性 intensity = sigmoid(h[:, 0]) # [0, 1] density = softplus(h[:, 1]) # [0, ∞) color_shift = tanh(h[:, 2]) # [-1, 1] blur_radius = softplus(h[:, 3]) # [0, ∞) return { 'intensity': intensity, 'density': density, 'color_shift': color_shift, 'blur_radius': blur_radius }
体渲染 (Volume Rendering,借鉴NeRF):
def render_flare(H, W, cx, cy, features):
flare = zeros(H, W, 3)
text# 从内向外累积(沿径向) for r in sorted(unique_radii): # 该半径上的所有点 points = get_circle_points(cx, cy, r) # 查询NIRF props = NIRF(r, θ_points, features) # Alpha合成 alpha = 1 - exp(-props['density'] · Δr) color = props['intensity'] · (1 + props['color_shift']) # 累积 flare[points] = alpha · color + (1 - alpha) · flare[points] # 应用自适应模糊 flare = adaptive_blur(flare, props['blur_radius']) return flare
数学表达 (NeRF风格):
C(x,y) = ∫0^{r{max}} T(r) · σ(r,θ) · c(r,θ) dr
T(r) = exp(-∫_0^r σ(s,θ) ds) # 透明度
σ(r,θ) = MLP_density(r,θ) # 密度
c(r,θ) = MLP_color(r,θ) # 颜色
物理约束损失
L_recon = L1(I - F_nirf, I_gt)
L_radial = 𝔼[ReLU(I(r+1) - I(r))]
L_smooth = TV(F_nirf)
L = L_recon + λ₁·L_radial + λ₂·L_smooth
优势
🔬 与文档方案的对应关系
方案A: 径向梯度一致性
文档提到的梯度方向场方案与RGF类似:
C = (∇I_rgb · ∇I_nir) / (|∇I_rgb| · |∇I_nir|)
grad_angle = atan2(∇I_y, ∇I_x)
radial_angle = atan2(y - cy, x - cx)
consistency = cos(|grad_angle - radial_angle|)
改进: 方向比幅值更鲁棒
方案C: 双路径建模
对应论文中的散射-反射分解:
F_scatter = ScatteringModel(img, nir)
F_reflection = ReflectionModel(img, light_source)
F_total = F_scatter + F_reflection + α·F_scatter·F_reflection
● 📚 总结:核心公式速查表
RGF (Pollution Map)
P(x,y) = normalize((1 - C(x,y)) · D(x,y) · L(x,y))
C(x,y) = (∇I_{rgb} · ∇I_{nir}) / (||∇I_{rgb}|| · ||∇I_{nir}|| + ε)
D(x,y) = exp(-α·||p - c||/||p_{max} - c||)
L(x,y) = max(R, G, B)
Coarse Net (NAFBlock)
SG(x) = x_{[:C/2]} ⊙ x_{[C/2:]}
h = x + β·Conv(SCA(SG(DWConv(Conv(LN(x))))))
y = h + γ·Conv(SG(Conv(LN(h))))
I_{coarse} = I_{flare} + P ⊙ R_θ(I_{flare}, I_{nir}, P)
Cross-Spectral INR
PE(p) = [sin(2^k·π·p), cos(2^k·π·p)]_{k=0}^{L-1}
A = σ(F_{rgb} ⊙ F_{nir} / √d)
F_{fused} = w(P) ⊙ (A ⊙ F_{nir}) + (1 - w(P)) ⊙ F_{rgb}
h_{l+1} = sin(ω_0 · W_l · h_l + b_l)
ΔI = SIREN(PE(p), F_{fused}, P)
I_{fine} = I_{coarse} + ΔI
SIREN权重初始化
W_1 ∼ Uniform(-1/n, 1/n)
W_l ∼ Uniform(-√(6/n)/ω_0, √(6/n)/ω_0)
NIR约束损失
L_{edge} = 𝔼[P · (1 - (∇I_{pred} · ∇I_{nir})/(||∇I_{pred}|| · ||∇I_{nir}||))]
L_{energy} = 𝔼[P · ||E_{norm}(I_{pred}) - E_{norm}(I_{nir})||^2]
L_{total} = L_{coarse} + 2·L_{fine} + 0.1·(L_1 + 0.5·L_{edge} + 0.3·L_{energy})
坐标归一化(关键修复)
x_{norm} = 2·x/(W-1) - 1, \quad x_{norm} ∈ [-1, 1]
x_{norm} = 2·x/W - 1, \quad x_{norm} ∈ [-1, 1-2/W]
请根据文件内的综述 ,批判并且改进我的这个方法,
我认为我的方法:
1 不够合理不够鲁棒
2 理论严谨性和新颖性不足
3 整体两阶段不好,我希望变成单阶段
4 整体方案新颖性不足
希望你和我讨论 ,批判,重构,改进我的方案
希望你能够引用和观摩顶级论文,再给我改进意见
太棒了——你已经把 CS‑INFNet 的物理先验、跨谱(RGB‑NIR)约束、以及隐式表示都揉在了一起。下面我会先做“残酷评审”,逐点指出你方法在鲁棒性、理论、架构与新颖性上的短板;然后给出单阶段、可发表级的重构方案(含可落地的数学定义、损失与训练细节),并对比顶级工作说明改进缘由与可验证性。文中涉及到的现有趋势、数据与评测结论,均可在你上传的综述中对应到具体段落/页码(我会在相应处标注)。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
weighted_centroid(top‑k亮度)
只能应付“单强源”,对多光源/线状光源/离轴鬼影会系统性偏置(ghost 的中心常与光学中心成几何对称,而非与亮度质心一致)。综述中也多次强调“多光源场景”和“光学中心‑对称先验”的必要性(参见 BracketFlare 与光学对称先验,p.5–6;以及多光源合成/恢复策略,Zhou ICCV 2023,p.5)。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)I_obs ≈ I_clean + F(·)
未在单阶段里被共同约束)。目标:把你的物理先验、跨谱对齐与隐式表示内嵌到一个单阶段网络里,同时显式解耦散射(glow)与鬼影(ghost),并以**可学习的“多中心径向场 + 结构张量一致性”**替代 RGF 的脆弱部分。
我们在网络内显式约束:
用结构张量与方向统计替代点式余弦,获取鲁棒一致性与置信度:
再用稳健惩罚(Tukey/Welsch)得到污染分数:
直觉:用方向+各向异性置信度抑制低梯度/饱和的不稳定;比单纯 cos 更鲁棒。该思想与综述中“用方向场/对称几何先验提升鲁棒性”的趋势一致(p.5–6, p.14–15)。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
网络预测 个中心与权重 (允许 ):
同时引入光学中心 ,用于鬼影对称映射 。
这样,多光源/偏轴鬼影就不再被“单中心”假设卡死;也与 BracketFlare 的对称几何一致(p.5–6)。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
在主干中引入极坐标感知 + 可变形注意力,把径向几何直接编码入注意力偏置:
这把你“跨谱融合 + 污染自适应”的想法,内化为单阶段注意力门控,避免 Stage‑2 再来一套采样。
把 SIREN 变成解码端的一个 lightweight 坐标头,而不是第二阶段:
最终输出:
输出头:
损失(端到端):
\small \begin{aligned} \mathcal{L} &= \lambda_1\|I_{\text{clean}}-I_{\text{gt}}\|_1 +\lambda_2\,\text{LPIPS}(I_{\text{clean}},I_{\text{gt}}) \\ &+\lambda_3 \underbrace{\mathbb{E}[w(P_{\text{CSST}})\cdot (1-C_{\text{CSST}})]}_{\text{跨谱边缘一致}(鲁棒)} +\lambda_4 \underbrace{\|\!(I_{\text{obs}}-(I_{\text{clean}}+\hat{F}_{\text{sc}}+\hat{F}_{\text{gh}}))\|\!_1}_{\text{物理重建闭环}} \\ &+\lambda_5 \underbrace{\text{SymmLoss}(\mathcal{L},\hat{F}_{\text{ghost}},\mathbf{o})}_{\text{鬼影对称一致}} +\lambda_6 \underbrace{\text{MonoRad}(\partial_r \hat{F}_{\text{sc}}\!\le\!0)}_{\text{径向单调先验}} \\ &+\lambda_7 \underbrace{\text{Light‑Preserve}(\mathcal{L},I_{\text{clean}})}_{\text{光源保护}} \end{aligned}单阶段训练无需 DDP 未用参数的麻烦;隐式头始终在图内前向与反向。
稳健估计视角
把跨谱一致性作为“方向差的噪声模型”进行M‑估计(Tukey/Welsch),从而对异常梯度(饱和/噪声)下界有解释。
多中心径向势能
是混合指数族,满足对每个中心的径向单调性;对鬼影我们有几何映射 的等距性(L2 保距),因此 SymmLoss 能形成几何一致的下界。
物理闭环约束
让“预测的散射/鬼影”在前向加合意义上可验证,而不是仅靠黑箱残差。
仍需报告 LPIPS/PSNR/SSIM,因为排行榜组合指标强调感知(p.7, p.10–11)。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
你当前设计 | 问题 | 单阶段替换 |
---|---|---|
RGF = (1−C)·D·L | 低纹理/饱和不稳;单中心;易误杀光源 | CSST(方向+各向异性置信) + MC‑NRF(多中心径向势) + 光源检测头 |
Stage‑2 SIREN 细化 + 选择性采样 | 训练/部署复杂、对齐/采样分布漂移 | 单阶段隐式坐标头(SIREN 在主干后端,每像素前向) |
Cross‑Spectral 融合(逐层) | 缺少几何显式性 | PD‑CST(极坐标偏置 + 可变形注意力 + P 门控) |
NIR Edge/Energy Loss | 仅边缘/能量,两者权重手工 | 稳健 CSST Loss + 物理闭环 + 对称几何 + 光源保持(多头一致) |
Brightness 估中心 | 不适用多光源与鬼影 | 光源检测 + 学习的多中心 |
你的 CS‑INFNet 已经把“物理 + 跨谱 + 隐式”三件事串起来了;以上重构把它们揉进同一阶段的主干里,并用结构张量、对称几何、物理闭环与多中心径向场替代脆弱的手工启发式。这样既更鲁棒、更严谨、又满足新颖性与可发表性(并与当前顶级工作的趋势完全对齐,见综述 p.4–6, p.7, p.9–11, p.14–15)。若你愿意,我可以把 CS‑ΔFieldFormer 的最小可复现实验脚本与伪代码模块化写出来(包含 CSST/PD‑CST/PSF 头/对称损失),便于你直接在 Flare7K++/BracketFlare 上跑第一版。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
实际上我的整体流程思路是,因为我是RGB IR 联合去除眩光重建任务,算是first work ,所以我想要根据RGF 得到一个 眩光污染等级map,然后后续重建仅重现污染区域内,并且根据眩光污染的程度去决定IR 参与重建的程度 (整体思路是这样),也算是我整体流程的创新点,当前并没有RGB-IR 联合去除眩光重建的文章和方法流程 ,但你说的很多我确实没考虑到,你能根据我的思路,帮助我设计一个完整的单阶段的方案 以及 告诉我文章该怎么写等 希望你引用顶级论文,并且理论严谨,具有原创性和新颖性
非常感谢你清晰阐述了你的创新点与目标!为了更好地帮你重构成一个理论严谨、创新性强、具备顶会水准的单阶段方法,请再补充以下几点信息:
补充这些内容后,我将以你设定的方向为中心,参考ICCV/CVPR/NeurIPS等最新工作,帮你构建一个完整的单阶段联合RGB-NIR去眩光方案框架,并附带理论支撑、模块设计、损失函数与论文撰写建议。
1 LLVIP+Flare7k 合成数据 作为前期训练,我也有自采 5000+对灰度图像+IR 的眩光数据集
2 可以全神经网络,但是当前RGF 效果很好
3 不考虑
4 暂时只考虑算法
5 自由提出结构改进建议
太好了,有了你给的约束(LLVIP+Flare7K 预训练、自采 5k+ 对灰度+IR、允许全神经网络且希望“只修污染区、并按污染强度自适应使用IR”),我给你一套单阶段、理论自洽、可投稿的 RGB-IR 联合去眩光方案。我会把你原始的 RGF 思路保留并升级为可学习门控,并对齐顶会趋势与评价规范(Flare7K/Flare7K++、MIPI 等),同时明确论文写法与实验清单。所有外部背景和趋势对齐你上传的综述里的论述(我在关键处标注)。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
输入:
主干:基于 U-former/Restormer 风格的轻量 Transformer 编码-解码(便于在 Flare7K/Flare7K++ 上达到 SOTA 量级表现)。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
三个关键头(并行预测,训练时联合优化):
输出:
单阶段“物理闭环”保证了可解释性,也与近年显式分解散射/鬼影的方向一致(SGLFR-Net 思路,但我们不分阶段)。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
你当前 RGF 的核心很棒,但对低纹理、饱和、单中心敏感。我们把它升级为 RGF++(保留你的物理直觉,加入结构张量+多中心径向场+不确定性):
同理得 。方向一致性
再用稳健 M-估计 (Tukey/Welsch)抑制异常:
方向+各向异性置信能显著提升鲁棒性,与综述中“方向/几何先验”趋势一致。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
预测 个中心与权重 :
取代“单中心 top-k 亮度质心”,可覆盖多光源与偏轴鬼影;与 BracketFlare 的光学中心/对称几何一致。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
亮度 ,但仅在光源检测掩膜 外参与加权,避免误杀真实灯源。光源可由小头检测并监督(Flare7K++ 有光源标注)。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
这样既保留你的 RGF 物理先验,又获得统计鲁棒与多光源适应。训练中 端到端学习。
你的核心主张是“污染越重,IR 参与越多”。我们用两专家 + 单调门控的 Mixture-of-Experts 实现:
单调门控(保证 随 非减):
用 约束 ,理论上保证单调:污染越重,IR 越参与;这正是你要的机制(且可证明)。
跨谱注意力与区域门控符合最近多分支/物理先验耦合趋势与排行榜经验(眩光区加权)。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
在重建头旁并行预测
这与 SGLFR-Net“显式两分支”的思想一致,但在单阶段里完成。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
LPIPS 与“眩光区加权”的做法对标 MIPI 2024 排行经验;光源保护与真实场景泛化在 Flare7K++/Zhou ICCV’23 中被重点强调。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
“Single-Stage RGB-IR Deflaring via Robust Flare Prior and Monotone Cross-Spectral Gating”
指标与赛题实践参考综述中 Flare7K/Flare7K++ 与 MIPI 挑战部分。(Flare Removal 研究综述:技术、数据集与评估指标.pdf)
python# x_rgb: [B,3,H,W], x_ir: [B,1,H,W] feat = Backbone(concat([x_rgb, x_ir])) # RGF++ head P_csst = robust_csst_consistency(x_rgb, x_ir) # 结构张量一致 D_multi = multi_center_radial(feat) # 学习到的多中心径向势 L_mask = light_source_detector(feat) # 光源掩膜 P = sigmoid(W1*P_csst + W2*D_multi + W3*maxRGB(x_rgb)*(1-L_mask)) # MoE gating (monotone) a = softplus(a0); b = b0 beta = sigmoid(a*P + b) # experts y_rgb = ExpertRGB(feat_rgb_only(feat)) y_xsp = ExpertXSP(cross_spectral_fusion(feat, x_ir, P)) delta = (1-beta)*y_rgb + beta*y_xsp # explicit heads F_sc = scatter_head(feat) F_gh = ghost_head(feat, optical_center=L_mask.center) y_clean = x_rgb + P*delta # losses L = L1(y_clean, gt) + λ2*LPIPS(y_clean, gt) \ + λ3*region_csst(y_clean, x_ir, P) \ + λ4*L1(x_rgb - (y_clean + F_sc + F_gh), 0) \ + λ5*symmetry(F_gh, L_mask.center) + λ6*mono_rad(F_sc) \ + λ7*light_preserve(L_mask, y_clean) L.backward(); opt.step()
如果你愿意,我可以把 RGF++(CSST+多中心) 与 单调门控 MoE 两个关键子模块的 PyTorch 实现草稿也一起打包出来,直接接到 U-former/Restormer 上就能跑你现有数据。