CASIA-HWDB 数据集是最常见的手写汉字识别数据集,它包含脱机、联机两部分,分单字、文本行两种类型:

  • HWDB1.x:脱机单字,1.0~1.2 三个版本,数据格式为 .gnt
  • OLHWDB1.x:联机单字,1.0~1.2 三个版本,
  • HWDB2.x:脱机文本行,1.0~1.2 三个版本,数据格式为 .dgrl
  • OLHWDB1.x:联机文本行,1.0~1.2 三个版本,

一般常用的汉字识别多为脱机单字识别,该部分数据格式为 .gnt,网络上针对这种数据的解析文章也很多,这里主要介绍文本行识别数据集,它的格式是 .dgrl,它的解析类似于 .gnt,但由于结构不同,具体的操作也不一样!

1、DGRL 文件格式介绍

.dgrl 格式如下图所示,它按照这种顺序依次存储,一张图对应一个 DGRL 文件,大部分内容都有固定的长度,部分内容长度不固定但是也能通过其他数据推导出来,我们可以通过访问文件特定位置的数据得到我们需要的内容:行文本标注,行图像。

举例来说:比如我们要读取图像中行数量,那首先要知道这个数据在哪个位置(就好像,python读文件要知道数据在哪一行)(1)我们先读取第一行的 4B 长度数据(4个字节),得到文件头的长度(也就是文件头占据多少行),假设是 n 行;(2)然后读取 n-1 行(第一行已经读过了),就来到了图像信息 Image Records 的位置,根据上图的结构,再读3个 4B 就可以拿到图像中行数量的数据了!

2、python 代码实现

读取 .dgrl 时先以二进制方式打开文件:

f = open(dgrl, 'rb')

然后用 numpy 挨个去读取,它的读取方式跟 f.readline() 类似,一个一个读,所以之前读了多少个数据就很重要!所以要指定读的格式、数量:

np.fromfile(f, dtype='uint8', count=4)

一般 dtype 都选择 uint8count 需要根据上图结构中的长度 Length 做相应变化。

要注意的一个地方是:行文本标注读取出来以后,是一个 int 列表,要把它还原成汉字,一个汉字占用两个字节(具体由 code_length 决定),使用 struct 将其还原:

struct.pack('I', i).decode('gbk', 'ignore')[0]

上面的 i 就是提取出来的汉字编码,解码格式为 gbk,有些行文本会有空格,解码可能会出错,使用 ignore 忽略。

import struct
import os
import cv2 as cv
import numpy as npdef read_from_dgrl(dgrl):if not os.path.exists(dgrl):print('DGRL not exis!')returndir_name,base_name = os.path.split(dgrl)label_dir = dir_name+'_label'image_dir = dir_name+'_images'if not os.path.exists(label_dir):os.makedirs(label_dir)if not os.path.exists(image_dir):os.makedirs(image_dir)with open(dgrl, 'rb') as f:# 读取表头尺寸header_size = np.fromfile(f, dtype='uint8', count=4)header_size = sum([j<<(i*8) for i,j in enumerate(header_size)])# print(header_size)# 读取表头剩下内容,提取 code_lengthheader = np.fromfile(f, dtype='uint8', count=header_size-4)code_length = sum([j<<(i*8) for i,j in enumerate(header[-4:-2])])# print(code_length)# 读取图像尺寸信息,提取图像中行数量image_record = np.fromfile(f, dtype='uint8', count=12)height = sum([j<<(i*8) for i,j in enumerate(image_record[:4])])width = sum([j<<(i*8) for i,j in enumerate(image_record[4:8])])line_num = sum([j<<(i*8) for i,j in enumerate(image_record[8:])])print('图像尺寸:')print(height, width, line_num)# 读取每一行的信息for k in range(line_num):print(k+1)# 读取该行的字符数量char_num = np.fromfile(f, dtype='uint8', count=4)char_num = sum([j<<(i*8) for i,j in enumerate(char_num)])print('字符数量:', char_num)# 读取该行的标注信息label = np.fromfile(f, dtype='uint8', count=code_length*char_num)label = [label[i]<<(8*(i%code_length)) for i in range(code_length*char_num)]label = [sum(label[i*code_length:(i+1)*code_length]) for i in range(char_num)]label = [struct.pack('I', i).decode('gbk', 'ignore')[0] for i in label]print('合并前:', label)label = ''.join(label)label = ''.join(label.split(b'\x00'.decode())) # 去掉不可见字符 \x00,这一步不加的话后面保存的内容会出现看不见的问题print('合并后:', label)# 读取该行的位置和尺寸pos_size = np.fromfile(f, dtype='uint8', count=16)y = sum([j<<(i*8) for i,j in enumerate(pos_size[:4])])x = sum([j<<(i*8) for i,j in enumerate(pos_size[4:8])])h = sum([j<<(i*8) for i,j in enumerate(pos_size[8:12])])w = sum([j<<(i*8) for i,j in enumerate(pos_size[12:])])# print(x, y, w, h)# 读取该行的图片bitmap = np.fromfile(f, dtype='uint8', count=h*w)bitmap = np.array(bitmap).reshape(h, w)# 保存信息label_file = os.path.join(label_dir, base_name.replace('.dgrl', '_'+str(k)+'.txt'))with open(label_file, 'w') as f1:f1.write(label)bitmap_file = os.path.join(image_dir, base_name.replace('.dgrl', '_'+str(k)+'.jpg'))cv.imwrite(bitmap_file, bitmap)

