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

PyQt5搭建图像分类预测GUI点击分类按钮闪退无输出如何解决

问题解决方法

核心问题梳理

导致闪退的原因主要是以下几个语法/逻辑错误:

  • 槽函数参数不匹配:clicked信号默认传递布尔值,不是你预期的图片路径,传入错误路径给cv2.imread直接触发异常崩溃
  • 选中的图片路径未存为实例属性:clicker里的fname是局部变量,getClassify无法读取
  • PIL.resize用法错误:resize是Image实例的方法,不能直接用Image.resize()调用
  • 模型重复加载:每次点击分类都重新加载模型,效率极低且容易触发路径错误
  • 无异常捕获:PyQt槽函数触发异常时会直接闪退,不会输出错误日志

修改方案

1. 存储选中图片为实例属性

修改clicker函数,把选中的图片路径存为类的实例属性,方便分类函数调用:

def clicker(self):
    fname = QFileDialog.getOpenFileName(None, "Open File",
                                        r"C:\Users\Alaa alsheikheh\PycharmProjects\MyProject\pre_process\dataset\test_img\",
                                        "All Files (*);;PNG Files (*.png);;Jpg Files (*.jpg)")
    # 过滤用户取消选择的情况
    if fname[0]:
        self.selected_img_path = fname[0]
        self.pixmap = QtGui.QPixmap(self.selected_img_path)
        self.image.setPixmap(self.pixmap)

2. 初始化时加载模型

把模型加载逻辑移到setupUi中,程序启动时只加载一次,减少不必要的IO开销:

def setupUi(self, Dialog):
    # 原有UI逻辑保持不变
    self.input.clicked.connect(self.clicker)
    self.classification.clicked.connect(self.getClassify)
    # 全局只加载一次模型
    self.model = load_model('../MyProject/pre_process/TrainModel.h5')

3. 修复分类函数逻辑

去掉不必要的fname参数,修改resize用法,增加异常捕获:

def getClassify(self):
    # 先判断是否已经选择图片
    if not hasattr(self, 'selected_img_path'):
        self.result.setText('请先选择待分类图片')
        return
    try:
        width = 299
        height = 299
        img_array = cv2.imread(self.selected_img_path)
        # 替换错误的Image.resize为cv2.resize
        img = cv2.resize(img_array, (width, height))
        # 如果训练时用的是RGB格式,需加下面这行转通道(cv2默认读取为BGR)
        # img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        img = numpy.asarray(img, dtype=numpy.float32)
        img = tf.expand_dims(img, axis=0)
        # 训练时如果做了归一化,需打开下面这行注释
        # img = img / 255.0
        pred = self.model.predict(img)
        pred = numpy.argmax(pred[0])
        res_map = {
            0: 'No_DR',
            1: 'Mild',
            2: 'Moderate',
            3: 'Severe',
            4: 'Proliferate_DR'
        }
        self.result.setText(res_map.get(pred, '识别结果异常'))
    except Exception as e:
        # 打印错误信息方便排查
        print(f"分类出错:{e}")
        self.result.setText(f"分类失败:{str(e)}")

额外注意事项

  • 预处理逻辑必须和训练时完全一致,包括通道顺序、归一化操作,否则预测结果会完全错误
  • 增加异常捕获后如果还有问题,直接查看控制台打印的错误信息即可精准定位问题

内容的提问来源于stack exchange,提问作者alaa alshiekheh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:45:03