Phân loại Ảnh với Ultralytics YOLO#
Phân loại ảnh là tác vụ đơn giản nhất trong số các tác vụ được hỗ trợ, bao gồm việc phân loại toàn bộ ảnh vào một trong các lớp đã được xác định trước.
Đầu ra của bộ phân loại ảnh là một nhãn lớp duy nhất cùng điểm confidence. Phân loại ảnh hữu ích khi bạn chỉ cần biết ảnh thuộc lớp nào, không cần biết các object thuộc lớp đó nằm ở đâu hoặc có hình dạng chính xác ra sao.
Xem: Khám phá các tác vụ Ultralytics YOLO: Phân loại ảnh bằng Ultralytics Platform
Các model YOLO26 Classify dùng hậu tố -cls, chẳng hạn yolo26n-cls.pt, và được pretrained trên ImageNet.
Model#
Các model YOLO26 Classify pretrained trên dataset ImageNet được trình bày bên dưới.
Model sẽ tự động tải xuống từ bản phát hành Ultralytics mới nhất trong lần sử dụng đầu tiên.
| Model | kích thước (pixel) | acc top1 | acc top5 | Tốc độ CPU ONNX (ms) | Tốc độ T4 TensorRT10 (ms) | params (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 |
- Giá trị acc là độ chính xác của model trên tập validation của dataset ImageNet.
Tái tạo bằngyolo classify val data=path/to/ImageNet device=0 - Tốc độ được tính trung bình trên các ảnh val của ImageNet, dùng ONNX trên CPU và TensorRT10 trên GPU NVIDIA T4.
Tái tạo bằngyolo classify val data=path/to/ImageNet batch=1 device=0|cpu - Giá trị Params và FLOPs áp dụng cho model đã hợp nhất sau
model.fuse(), thao tác gộp các lớp Conv và BatchNorm. Các checkpoint pretrained giữ nguyên kiến trúc huấn luyện đầy đủ và có thể hiển thị số liệu cao hơn.
Xem bản xem trước YOLO27 chưa phát hành để biết tốc độ phân loại và kích thước model sơ bộ.
Huấn luyện#
Huấn luyện YOLO26n-cls trên dataset MNIST160 trong 100 epoch với kích thước ảnh 64. Xem danh sách đầy đủ các tham số hiện có trên trang Cấu hình.
from ultralytics import YOLO
# Tải model
model = YOLO("yolo26n-cls.yaml") # tạo model mới từ YAML
model = YOLO("yolo26n-cls.pt") # tải model đã huấn luyện trước (được khuyến nghị khi huấn luyện)
model = YOLO("yolo26n-cls.yaml").load("yolo26n-cls.pt") # tạo từ YAML và chuyển trọng số
# Huấn luyện model
results = model.train(data="mnist160", epochs=100, imgsz=64)Xem chi tiết đầy đủ về chế độ train trên trang Train. Các model phân loại cũng có thể được huấn luyện bằng dịch vụ huấn luyện đám mây Ultralytics Platform.
Định dạng dataset#
Bạn có thể xem chi tiết định dạng dataset phân loại YOLO trong Hướng dẫn về Dataset. Dataset phân loại cũng có thể được quản lý và gán nhãn bằng công cụ annotation của Ultralytics Platform.
Các phép biến đổi tùy chỉnh#
Ultralytics YOLO classification sử dụng torchvision.transforms.RandomResizedCrop khi huấn luyện và torchvision.transforms.CenterCrop khi validation và inference. Các phép biến đổi dựa trên crop này giả định đầu vào hình vuông và có thể cắt mất những vùng quan trọng của ảnh có tỷ lệ khung hình cực đoan. Để giữ nguyên toàn bộ ảnh, hãy thay các phép crop bằng torchvision.transforms.Resize, phép biến đổi này scale ảnh thành imgsz × imgsz thay vì crop, thông qua ClassificationDataset, ClassificationTrainer và ClassificationValidator tùy chỉnh:
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)
# Thêm các phép biến đổi huấn luyện tùy chỉnh của bạn tại đây
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),
]
)
# Thêm các phép biến đổi validation tùy chỉnh của bạn tại đây
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)Đánh giá#
Validate độ chính xác của model YOLO26n-cls đã huấn luyện. Không cần tham số nào vì model giữ lại data dùng khi huấn luyện và các tham số dưới dạng thuộc tính của model: path/to/best.pt trong ví dụ Train sẽ validate trên MNIST160. Weights chính thức lưu đường dẫn dataset huấn luyện không tồn tại trên máy của bạn, vì vậy chúng chuyển sang imagenet10 mặc định của tác vụ kèm cảnh báo. Truyền data để validate trên dataset khác.
from ultralytics import YOLO
# Tải model
model = YOLO("yolo26n-cls.pt") # tải model chính thức
model = YOLO("path/to/best.pt") # tải model tùy chỉnh
# Xác thực model
metrics = model.val() # không cần đối số, dataset và cài đặt đã được ghi nhớ
metrics.top1 # top1 accuracy
metrics.top5 # top5 accuracyModel được huấn luyện bằng các phép biến đổi tùy chỉnh cần truyền ClassificationValidator tương ứng vào val(); nếu không, validation sẽ crop ảnh trong khi lúc huấn luyện ảnh được resize.
Dự đoán#
Sử dụng model YOLO26n-cls đã huấn luyện để chạy dự đoán trên ảnh.
from ultralytics import YOLO
# Tải model
model = YOLO("yolo26n-cls.pt") # tải model chính thức
model = YOLO("path/to/best.pt") # tải model tùy chỉnh
# Dự đoán bằng model
results = model("https://ultralytics.com/images/bus.jpg") # dự đoán trên một ảnh
# Truy cập kết quả
for result in results:
top1 = result.probs.top1 # ID lớp được dự đoán đứng đầu
top1_conf = result.probs.top1conf # confidence của dự đoán đứng đầu
top1_name = result.names[top1] # tên lớp được dự đoán đứng đầuXem chi tiết đầy đủ về chế độ predict trên trang Dự đoán.
Đầu ra kết quả#
Phân loại ảnh trả về một object Results cho mỗi ảnh. Trường dự đoán chính là result.probs, chứa vector xác suất lớp và các helper cho dự đoán đứng đầu.
| Thuộc tính | Kiểu | Hình dạng | Mô tả |
|---|---|---|---|
result.probs | Probs | (C,) | Xác suất các lớp. |
result.probs.data | torch.float32 | (C,) | Xác suất của từng lớp. |
result.probs.top1 | int | () | ID lớp có xác suất cao nhất. |
result.probs.top1conf | torch.float32 | () | Độ tin cậy cao nhất. |
result.probs.top5 | list[int] | (<=5) | ID của 5 lớp có xác suất cao nhất. |
Để xem các trường Results dành riêng cho từng tác vụ trên tất cả tác vụ, hãy tham khảo mục Kết quả dự đoán theo tác vụ.
Export#
Export model YOLO26n-cls sang định dạng khác như ONNX, CoreML, v.v.
from ultralytics import YOLO
# Tải model
model = YOLO("yolo26n-cls.pt") # tải model chính thức
model = YOLO("path/to/best.pt") # tải model tùy chỉnh
# # Xuất model
model.export(format="onnx")Các định dạng export hiện có cho YOLO26-cls được liệt kê trong bảng bên dưới. Bạn có thể export sang bất kỳ định dạng nào bằng tham số format, chẳng hạn format='onnx' hoặc format='engine'. Bạn có thể predict hoặc validate trực tiếp trên các model đã export, chẳng hạn yolo predict model=yolo26n-cls.onnx. Ví dụ sử dụng cho model của bạn sẽ hiển thị sau khi quá trình export hoàn tất.
| Định dạng | Đối số format | Model | Metadata | Đối số |
|---|---|---|---|---|
| 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 mặc định xuất đầu ra thô cho NMS bên ngoài. Đặt nms=False để chọn một head không dùng NMS hiện có; các định dạng không được hỗ trợ sẽ chuyển về luồng đầu ra gốc. Các mục nms ở trên xác định những định dạng có thể tích hợp NMS với nms=True.
Xem chi tiết đầy đủ về export trên trang Export.
Câu hỏi thường gặp#
Các model YOLO26, chẳng hạn
yolo26n-cls.pt, được thiết kế để phân loại ảnh hiệu quả. Model gán một nhãn lớp duy nhất cho toàn bộ ảnh cùng với điểm confidence. Điều này đặc biệt hữu ích với các ứng dụng chỉ cần biết ảnh thuộc lớp cụ thể nào, thay vì xác định vị trí hoặc hình dạng của các object trong ảnh.Bạn có thể dùng Python hoặc các lệnh CLI để huấn luyện model YOLO26. Ví dụ, để huấn luyện model
yolo26n-clstrên dataset MNIST160 trong 100 epoch với kích thước ảnh 64:Ví dụfrom ultralytics import YOLO # Tải model model = YOLO("yolo26n-cls.pt") # tải model đã huấn luyện trước (được khuyến nghị khi huấn luyện) # Huấn luyện model results = model.train(data="mnist160", epochs=100, imgsz=64)Để biết thêm tùy chọn cấu hình, hãy truy cập trang Cấu hình.
Để validate độ chính xác của một model đã train trên dataset như MNIST160, bạn có thể sử dụng các lệnh Python hoặc CLI sau:
Ví dụfrom ultralytics import YOLO # Tải model model = YOLO("path/to/best.pt") # tải model đã train # Xác thực model metrics = model.val() # không cần đối số, sử dụng dataset và các thiết lập từ quá trình training metrics.top1 # top1 accuracy metrics.top5 # top5 accuracyĐể biết thêm thông tin, hãy truy cập mục Validate.
Bạn có thể export model YOLO26 đã train sang nhiều định dạng bằng các lệnh Python hoặc CLI. Ví dụ: để export model sang định dạng ONNX:
Ví dụfrom ultralytics import YOLO # Tải model model = YOLO("yolo26n-cls.pt") # tải model đã train # Export model sang ONNX model.export(format="onnx")Để biết chi tiết về các tùy chọn export, hãy tham khảo trang Export.