Ultralytics YOLOによる画像分類#
画像分類は、サポートされているタスクの中で最もシンプルなもので、画像全体を定義済みクラスのいずれかに分類します。
画像分類器の出力は、単一のクラスラベルと信頼度スコアです。画像のクラスだけが分かればよく、そのクラスの物体がどこにあるか、形状がどのようなものかを知る必要がない場合に、画像分類が役立ちます。
視聴: Ultralytics YOLO のタスクを解説: Ultralytics Platform を使った画像分類
YOLO26 Classifyモデルは-clsのサフィックスを使用します(例:yolo26n-cls.pt)。また、ImageNetで事前学習されています。
モデル#
ImageNetデータセットで事前学習されたYOLO26 Classifyモデルを以下に示します。
モデルは、初回使用時に最新のUltralytics リリースから自動的にダウンロードされます。
| モデル | サイズ (ピクセル) | 精度 top1 | 精度 top5 | 速度 CPU ONNX (ms) | 速度 T4 TensorRT10 (ms) | パラメーター (M) | FLOPs (B)、入力サイズ224 |
|---|---|---|---|---|---|---|---|
| YOLO26n-cls | 224 | 71.4 | 90.1 | 5.0 ± 0.3 | 1.1 ± 0.0 | 2.8 | 0.4 |
| YOLO26s-cls | 224 | 76.0 | 92.9 | 7.9 ± 0.2 | 1.3 ± 0.0 | 6.7 | 1.5 |
| YOLO26m-cls | 224 | 78.1 | 94.2 | 17.2 ± 0.4 | 2.0 ± 0.0 | 11.6 | 4.8 |
| YOLO26l-cls | 224 | 79.0 | 94.6 | 23.2 ± 0.3 | 2.8 ± 0.0 | 14.1 | 6.0 |
| YOLO26x-cls | 224 | 79.9 | 95.0 | 41.4 ± 0.9 | 3.8 ± 0.0 | 29.6 | 13.5 |
- accの値は、ImageNetデータセットの検証セットにおけるモデルの精度です。
yolo classify val data=path/to/ImageNet device=0で再現できます。 - 速度は、ImageNetの検証画像を使用し、CPU上のONNXおよびNVIDIA T4 GPU上のTensorRT10で測定した平均値です。
yolo classify val data=path/to/ImageNet batch=1 device=0|cpuで再現できます。 - ParamsとFLOPsの値は、ConvレイヤーとBatchNormレイヤーを統合する
model.fuse()の実行後の融合モデルに対するものです。事前学習済みチェックポイントはトレーニング時の完全なアーキテクチャを保持するため、より大きな値を示す場合があります。
分類速度とモデルサイズの予備情報については、未リリースのYOLO27プレビューをご覧ください。
学習#
MNIST160データセットでYOLO26n-clsを、画像サイズ64、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ページでtrainモードの詳細をご覧ください。分類モデルはUltralytics Platformのクラウド学習でも学習できます。
データセットのフォーマット#
YOLOの分類データセット形式の詳細については、データセットガイドをご覧ください。分類データセットは、Ultralytics Platformのアノテーションツールで管理およびラベル付けすることもできます。
カスタム変換#
Ultralytics YOLOの画像分類では、学習にtorchvision.transforms.RandomResizedCropを、検証と推論にtorchvision.transforms.CenterCropを使用します。 これらのクロップベースの変換は正方形の入力を前提としているため、アスペクト比が極端な画像では重要な領域が切り取られることがあります。画像全体を保持するには、クロップ処理をtorchvision.transforms.Resizeに置き換えます。カスタムClassificationDataset、ClassificationTrainer、ClassificationValidatorを通じて、クロップせずに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と引数がモデル属性として保持されるため、引数は不要です。Trainの例にある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カスタム変換で学習したモデルでは、一致するClassificationValidatorをval()に渡す必要があります。そうしないと、学習時にリサイズした画像が検証時にクロップされます。
推論#
学習済みの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ページでpredictモードの詳細をご確認ください。
結果の出力#
画像分類では、画像ごとに1つのResultsオブジェクトが返されます。主な予測フィールドはresult.probsで、クラス確率ベクトルと上位予測用のヘルパーが含まれます。
| 属性 | 種類 | 形状 | 説明 |
|---|---|---|---|
result.probs | Probs | (C,) | クラス確率です。 |
result.probs.data | torch.float32 | (C,) | クラスごとの確率です。 |
result.probs.top1 | int | () | 最上位クラスIDです。 |
result.probs.top1conf | torch.float32 | () | 最上位の信頼度です。 |
result.probs.top5 | list[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 | ✅ | - |
| TorchScript | torchscript | yolo26n-cls.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n-cls.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n-cls_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n-cls.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n-cls.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| Apple Core AI | coreai | yolo26n-cls.aimodel | ✅ | imgsz, batch, quantize |
| TF SavedModel | saved_model | yolo26n-cls_saved_model/ | ✅ | imgsz, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n-cls.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n-cls_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| LiteRT | litert | yolo26n-cls.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n-cls_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n-cls.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n-cls_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n-cls_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n-cls_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n-cls_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n-cls_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n-cls_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n-cls_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| Hailo | hailo | yolo26n-cls_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou, device |
| Huawei Ascend | ascend | yolo26n-cls_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms, device |
| AMD Xilinx | xilinx | yolo26n-cls_xilinx_model/ | ✅ | imgsz, name, quantize, data, fraction, opset, simplify, device |
nms=None は外部NMS向けにraw出力をデフォルトで使用します。利用可能なNMSフリーヘッドを選択するには、nms=Falseを設定してください。未対応のフォーマットでは、ネイティブの出力パスにフォールバックします。上記のnmsの項目は、nms=Trueを使用してNMSを埋め込めるフォーマットを示しています。
詳細なexport情報については、Exportページをご覧ください。
よくある質問#
yolo26n-cls.ptなどのYOLO26モデルは、効率的な画像分類を目的として設計されています。画像全体に対して、信頼度スコアとともに単一のクラスラベルを割り当てます。画像内の物体の位置や形状を特定する必要はなく、画像のクラスが分かればよい用途で特に有用です。YOLO26モデルの学習には、PythonまたはCLIコマンドを使用できます。たとえば、MNIST160データセットで
yolo26n-clsモデルを、画像サイズ64、100エポックで学習するには、次のようにします。例from ultralytics import YOLO # モデルを読み込む model = YOLO("yolo26n-cls.pt") # 事前トレーニング済みモデルを読み込みます(トレーニングにはこちらを推奨します) # モデルをトレーニングする results = model.train(data="mnist160", epochs=100, imgsz=64)その他の設定オプションについては、設定ページをご覧ください。
MNIST160のようなデータセットで学習済みモデルの精度を検証するには、次のPythonまたはCLIコマンドを使用できます。
例from ultralytics import YOLO # モデルを読み込む model = YOLO("path/to/best.pt") # 学習済みモデルを読み込みます # モデルを検証します metrics = model.val() # 引数は不要です。学習時のデータセットと設定が使用されます metrics.top1 # top1 accuracy metrics.top5 # top5 accuracy詳細については、検証セクションをご覧ください。
PythonまたはCLIコマンドを使用して、学習済みのYOLO26モデルをさまざまな形式にエクスポートできます。たとえば、モデルをONNX形式にエクスポートするには、次のようにします。
例from ultralytics import YOLO # モデルを読み込む model = YOLO("yolo26n-cls.pt") # 学習済みモデルを読み込みます # モデルをONNXにエクスポートします model.export(format="onnx")エクスポートオプションの詳細については、エクスポートページをご覧ください。