向COCO Detectron2加载图像时无法可视化且报TypeError如何解决
错误原因
报错触发自第8行的img[:,:,::-1]切片操作,TypeError: 'NoneType' object is not subscriptable说明cv2.imread(s['file_name'])返回了None,即图片读取失败。本地运行正常、Colab/Kaggle报错的核心原因是两类环境的文件路径、文件系统规则存在差异,不存在代码逻辑本身的问题。
报错解决方法
- 先添加读图校验逻辑,避免单张图片读取失败中断整个流程,修改代码如下:
for s in random.sample(dataset_custom, n): img = cv2.imread(s['file_name']) # 新增校验逻辑 if img is None: print(f"跳过读取失败的文件:{s['file_name']}") continue v = Visualizer(img[:,:,::-1], metadata = dataset_custom_metadata, scale = 0.5) v = v.draw_dataset_dict(s)
- 核对云平台的文件路径:Colab挂载谷歌盘后的文件路径前缀为
/content/drive/MyDrive/,Kaggle上传的数据集默认存储在/kaggle/input/[你设置的数据集名称]/下,需要把s['file_name']的路径前缀替换为云环境对应的实际路径。 - 确认数据集状态:检查云平台上的数据集是否完整解压、文件没有上传损坏,避免因文件不存在导致读取失败。
- 兼容特殊文件名:如果文件名包含中文、空格等非ASCII字符,OpenCV在云环境下大概率读取失败,可改用PIL读取图片:
from PIL import Image import numpy as np img = np.array(Image.open(s['file_name']))[:, :, ::-1]
Visualizer相关说明
Visualizer不是分割流程的必需组件,它的唯一作用是可视化标注结果、模型预测结果,完全不参与模型训练、推理、精度计算等核心环节。如果你不需要校验标注质量、查看预测效果,直接删除整段可视化代码即可,不会对分割任务产生任何影响。
内容的提问来源于stack exchange,提问作者Saltanat Khalyk
相关产品推荐
相关产品推荐

