牛尾扫暗影,虎头开盲盒。三卷网盘赛,榜评0.59168
百度网盘AI大赛:文档图像阴影消除,奖池是网盘神秘大礼包。奖池是盲盒,有点好奇。
一、文档图像阴影消除
生活中在使用手机进行文档扫描时,由于角度原因,难免会在照片中留下举手拍摄时遗留的恼人阴影。为了帮助人们解决这样的问题,减少阴影带来的干扰,选手需要通过深度学习技术训练模型,对给定的真实场景下采集得到的带有阴影的图片进行处理,还原图片原本的样子,并最终输出处理后的结果图片。
有阴影的图片 | 去除阴影后的效果 |
---|---|
![]() | ![]() |
本次比赛希望选手结合当下前沿的图像处理技术与计算机视觉技术,提升模型的训练性能和泛化能力,在保证效果精准的同时,注意模型在实际应用中的性能问题,做到尽可能的小而快。
二、数据分析
在本次比赛最新发布的数据集中,所有的图像数据均由真实场景采集得到,再通过技术手段进行相应处理,生成可用的脱敏数据集。该任务为image-to-image的形式,因此源数据和GT数据均以图片的形式来提供。可基于本次比赛最新发布的训练数据快速融入比赛,为达到更好的算法效果,本次比赛不限制使用额外的训练数据来优化模型。
数据集构成
|- root
|- images
|- gts
本次比赛最新发布的数据集共包含训练集、A榜测试集、B榜测试集三个部分,其中,训练集共1410个样本(图片编号非连续),A榜测试集共300个样本(图片编号连续),B榜测试集共397个样本;
images为带阴影的源图像数据,gts为无阴影的真值数据;(测试数据集的GT不开放)
images与gts中的图片根据图片名称一一对应。
#1.准备原料:解压比赛的数据集
!unzip data/data126294/delight_train_dataset.zip -d data/ >>/dev/null
!unzip data/data126294/delight_testA_dataset.zip -d data/ >>/dev/null
## 数据EDA
import os.path
import glob
import re
from PIL import Image
path = '/home/aistudio/data/delight_train_dataset/images' #训练数据路径
dirname='/home/aistudio/work/'
im_files = glob.glob(os.path.join(path, "*.jpg"))
im_files.sort()
print('训练集数量 {}'.format(len(im_files)))
train_file = open(os.path.join(dirname, 'train.txt'), 'w')
for index,filename in enumerate(im_files):
im = Image.open(filename)#返回一个Image对象 #打开该图像
filepath = os.path.join(dirname, filename)
print("%s\t%s\t%s\n" % (filename,im.size[0],im.size[1]),file=train_file) #输入图像名称、图像高度和宽度到指定txt中。
train_file.close()
path = '/home/aistudio/data/delight_testA_dataset/images' #训练数据路径
im_files = glob.glob(os.path.join(path, "*.jpg"))
im_files.sort()
print('测试集数量 {}'.format(len(im_files)))
test_file = open(os.path.join(dirname, 'test.txt'), 'w')
for index,filename in enumerate(im_files):
im = Image.open(filename)#返回一个Image对象 #打开该图像
filepath = os.path.join(dirname, filename)
print ("%s\t%s\t%s\n" % (filename,im.size[0],im.size[1]),file=test_file) #输入图像名称、图像高度和宽度到指定txt中。
test_file.close()
训练集数量 1410
测试集数量 300
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_table('/home/aistudio/work/train.txt',header=None,index_col=False)
plt.figure(figsize=(10,4))
plt.title('Width of TrainSet') #训练集图像宽度分布
hc = df[2].groupby(df[1])
hc.count().plot.bar()
plt.figure(figsize=(10,4))
plt.title('Height of TrainSet') #训练集图像高度分布
wc = df[1].groupby(df[2])
wc.count().plot.bar()
<matplotlib.axes._subplots.AxesSubplot at 0x7f783bd9f3d0>
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_table('/home/aistudio/work/test.txt',header=None,index_col=False)
plt.figure(figsize=(10,4))
plt.title('Width of TestA Set') #测试集A图像宽度分布
hc = df[2].groupby(df[1])
hc.count().plot.bar()
plt.figure(figsize=(10,4))
plt.title('Height of TestA Set') #测试集A图像高度分布
wc = df[1].groupby(df[2])
wc.count().plot.bar()
<matplotlib.axes._subplots.AxesSubplot at 0x7f783bedb690>
根据训练集和测试集的图片长宽,训练时图图片尺寸可设为512*512。
三、思路
文档图像阴影消除任务可以看作是一种图像增强,属于Low-Level视觉任务,与百度网盘图像处理挑战赛中的摩尔纹消除和手写文字擦除任务都有相似之处,也可基于上述两个任务中的思路和模型来完成该任务。
本项目也是基于手写文字擦除任务的思路,尝试一下,是否可以共用一类模型,解决多种图像增强任务。
模型采用MTRNet++,具体说明可参考项目:
高考想重来,脑补橡皮擦,再卷网盘赛二,榜评分0.55599
四、开卷
#2.准备工具
!pip install glob2 -q
!pip install imutils -q
!pip install scikit_image -q
#3.生成数据集。已完成数据集的生成,不需要执行此步骤
#%cd work/scripts/
#!python generate_bbox.py
#!python create_dataset.py
#4.反复制作。Mask设为8,生成固定的Mask
%cd /home/aistudio/work/
!python train.py
(1)output目录下文件夹的log目录下保存日志文件,训练过程中的参数保存在model目录下。
(2)断点接续训练,在config.yml文件中设置G_MODEL_PATH和D_MODEL_PATH为保存过模型的路径。
(3)可以通过左侧的VisualDL的数据模型可视化功能,查看训练指标和训练过程中生成的图像。
训练指标可视化
训练过程中生成的图像
上图中:左为输入原始图像, 中间为标签图像, 右边为生成图像
#5.检查质量。使用了滑窗方式进行预测增强,其中的滑窗和步长可调整
%cd /home/aistudio/work/
!python test.py --config /home/aistudio/work/config/config.yml \
--mode 3 --dataset_root /home/aistudio/data/delight_testA_dataset/images/ \
--pretrained /home/aistudio/output/20220123-073327/model/MaskInpaintModel_gen_55000.pdparams
#6.试试效果,压缩文件提交评分
%cd /home/aistudio/work/test_result/
!zip result.zip *.jpg *.txt
保存的文件在test_result路径中,进入该路径创建readme.txt文件,输入要求的内容:
训练框架:PaddlePaddle
代码运行环境:V100
是否使用GPU:是
单张图片耗时/s:1
模型大小:45
其他说明:算法参考MTRNet++
五、总结
榜评结果
涨点思路
1.利用外部数据和预训练模型,在比赛数据集在微调;
2.调整模型结构;
4.调整Config文件中的超参数。