CASIA-HWDB2.x 数据集DGRL文件解析(python)相关推荐

  1. CASIA中文手写体字库gnt文件格式解析(python)

    最近在学python,刚好毕设要用到一些手写体字库.而CASIA将手写体图片封装在gnt文件中.所以用python练手来解析gnt文件. #!/usr/bin/pythonimport struct ...

  2. XML文件解析--Python

    目录 一.对xml的解析及其函数 Element对象有以下常用属性: 二.xml文件 三.python解析 四.示例图 源码: 一.对xml的解析及其函数 官方手册 XML 指可扩展标记语言XML 被 ...

  3. CASIA-OLHWDB2.0-2.2数据集wptt文件解析

    数据集链接:http://www.nlpr.ia.ac.cn/databases/handwriting/Online_database.html 每个页面都存储在以作者索引和页码命名的 *.wptt ...

  4. svg文件解析(python)

    参考: https://blog.csdn.net/weixin_39274753/article/details/82221859#commentBox https://www.cnblogs.co ...

  5. KITTI 数据集oxts 文件解析

    lat:   latitude of the oxts-unit (deg)  #维度 lon:   longitude of the oxts-unit (deg) # 经度 alt:   alti ...

  6. CASIA手写体数据集HWDB1.0 gnt和dgrl格式解析

    目录 引言 Gnt格式解析代码 dgrl格式解析代码 相关资料 引言 最近用到了CASIA这个手写体数据集,但是HWDB1.0~1.2系列其存储格式为gnt 虽说官网也给了读取方式,但是仍然具有一定门 ...

  7. 【VOC格式xml文件解析】——Python

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/4/26 12:49 # @Author : @linlianqin # @S ...

  8. python 数据分析之 HTML文件解析

    python 数据分析之 HTML文件解析 一 :Html 1. Html 理解 2. Html 介绍 3. Html 构成 4. HTML结构 介绍 1> HTML文件结构 A: 文档类型声明 ...

  9. CASIA -HWDB2.0-2.2和OLHWDB2.0-2.2数据集解析

    CASIA -HWDB2.0-2.2数据集解析 下载地址 数据集解释 HWDB解析dgrl为图像和txt 标签 转换代码 OLHWDB数据集wptt 解析成图像 转换代码 生成class 唯一值文本 ...

最新文章

  1. 《『若水新闻』客户端开发教程》——20.程序打包发布
  2. 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签
  3. android exittext记事本,GUI练习——记事本
  4. 2020年Java学习计划祝大家新年快乐
  5. JS正则表达式的分组匹配
  6. opencv 寻找图中的corners 利用自带 Shi-Tomasi Corner Detector 实现
  7. 发布HTML5 2D游戏引擎YEngine2D
  8. IOS 杂笔-14(被人遗忘的owner)
  9. 68.TextView设置中划线、下划线
  10. rpm方式安装mysql5.7_centos下rpm方式安装mysql5.7
  11. php 数组 utf8,PHP数组编码gbk与utf8互相转换的两种方法实例分享
  12. 公网IP地址获取:移动网络IP、Wifi IP
  13. FreeRTOS临界区操作
  14. 用python的re库统计《斗破苍穹》词频
  15. PyQt(Python+Qt)学习随笔:QTreeWidgetItem项列图标的访问方法
  16. Android P SELinux (三) 权限检查原理与调试
  17. numpy.meshgrid()理解
  18. Linux命令zip:压缩文件夹时,排除指定文件或文件夹
  19. Linux中正则表达式详细命令及代码(附实验笔记)
  20. 广西北海自愿连锁经营业/1040阳光工程上总之后的真实内幕

热门文章

  1. Python IDE开发环境
  2. gaussdb 优化建议
  3. spring的@Scheduled 定时任务没反应(三种配置方式)
  4. java线程中断 interrupt
  5. java入门基础学习
  6. (centos7-x86)编译安装zabbix6.0LTS+Mariadb10.5+Apache+php7.4【安装完整版】
  7. # Java 并发编程的艺术(一)
  8. LTspice基础教程-006.运行仿真与瞬态分析
  9. 阿里巴巴java开发手册(泰山版)在线阅览
  10. 新版本jdk(9、11、12、13、14)特性