技术交流28群

服务热线

135-6963-3175

微信服务号

场景入门-基于图像分类 更新时间 2023-11-5 浏览2603次

数据预处理和训练:

import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
# 加载Fashion MNIST数据集
(train_images, train_labels), (test_images, test_labels) = keras.datasets.fashion_mnist.load_data()
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
# 数据预处理
train_images = train_images / 255.0
test_images = test_images / 255.0
# 构建模型
inputs = keras.Input(shape=(28, 28))
x = keras.layers.Flatten()(inputs)
x = keras.layers.Dense(128, activation='relu')(x)
outputs = keras.layers.Dense(10)(x)
model = keras.Model(inputs=inputs, outputs=outputs)
# 编译模型
model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])
# 训练模型
history = model.fit(train_images, train_labels, epochs=100, validation_data=(test_images, test_labels))
# 保存模型(保存模型结构与权重)
model.save('./save/model.h5')
# 加载模型(同时加载模型结构与权重)
loaded_model = keras.models.load_model('./save/model.h5')
# 评估模型(计算并打印准确率)
test_loss, test_acc = loaded_model.evaluate(test_images, test_labels, verbose=2)
print('\n测试结果:', test_acc)


推理:

import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import os;
import matplotlib.pyplot as plt
import cv2
# 定义类别名称列表
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# 加载已训练的模型
model = keras.models.load_model('./save/model.h5')
# 加载图像并进行预处理
image = Image.open('./900.webp')

#图像展示
plt.figure()
plt.imshow(image)
plt.colorbar()
plt.grid(False)
plt.show()

#转换为单通道图像
#image = image.convert('L')
image = image.convert('1')
image = image.resize((28, 28))  # 调整图像大小为28x28像素
image = np.array(image)  # 转换为NumPy数组
image = image / 255.0

#检测展示
plt.figure(figsize=(10,10))
plt.subplot(5,5,0+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(image, cmap=plt.cm.binary)
plt.xlabel(class_names[0])
plt.show()

image = image.reshape(-1, 28, 28)  # 调整图像形状为(1, 784)

#img=test_images[1]
#print(img.shape)
#img = (np.expand_dims(img,0))

# 进行预测
predictions = model.predict(image)
predicted_label = np.argmax(predictions[0])
predicted_class = class_names[predicted_label]
# 打印预测结果
print('预测标签:', predicted_label)
print('预测类别:', predicted_class)



模型创建代码详解

inputs = keras.Input(shape=(28, 28))
x = keras.layers.Flatten()(inputs)
x = keras.layers.Dense(128, activation='relu')(x)
outputs = keras.layers.Dense(10)(x)
model = keras.Model(inputs=inputs, outputs=outputs)

这段代码定义了一个与上面的模型不同的神经网络结构。让我逐行解释代码的作用:

1. `inputs = keras.Input(shape=(28, 28))`:创建一个输入层,指定输入数据的形状为(28, 28)。这表示输入数据是一个28x28的二维图像

2. `x = keras.layers.Flatten()(inputs)`:将输入层展平为一维向量Flatten层用于将多维的输入数据转换为一维向量形式,以便后续的全连接层处理。

3. `x = keras.layers.Dense(128, activation='relu')(x)`:添加一个具有128个神经元的全连接层,并使用ReLU激活函数。这一层将接收展平后的输入数据,并产生128维的特征表示。

4. `outputs = keras.layers.Dense(10)(x)`:添加一个具有10个神经元的输出层。这一层没有指定激活函数,因此默认为线性激活函数。输出层的神经元数量为10,适用于进行10类的分类任务

5. `model = keras.Model(inputs=inputs, outputs=outputs)`:创建一个模型对象,指定输入层和输出层。这里使用了Functional API的方式构建模型,通过指定输入和输出层来定义模型的结构。

总的来说,这段代码构建的模型适用于处理图像数据,并进行分类任务。输入是28x28的图像,经过展平和全连接层的处理后,通过输出层得到对不同类别的分类预测结果。