在申请书中介绍了数据集的基本情况:

> CASIA-HWDB 和 CASIA-OLHWDB 数据库由中科院自动化研究所在 2007-2010 年间收集, 均各自包含 1,020 人书写的脱机(联机)手写中文单字样本和手写文本, 用 Anoto 笔在点阵纸上书写后扫描、分割得到。

CASIA-HWDB 手写单字样本分为三个数据库:HWDB1.0~1.2,手写文本也分为三个数据库: HWDB2.0~2.2。

HWDB1.0~1.2 总共有 3,895,135 个手写单字样本,分属 7,356 类(7,185 个汉字和 171 个英文字母、数字、符号)。

HWDB2.0~2.2 总共有 5,091 页图像,分割为 52,230 个文本行和 1,349,414 个文字。所有文字和文本样本均存为灰度图像(背景已去除),按书写人序号分别存储。

CASIA-OLHWDB 手写单字样本分为三个数据库:OLHWDB1.0~1.2,手写文本也分为三个数据库: OLHWDB2.0~2.2。

OLHWDB1.0~1.2 总共有 3,912,017 个手写单字样本,分属 7,356 类(7,185 个汉字和 171 个英文字母、数字、符号)。

OLHWDB2.0~2.2 总共有 5,092 页手写文本,分割为 52,221 个文本行和 1,348,904 个文字。所有文字和文本样本均存为笔划坐标序列,按书写人序号分别存储。

> 学术研究的用途包括:手写文档分割、字符识别、字符串识别、文档检索、书写人适应、书写人鉴别等。

我将 Data Download 下的数据集都下载到了 root 目录下:

import os

root = 'E:/OCR/CASIA/'

os.listdir(root)

['1.0test-gb1.rar',

'1.0test-GB1.zip',

'1.0train-gb1.rar',

'1.0train-GB1.zip',

'competition-dgr.zip',

'competition-gnt.zip',

'competition_POT.zip',

'Competition_ptts.zip',

'HWDB1.0trn.zip',

'HWDB1.0tst.zip',

'HWDB1.1trn.zip',

'HWDB1.1trn_gnt.zip',

'HWDB1.1tst.zip',

'HWDB1.1tst_gnt.zip',

'mpf',

'OLHWDB1.0trn.zip',

'OLHWDB1.0tst.zip',

'OLHWDB1.1trn.zip',

'OLHWDB1.1trn_pot.zip',

'OLHWDB1.1tst.zip',

'OLHWDB1.1tst_pot.zip',

'text']

我将其特征数据封装为 HDF5 文件,便于数据的处理,下面是我写的 API:

import os

import sys

import zipfile, rarfile

import struct

import pandas as pd

import numpy as np

import tables as tb

import time

def getZ(filename):

name, end = os.path.splitext(filename)

if end == '.rar':

Z = rarfile.RarFile(filename)

elif end == '.zip':

Z = zipfile.ZipFile(filename)

return Z

class Bunch(dict):

def __init__(self, *args, **kwds):

super().__init__(*args, **kwds)

self.__dict__ = self

class MPF:

def __init__(self, fp):

self.fp = fp

header_size = struct.unpack('l', self.fp.read(4))[0]

self.code_format = self.fp.read(8).decode('ascii').rstrip('\x00')

self.text = self.fp.read(header_size - 62).decode().rstrip('\x00')

self.code_type = self.fp.read(20).decode('latin-1').rstrip('\x00')

self.code_length = struct.unpack('h', self.fp.read(2))[0]

self.data_type = self.fp.read(20).decode('ascii').rstrip('\x00')

self.nrows = struct.unpack('l', self.fp.read(4))[0]

self.ndims = struct.unpack('l', self.fp.read(4))[0]

def __iter__(self):

m = self.code_length + self.ndims

for i in range(0, m * self.nrows, m):

label = self.fp.read(self.code_length).decode('gbk')

data = np.frombuffer(self.fp.read(self.ndims), np.uint8)

yield data, label

class MPFBunch(Bunch):

def __init__(self, root, set_name, *args, **kwds):

super().__init__(*args, **kwds)

