Ultralytics YOLO27:
Get Started

使用 Ultralytics YOLO 进行图像分类#

Ultralytics YOLO image classification of objects and scenes

图像分类是受支持任务中最简单的一种,它会将整张图像分类为一组预定义类别中的一个。

图像分类器的输出是一个类别标签和一个置信度分数。如果你只需要知道图像属于哪个类别,而不需要知道该类别对象的位置或确切形状,图像分类就很有用。



观看: 探索 Ultralytics YOLO 任务:使用 Ultralytics Platform 进行图像分类
提示

YOLO26 Classify 模型使用 -cls 后缀,例如 yolo26n-cls.pt,并在 ImageNet 上进行预训练。

模型#

下方展示了在 ImageNet 数据集上预训练的 YOLO26 Classify 模型。

首次使用时,模型会自动从 Ultralytics 最新版本下载。

模型尺寸
(像素)
acc
top1
acc
top5
速度
CPU ONNX
(毫秒)
速度
T4 TensorRT10
(ms)
参数
(M)
FLOPs
(B),输入尺寸为 224
YOLO26n-cls22471.490.15.0 ± 0.31.1 ± 0.02.80.4
YOLO26s-cls22476.092.97.9 ± 0.21.3 ± 0.06.71.5
YOLO26m-cls22478.194.217.2 ± 0.42.0 ± 0.011.64.8
YOLO26l-cls22479.094.623.2 ± 0.32.8 ± 0.014.16.0
YOLO26x-cls22479.995.041.4 ± 0.93.8 ± 0.029.613.5
  • acc 数值表示模型在 ImageNet 数据集验证集上的准确率。
    使用 yolo classify val data=path/to/ImageNet device=0 复现
  • 速度是在 CPU 上使用 ONNX、在 NVIDIA T4 GPU 上使用 TensorRT10,对 ImageNet 验证集图像进行测量并取平均所得。
    使用 yolo classify val data=path/to/ImageNet batch=1 device=0|cpu 复现
  • 参数量和 FLOPs 数值对应于经过 model.fuse() 融合后的模型,该操作会合并 Conv 和 BatchNorm 层。预训练检查点保留完整的训练架构,因此显示的计数可能更高。

请参阅尚未发布的 YOLO27 预览版,了解初步的分类速度和模型尺寸。

训练#

在 MNIST160 数据集上以 64 的图像尺寸训练 YOLO26n-cls 共 100 个轮次。可用参数的完整列表请参阅配置页面。

示例
from ultralytics import YOLO

# 加载模型
model = YOLO("yolo26n-cls.yaml")  # 从 YAML 构建新模型
model = YOLO("yolo26n-cls.pt")  # 加载预训练模型(推荐用于训练)
model = YOLO("yolo26n-cls.yaml").load("yolo26n-cls.pt")  # 从 YAML 构建模型并迁移权重

# 训练模型
results = model.train(data="mnist160", epochs=100, imgsz=64)

如需了解 train 模式的完整详情,请参阅训练页面。你也可以使用 Ultralytics Platform 云训练来训练分类模型。

数据集格式#

数据集指南详细介绍了 YOLO 分类数据集格式。你也可以使用 Ultralytics Platform 标注工具管理和标注分类数据集。

自定义变换#

Ultralytics YOLO 分类训练使用 torchvision.transforms.RandomResizedCrop,验证和推理则使用 torchvision.transforms.CenterCrop。 这些基于裁剪的变换假设输入为正方形,对于宽高比极端的图像,可能会裁掉重要区域。若要保留整张图像,可通过自定义 ClassificationDataset、ClassificationTrainer 和 ClassificationValidator,将裁剪替换为 torchvision.transforms.Resize,以缩放到 imgsz × imgsz,而不是进行裁剪:

import torch
import torchvision.transforms as T

from ultralytics import YOLO
from ultralytics.data.dataset import ClassificationDataset
from ultralytics.models.yolo.classify import ClassificationTrainer, ClassificationValidator

class CustomizedDataset(ClassificationDataset):
    """A customized dataset class for image classification with enhanced data augmentation transforms."""

    def __init__(self, root: str, args, augment: bool = False, prefix: str = "", names=None):
        """Initialize a customized classification dataset with enhanced data augmentation transforms."""
        super().__init__(root, args, augment, prefix, names)

        # 在此处添加自定义训练变换
        train_transforms = T.Compose(
            [
                T.Resize((args.imgsz, args.imgsz)),
                T.RandomHorizontalFlip(p=args.fliplr),
                T.RandomVerticalFlip(p=args.flipud),
                T.RandAugment(interpolation=T.InterpolationMode.BILINEAR),
                T.ColorJitter(brightness=args.hsv_v, contrast=args.hsv_v, saturation=args.hsv_s, hue=args.hsv_h),
                T.ToTensor(),
                T.Normalize(mean=torch.tensor(0), std=torch.tensor(1)),
                T.RandomErasing(p=args.erasing, inplace=True),
            ]
        )

        # 在此处添加自定义验证变换
        val_transforms = T.Compose(
            [
                T.Resize((args.imgsz, args.imgsz)),
                T.ToTensor(),
                T.Normalize(mean=torch.tensor(0), std=torch.tensor(1)),
            ]
        )
        self.torch_transforms = train_transforms if augment else val_transforms

