图片视频抹除算法总结Inpaint

文章介绍了几种基于深度学习的图像和视频水印去除技术,包括使用部分卷积进行图像修复,通过对抗损失和傅立叶卷积提升修复质量。在视频修复方面,提出了时空变换网络和FuseFormer等方法,利用时空注意力机制和光流信息增强帧间交互和细节恢复。评估指标包括PSNR和SSIM,用于量化修复结果的质量。

基本是从图片抹水印和视频抹水印两个方向

  • Video Inpainting:https://paperswithcode.com/task/video-inpainting
  • Image Inpainting:https://paperswithcode.com/task/image-inpainting

请根据目录查看

图片

Partial Conv

部分卷积层

源自于Image Inpainting for Irregular Holes Using Partial Convolutions这篇paper,部分卷积模型使用的是UNET结构,但将其中的卷积层替换为了部分卷积。其基本思想是对于图片被mask掉的区域进行由外而内的,递进式的修补,浅层网络学习孔洞外围,深层层网络学习孔洞内部,用作者的话来说就是 Our main extension is the automatic mask update step, which removes any masking where the partial convolution was able to operate on an unmasked value. Given sufficient layers of successive updates, even the largest masked holes will eventually shrink away, leaving only valid responses in the feature map.
在这里插入图片描述
注意上面公式里面的W、X、M的shape都是和卷积weight的shape是一样的(尽管X和M的尺寸都要大于W的尺寸,但这个公式只是记录输出一个位置上的值),x’表示的是输出特征图某个位置上的结果,m’表示的是输出特征图某个位置上对应mask的值。简单来说就是这个mask范围内存在不为0的值,输出特征图对应位置就不为0;否则就为0

来看一下pconv代码的实现,上面的X对应input,M对应self.mask,注意代码里的X和M都不再是kernel的shape,而是原始图片的shape。代码的思路是先过一遍卷积,然后再用update_mask把该干掉的部分给干掉,update_mask是和输出特征图一样尺寸的

###############################################################################
# BSD 3-Clause License
#
# Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
#
# Author & Contact: Guilin Liu (guilinl@nvidia.com)
###############################################################################

import torch
import torch.nn.functional as F
from torch import nn, cuda
from torch.autograd import Variable

class PartialConv2d(nn.Conv2d):
    def __init__(self, *args, **kwargs):

        # whether the mask is multi-channel or not
        if 'multi_channel' in kwargs:
            self.multi_channel = kwargs['multi_channel']
            kwargs.pop('multi_channel')
        else:
            self.multi_channel = False  

        if 'return_mask' in kwargs:
            self.return_mask = kwargs['return_mask']
            kwargs.pop('return_mask')
        else:
            self.return_mask = False

        super(PartialConv2d, self).__init__(*args, **kwargs)

        if self.multi_channel:
            self.weight_maskUpdater = torch.ones(self.out_channels, self.in_channels, self.kernel_size[0], self.kernel_size[1])
        else:
            self.weight_maskUpdater = torch.ones(1, 1, self.kernel_size[0], self.kernel_size[1])
            
        self.slide_winsize = self.weight_maskUpdater.shape[1] * self.weight_maskUpdater.shape[2] * self.weight_maskUpdater.shape[3]

        self.last_size = (None, None, None, None)
        self.update_mask = None
        self.mask_ratio =</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值