内容简介:在照着Tensorflow官网的demo敲了一遍分类器项目的代码后,运行倒是成功了,结果也不错。但是最终还是要训练自己的数据,所以尝试准备加载自定义的数据,然而demo中只是出现了首先提一下需要用到的模块:图片分类器项目,首先确定你要处理的图片分辨率将是多少,这里的例子为30像素:
Tensorflow分类器项目自定义数据读入
在照着Tensorflow官网的demo敲了一遍分类器项目的代码后,运行倒是成功了,结果也不错。但是最终还是要训练自己的数据,所以尝试准备加载自定义的数据,然而demo中只是出现了 fashion_mnist.load_data() 并没有详细的读取过程,随后我又找了些资料,把读取的过程记录在这里。
首先提一下需要用到的模块:
import os import keras import matplotlib.pyplot as plt from PIL import Image from keras.preprocessing.image import ImageDataGenerator from sklearn.model_selection import train_test_split
图片分类器项目,首先确定你要处理的图片分辨率将是多少,这里的例子为30像素:
IMG_SIZE_X = 30 IMG_SIZE_Y = 30
其次确定你图片的方式目录:
image_path = r'D:\Projects\ImageClassifier\data\set' path = ".\data" # 你也可以使用相对路径的方式 # image_path =os.path.join(path, "set")
目录下的结构如下:
相应的label.txt如下:
动漫 风景 美女 物语 樱花
接下来是接在labels.txt,如下:
label_name = "labels.txt"
label_path = os.path.join(path, label_name)
class_names = np.loadtxt(label_path, type(""))
这里简便起见,直接利用了numpy的loadtxt函数直接加载。
之后便是正式处理图片数据了,注释就卸载里面了:
re_load = False
re_build = False
# re_load = True
re_build = True
data_name = "data.npz"
data_path = os.path.join(path, data_name)
model_name = "model.h5"
model_path = os.path.join(path, model_name)
count = 0
# 这里判断是否存在序列化之后的数据,re_load是一个开关,是否强制重新处理,测试用,可以去除。
if not os.path.exists(data_path) or re_load:
labels = []
images = []
print('Handle images')
# 由于label.txt是和图片防止目录的分类目录一一对应的,即每个子目录的目录名就是labels.txt里的一个label,所以这里可以通过读取class_names的每一项去拼接path后读取
for index, name in enumerate(class_names):
# 这里是拼接后的子目录path
classpath = os.path.join(image_path, name)
# 先判断一下是否是目录
if not os.path.isdir(classpath):
continue
# limit是测试时候用的这里可以去除
limit = 0
for image_name in os.listdir(classpath):
if limit >= max_size:
break
# 这里是拼接后的待处理的图片path
imagepath = os.path.join(classpath, image_name)
count = count + 1
limit = limit + 1
# 利用Image打开图片
img = Image.open(imagepath)
# 缩放到你最初确定要处理的图片分辨率大小
img = img.resize((IMG_SIZE_X, IMG_SIZE_Y))
# 转为灰度图片,这里彩色通道会干扰结果,并且会加大计算量
img = img.convert("L")
# 转为numpy数组
img = np.array(img)
# 由(30,30)转为(1,30,30)(即`channels_first`),当然你也可以转换为(30,30,1)(即`channels_last`)但为了之后预览处理后的图片方便这里采用了(1,30,30)的格式存放
img = np.reshape(img, (1, IMG_SIZE_X, IMG_SIZE_Y))
# 这里利用循环生成labels数据,其中存放的实际是class_names中对应元素的索引
labels.append([index])
# 添加到images中,最后统一处理
images.append(img)
# 循环中一些状态的输出,可以去除
print("{} class: {} {} limit: {} {}"
.format(count, index + 1, class_names[index], limit, imagepath))
# 最后一次性将images和labels都转换成numpy数组
npy_data = np.array(images)
npy_labels = np.array(labels)
# 处理数据只需要一次,所以我们选择在这里利用numpy自带的方法将处理之后的数据序列化存储
np.savez(data_path, x=npy_data, y=npy_labels)
print("Save images by npz")
else:
# 如果存在序列化号的数据,便直接读取,提高速度
npy_data = np.load(data_path)["x"]
npy_labels = np.load(data_path)["y"]
print("Load images by npz")
image_data = npy_data
labels_data = npy_labels
到了这里原始数据的加工预处理便已经完成,只需要最后一步,就和demo中 fashion_mnist.load_data() 返回的结果一样了。代码如下:
# 最后一步就是将原始数据分成训练数据和测试数据
train_images, test_images, train_labels, test_labels = \
train_test_split(image_data, labels_data, test_size=0.2, random_state=6)
这里将相关信息打印的方法也附上:
print("_________________________________________________________________")
print("%-28s %-s" % ("Name", "Shape"))
print("=================================================================")
print("%-28s %-s" % ("Image Data", image_data.shape))
print("%-28s %-s" % ("Labels Data", labels_data.shape))
print("=================================================================")
print('Split train and test data,p=%')
print("_________________________________________________________________")
print("%-28s %-s" % ("Name", "Shape"))
print("=================================================================")
print("%-28s %-s" % ("Train Images", train_images.shape))
print("%-28s %-s" % ("Test Images", test_images.shape))
print("%-28s %-s" % ("Train Labels", train_labels.shape))
print("%-28s %-s" % ("Test Labels", test_labels.shape))
print("=================================================================")
之后别忘了归一化哟:
print("Normalize images")
train_images = train_images / 255.0
test_images = test_images / 255.0
最后附上读取自定义数据的完整代码:
import os
import keras
import matplotlib.pyplot as plt
from PIL import Image
from keras.layers import *
from keras.models import *
from keras.optimizers import Adam
from keras.preprocessing.image import ImageDataGenerator
from sklearn.model_selection import train_test_split
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
re_load = False
re_build = False
# re_load = True
re_build = True
epochs = 50
batch_size = 5
count = 0
max_size = 2000000000
IMG_SIZE_X = 30
IMG_SIZE_Y = 30
np.random.seed(9277)
image_path = r'D:\Projects\ImageClassifier\data\set'
path = ".\data"
data_name = "data.npz"
data_path = os.path.join(path, data_name)
model_name = "model.h5"
model_path = os.path.join(path, model_name)
label_name = "labels.txt"
label_path = os.path.join(path, label_name)
class_names = np.loadtxt(label_path, type(""))
print('Load class names')
if not os.path.exists(data_path) or re_load:
labels = []
images = []
print('Handle images')
for index, name in enumerate(class_names):
classpath = os.path.join(image_path, name)
if not os.path.isdir(classpath):
continue
limit = 0
for image_name in os.listdir(classpath):
if limit >= max_size:
break
imagepath = os.path.join(classpath, image_name)
count = count + 1
limit = limit + 1
img = Image.open(imagepath)
img = img.resize((30, 30))
img = img.convert("L")
img = np.array(img)
img = np.reshape(img, (1, 30, 30))
# img = skimage.io.imread(imagepath, as_grey=True)
# if img.shape[2] != 3:
# print("{} shape is {}".format(image_name, img.shape))
# continue
# data = transform.resize(img, (IMG_SIZE_X, IMG_SIZE_Y))
labels.append([index])
images.append(img)
print("{} class: {} {} limit: {} {}"
.format(count, index + 1, class_names[index], limit, imagepath))
npy_data = np.array(images)
npy_labels = np.array(labels)
np.savez(data_path, x=npy_data, y=npy_labels)
print("Save images by npz")
else:
npy_data = np.load(data_path)["x"]
npy_labels = np.load(data_path)["y"]
print("Load images by npz")
image_data = npy_data
labels_data = npy_labels
print("_________________________________________________________________")
print("%-28s %-s" % ("Name", "Shape"))
print("=================================================================")
print("%-28s %-s" % ("Image Data", image_data.shape))
print("%-28s %-s" % ("Labels Data", labels_data.shape))
print("=================================================================")
train_images, test_images, train_labels, test_labels = \
train_test_split(image_data, labels_data, test_size=0.2, random_state=6)
print('Split train and test data,p=%')
print("_________________________________________________________________")
print("%-28s %-s" % ("Name", "Shape"))
print("=================================================================")
print("%-28s %-s" % ("Train Images", train_images.shape))
print("%-28s %-s" % ("Test Images", test_images.shape))
print("%-28s %-s" % ("Train Labels", train_labels.shape))
print("%-28s %-s" % ("Test Labels", test_labels.shape))
print("=================================================================")
# 归一化
# 我们将这些值缩小到 0 到 1 之间,然后将其馈送到神经网络模型。为此,将图像组件的数据类型从整数转换为浮点数,然后除以 255。以下是预处理图像的函数:
# 务必要以相同的方式对训练集和测试集进行预处理:
print("Normalize images")
train_images = train_images / 255.0
test_images = test_images / 255.0
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- go基础库之从文件读入字符串
- Android 自定义 View (04自定义属性)
- Vue自定义组件(简单实现一个自定义组件)
- Android 自定义View:深入理解自定义属性(七)
- Qt编写自定义控件20-自定义饼图 原 荐
- SpringBoot2 | SpringBoot自定义AutoConfiguration | SpringBoot自定义starter(五)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Google's PageRank and Beyond
Amy N. Langville、Carl D. Meyer / Princeton University Press / 2006-7-23 / USD 57.50
Why doesn't your home page appear on the first page of search results, even when you query your own name? How do other web pages always appear at the top? What creates these powerful rankings? And how......一起来看看 《Google's PageRank and Beyond》 这本书的介绍吧!