热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CNOCR重训练

前不久在实验室接手一个项目,与甲方几经周旋后给了一个接口,核心部分是yolo3的文字检测与cnocr的文本识别。在文本识别中,由于给的预训练的模型的训练数据集与项目应用的数据分布差

前不久在实验室接手一个项目,与甲方几经周旋后给了一个接口,核心部分是yolo3的文字检测与cnocr的文本识别。在文本识别中,由于给的预训练的模型的训练数据集与项目应用的数据分布差距较大(最明显的是识别字符的范围不同),可能需要对模型重新训练。为应对甲方朋友的一时兴起,特意花了一个下午搞清楚如何重新训练。特撰写此博客以作记录。

一、重训练cnocr的理由

"""
识别范围不同,cnocr提供的模型只能够识别:中文字符,英文字符与若干特殊字符。
但实际应用中,希腊字母也是较为常见的。
经排查,cnocr的模型仅能识别包括:α与β两个希腊字母!
这对于一个理工科男是绝对不能忍的,重训,必须重训!
"""

二、准备工作

下载cnocr工程文件。


git clone https://github.com/breezedeus/cnocr.git
cd cnocr

三、数据集准备

尽管在/cnocr/scripts/cnocr_train.py中提到了两个数据集captcha与cn_ocr,读者们可以从项目的issues中去找相关的链接。下面主要讲我们如何准备自己的数据。

1)新建文件夹datasets,文件夹中新建子目录self_dataset_001,如图,我们将在这里边创建我们自己的数据集。

2)在自己的电脑上找到微软雅黑(msyh)字体,以windows10为例,在“C:\Windows\Fonts”下查找到msyh.ttc,复制过来即可(当然如果想要识别其他印刷体也可以换用其他字体)。

3)/cnocr/examples下找到label_cn.txt文件,打开可以看到:总共有6000+不重复字符,基本涵盖了所有常见的汉字与字母与特殊字符(偏偏就是没有希腊字母 = =);复制一份到刚刚新建的datasets下。

4)self_dataset_001下新准备两个 .txt 文件,分别为:train.txt 和 test.txt ,内容如下:

,其中,两个文件夹的内容是一样的,都是一行一行的文本,格式为:

xxxxxxxxxx.jpg
"""
根据模型本身的训练设置需要,每一行都是 10 个字符,这里小编是为了方便随便找了几段文本拼凑的。
"""

这样的命名是与小编自己写的生成代码有关的。由于小编是一边摸索一边修改的代码,所以过程与代码可能不大优雅,见笑了!

5)执行以下的生成文件:

"""
/cnocr/datasets/data_generator.py
"""
import os
import matplotlib.pyplot as plt
import numpy as np
import pygame
pygame.init()
fOnt= pygame.font.Font('msyh.ttc', 64)
def writing(txt, pth):
r_txt = font.render(txt, True, (0, 0, 0), (255, 255, 255))
pygame.image.save(r_txt, os.path.join(pth, txt+'.jpg'))
def indexing(txt):
res = []
for i in range(len(txt)):
try:
res.append(standards.index(txt[i]+'\n')+1)
except:
new_chrs.append(txt[i])
res.append(len(standards)+len(new_chrs)+1)
return res
if __name__ == '__main__':
pth = 'self_dataset_001'
f_tr = open(os.path.join(pth, 'train.txt'), encoding='utf-8-sig')
f_ts = open(os.path.join(pth, 'test.txt' ), encoding='utf-8-sig')
f_st = open('label_cn.txt', 'r', encoding='utf-8-sig')
f_tr2 = open(os.path.join(pth, 'train2.txt'), 'w', encoding='utf-8-sig')
f_ts2 = open(os.path.join(pth, 'test2.txt' ), 'w', encoding='utf-8-sig')
train_items = f_tr.readlines()
test_items = f_ts.readlines()
standards = f_st.readlines()
new_chrs = []
f_tr.close()
f_ts.close()
f_st.close()
for i in range(len(train_items)):
txt = train_items[i].split(".")[0]
idxes = indexing(txt)
img = writing(txt, pth)
cnt = "train_%06d.jpg"%i
os.rename(os.path.join(pth, txt+'.jpg'), os.path.join(pth, cnt))
for idx in idxes:
cnt = cnt + " {}".format(idx)
f_tr2.write(cnt+'\n')
for i in range(len(train_items)):
txt = test_items[i].split(".")[0]
idxes = indexing(txt)
img = writing(txt, pth)
cnt = "test_%06d.jpg"%i
os.rename(os.path.join(pth, txt+'.jpg'), os.path.join(pth, cnt))
for idx in idxes:
cnt = cnt + " {}".format(idx)
f_ts2.write(cnt+'\n')
fh = open('label_cn.txt', 'a', encoding='utf-8-sig')
for nw in new_chrs:
fh.write(nw+'\n')
fh.close()

结果是对应 train.txt 和 test.txt 的每一行,渲染了一张图像 “train_xxxxxx.jpg”或者“test_xxxxxx.jpg”的图像,保存在 self_dataset_001 下,

同时在该子目录下还生成了另外两个 .txt 文件:train2.txt 和 test2.txt。形式如下:

即,每一行的格式为:

train_xxxxxx.jpg idx1 idx2 idx3 idx4 idx5 idx6 idx7 idx8 idx9 idx10
"""
11个字段,
第一个对应文件名,方便代码读取对应的文字图像;
后面跟着的10个数字,按顺序对应文字图像里每个字符在 label_cn.txt 文件中的索引(从 1 开始)
"""

值得注意的是,小编在 data_generator.py 文件中增加了对于新字符自动添加至 label_cn.txt 末尾的功能

四、开始训练

修改 /cnocr/scripts/cnocr_train.py 的 parser 的定义,如下图,即修改数据集相关的三个参数的默认值。

返回到 /cnocr 目录,执行:

python scripts/cnocr_train.py --cpu 2 --num_proc 4 --loss ctc

训练需要花蛮长时间的,完了后应该也是像cnocr提到的替换模型就可以了吧,这一点小编还没尝试,目前只是初步弄懂了如何训练,希望热情的读者如果有成功的经验可以不吝指教哈!


推荐阅读
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
author-avatar
吴台吉国瑋智仁
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有