解压手写数字数据库MNIST,网上找了几个教程,最后自己写了一个


目录

  1. MNIST介绍
  2. struct模块介绍
  3. 解压实现
  4. 相关实现

MNIST介绍

参考:THE MNIST DATABASE

MNIST是手写数字数据库,共有60000张训练图像和10000张测试图像

共有4个文件,保存训练图像和标签文件以及测试图像和标签文件:

train-images-idx3-ubyte.gz:  training set images (9912422 bytes)
train-labels-idx1-ubyte.gz:  training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz:   test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz:   test set labels (4542 bytes)

这几个文件以IDX文件格式保存,并不是常规的文件格式,需要自己写程序解析

IDX文件格式

IDX文件可用于各种数值类型的向量和多维矩阵等简单格式的保存

基本格式如下:

magic number
size in dimension 0
size in dimension 1
size in dimension 2
.....
size in dimension N
data

刚开始是一个魔法数字,然后接下来是第0维大小,第1维大小...以此类推,最后是字节数据

手写数字文件格式说明

MNIST手写数字文件以big-endian方式存储

标签文件格式如下:

[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000801(2049) magic number (MSB first)
0004     32 bit integer  60000            number of items
0008     unsigned byte   ??               label
0009     unsigned byte   ??               label
........
xxxx     unsigned byte   ??               label
The labels values are 0 to 9.

4个字节是magic-number4-8个字节是标签数量,后面每个字节表示一个标签数字(0-9)

图像文件格式如下:

[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000803(2051) magic number
0004     32 bit integer  60000            number of images
0008     32 bit integer  28               number of rows
0012     32 bit integer  28               number of columns
0016     unsigned byte   ??               pixel
0017     unsigned byte   ??               pixel
........
xxxx     unsigned byte   ??               pixel

4个字节是magic-number4-8个字节是标签数量,9-12字节是行数(高度),13-16字节是列数(宽度),后面每个字节表示一个像素值


struct模块介绍

参考:struct — Interpret bytes as packed binary data

struct模块是Python内置模块,可以执行字节数组的解析和转换,常用的函数有

struct.pack(format, v1, v2, ...)

该函数用于将v1,v2...等数值转换成字节数组,其中v1,v2...等数值的类型由format指定

struct.unpack(format, buffer)

该函数将字节数组重新解析成相应的数值,以元组形式返回

注意:需要指定正确的format格式

format

参考:Format Strings

format不仅可以指定操作数值的类型,还可以指定保存字节存储方式Byte-Order

示例一:将两个整型数字保存为字节

>>> import struct
>>> byte_arr = struct.pack('ii', 1, 2)
>>> byte_arr
b'\x01\x00\x00\x00\x02\x00\x00\x00'

其中'i'表示将Python Integer类型转换成4字节数组,参考Format Characters

有多少数字需要转换,那就在format字符串中加入多少个'i'

如果要转换多个同类型数字,也可以用如下方式

>>> struct.pack('2i', 1, 2)
b'\x01\x00\x00\x00\x02\x00\x00\x00'

示例二:将示例一的字节数组转换成数字

>>> struct.unpack('2i', byte_arr)
(1, 2)

示例三:指定字节存储模式

format字符串加上大于号(>)表示大端存储(big-endian),小于号(<)表示小端存储(little-endian

>>> struct.pack('>2i', 1, 2)
b'\x00\x00\x00\x01\x00\x00\x00\x02'
>>>
>>> struct.pack('<2i', 1, 2)
b'\x01\x00\x00\x00\x02\x00\x00\x00'

解压实现

实现如下:

# -*- coding: utf-8 -*-import os
import struct
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt__author__ = 'zj'# MNIST文件目录
data_dir = "C:\\datasets\\mnist"
# 结果文件名
result_file_name = 'decompress_mnist'train = 'train'
test = 'test'
train_image_file = 'train-images.idx3-ubyte'
train_label_file = 'train-labels.idx1-ubyte'
test_image_file = 't10k-images.idx3-ubyte'
test_label_file = 't10k-labels.idx1-ubyte'def decompress_label(label_file_path):"""解压标签文件:param label_file_path: 标签文件路径:return: list"""with open(label_file_path, 'rb') as f:magic_number = int.from_bytes(f.read(4), byteorder='big')image_number = int.from_bytes(f.read(4), byteorder='big')# print(magic_number)# print(image_number)fmt = '>B'byte_num = 1label_list = []for i in range(image_number):label_list.append(struct.unpack(fmt, f.read(byte_num))[0])# print(number_list)return label_listdef decompress_image(image_file_path):"""解压图像文件:param image_file_path: 图像文件路径:return:"""with open(image_file_path, 'rb') as f:magic_number = int.from_bytes(f.read(4), byteorder='big')image_number = int.from_bytes(f.read(4), byteorder='big')height = int.from_bytes(f.read(4), byteorder='big')width = int.from_bytes(f.read(4), byteorder='big')print('number: %d height: %d  width: %d' % (image_number, height, width))img_len = height * widthfmt = '>' + str(img_len) + 'B'image_list = []for i in range(image_number):img = struct.unpack(fmt, f.read(img_len))img = np.reshape(img, (height, width))image_list.append(img)return image_listdef decompress_image_save(image_file_path, label_list, res_dir):"""解压图像文件并保存:param image_file_path: 图像文件路径:param label_list: 标签列表:param res_dir: 结果路径:return:"""with open(image_file_path, 'rb') as f:magic_number = int.from_bytes(f.read(4), byteorder='big')image_number = int.from_bytes(f.read(4), byteorder='big')height = int.from_bytes(f.read(4), byteorder='big')width = int.from_bytes(f.read(4), byteorder='big')print('number: %d height: %d  width: %d' % (image_number, height, width))img_len = height * widthfmt = '>' + str(img_len) + 'B'nums = [0 for i in range(10)]for i in range(image_number):img = struct.unpack(fmt, f.read(img_len))img = np.reshape(img, (height, width))image_dir = os.path.join(res_dir, str(label_list[i]))if not os.path.exists(image_dir):os.mkdir(image_dir)image_path = os.path.join(image_dir, str(nums[label_list[i]]) + ".png")cv.imwrite(image_path, img)nums[label_list[i]] += 1def decompress():"""解压图像和标签文件:return:"""# 创建结果文件路径des_dir = os.path.join(data_dir, result_file_name)if not os.path.exists(des_dir):os.mkdir(des_dir)des_train_dir = os.path.join(des_dir, train)if not os.path.exists(des_train_dir):os.mkdir(des_train_dir)des_test_dir = os.path.join(des_dir, test)if not os.path.exists(des_test_dir):os.mkdir(des_test_dir)print('mkdir result dir ok')label_list = decompress_label(os.path.join(data_dir, train_label_file))decompress_image_save(os.path.join(data_dir, train_image_file), label_list, des_train_dir)print('load image and label ok')label_list = decompress_label(os.path.join(data_dir, test_label_file))decompress_image_save(os.path.join(data_dir, test_image_file), label_list, des_test_dir)print('load image and label ok')def show_image(img_list):# plt.figure(figsize=(10, 5))  # 设置窗口大小plt.figure()plt.suptitle('MNIST')  # 图片名称rows = 10cols = 10for i in range(cols):for j in range(rows):plt.subplot(rows, cols, j * cols + i + 1)plt.imshow(img_list[j * cols + i], cmap='gray'), plt.axis('off')plt.savefig('./mnit.png')plt.show()if __name__ == '__main__':decompress()# image_list = decompress_image(os.path.join(data_dir, test_image_file))# show_image(image_list[:100])

解压好的文件资源如下:

MNIST handwritten digits


相关实现

Python读取mnist

使用Python解析MNIST数据集(IDX文件格式)

python-mnist 0.6

Python MNIST解压相关推荐

  1. python批量解压文件_python 批量解压压缩文件的实例代码

    下面给大家介绍python 批量解压压缩文件的实例代码,代码如下所述: #/usr/bin/python#coding=utf-8import os,sys import zipfile open_p ...

  2. Python通过解压ofd文件获取发票信息

    Python通过解压ofd文件获取发票信息 实际上ofd.docx.xlsx等文件就是一个压缩文件,是可以被解压处理的.所以我们把一个ofd格式的发票文件解压后就可以看到它的目录,如下: 再用谷歌或者 ...

  3. python批量解压文件,python批量解压zip文件的方法

    python怎样压缩和解压缩ZIP文件 说明 python使用zipfile模块来压缩和解压zip文件 才能最好于孤独中培养:品格最好在世界的汹涌波涛中形成. 代码 import os,os.path ...

  4. Python压缩解压zip,Django下载zip文件

    Python压缩解压zip 压缩 import zipfile def convert_zip(zip_path, save_path):'''# zip_path 要压缩文件的路径# save_pa ...

  5. python批量解压批量压缩文件夹(逐个)

    系列文章目录 文章目录 系列文章目录 前言 一.python批量解压 二.python批量压缩 总结 前言 一.python批量解压 提示:如果是重要数据解压前请先备份,解压后会覆盖原压缩文件!! 解 ...

  6. Python加解压文件gzip库操作一文详解

    目录 一.gzip GZIP概念 文件格式 二.Python gzip库 gzip.open gzip.GzipFile压缩和解压 gzip.comress()压缩数据 解压数据 第一种 第二种 第三 ...

  7. python循环解压rar文件

    python循环解压rar文件 C:. │ main.py │ ├─1_STL_算法简介 │ STL_算法简介.rar │ └─2_STL_算法_填充新值STL_算法_填充新值.rar 事情是这样的, ...

  8. 【python】解压文件

    参考:http://essen.iteye.com/blog/1941489 tarfile模块 具体使用方法: https://docs.python.org/2/library/tarfile.h ...

  9. python制作解压工具_使用python制作一个解压缩软件

    python实现解压缩的重要模块就是--zipfile,其次是os 安装zipfile模块 首先得安装zipfile模块,打开cmd输入一下命令即可安装 pip install zipfile os是 ...

最新文章

  1. Mysql for Mac 安装及环境配置
  2. 如果要存ip地址,用什么数据类型比较好?
  3. Unity3d多线程
  4. MYSQL储存过程和储存函数和变量
  5. 【论文阅读整理】A Survey on Device-free Indoor Localization and Tracking in the Multi-resident Environment
  6. Android多媒体之视频播放器高级开发
  7. subversion mysql_MySQL数据库之httpd+mysql+php+subversion
  8. 业务链路升级中如何做数据洞察?
  9. iOS9.3.3骚扰电话拦截黑名单数据库
  10. 文件上传(FileUpload)
  11. javacv获取摄像头列表
  12. 二、echarts地图从全国进省从省进市
  13. java 防重复提交_Java中如何避免重复提交请求
  14. 初学者使用HTML简单做一个自我介绍
  15. macbook pro 重置 NVRAM / PRAM
  16. 计算机怎么取消脱敏设置,脸过敏如何治疗 脸部快速脱敏的妙招
  17. [Linux]基于SQLite数据库的停车管理系统
  18. 怎么保存网页为html格式,怎样保存网页部分内容为html格式?
  19. 当RxJava遇上Retrofit
  20. 跨境电商“洋码头”,真正的对手是谁?

热门文章

  1. 韦布尔分布 matlab,MATLAB绘制威布尔分布曲线
  2. matlab进行威布尔2参数估计,基于遗传算法的威布尔分布的参数估计及MATLAB实现...
  3. 从语聊房 SDK 的诞生,看 PaaS 服务的演进过程
  4. Java中级面试常见题目+答案
  5. 【MPC的前身方法一】(5.2)【不使用机器人模型】反馈+前馈的控制方式计算反作用力+反作用力计算与线性约束的优化(即带不等式约束的最小二乘问题)方法
  6. 三星I9220获取ROOT权限
  7. Raki的读paper小记:Forget-free Continual Learning with Winning Subnetworks
  8. python贝叶斯分类器_朴素贝叶斯分类器的简单Python实现
  9. mouseleave 和 mouseout 区别
  10. 软件项目管理与素质拓展-2.1为何学管理