You need to enable JavaScript to run this app. Google Colab从Google Drive读图像存数组时顺序随机,引发图像与掩膜匹配错位问题
优惠活动
大模型
产品
解决方案
定价
更多

Google Colab从Google Drive读图像存数组时顺序随机,引发图像与掩膜匹配错位问题

Google Colab 读取Drive图像数据集顺序错位、图-掩膜不匹配的解决方案

这是Colab上开展图像分割任务的开发者普遍遇到的高频坑,不存在随机的平台bug,所有问题都可以通过固定读取规则彻底解决。

问题本质

  • 绝大多数人读取文件时直接调用os.listdir(文件夹路径)获取文件列表,这个方法返回的顺序完全由存储系统的inode索引决定,和你在Google Drive网页端看到的按名称排序的展示逻辑没有任何关系
  • 原始图像、标注掩膜是两个独立的文件夹路径,os.listdir返回的两个列表哪怕文件名完全一一对应,顺序也可能随机错位
  • 很多人第一次踩这个坑的时候,看到最终生成的数组长度和自己存的文件数刚好匹配,就直接喂给U-Net模型训练,训了半天loss异常、精度上不去,最后做可视化校验才发现同位置的图和掩膜根本不是一对,白白浪费几个小时的训练时间

可落地的修复方案

方案1:统一排序规则 + 强校验文件对应关系

这是适配绝大多数场景的通用方案,核心是拿到原始文件列表后不直接使用,先做过滤、排序、校验三步,保证跨文件夹的文件顺序完全一致。
可直接复用的代码参考:

import os
import cv2
import numpy as np

# 替换为你自己的实际路径
img_dir = "/content/drive/MyDrive/训练数据/原始图像"
mask_dir = "/content/drive/MyDrive/训练数据/标注掩膜"

def get_sorted_file_list(dir_path, valid_extensions=(".png", ".jpg", ".jpeg", ".tif")):
    # 过滤非目标格式的文件、系统自动生成的隐藏缓存文件
    all_files = [
        f for f in os.listdir(dir_path) 
        if f.lower().endswith(valid_extensions) and not f.startswith(".")
    ]
    # 按规则排序,保证跨文件夹的顺序完全统一
    all_files.sort()
    return all_files

img_files = get_sorted_file_list(img_dir)
mask_files = get_sorted_file_list(mask_dir)

# 关键校验:确认两个文件夹的文件名完全一一对应,没有漏配、错配
assert set(img_files) == set(mask_files), "检测到文件名不匹配,请核对两个文件夹的存储内容"

# 按排序后的列表顺序读入数组,同一下标的图和掩膜必然对应
images = []
masks = []
for img_name, mask_name in zip(img_files, mask_files):
    # 读入原图,叠加你自己的尺寸缩放逻辑
    img = cv2.imread(os.path.join(img_dir, img_name))
    img = cv2.resize(img, (256, 256))
    images.append(img)
    
    # 读入对应掩膜,按灰度模式读取避免额外通道干扰
    mask = cv2.imread(os.path.join(mask_dir, mask_name), 0)
    mask = cv2.resize(mask, (256, 256))
    masks.append(mask)

images = np.array(images)
masks = np.array(masks)

注意:如果你的文件名带自然数字序号(比如img1.jpg、img2.jpg、img10.jpg),纯字符串字典序会把img10错排到img2前面,这时候要把排序规则替换为数值排序,避免顺序错位:

import re
def numeric_sort_key(file_name):
    # 提取文件名中的数字片段,按数值大小排序
    numbers = re.findall(r"\d+", file_name)
    return [int(num) for num in numbers]
# 替换原有的all_files.sort()语句
all_files.sort(key=numeric_sort_key)

方案2:按文件名硬绑定图-掩膜映射,完全不依赖列表顺序

这种方法鲁棒性更强,哪怕文件列表顺序完全随机,也不会出现错位:

  • 不预先构建两个平行的文件列表,遍历每一张原图时,直接根据原图的文件名,到掩膜文件夹下拼接完全相同的文件名路径读取对应掩膜
  • 不需要提前校验两个列表的顺序一致性,哪怕后期给数据集增删文件,也不会出现配对错位的问题,适合经常迭代调整的数据集

方案3:规避Colab挂载Drive的顺序漂移问题

  • 运行读取代码前确保Google Drive挂载完成,不要在脚本执行读操作的过程中向Drive的目标文件夹上传、删除文件,否则挂载点的文件缓存会和Drive端的实际内容不一致,导致列表顺序随机变化
  • 如果用glob.glob()匹配文件,必须在返回结果后做排序处理,部分Colab环境下glob返回的文件顺序是随机的,没有固定规律

常见的踩坑细节

  • 读文件时一定要过滤系统自动生成的隐藏文件(比如.DS_Store、Google Drive自动生成的缩略图文件),这类文件会混在os.listdir的返回结果里,打乱整个列表的顺序
  • 校验时不要只看数组长度是否一致,要拿数组里前3、后3张的图和掩膜做可视化配对检查,很多时候长度刚好匹配,内容完全错位,不做可视化校验很难发现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 11:15:04