如何使用Keras保存的模型进行图像预测分类?附手部姿态模型示例
没问题!用Keras保存的.h5模型做图像预测完全可行——model.save('model.h5')已经把模型的结构、训练好的权重甚至优化器状态都打包保存下来了,直接加载就能用。下面我会给你完整的示例代码,同时也会说明如何结合CSV数据完成预测流程。
一、先搞懂:为什么可以直接用保存的模型预测?
Keras的save()方法会把模型的网络结构、训练好的权重参数、甚至训练时的预处理配置/优化器状态都打包到.h5文件里,所以加载后就和你训练结束时的模型完全一致,直接就能拿来做预测。
二、单张图像预测的完整示例
假设你训练时是针对RGB图像的手部姿态分类,下面是一步到位的代码:
# 导入依赖(现在更推荐用tensorflow.keras,兼容性更好) from tensorflow.keras.models import load_model from tensorflow.keras.preprocessing.image import load_img, img_to_array import numpy as np # 1. 加载保存的模型 model = load_model('model.h5') # 2. 定义预处理函数(重点:必须和你训练时的预处理逻辑完全一致!) # 比如训练时你把图像resize成(224,224)、除以255归一化,那预测时也要这么做 def preprocess_img(img_path, target_size=(224, 224)): # 加载图像,按目标尺寸resize img = load_img(img_path, target_size=target_size) # 转成numpy数组 img_array = img_to_array(img) # 增加batch维度(模型默认接受批量输入,哪怕只有一张图) img_array = np.expand_dims(img_array, axis=0) # 归一化(如果训练时做了这一步,就必须加) img_array = img_array / 255.0 return img_array # 3. 处理待预测的图像 test_img_path = "你的测试手图.jpg" processed_img = preprocess_img(test_img_path) # 4. 执行预测 predictions = model.predict(processed_img) # 5. 解析结果 # 如果你是多分类任务(比如识别5种手势): predicted_class_idx = np.argmax(predictions[0]) # 替换成你自己的类别标签(可以从训练用的CSV里提取) class_labels = ["握拳", "伸掌", "点赞", "OK", "比心"] predicted_class = class_labels[predicted_class_idx] predicted_prob = predictions[0][predicted_class_idx] print(f"预测手势:{predicted_class}") print(f"预测概率:{predicted_prob:.4f}") # 如果是二分类任务(比如判断是否是握拳): # predicted_prob = predictions[0][0] # if predicted_prob > 0.5: # print("预测结果:握拳") # else: # print("预测结果:非握拳")
三、结合CSV数据做批量预测
如果你的CSV里存的是测试集的图像路径(甚至带真实标签),可以批量遍历CSV完成预测,示例如下:
import pandas as pd # 加载CSV文件,假设CSV有列:image_path(图像路径)、true_label(真实标签,可选) test_df = pd.read_csv("你的测试数据.csv") # 批量预测并存储结果 prediction_results = [] for _, row in test_df.iterrows(): img_path = row['image_path'] processed_img = preprocess_img(img_path) pred = model.predict(processed_img) # 解析结果(这里以多分类为例) pred_idx = np.argmax(pred[0]) pred_class = class_labels[pred_idx] pred_prob = pred[0][pred_idx] # 把结果存入列表 prediction_results.append({ "图像路径": img_path, "预测类别": pred_class, "预测概率": pred_prob, "真实类别": row.get('true_label', '无') # 如果CSV没真实标签就显示“无” }) # 把结果转成DataFrame并保存成新的CSV results_df = pd.DataFrame(prediction_results) results_df.to_csv("手势预测结果.csv", index=False, encoding="utf-8") print("批量预测完成,结果已保存到手势预测结果.csv")
关键注意事项
- 预处理必须和训练时一致:如果训练时你用了
ImageDataGenerator做了旋转、翻转等增强,预测时不需要做这些,但resize、归一化、通道顺序(比如RGB/BGR)必须和训练时完全相同,否则预测结果会不准。 - 版本兼容性:如果是用旧版纯Keras保存的模型,建议用
tensorflow.keras.models.load_model加载,避免版本冲突。 - 类别标签对应:确保
class_labels的顺序和你训练时的类别顺序完全一致(比如训练时CSV里的类别顺序是A、B、C,那这里也要按同样顺序写)。
内容的提问来源于stack exchange,提问作者Jennifer95
相关产品推荐
相关产品推荐

