中科院好像把这个数据集从官网上撤掉了?我真的找遍全网,总算是找到了这个数据集,现在分享给大家。共六个文件,分别是CASIA-HWDB1.0训练集和测试集、CASIA-HWDB1.1训练集和测试集、CASIA-Competition数据集还有一张申请表。不过我看大多数人都是把前四个文件合并起来当做训练集,用Competition那个做测试集的。【注:2019年春节期间数据集的官网打不开,现在已经可以正常访问了】
下载链接:https://pan.baidu.com/s/1jyeo97h_PhWsFS4ngakwbw
还缺一个CASIA-HWDB1.2的数据集,是与之前的数据集类别不重合的,我没找到,要是谁有这个数据就在下边评论吧,谢谢!
顺便一提,CASIA-HWDB的官网可以用网页快照打开,猜一下原始的下载链接,挂在迅雷会员里是可以下载的,不过我发现下载界面是真的只有1.0和1.1,并没有提供1.2的下载,好奇怪呀......可能只能申请吧。
地址:http://web.archive.org/web/20180621154922/http://www.nlpr.ia.ac.cn/databases/handwriting/Download.html
我还写了个Reader类,可以方便地读取gnt文件,并转换为image-label对,欢迎使用。
import struct
from codecs import decode
from scipy.misc import toimage
import numpy as np
import PIL.ImageOps
class Reader:
def load_gnt_file(self, filename):
"""
Load characters and images from a given GNT file.
:param filename: The file path to load.
:return: (image: Pillow.Image.Image, character) tuples
"""
with open(filename, "rb") as f:
while True:
packed_length = f.read(4)
if packed_length == b'':
break
length = struct.unpack("<I", packed_length)[0]
raw_label = struct.unpack(">cc", f.read(2))
width = struct.unpack("<H", f.read(2))[0]
height = struct.unpack("<H", f.read(2))[0]
photo_bytes = struct.unpack("{}B".format(height * width), f.read(height * width))
label = decode(raw_label[0] + raw_label[1], encoding="gb2312")
image = toimage(np.array(photo_bytes).reshape(height, width))
yield image, label
def read_gnt_image(self, path):
data = self.load_gnt_file(path)
data_list = []
while True:
try:
image, label = next(data)
image = image.resize((32, 32)) # 图像缩放,根据自己的需求修改
image = PIL.ImageOps.invert(image) # 图像反色,根据自己的需求修改
data_list.append((image, label))
except StopIteration:
break
return data_list
大概这样使用
import os
reader = Reader()
dirs = ['database/HWDB1.1/', 'database/HWDB1.0/'] # 改成你的目录
data_list = []
for dir_path in dirs:
files = os.listdir(dir_path)
length = len(files)
for index, file in enumerate(files):
file_path = dir_path + file
data_list.extend(reader.read_gnt_image(file_path))
sys.stdout.write('\r>> Dealing gnt file %d/%d' % (index, length))
sys.stdout.flush()
sys.stdout.write('\n')
print(len(data_list))
网友评论