如何为训练好的Python TensorFlow模型输入批次并转换cv2图像为预测批次
这问题我之前也碰到过!核心就是要让预测时的图像数据和训练时ImageDataGenerator输出的完全对齐,差一点都会直接拉垮预测效果。我给你拆解具体步骤和可复用的代码:
核心思路:复刻训练时的数据处理流程
flow_from_directory在训练时会做一系列隐式的预处理,预测时必须手动复现这些操作,不能只简单把图像转成数组就丢给模型。
步骤1:修正颜色通道顺序(最容易踩的坑!)
OpenCV的cv2.imread()读取的图像是BGR通道顺序,但flow_from_directory默认用PIL加载图像,是RGB顺序。通道顺序不对的话,模型看到的颜色完全是乱的,预测结果必然离谱:
import cv2 import numpy as np # 读取你已经裁剪好的人脸图像 img = cv2.imread("your_cropped_face.jpg") # 转换为训练时用的RGB通道 img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
步骤2:匹配训练时的图像尺寸
确保你的裁剪后图像和训练时target_size参数完全一致(比如训练时设的是(160,160)),如果裁剪后尺寸有偏差,必须手动resize:
# 替换成你训练时设置的target_size target_size = (160, 160) img_resized = cv2.resize(img_rgb, target_size)
步骤3:复刻训练时的预处理逻辑
这一步要严格和你训练时ImageDataGenerator的配置对应,常见两种情况:
情况A:训练时用了rescale归一化
比如训练代码是:
from keras.preprocessing.image import ImageDataGenerator train_datagen = ImageDataGenerator(rescale=1./255)
那预测时必须做完全相同的归一化:
img_normalized = img_resized / 255.0
情况B:训练时用了preprocessing_function
比如用了预训练模型的专属预处理函数:
from keras.applications.resnet50 import preprocess_input train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)
那预测时也要用同一个函数处理:
img_preprocessed = preprocess_input(img_resized)
步骤4:扩展为批次维度
模型的predict()方法只接受批次数据(形状为(batch_size, height, width, channels)),而单张图像是(height, width, channels),所以需要扩展维度:
# 把单张图像变成(1, 160, 160, 3)的批次格式 img_batch = np.expand_dims(img_preprocessed, axis=0)
步骤5:执行预测并解析结果
现在就可以用训练好的模型正常预测了:
# 假设你的训练好的模型是model predictions = model.predict(img_batch) # 如果是二分类(sigmoid输出),提取概率值 probability = predictions[0][0] # 如果是多分类(softmax输出),提取概率最高的类别索引 predicted_class_idx = np.argmax(predictions[0])
验证技巧:确保数据格式完全对齐
可以把Generator输出的训练图和你处理后的预测图对比,确认数值一致:
# 从训练目录取一张图,用Generator加载 train_generator = train_datagen.flow_from_directory( 'your_train_dir', target_size=target_size, batch_size=1 ) gen_img, _ = next(train_generator) # 对比Generator输出的图和你处理后的图,数值应该几乎一致 print(np.allclose(gen_img[0], img_preprocessed, atol=1e-3)) # 正常会输出True
内容的提问来源于stack exchange,提问作者Fellon
相关产品推荐
相关产品推荐

