import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import os

# 1. 加载模型
model = tf.keras.models.load_model("mnist_model.keras")

# 2. 创建保存图片的文件夹(如果不存在)
save_dir = "predictions"  # 指定保存目录
os.makedirs(save_dir, exist_ok=True)  # 自动创建文件夹

# 3. 模拟生成测试图像并保存预测结果
num_samples = 5  # 生成5张测试图

for i in range(num_samples):
    # 生成随机图像(模拟MNIST格式)
    new_image = np.random.randint(0, 255, size=(28, 28), dtype=np.uint8)
    
    # 预处理
    processed_image = new_image.astype("float32") / 255.0
    processed_image = processed_image.reshape(1, 784)
    print(processed_image)
    
    # 预测
    predictions = model.predict(processed_image, verbose=0)  # 静默模式
    predicted_class = np.argmax(predictions[0])
    
    # 创建画布并绘制图像
    plt.figure(figsize=(3, 3))
    plt.imshow(new_image, cmap="gray")
    plt.title(f"Predicted: {predicted_class}", fontsize=10)
    plt.axis("off")
    
    # 保存图片(文件名包含预测结果和序号)
    filename = os.path.join(save_dir, f"pred_{i}_digit_{predicted_class}.png")
    plt.savefig(filename, bbox_inches="tight", dpi=100)  # 调整DPI和边距
    plt.close()  # 关闭当前画布,避免内存泄漏

print(f"已保存 {num_samples} 张图片到文件夹 {save_dir}")

模型训练过程请参阅

这段代码的主要目的是使用预训练的 MNIST 手写数字识别模型(mnist_model.keras),生成一些模拟的图像,进行预测,并将预测结果和图像保存为 PNG 文件。

1. 导入必要的库

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import os
  • tensorflow:用于加载训练好的模型,并进行预测。
  • numpy:用于生成模拟的图像数据,并进行处理(如归一化)。
  • matplotlib.pyplot:用于可视化图像,将预测结果展示为图像。
  • os:用于处理文件和文件夹,确保保存路径存在。

2. 加载预训练的模型

model = tf.keras.models.load_model("mnist_model.keras")
  • tf.keras.models.load_model("mnist_model.keras"):加载已经训练好的模型,"mnist_model.keras"是模型文件的路径。假设该模型已经训练好了MNIST数据集上的数字分类任务。

3. 创建保存预测结果图片的文件夹(如果文件夹不存在)

save_dir = "predictions"  # 指定保存目录
os.makedirs(save_dir, exist_ok=True)  # 自动创建文件夹
  • save_dir = "predictions":定义保存预测结果的文件夹路径。
  • os.makedirs(save_dir, exist_ok=True):如果 predictions 文件夹不存在,则会自动创建。exist_ok=True 参数确保如果文件夹已经存在不会报错。

4. 模拟生成测试图像并保存预测结果

num_samples = 5  # 生成5张测试图
for i in range(num_samples):
  • num_samples = 5:定义生成的测试图像数量为 5。
  • 使用 for 循环生成每张测试图像并进行处理。
生成模拟图像
new_image = np.random.randint(0, 255, size=(28, 28), dtype=np.uint8)
  • np.random.randint(0, 255, size=(28, 28), dtype=np.uint8):生成一个 28x28 的随机图像,像素值在 0 到 255 之间,模拟一个手写数字的图像。图像的形状和大小与 MNIST 数据集中的图像一致。
预处理图像
processed_image = new_image.astype("float32") / 255.0
processed_image = processed_image.reshape(1, 784)
  • new_image.astype("float32") / 255.0:将生成的图像转换为浮点类型并归一化到 [0, 1] 之间,适应神经网络的输入格式。
  • processed_image.reshape(1, 784):将图像从 28x28 的二维数组转化为 784 长度的一维数组,这是神经网络期望的输入形状(784 = 28 * 28)。
进行预测
predictions = model.predict(processed_image, verbose=0)  # 静默模式
predicted_class = np.argmax(predictions[0])
  • model.predict(processed_image, verbose=0):将预处理后的图像传入模型进行预测,verbose=0 表示静默模式,不显示进度。
  • np.argmax(predictions[0])predictions 是一个包含每个类的预测概率的数组,np.argmax 用来返回概率最高的类索引,即模型预测的数字类别。
绘制图像并保存
plt.figure(figsize=(3, 3))
plt.imshow(new_image, cmap="gray")
plt.title(f"Predicted: {predicted_class}", fontsize=10)
plt.axis("off")
  • plt.figure(figsize=(3, 3)):创建一个大小为 3x3 英寸的图像画布。
  • plt.imshow(new_image, cmap="gray"):显示生成的随机图像,并使用灰度色彩映射(cmap="gray")。
  • plt.title(f"Predicted: {predicted_class}", fontsize=10):为图像添加标题,显示预测的数字类别。
  • plt.axis("off"):去除坐标轴,专注于图像本身。
保存图像
filename = os.path.join(save_dir, f"pred_{i}_digit_{predicted_class}.png")
plt.savefig(filename, bbox_inches="tight", dpi=100)  # 调整DPI和边距
plt.close()  # 关闭当前画布,避免内存泄漏
  • filename = os.path.join(save_dir, f"pred_{i}_digit_{predicted_class}.png"):根据预测的类别和索引生成文件名,保存到 predictions 文件夹中。
  • plt.savefig(filename, bbox_inches="tight", dpi=100):保存图像为 PNG 文件,bbox_inches="tight" 确保图像周围没有多余的空白,dpi=100 设置图像分辨率。
  • plt.close():关闭当前画布,避免内存泄漏。

5. 打印保存结果

print(f"已保存 {num_samples} 张图片到文件夹 {save_dir}")
  • 这一行代码在所有图像保存完成后输出消息,告诉用户保存了多少张图片到指定文件夹。

总结

这段代码的核心作用是:

  • 加载一个预训练的 MNIST 模型。
  • 随机生成 5 张图像(模拟 MNIST 图像)。
  • 对每张图像进行预测,获取预测结果。
  • 绘制图像和预测结果,并将图像保存到指定文件夹中。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