目录
一. 论文介绍
本文主要介绍去除阴影的论文《Auto-Exposure Fusion for Single-Image Shadow Removal》:即自动曝光融合去除阴影的方法。该论文来自2021年的CVPR。
论文地址:https://arxiv.org/abs/2103.01255
开源代码:https://github.com/tsingqguo/exposure-fusion-shadow-removal
二. 算法框架
(1)通过一个网络预测阴影部分的曝光参数,并对曝光进行有规律的抖动;
(2)通过一个融合网络学习到融合参数,对步骤(1)中的结果进行自动融合,得到无阴影的图片;
(3)通过一个RefineNet进一步去除边界残留。
整个过程如下图所示:
三. 细节实现
(1)预测曝光参数,并对预测后的图片进行抖动
上图最左边的模块:阴影图片和mask图片一起输入网络,每张图预测6个参数。由于每张图片有三个通道,所以6个参数对应3个w和3个b。每个通道的像素值*w + b,得到一个粗略去阴影的图(粗略去阴影的图用表示)。
对进行抖动,就得到了多个
。论文中的5个
分别是在
的基础上分别成一组系数,系数的列表为[0.98. 0.99, 1.00, 1.01, 1.02]。
(2)通过一个融合网络学习到融合参数,对步骤(1)中的结果进行自动融合,得到无阴影的图片
注:融合后的图片和真实的gt用L1_Loss进行监督学习。
将上面的、阴影图片和mask同时输入FusionNet,网络输出6个通道的mat,这6个通道在通道层面经过softmax()操作后与
和
相乘,最后相加,得到去掉阴影的图片。曝光融合框架如下图所示:
(3)通过一个RefineNet进一步去除边界残留
虽然通过第二步已经去除了阴影,但是阴影和非阴影的边界有残留,作者采用RefineNet进行优化。RefineNet的框架如下:
这里没什么难度,就着重解释损失,作者命名为边界监督损失,公式表达如下:
:拉普拉斯梯度运算;
:预测无阴影的图片;
: 阴影图片;
:grandtruth;
:mask;
作者用=0.1来平衡L1和
。
代码实现:
class PoissonGradientLoss(nn.Module):
def __init__(self, reduction='mean'):
"""
See **Deep Image Blending** for detail.
"""
super(PoissonGradientLoss, self).__init__()
self.reduction = reduction
def forward(self, source, target, blend, mask):
"""
source:预测无阴影图片
target:阴影图片
blend:grandtruth
mask:mask
"""
f = torch.Tensor([[0, -1, 0], [-1, 4, -1], [0, -1, 0]]).view(1, 1, 3, 3).to(target)
f = f.repeat((3, 1, 1, 1))
grad_s = F.conv2d(source, f, padding=1, groups=3) * mask
grad_t = F.conv2d(target, f, padding=1, groups=3) * (1 - mask)
grad_b = F.conv2d(blend, f, padding=1, groups=3)
return nn.MSELoss(reduction=self.reduction)(grad_b, (grad_t + grad_s))
四. 实验与效果
(1)与其他算法比较
(2)消融实验
(3)实验效果
博主点评:(1)这篇论文,作者的工作比较充实,在前人的基础上进行了整合;
(2)按照作者的方法去阴影,则需要4个网络:阴影检测模型、曝光参数估计模型、阴影融合模型、边界RefineNet模型。计算量偏大,难以部署到移动端;
每天进步一点,一起加油啊!!!