承接上篇爬取了想要的数据集之后,先将图片的尺寸统一。(我自己爬取了涂鸦,油画,素描这3类图片)
关于涂鸦数据集爬下来的图片,其中混入了一些妹子和西海岸黑人黑帮文化的图片。(为什么我也不知道。。。)注意清除,数据集的好坏很关键!
resize
先统一图片格式32*32
# coding=utf-8
from PIL import Image
import os.path
import glob
def convertjpg(jpgfile,outdir,width=32,height=32):
img = Image.open(jpgfile)
try:
new_img = img.resize((width,height),Image.BILINEAR)
new_img.save(os.path.join(outdir,os.path.basename(jpgfile)))
except Exception as e:
print(e)
for jpgfile in glob.glob("./素描/*.jpg"):
convertjpg(jpgfile,"./素描数据集")
方方正正的效果不错
分类
然后是分类,我设定的规则是
类别 | 名称 |
---|---|
0 | 涂鸦数据集 |
1 | 油画数据集 |
2 | 素描数据集 |
通过批量修改文件前缀来判断,如2_1.jpg因为是2_的前缀说明是素描图像
#coding:utf-8
import os
movie_name = os.listdir('./油画数据集')
for temp in movie_name:
new_name = '1_' + temp
os.rename('./油画数据集/'+temp,'油画数据集/'+new_name)
归一化,生成数组
把数据集集中在data文件夹下,然后读取数据,顺便将数据归一化
import os
import numpy as np
import tensorflow as tf
from PIL import Image
train = True
data_dir = "data"
model_path = "../image_model"
def read_data(data_dir):
datas = []
labels = []
fpaths = []
for fname in os.listdir(data_dir):
fpath = os.path.join(data_dir, fname)
fpaths.append(fpath)
image = Image.open(fpath)
data = np.array(image)/255.0
label = int(fname.split("_")[0])
datas.append(data)
labels.append(label)
datas = np.array(datas)
labels = np.array(labels)
print("shape of datas: {}\tshape of labels: {}".format(datas.shape,
labels.shape))
return fpaths, datas, labels
fpaths, datas, labels = read_data(data_dir)
num_classes = len(set(labels))
注意!在生成数组(np.array)的时候很可能会出现通道数不同的情况,尤其是素描数据集有大量的黑白图片,这个时候要手动删除那些不合格的图片。具体来说有些图是灰度图,位深度是8而RGB的位深度是24,在属性中可以查看
把那些不合格的图片删除以后就完成了自制数据集啦(手动撒花)
结果如下(我一共收集了596张32×32×3的图片):
shape of datas: (596, 32, 32, 3) shape of labels: (596,)