Tesseract文字训练,以及样本生成
前面用做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 osCREATE_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 * 256FONT_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 = 47def 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 - 1columnLen = HEIGHT / (FONT_SIZE + FONT_BLANK_SIZE)if HEIGHT % (FONT_SIZE + FONT_BLANK_SIZE) > FONT_SIZE:columnLen += 1pageWordsNum = rowLen * columnLenpageNum = float(textLen) / (pageWordsNum)pageNum = int(round(pageNum + 0.499))textLst = str_to_strlist_by_nth(text, pageWordsNum)# for item in textLst:# print itemreturn pageNum, textLstdef 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_numoutput_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 += 1def 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 linerow_size = WIDTH / FONT_SIZE - 1# print row_lenLEN = len(text)# print LENcount = 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 textreturn textLstdef 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_COLORlst_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_word2coordblank.show()# dict2txt(dic_word2coord)lst2txt(lst_word2coord)def lst2txt(lst):filepath = output_txtwith 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
Tesseract文字训练,以及样本生成相关推荐
- 【OCR技术系列之三】大批量生成文字训练集
放假了,终于可以继续可以静下心写一写OCR方面的东西.上次谈到文字的切割,今天打算总结一下我们怎么得到用于训练的文字数据集.如果是想训练一个手写体识别的模型,用一些前人收集好的手写文字集就好了,比如中 ...
- 【OCR三】大批量生成文字训练集(转)
放假了,终于可以继续可以静下心写一写OCR方面的东西.上次谈到文字的切割,今天打算总结一下我们怎么得到用于训练的文字数据集.如果是想训练一个手写体识别的模型,用一些前人收集好的手写文字集就好了,比如中 ...
- 文字识别(四)--大批量生成文字训练集
转自:https://www.cnblogs.com/skyfsm/p/8436820.html 上次谈到文字的切割,今天打算总结一下我们怎么得到用于训练的文字数据集.如果是想训练一个手写体识别的模型 ...
- OCR技术(大批量生成文字训练集)
如果是想训练一个手写体识别的模型,用一些前人收集好的手写文字集就好了,比如中科院的这些数据集.但是如果我们只是想要训练一个专门用于识别印刷汉字的模型,那么我们就需要各种印刷字体的训练集,那怎么获取呢? ...
- OCR技术3-大批量生成文字训练集
如果是想训练一个手写体识别的模型,用一些前人收集好的手写文字集就好了,比如中科院的这些数据集.但是如果我们只是想要训练一个专门用于识别印刷汉字的模型,那么我们就需要各种印刷字体的训练集,那怎么获取呢? ...
- Tesseract OCR 训练字库
Tesseract OCR是一款由HP实验室开发由Google维护的开源OCR引擎,在字符识别领域发挥着举足轻重的作用.除了使用软件自带的中英文识别库,我们可以使用Tesseract OCR训练属于自 ...
- 无需训练RNN或生成模型,我写了一个AI来讲故事
作者 | Andre Ye 译者 | 弯月 出品 | AI科技大本营(ID:rgznai100) 这段日子里,我们都被隔离了,就特别想听故事.然而,我们并非对所有故事都感兴趣,有些人喜欢浪漫的故事,他 ...
- FGPM:文本对抗样本生成新方法
©PaperWeekly 原创 · 作者|孙裕道 学校|北京邮电大学博士生 研究方向|GAN图像生成.情绪对抗样本生成 论文标题: Fast Gradient Projection Method fo ...
- 训练集样本不平衡问题对CNN的影响
转载自 训练集样本不平衡问题对CNN的影响 训练集样本不平衡问题对CNN的影响 本文首发于知乎专栏"ai insight"! 卷积神经网络(CNN)可以说是目前处理图像最有力的工 ...
- 阿里99大促 | 模型识别背后的样本生成
背景 在上一篇文章详解阿里99大促活动页内容识别技术实现,我们介绍了在淘宝99大促中,我们使用了怎样的算法模型去识别并完成自动化测试的. 迫切解决的样本问题 淘宝大促有近百个模块.上千个页面,模块间具 ...
最新文章
- openwrt+linux编译,openwrt x86 编译部署
- 二维码 | 如何实现一码多用
- [K/3Cloud] 创建一个单据转换插件
- centos6.7一键装机
- linux启动redis_Redis简介
- ByteBuffer常用方法详解
- Python 的协程
- vue数组修改不触发视图更新、vue向响应式对象添加或删除属性
- css布局与ldquo;切图rdquo;
- 替换后的最长重复字符
- (37)一个合理的时序约束方法
- git切换到新的远程地址
- 测试开发工程师的学习之路---1--规划
- 智能陈桥输入法软件测试,智能陈桥五笔输入法
- java 错误声音播放器_JavaME 声音播放器的使用
- 说说远程团队协作的故事
- 麒麟处理器是基于arm的吗_直接采用ARM的CPU和GPU,那么麒麟芯片算自研吗?
- 个人微信小程序云开发总结心得
- 零零信安-DD数据泄露报警日报【第43期】
- 七牛云配置token-----CryptoJS.js
热门文章
- 红米note3总显示无服务器,红米note3死机了怎么办 具体解决措施【图文】
- 深度linux双系统切换快捷键,苹果 Mac双系统如何切换?用Option键切换双系统的步骤分享...
- 「TJOI 2018」碱基序列
- 学生表mysql查询语句
- Identification和Verification的区别
- jena java_对Jena的简单理解和一个例子
- macbook卡在进度条开不了机_Mac 开机停在进度条解决方法
- 用友添加附件设置文件服务器,用友服务器怎么配置上传附件
- java里arcsin_java编程用泰勒级数计算arcsin
- 【Java】Feil类概述