目录
(2)背景约束的解码器(Background-constrained Decoder)
论文解读
Citation
Ling Zhang, Yinghao He, Qing Zhang, Zheng Liu, Xiaolong Zhang, and Chunxia Xiao. 2023. Document Image Shadow Removal Guided by Color-Aware Background. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 1818–1827.
0.论文
- 论文链接:paper
1.问题背景
- 日常生活中,我们往往频繁使用手机等移动设备拍摄带文字资料的图片(文档图像),但试过这么做的人往往都会遇到这样的问题:在多数单光源场景下,手机等移动设备往往会在图片上留下或深或浅的阴影,影响图片的视觉效果。由此,去除文档图像的阴影是各种视觉应用中必需的图像处理任务。——问题来源
- 虽然自然图像的阴影去除已经取得了实质性的进展,但这些方法通常在文档图像上表现不佳。因为文档图像与自然图像的特征截然不同,自然图像强调背景内容,而文档图像则强调文本内容。由于没有考虑文档图像的特殊属性,传统的自然图像处理方法在处理文档图像时甚至会产生不正确的结果。——文档图像具有特殊性
- 现有文档图像的阴影去除工作主要依赖于从图像中学习和利用一个固定的背景。但常量背景的代表性较差,经常忽略其他背景颜色。本论文提出了一种基于颜色感知的背景提取网络,用于提取空间变化的背景图像,可以准确描述文档的背景颜色。这两种方法的效果对比参见图1。在假设背景恒定的情况下(如图1(e)),阴影去除的结果可能引起颜色失真或阴影残留(如图1(d)、(f)),通过使用空间变化的背景(如图1(b)),本论文中实现的方法可以产生更理想的结果(如图1(c))。——现有去阴影方法存在不足
2.论文贡献
主要贡献有以下三方面:
-
提出了一种色彩感知的背景提取网络(CBENet),用于从阴影图像中提取空间变化的背景,从而保留原始图像中的不同背景颜色,为后续的阴影去除提供更有用的颜色信息。
-
提出了一种背景引导的阴影去除网络(BGShadowNet),利用估计的背景作为辅助信息实现文档图像的阴影去除。
-
提出了一个基于背景的注意力模块(BAModule)以及一个细节增强模块(DEModule),集成在BGShadowNet中用于改善生成图像的质量。
总体上,本论文提出了一个完整的神经网络模型用于文档图像的阴影去除。实现过程参见图2,首先利用CBENet估计空间变化的文档图像背景,接着引导BGShadowNet分两阶段生成高质量的阴影去除图像。
3.色彩感知的背景提取网络(CBENet)
(1)CBENet的训练(监督学习)
- 输入:阴影文档图像
- 输出模板:真实背景图像(需要根据无阴影图像进行构造)
- 神经网络结构:CBENet采用U-Net结构实现,首先应用五个 Conv + BN + LR eLu 从图像中提取特征,然后利用批量归一化和ReLU激活函数的方法,分五个反卷积层预测背景图像。在卷积层和反卷积层之间采用跳跃连接以增加网络中的信道数量、保留前端层的上下文信息。
- 通过训练,输入阴影文档图像,CBENet可以输出近似真实背景图像作为背景图像。
(2)构造真实背景图像
- 划分图像:将无阴影图像按照16×16的像素大小划分成不同的块。
- 依次处理所有块:使用高斯混合模型(GMM)根据图像的像素强度将其聚类为两个簇,对应于文本内容和背景。由于文档的背景颜色通常比较亮,则将亮度较高的聚类作为背景聚类。
- 局部背景:使用背景聚类的平均颜色替代划分的图像块,得到局部背景。由于不同块有不同的背景颜色,局部背景通常有明显的补丁边界,如图4(b)所示。
- 真实背景图像B:受到边缘保持图像平滑的引导滤波器的启发,使用颜色保持平滑算子(计算式如下)处理局部背景得到真实背景图像,如图4(c)所示。
4.背景引导的阴影去除网络(BGShadowNet)
(1)BGShadowNet两大处理阶段
第一阶段:
- 输入:阴影文档图像
- 输出:粗糙的阴影去除图像
- 神经网络结构:图像编码器+背景约束的解码器
第二阶段:
- 输入:第一阶段的输出图像
- 输出:高质量阴影去除图像
- 神经网络结构:在编码-解码网络中嵌入基于背景的注意模块(BAModule)和细节增强模块(DEModule)。
- 一个鉴别器被堆叠在末端,用于鉴别输出的阴影去除图像是否真实。
(2)背景约束的解码器(Background-constrained Decoder)
- 目标:充分利用背景图像的特征。
- 实现方法:在第一阶段用背景约束的解码器取代了普通的解码器。具体来说,将背景编码器的特征集成到背景约束的解码器的对应层次,以此补充图像特征。
(3)基于背景的注意模块(BAModule)
- 目标:保持图像的外观一致性。
- 问题:一般来说,具有相似背景的区域在图像中应该具有相似的外观(颜色和光照)。然而,在粗糙的阴影去除图像中可能存在照明或颜色伪影(参见图6(b))。
- 实现方法:引入基于背景的注意模块(BAModule),通过结合提取的背景特征和注意力机制,有助于消除图像中的外观不一致(参见图6(d))。
- BAModule的工作流程(参见图7)
- 首先,融合编码器特征和背景特征,通过信道级联获得集成特征。
- 接着,将集成特征输入注意力计算单元,生成色彩感知的注意图。注意力计算单元包括一个卷积层、一个ReLu激活函数、批量归一化和一个残差块层。
- 最后,通过元素乘法将色彩感知的注意图与集成特征融合,重建特征。输出这些特征嵌入到第二阶段的编码-解码器中。
(4)细节增强模块(DEModule)
- 目标:增强图像的纹理细节
- 问题:由于网络中有多个卷积和下采样运算,部分细节信息在高层丢失,这导致了图像的细节模糊(参见图6(c))。
- 实现方法:与高级特征相比,CNN图层中的低级特征通常包含更多的纹理细节。因此,引入细节增强模块(DEModule),利用网络的低层特征恢复粗糙结果的纹理细节。
- DEModule具体实现:图像的统计纹理信息在一定程度上反映了纹理强度。基于图像直方图均衡化的启发,DEModule的实现设计包含两部分;一部分通过特征计数(Feature Counting)获取低层特征的统计信息;另一部分通过特征均衡(Feature Equalization)增强纹理细节。DEModule的具体实现参见图8.
5.损失函数
网络的损失函数包括四个部分: 背景重建损失、外观一致性损失、结构一致性损失和对抗损失。
(1)背景重建损失
- 用于约束CBENet获取理想的背景图像,计算式如下:
(2)外观一致性损失
- 用于评估去阴影图像与无阴影图像之间的距离,计算式如下:
(3)结构一致性损失
- 用于保持图像的结构一致性,计算式如下:
(4)对抗损失
- 用于鉴别器判断产生的结果是否真实,计算式如下:
论文复现
0.代码
-
开源代码链接:github
- 环境配置
- python 3.6.13
- torch==1.10.0
- numpy==1.19.2
- opencv_python_headless==4.5.4.60
- albumentations==1.1.0
- matplotlib==3.3.4
- pandas==1.1.5
- Pillow==9.5.0
- PyYAML==6.0
- scikit_image==0.17.2
- scikit_learn==1.2.2
- skimage==0.0
- torchvision==0.11.1
- wandb==0.12.7
1.数据集
- 开源数据集链接:RDD
- RDD使用文档图像构建数据集,包括纸张、书籍、宣传手册等。数据集的构造过程分两步:①拍摄被物体遮挡的带有阴影的图像;②同时拍摄相应的无阴影图像。
- RDD划分为train和test两个文件,train中分为train_A、train_C分别包含阴影图像和无阴影图像(共计4371对),test中分为test_A、test_C分别包含阴影图像和无阴影图像(共计545对)。
训练集中阴影图像示例 |
左图对应的无阴影图像 |
- 构建真实背景图像(ground-truth background)
-
python extractBackground.py
- 输入无阴影图像,运行extractBackground.py文件,输出真实背景图像。设置输入文件和输出文件,在模型训练前完成train中真实背景图像的构建。
-
2.模型训练
- 训练模型——CBENet
-
python Train_CBENet.py ./configs/model=CBENet/config.yaml
- config.yaml中设置CBENet模型参数,训练迭代中保存训练集上效果最好的参数在pretrained_CBENet.prm中。CBENet使用数据集中有阴影图像和真实背景图像,得到的卷积神经网络模型用来预测真实背景图像,完成整个模型的背景提取功能。
-
- 训练模型——BGShadowNet
-
python Train_BGShadowNet.py ./configs/model=BGShadowNet/config.yaml
- config.yaml中设置BGShadowNet模型参数,训练迭代中保存训练集上效果最好的参数在pretrained_firstStage_for_BGShadowNet.prm、pretrained_secondStage_for_BGShadowNet.prm、pretrained_discriminator_for_BGShadowNet.prm中。BGShadowNet使用数据集中有阴影图像和无阴影图像,利用CBENet模型两阶段完成文档图像的阴影去除任务。
-
3.效果测试
- Pretrained model
-
训练已完成的模型链接:[pretrained model]
-
- test
- 开源代码中需要改写test.py文件中引用的do_one_iteration函数。
-
def my_do_one_iteration( sample: Dict[str, Any], firstStage_BGShadowNet: nn.Module, secondStage_BGShadowNet: nn.Module, cbeNet: nn.Module, device: str, ) -> Tuple[int, float, float, np.ndarray, np.ndarray]: x = sample["img"].to(device) background, featureMap = cbeNet(x.to(device)) background = background.detach() batch_size, c, h, w = x.shape # compute output confuse_result, confuseFeatureMap = firstStage_BGShadowNet(x.to(device), featureMap) # shadow_removal_image, _ = secondStage_BGShadowNet(confuse_result, background, x, confuseFeatureMap) pred = shadow_removal_image.detach().to("cpu").numpy() background = background.detach().to("cpu").numpy() confuse_result = confuse_result.detach().to("cpu").numpy() return batch_size, background, pred, confuse_result
-
运行test.py文件,输入文档图像,输出得到去阴影图像。
-
使用测试集图像进行测试
测试集中0154.JPG的有阴影图像
去阴影图像
-
使用自己拍摄的图像进行测试(图像的文字内容还原效果不错,但输出有奇怪的颜色出现,猜想是原数据集图像亮度高,而拍摄图像偏暗)
有阴影图像
去阴影图像