OCR训练数据生成方法

有的时候我们训练网络的时候,数据集在收集的过程中由于种种原因导致图像收集的不完整,比如某些种类很少,或者没有,这个时候我们就可以考虑自己生成数据集。

这个和data augmentation还不太一样,data augmentation是在数据集上做一些变化,得到更多的数据,数据生成是直接生成一些数据集。

在做OCR识别的时候,因为有些类型的数据量很少,所以就考虑了一下数据生成的方法。

安装 imagemagick 工具

imagemagick 工具,可以用来生成不同字体的图像。
imagemagick安装

生成图像格式

为了让生成的图像更加真实,我做了一下操作

  1. 修改字体
  2. 添加背景
  3. 旋转角度
  4. 增加噪点
具体实现
#coding=utf8
import os
import cv2
import pickle
import random
from glob import glob
import numpy as np

# 为图像添加背景
def add_background(img):
    # 从自然场景中选择一些图像,因为我是做OCR,所以我从ICDAR 2015的数据集选择了一些图像
    bg_imgs_path = glob('background/*.jpg')
    bg_img = cv2.imread(bg_imgs_path[random.randint(0, len(bg_imgs_path)-1)])
    bg_img = cv2.cvtColor(bg_img, cv2.COLOR_RGB2GRAY)
    # 这个大概是一个字的像素大小,根据具体场景而定
    start_y = random.randint(0, bg_img.shape[0]-9)
    start_x = random.randint(0, bg_img.shape[1]-9)
    bg_img = cv2.resize(bg_img[start_y:start_y+8, start_x:start_x+8], img.shape)
    beta = 0.5
    # 像素叠加
    return img * (1 - beta) + bg_img * beta

# 随机噪点
def salt_and_pepper(img,noise_num):
    noise_img = img
    for i in range(noise_num):
        randX = random.randint(0, img.shape[0]-1)
        randY = random.randint(0, img.shape[1]-1)
        if random.randint(0, 1) == 0:
            noise_img[randX,randY]=0
        else:
            noise_img[randX,randY]=255
    return noise_img

# 增加噪声,高斯平滑
def add_noise(img):
    # 这里没有增加噪点
    img = salt_and_pepper(img, random.randint(0, 0))
    filter_size = random.randint(0, 3) * 2 + 1
    # 高斯平滑
    img = cv2.GaussianBlur(img, (filter_size, filter_size), sigmaX=0)
    return img

# 旋转图像 
def rotate_image(mat, angle):
    # angle in degrees
    # opencv python和c++的接口,这里顺序是相反的
    height, width = mat.shape[:2]
    image_center = (width/2, height/2)
    rotation_mat = cv2.getRotationMatrix2D(image_center, angle, 1.)
    abs_cos = abs(rotation_mat[0,0])
    abs_sin = abs(rotation_mat[0,1])
    bound_w = int(height * abs_sin + width * abs_cos)
    bound_h = int(height * abs_cos + width * abs_sin)
    rotation_mat[0, 2] += bound_w/2 - image_center[0]
    rotation_mat[1, 2] += bound_h/2 - image_center[1]
    rotated_mat = cv2.warpAffine(mat, rotation_mat, (bound_w, bound_h))
    return rotated_mat

# 设置需要生成的数据集列表,格式: index num
# index 表示在种类标签中的索引,也就是第几类,num表示此类图像已有的个数 
label_path = 'sup_remain_data.txt'
# 输出目录
local_dir = 'supplement2/'

# 输出生成数据集的标签值
gen_suppl_list = 'supplement2/gen_supplement2.txt'

# 每一类图像都生成总共110张,如果已经有一部分了,只需要生成剩下部分的
pic_num = 110 # 100:10
train_num = 100
test_num = 10

# 设置种类和要生成的图像个数
label_genNum = {}
with open(label_path) as fin:
    lines = fin.readlines()
    for line in lines:
        label, num = line.strip().split(' ')
        label_genNum[label] = pic_num - int(num)

# 读入所有标签种类
std_label = {}
with open('data.txt') as fin:
    lines = fin.readlines()
    for index, line in enumerate(lines):
        std_label[str(index)] = line.strip()

#grav=['NorthWest','North','NorthEast','West','Center','East','SouthWest','South','SouthEast']
bgcolor=['black','white', 'gray', 'gray', 'black', 'white']
fillcolor=['white','black','black', 'white', 'gray', 'gray']
# 这个目录下放当前文字常用字体格式文件
ttfs=glob('ttfs/*')

count = 0
with open(gen_suppl_list, 'w') as fout:
    for label, gen_num in label_genNum.items():
        count += 1
        print count
        for i in range(gen_num):
            img_name = label + '_' + str(i) + '.jpg'
            print str(label) + ' ' + std_label[label] + ' ' + label + '_' + str(i)
            fout.write(str(label) + ' ' + std_label[label] + ' ' + label + '_' + str(i) +'\n')
            if os.path.exists(local_dir+img_name):
                continue
            #index_g = random.randint(0, len(grav)-1)
            index_b = random.randint(0, len(bgcolor)-1)
            index_t = random.randint(0, len(ttfs)-1)
            #font_size = random.randint(20, 40)
            # 设置字体、填充方式、背景颜色、像素点大小、图像输出大小
            system_cmd = 'convert -font {0} -fill {1} -background {2} -pointsize 30 -colorspace Gray -gravity "Center" ' \
            '-size 40x40 label:"{3}" "{4}"'.format(ttfs[index_t], fillcolor[index_b], bgcolor[index_b], std_label[str(label)], local_dir+img_name)
            os.system(system_cmd)
            img = cv2.imread(local_dir+img_name, 0)
            # 几种变化效果叠加,这样生成的图像就是具有多种效果的,不需要单独每种效果生成过多的图像
            img = add_background(img)
            img = add_noise(img)
            img = rotate_image(img, random.randint(-5, 5))
            #cv2.imshow('gen image', img)
            #cv2.waitKey(0)
            cv2.imwrite(local_dir+img_name, img)

