如何使用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
相关产品推荐
相关产品推荐

