Ultralytics YOLO 图像分类实战:Caltech-101 数据集详解与 YOLO26 分类模型训练指南
Caltech-101 是计算机视觉领域经典的图像分类基准数据集,包含 9,144 张图像、101 个物体类别外加 1 个背景类,共 102 个类别目录。本文以 Ultralytics 官方文档为基础,结合本仓库中 数据集切分工具 与 分类训练器 的源码实现,完整讲解如何用 YOLO 分类模型(如 yolo26n-cls)在 Caltech-101 上零手工准备地完成训练:包括数据集结构与 80/20 自动切分机制、Python/CLI 两种训练方式的关键参数、以及底层训练流程的实现细节,帮助读者快速复现并理解整个训练链路。
Caltech-101 数据集概览
Caltech-101 由加州理工学院发布,是一个覆盖真实世界物体(动物、车辆、家居用品、人物等)的经典分类基准。其核心特性如下:
- 规模:9,144 张彩色图像,分布在 101 个物体类别外加 1 个
BACKGROUND_Google背景类,共 102 个类别目录。 - 类别不平衡:每个类别的图像数量约为 40 到 800 张,类别规模差异显著,训练时需关注小样本类别的表现。
- 分辨率:图像尺寸可变,多数图像约为 300x200 像素(中等分辨率)。
- 定位:被广泛用于图像分类与目标识别算法(CNN、SVM 及各类深度学习模型)的基准评测,是模型研究与原型验证的常用数据集。
数据集结构与自动切分
Caltech-101 以 102 个类别文件夹 的形式分发,不自带预定义的训练/验证划分。Ultralytics 在首次训练时会自动完成 80% 训练 / 20% 验证的切分,无需任何手工准备:
| 项目 | 说明 |
|---|---|
| 类别数 | 102(101 个物体类别 + 1 个背景类) |
| 图像总数 | 9,144 张 |
| 训练/验证划分 | 自动 80% / 20%(约 7,280 张训练、1,864 张验证) |
| 每类图像数 | 约 40 到 800(不平衡分布) |
这种"目录即标注"的结构(文件夹名 = 类别名)正是 Ultralytics 分类任务的数据格式要求,也是自动切分能够生效的前提。
源码视角:自动切分是怎么实现的
文档中"训练时自动切分"的说明,对应仓库中的通用切分工具 split_classify_dataset。该函数的行为可以从源码直接确认:
- 输出目录:在源目录旁创建
{source_dir}_split新目录,包含train/与val/两个子目录,保留原有类别结构(例如caltech_split/train/<class>/); - 切分比例:
train_ratio参数默认 0.8,逐类执行random.shuffle后按比例shutil.copy2复制文件,保证每个类别内部都按 80/20 划分,而不是全局随机划分; - 文件过滤:只处理后缀在
IMG_FORMATS白名单内的图片文件(shutil复制而非移动,原数据不动)。
从源码结构看,该函数还通过 __main__ 入口(split.py)直接支持 split_classify_dataset("caltech101") 的命令行调用,说明官方工具链将 Caltech-101 作为分类数据集切分的标准示例场景。若需要自定义比例(如 75/25),可直接调用 split_classify_dataset("path/to/caltech101", 0.75)。
应用场景
Caltech-101 被广泛用于训练和评测图像分类与目标识别模型,包括卷积神经网络(CNN)与支持向量机(SVM)等算法。其类别覆盖面广、标注干净,是机器学习与计算机视觉研究及原型开发的热门基准。在 Ultralytics 生态中,它是 YOLO 分类任务(task=classify)的典型训练数据源之一——仓库文档在 分类数据集总览 中将 Caltech-101 与 Caltech-256、CIFAR-10/100、Fashion-MNIST、MNIST、Imagenette、ImageNet-10 等并列为支持自动下载的分类数据集。
使用:在 Caltech-101 上训练 YOLO 分类模型
官方推荐的入门配置是:100 个 epoch、图像尺寸 416,使用预训练权重 yolo26n-cls.pt 作为起点。数据集在首次使用时会自动下载。以下两种方式等价,完整的训练参数列表可参考 训练模式文档 与 图像分类任务指南。
Python
from ultralytics import YOLO
# 加载模型
model = YOLO("yolo26n-cls.pt") # 加载预训练模型(训练时推荐)
# 训练模型
results = model.train(data="caltech101", epochs=100, imgsz=416)
CLI
# 从预训练 *.pt 模型开始训练
yolo classify train data=caltech101 model=yolo26n-cls.pt epochs=100 imgsz=416
关键参数说明
| 参数 | 示例值 | 说明 |
|---|---|---|
data |
caltech101 |
数据集名称,首次使用自动下载 |
model |
yolo26n-cls.pt |
分类任务预训练权重,作为迁移学习起点 |
epochs |
100 |
训练轮数 |
imgsz |
416 |
输入图像尺寸。注意:分类任务的默认值是 224(见下文源码说明),显式传入 416 可获得更高的分类精度 |
源码视角:ClassificationTrainer 的训练链路
model.train(data="caltech101", ...) 在分类任务下会路由到 ClassificationTrainer。其中几个与本文示例直接相关的实现细节:
- imgsz 默认值:
ClassificationTrainer.__init__中,当imgsz未指定时强制设为 224(overrides["imgsz"] = 224)。这就是为什么 Caltech-101 文档示例显式指定imgsz=416——不传的话会以较小的 224 尺寸训练。 - 类别数自动对齐:
setup_model末尾调用ClassificationModel.reshape_outputs(self.model, self.data["nc"])(train.py),把模型输出头重塑为数据集的类别数。对 Caltech-101 而言即 102 个输出通道(101 物体类 + 1 背景类),无需手工配置nc。 - 数据加载与防御性校验:
get_dataloader基于ClassificationDataset构建数据集,并在样本的类别索引超出模型nc时自动过滤多余类别并告警(train.py),避免训练中出现 CUDA 断言错误;若train/或val/目录下找不到任何图像则会抛出FileNotFoundError并提示分类数据集格式要求。 - 模型来源:
setup_model还检查模型名是否存在于torchvision.models命名空间中——若在,则直接以 ImageNet 预训练权重实例化对应 torchvision 模型,这意味着除 YOLO 分类头外也可用 torchvision 骨干在 Caltech-101 上训练。
训练过程中,分类任务还会通过 plot_training_samples 将带标签的训练批次可视化保存为 train_batch*.jpg,便于检查数据增强与加载是否正常。
手动控制切分(可选)
如前所述,Caltech-101 没有预定义划分,Ultralytics 首次训练时自动按 80/20 切分。若想完全控制划分比例,可以在训练前自行把图像组织到 train/ 与 val/ 文件夹中,也可以直接复用仓库提供的通用工具:
from ultralytics.data.split import split_classify_dataset
# 对已下载的 Caltech-101 数据目录执行自定义比例切分
split_classify_dataset("path/to/caltech101", train_ratio=0.75)
数据集样例与引用
Caltech-101 的图像以"物体居中、背景干净"的取景方式著称,这种天然的居中构图使其成为训练鲁棒目标识别模型的干净起点。
若在研究或开发工作中使用了 Caltech-101 数据集,请按学术规范引用其原始论文(Li Fei-Fei, Rob Fergus, Pietro Perona, 2007):
@article{fei2007learning,
title={Learning generative visual models from few training examples: An incremental Bayesian approach tested on 101 object categories},
author={Fei-Fei, Li and Fergus, Rob and Perona, Pietro},
journal={Computer vision and Image understanding},
volume={106},
number={1},
pages={59--70},
year={2007},
publisher={Elsevier}
}
FAQ
Caltech-101 在机器学习中用于什么?
Caltech-101 被广泛用于训练和评测图像分类与目标识别模型。它包含 101 个物体类别加 1 个背景类的 9,144 张图像,是评测 CNN、SVM 等算法的经典基准。
如何用 Ultralytics YOLO 模型在 Caltech-101 上训练?
直接使用本文"使用"一节的 Python/CLI 示例即可。数据集在首次使用时自动下载并自动完成 80/20 切分,无需手工准备。完整参数列表见 训练模式文档。
Caltech-101 有多少个类别?
101 个物体类别加 1 个 BACKGROUND_Google 背景类,共 102 个类别目录、9,144 张图像。使用 Ultralytics 训练时,模型会学习全部 102 个类别(由 reshape_outputs 自动对齐输出头),各类别数量从约 40 张到 800 张不等,呈不平衡分布。
Caltech-101 如何划分训练集与验证集?
该数据集没有预定义划分。首次训练时 Ultralytics 自动按 80% 训练 / 20% 验证切分(约 7,280 张训练、1,864 张验证),无需手工创建划分;如需自行控制,可在训练前把图像组织进 train/ 与 val/ 文件夹,或调用 split_classify_dataset 自定义比例。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00