目录

  • 引言
  • Gnt格式解析代码
  • dgrl格式解析代码
  • 相关资料

引言

  • 最近用到了CASIA这个手写体数据集,但是HWDB1.0~1.2系列其存储格式为gnt
  • 虽说官网也给了读取方式,但是仍然具有一定门槛
  • 于是上网搜了解析gnt格式的python代码,找到了CASIA中文手写体字库gnt文件格式解析(python)
  • 这篇博客代码是2014年用python2写的,有些年久失修,正好顺手修复一下,改为了python3的

Gnt格式解析代码

# !/usr/bin/env python
# -*- encoding: utf-8 -*-
# @File: data_process.py
# @Author: SWHL
# @Contact: liekkaskono@163.com
import struct
from pathlib import Pathfrom PIL import Imagedef write_txt(save_path: str, content: list, mode='w'):"""将list内容写入txt中@paramcontent: list格式内容save_path: 绝对路径str@return:None"""with open(save_path, mode, encoding='utf-8') as f:for value in content:f.write(value + '\n')path = 'raw_data'
save_dir = 'HWDB1'  # 目录下均为gnt文件gnt_paths = list(Path(path).iterdir())label_list = []
for gnt_path in gnt_paths:count = 0print(gnt_path)with open(str(gnt_path), 'rb') as f:while f.read(1) != "":f.seek(-1, 1)count += 1try:# 只所以添加try,是因为有时f.read会报错 struct.error: unpack requires a buffer of 4 bytes# 原因尚未找到length_bytes = struct.unpack('<I', f.read(4))[0]tag_code = f.read(2)width = struct.unpack('<H', f.read(2))[0]height = struct.unpack('<H', f.read(2))[0]im = Image.new('RGB', (width, height))img_array = im.load()for x in range(height):for y in range(width):pixel = struct.unpack('<B', f.read(1))[0]img_array[y, x] = (pixel, pixel, pixel)filename = str(count) + '.png'tag_code = tag_code.decode('gbk').strip('\x00')save_path = f'{save_dir}/images/{gnt_path.stem}'if not Path(save_path).exists():Path(save_path).mkdir(parents=True, exist_ok=True)im.save(f'{save_path}/{filename}')label_list.append(f'{gnt_path.stem}/{filename}\t{tag_code}')except:breakwrite_txt(f'{save_dir}/gt.txt', label_list)

dgrl格式解析代码

# !/usr/bin/env python
# -*- encoding: utf-8 -*-
# @Author: SWHL
# @Contact: liekkaskono@163.com
import os
import struct
from pathlib import Pathimport cv2 as cv
import numpy as np
from tqdm import tqdmdef 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)# 去掉不可见字符 \x00,这一步不加的话后面保存的内容会出现看不见的问题label = ''.join(label.split(b'\x00'.decode()))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)if __name__ == '__main__':dgrl_paths = Path('dataset/HandWriteDBRecog/HWDB2.2Train').iterdir()dgrl_paths = list(dgrl_paths)for dgrl_path in tqdm(dgrl_paths):read_from_dgrl(dgrl_path)

相关资料

  • CASIA 在线和离线中文手写数据库
  • CASIA中文手写体字库gnt文件格式解析(python)

