今天在之前的基础上开始真正的进行图像分类了,如果有看不懂的地方,请翻看之前的文章。
目录
图片处理
模型搭建
模型使用
开始之前,先导入我们需要用到的包,绝大部分都在之前介绍过:
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import cv2
import os
from glob import glob
from tensorflow.keras import datasets,layers,optimizers,losses,models
from PIL import Image
做图像分类模型,目的是要让机器来识别记忆图像的特征,所以输入的图片要先进行预处理,调整好统一的大小,格式。
首先写一个函数,将每一张图片转成我们需要的数组格式:
def read_image(img_path,shape):
plt_img = Image.open(img_path)
np_img = np.array(plt_img,dtype=np.uint8)
np_img = cv2.resize(np_img,shape)
return np_img
之后我们在图片路径下读取图片,用read_image来处理每一张图片:
folders = os.listdir("seg_train")//文件路径
type_dict = {}
imgs = []
labs = []
for i,type_name in enumerate(folders)://处理图片与标签
type_dict[i] = type_name
images = glob(os.path.join('seg_train',type_name,'*.jpg'))
labels = [i] * len(images)
imgs = [*imgs,*images]
labs = [*labs,*labels]
//X是图片矩阵,Y是对应的标签数值
X_train = np.zeros([len(imgs),50,50,3])
for index,img_path in enumerate(imgs):
X_train[index,:,:,:] = read_image(img_path,(50,50))
Y_train = np.zeros([len(labs),len(folders)])
for i in range(len(labs)):
Y_train[i,labs[i]] = 1.0
X_train =np.reshape(X_train,[X_train.shape[0],50*50*3])
运行结果:
建立一个model,没有太多的技巧,使用的全是全连接层,
最后一层的结果6: 对应的是我有6种图像类型
具体的含义之前都有解释,这里直接上代码:
model = tf.keras.Sequential([
# layers.Dense(67500, activation='relu'),
# layers.Dense(50000,activation='relu'),
# layers.Dense(25000, activation='relu'),
# layers.Dense(12500,activation='relu'),
# layers.Dense(7500, activation='relu'),
layers.Dense(2500,activation='relu'),
layers.Dense(1500,activation='relu'),
layers.Dense(700,activation='relu'),
layers.Dense(300,activation='relu'),
layers.Dense(100,activation='relu'),
layers.Dense(6,activation='softmax')
])
//定义优化、损失
opt = optimizers.SGD(learning_rate=0.001)
loss = losses.CategoricalCrossentropy()
model.build(input_shape=[None,7500])
model.compile(optimizer=opt,loss=loss,metrics=['accuracy'])
model.fit(x=X_train,y=Y_train,batch_size=100,epochs=25,shuffle=True)
model.save('model.h5')
跑一下,顺便保存一个模型,方便我们一会使用:
这台电脑没有GPU,不是不能运行,就是速度太慢了。
使用也很简单,我们把保存的模型加载回来,输入一张照片,就可以判断了
model = tf.keras.models.load_model('model.h5')
# model = tf.keras.models.load_model
tmp_img = np.reshape(img,[1,-1])
pr_lab = model(tmp_img,training=False)
pr_lab = np.array(pr_lab)
pr_lab = np.argmax(pr_lab)
print(type_dict[pr_lab])
plt.figure()
plt.imshow(img)
plt.title(type_dict[pr_lab])
plt.show()
看一下结果:
让我们看看这张照片究竟是不是山呢:
看来效果还不错。