Tesseract文字训练,以及样本生成

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/details/77776831

前面用做Tesseract做文字识别的时候,一般网上教程称使用jTessBoxEditor训练(最终我试验发现对于中文的图片文字识别而言训练基本没什么卵用)


当然使用jTessBoxEditor训练新的文字还是可以的,当时我发现jTessBoxEditor训练基本的配置文件基本是文字以及文字的坐标于是我使用python脚本生成了对应的训练图片以及配置文件。先上个图: yahei_font2.box配置文件box的内容如下:

生成的配置文件如下:

下面贴出python代码,大致原理大家看下代码跑一下一个没什么问题:

# -*- coding: utf-8 -*-
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
import os

CREATE_PATH = 'F:/img_test/create_train_image/'
WIDTH = 700
HEIGHT = 900
# 正常字体的大小
# FONT_SIZE = 40
# FONT_SIZE = 16
# FONT_SIZE = 20
FONT_SIZE = 25
FONT_SIZE = 36
FONT_SIZE = 45
# 空格的大小,换行的时候也是要大小的不然,两行的距离太紧
FONT_BLANK_SIZE = 10
BEG_POINT = 5
BLACK_COLOR = 0 + 0 * 256 + 0 * 256 * 256

FONT_TYPE = 'C:\Windows\Fonts\FZSTK.TTF'  # 方正舒体
# FONT_TYPE = 'C:\Windows\Fonts\simsun.ttc'  # 常规简体   done 16 25
# FONT_TYPE = 'C:\Windows\Fonts\simhei.TTF'  # heiti     done 16 25
FONT_TYPE = 'C:\Windows\Fonts\STHUPO.TTF'  # 实心黑粗体  字体太大不好看有些字显示不正常
FONT_TYPE = 'C:\Windows\Fonts\simkai.TTF'  # 楷体 常规    done 16 25
FONT_TYPE = 'C:\Windows\Fonts\simfang.TTF'  # 仿宋 常规 常规  done 16 25
FONT_TYPE = 'C:\Windows\Fonts\FZYTK.TTF'    # 方正 姚体 常规
FONT_TYPE = 'C:\Windows\Fonts\STXINWEI.TTF'    # 华文新魏常规 done 25 36
FONT_TYPE = 'C:\Windows\Fonts\STCAIYUN.TTF'   #空心体
FONT_TYPE = 'F:\img_test\dahei\da_gei.TTF'    #自己下载的打黑 done  50
out_dir = 'F:/img_test/create_train_image/'
output_txt = 'output1.txt'
output_img = 'F:/img_test/create_train_image/output2.jpg'

# input_text = 'F:/img_test/create_train_image/common_word.txt'
input_text = 'F:/img_test/create_train_image/common_word2.txt'
input_text = 'F:/img_test/create_train_image/all_chinese.txt'
page_num = 47


def get_text_from_file():
    with open(input_text, 'r') as file:
        # decode('utf-8') 不行不知道为什么非要 'gbk'
        # print file.read().decode('gbk')
        return file.read().decode('gbk')


def get_page_num(text):
    textLen = len(text)
    rowLen = WIDTH / FONT_SIZE - 1
    columnLen = HEIGHT / (FONT_SIZE + FONT_BLANK_SIZE)

    if HEIGHT % (FONT_SIZE + FONT_BLANK_SIZE) > FONT_SIZE:
        columnLen += 1

    pageWordsNum = rowLen * columnLen
    pageNum = float(textLen) / (pageWordsNum)

    pageNum = int(round(pageNum + 0.499))

    textLst = str_to_strlist_by_nth(text, pageWordsNum)

    # for item in textLst:
    #     print item

    return pageNum, textLst


def do_All_Task():
    text = get_text_from_file()
    pageNum, textLst = get_page_num(text)

    baseFileName = get_filename_without_extension(input_text)
    baseFontName = get_filename_without_extension(FONT_TYPE)

    for i in range(0, pageNum):
        global output_txt, output_img, page_num
        output_txt = '%s%d%s%s%spage%d%s%s%s%d.txt' % (out_dir, page_num, '_', baseFileName, '_', i, '_', baseFontName, '_', FONT_SIZE)
        output_img = '%s%d%s%s%spage%d%s%s%s%d.jpg' % (out_dir, page_num, '_', baseFileName, '_', i, '_', baseFontName, '_', FONT_SIZE)
        print (output_txt, output_img)
        write_text2img(textLst[i])
        page_num += 1


def get_filename_without_extension(fullPath):
    base = os.path.basename(fullPath)
    return os.path.splitext(base)[0]


def process_text(text):
    # num of character in each line
    row_size = WIDTH / FONT_SIZE - 1
    # print row_len
    LEN = len(text)
    # print LEN
    count = LEN / row_size

    # for i in range(0, count):
    #     text = insert_character(text, i * row_size + i)

    textLst = str_to_strlist_by_nth(text, row_size)
    # print text
    return textLst