class CustomizedTrainer(ClassificationTrainer):
    """A customized trainer class for YOLO classification models with enhanced dataset handling."""

    def build_dataset(self, img_path: str, mode: str = "train", batch=None):
        """Build a customized dataset for classification training and the validation during training."""
        return CustomizedDataset(
            root=img_path,
            args=self.args,
            augment=mode == "train",
            prefix="train" if mode == "train" else self.args.split,
            names=self.data["names"],
        )

class CustomizedValidator(ClassificationValidator):
    """A customized validator class for YOLO classification models with enhanced dataset handling."""

    def build_dataset(self, img_path: str):
        """Build a customized dataset for classification standalone validation (no augmentation)."""
        return CustomizedDataset(root=img_path, args=self.args, augment=False, prefix=self.args.split, names=self.names)

model = YOLO("yolo26n-cls.pt")
model.train(data="imagenet", trainer=CustomizedTrainer, epochs=10, imgsz=224, batch=64)
model.val(data="imagenet", validator=CustomizedValidator, imgsz=224, batch=64)

验证#

验证训练好的 YOLO26n-cls 模型的准确度。无需提供参数,因为 model 会将训练时的 data 和参数保留为模型属性:来自训练示例的 path/to/best.pt 会在 MNIST160 上进行验证。官方权重记录的训练数据集路径在你的计算机上不存在,因此会发出警告并回退到任务默认值 imagenet10。传入 data 可在其他数据集上验证。

示例
from ultralytics import YOLO

# 加载模型
model = YOLO("yolo26n-cls.pt")  # 加载官方模型
model = YOLO("path/to/best.pt")  # 加载自定义模型

# 验证模型
metrics = model.val()  # 无需参数,数据集和设置会自动记住
metrics.top1  # top1 accuracy
metrics.top5  # top5 accuracy
提示

使用自定义变换训练的模型需要向 val() 传入匹配的 ClassificationValidator,否则验证时会裁剪图像,而训练时使用的是缩放。

预测#

使用训练好的 YOLO26n-cls 模型对图像运行预测。

示例
from ultralytics import YOLO

# 加载模型
model = YOLO("yolo26n-cls.pt")  # 加载官方模型
model = YOLO("path/to/best.pt")  # 加载自定义模型

# 使用模型进行预测
results = model("https://ultralytics.com/images/bus.jpg")  # 对图像进行预测

# 访问结果
for result in results:
    top1 = result.probs.top1  # 预测概率最高的类别 ID
    top1_conf = result.probs.top1conf  # 最高预测置信度
    top1_name = result.names[top1]  # 预测概率最高的类别名称

请参阅预测页面,了解完整的 predict 模式详情。

结果输出#

图像分类会为每张图像返回一个 Results 对象。主要预测字段是 result.probs,其中包含类别概率向量和用于获取最高预测结果的辅助方法。

属性类型形状说明
result.probsProbs(C,)类别概率。
result.probs.datatorch.float32(C,)每个类别的概率。
result.probs.top1int()得分最高的类别 ID。
result.probs.top1conftorch.float32()最高置信度。
result.probs.top5list[int](<=5)得分最高的 5 个类别 ID。

如需了解所有任务中特定于任务的 Results 字段,请参阅按任务查看预测结果部分。

导出#

将 YOLO26n-cls 模型导出为 ONNX、CoreML 等其他格式。

示例
from ultralytics import YOLO

# 加载模型
model = YOLO("yolo26n-cls.pt")  # 加载官方模型
model = YOLO("path/to/best.pt")  # 加载自定义模型

# 导出模型
model.export(format="onnx")

下表列出了可用的 YOLO26-cls 导出格式。你可以使用 format 参数导出为任意格式,例如 format='onnx' 或 format='engine'。你可以直接在已导出的模型上进行预测或验证,例如 yolo predict model=yolo26n-cls.onnx。导出完成后,系统会显示适用于你模型的用法示例。

