
人工智能计算机视觉深度学习预训练微调【免费下载链接】Vim[ICML 2024] Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model项目地址https://gitcode.com/gh_mirrors/vim2/Vim点击查看免费下载导读本文围绕det/detectron2/data/datasets/目录下数据集模块的核心设计哲学展开数据集实现只需提供最小数据结构无需把数据加载成模型可直接消费的最终格式对于图像数据集仅需提供文件名与标签不要读取图像内容具体如何读取由下游训练/推理流水线决定。读懂这套设计你就能理解 Detectron2以及本仓库det/下基于它的 Vision Mamba 检测训练流程的数据加载性能关键并掌握如何用同样的模式注册自定义数据集。一、核心设计原则最小数据结构 惰性加载det/detectron2/data/datasets/README.md开宗明义地定义了本目录的职责边界原文要点如下The dataset implemented here do not need to load the data into the final format. It should provide the minimal data structure needed to use the dataset, so it can be very efficient. For example, for an image dataset, just provide the file names and labels, but dont read the images. Let the downstream decide how to read.翻译并拆解成三条可操作的原则不做最终格式的转换数据集模块的产物不是已经变成 Tensor / Instances 的样本而是一份轻量的、Python 字典构成的元数据清单只提供最小数据结构对图像数据集而言最小结构就是file_name图像路径 标注字段框、类别、分割等惰性读取图像加载注解时绝不cv2.imread/PIL.Image.open读取像素把何时真正读图完全交给下游的DatasetMapper与 DataLoader。这一原则的直接收益在 coco.py 的函数注释中写得很明确This function does not read the image files. The results do not have the image field.——一个十几万张的 COCO 训练集注解加载阶段只解析 JSON 与路径字符串内存开销极小且所有 worker 可以共享同一份list[dict]。二、全局注册表DatasetCatalog 与 MetadataCatalog最小数据结构得以流转的核心是 catalog.py 中定义的两个全局注册表DatasetCatalog字符串数据集名如coco_2014_train→ 一个无参数、返回list[dict]的函数。register(name, func)注册、get(name)调用函数拿到注解列表、list()列出所有已注册名称。它的设计目的见 catalog.py是通过配置中的字符串即可方便地切换数据集MetadataCatalog字符串 →Metadata单例对象用于存储常量型共享知识如 COCO 的类别名列表、可视化颜色、评估器类型。它提供set(**kwargs)批量写入与get(key, default)安全读取且同名 metadata 一旦创建便常驻catalog.py。两个注册表是后续所有数据集加载器、DatasetMapper、build_detection_train_loader见 build.py共用的全局枢纽数据集加载器只负责往DatasetCatalog注册产最小字典的函数训练流水线则通过DatasetCatalog.get(name)惰性触发。三、预定义数据集builtin.py 的注册清单buitlin.py实际文件名为builtin.py以硬编码方式注册了常见数据集的路径与元数据其头注释强调两个意图加载数据集时能做一致性检查用户无需下载注解文件JSON就能直接在标准数据集上使用预训练模型、跑 demo因为类别名与颜色已被硬编码在元数据中。该文件通过_PREDEFINED_SPLITS_COCOCOCO 检测/关键点、_PREDEFINED_SPLITS_COCO_PANOPTIC全景分割、_PREDEFINED_SPLITS_LVIS、_RAW_CITYSCAPES_SPLITS、PASCAL VOC 的SPLITS列表以及 ADE20K 的 train/val 划分统一在文件末尾的入口代码中注册if __name__.endswith(.builtin): _root os.path.expanduser(os.getenv(DETECTRON2_DATASETS, datasets)) register_all_coco(_root) register_all_lvis(_root) register_all_cityscapes(_root) register_all_cityscapes_panoptic(_root) register_all_pascal_voc(_root) register_all_ade20k(_root)值得注意的注册细节默认数据根目录约定所有预定义数据集默认假设存放在./datasets/下可用环境变量DETECTRON2_DATASETS覆盖builtin.py支持远程路径register_all_coco中os.path.join(root, json_file) if :// not in json_file else json_filebuiltin.py说明注解 JSON 可以是带://的远程 URI由PathManager统一处理全景分割的双注册同一前缀同时注册register_coco_panoptic_separated供 Panoptic FPN 使用与register_coco_panoptic供 Panoptic-DeepLab 使用两种格式builtin.pyCOCO 类别 id 约定COCO 的 category id 存在人为删除导致不连续的问题注册时会生成thing_dataset_id_to_contiguous_id映射到连续 id详见下文load_coco_json。元数据本身存放在 builtin_meta.py 中例如COCO_CATEGORIES每项包含color可视化颜色、isthing、id、name。其注释同样强调自定义数据集无需在代码中硬编码元数据——COCO 格式数据集调用load_coco_json时元数据会自动生成硬编码只是为了没有下载 JSON 的用户也能直接可视化模型。四、各加载器如何产出最小数据结构4.1 COCOload_coco_json实例检测/分割/关键点核心函数位于 coco.py签名与行为def load_coco_json(json_file, image_root, dataset_nameNone, extra_annotation_keysNone):内部用pycocotools.COCO解析 JSON只保留每个样本的字段file_name、height、width、image_id、annotations每项含iscrowd、bbox、keypoints、category_id、segmentation以及extra_annotation_keys指定的额外键当传入dataset_name时会顺带把元数据写入MetadataCatalog根据 JSON 的categories字段生成thing_classes并将category_id映射到连续区间[0, #categories)生成thing_dataset_id_to_contiguous_idcoco.py。若类别 id 本就连续则免去映射否则打印警告对分割做基本清洗过滤少于 3 个点的无效多边形、把list形式的 RLE 转成压缩 RLE、为关键点坐标加 0.5从像素索引转为浮点坐标coco.py注册入口register_coco_instances(name, metadata, json_file, image_root)coco.py示范了标准的两步注册法# 1. 注册一个返回最小字典列表的函数惰性调用时才解析 DatasetCatalog.register(name, lambda: load_coco_json(json_file, image_root, name)) # 2. 附加元数据评估器类型、路径等 MetadataCatalog.get(name).set( json_filejson_file, image_rootimage_root, evaluator_typecoco, **metadata )4.2 PASCAL VOCload_voc_instancespascal_voc.py 读取ImageSets/Main/{split}.txt得到文件 id 列表逐个解析Annotations/*.xml输出同样的最小字典file_name、image_id、height、width、annotationscategory_id用CLASS_NAMES.index(cls)得到连续 idbbox_modeBoxMode.XYXY_ABS。注意它把注解的 1 基像素坐标统一减 1 转为 0 基坐标pascal_voc.py并保留了 difficult 样本参与训练——这是作者基于实验的选择pascal_voc.py 中注释掉的过滤代码。4.3 语义分割load_sem_segcoco.py 中的load_sem_seg(gt_root, image_root, gt_extpng, image_extjpg)面向语义分割扫描image_root与gt_root下按扩展名匹配的文件依据相对路径不含扩展名匹配图像与标注每个样本只输出file_name与sem_seg_file_name两个字段——同样不读像素。它还处理了图像数与标注数不一致的情况取两者 basename 的交集并排序保证多 worker 下顺序一致coco.py。4.4 Cityscapes多进程预处理cityscapes.py 的load_cityscapes_instances是预处理较重的案例注解以gtFine目录下的 png/json 形式存放解析需要把 instance mask 转成多边形。源码用mp.Pool多进程并行处理并给出性能提示所有 worker 会重复这份工作在 8 GPU 服务器上可能耗时 10 分钟cityscapes.py。这说明最小数据结构的边界取决于数据源成本Cityscapes 必须解析掩码才能得到实例标注但读图这一步依然被推迟到下游。五、下游如何真正读取图像DatasetMapper 与 DataLoader最小数据结构在训练/推理阶段被 dataset_mapper.py 中的DatasetMapper消费。它的 docstring 明确列出了三步职责dataset_mapper.py从file_name读取图像对图像与标注应用裁剪/几何变换把数据与标注组织成 Tensor 与Instances。__call__的入口代码dataset_mapper.py正是惰性兑现的时刻dataset_dict copy.deepcopy(dataset_dict) # 会被原地修改先深拷贝 image utils.read_image(dataset_dict[file_name], formatself.image_format) utils.check_image_size(dataset_dict, image) if sem_seg_file_name in dataset_dict: sem_seg_gt utils.read_image(dataset_dict.pop(sem_seg_file_name), L).squeeze(2) ... dataset_dict[image] torch.as_tensor(np.ascontiguousarray(image.transpose(2, 0, 1)))也就是说数据集加载器只给路径DatasetMapper才真正把像素读进内存并转成 Tensor。这样注解解析只在DatasetCatalog.get()时执行一次而图像读取被推迟到 DataLoader 采样阶段且可被 PyTorch 多进程 worker 并行分摊。数据流全貌依据 build.py 与 common.py 的调用关系配置 DATASETS.TRAIN/TEST字符串 → DatasetCatalog.get(name) # 惰性调用注册函数产出 list[dict]最小结构 → DatasetFromList / MapDataset # 包装为 torch Datasetmap 函数即 DatasetMapper → DatasetMapper.__call__ # 此刻才 read_image 增强 转 Tensor/Instances → 采样器TrainingSampler 等 DataLoader → 模型common.py 中的MapDataset值得额外说明它把DatasetMapper作为map_func逐样本应用并且map_func返回None时可跳过坏样本map-style 下随机换索引重试common.pyPicklableWrapper则保证 lambda 形式的映射函数也能被多进程 worker pickle。六、在 VimVision Mamba检测流程中的实际应用本仓库的det/是基于 detectron2 的检测工程对应 ICML 2024 论文《Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model》训练脚本 det/detectron2/engine/defaults.py 与 det/detectron2/data/build.py 组合使用上面这套机制配置文件如 det/configs/COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml通过DATASETS.TRAIN/DATASETS.TEST字符串引用注册表中的数据集名切换数据集只需改字符串——这正是DatasetCatalog被设计出来的目的Vim 骨干网络det/detectron2/modeling/backbone/vim.py与 COCO 数据集之间不产生任何直接耦合数据层只关心最小字典 → 图像 Tensor骨干网络只消费 Tensor二者由build_detection_train_loader与模型 forward 衔接。因此即使要在这个工程里引入新的检测数据集例如自定义实例分割数据也不需要改动任何模型代码按第四节register_coco_instances的两步注册法或直接调用load_coco_json返回的 dict 列表注册新名称再把配置里的DATASETS.TRAIN/TEST指向它即可。七、自定义数据集注册的推荐姿势综合上述源码注册一个符合本设计哲学的自定义数据集应遵循写一个返回list[dict]的解析函数每个 dict 至少包含file_name或sem_seg_file_name、height、width、image_id实例级任务还需annotations列表每项含bboxbbox_modecategory_id可选segmentation/keypoints/iscrowd解析阶段绝不读图像只拼接路径、解析标注文件JSON/XML/PNG 掩码等用DatasetCatalog.registerMetadataCatalog.get(name).set(...)注册并建议像register_coco_instances那样把函数用lambda包一层让真正的解析延后到首次get时执行元数据尽量自动化若注解是 COCO 格式直接复用load_coco_json(json_file, image_root, dataset_name)即可自动获得thing_classes与 id 连续化映射coco.py否则参考 builtin_meta.py 的_get_builtin_metadata补充thing_classes、evaluator_type等字段注册时机参照builtin.py的入口代码在__main__.endswith(.builtin)条件下即作为包被导入时批量执行注册并把数据根目录做成可配置如DETECTRON2_DATASETS环境变量避免硬编码绝对路径。总结det/detectron2/data/datasets/README.md用三句话定义了一个影响深远的工程约定数据集实现只负责产出最小数据结构不负责把数据加载成最终格式图像数据集只给文件名与标签不读图像读取方式由下游决定。本文以 catalog.py、builtin.py、coco.py、pascal_voc.py、dataset_mapper.py 与 build.py 等源码为证据还原了这一约定从注册表 → 惰性加载器 → 下游真正读图的完整链路。理解这套分层无论是排查数据加载瓶颈、接入新数据集还是阅读 Vim 检测工程的训练流程都会事半功倍。赞分享人工智能计算机视觉深度学习预训练微调【免费下载链接】Vim[ICML 2024] Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model项目地址https://gitcode.com/gh_mirrors/vim2/Vim点击查看免费下载相关推荐OOTDiffusion 数据集模块剖析detectron2 最小数据结构与惰性加载设计解读OOTDiffusion 数据集模块剖析detectron2 最小数据结构与惰性加载设计解读 导读 在 OOTDiffusion 仓库中 人体解析预处理模块人工智能计算机视觉媒体生成AI 应用IDM-VTON 人体解析预处理中的数据管线设计Detectron2 数据集模块的最小数据结构与惰性加载原理IDM VTON 人体解析预处理中的数据管线设计Detectron2 数据集模块的最小数据结构与惰性加载原理 IDM VTON 的人体解析human par计算机视觉深度学习媒体生成Detectron2 数据集模块设计解析最小数据结构与延迟读取机制Detectron2 数据集模块设计解析最小数据结构与延迟读取机制 Detectron2 的 detectron2/data/datasets/ 目录承载着所人工智能计算机视觉深度学习机器学习上一篇Redwood 服务器部署入门SSH 连接远程服务器的完整实战指南下一篇Eclipse EDC连接器配置终极指南从新手到专家的完整解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考