当前位置: 首页 > article >正文

告别混乱:手把手教你用Python脚本整理ILSVRC2012验证集(附valprep.sh解析)

告别混乱用Python脚本高效整理ILSVRC2012验证集当你第一次打开ILSVRC2012验证集文件夹时50000张图片杂乱堆放的场景可能让人头皮发麻——没有分类子目录只有一堆以ILSVRC2012_val_00000001.JPEG命名的文件。这种原始结构与训练集的整齐分类形成鲜明对比直接导致大多数深度学习框架的ImageLoader无法直接使用验证集。本文将彻底解决这个痛点不仅教你如何用Python脚本替代官方的valprep.sh还会深入解析背后的文件映射逻辑让你真正掌握验证集整理的底层原理。1. 为什么验证集整理如此重要在ImageNet等大型视觉数据集中训练集通常已经按类别分好文件夹比如train/n01440764/下是该类别的所有训练图片。但验证集却往往保持原始打包状态——所有图片混在一个目录里仅通过文件名中的序号与标签对应。这种差异带来三个实际问题框架兼容性问题PyTorch的ImageFolder、TensorFlow的ImageDataGenerator.flow_from_directory等常用数据加载工具都假设数据已分类存放验证效率低下手动创建1000个文件夹并移动文件几乎不可能完成容易出错人工操作可能导致文件错放影响模型评估准确性官方提供的valprep.sh是一个Bash脚本解决方案但它在Windows环境下无法直接运行且缺乏灵活性。用Python重写不仅能跨平台使用还可以添加更多实用功能。2. 理解验证集的组织结构在编写脚本前需要明确几个关键文件的作用验证集图片约5万张JPEG文件命名格式为ILSVRC2012_val_00000001.JPEG到ILSVRC2012_val_00050000.JPEG映射文件通常命名为val.txt包含每张图片对应的类别ID格式如下ILSVRC2012_val_00000001.JPEG 65 ILSVRC2012_val_00000002.JPEG 970 ...类别目录与训练集一致的1000个目录名称如n01440764、n01443537等整理的核心逻辑是根据val.txt中的映射关系将图片移动到对应的类别文件夹中。下面是一个验证集整理前后的结构对比整理前结构整理后结构val/val/├── ILSVRC2012_val_00000001.JPEG├── n01440764/├── ILSVRC2012_val_00000002.JPEG│ ├── ILSVRC2012_val_00000001.JPEG...├── n01443537/└── val.txt│ ├── ILSVRC2012_val_00000002.JPEG3. Python实现方案详解我们将创建一个比官方脚本更强大的Python解决方案主要包含以下功能解析映射文件建立文件名到类别的字典自动创建缺失的类别目录高效移动文件到目标目录添加进度条显示处理进度支持恢复中断的任务3.1 基础版本实现首先安装必要的依赖pip install tqdm # 用于显示进度条基础脚本代码如下import os import shutil from tqdm import tqdm def organize_val_set(val_dirval, map_fileval.txt): # 读取映射文件 with open(os.path.join(val_dir, map_file)) as f: lines f.readlines() # 创建文件名到类别的映射字典 file_to_class {} for line in lines: filename, class_id line.strip().split() file_to_class[filename] class_id # 获取所有类别ID从训练集目录结构推断 class_ids set(file_to_class.values()) # 创建类别目录 for class_id in class_ids: os.makedirs(os.path.join(val_dir, class_id), exist_okTrue) # 移动文件 for filename, class_id in tqdm(file_to_class.items(), desc整理验证集): src os.path.join(val_dir, filename) dst os.path.join(val_dir, class_id, filename) if os.path.exists(src): shutil.move(src, dst) if __name__ __main__: organize_val_set()3.2 高级功能扩展基础版本已经可用但我们还可以添加更多实用功能def advanced_organize_val_set(val_dirval, map_fileval.txt, train_dirtrain, resumeFalse): 增强版验证集整理函数 参数: val_dir: 验证集目录路径 map_file: 映射文件名 train_dir: 训练集目录路径用于验证类别完整性 resume: 是否从上次中断处继续 # 从训练集获取所有合法类别ID valid_classes set(os.listdir(train_dir)) # 读取映射文件并过滤无效类别 with open(os.path.join(val_dir, map_file)) as f: lines f.readlines() file_to_class {} for line in lines: filename, class_id line.strip().split() if class_id in valid_classes: file_to_class[filename] class_id # 创建进度记录文件用于恢复中断的任务 progress_file os.path.join(val_dir, .reorg_progress) if resume and os.path.exists(progress_file): with open(progress_file) as f: processed set(f.read().splitlines()) else: processed set() # 创建类别目录 for class_id in set(file_to_class.values()): os.makedirs(os.path.join(val_dir, class_id), exist_okTrue) # 移动文件跳过已处理的 with open(progress_file, a) as pf: for filename, class_id in tqdm(file_to_class.items(), desc整理验证集): if filename in processed: continue src os.path.join(val_dir, filename) dst os.path.join(val_dir, class_id, filename) if os.path.exists(src): shutil.move(src, dst) pf.write(f{filename}\n) pf.flush() # 清理进度文件 if os.path.exists(progress_file): os.remove(progress_file)提示增强版脚本增加了类别验证和断点续传功能特别适合处理大型验证集时可能出现的意外中断情况。4. 性能优化技巧处理5万张图片的移动操作可能会遇到性能问题以下是几个优化方向批量操作减少单个文件移动的系统调用开销并行处理利用多核CPU加速内存映射对于超大映射文件更高效读取这里提供一个使用多进程的优化版本from multiprocessing import Pool import pandas as pd def parallel_organize(args): 多进程任务函数 src, dst args if os.path.exists(src): shutil.move(src, dst) return dst def organize_with_multiprocessing(val_dirval, map_fileval.txt, processes4): # 使用pandas快速读取映射文件 df pd.read_csv(os.path.join(val_dir, map_file), sep , headerNone, names[filename, class_id]) # 准备任务列表 tasks [] for _, row in df.iterrows(): src os.path.join(val_dir, row[filename]) dst os.path.join(val_dir, row[class_id], row[filename]) tasks.append((src, dst)) # 创建目标目录 for class_id in df[class_id].unique(): os.makedirs(os.path.join(val_dir, class_id), exist_okTrue) # 并行处理 with Pool(processesprocesses) as pool: list(tqdm(pool.imap(parallel_organize, tasks), totallen(tasks), desc并行整理))5. 验证集整理的常见问题与解决方案在实际操作中可能会遇到以下典型问题问题现象可能原因解决方案部分图片未被移动文件名不匹配/映射文件错误检查映射文件与图片名的对应关系出现未知类别目录映射文件包含训练集中不存在的类别使用增强版脚本的类别验证功能移动速度极慢磁盘I/O性能瓶颈使用多进程版本或更换SSD存储权限错误无目标目录写入权限检查目录权限或使用sudo执行对于特别大的验证集可以考虑以下优化策略分阶段处理先处理部分数据验证脚本正确性日志记录详细记录每个文件的操作结果校验机制整理完成后检查每个类别的文件数量是否合理一个简单的校验脚本示例def validate_reorganization(val_dirval, map_fileval.txt): # 读取原始映射关系 with open(os.path.join(val_dir, map_file)) as f: expected {line.split()[0]: line.split()[1] for line in f} # 检查实际分布 actual {} for class_id in os.listdir(val_dir): class_dir os.path.join(val_dir, class_id) if os.path.isdir(class_dir): for filename in os.listdir(class_dir): actual[filename] class_id # 对比差异 mismatches [] for filename, expected_class in expected.items(): if filename in actual and actual[filename] ! expected_class: mismatches.append((filename, expected_class, actual[filename])) if mismatches: print(f发现 {len(mismatches)} 个文件位置错误) for i, (f, exp, act) in enumerate(mismatches[:5], 1): print(f{i}. {f} 应在 {exp} 但实际在 {act}) else: print(所有文件位置正确)6. 与深度学习框架的集成整理好的验证集可以无缝接入主流深度学习框架的数据加载器。以下是PyTorch和TensorFlow的示例PyTorch示例from torchvision import datasets, transforms # 数据预处理 val_transform transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) # 加载验证集 val_dataset datasets.ImageFolder(val, transformval_transform) val_loader torch.utils.data.DataLoader( val_dataset, batch_size32, shuffleFalse, num_workers4)TensorFlow示例from tensorflow.keras.preprocessing.image import ImageDataGenerator val_datagen ImageDataGenerator( rescale1./255, samplewise_centerTrue, samplewise_std_normalizationTrue) val_generator val_datagen.flow_from_directory( val, target_size(224, 224), batch_size32, class_modecategorical, shuffleFalse)整理后的验证集结构还能方便地进行各种分析比如计算每个类别的样本数import collections def analyze_class_distribution(val_dirval): class_counts collections.Counter() for class_id in os.listdir(val_dir): class_dir os.path.join(val_dir, class_id) if os.path.isdir(class_dir): class_counts[class_id] len(os.listdir(class_dir)) print(各类别样本数统计:) for class_id, count in class_counts.most_common(5): print(f{class_id}: {count}张) print(f总计: {sum(class_counts.values())}张图片)在实际项目中我通常会先运行这个小工具确认验证集整理是否正确——特别是当验证准确率异常时首先要检查的就是数据是否放对了位置。曾经有个项目因为映射文件版本不对导致验证准确率比预期低了15%花了三天时间才发现是数据整理环节出了问题。