格式format 参数模型元数据参数
PyTorch-yolo26n-cls.pt✅-
TorchScripttorchscriptyolo26n-cls.torchscript✅imgsz, quantize, dynamic, nms, batch, device
ONNXonnxyolo26n-cls.onnx✅imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device
OpenVINOopenvinoyolo26n-cls_openvino_model/✅imgsz, quantize, dynamic, nms, batch, data, fraction, device
TensorRTengineyolo26n-cls.engine✅imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device
CoreMLcoremlyolo26n-cls.mlpackage✅imgsz, dynamic, quantize, nms, batch, device
Apple Core AIcoreaiyolo26n-cls.aimodel✅imgsz, batch, quantize
TF SavedModelsaved_modelyolo26n-cls_saved_model/✅imgsz, quantize, opset, nms, batch, data, fraction, device
TF GraphDefpbyolo26n-cls.pb❌imgsz, opset, batch, device
TF Edge TPUedgetpuyolo26n-cls_edgetpu.tflite✅imgsz, quantize, opset, data, fraction, device
LiteRTlitertyolo26n-cls.tflite✅imgsz, quantize, batch, data, fraction, device
PaddlePaddlepaddleyolo26n-cls_paddle_model/✅imgsz, batch, device
MNNmnnyolo26n-cls.mnn✅imgsz, batch, dynamic, quantize, simplify, opset, nms, device
NCNNncnnyolo26n-cls_ncnn_model/✅imgsz, quantize, batch, device
IMX500imxyolo26n-cls_imx_model/✅imgsz, quantize, data, fraction, nms, device
RKNNrknnyolo26n-cls_rknn_model/✅imgsz, batch, name, quantize, simplify, opset, data, fraction, device
ExecuTorchexecutorchyolo26n-cls_executorch_model/✅imgsz, batch, device
Axeleraaxelerayolo26n-cls_axelera_model/✅imgsz, batch, quantize, data, fraction, device
DEEPXdeepxyolo26n-cls_deepx_model/✅imgsz, quantize, simplify, opset, data, optimize, device
Qualcomm QNNqnnyolo26n-cls_qnn.onnx✅imgsz, batch, name, quantize, simplify, opset, data, fraction, device
Hailohailoyolo26n-cls_hailo_model/✅imgsz, name, quantize, data, fraction, simplify, conf, iou, device
Huawei Ascendascendyolo26n-cls_ascend_model/✅imgsz, batch, name, quantize, opset, simplify, nms, device
AMD Xilinxxilinxyolo26n-cls_xilinx_model/✅imgsz, name, quantize, data, fraction, opset, simplify, device

nms=None 默认输出原始结果,以供外部 NMS 使用。设置 nms=False 可选择可用的无 NMS 检测头;不支持的格式会回退到其原生输出路径。上方的 nms 条目表示可以通过 nms=True 嵌入 NMS 的格式。

请参阅 Export 页面,了解完整的 export 详情。

常见问题#

  • YOLO26 模型(例如 yolo26n-cls.pt)专为高效图像分类而设计。它们会为整张图像分配单个类别标签和置信度分数。当只需知道图像的具体类别,而不必确定图像中对象的位置或形状时,这种模型尤其适用。

  • 你可以使用 Python 或 CLI 命令训练 YOLO26 模型。例如,要在 MNIST160 数据集上以 64 的图像尺寸训练 yolo26n-cls 模型,共训练 100 个轮次:

    示例
    from ultralytics import YOLO
    
    # 加载模型
    model = YOLO("yolo26n-cls.pt")  # 加载预训练模型(推荐用于训练)
    
    # 训练模型
    results = model.train(data="mnist160", epochs=100, imgsz=64)

    如需了解更多配置选项,请访问配置页面。

  • 预训练的 YOLO26 分类模型可在 Models 部分找到。yolo26n-cls.pt、yolo26s-cls.pt、yolo26m-cls.pt 等模型均在 ImageNet 数据集上预训练,可轻松下载并用于各种图像分类任务。

  • 要在 MNIST160 之类的数据集上验证训练好的模型的准确率,你可以使用以下 Python 或 CLI 命令:

    示例
    from ultralytics import YOLO
    
    # 加载模型
    model = YOLO("path/to/best.pt")  # 加载训练好的模型
    
    # 验证模型
    metrics = model.val()  # 无需提供参数,使用训练时的数据集和设置
    metrics.top1  # top1 accuracy
    metrics.top5  # top5 accuracy

    如需了解更多信息,请访问 Validate 部分。

  • 你可以使用 Python 或 CLI 命令将训练好的 YOLO26 模型导出为多种格式。例如,要将模型导出为 ONNX 格式:

    示例
    from ultralytics import YOLO
    
    # 加载模型
    model = YOLO("yolo26n-cls.pt")  # 加载训练好的模型
    
    # 将模型导出为 ONNX
    model.export(format="onnx")

    如需了解详细的导出选项,请参阅 Export 页面。

评论