前面用做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文字训练,以及样本生成相关推荐

  1. 【OCR技术系列之三】大批量生成文字训练集

    放假了,终于可以继续可以静下心写一写OCR方面的东西.上次谈到文字的切割,今天打算总结一下我们怎么得到用于训练的文字数据集.如果是想训练一个手写体识别的模型,用一些前人收集好的手写文字集就好了,比如中 ...

  2. 【OCR三】大批量生成文字训练集(转)

    放假了,终于可以继续可以静下心写一写OCR方面的东西.上次谈到文字的切割,今天打算总结一下我们怎么得到用于训练的文字数据集.如果是想训练一个手写体识别的模型,用一些前人收集好的手写文字集就好了,比如中 ...

  3. 文字识别(四)--大批量生成文字训练集

    转自:https://www.cnblogs.com/skyfsm/p/8436820.html 上次谈到文字的切割,今天打算总结一下我们怎么得到用于训练的文字数据集.如果是想训练一个手写体识别的模型 ...

  4. OCR技术(大批量生成文字训练集)

    如果是想训练一个手写体识别的模型,用一些前人收集好的手写文字集就好了,比如中科院的这些数据集.但是如果我们只是想要训练一个专门用于识别印刷汉字的模型,那么我们就需要各种印刷字体的训练集,那怎么获取呢? ...

  5. OCR技术3-大批量生成文字训练集

    如果是想训练一个手写体识别的模型,用一些前人收集好的手写文字集就好了,比如中科院的这些数据集.但是如果我们只是想要训练一个专门用于识别印刷汉字的模型,那么我们就需要各种印刷字体的训练集,那怎么获取呢? ...

  6. Tesseract OCR 训练字库

    Tesseract OCR是一款由HP实验室开发由Google维护的开源OCR引擎,在字符识别领域发挥着举足轻重的作用.除了使用软件自带的中英文识别库,我们可以使用Tesseract OCR训练属于自 ...

  7. 无需训练RNN或生成模型,我写了一个AI来讲故事

    作者 | Andre Ye 译者 | 弯月 出品 | AI科技大本营(ID:rgznai100) 这段日子里,我们都被隔离了,就特别想听故事.然而,我们并非对所有故事都感兴趣,有些人喜欢浪漫的故事,他 ...

  8. FGPM:文本对抗样本生成新方法

    ©PaperWeekly 原创 · 作者|孙裕道 学校|北京邮电大学博士生 研究方向|GAN图像生成.情绪对抗样本生成 论文标题: Fast Gradient Projection Method fo ...

  9. 训练集样本不平衡问题对CNN的影响

    转载自  训练集样本不平衡问题对CNN的影响 训练集样本不平衡问题对CNN的影响 本文首发于知乎专栏"ai insight"! 卷积神经网络(CNN)可以说是目前处理图像最有力的工 ...

  10. 阿里99大促 | 模型识别背后的样本生成

    背景 在上一篇文章详解阿里99大促活动页内容识别技术实现,我们介绍了在淘宝99大促中,我们使用了怎样的算法模型去识别并完成自动化测试的. 迫切解决的样本问题 淘宝大促有近百个模块.上千个页面,模块间具 ...

最新文章

  1. openwrt+linux编译,openwrt x86 编译部署
  2. 二维码 | 如何实现一码多用
  3. [K/3Cloud] 创建一个单据转换插件
  4. centos6.7一键装机
  5. linux启动redis_Redis简介
  6. ByteBuffer常用方法详解
  7. Python 的协程
  8. vue数组修改不触发视图更新、vue向响应式对象添加或删除属性
  9. css布局与ldquo;切图rdquo;
  10. 替换后的最长重复字符
  11. (37)一个合理的时序约束方法
  12. git切换到新的远程地址
  13. 测试开发工程师的学习之路---1--规划
  14. 智能陈桥输入法软件测试,智能陈桥五笔输入法
  15. java 错误声音播放器_JavaME 声音播放器的使用
  16. 说说远程团队协作的故事
  17. 麒麟处理器是基于arm的吗_直接采用ARM的CPU和GPU,那么麒麟芯片算自研吗?
  18. 个人微信小程序云开发总结心得
  19. 零零信安-DD数据泄露报警日报【第43期】
  20. 七牛云配置token-----CryptoJS.js

热门文章

  1. 红米note3总显示无服务器,红米note3死机了怎么办 具体解决措施【图文】
  2. 深度linux双系统切换快捷键,苹果 Mac双系统如何切换?用Option键切换双系统的步骤分享...
  3. 「TJOI 2018」碱基序列
  4. 学生表mysql查询语句
  5. Identification和Verification的区别
  6. jena java_对Jena的简单理解和一个例子
  7. macbook卡在进度条开不了机_Mac 开机停在进度条解决方法
  8. 用友添加附件设置文件服务器,用友服务器怎么配置上传附件
  9. java里arcsin_java编程用泰勒级数计算arcsin
  10. 【Java】Feil类概述