CASIA手写体数据集HWDB1.0 gnt和dgrl格式解析相关推荐

  1. CASIA-HWDB2.x 数据集DGRL文件解析(python)

    CASIA-HWDB 数据集是最常见的手写汉字识别数据集,它包含脱机.联机两部分,分单字.文本行两种类型: HWDB1.x:脱机单字,1.0~1.2 三个版本,数据格式为 .gnt OLHWDB1.x ...

  2. 利用TCN网络实现MNIST手写体数据集的识别

    利用TCN网络实现MNIST手写体数据集的识别 TCN识别MNIST的GitHub网址 https://github.com/locuslab/TCN 论文来源 https://arxiv.org/p ...

  3. 计算机视觉(十)——Tensorflow对Mnist手写体数据集做手写体识别

    博文主要内容 分析Mnist手写体数据集 实现手写体识别的原理和代码实现 分析Mnist数据集中一些歧义数据 实验中遇到的一些问题 分析Mnist手写体数据集 MNIST 数据集来自美国国家标准与技术 ...

  4. 【机器学习】SVM支持向量机在手写体数据集上进行二分类、采⽤ hinge loss 和 cross-entropy loss 的线性分类模型分析和对比、网格搜索

    2022Fall 机器学习 1. 实验要求 考虑两种不同的核函数:i) 线性核函数; ii) ⾼斯核函数 可以直接调⽤现成 SVM 软件包来实现 ⼿动实现采⽤ hinge loss 和 cross-e ...

  5. 中国地面气候资料日值数据集(V3.0)

    1.数据集信息 数据集中文名称:中国国家级地面气象站基本气象要素日值数据集(V3.0) 数据集代码:SURF_CLI_CHN_MUL_DAY 数据集版本:V3.0 2.数据文件命名由数据集代码(SUR ...

  6. 周志华《机器学习》3.5答案-编程实现线性判别分析,并给出西瓜数据集3.0α上的结果

    #机器学习线性判别分析3.5题 import numpy as np import matplotlib.pyplot as plt data = [[0.697, 0.460, 1],[0.774, ...

  7. 机器学习《西瓜书》9.4解答——k-means算法:编程实现k均值算法,设置三组不同的k值、三组不同初始中心点,在西瓜数据集4.0上进行实验比较,并讨论什么样的初始中心有助于得到好结果。

    1.运行结果:(注:图中方块标注的点为随机选取的初始样本点) k=2时: 本次选取的2个初始向量为[[0.243, 0.267], [0.719, 0.103]] 共进行61轮 共耗时0.10s k= ...

  8. 【数据集处理】中国地面气候资料日值数据集(V3.0)

    1 数据集介绍-中国地面气候资料日值数据集(V3.0) 中国地面气候资料日值数据集(V3.0)包含以下气象数据资料(包括降水.气温.风速等). 2 数据处理 以湿度数据(RHU) 处理为例,数据文件如 ...

  9. VOC数据集mAP计算(附带代码)解析

    VOC数据集mAP计算(附带代码)解析 一.几个概念 IoU:交并比 (目标检测实际上是分类问题,检测器在图片上以不同像素尺度生成大量的框,如果检测器认为某个框里存在物体,就把它画出来) TP:画出了 ...

最新文章

  1. Task2.特征提取
  2. java客户端作为kafka生产者测试
  3. 本想用Python爬遍知乎,没想到却被知乎反杀
  4. java读取excel某个单元格的值_[转载]Java读取Excel中的单元格数据
  5. 智能一代云平台(一):一些思考
  6. flask mysql环境配置_Flask教程4:数据库
  7. SpringBoot+vue项目实战(一)
  8. 第2章-10 输出华氏-摄氏温度转换表
  9. jqueryui引用出错(base is not a constructor,widget no found)
  10. outlook2007 有一个程序正试图以您的名义自动发送电子邮件
  11. 最燃黑客情报官薛锋:端起AK伏特加,代表人民把坏人抓
  12. 天诚股价语音播报软件 实时播报A股股票价格涨跌幅MACD
  13. Unity3D IAP Google支付
  14. 小瓦怕扫地机器人_小瓦扫地机器人青春版app下载-小瓦扫地机器人米家app下载v5.6.81 安卓版-西西软件下载...
  15. 【PTA】7-14 猴子吃桃问题
  16. linux nvme文件系统,Intel NVMe驱动器扇区大小不是4096的xfs文件系统的性能下降
  17. Win10、Win7定时开关机
  18. 今目标自动签退1.1版本
  19. OpenGL实现鱼眼矫正实时视频处理
  20. 自动控制原理概念梳理(保研面试用)

热门文章

  1. FT2004(D2000)开发实战之AMD HD8570显卡驱动适配
  2. 软件工程—软件工程学概述
  3. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第38讲:PHP数据库编程mysql
  4. JavaScript:实现复制粘贴剪切功能
  5. 用ChatGPT实际沟通的结果[有图有真相]
  6. goldengate静默安装方法
  7. python自动化测试教程百度云盘_Python接口自动化测试框架实战视频教程百度云下载...
  8. python如何关闭excel窗口_EXCEL应用程序窗口未关闭工作簿。关闭()
  9. python读取身份证照片信息_20行代码教你用Python改变身份证照片的背景色,python,给,证件照,换,底色...
  10. 友商WakeLock中camera场景功耗异常策略洞察