思路:1。搜集图片,修改图片格式为28x28,灰度图像
2。把图片和标签关联起来,制作csv,每行为图片地址和图片的标签
3。把图片和标签打包成ubyte文件
最后没成功
1。
#####resize图片为28x28的灰度图
from skimage import transform
import matplotlib.pyplot as plt
import numpy as np
import os
from PIL import Image
pic_dir = 'C:\\Users\\antonio\\Desktop\\tf_xx\\mydata-mnist-fall\\jpg\\'#图片文件夹所在文件地址
pic_file_list = os.listdir(pic_dir)#图片文件夹列表
for each_file in pic_file_list:#指向每一个文件
pic_file = os.path.join(pic_dir,each_file)#指向每一个文件
pic_list = os.listdir(pic_file)#文件夹内所有图片名称列表
for each_pic in pic_list:#每一个图片的名字
pic_file_dir = os.path.join(pic_file,each_pic)#图片的地址
img = Image.open(pic_file_dir)
img_re = img.resize((28,28),Image.BILINEAR)#双线性插值为期望大小
img_gray = img_re.convert('L')#转换为灰度图像
img_gray.save(pic_file_dir)
2。
#####制作数字标签CSV,每次会覆盖之前数据
import os,os.path
indir = 'C:\\Users\\antonio\\Desktop\\tf_xx\\mydata-mnist-fall\\jpg\\'
outdir = 'C:\\Users\\antonio\\Desktop\\tf_xx\\mydata-mnist-fall\\csv\\'
label0 = '0'
label1 = '1'
label2 = '2'
label3 = '3'
label4 = '4'
label5 = '5'
label6 = '6'
label7 = '7'
label8 = '8'
label9 = '9'
label = [label0,label1,label2,label3,label4,label5,label6,label7,label8,label9]
filelist = os.listdir(indir)
filelist.sort()
with open(outdir + 'data.csv','w') as data:
for each_item in filelist:#每一个文件夹
pic_file = os.path.join(indir,each_item)#每个文件夹内图片的位置,指向图片所在文件夹
pic_list = os.listdir(pic_file)#图片的名称列表
for each_pic in pic_list:
pic_dir = os.path.join(pic_file , each_pic)#图片地址,指向图片
print(pic_dir)
data.write(pic_dir + ' ' + label[int(each_item)] + '\n')
3。
#####从csv中的图片和标签构建ubyte文件
from PIL import Image
import struct
import os
import matplotlib.pyplot as plt
import csv
data_dir = 'C:\\Users\\antonio\\Desktop\\tf_xx\\mydata-mnist-fall\\csv\\data.csv'#csv文件地址
encoding = 'utf-8'#解码模式
csv_open = csv.reader(open(data_dir,encoding=encoding))#打开csv文件
pic_dir_list = []#图片地址列表
label_list = []#标签列表
for each in csv_open:#打开之后是列表的列表
each_name,each_label = each[0].split()
pic_dir_list.append(each_name)#把地址加到列表中
label_list.append(each_label)
#####把每一个图片写到ubyte文件中
image_ubyte = "train-images-idx3-ubyte"
label_ubyte = "train-labels-idx1-ubyte"
def write_image():
image_file = open(image_ubyte,'wb')
image_file.write(struct.pack('i',50855936))#魔术码
image_file.write(struct.pack('B',50))#50个图片
image_file.write(struct.pack('B',28))#图片高
image_file.write(struct.pack('B',28))#图片宽
for each in pic_dir_list:
im = Image.open(each)
for i in range(28):#28x28的图像
for j in range(28):
image_file.write(struct.pack('B',im.getpixel((j,i))))#把每个像素写入文件
image_file.close()
print('write image success!!')
def write_label():
label_file = open(label_ubyte,'wb')
label_file.write(struct.pack('i',17301504))#魔术码
label_file.write(struct.pack('B',50))#50个label
for each in label_list:
label_file.write(struct.pack('B',int(each)))#把每个标签按二进制打包,把标签换为0123456789,不是输出的十位二进制,one_hot会复原
label_file.close()
print('write label success!!')
if __name__ == '__main__':
write_label()
write_image()
print('all has been done successfully!!')
4。结果
不知道为什么,还好暂时用不到,以后用到的时候再改吧。。。