AI人工智能-公开数据集

mtain 2024年03月05日 54次浏览

1. MNIST

说明

手写数字的数据集,该数据库具有60,000个示例的训练集和10,000个示例的测试集。

MNIST数据集中的图片数据以ubyte格式存储,ubyte是一种无符号字节类型,取值范围在0~255之间。

解析MNIST数据集中的图片数据可以通过以下步骤完成:

  1. 读取文件头信息:MNIST数据集中的图片数据文件头部包含四个字节的magic number和四个字节的数据集大小信息。magic number用于确定文件类型,数据集大小信息包括数据集中的图片数量和每张图片的大小信息。
  2. 读取图片数据:MNIST数据集中的每个数据都由一个标签(label)和一个图片(image)组成。标签用于表示图片中的数字,图片用28x28的像素矩阵表示。
  3. 将读取的图片数据转换为图像矩阵:MNIST数据集中的每张图片都是由28x28个像素组成的,每个像素的灰度值都在0~255之间。读取图片数据后,需要将它们转换成28x28的矩阵表示。
    MNIST数据集中的标签数据以ubyte格式存储,标签文件为"train-labels-idx1-ubyte.gz"和"t10k-labels-idx1-ubyte.gz",其中前者存储了训练数据的标签,后者存储了测试数据的标签。每个标签都是一个整数,用于表示相应图片中的数字。

将ubyte格式数据存储为图片脚本

import struct
import numpy as np
from PIL import Image
import pathlib


class MnistParser:
   # 加载图像
   def load_image(self, file_path):

       # 读取二进制数据
       binary = open(file_path,'rb').read()

       # 读取头文件
       fmt_head = '>iiii'
       offset = 0

       # 读取头文件
       magic_number,images_number,rows_number,columns_number = struct.unpack_from(fmt_head,binary,offset)

       # 打印头文件信息
       print('图片数量:%d,图片行数:%d,图片列数:%d'%(images_number,rows_number,columns_number))

       # 处理数据
       image_size = rows_number * columns_number
       fmt_data = '>'+str(image_size)+'B'
       offset = offset + struct.calcsize(fmt_head)

       # 读取数据
       images = np.empty((images_number,rows_number,columns_number))
       for i in range(images_number):
           images[i] = np.array(struct.unpack_from(fmt_data, binary, offset)).reshape((rows_number, columns_number))
           offset = offset + struct.calcsize(fmt_data)
           # 每1万张打印一次信息
           if (i+1) % 10000 == 0:
               print('> 已读取:%d张图片'%(i+1))

       # 返回数据
       return images_number,rows_number,columns_number,images


   # 加载标签
   def load_labels(self, file_path):
       # 读取数据
       binary = open(file_path,'rb').read()

       # 读取头文件
       fmt_head = '>ii'
       offset = 0

       # 读取头文件
       magic_number,items_number = struct.unpack_from(fmt_head,binary,offset)

       # 打印头文件信息
       print('标签数:%d'%(items_number))

       # 处理数据
       fmt_data = '>B'
       offset = offset + struct.calcsize(fmt_head)

       # 读取数据
       labels = np.empty((items_number))
       for i in range(items_number):
           labels[i] = struct.unpack_from(fmt_data, binary, offset)[0]
           offset = offset + struct.calcsize(fmt_data)
           # 每1万张打印一次信息
           if (i+1)%10000 == 0:
               print('> 已读取:%d个标签'%(i+1))

       # 返回数据
       return items_number,labels


   # 图片可视化
   def visualaztion(self, images, labels, path):
       d = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0}
       for i in range(images.__len__()):
            picSavePath = path + str(int(labels[i])) + "/"
            directory = pathlib.Path(picSavePath)
            directory.mkdir(parents=True, exist_ok=True)
            
            im = Image.fromarray(np.uint8(images[i]))
            im.save(picSavePath + "%d.png"%(d[labels[i]]))
            d[labels[i]] += 1
            # im.show()
            
            if (i+1)%10000 == 0:
               print('> 已保存:%d个图片'%(i+1))
               

# 保存为图片格式
def change_and_save():
    mnist =  MnistParser()

    trainImageFile = './train-images-idx3-ubyte'
    _, _, _, images = mnist.load_image(trainImageFile)
    trainLabelFile = './train-labels-idx1-ubyte'
    _, labels = mnist.load_labels(trainLabelFile)
    trainSavePath = "./images/train/"
    directory = pathlib.Path(trainSavePath)
    directory.mkdir(parents=True, exist_ok=True)
    mnist.visualaztion(images, labels, trainSavePath)

    testImageFile = './train-images-idx3-ubyte'
    _, _, _, images = mnist.load_image(testImageFile)
    testLabelFile = './train-labels-idx1-ubyte'
    _, labels = mnist.load_labels(testLabelFile)
    testSavePath = "./images/test/"
    directory = pathlib.Path(testSavePath)
    directory.mkdir(parents=True, exist_ok=True)
    mnist.visualaztion(images, labels, testSavePath)


if __name__ == '__main__':
    change_and_save()

用途

AI学习,识别0-9手写数字

下载地址

http://yann.lecun.com/exdb/mnist/

文件列表

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),测试图像标签

2. ImageNet

说明

ImageNet项目是一个用于视觉对象识别软件研究的大型可视化数据库。超过1400万的图像URL被ImageNet手动注释,以指示图片中的对象;在至少一百万个图像中,还提供了边界框。ImageNet包含2万多个类别; [2]一个典型的类别,如“气球”或“草莓”,包含数百个图像。第三方图像URL的注释数据库可以直接从ImageNet免费获得;但是,实际的图像不属于ImageNet。自2010年以来,ImageNet项目每年举办一次软件比赛,即ImageNet大规模视觉识别挑战赛(ILSVRC),软件程序竞相正确分类检测物体和场景。 ImageNet挑战使用了一个“修剪”的1000个非重叠类的列表。2012年在解决ImageNet挑战方面取得了巨大的突破,被广泛认为是2010年的深度学习革命的开始。

用途

  • 图像分类
  • 目标检测
  • 目标定位
  • 视频目标检测

下载地址

https://image-net.org/

文件列表

  • ILSVRC2012_img_train.tar
  • ILSVRC2012_img_val.tar

3. ImageNet

说明

DeepMind团队首次将miniImageNet数据集用于小样本学习研究,
从此miniImageNet成为了元学习和小样本领域的基准数据集。

DeepMind的那篇小样本学习的论文就是大名鼎鼎的Matching Network的来源:
Matching Networks for One Shot Learning 。

miniImageNet包含100类共60000张彩色图片,
其中每类有600个样本,每张图片的规格为84 × 84(使用pro_images处理后的尺寸) 。
通常而言,这个数据集的训练集和测试集的类别划分为:80 : 20。
相比于CIFAR10数据集,miniImageNet数据集更加复杂,但更适合进行原型设计和实验研究。

用途

AI小样本学习

下载地址

文件列表

4. CIFAR-10/CIFAR-100

说明

CIFAR-100 是一个图像数据集,包含 60000 张 32x32 分辨率的彩色图像,根据图像内容被分为 100 个小类别,包括:airplane、automobile、bird、cat、deer、dog、frog、horse、ship、truck,10个大类下的10个小类,类别之间的交集为空。
image.png

用途

AI小样本学习

下载地址

文件列表