去除摩尔纹,治愈强迫症, 来卷网盘赛

采用多尺度bandpass 卷积神经网络(MBCNN)来去除摩尔纹。
Image Demoireing with Learnable Bandpass Filters, CVPR2020

一、背景

数字屏幕在现代日常生活中无处不在:我们在家里有电视屏幕,在办公室有笔记本电脑/台式机屏幕,在公共场所有大尺寸LED屏幕。拍摄这些屏幕的图片以快速保存信息已成为一种惯例。然而,在对这些屏幕拍照的时候通常会出现波纹图像,从而降低了照片的图像质量。当两个重复的图案相互干扰时,出现摩尔纹图案。在拍摄屏幕图片的情况下,相机滤色镜阵列(CFA)会干扰屏幕的亚像素布局。

python 去摩尔纹 如何去摩尔纹_计算机视觉

与去噪、去马赛克、颜色恒定、锐化等其他图像修复问题不同,人们对图像去伪存真(demireing)的关注较少,它是指从被摩尔纹污染的图像中恢复基本的干净图像。这个问题在很大程度上仍然是一个未解决的问题,由于摩尔纹图案在频率、形状、颜色等方面的巨大变化。

二、模型设计

华为方舟提出了一种新颖的多尺度bandpass 卷积神经网络(MBCNN)来解决这个问题。作为端到端解决方案,MBCNN分别解决了两个子问题。对于纹理恢复子问题,提出了一个可学习的带通滤波器(LBF),以了解去除摩尔纹之前的频率。对于颜色恢复子问题,提出了两步色调映射策略,该策略首先应用全局色调映射来校正全局色彩shift,然后对每个像素执行颜色的局部微调。

数码相机捕获的含摩尔纹的图像可以建模为:

python 去摩尔纹 如何去摩尔纹_深度学习_02

python 去摩尔纹 如何去摩尔纹_深度学习_03

其中ψ-1是ψ的反函数,在图像处理领域被称为色调映射函数。以此模型建模,图像去摩尔纹任务可以分为两步,即摩尔条纹去除和色调映射。

1、Multiscale bandpass CNN

1.1、 Multi-Branch Encoder

整体的模型在三个scales上工作,并具有三种不同类型的blocks,分别是波纹纹理去除块(MTRB),全局色调映射块(GTMB)和局部色调映射块(LTMB)。

python 去摩尔纹 如何去摩尔纹_深度学习_04

首先将具有h×w×c形状的输入图像I可逆地向下采样为四个h/2×w/2×4c形状的子图像。下面的网络由三个分支组成,每个分支用于恢复特定比例的波纹图像,同时每个分支顺序地执行摩尔纹去除和色调映射,最终输出放大后的图像,并将其融合到更小比例的分支中。在分支I和II中,将当前分支的特征和较粗的缩放分支的输出特征融合后,将其他GTMB和MTRB堆叠在一起,以消除缩放比例引起的纹理和颜色错误。

1.2、Moire texture removal

摩尔纹可以表示为:

python 去摩尔纹 如何去摩尔纹_数据集_05

按照这种公式,我们可以先估计不同尺度和频率的波纹纹理的分量,然后基于所有估计的分量重建波纹纹理。Block-DCT是处理频率相关问题的有效方法。

python 去摩尔纹 如何去摩尔纹_paddlepaddle_06

其中D表示Block-DCT函数。

Learnable Bandpass Filter

受隐式DCT的启发,可以用深度CNN直接估计 implicit frequency spectrum(IFS) 。由于变换都是线性的,因此可以用一个简单的卷积层来建模。由于Moire纹理的频谱总是有规律的,我们可以使用带通滤波器来放大某些频率,减弱其他频率。然而,在建模之前我们很难得到频谱,因为在不同的尺度上,会有几个频率,而且它们也会相互影响。为了解决这个问题,提出了一种可学习的带通滤波器(LBF)来学习摩尔纹图像的先验。LBF为每一个频率引入了一个可学习的权重。

python 去摩尔纹 如何去摩尔纹_深度学习_07

1.3 Tone mapping 色调映射

RGB颜色空间是一个非常大的空间,包含256的3次方种颜色,因此很难进行逐点色调映射。观察到摩尔纹图像和干净图像之间存在颜色偏移,本文提出了一种两步色调映射策略,其中包含两种类型的色调映射块:全局色调映射块(GTMB)和局部色调映射块(LTMB)。

全局色调映射块Global tone mapping block

注意力机制已经被证明在许多任务中是有效的,并且已经提出了几种通道注意模块。GTMB可以看作是一个通道注意模块。然而,GTMB与现有的通道注意模块在几个方面有所不同。 首先,现有的通道注意力块总是由一个Sigmoid单元激活,而GTMB中的γ没有这样的约束。其次,通道注意力是直接应用在现有通道注意力块的输入上,而GTMB中的γ是应用在局部特征Flocal上。最后,现有的通道注意力模块的目的是进行自适应的channel-wise特征重新校准;GTMB的目标是进行全局的颜色偏移,避免不规则和不均匀的局部颜色伪影。

python 去摩尔纹 如何去摩尔纹_深度学习_08


python 去摩尔纹 如何去摩尔纹_python 去摩尔纹_09

局部色调映射块Local tone mapping block

python 去摩尔纹 如何去摩尔纹_数据集_10

三、损失函数

将L1损失用作基本损失函数,因为已经证明 L1损失比L2损失对图像恢复任务更有效。但是,L1损失本身是不够的,因为它是无法提供结构信息的逐点损失,而摩尔纹是 structural artifact。特提出了Advanced Sobel Loss(ASL)来解决此问题。

python 去摩尔纹 如何去摩尔纹_计算机视觉_11

与经典Sobel Loss相比,ASL提供了两个额外的45°方向Loss,它们可以提供更丰富的结构信息。

python 去摩尔纹 如何去摩尔纹_计算机视觉_12

总的损失函数为:

python 去摩尔纹 如何去摩尔纹_python 去摩尔纹_13

四、实验

#1.解压比赛数据集
!unzip data/data121008/moire_train_dataset.zip -d data/train >/dev/null
!unzip data/data121008/moire_testA_dataset.zip -d data/testA >/dev/null
#2.数据读取定义
!cat work/dataset.py
#3.模型定义
!cat work/model.py
#4.定义训练方式
!cat work/train.py
#5.训练,日志在vdl_log目录下,可用左侧的VisualDL的数据模型可视化功能,查看训练进程
%cd /home/aistudio/
!python work/train.py
#6.预测结果
%cd /home/aistudio/
!python work/predict.py --dataset_root /home/aistudio/data/testA/moire_testA_dataset/ --pretrained /home/aistudio/checkpoint/120.pdparams
#7.打包提交文件
%cd /home/aistudio/output/
!zip result.zip *.txt *.jpg

五、总结

项目为了演示目的,只使用了比赛的数据集。

针对比赛任务,模型还有很多优化空间,四个方向供参考:

  1. 数据:利用外部数据集进行预训练或者直接转换预训练模型,然后在比赛数据集上微调;
  2. 模型:针对数据集的特点,优化模型结构;
  3. Loss:采用论文中提出的L1和SoberLoss混合损失来训练;
  4. 训练:调整训练策略和超参数据。

python 去摩尔纹 如何去摩尔纹_计算机视觉_14

MBCNN当前在TIP2018数据集榜上综合指标排名暂列第一,PSNR为30.03,SSIM为0.893。