print count
print 'language supplement-set 生成完毕...'

转载于:https://www.cnblogs.com/zhonghuasong/p/7351506.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 训练深度OCR(Optical Character Recognition)图像,生成文本图像是一项涉及到计算机视觉和自然语言处理的任务。下面将通过三个关键步骤来解释该过程。 首先,准备数据集。为了训练深度OCR模型,我们需要大量的图像和相应的文本标签。可以使用现有的OCR数据集,或者自己创建一个。数据集中的图像应该涵盖各种不同的字体,字号,角度和背景条件。此外,图像中的文本标签应该是准确的,并且要与图像中的文本内容相对应。 接下来,搭建深度OCR模型。深度学习模型,如卷积神经网络(CNN)或循环神经网络(RNN),可以用于训练深度OCR模型。这些模型可以通过对图像进行特征提取和处理来识别和理解其中的文本。关键是使用适当的模型架构和合适的参数进行训练,并确保模型能够有效地捕捉文本图像之间的模式和关系。 最后,进行训练和优化。利用准备好的数据集和搭建好的深度OCR模型,我们可以开始训练模型。在训练过程中,我们需要将图像输入到模型中,并与相应的文本标签进行比对,以便模型可以学习如何从图像中正确地提取文本信息。使用反向传播算法来更新模型的权重和偏置,使之逐渐调整到最佳状态。同时需要进行适当的优化策略,如批量归一化、dropout等,以提高模型的性能和鲁棒性。 通过这个过程,我们可以训练一个深度OCR模型,该模型能够接受输入图像,并自动识别和生成对应的文本图像。这对于自动化字体识别、文本提取和文档扫描等任务有着广泛的应用前景。 ### 回答2: 训练深度OCR(Optical Character Recognition,光学字符识别)模型是为了将图像转化为可编辑的文本,以实现自动化处理和识别。该过程主要包含以下几个步骤: 1. 数据集收集:为了训练深度OCR模型,需要大量的图像数据集。这些图像可以是书籍、报纸、手写文字等不同来源的文本图像。数据集的质量和多样性对于获得良好的模型性能至关重要。 2. 数据标注:将收集到的图像进行人工标注,确定每个图像中的文本区域以及相应的文本内容。标注的精确性和一致性对于模型的训练结果影响重大。 3. 构建OCR模型:采用深度学习方法,如卷积神经网络(CNN)或循环神经网络(RNN),搭建OCR模型。模型的结构和参数需要经过多次实验和调整,以达到高准确率和鲁棒性。 4. 模型训练:使用标注好的数据集,通过迭代的方式训练OCR模型。训练过程中,需要优化模型的损失函数,增加模型的泛化能力,并避免过拟合。 5. 模型评估:使用一组独立的测试数据来评估模型的性能和准确率。常用的评价指标包括准确率、召回率和F1值等。 6. 模型优化:根据评估结果进行模型的进一步优化,以提升OCR模型在不同类型图像上的识别能力和效果。 7. 部署应用:将训练好的深度OCR模型应用于实际场景中。这可以是将图像中的文本提取为可编辑的文本,或者通过与其他系统的接口实现自动化处理等。 通过以上步骤,我们可以训练出具备较高准确率的深度OCR模型,使其能够在各种图像场景下成功识别并生成对应的文本图像。 ### 回答3: 训练深度OCR模型是为了实现准确和高效的图像文本提取和识别。对于这一任务的训练,我们需要以下步骤: 1. 数据收集和标注:首先需要收集大量的图像数据来用于训练,这些数据应涵盖不同类型和质量的文本图像。将这些图像进行标注,即给每个文本图像添加正确的文本标注。 2. 数据预处理:对于图像数据,我们需要进行预处理来优化图像质量和准确性。这可能包括图像去噪、平滑处理、尺寸归一化等操作。 3. 构建深度OCR模型:选择合适的深度学习模型来实现OCR任务,如卷积神经网络(CNN)或循环神经网络(RNN)。根据模型的架构,我们将输入图像进行特征提取,并通过逐层处理来获得文本图像的语义和序列信息。 4. 模型训练:将预处理后的数据输入到深度OCR模型中进行训练。这涉及到设计合适的损失函数和优化方法,并通过大规模的迭代优化来提高模型的准确性和泛化能力。 5. 模型调优和验证:在模型训练过程中,我们需要进行模型调优和验证,以获得最佳的性能。这可能包括调整模型参数、调整训练策略、进行交叉验证等操作。 6. 测试和评估:在模型训练完成后,我们需要对其进行测试和评估。通过使用带有文本的新图像数据,我们可以评估模型的准确性和性能,并根据需要进行后续的调整和优化。 通过以上步骤,我们可以训练出一个强大的深度OCR模型,能够对文本图像进行准确和高效的识别,并为相关应用提供可靠的文本提取功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值