Auto-Exposure Fusion for Single-Image Shadow Removal——论文阅读

目录

一. 论文介绍

二. 算法框架

三. 细节实现

四. 实验与效果


一. 论文介绍

         本文主要介绍去除阴影的论文《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,得到一个粗略去阴影的图(粗略去阴影的图用I^{0}表示)。

                   对I^{0}进行抖动,就得到了多个I^{0}。论文中的5个I^{0}分别是在I^{0}的基础上分别成一组系数,系数的列表为[0.98. 0.99, 1.00, 1.01, 1.02]。

         (2)通过一个融合网络学习到融合参数,对步骤(1)中的结果进行自动融合,得到无阴影的图片

                    注:融合后的图片和真实的gt用L1_Loss进行监督学习。

                    将上面的I^{0}、阴影图片和mask同时输入FusionNet,网络输出6个通道的mat,这6个通道在通道层面经过softmax()操作后与I^{0}I^{s}相乘,最后相加,得到去掉阴影的图片。曝光融合框架如下图所示:

        (3)通过一个RefineNet进一步去除边界残留

                    虽然通过第二步已经去除了阴影,但是阴影和非阴影的边界有残留,作者采用RefineNet进行优化。RefineNet的框架如下:

                      这里没什么难度,就着重解释L_{db}损失,作者命名为边界监督损失,公式表达如下:

                     \bigtriangledown:拉普拉斯梯度运算;

                     I^{r}:预测无阴影的图片;

                     I^{s}: 阴影图片;

                    I^{*}:grandtruth;

                   I^{m}:mask;

                   作者用\lambda=0.1来平衡L1和L_{db}

                   代码实现:

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模型。计算量偏大,难以部署到移动端;

每天进步一点,一起加油啊!!!

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值