读取mnist数据集并保存成图片

mnist数据集介绍、读取、保存成图片

  • 1、mnist数据集介绍:
  • MNIST数据集是一个手写体数据集,简单说就是一堆这样东西 
    图片
  • MNIST的官网地址是 MNIST; 通过阅读官网我们可以知道,这个数据集由四部分组成,分别是 
    图示;
  • 也就是一个训练图片集,一个训练标签集,一个测试图片集,一个测试标签集;我们可以看出这个其实并不是普通的文本文件或是图片文件,而是一个压缩文件,下载并解压出来,我们看到的是二进制文件,其中训练图片集的内容部分如此 
    示例 
    这些二进制数据如何解释呢?在这里我们只针对官网的说法,对训练图片集和训练标签集进行解说,测试集是一样的道理。
  • 针对训练标签集,官网上陈述有 
    图示 
    官网说法,训练集是有60000个用例的,也就是说这个文件里面包含了60000个标签内容,每一个标签的值为0到9之间的一个数;回到我们的训练标签集上,按上面说的,我们先解析每一个属性的含义,offset代表了字节偏移量,也就是这个属性的二进制值的偏移是多少;type代表了这个属性的值的类型;value代表了这个属性的值是多少;description是对这个的说明;所以呢,这里对上面的进行一下说明,它的说法是“从第0个字节开始有一个32位的整数,它的值是0x00000801,它是一个魔数;从第4个字节开始有一个32位的整数,它的值是60000,它代表了数据集的数量;从第8个字节开始有一个unsigned byte,它的值是??,是一个标签值….”;我们现在针对我们看到的文件进行解说,看图 
    图例 
    首先我们知道用sublime打开这个文件(是解压过的),是用十六进制表示的,也就是说里面的每一个数字代表了四个位,两个数字代表了一个字节;我们首先看到偏移量为0字节处0000 0801它就是代表了魔数,它的值为0000 0801,这里补充说一下什么是魔数,其实它就是一个校验数,用来判断这个文件是不是MNIST里面的train-labels.idx1-ubyte文件;接着往下看偏移量为4字节处0000 ea60,我们知道按照上面说过的这个应该是表示容量数,也就是60000,而60000的十六进制就是ea60,满足;再看偏移量为8字节处05,它就表示我们的标签值了,也就是说第一个图片的标签值为5,后面的也是依此类推;
  • 接下来我们来看训练图片集,同样从官网上可以看到 
    图示 
    其解说与上面的标签文件类似,但是这里还要补充说明一下,在MNIST图片集中,所有的图片都是28×28的,也就是每个图片都有28×28个像素;看回我们的上述图片,其表示,我们的train-images-idx3-ubyte文件中偏移量为0字节处有一个4字节的数为0000 0803表示魔数;接下来是0000 ea60值为60000代表容量,接下来从第8个字节开始有一个4字节数,值为28也就是0000 001c,表示每个图片的行数;从第12个字节开始有一个4字节数,值也为28,也就是0000 001c表示每个图片的列数;从第16个字节开始才是我们的像素值,用图片说话 
    图示;而且每784个字节代表一幅图片 
    我们可以看到文件的二进制内容同我们分析的是一样的。
  • 补充说明:在图示中我们可以看到有一个MSB first,其全称是”Most Significant Bit first”,相对称的是一个LSB first,“Least Significant Bit”; MSB first是指最高有效位优先,也就是我们的大端存储,而LSB对应小端存储;关于大端,小端,可以 参考

2、mnist数据集读取及保存成图片

代码一共有三个文件组成
ReadMnistData.h
ReadMnistData.cpp
Main.cpp
其中ReadMnistData.h和ReadMnistData.cpp文件中定义了读取文件和保存成图片的函数,Main.cpp中是设置读取文件路径和保存路径。只需要设置文件的读取路径和保存路径,然后运行就可以了。
下面给出Main.cpp的代码:
[cpp]  view plain  copy
  1. #include "ReadMnistData.h"  
  2.   
  3. int main()  
  4. {  
  5.     ReadMnistData rmd;  
  6.   
  7.     /*读取训练文件并保存成图片格式*/  
  8.     string filename_train_images = "C:\\Users\\lyf\\Desktop\\mnist\\train-images-idx3-ubyte";   //train images 文件路径  
  9.     string filename_train_labels = "C:\\Users\\lyf\\Desktop\\mnist\\train-labels-idx1-ubyte";   //train labels 文件路径  
  10.     string save_train_image_path = "C:\\Users\\lyf\\Desktop\\mnist\\train_images\\";        //train images 保存路径  
  11.     vector<cv::Mat> vec_train_images;         //保存读取的train images  
  12.     vector<int> vec_train_labels;             //保存读取的train labels  
  13.   
  14.     rmd.Read_Mnist_Images(filename_train_images, vec_train_images);         //读取train images  
  15.     cout << "-----------------------------" << endl;  
  16.     rmd.Read_Mnist_Labels(filename_train_labels, vec_train_labels);         //读取train labels  
  17.     cout << "-----------------------------" << endl;  
  18.     rmd.Save_Mnist_Images(save_train_image_path, vec_train_images, vec_train_labels);   //保存train_images  
  19.   
  20.     //==================================================================================  
  21.     /*读取测试文件并保存成图片格式*/  
  22.     string filename_test_images = "C:\\Users\\lyf\\Desktop\\mnist\\t10k-images-idx3-ubyte";     //test images 文件路径  
  23.     string filename_test_labels = "C:\\Users\\lyf\\Desktop\\mnist\\t10k-labels-idx1-ubyte";     //test labels 文件路径  
  24.     string save_test_image_path = "C:\\Users\\lyf\\Desktop\\mnist\\test_images\\";          //test images 保存路径  
  25.     vector<cv::Mat> vec_test_images;          //保存读取的test images  
  26.     vector<int> vec_test_labels;              //保存读取的test labels  
  27.       
  28.     rmd.Read_Mnist_Images(filename_test_images, vec_test_images);           //读取test images  
  29.     cout << "-----------------------------" << endl;  
  30.     rmd.Read_Mnist_Labels(filename_test_labels, vec_test_labels);           //读取test labels  
  31.     cout << "-----------------------------" << endl;  
  32.     rmd.Save_Mnist_Images(save_test_image_path, vec_test_images, vec_test_labels);  //保存test_images  
  33.   
  34.     return 0;  
  35. }  
其它两个文件的代码就不贴出了,如需请自行下载: 读取mnist数据集并保存成图片
代码运行效果如下:


最后图片保存的结果如下:
文件命名格式:
如 0_00001.jpg:0表示对应图片的内容,即标签;00001表示标签为0的图片中第1张图片,00002为第2张图片,以此类推........


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值