ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

11类动物图像分类数据集:7000张标注图+开箱即用划分

11类动物图像分类数据集:7000张标注图+开箱即用划分 简介本资源是一份面向计算机视觉初学者与进阶学习者的11类常见动物图像分类数据集适用于图像分类模型训练、验证与教学实践特别适配CNN、ViT等主流分类网络的快速上手与性能对比。数据集共约7000张标注图像已按类别狗、牛、羊、老虎、猪等划分训练集与测试集并完成统一预处理可直接加载训练压缩包内含1998张JPG格式样本图、1个JSON标签文件含完整类别映射与路径信息及1个Python可视化脚本show.py便于快速校验数据分布与质量。资源包大小为172.83MB结构简洁、即取即用。目前已有117人学习下载配套博主还提供了图像分类与分割网络改进方案、完整CV项目案例等延伸内容方便读者系统拓展实战能力。1. 11类动物图像分类数据集7000张已标注图开箱即用划分新手跑通ResNet50只要3分钟你刚搭好PyTorch环境想验证一个分类模型但卡在第一步——找不到一份「不用修图、不用写标注脚本、不报shape错」的干净数据集。这份11种常见动物图像分类数据集就是为这种时刻准备的它不是网上随手爬的杂图包而是经过统一尺寸裁剪224×224、通道校验RGB三通道、标签对齐JSON文件夹双保险、训练/测试集物理隔离的实战级资源。7000张图覆盖狗、牛、羊、老虎、猪、马、猫、鸡、鸭、猴、兔——注意不是“宠物”或“家畜”这种模糊类别而是具体到物种层级的硬分类连老虎和狮子都没混在一起本集只含虎。它专为CV入门者和模型快速验证设计你解压后直接train_loader ImageFolder(data/train)就能喂进ResNet、EfficientNet甚至ViT不需要任何预处理胶水代码。如果你正被label mismatch、PIL读取崩溃、train/test比例混乱折磨这份数据集就是你的后悔药——不是理论正确是实操不翻车。2. 数据结构与加载逻辑为什么文件夹结构比JSON更可靠这份数据集采用经典ImageFolder兼容结构而非仅靠JSON维护映射关系。这是经过血泪经验验证的选择当你的团队有3人同时调试不同分支有人改了JSON键名有人删了空行有人用Excel另存为覆盖——而文件夹路径永远真实存在。我们先看它的物理组织animal_dataset/ ├── train/ │ ├── dog/ │ │ ├── 00000016.jpg │ │ └── ... │ ├── tiger/ │ └── ... ├── test/ │ ├── dog/ │ └── ... ├── labels.json └── README.md2.1 文件夹结构ImageFolder的隐式标签机制PyTorch的torchvision.datasets.ImageFolder会自动将子目录名作为类别名并按字母序编号cat0, chicken1,...tiger4。这意味着你不需要手动读JSON来构建class_to_idx——只要保证train/下11个子文件夹名与JSON中classes字段完全一致包括大小写和空格加载器就能零配置工作from torchvision.datasets import ImageFolder from torch.utils.data import DataLoader train_ds ImageFolder(animal_dataset/train, transformtransforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ])) print(fClasses: {train_ds.classes}) # [cat, chicken, cow, ... tiger] print(fClass to idx: {train_ds.class_to_idx}) # {cat: 0, chicken: 1, ...}提示ImageFolder的class_to_idx生成逻辑是sorted(os.listdir(root))所以如果你把tiger文件夹重命名为Tiger首字母大写它会在排序中排到最前导致所有类别ID偏移。务必保持小写且无特殊字符。2.2 labels.json双重校验与类别说明虽然文件夹结构足够驱动训练但labels.json提供了关键元信息用于调试和复现{ classes: [cat, chicken, cow, dog, duck, horse, monkey, pig, rabbit, sheep, tiger], train_count: 5623, test_count: 1377, total: 7000, notes: All images resized to 224x224, RGB mode, no augmentation applied }这个JSON的价值在于验证数据完整性对比len(train_ds)与train_count若不等说明有损坏图片未被ImageFolder跳过它默认忽略无法打开的文件避免手误当你想用sklearn.metrics.classification_report时labels.json[classes]可直接传入target_names参数不用再从dataset里反查跨框架迁移TensorFlow用户可用tf.keras.utils.image_dataset_from_directory其class_names参数需显式传入labels.json[classes]否则顺序可能不同。2.3 show.py可视化脚本3行代码确认数据质量资源中附带的show.py不是花架子它是你启动训练前的必检环节。它做了三件事随机采样每个类别的3张图拼成网格并叠加类别名字体大小适配224px图用plt.tight_layout()防止标签重叠。运行后你会立刻发现两类问题类别混淆比如sheep文件夹里混入山羊goat——本数据集明确只收绵羊Ovis aries山羊属于另一物种标注错误tiger目录下出现豹纹猫leopard cat——这类误标已在预处理阶段人工复核剔除但show.py是你最后的防线。# show.py 核心逻辑简化版 import matplotlib.pyplot as plt import numpy as np from torchvision.datasets import ImageFolder from torchvision.transforms import ToTensor ds ImageFolder(animal_dataset/train) fig, axes plt.subplots(3, 11, figsize(22, 6)) for i, cls_name in enumerate(ds.classes): # 获取该类所有样本索引 indices [j for j, (path, _) in enumerate(ds.samples) if ds.classes[ds.targets[j]] cls_name] sampled np.random.choice(indices, 3, replaceFalse) for j, idx in enumerate(sampled): img, _ ds[idx] axes[j, i].imshow(img.permute(1,2,0)) axes[j, i].set_title(cls_name, fontsize8) axes[j, i].axis(off) plt.savefig(dataset_preview.png, dpi150, bbox_inchestight)注意show.py默认只显示训练集。如需检查测试集修改路径为animal_dataset/test即可。不要跳过这步——我曾因一张pig目录下的野猪Sus scrofa图导致val_acc卡在62%排查3小时才发现是预处理漏筛。3. 预处理细节拆解为什么224×224是安全起点数据集宣称“已预处理”但“预处理”这个词在CV领域充满玄学。这里我们逐层拆解它实际做了什么以及你何时需要自己重做。3.1 尺寸统一CenterCrop vs Resize的取舍所有图像被调整为224×224像素但方式不是简单粗暴的transforms.Resize((224,224))会拉伸变形而是先transforms.Resize(256)保持宽高比缩放短边256再transforms.CenterCrop(224)从中心裁切正方形。这种组合保证了动物主体不被挤压对比直接Resize背景噪声被裁掉对比仅Resize后padding与ImageNet预训练权重的输入尺寸严格对齐ResNet50等要求224×224。# 正确做法匹配预训练权重 transform_train transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.RandomHorizontalFlip(), # 训练时加测试时不加 transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) # 错误做法直接Resize导致形变 # transforms.Resize((224,224)) # 猫脸被拉长特征提取失效3.2 通道与模式RGB校验的硬性门槛每张图都强制转换为RGB模式即使原图是灰度或RGBA# 数据集预处理脚本中的关键行示意 from PIL import Image img Image.open(path).convert(RGB) # 强制三通道 img img.resize((224,224), Image.BILINEAR) # 双线性插值保细节这解决了三个高频翻车点灰度图报错RuntimeError: expected 4D input (got 3D input)—— 因为灰度图只有1个通道而ResNet输入要求3通道透明通道干扰PNG带alpha通道时ToTensor()会输出4维张量后续Norm层维度不匹配OpenCV读图差异cv2.imread()默认BGR而PyTorch模型训练用RGB此处统一为RGB避免颜色域偏移。3.3 标签一致性文件夹名与JSON的双向绑定labels.json中的classes数组顺序必须与文件夹名的字典序严格一致。例如若train/下有cat、dog、tiger三个文件夹os.listdir(train)返回[cat,dog,tiger]则labels.json[classes]必须为[cat,dog,tiger]不能是[tiger,cat,dog]否则classification_report的target_names会错位precision指标失去意义。验证脚本建议加入你的train.py开头with open(animal_dataset/labels.json) as f: meta json.load(f) ds ImageFolder(animal_dataset/train) assert ds.classes meta[classes], \ fClass order mismatch! JSON: {meta[classes]}, Folder: {ds.classes}提示Windows系统对文件名大小写不敏感可能导致Tiger和tiger被视为同一文件夹。Linux/macOS下务必用小写命名labels.json也同步小写。4. 训练脚本实操从零开始跑通ResNet50含完整可复制代码别被“7000张图”吓到——它小到能在单卡2080Ti上10分钟出结果大到足够验证模型改进效果。下面给出一个极简但生产就绪的训练脚本重点解决新手最卡的三个点学习率衰减时机、GPU内存溢出、验证集指标可信度。4.1 数据加载器配置batch_size与num_workers的平衡术7000张图batch_size设为32时一个epoch约220次迭代。num_workers不是越大越好# 推荐配置RTX 3090 / 2080Ti train_loader DataLoader( train_ds, batch_size32, shuffleTrue, num_workers4, # 4时IO瓶颈转为CPU瓶颈速度不增反降 pin_memoryTrue, # 加速GPU数据传输 drop_lastTrue # 避免最后一个batch size不足影响BN统计 ) # 测试集不用shufflenum_workers可设为0避免多进程pickle问题 test_loader DataLoader( test_ds, batch_size32, shuffleFalse, num_workers0, # 安全起见测试集禁用多进程 pin_memoryTrue )避坑num_workers0时Windows用户常遇BrokenPipeError。解决方案将DataLoader创建移到if __name__ __main__:内并添加torch.multiprocessing.set_start_method(spawn)。4.2 模型与优化器冻结特征层的实操价值ResNet50在ImageNet上预训练其前几层提取通用边缘/纹理后几层才针对具体类别。微调时先冻结backbone只训练classifier头import torch.nn as nn from torchvision.models import resnet50 model resnet50(pretrainedTrue) # 冻结所有层 for param in model.parameters(): param.requires_grad False # 替换最后的fc层1000→11 model.fc nn.Sequential( nn.Dropout(0.5), nn.Linear(model.fc.in_features, 11) ) # 只优化classifier参数 optimizer torch.optim.Adam(model.fc.parameters(), lr0.001)这样做的好处收敛快5个epoch内train_acc可达95%防过拟合小数据集上全参数微调易过拟合显存省冻结后显存占用降低40%batch_size可提至64。4.3 学习率调度StepLR还是ReduceLROnPlateau本数据集推荐ReduceLROnPlateau——因为它根据val_loss动态调整比固定step更适应小数据波动scheduler torch.optim.lr_scheduler.ReduceLROnPlateau( optimizer, modemin, # 监控val_loss factor0.1, # 学习率乘以0.1 patience3, # 连续3个epoch没下降才衰减 verboseTrue # 打印lr变化 ) # 在验证循环后调用 val_loss validate(model, test_loader) scheduler.step(val_loss) # 自动判断是否衰减避坑StepLR在小数据集上容易早衰减——第10个epoch val_loss偶然升高lr骤降模型再也学不动。ReduceLROnPlateau的patience参数就是你的容错缓冲区。4.4 关键指标计算别再只看accuracy11分类任务中accuracy掩盖了严重问题。必须计算每个类的precision/recall/f1from sklearn.metrics import classification_report, confusion_matrix import numpy as np def evaluate_per_class(model, loader): model.eval() all_preds, all_labels [], [] with torch.no_grad(): for imgs, labels in loader: imgs, labels imgs.cuda(), labels.cuda() preds model(imgs).argmax(dim1) all_preds.extend(preds.cpu().numpy()) all_labels.extend(labels.cpu().numpy()) # 使用labels.json中的classes确保顺序 with open(animal_dataset/labels.json) as f: classes json.load(f)[classes] print(classification_report(all_labels, all_preds, target_namesclasses, digits3)) # 输出confusion matrix热力图略典型输出会暴露问题tigerrecall只有0.72漏检率高→ 检查tiger目录图片是否多为远距离模糊图rabbitprecision仅0.65误判率高→ 可能与sheep毛色相似需增强特征区分度。5. 常见问题排查5条血泪经验总结注意以下问题均来自真实复现场景非理论假设。每一条都对应一次深夜debug。5.1 现象ValueError: Expected more than 1 value per channel when training原因BatchNorm层在batch_size1时无法计算均值/方差分母为0。本数据集总图数7000若batch_size1且drop_lastFalse最后一个batch只剩1张图。解决训练时强制drop_lastTrue或改用nn.GroupNorm替代BN适合小batch最佳实践batch_size设为2的幂16/32/64避免边界情况。5.2 现象CUDA out of memory即使batch_size8也爆显存原因num_workers0时每个worker进程会复制一份模型到CPU内存再传给GPU。16GB显存卡在num_workers8时可能因CPU内存不足触发OOM。解决降低num_workers4是安全上限添加pin_memoryFalse牺牲10%速度换稳定性用torch.cuda.empty_cache()在每个epoch后清理缓存。5.3 现象训练acc99%但test acc65%且confusion matrix显示dog和wolf严重混淆原因数据集明确不含wolf检查train/dog/目录发现3张德牧German Shepherd被误标为dog但它们的毛色/体型接近狼——而labels.json中classes无wolf模型被迫在dog类内强行区分。解决人工复查dog目录删除或重标争议图或在labels.json中增加wolf类重新划分数据本数据集不支持此操作需自行扩展。5.4 现象show.py显示某类图片全为黑屏原因PIL读取某些CMYK模式TIFF图时返回全黑。本数据集已转RGB但若你从其他来源补充图片可能引入此类文件。解决预处理脚本中添加校验img Image.open(path) if img.mode ! RGB: img img.convert(RGB) # 再检查是否全黑 if np.array(img).mean() 5: # 均值5视为无效图 os.remove(path) # 删除或标记5.5 现象ImageFolder加载后len(train_ds)6998比labels.json[train_count]5623少原因ImageFolder跳过所有无法打开的图片如损坏的JPEG但labels.json统计的是文件数量非有效图片数。解决运行show.py时捕获异常记录失败路径用find animal_dataset/train -name *.jpg | xargs -I{} sh -c identify -format %m %w %h %r {} 2/dev/null || echo BAD: {}批量检测本数据集已通过此检测若你遇到此问题说明下载不完整需重新解压。6. 进阶技巧用Grad-CAM定位分类依据揪出数据污染源当你发现某个类别如tiger的val_acc始终卡在82%传统方法只能怀疑数据或模型。此时Grad-CAMGradient-weighted Class Activation Mapping能让你“看到”模型在关注什么——它不是黑匣子是可解释的诊断工具。6.1 Grad-CAM实现30行代码可视化热力图本技巧基于torchcam库轻量无需重写模型pip install torchcamfrom torchcam.methods import GradCAM from torchcam.utils import overlay_mask from PIL import Image # 加载一张tiger测试图 img_path animal_dataset/test/tiger/00000210.jpg img_pil Image.open(img_path).convert(RGB) img_tensor transform_test(img_pil).unsqueeze(0).cuda() # 初始化Grad-CAM指定最后一层conv cam_extractor GradCAM(model, layer4) # 获取模型输出和CAM out model(img_tensor) activation_map cam_extractor(out.squeeze(0).argmax().item(), out) # 叠加热力图 result overlay_mask(img_pil, activation_map, alpha0.5) result.save(tiger_gradcam.jpg)6.2 解读热力图识别三类典型问题热力图模式问题类型应对措施热区集中在背景如栅栏、树叶数据集偏差tiger图多为动物园拍摄模型学会识别“笼子”而非“虎纹”用CutMix增强或手动剔除背景主导的样本热区分散且微弱全图淡红特征学习失败可能因tiger样本太少本集tiger仅412张或与其他类lion纹理相似增加tiger数据或用Focal Loss加权热区精准覆盖虎头/条纹但acc仍低标注错误热力图正确但标签错如把豹当虎用热力图筛选top-N可疑样本人工复核6.3 自动化污染检测批量扫描阈值告警为避免人工翻图写一个扫描脚本对每个类别的前100张图生成Grad-CAM计算热区面积占比def cam_area_ratio(cam_map, threshold0.3): 计算热力图中threshold区域占图比例 return (cam_map threshold).sum() / cam_map.numel() # 对tiger类批量分析 tiger_paths glob(animal_dataset/test/tiger/*.jpg)[:100] ratios [] for p in tiger_paths: img Image.open(p).convert(RGB) cam get_cam(model, img) # 封装上述逻辑 ratios.append(cam_area_ratio(cam)) avg_ratio np.mean(ratios) if avg_ratio 0.15: # 热区占比过低 print(fWARNING: tiger class has low attention ratio {avg_ratio:.3f}) # 触发人工审核流程从那以后我每次新增数据或更换模型都强制走一遍Grad-CAM扫描——它比loss曲线更早暴露数据质量问题。有一次发现sheep类热区全在草地立刻检查原始图果然80%是牧羊犬collie被误标为sheep。希望帮到你。本文还有配套的精品资源点击获取
返回列表