OCR深度实践系列:(一)图像预处理这篇为OCR深度实践系列的第二篇:数据生成。深度学习依赖大量的数据,然而在真实的业务场景中无法获取足够多且真实的打标数据,因此人们希望通过图像增强、语义理解、生成对抗网络等技术生成高质量的数据。基于深度学习的OCR系统一般分为文字检测和文字识别两个阶段,数据生成也需要针对这两个阶段分别叙述并辅以实战进行演示。本项目完整代码:https://github.com/Vincent131499/Chinese-OCR3/tree/master/data_generation

1.文字检测数据的生成

1.1 SynthText方法

文字检测数据生成方法主要基于Synthetic Data for Text Localisation in Natural Images提出的方法SynthText,介绍了如何生成自然场景下的文字图像。SynthText方法的主要流程包括:1)搜集业务相关的背景图片、文字语料和字体。其中背景图片是无文字的。2)计算得到图片的语义与深度信息。论文代码中使用gPb-UCM方法得到图片的语义信息。在CV领域中的“语义信息”并不是指的是NLP中的上下文语义,而是各种语义区域;“深度信息”可以简单理解为图片与相机的距离。3)获取符合条件的候选区域。具体操作分为两步:step1:根据语义信息进行筛选,对每个分割片区进行遍历,利用OpenCV中的minAreaRect方法获取包含分割区内所有像素点的最小矩形区域。然后根据矩形的宽和高过滤掉宽高较小的区域。step2:根据深度信息进行二次过滤,筛选出比较平整的区域。4)对筛选出的候选区域进行图像变换,原图中的分割区域都是带有一定角度的,为了方便以后将单词或句子填充到相应的分割区域中,需要预先对每个分割区域做旋转变换。具体做法是:先利用OpenCV的findContours()获取轮廓,将轮廓转换为3D形式,再将旋转后的区域平铺到平面上,对平面的区域进行旋转,使得minAreaRect()包围的矩形区域角度为0,随后利用OpenCV的findHomography()对旋转后分割区域的矩阵进行矩阵变换。5)对变换后的区域进行填充。随机选择字体、文字内容、添加特效等,生成相应的文字图片,然后复制到相应的区域中。

1.2 实战演示

该项目位于Chinese-OCR3/data_generation/SynthText目录下。一般而言:开源的数据集已经足够用于文字检测项目,所以生成更多应用在文字识别阶段,这里只是作为演示使用。此处给出SynthText 自然场景图像数据集(地址还未上,等下载完放到网盘),由80万个图像组成,大约有 800 万个合成单词实例。每个文本实例都使用其文本字符串,字级和字符级边界框进行注释。安装依赖:

pip install -r requirements.txt

生成数据:

python gen.py --viz

• dset.h5: 里面有5张图片,可以下载其他图片• data/fonts: 一些字体• data/newsgroup: 一些语料• data/models/colors_new.cp: Color模型• data/models:模型相关• 生成的结果在results目录下可视化预览生成结果:

python visualize_results.py

以下放出一张示例的生成图片:

2.文字识别数据的生成

深度学习系统中,在检测出目标之后,往往还需要使用分类器对检测区域进行识别。深度学习依赖大量的数据才能得到令人满意的识别效果。在实际的业务场景中,首先需要根据具体的业务分析需要的背景、字体、颜色、形变以及语料等信息。具体识别数据的生成流程如下所示:

目前常用流行的识别数据生成方法可大致分为三类:GAN生成法、基于特征变换的图像增强、基于深度学习的图像增强。

2.1 基于GAN生成数据

在很多场景下,真实数据往往非常稀缺和敏感,例如身份证数据、银行卡数据、车牌数据这些涉及个人信息的数据往往很难获取,而且很容易违反法律规定。借助GAN(Generative Adversarial Network,生成对抗网络)可以在一定程度上缓解上述问题。目前GAN的应用场景基本上覆盖了AI的所有领域,例如图像和音频的生成、图像风格迁移、图像修复(去噪和去马赛克)、NLP中的文本生成等。生成对抗网络,顾名思义,就是在生成模型的基础上引入对抗博弈的思想。假设我们有一个图像生成模型Generator,它的目标是生成一张比较真实的图像,与此同时,我们还有一个图像判别模型Discriminator,它的目标是正确的判别一张图像是生成的还是真实的。具体流程如下:• 1)生成模型Generator生成一批图像。• 2)判别模型Discriminator学习区分生成图像和真实图像。• 3)生成模型根据判别模型反馈结果来改进生成模型,迭代生成新图像。• 4)判别模型继续学习区分生成图像和真实图像。直到二者收敛,此时生成模型和判别模型都能达到比较好的效果。上述的博弈类似《射雕英雄传》中周伯通的左右互搏术,能循环提升生成模型和判别模型的能力。另外,在生成模型中采用神经网络作为主干/backbone,则称之为生成对抗网络。GAN模型结构如下图所示。

