You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用TensorFlow加载本地图片进行图像分类?含测试场景适配方法

用TensorFlow加载本地图片做测试(训练后基于ImageDataGenerator的场景)

嘿,既然你已经搞定了训练阶段加载本地图片的方法,那咱们直接聚焦到训练完成后如何加载测试图片的部分,分单张和批量两种场景来说:

一、单张本地图片的测试加载方法

如果只是想测试一张图片,核心是要让图片的预处理逻辑和训练时完全对齐,不然预测结果会不准。举个例子:

假设你训练时的ImageDataGenerator是这样配置的(带数据增强和归一化):

from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
    rescale=1./255,  # 归一化到0-1之间
    rotation_range=20,  # 训练时的旋转增强(测试时不用!)
    horizontal_flip=True  # 训练时的翻转增强(测试时不用!)
)

那测试单张图片时,只需要保留归一化这个核心预处理,代码如下:

from tensorflow.keras.preprocessing.image import load_img, img_to_array
import numpy as np

# 1. 加载图片:尺寸必须和训练时模型的输入尺寸一致(比如224x224)
img = load_img("path/to/your/test_image.jpg", target_size=(224, 224))

# 2. 转成numpy数组
img_array = img_to_array(img)

# 3. 扩展维度:模型默认接受批量输入(shape为(batch_size, height, width, channels))
img_array = np.expand_dims(img_array, axis=0)

# 4. 应用和训练时一致的归一化
img_array /= 255.0

# 如果你训练时用了预训练模型的专属预处理函数(比如MobileNet的preprocess_input),记得加上这一步
# from tensorflow.keras.applications.mobilenet import preprocess_input
# img_array = preprocess_input(img_array)

# 5. 执行预测
predictions = model.predict(img_array)

# 6. 解析结果:比如取概率最高的类别
predicted_class_idx = np.argmax(predictions, axis=1)[0]
# 如果你有类别标签映射,比如class_names = ["cat", "dog"],可以直接拿到类别名
# predicted_class_name = class_names[predicted_class_idx]

二、批量测试图片的加载方法

如果有一堆测试图片,直接用ImageDataGenerator的flow_from_directory会更高效,前提是你的测试集文件夹结构和训练时一致(比如每个类别对应一个子文件夹):

test_images/
    cat/
        test_cat1.jpg
        test_cat2.jpg
    dog/
        test_dog1.jpg
        test_dog2.jpg

代码示例:

# 测试用的DataGenerator:只保留归一化,不要加任何数据增强!
test_datagen = ImageDataGenerator(rescale=1./255)

# 生成测试数据生成器
test_generator = test_datagen.flow_from_directory(
    directory="path/to/test_images",
    target_size=(224, 224),  # 和训练时的输入尺寸一致
    batch_size=32,  # 根据你的显存调整
    class_mode="categorical",  # 和训练时的class_mode保持一致(比如训练时用categorical这里就用这个)
    shuffle=False  # 不要打乱顺序,方便后续对应图片文件名和预测结果
)

# 批量预测
test_predictions = model.predict(test_generator)

# 解析结果
predicted_class_indices = np.argmax(test_predictions, axis=1)
true_class_indices = test_generator.classes  # 真实标签的索引
class_labels = list(test_generator.class_indices.keys())  # 类别名和索引的映射

# 比如可以打印前5个预测结果
for i in range(5):
    print(f"图片:{test_generator.filenames[i]},预测类别:{class_labels[predicted_class_indices[i]]},真实类别:{class_labels[true_class_indices[i]]}")

几个关键注意事项

  • 预处理必须严格对齐:训练时用了什么归一化/预处理函数,测试时必须完全一样,比如训练时用了rescale=1./255,测试时不能忘;如果用了预训练模型的preprocess_input,测试时也要调用。
  • 测试时禁用数据增强:旋转、翻转、平移这些增强是给训练用的,测试时用了会导致结果失真,所以测试的ImageDataGenerator只保留必要的归一化即可。
  • 图片尺寸要匹配:测试图片的target_size必须和训练时模型的输入尺寸完全一致,否则会报错或者预测结果不可靠。
  • 单张图片要加batch维度:模型默认接受批量输入,所以单张图片必须用np.expand_dims扩展维度,不然会报错。

内容的提问来源于stack exchange,提问作者Zohaib Hassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:52:50