filename, end = os.path.splitext(set_name)

if 'HW' in filename and end == '.zip':

if '_' not in filename:

self.name = filename

Z = getZ(f'{root}{set_name}')

self._get_dataset(Z)

else:

#print(f'{filename}不是我们需要的文件!')

pass

def _get_dataset(self, Z):

for name in Z.namelist():

if name.endswith('.mpf'):

writer_ = f"writer{os.path.splitext(name)[0].split('/')[1]}"

with Z.open(name) as fp:

mpf = MPF(fp)

self.text = mpf.text

self.nrows = mpf.nrows

self.ndims = mpf.ndims

db = Bunch({label : data for data, label in iter(mpf)})

self[writer_] = pd.DataFrame.from_dict(db).T

class BunchHDF5(Bunch):

'''

pd.read_hdf(path, wname) 可以直接获取 pandas 数据

'''

def __init__(self, mpf, *args, **kwds):

super().__init__(*args, **kwds)

if 'name' in mpf:

print(f' {mpf.name} 写入进度条:')

start = time.time()

for i, wname in enumerate(mpf.keys()):

if wname.startswith('writer'):

_dir = f'{root}mpf/'

if not os.path.exists(_dir):

os.mkdir(_dir)

self.path = f'{_dir}{mpf.name}.h5'

mpf[wname].to_hdf(self.path, key = wname, complevel = 7)

k = sys.getsizeof(mpf) # mpf 的内存使用量

print('-' * (1 + int((time.time() - start) / k)), end = '')

if i == len(mpf.keys()) - 1:

print('\n')

class XCASIA(Bunch):

def __init__(self, root, *args, **kwds):

super().__init__(*args, **kwds)

self.paths = []

print('开始写入磁盘')

start = time.time()

for filename in os.listdir(root):

self.mpf = MPFBunch(root, filename)

BunchHDF5(self.mpf)

print(f'总共花费时间 {time.time() - start} 秒。')

root = 'E:/OCR/CASIA/'

%%time

xa = XCASIA(root)

开始写入磁盘

HWDB1.0trn 写入进度条:

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

HWDB1.0tst 写入进度条:

------------------------------------------------------------------------------------

HWDB1.1trn 写入进度条:

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

HWDB1.1tst 写入进度条:

------------------------------------------------------------

OLHWDB1.0trn 写入进度条:

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

OLHWDB1.0tst 写入进度条:

------------------------------------------------------------------------------------

OLHWDB1.1trn 写入进度条:

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

OLHWDB1.1tst 写入进度条:

------------------------------------------------------------

总共花费时间 618.7196779251099 秒。

Wall time: 10min 18s

这个 API 封装了 以下数据集:

import os

import pandas as pd

import tables as tb

root = 'E:/OCR/CASIA/'

下面我们来看一看,里面都是些什么:

mpf_root = f'{root}mpf/'

for filename in os.listdir(mpf_root):

with tb.open_file(f'{mpf_root}{filename}') as h5:

data = h5.root.HWDB10trn.writer001

label = np.asanyarray([lb.decode() for lb in data.label])

df = pd.DataFrame(data=data.feature[:], index=label)

break

df

‘HWDB1.0trn’ 数据集下写手 001 写的单字信息,总共有 3728 个汉字,每个汉字有 512 个特征。(由于该编译器不支持,故而只能截图。)

