PyTorch实现Unet++训练时DataLoader worker 0捕获TypeError问题求助
错误根因定位
从报错堆栈可以直接定位到核心问题:dataset.py第63行调用cv2.imread读取mask图像时返回了None,后续对返回值执行维度切片[..., None]时触发类型错误。该错误在DataLoader的子进程中执行数据集读取逻辑时抛出,因此外层会提示DataLoader worker process 0相关报错。
排查步骤
- 校验单个mask文件的可读性
即使目录配置正确,也可能存在单个mask文件损坏、文件名匹配异常的情况,运行以下脚本遍历所有mask文件,找出读取失败的文件:
import cv2 import os # 替换为你配置文件中对应的mask路径、mask后缀 mask_dir = "/path/to/your/mask/dir" mask_ext = ".png" for filename in os.listdir(mask_dir): if filename.endswith(mask_ext): mask_path = os.path.join(mask_dir, filename) img = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) if img is None: print(f"读取失败文件:{mask_path}")
- 校验mask后缀配置一致性
注意Linux环境下路径大小写敏感,如果配置文件中mask_ext设为.png,但实际文件后缀为.PNG或者.jpg,会导致cv2.imread找不到文件返回None。 - 校验img_id拼接逻辑
检查dataset中img_id的生成逻辑,确认img_id + self.mask_ext拼接后的文件名和实际mask文件名完全匹配,排查是否存在img_id包含多余空格、换行符、分割符错误的问题。 - 临时调整DataLoader配置方便调试
将DataLoader的num_workers参数改为0,错误会直接在主进程抛出,可以在dataset.py第63行前打印拼接后的mask完整路径,手动校验路径是否存在、文件是否正常。
内容的提问来源于stack exchange,提问作者Ted Lu
相关产品推荐
相关产品推荐