def write_text2img(text):
    # img = np.zeros([WIDTH, HEIGHT, 3], dtype=np.uint8)
    # img.fill(255) # or img[:] = 255
    # cv2.imwrite('F:/img_test/create_train_image/1215.jpg', img)
    # text = get_text_from_file()
    text_lst = process_text(text)

    blank = Image.new("RGB", [WIDTH, HEIGHT], "white")
    # blank = Image.new("L", [WIDTH, HEIGHT], "white")
    drawObject = ImageDraw.Draw(blank)
    # font = ImageFont.truetype()
    # Font1 = ImageFont.truetype("C:\Windows\Fonts\simsun.ttc", 36)
    Font1 = ImageFont.truetype(FONT_TYPE, FONT_SIZE)
    Font2 = ImageFont.truetype(FONT_TYPE, FONT_BLANK_SIZE)
    # text = u"我草草草草\n\n草我草草草草"
    # text = u"我草草草草草我草草草草"
    drawObject.ink = BLACK_COLOR

    lst_coord = []
    dic_word2coord = {}
    lst_word2coord = []

    size = len(text_lst)
    for i in range(0, size):
        row_text = text_lst[i]
        y = BEG_POINT + i * (FONT_SIZE + FONT_BLANK_SIZE)
        drawObject.text([BEG_POINT, y], row_text, font=Font1)
        drawObject.text([BEG_POINT, BEG_POINT + (i + 1) * FONT_SIZE + i * FONT_BLANK_SIZE], '\n', font=Font2)

        for j in range(0, len(row_text)):
            x = BEG_POINT + j * FONT_SIZE
            # drawObject.rectangle((x, y, FONT_SIZE, FONT_SIZE + 2), outline="red")
            lst_coord.append((x, y, x + FONT_SIZE, y + FONT_SIZE + 2))
            dic_word2coord[row_text[j]] = (x, y, FONT_SIZE, FONT_SIZE + 2)
            # lst_item = [row_text[j].encode('utf-8'), x, y, x + FONT_SIZE, y + FONT_SIZE + 2, 9]
            lst_item = [row_text[j].encode('utf-8'), x, HEIGHT - y - FONT_SIZE - 2, x + FONT_SIZE, HEIGHT - y, page_num]
            lst_word2coord.append(lst_item)

    blank.save(output_img)

    for j in range(0, len(lst_coord)):
        drawObject.rectangle(lst_coord[j], outline="red")
    # print dic_word2coord
    blank.show()
    # dict2txt(dic_word2coord)
    lst2txt(lst_word2coord)


def lst2txt(lst):
    filepath = output_txt
    with open(filepath, "w") as f:
        for item_lst in lst:
            # f.write(item[0].encode('utf-8') + str(item[1]) + ' ' + str(item[2]) + ' ' + str(item[3]) + '\n')
            # f.write(" ".join(item) + '\n')
            f.write(" ".join(str(item) for item in item_lst) + '\n')


def dict2txt(d):
    # txtfile = os.path.join(out_dir, output_txt)
    filepath = 'F:/img_test/create_train_image/output1.txt'
    with open(filepath, "w") as f:
        for (k, v) in d.items():
            k = k.encode('utf-8')
            # f.write(k + v[0] + v[1] + v[2] + v[3])
            f.write(k + ' ' + str(v[0]) + ' ' + str(v[1]) + ' ' + str(v[2]) + ' ' + str(v[3]) + '\n')
            # for p in d.items():
            #     f.write("%s:%s\n" % p)


def str_to_strlist_by_nth(str, nth):
    return [str[i:i + nth] for i in range(0, len(str), nth)]


def insert_character(string, index):
    return string[:index] + '\n' + string[index:]


def test():
    text = get_text_from_file()
    print process_text(text)


if __name__ == '__main__':
    do_All_Task()

    # print '%s%d%s%s.jpg' % (out_dir, 1, '_', 'abc')
    # print(os.path.splitext(FONT_TYPE)[0])
    # print(os.path.splitext(output_img)[0])
    # base = os.path.basename(FONT_TYPE)
    # print os.path.splitext(base)[0]
    # write_text2img()
    # print int(round(0.4))
    # print int(round(0.1 + 0.49))
    # test()
    # d = {u'\u7981': (205, 425, 255, 477), u'\u5c04': (5, 365, 55, 417)}
    # dict2txt(d)
    # print len(get_text_from_file())
    # str = u'1234我的5'
    # print str_to_strlist_by_nth(str, 3)

代码在个人github

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏文武兼修ing——机器学习与IC设计

P2P接口串行FIR设计

配置接口使用寄存器组实现,掉电丢失,因此每次使用之前需要进行配置FIR参数,配置接口时序如下所示:

15540
来自专栏Python小屋

使用Python提取JPEG图像文件dpi并计算物理尺寸

感谢浙江省浦江中学方春林老师提供的问题、测试图像和第一版本的代码! 下面的代码需要安装Python图像处理库pillow,由于不同公司对JPEG压缩算法和格式的...

613100
来自专栏黑白安全

如果银行卡只能使用六位数的密码到底有多安全?

我们使用的银行卡密码为 6 位数字,在 ATM 机上使用时如果连续输错 3 次密码就会被吞卡。那么如果有人捡到一张银行卡,拿到 ATM 机上去试密码,他在 3 ...

34750
来自专栏CreateAMind

InfoGAN修改训练人脸数据集celebA的过程记录

21910
来自专栏生信小驿站

R语言之可视化③点图续

函数scale_x_discrete可用于将项目的顺序更改为“2”,“0.5”,“1”:

9320
来自专栏Kubernetes

如何在Kubernetes集群中利用GPU进行AI训练

Author: xidianwangtao@gmail.com 注意事项 截止Kubernetes 1.8版本: 对GPU的支持还只是实验阶段,仍停留在A...

75970
来自专栏AI研习社

Github 项目推荐 | 农业知识图谱(KG):农业领域的信息检索,命名实体识别

https://github.com/qq547276542/Agriculture_KnowledgeGraph

41110
来自专栏AI研习社

Github 项目推荐 | TensorFlow 的模型分析工具 —— TFMA

TFMA 是一个用于评估 TensorFlow 模型的库,它可以让用户使用 Trainer 里定义的指标以分布式方式评估大量数据的模型。这些指标也可以在不同的数...

24420
来自专栏大数据文摘

TensorFlow 1.2.0新版本发布:新增Intel MKL优化深度学习基元

47140
来自专栏云霄雨霁

计算题总结

37100

扫码关注云+社区

领取腾讯云代金券