
简介这是一份用于人民币图像二分类的深度学习数据集面向希望掌握 LeNet 卷积神经网络的初学者压缩包约 62.1MB内含经过尺寸归一化、灰度化、色彩均衡等预处理的纸币图像样本可直接用于训练、验证与测试。LeNet 的经典结构由卷积层、池化层与全连接层组成其中卷积负责特征提取池化负责降维全连接负责分类决策数据围绕不同人民币面额的二分类目标组织省去了自行采集、清洗图像的流程。配套使用反向传播与梯度下降时可学习交叉熵损失下的权重更新与学习率调节通过验证集调整超参数、防止过拟合利用测试集评估最终泛化能力同时可用准确率、精确率、召回率与 F1 分数等指标衡量模型在不同面额上的识别表现。该资源已有 450 人学习适合计算机视觉入门者夯实 CNN 原理也可作为图像分类 baseline 的练习素材借助这个项目读者能完整经历 LeNet 从数据输入、特征提取到全连接分类的经典流程为后续更复杂的识别任务打下基础。资源涉及数据预处理、模型构建、训练验证与测试等多个关键环节可作为课程设计或入门实战项目。 先说个背景。我最近在做一个基于YOLO的人民币纸币识别项目训练用的图片、标注文件和训练脚本统一打包在一个叫RMB_train.zip的压缩包里。你可能会想一个zip能有什么好写的解压不就完事了吗。结果我从下载到正式开训光围着这个包就折腾了一整天——先是解压报invalid zip archive错误然后数据整理好后想推到Git远程仓库又被拒绝合并后面还研究了一轮zip加密和分卷合并。这篇文章就是把这一整天的经验盘清楚给所有做目标检测训练、常从GitHub下载zip快照、以及被各种zip报错折磨到想摔键盘的朋友。1. RMB_train.zip里装了什么一个YOLO项目的完整数据快照1.1 为什么用zip分发训练数据而不是git clone很多人会问项目代码不是用Git管理更好吗确实代码应该走Git但训练数据不太一样。我这次的包里有几百张人民币纸币图片每张都做了标注加上预训练权重和数据处理脚本总容量直奔1.5GB。GitHub仓库单文件大小有限制图片堆进去会把仓库拖垮即使用了LFSclone下来照样要等很久还涉及配额费用。zip在这里承担的是稳定版本快照的角色把数据和代码一次性拍扁校验、传输、归档都方便而且对方解压后拿到的文件结构和发布方完全一致。RMB_train.zip这个名字也有讲究RMB表示人民币train标识这是训练集val集我会单独打包zip是容器格式。拿到这种命名规范的包基本能猜到里面的组织方式这也是项目协作里该有的习惯。包内结构大致是这样RMB_train/ ├── data/ │ └── rmb.yaml # YOLO数据配置 ├── images/ │ ├── train/ # 训练图片 │ └── val/ # 验证图片 ├── labels/ │ ├── train/ # YOLO格式标注txt │ └── val/ ├── scripts/ │ ├── prepare_dataset.py # 数据集划分脚本 │ └── train.py # 训练入口 ├── weights/ │ └── yolov8s.pt # 初始权重 └── README.md1.2 解压后先别急着跑训练拿到任何训练包第一件事不是立刻训练而是先看README。我这份README里写了几条关键信息图片有版权限制对外发布前要确认数据来源和用途合规标注采用YOLO格式class_id从0开始train.py运行前需要把data/rmb.yaml里的路径改成实际绝对路径。这几条如果没看直接训练大概率会踩路径错误。另一个容易忽略的点是zip解压不保留Unix权限位。包里的shell脚本解压后经常没有执行权限跑起来会报Permission denied。这不是包坏了手动补上即可chmod x scripts/*.sh2. 开箱第一课Windows与Kali下解压zip的实用姿势2.1 先校验再做任何操作从网上下载的RMB_train.zip不管多急建议先做哈希校验。发布方如果给了sha256直接一条命令比对# Windows PowerShell Get-FileHash RMB_train.zip -Algorithm SHA256 # Linux / Kali sha256sum RMB_train.zip如果发布方没给哈希那就用完整性测试命令让工具逐个文件计算CRCunzip -t RMB_train.zip 7z t RMB_train.zip这一步花不了几秒但能避免训练到一半才发现某张图片损坏。YOLO训练是流水线式的一张损坏图片在mosaic增强时被随机采样到可能让你白白跑十几个epoch才崩溃。我在项目里会再写一个文件数量比对脚本把解压后的图片数和标注数对一遍数量对不上直接怀疑包不完整。2.2 工具选择Windows和Kali下的常用命令Windows上我推荐7-Zip或者Bandizip别用系统自带的压缩查看器大包和中文文件名场景下它经常显示错乱有的还被全家桶软件绑架天天弹窗推销能用命令行解决的事情真没必要装那些压缩大师。Linux和Kali终端下用unzip和7z命令场景命令解压到指定目录unzip RMB_train.zip -d RMB_train7z解压7z x RMB_train.zip -oRMB_train测试完整性unzip -t RMB_train.zip查看内容不解压unzip -l RMB_train.zip安全识别类型file RMB_train.zip这里多说一句file命令它尤其适合Kali这类注重安全的场景。有些zip伪装成图片或者反过来file会直接告诉你真实文件格式。遇到可疑压缩包解压前先跑一下file再看压缩包内的文件清单能避开不少坑。3. could not find eocd一场从报错到修复的完整排查3.1 eocd是zip的目录尾巴丢了会怎样我这次遇到的问题是在服务器上用unzip解压时直接报错error: invalid zip archive: could not find eocd先说结论EOCD全称End of Central Directory Record是zip文件末尾的一段结构记录中央目录的偏移量和文件总数。解压器读zip时几乎都是先跳到文件尾部找EOCD找不到就直接罢工。类似的报错还有End-of-central-directory signature not found本质是同一个问题文件尾部损坏中心目录失效了。为什么会出现这种情况我这次是下载到一半断线。其它常见原因还有下载工具不支持断点续传、U盘拷贝途中被拔出、杀毒软件扫到疑似风险文件顺手隔离、网盘下载时链路抖动。还有一种很隐蔽的情况——文件根本不是zip是网页错误页被存成了zip扩展名。GitHub上下载release附件时如果在浏览器里直接右键另存而不是走下载工具很容易拿回来一个HTML错误页面。3.2 我的排查链路从文件大小到zip -FF排查不要一上来就找修复工具按下面这个链路走更有效率先看文件大小。ls -l RMB_train.zip和发布页标注的字节数对比。大小差太多基本不用修了直接重新下载。用file RMB_train.zip看真实类型。如果显示HTML document或者ASCII text说明拿到的根本不是zip可以删了重下。再跑unzip -t测试完整性确认损坏范围。尝试用zip -FF重建中央目录zip -FF RMB_train.zip --out RMB_train_repaired.zip这个命令会扫描zip里每个local file header把能读到的文件列表重新组织成一个新包。修复成功的包大多数文件能捞回来但损坏位置的尾部文件可能内容不全。修复完后必须再跑一次unzip -t确认哪些文件CRC不过。如果zip -FF也失败试试用7-Zip直接打开。7z的扫描逻辑更蛮力有时能从损坏包里直接拖出文件。如果包里是参与训练的数据文件别修了回源站重新下载这次用支持断点的工具。修复工具本质是抢救不是复原。哪个文件损坏CRC校验会告诉你。缺一张两张图片还能忍标注文件缺了或者串了行训练结果一定跑偏这时候重新下载才是最稳的。3.3 同类但不同源的zip报错排查过几个朋友的类似问题发现看着像zip损坏的报错来源可以差很远安装SolidWorks时报failed to copy spatial iop zip表面上是复制zip文件失败实际上十次有九次是安装器释放临时文件时被安全软件拦截或者安装目录所在磁盘有问题。开发环境导入资源包报invalid zip archive: could not find eocd多半是发布包和开发包搞混了或者资源包来自某个平台的差量下载不是完整包。老Android刷机、嵌入式固件升级、UTAU音声库这类zip包报CRC错误常见原因是SD卡或U盘本身质量不行拷贝过程悄无声息地丢了数据。所以看到报错先别急着修zip先问一句这个zip是传输过程中坏的还是生成它的时候就没生成对4. 从zip快照到Git仓库解决unrelated histories的两种姿势4.1 为什么zip和git天生冲突zIP包修复完成后我把数据整理了一番想推回自己的Git远程仓库。结果执行git pull或git rebase时git直接拒绝fatal: refusing to merge unrelated histories原因其实很简单zip快照里没有.git目录它只是一堆文件在某个时间点的拷贝。我在本地git init后提交的第一个commit是一棵独立的树而远程仓库也有自己独立的根git在合并时找不到共同祖先出于安全策略就会拒绝。很多人第一次见这个报错都以为要强行覆盖其实得先想清楚自己的场景远程仓库是空的还是已经有内容4.2 场景A远程仓库是空的把zip当基线导入如果远程仓库本来就是新建的空仓库处理最简单unzip RMB_train.zip -d RMB_train cd RMB_train git init git add -A git commit -m import RMB_train snapshot git remote add origin gitgithub.com:you/RMB_train.git git push -u origin main这样本地历史是从零开始的一条直线远程那边也没有别的提交完全不需要合并。zip里的文件就作为项目的第一版基线以后所有改动都在这个基线上继续。4.3 场景B远程已有内容要保留本地改动如果远程仓库里已经有历史提交本地解压出来的文件又做了改动这时不能直接push要把两段独立历史合并起来git init git remote add origin gitgithub.com:you/RMB_train.git git fetch origin git checkout -b main origin/main git pull --allow-unrelated-histories origin main--allow-unrelated-histories的作用只是允许合并不相关历史合并时产生的文件冲突仍然要手动解决没有银弹。以我的经验训练项目中冲突最多的是data/rmb.yaml这种配置文件——远程版本改了路径本地版本改了类别名git只能把两边都标出来。另外给个建议如果zip里带插件目录或额外jar包导入IDE后记得重新同步依赖否则光有文件没有classpath项目照样起不来。能不下载zip就尽量git clonezip适合存档分发开发协作还是用git更省心。5. 加密、解密与密码找回zip当保险柜的正确打开方式5.1 ZipCrypto和AES-256强度天差地别数据包如果涉及钞票图片、客户数据裸zip传输风险不小该加密就要加密。zip加密有两种主流方式强度差别非常大加密方式兼容性安全性适用场景ZipCrypto传统几乎全平台弱几分钟可被破解不建议传输敏感数据AES-256WinZip/7-Zip7-Zip、WinZip、Keka等强目前安全带版权和隐私数据的数据集生成AES-256加密的zip7-Zip一条命令7z a -tzip -memAES256 -p你的密码 RMB_train_encrypted.zip ./RMB_train/一个容易掉进去的坑是兼容性Windows自带的资源管理器解不开AES加密的zipmacOS自带的归档实用工具也可能解不开。我遇到过同事在macOS上双击加密包直接报无法解压最后让他装了Keka才解决。所以加密打包之前先和接收方确认对方解压工具支持AES否则就别用AES改用双方都确认过的工具链。5.2 忘了密码怎么办掩码攻击思路与合法边界加密之后最尴尬的事就是密码忘了。如果这个包确实是你自己的密码又实在想不起来市面上有不少工具可以尝试找回比如百事牛zip密码恢复工具支持暴力、掩码、字典三种模式。我的建议是从掩码模式入手效率远高于纯暴力。假设你记得密码是7位、开头是rmb、末尾是数字直接把这些条件填进掩码搜索空间瞬间从天文数字缩小到几千几百万次几分钟就能跑完。纯暴力的话5位纯数字秒破8位小写字母可能要几小时到几天12位混合字符基本只能靠字典或者放弃。有一点必须先说清楚密码恢复工具只适用于你自己有合法权限处理的数据包。拿这些工具去破解别人加密发出的zip那是明确的违法行为。我在这类项目里给数据包加密主要目的是防传输链路泄露不是用来搞对抗别把方向搞反。5.3 加密传输的几个实操细节加密zip的密码不要写在README里更不要和包一起放在同一个网盘链接下。我习惯把密码通过另一个渠道单独发给接收方比如短信或独立会话。传输完成后如果对方确认解压无误可以通知发布方更新密码再归档避免一个密码用一辈子。6. 分卷压缩的坑z01文件没有zip时到底怎么解6.1 为什么会有z01、z02数据集一旦超过4GB麻烦就来了。FAT32格式的U盘不支持4GB以上单文件网盘平台也有单文件大小限制这时候就要分卷压缩。分卷的本质是把一个大zip按字节切成若干个固定大小的文件文件名编号连续7-Zip分卷命令7z a -tzip -v4G RMB_train.zip ./RMB_train/生成的结果是一串按顺序编号的文件RMB_train.z01、RMB_train.z02、RMB_train.zip。注意最后一个是普通zip扩展名它不是额外的主包而是分卷序列的收尾分卷前面所有z01、z02都齐了它才有意义。6.2 只有z01没有zip怎么办网上经常有人问我只有z01文件没有zip主文件怎么解压绝大多数情况是最后一个分卷没下载全。分卷解压的规则是把所有分卷放在同一目录然后对主zip文件执行解压7-Zip会自动按顺序读取z01、z02。直接双击z01是打不开的不用慌补下缺失的分卷就行。还有一种情况是假性缺失文件管理器默认不显示扩展名你看到的没有zip其实是扩展名被隐藏了。在文件夹选项里打开显示文件扩展名再看一眼zip可能一直躺在那里。另外分卷文件严禁改文件名把z01改成别的扩展名或者把zip改名7-Zip会报下一卷不存在或者CRC失败这时候只能改回原始命名再解压。6.3 合并分卷的正确做法严格来说分卷可以手动合并回一个大zipcopy /b RMB_train.z01 RMB_train.z02 RMB_train.zip RMB_train_full.zipWindows的copy /b按二进制顺序拼接理论可行。但说实话没必要7z直接按分卷解压又快又稳还能省一次合并的磁盘空间。除非你后续需要把这个zip传到只支持单文件的地方否则不要手动合并拼错了反而把整个包废掉。另外补一句如果发布方用的是WinRAR风格分卷扩展名是.part1.rar、.part2.rar原理一样但工具要对应别拿解zip的命令去解rar分卷。写在最后我的一点实操习惯RMB_train.zip这个项目最终顺利开训了但围绕它的各种zip折腾让我养成一个习惯收到任何训练数据压缩包先校验哈希再测试完整性解压后再跑一遍文件数量和格式比对。这个流程帮我躲过至少三次数据损坏。还有一个小技巧是同一份数据我会在本地归档一个原始包sha256.txt的目录不管是重训还是复现结果都从这份原始包走不在原始文件上做任何修改。数据集和代码一样需要版本概念zip就是我们这种训练项目最低成本的版本载体。希望这篇踩坑记录能让你少走点弯路。本文还有配套的精品资源点击获取