相关文章:

告别混乱:手把手教你用Python脚本整理ILSVRC2012验证集(附valprep.sh解析)

告别混乱:用Python脚本高效整理ILSVRC2012验证集 当你第一次打开ILSVRC2012验证集文件夹时,50000张图片杂乱堆放的场景可能让人头皮发麻——没有分类子目录,只有一堆以"ILSVRC2012_val_00000001.JPEG"命名的文件。这种原始结构与训…...

从SMP到NUMA:聊聊多核CPU时代Linux内存管理是怎么‘进化’的

从SMP到NUMA:多核CPU时代的内存管理演进之路 2000年代初,当单核CPU的主频竞赛逐渐触及物理极限时,计算机架构师们面临一个关键抉择:如何在芯片上堆叠更多晶体管?答案最终指向了多核设计。但随之而来的内存访问瓶颈&…...

当三维基因组“打结”:从罕见病到癌症,那些被折叠改变的生命密码

当三维基因组“打结”:从罕见病到癌症,那些被折叠改变的生命密码 想象一下,如果把人类基因组比作一条长达两米的毛线,它需要被精巧地折叠进直径仅几微米的细胞核中。这种看似不可能的折叠并非随机——它遵循着严格的拓扑规则&…...

别再只搜WOL教程了!华硕/微星主板BIOS里这两个隐藏选项没开,魔术包收到也白搭