在这里以改进的pix2pix经典模型为例进行实战演示。此项目位于Chinese-OCR3/data_generation/pytorch-CycleGAN-and-pix2pix目录下。这里使用在facades数据集预训练好的pix2pix模型进行演示。具体分为3步:step1:下载预训练模型

bash ./scripts/download_pix2pix_model.shfacades_label2photo

step2:下载facades数据集

bash ./datasets/download_pix2pix_dataset.sh facades

step3:生成结果

python test.py --dataroot ./datasets/facades/ --direction BtoA --model pix2pix --name facades_label2photo_pretrained

生成图片如下示例:

2.2 基于特征变换的图像增强

这类方法是对现有的数据进行图像增广进而扩充数据量。在文字识别的训练中,由于文字的特殊性,能够选择的增强方法有限,主要有以下4种类型:• 1)模糊。• 2)对比度变化。• 3)拉伸。• 4)旋转。在这里分别针对这4种手段进行实战演示,该项目位于Chinese-OCR3/data_generation/augment目录下。输入图片:

核心代码如下:

#旋转def rotate(img, angle, center=None, scale=1.0):    # get the dimension of the img    (h, w) = img.shape[:2]    if center is None:        center = (w // 2, h // 2)    M = cv2.getRotationMatrix2D(center, angle, scale)    rotated_img = cv2.warpAffine(        img, M, (w, h), borderMode=cv2.BORDER_REPLICATE)    return rotated_img#拉伸(放大-缩小)def resize(img, width=None, height=None, inter=cv2.INTER_AREA):    # get the dimension of the img    dm = None    (h, w) = img.shape[:2]    if width is None and height is None:        return img    if width:        r = width / float(w)        dm = (width, int(h * r))    else:        r = height / float(h)        dm = (int(w * r), height)    resized_img = cv2.resize(img, dm, interpolation=inter)    return resized_img# 对比度变化def adjust_brightness_contrast(img, brightness=0., contrast=0.):    """    Adjust the brightness or contrast of image    """    beta = 0    return cv2.addWeighted(img, 1 + float(contrast) / 100., img, beta, float(brightness))# 模糊def blur(img, typ="gaussian", kernal=(2, 2)):    """    Blur the image    :params:            typ: "gaussian" or "median"    """    if typ == "gaussian":        return cv2.GaussianBlur(img, kernal, 0, None, 0)    elif typ == "median":        return cv2.blur(img, kernal)    else:        return img

效果如下所示:旋转-倾斜一定角度:

拉伸-放大:

拉伸-缩小:

对比度-增强:

对比度-降低:

模糊:

2.3 基于深度学习的图像增强

这类方法也是对现有的数据进行图像增广进而扩充数据量。深度学习方法是“Synthetic Data and Artificial Neural Networks for Natural Scene Text Recognition”这篇论文提出的合成自然场景文本的方法,适用于文字识别。具体的文本生成过程分为六步:1)字体渲染。2)描边、加阴影、着色。3)基础着色。4)仿射投影扭曲。模拟3D环境。5)自然数据混合。6)加噪声。此处给出两个资源:1)Imgaughttps://github.com/aleju/imgaug主要用于物体检测的增强。2)Augmentorhttps://github.com/mdbloice/Augmentor做一些更复杂的仿射扭曲变换。如果觉得这系列文章还有点用处,大家可以点一下下面的赞,给MeteorMan一点继续分享的支持和动力。