python识别手写文字_使用 python 获取 CASIA 脱机和在线手写汉字库相关推荐

  1. python识别人脸多种属性_用Python识别人脸,人种等各种信息

    最近几天了解了一下人脸识别,应用场景可以是图片标注,商品图和广告图中有没有模特,有几个模特,模特的性别,年龄,颜值,表情等数据的挖掘. 基础的识别用dlib来实现,dlib是一个机器学习的包,主要用C ...

  2. python怎么窗口显示文字_用python和pygame游戏编程入门-显示文字

    上一节我们通过键盘可以控制角色移动,如果要让角色说话,那就要用到文字显示.Pygame可以直接调用系统字体,或者也可以使用TTF字体,TTF就是字体文件,可以从网上下载.为了使用字体,你得先创建一个F ...

  3. python 视频语音转文字_使用Python和百度语音识别生成视频字幕的实现

    从视频中提取音频 安装 moviepy pip install moviepy 相关代码: audio_file = work_path + '\\out.wav' video = VideoFile ...

  4. python图片转换成文字_使用Python脚本将文字转换为图片的实例分享

    有时候,我们需要将文本转换为图片,比如发长微博,或者不想让人轻易复制我们的文本内容等时候.目前类似的工具已经有了不少,不过我觉得用得都不是很趁手,于是便自己尝试实现了一个. 在 Python 中,PI ...

  5. python 录音本地转文字_用Python将抖音视频转换为字符视频

    字符视频就是画面全部由字符组成的, 那么用代码怎么实现的呢?下面用python实现,话不多说,直接上干货. 代码实现详解 其实总体思路分为3个步骤: 1.将原视频分割成若干个图片以及分离出音频 2.将 ...

  6. python中float输入文字_为什么Python的float对于一些很长的输入会引发ValueError?

    因为在推断基数时会跳过零 证明for (bits_per_char = -1; n; ++bits_per_char) n >>= 1; /* n while (_PyLong_Digit ...

  7. 如何用Python识别图片中的文字?

    如何用Python识别图片中的文字? 转:https://mp.weixin.qq.com/s/wXDJoAAI8y1mtbUuwATngQ 以下文章来源于微信公众号:新建文件夹X ,作者ZackSo ...

  8. 学python的有哪些好书_学习python有哪些好书和学习方法?

    不请自来~ 上干货 <Python数据分析>作者: [印尼]Ivan Idris Python是一种多范型编程语言,既适用于面向对象的应用开发,又适合函数式设计模式.Python已经成为数 ...

  9. python批量识别图片中文字_如何用Python识别图片中的文字?

    一.前言 不知道大家有没有遇到过这样的问题,就是在某个软件或者某个网页里面有一篇文章,你非常喜欢,但是不能复制.或者像百度文档一样,只能复制一部分,这个时候我们就会选择截图保存.但是当我们想用到里面的 ...

最新文章

  1. 听说你的项目中仅这些资源就卡成了翔?看看他们怎么做!
  2. HDU 1863 畅通工程
  3. .NET Core 使用MailKit发送电子邮件
  4. pytorch中获取指定位置元素
  5. ftp匿名登录_flashfxp4,flashfxp4简介及好用的FTP工具
  6. Elasticsearch多种方案数据迁移
  7. 嵌入式中的通讯协议——UART、I2C、SPI、DMA
  8. 【面试记录】比亚迪二面
  9. mac的几个垃圾文件目录
  10. 【每日新闻】微软日本试行做四天休三天新制度 还发6000元补贴
  11. [OCCT] Open CASCADE Technology的编译(包含示例的编译)
  12. LAPARDIN WEDLUTS Romantic Wedding LUTs 浪漫唯美婚礼电影调色预设
  13. javascript弹出对话框
  14. Python生成兔年祝福词云图,快拿去发给小姐姐吧!祝大家兔年大吉,桃花运多多
  15. 沙盘SandBoxie4.14 特别版+无限试用补丁
  16. 莫凡的python_周莫凡python
  17. EMC测试(1)——辐射发射测试
  18. java计算机毕业设计vue图书档案管理系统源码+mysql数据库+系统+lw文档+部署
  19. 网络设备类型判断方法(原创)
  20. NRF24L01之数据手册要点解析和经验分享

热门文章

  1. realme GT neo5 手机关闭系统更新
  2. 联想服务器设置虚拟化,联想服务器虚拟化方案构建数字校园
  3. 北京奥运会Dashboard.Widgets
  4. 《老子·道德经》系列开篇
  5. Mac Dock栏显示/隐藏无延迟
  6. web用css做网页实验报告,web前端技术实验报告实验二
  7. Java正则表达式的概念及使用
  8. 精密加工与超精密加工的一些问题整理
  9. 《python语言程序设计》第5章 第35题,完整数 解题,第2天 一切又回到了启点 排名21297
  10. bzoj2150 部落战争 二分图匹配