华硕/微星主板WOL终极配置指南:破解BIOS隐藏选项的实战手册 深夜加班后想远程唤醒家里的台式机渲染视频,却发现魔术包石沉大海?你可能已经按照无数教程配置了网卡唤醒选项,却忽略了主板BIOS里那两个致命的隐藏开关。本文将用实验室…...

Vulkan学习笔记

顺序很重要&#xff1a;#define 必须在 #include <GLFW/glfw3.h> 之前出现&#xff0c;否则不起作用。作用&#xff1a;当 GLFW 的头文件看到这个宏被定义后&#xff0c;它就会知道你需要 Vulkan 支持&#xff0c;并自动执行 #include <vulkan/vulkan.h>&#xff0…...

隐写术:把秘密藏在你眼皮底下

你有没有想过&#xff0c;秘密不一定非要“加密”&#xff0c;还可以“藏起来”&#xff1f;这就是隐写术的思想——让别人根本不知道这里藏了信息。早在公元前5世纪&#xff0c;一位希腊人为了把情报传回祖国&#xff0c;把文字写在刮去蜡的木板上&#xff0c;再用新蜡覆盖。收…...

2000-2025年《中国县域统计年鉴》pdf+excel版(附赠面板数据)

资源介绍《中国县域统计年鉴》2000-2025一、数据介绍《中国县域统计年鉴》是一部全面反映我国县域社会经济发展状况的资料性年鉴&#xff0c;从2014年开始分为《中国县域统计年鉴&#xff08;县市卷&#xff09;》和《中国县域统计年鉴&#xff08;乡镇卷&#xff09;》两卷。数…...

