一. 背景
假如我们有一个标准文件,我们对其进行文字识别、版面分析或者其他下游任务就比较容易。然而,当图片是手机拍照获取的,图片中往往有阴影、摩尔纹、弯曲。
那么,如何通过标准的文档,获得类似相机拍照的图片呢?
这里介绍的就是文档数据增强,用标准文档模拟相机拍照场景。该方法不仅能用于文档各场景的数据增强,用于OCR检测识别等任务;还能合成各种图片训练对,用于文档去阴影、文档去摩尔纹、文档弯曲矫正等各项任务。
二. 效果实现
首先给大家展示的是一个PDF截图和对应的标注(红色为标注框)
下面给标准图片分别添加阴影、摩尔纹、弯曲,效果如下:
摩尔纹+弯曲,并且把标注点映射到弯曲图片上,如下图所示:
阴影+弯曲,并且把标注点映射到弯曲图片上,如下图所示:
三. 算法原理与代码实现
原理:利用渲染工具(推荐blender),渲染出各种弯曲、阴影、摩尔纹,然后再pdf图片上进行合成。
最后,一定要代码实现(只给初级版本,完整版本比较复杂):
import os
import cv2
import json
import random
import numpy as np
from scipy.interpolate import LinearNDInterpolator as linterp
from scipy.interpolate import NearestNDInterpolator as nearest
class LinearNDInterpolatorExt(object):
def __init__(self, points, values):
self.funcinterp = linterp(points, values)
self.funcnearest = nearest(points, values)
def __call__(self, *args):
z = self.funcinterp(*args)
chk = np.isnan(z)
if chk.any():
return np.where(chk, self.funcnearest(*args), z)
else:
return z
def crop_flow_from_nan(flow):
mask = ~np.any(np.isnan(flow), -1)
x, y, w, h = cv2.boundingRect(mask.astype(np.uint8))
flow = flow[y: y + h, x: x + w]
mask = mask[y: y + h, x: x + w]
max_nonzero_ratio = 0.9
max_crop_size = 20
mask_h, mask_w = mask.shape[0], mask.shape