zoukankan      html  css  js  c++  java
  • 将Mnist手写数字库转化为图片形式 和标签形式

    Mnist 数据文件有两种,一种是图片文件,一种是标签文件,那么如何把他们解析出来呢?

    1)解析图片文件

      可以看出在train-images.idx3-ubyte中,第一个数为32位的整数(魔数,图片类型的数),第二个数为32位的整数(图片的个数),第三和第四个也是32为的整数(分别代表图片的行数和列数),接下来的都是一个字节的无符号数(即像素,值域为0~255),因此,我们只需要依次获取魔数和图片的个数,然后获取图片的长和宽,最后逐个像素读取就可以了。

    (2)解析标签文件

      

      可以发现,与上面的非常相似,只不过这里每一个字节变成了标签而已(标签大小为0~9)
      如何使用python解析数据呢? 首先需要安装python的图形处理库PIL,这个库支持像素级别的图像处理,对于学习数字图像处理有很大的帮助。安装完成之后,就可以进行图像的解析了。看一下代码:

    from PIL import Image
    import struct
    
    
    def read_image(filename):
        f = open(filename,'rb')
        index = 0
        buf = f.read()
        f.close()
        magic, images, rows, columns = struct.unpack_from('>IIII' , buf , index)
        index += struct.calcsize('>IIII')
    
        for i in range(images):
            image = Image.new('L', (columns, rows))
            for x in range(rows):
                for y in range(columns):
                    image.putpixel((y, x), int(struct.unpack_from('>B', buf, index)[0]))
                    index += struct.calcsize('>B')
    
            print('save ' + str(i) + 'image')
            image.save('E:/Mnist/' + str(i) + '.png')
    
    
    def read_label(filename, saveFilename):
        f = open(filename, 'rb')
        index = 0
        buf = f.read()
        f.close()
        magic, labels = struct.unpack_from('>II' , buf , index)
        index += struct.calcsize('>II')
        labelArr = [0] * labels
        for x in range(labels):
            labelArr[x] = int(struct.unpack_from('>B', buf, index)[0])
            index += struct.calcsize('>B')
            save = open(saveFilename, 'w')
            save.write(','.join(map(lambda x: str(x), labelArr)))
            save.write('
    ')
            save.close()
            print('save labels success')
    
    
    if __name__ == '__main__':
         read_image('E:/Python/t10k-images.idx3-ubyte')
        read_label('E:/Python/t10k-labels.idx1-ubyte', 'E:/Mnist_Label/label.txt')

    程序的具体流程为:

      首先打开文件,然后分别读取魔数,图片个数,以及行数和列数,在struct中,可以看到,使用了’>IIII’,这是什么意思呢?意思就是使用大端规则,读取四个整形数(Integer),如果要读取一个字节,则可以用’>B’(当然,这里用没用大端规则都是一样的,因此只有两个或两个以上的字节才有用)。

       什么是大端规则呢?不懂的可以百度一下,这个不再赘述(http://baike.baidu.com/link?url=Bgg8b0vRr3b_SeGyOl8U4DmAbIQT9swGuNtD_21ctEI_NliqsQ-mKF73YT90EILF2EQy50mEua_M4z6Cma3rmK)

    引自博客:

    原文:https://blog.csdn.net/u014046170/article/details/47445919

    最后效果:

      

  • 相关阅读:
    csu 1141 节能
    WA:ZOJ 1025 Wooden Sticks
    UVa 531 Compromise
    UVa 437 The Tower of Babylon
    UVa 10285 Longest Run on a Snowboard
    在asp.net使用web.config身份验证
    掌握 Ajax,第 6 部分: 建立基于 DOM 的 Web 应用程序
    面向对象编程思想
    一步一步学Remoting之五:异步操作
    Asp.net 2.0 用 FileUpload 控件实现多文件上传 用户控件(示例代码下载)
  • 原文地址:https://www.cnblogs.com/carlber/p/9824976.html
Copyright © 2011-2022 走看看