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
相关产品推荐
相关产品推荐

