实现UNet医学影像训练时shape不匹配报错ValueError如何解决?
错误原因
该报错核心是数据维度不匹配:你实例化dataProcess类时传入了输出尺寸参数(512,512),因此代码中预先创建的存储数组imgdatas、imglabels的单样本维度为(512,512,3)和(512,512,1);但你本地存储的原始医学影像和对应标注的实际尺寸为256*256,直接赋值时无法完成维度广播,触发报错。
解决方案
可根据业务需求任选以下一种方案修复:
- 方案1:调整输出尺寸匹配原始数据
若256*256的分辨率满足UNet模型训练要求,直接修改实例化代码即可,无需调整其他逻辑:mydata = dataProcess(256,256) - 方案2:缩放原始图像到目标尺寸
若必须使用512*512作为输入尺寸,在加载图像时统一做resize处理即可,load_img方法可直接通过参数指定目标尺寸自动完成缩放:
如果你使用注释中的OpenCV逻辑读取图像,注意标注缩放要使用最近邻插值避免引入非法标注值,示例如下:# 仅需修改加载图像的两行代码,其余逻辑保持不变 img = load_img(self.data_path + "/" + midname, target_size=(self.out_rows, self.out_cols)) label = load_img(self.label_path + "/" + midname, grayscale = True, target_size=(self.out_rows, self.out_cols))img = cv2.imread(self.data_path + "/" + midname,cv2.IMREAD_GRAYSCALE) label = cv2.imread(self.label_path + "/" + midname,cv2.IMREAD_GRAYSCALE) # 新增缩放逻辑 img = cv2.resize(img, (self.out_cols, self.out_rows), interpolation=cv2.INTER_LINEAR) label = cv2.resize(label, (self.out_cols, self.out_rows), interpolation=cv2.INTER_NEAREST) - 方案3:裁剪/填充到目标尺寸
若要避免缩放导致的图像变形,可对大于目标尺寸的图像做中心裁剪,小于目标尺寸的图像做边缘0值填充,该方案更适合对形变敏感的医学影像场景。
内容的提问来源于stack exchange,提问作者Yeashtaruna
相关产品推荐
相关产品推荐