马斯克解散 xAI、接纳 Anthropic:亡羊补牢的无奈,与一场被 AGI 神话带偏的豪赌

马斯克解散 xAI、接纳 Anthropic&#xff1a;亡羊补牢的无奈&#xff0c;与一场被 AGI 神话带偏的豪赌 2026 年 5 月 6 日&#xff0c;两件事同时发生&#xff1a; 一、Anthropic 宣布获得 xAI Colossus 1 集群的全部算力——22 万张英伟达 GPU&#xff0c;300 兆瓦电力容量。 …...

大部分 App 没准备好被 Agent 操作——这是设计缺陷,不是功能缺失

大部分 App 没准备好被 Agent 操作——这是设计缺陷&#xff0c;不是功能缺失 2025 年被很多人称为「AI Agent 元年」。 Claude Code、Cursor、Windsurf……一批 agentic 工具密集涌现&#xff0c;Agent 不再只是聊天框里的助手&#xff0c;它开始真正「做事」&#xff1a;自己…...

深度解析:HS2-HF Patch如何通过模块化架构彻底重塑游戏体验

深度解析&#xff1a;HS2-HF Patch如何通过模块化架构彻底重塑游戏体验 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch作为《Honey Select 2》最全…...

应急通信无人机中继部署与覆盖率优化【附仿真】

✨ 长期致力于应急通信、无人机、中继部署、通信覆盖率、无人机部署数目研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;视距概率信道建模与高度部署&a…...

Windows驱动存储深度管理:DriverStore Explorer专业指南

Windows驱动存储深度管理&#xff1a;DriverStore Explorer专业指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 在Windows系统维护的众多任务中&#xff0c;驱动程序管理往往是最容…...

Gemini实时字幕在Google Meet中延迟超800ms?揭秘谷歌内部SRE监控数据与3步毫秒级调优法

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Gemini实时字幕在Google Meet中延迟超800ms&#xff1f;揭秘谷歌内部SRE监控数据与3步毫秒级调优法 谷歌内部SRE团队近期公开的一组匿名化监控数据显示&#xff1a;在高并发&#xff08;>500人&…...

终极指南:BepInEx 6.0插件框架如何彻底解决Unity游戏模组开发的稳定性难题

终极指南&#xff1a;BepInEx 6.0插件框架如何彻底解决Unity游戏模组开发的稳定性难题 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一个革命性的Unity游戏插件与模组开…...

Midjourney水彩风提示词已进入“语义过载”危机?2024Q2最新精简指令集发布(仅保留11个高响应关键词,准确率提升63.8%)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney水彩风提示词的语义过载现象本质解析 水彩风格生成中&#xff0c;“watercolor”、“gouache”、“loose brushstrokes”、“wet-on-wet”等提示词常被叠加使用&#xff0c;表面增强风格表征…...

如何自定义查询历史记录面板的展示风格_时间轴样式设计

...

41《CAN总线报文周期、抖动与实时性分析》

CAN总线基础:从物理层到数据链路层的核心概念 一、一个让我熬夜的CAN问题 去年调试某款车载ECU时遇到个诡异现象:同一批次的控制器,有的在-20℃低温下CAN通信完全正常,有的却频繁丢帧。示波器挂上去一看,显性电平的下降沿斜率明显变缓,从正常的15ns拖到了40ns。查了三天…...

鸿蒙 App 的 Task + State 双核心架构

子玥酱 &#xff08;掘金 / 知乎 / CSDN / 简书 同名&#xff09; 大家好&#xff0c;我是 子玥酱&#xff0c;一名长期深耕在一线的前端程序媛 &#x1f469;‍&#x1f4bb;。曾就职于多家知名互联网大厂&#xff0c;目前在某国企负责前端软件研发相关工作&#xff0c;主要聚…...

《凰标》与《第一大道》:同一宇宙下的龙凤双璧@凤凰标志

龙凤双璧&#xff1a;海棠山铁哥文学宇宙宣言——《第一大道》《凰标》世界观联动白皮书一、时代之问&#xff1a;当网文只剩“单兵”市场痛点铁哥答案单兵叙事双IP共生世界观割裂同源宇宙IP不成体系闭环叙事 二、宇宙基石&#xff1a;一破一立的双璧格局 #mermaid-svg-A2eFhZn…...