opencv生成3d模型_OCR深度实践系列:数据生成相关推荐

  1. opencv ocr字符识别_OCR深度实践系列:图像预处理

    近一个半月时间没更了,在这段时间里针对OCR业务进行了深入研究,业务也已上线,谨以此篇作为OCR系列的开篇. 目前NLP+OCR的落地应用在市场上愈加火热,如金融领域的研报分析.司法领域的合同审核甚至 ...

  2. 基于3D模型的MaskRCNN的训练数据生成

    在MaskRCNN的Mask分割或者FCN全图分割的数据收集过程中,初始数据可以使使用LabelMe手动标记,这是数据标记不可或缺的过程,需要耗费大量人力物力,也是值得的. 数据选取的过程中需要注意的 ...

  3. 英伟达 Magic3D:一句话生成3D模型,分辨率清晰8倍,速度快2倍,编辑文本还可直接修改...

    丰色 发自 凹非寺  量子位 | 公众号 QbitAI 一句话生成3D模型,英伟达也来"秀肌肉"了- 来看它最新捣鼓出的Magic3D AI,效果是这样儿的. 输入"坐在 ...

  4. 3D版DALL-E来了!谷歌发布文本3D生成模型DreamFusion,给一个文本提示就能生成3D模型!...

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 点击进入-> CV 微信技术交流群 转载自:新智元 | 编辑:LRS [导读]给一个文本提示就能生成3 ...

  5. 一张照片就能生成3D模型,GAN和自动编码器碰撞出奇迹,苏黎世联邦理工学院出品...

    萧箫 发自 凹非寺 量子位 | 公众号 QbitAI 2D图片"脑补"3D模型,这次真的只用一张图就行了-- 只需要给AI随便喂一张照片,它就能从不一样的角度给你生成"新 ...

  6. AI画师技术又精进了? AI画师三维版试玩——Dreamfields和DreamFusion向文本生成3D模型领域进发

    0.AI画师二维版的出圈 最近AI画师的杰出表现让人惊讶无比,2022虽然不是ai绘图这项技术诞生的时间,但却是到目前为止最爆火出圈的绘图元年,现在市场上也已经有了很多成熟的AI绘画APP:用户仅需打 ...

  7. 几张图片生成3D模型?距离真正的AI建模还有多远?

    时间溯回,早在2017年,美图秀秀就曾引入人工智能美化人像而被谷歌誉为"最佳娱乐App".智能技术奔腾发展,今年的AIGC技术可谓在各行各业大放异彩,从AI绘画.AI写作到AI配音 ...

  8. python实现dem输出三维模型_使用DEM生成3D模型(补完)

    DataMark--------中国地球空间数据交换格式-格网数据交换格式(CNSDTF-RAS或CNSDTF-DEM)的标志.基本部分,不可缺省. Version--------该空间数据交换格式的 ...

  9. ContextCapture生成3D模型

    本篇博客主要介绍如何使用ContextCapture生成3D模型. 在ContextCapture中,Control Points用于精确指定经纬度,Tie Points用于指定几张图像中相同的点,S ...

最新文章

  1. 什么是ownership?
  2. 加速企业数字化转型,首届Spring Summit技术峰会圆满落幕
  3. 自学python爬虫要多久-Python爬虫要学多久,给初学编程者的建议
  4. 红宝书阅读笔记——缓冲区对象
  5. 【浅谈数据结构】《数据结构》Data Structure
  6. [从架构到设计]第二回:对象的旅行---对象和人,两个世界,一样情怀(转载)...
  7. .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧
  8. 前端学习(2935):v-for案例
  9. 小程序中input标签没有反应_鸢尾花预测:如何创建机器学习Web应用程序?
  10. 怎么退出自适应巡航_简单聊聊定速巡航和自适应定速巡航的区别
  11. python如何设置字体大小_[Python Basic]如何设置 Python 的运行环境
  12. android launchmode java代码,java – Android:launchMode = SingleTask问题
  13. 第一周-第11章节-Python3.5-if else流程判断
  14. 最大的LeftMax与rightMax之差绝对值
  15. 【每日算法Day 87】今天我脱单了,所以大家不用做题了!
  16. FISCO BCOS 区块链 设置交易最晚处理区块高度
  17. PLSQL提交带有模板的报表的方法
  18. [深度学习工具]·FoolNLTK 中文处理工具包使用教程
  19. PMP备考之路 - 汪博士第十二章(项目采购管理)
  20. phpMyWind本地伪静态设置方法_已迁移

热门文章

  1. bboss标签使用大全-数据展示标签
  2. 2022年“移动云杯”算力网络应用创新大赛圆满落幕,百万大奖揭晓!
  3. 台州中学 2021高考 成绩查询,浙江省台州中学2020高考喜报(浙江台州高中排名)
  4. 《啊哈算法》相关链接收集
  5. TI DSP 指令注释
  6. 最小相位,线性相位,最小延时
  7. 数学实验第一章:MATLAB基础
  8. 手机存储android文件怎么打开,安卓手机如何打开.jio文件?
  9. 香橙派可以运行linux,如何使用SSH远程命令登录香橙派开发板
  10. Adobe CC全线产品更新,优化Win8.1触控