自定义decode_prediction后,VGG19预测遇OpenCV imshow未实现错误
解决cv2.imshow报错的方案
错误原因
这个报错是因为你的OpenCV库编译时没有包含图形界面(GUI)支持(比如GTK+、Cocoa等),或者当前运行环境没有桌面显示能力(比如Kaggle、服务器这类无GUI环境),导致cv2.imshow无法执行。
具体解决方法
1. 本地Ubuntu/Debian环境(有桌面)
如果是本地有桌面的Ubuntu/Debian系统,按以下步骤处理:
- 先安装GUI依赖:
sudo apt-get update sudo apt-get install libgtk2.0-dev pkg-config - 如果是用pip安装的OpenCV,卸载现有包并安装带GUI支持的版本:
pip uninstall opencv-python pip install opencv-contrib-python - 如果是源码编译的OpenCV,重新编译时cmake会自动检测已安装的依赖,启用GTK支持。
2. 无桌面环境(如Kaggle、Colab、云服务器)
这类环境没有图形界面,cv2.imshow完全无法工作,推荐两种替代方案:
方案A:用Matplotlib显示图片
替换原代码中cv2.imshow和cv2.waitKey的部分,改用Matplotlib(支持无桌面环境的在线显示):
import matplotlib.pyplot as plt # 替换原显示代码 original_rgb = cv2.cvtColor(original, cv2.COLOR_BGR2RGB) # OpenCV读入的是BGR格式,Matplotlib用RGB plt.imshow(original_rgb) plt.title(f"Label: {label}, {prob * 100:.2f}%") plt.axis('off') # 隐藏坐标轴 plt.show()
方案B:保存标注后的图片到本地
如果不需要实时显示,直接把标注好的图片保存到指定目录,之后再查看:
# 先创建输出目录(避免报错) os.makedirs("../output", exist_ok=True) # 保存标注后的图片 cv2.imwrite(f"../output/{filename}_pred.jpg", original)
额外代码优化建议
你的预测代码还有几个可以提升效率的问题:
- 不要在循环内重复加载模型:
load_model操作很耗时,把它移到循环外面,只加载一次。 - 避免重复读取图片:
cv2.imread(file)在代码中执行了两次,只需要读一次即可。 - 无用的参数解析:你定义了
argparse的--image参数,但实际用的是固定目录,要么删除这部分代码,要么改成用参数指定图片目录。
优化后的核心代码片段:
import os import json import cv2 import numpy as np from keras.preprocessing import image as image_utils from keras.applications.imagenet_utils import preprocess_input from keras.models import load_model # 提前加载模型,只加载一次 print("[INFO] loading network...") m = load_model('/kaggle/working/model_hemato.h5') # 设置路径并创建输出目录 img_path = "../input/img_val" os.makedirs("../output", exist_ok=True) files = os.listdir(img_path) print("[INFO] loading and processing images...") for filename in files: file = os.path.join(img_path, filename) # 仅读取一次原图 original = cv2.imread(file) # 图片预处理(用于模型预测) image = image_utils.load_img(file, target_size=(224, 224)) image = image_utils.img_to_array(image) image = np.expand_dims(image, axis=0) image = preprocess_input(image) print("[INFO] classifying image...") predictions = m.predict(image) P = decode_prediction(predictions) print(P) # 打印预测结果 for (i, (imagenetID, label, prob)) in enumerate(P[0]): print("{}. {}: {:.2f}%".format(i + 1, label, prob * 100)) # 给原图添加标注 (imagenetID, label, prob) = P[0][0] cv2.putText(original, "Label: {}, {:.2f}%".format(label, prob * 100), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2) # 保存标注后的图片(替代imshow) cv2.imwrite(f"../output/{filename}_pred.jpg", original)
内容的提问来源于stack exchange,提问作者user979974
相关产品推荐
相关产品推荐

