最近想弄点样本来做个简单的图片分类,期望能找到所有的样本图片文件和标签文件,这样就可以模拟实际场景下进行机器学习了。在网上找了一番,都是打包的数据,也有解析出样本图片的,但是都不是很全,例如缺少标签。下面就尝试从cifar-10中获取所有图片和样本数据。
cifar-10 数据集介绍请看官网:
http://www.cs.toronto.edu/~kriz/cifar.html
样本共有10个分类:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车
数据集有60000张 32x32 像素彩色图片(RGB)
注意这里的RGB很重要,在训练过程中要和MNIST区分开,因为MNIST是单色的而cifar-10是RGB的。
每个类别图片有6000张,10个类别图片共60000张 = 训练图片50000张 + 测试图片10000张。
先从官网下载样本数据集如下:
好了,有个样本数据集我们现在将样本解析成图片保存到本地,我们希望图片的命名方式可以显示出其类别,例如:1_cat.png,78_airplan.png。
打开spyder开始编写代码 cifar-10可视化.py:
import pickle as p
import numpy as np
from PIL import Image
import os
#加载数据
def load_CIFAR_batch(filename):
with open(filename, 'rb') as f:
datadict = p.load(f,encoding='latin1')
X = datadict['data']
Y = datadict['labels']
X = X.reshape(10000, 3, 32, 32)
Y = np.array(Y)
return X, Y
#将标签转换成英文
def getLabelType(typeIndex,label):
index = label[typeIndex]
if index == 0:
return "airplane"
if index == 1:
return "automobile"
if index == 2:
return "bird"
if index == 3:
return "cat"
if index == 4:
return "deer"
if index == 5:
return "dog"
if index == 6:
return "frog"
if index == 7:
return "horse"
if index == 8:
return "ship"
if index == 9:
return "truck"
#创建每个batch图片保存的文件夹
def mkdir(path):
folder = os.path.exists(path)
if not folder:
os.makedirs(path)
print("创建文件夹"+path)
return 1
else:
return 0
#保存图片和标签
def saveImgAndLabel(tag):
saveDir = "./batch_images_"+str(tag)
if mkdir(saveDir) == 0:
return
if tag == "test":
imgX, labelX = load_CIFAR_batch("./test_batch") #加载测试数据集
else:
imgX, labelX = load_CIFAR_batch("./data_batch_"+str(tag)) #加载训练数据集
for i in range(0,10000):
imgs = imgX[i]
img0 = imgs[0]
img1 = imgs[1]
img2 = imgs[2]
#生成image对象RGB
i0 = Image.fromarray(img0)
i1 = Image.fromarray(img1)
i2 = Image.fromarray(img2)
img = Image.merge("RGB",(i0,i1,i2))
#这里是生成英文标签的名字
label = getLabelType(i,labelX)
name = str(i)+'_'+label+'.png'
img.save(saveDir+"/"+name,"png")
print(name)
#程序入口
if __name__ == "__main__":
for i in range(1,7):
if i == 6:
saveImgAndLabel('test')
else:
saveImgAndLabel(i)
print("保存完毕.")
运行完成后当前目录如下:
我们打开看一下:
ok,60000张彩色图片带标签都生成了,现在看这些图片感觉直观多了,我们可以针对这些样本开始自己的训练了。
下一篇我们再拿这些样本(假设这些样本是自己实际场景的)进行训练。一步一步从最基本、最原始的开始。