Vivado时序约束实战:输入/输出延时设置背后的时序模型与设计考量

1. 时序约束的本质&#xff1a;从理论到实践的桥梁 刚接触FPGA设计时&#xff0c;我最头疼的就是时序约束。那些建立时间、保持时间的概念看得人云里雾里&#xff0c;更别说要在Vivado里实际设置了。直到有一次项目因为时序问题导致整板无法工作&#xff0c;我才真正明白时序约…...

面试被问烂的20道编程基础题,你必须全会,不然别去面试

文章目录前言一、Python基础篇&#xff08;6道&#xff09;1. Python中list和tuple有什么区别&#xff1f;2. Python 3.7之后普通dict已经有序了&#xff0c;那OrderedDict还有存在的必要吗&#xff1f;3. Python中的深拷贝和浅拷贝有什么区别&#xff1f;4. Python中的*args和…...

TINA-TI仿真实战:从运放振铃到电源设计的电路调试指南

1. 为什么我们需要TINA-TI仿真软件 作为一个在硬件设计领域摸爬滚打多年的工程师&#xff0c;我见过太多因为电路设计问题导致的返工案例。记得有一次&#xff0c;我们团队花了两周时间手工焊接的样机&#xff0c;上电后运放输出端出现了严重的振铃现象&#xff0c;不得不全部拆…...

SteamAutoCrack:3步自动化破解Steam游戏的终极解决方案

SteamAutoCrack&#xff1a;3步自动化破解Steam游戏的终极解决方案 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack 你是否厌倦了每次想离线玩游戏时都要手动破解的繁琐过程&#xff1f…...

深入STM32F429 LTDC双图层与DMA2D:打造流畅UI界面的性能优化指南

STM32F429 LTDC与DMA2D深度优化&#xff1a;构建60FPS工业级UI的实战指南 在工业HMI和医疗设备等对显示性能要求严苛的场景中&#xff0c;流畅的UI动画和实时数据可视化往往成为系统瓶颈。STM32F429的LTDC控制器配合DMA2D加速器&#xff0c;通过合理的架构设计可实现媲美专业GP…...

Unlock Music:3种创新用法让你重新掌控被加密的音乐收藏

Unlock Music&#xff1a;3种创新用法让你重新掌控被加密的音乐收藏 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: htt…...

后端开发必看:设计高并发系统时,如何估算你的RTT和时延带宽积?

高并发系统设计实战&#xff1a;从RTT到时延带宽积的性能优化指南 在分布式系统的世界里&#xff0c;网络性能指标往往成为制约整体吞吐量的隐形瓶颈。我曾亲眼见证过一个日活百万的社交平台&#xff0c;因为微服务间调用的RTT估算偏差&#xff0c;导致高峰期请求堆积如山的惨状…...

加州自动驾驶测试报告解读:数据背后的技术演进与行业趋势

1. 从加州数据看自动驾驶的“成绩单”&#xff1a;2021年测试报告深度解读每年年初&#xff0c;自动驾驶圈子里不少人都会习惯性地去翻看一份来自美国加州的“成绩单”——加州机动车辆管理局发布的年度自动驾驶车辆测试报告。这份报告就像一份公开的“期中考试”排名&#xff…...

用Yii2快速构建微服务RESTful API全攻略

...

AI时代数据中心架构变革:从计算中心到加速基础设施

1. 从“计算中心”到“加速基础设施”&#xff1a;数据中心架构的范式转移最近和几个在头部云厂商做架构设计的老朋友聊天&#xff0c;话题总绕不开一个词&#xff1a;加速基础设施。这词儿听起来挺高大上&#xff0c;但说白了&#xff0c;就是咱们传统数据中心那套“通用计算存…...

Linux调试利器:用addr2line精准定位程序崩溃现场

1. 当程序崩溃时&#xff0c;我们该如何快速定位问题&#xff1f; 作为一名长期奋战在Linux开发一线的程序员&#xff0c;我最头疼的就是遇到程序突然崩溃的情况。那种看着终端输出"Segmentation fault (core dumped)"却无从下手的无力感&#xff0c;相信很多开发者都…...