Klasifikasi gambar

Klasifikasi gambar menetapkan satu distribusi label pada seluruh gambar dan tidak menempatkan apapun di dalamnya. Kunci task adalah classify.

Definisi

Klasifikasi gambar menghasilkan satu skor per kelas untuk seluruh gambar dan tidak ada koordinat sama sekali. Ini menjawab apa yang ada dalam gambar, bukan di mana, yang apa yang memisahkannya dari object detection.

classify adalah kunci task kanonik, dan sufiks -cls dalam checkpoint nama berkas memilihnya. Sufiks itu diperlukan dan bukan opsional pada keluarga klasifikasi, jadi LibreResNet50.pt tidak dibaca sebagai pengklasifikasi dan hanya LibreResNet50-cls.pt saja.

predict() mengisi result.probs dan meninggalkan boxes kosong. .data adalah vektor skor penuh, .top1 indeks dari skor tertinggi dan .top1confnya nilai, .top5 lima indeks tertinggi dalam urutan menurun dan .top5conf skor mereka. Indeks menunjuk ke result.names. Memotong sebuah objek Results tidak pernah memotong probs, karena vektor tersebut milik gambar, bukan milik satu baris.

Model

Pengklasifikasi gambar yang dapat dilatih meliputi ResNet, ConvNeXt, MobileNetV4, EfficientNetV2, dan DINOv2. Empat yang pertama berjalan dengan paket dasar dan memiliki bobot yang dipublikasikan. DINOv2 memerlukan pip install "libreyolo[rfdetr]" dan tidak memiliki checkpoint yang dihosting LibreYOLO: model ini memuat backbone upstream dengan head linear yang diinisialisasi secara acak, sehingga menjadi titik awal fine-tuning, bukan model siap prediksi.

Lima lagi memprediksi, memvalidasi, dan mengekspor, tetapi train() mereka meningkat NotImplementedError: ViT, Swin, VGG, AlexNet dan DeiT.

CLIP dan SigLIP2 mengklasifikasikan tanpa set label tetap. Mereka menilai gambar terhadap teks prompt, sehingga set_classes() mendefinisikan kelas pada saat pemanggilan dan tidak ada langkah pelatihan untuk set label baru sama sekali. Keduanya juga melayani embed task.

ConvNeXt V2 menambahkan klasifikasi terawasi dengan bobot pretrained CC-BY-NC-4.0. PE mendukung klasifikasi zero-shot; V-JEPA 2 melatih probe klasifikasi video.

Prediksi

Bobot diunduh dari Hugging Face saat pertama digunakan dan disimpan di cache secara lokal.

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Sufiks -cls pada nama berkas memilih task, sehingga tidak perlu argumen task.# argumen diperlukan.model = LibreYOLO("LibreResNet50-cls.pt")result = model(SAMPLE_IMAGE, save=True) print(result.names[result.probs.top1], float(result.probs.top1conf))print(result.probs.top5)
CLI
libreyolo predict model=LibreResNet50-cls.pt save=True \  source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg
Seluruh distribusi
from libreyolo import LibreYOLO, SAMPLE_IMAGE result = LibreYOLO("LibreResNet50-cls.pt")(SAMPLE_IMAGE)probs = result.probs # .data adalah vektor penuh (C,); top5/top5conf adalah tampilan yang diurutkan.print(probs.data.shape)for index, score in zip(probs.top5, probs.top5conf):    print(result.names[index], float(score))
Zero-shot, tanpa pelatihan
from libreyolo import LibreYOLO, SAMPLE_IMAGE # CLIP menilai gambar terhadap prompt teks, sehingga set label ditentukan# saat pemanggilan, bukan tertanam dalam checkpoint.model = LibreYOLO("LibreCLIPb32-cls.pt")model.set_classes(["a person jumping", "an empty street", "a parked car"])result = model(SAMPLE_IMAGE) print(model.names[result.probs.top1], float(result.probs.top1conf))

conf, iou dan max_det tidak memiliki efek di sini: tidak ada kandidat untuk disaring atau ditekan, hanya ada satu distribusi. Lihat prediksi untuk sumber, streaming dan penanganan hasil.

Format dataset

Klasifikasi menggunakan pohon direktori, bukan berkas label dan bukan YAML. data adalah akar dataset.

dataset/  train/    tench/000001.jpg    parachute/000002.jpg  val/    tench/000101.jpg    parachute/000102.jpg

train/ diperlukan untuk pelatihan dan ini mendefinisikan pemetaan kelas ke indeks dengan nama folder yang diurutkan, sehingga folder pertama secara alfabet menjadi kelas 0. val/ diperlukan untuk validasi. Pemisahan test/ mungkin ada dan default perintah train dan validate jangan menggunakannya. Setiap pembagian selain train harus mengandung nama folder kelas yang sama dengan set kelas yang diharapkan, yang adalah apa menyebabkan ketidaksesuaian gagal dengan keras daripada dinilai sebagai prediksi yang salah. The ekstensi gambar yang diterima adalah .jpg, .jpeg, .png, .bmp, .webp, .tif dan .tiff.

data menerima tiga hal: jalur ke direktori yang berisi split train/, URL .zip, atau salah satu nama dataset yang dikenal, imagenette160 dan smoke10, yang diunduh dan disimpan dalam cache saat penggunaan pertama.

Loader kanonik adalah libreyolo.data.classify_dataset.

Latih

Python
from libreyolo import LibreYOLO # imagenette160 adalah nama dataset yang dikenal dan diunduh pada penggunaan pertama.# Lewatkan direktori dengan pembagian train/ untuk data Anda sendiri.model = LibreYOLO("LibreResNet50-cls.pt")model.train(data="imagenette160", epochs=5)
CLI
libreyolo train model=LibreResNet50-cls.pt data=imagenette160 epochs=5
Multi-GPU
libreyolo train model=LibreResNet50-cls.pt data=imagenette160 \  epochs=50 device=0,1 batch=-1

Tidak ada nc yang perlu dideklarasikan: jumlah kelas berasal dari nama folder di bawah train/, dan lapisan linier terakhir dibangun kembali untuk menyesuaikannya sementara backbone dipindahkan tanpa perubahan. Lihat pelatihan untuk dataset, augmentasi, multi-GPU dan logger.

ResNet, ConvNeXt, ConvNeXt V2, MobileNetV4, EfficientNetV2, dan DINOv2 mendukung pembobotan loss cls_pw atau class_weights. scale klasifikasi mengontrol area crop, dan crop_pct mengontrol crop evaluasi. Lihat augmentasi.

Filter resize adalah bagian dari model. Atur model.interpolation ke "bilinear", "bicubic", "nearest", atau "bilinear_no_antialias" sebelum pelatihan: pelatihan, val(), predict(), kalibrasi INT8, dan ekspor semuanya memakainya, dan save(), best.pt, serta last.pt mencatatnya, sehingga pemuatan ulang mempertahankannya. Nama lain memunculkan ValueError. "bilinear_no_antialias" melakukan resize dengan bilinear biasa tanpa antialiasing di mana-mana, termasuk RandomResizedCrop, untuk model yang akan berjalan di belakang resize runtime tanpa antialiasing. MobileNetV4, ResNet, ConvNeXt, ConvNeXt V2, EfficientNetV2, DeiT, Swin, dan ViT memakai bicubic secara default; AlexNet dan VGG memakai bilinear.

Validasi

val() mengembalikan kamus dari kunci metrics/, dihitung di atas val/ pembagian dari akar dataset.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreResNet50-cls.pt") # Dict berisi kunci metrics/, ditambah top1, top5, dan confusion_matrix.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])print(metrics.top1, metrics.top5)
CLI
libreyolo val model=LibreResNet50-cls.pt data=imagenette160

metrics/accuracy_top1 adalah bagian dari gambar-gambar yang kelas dengan skor tertinggi adalah kelas yang benar, dan ini adalah angka utama, yang digunakan pelatihan untuk memilih epoch terbaik. metrics/accuracy_top5 adalah bagian yang kelas aslinya muncul di mana saja dalam lima kelas dengan skor tertinggi, yang berarti lebih sedikit sebanyak kelas yang dimiliki dataset. Kamus juga memuat fitness, salinan dari nilai top-1.

Validasi ImageFolder juga mengembalikan makro metrics/precision, metrics/recall, dan metrics/f1, dengan rata-rata atas kelas yang ada dalam target validasi. Kelas tanpa prediksi menyumbang presisi nol. Fitness default tetap akurasi top-1. Validasi dan kalibrasi memakai transformasi evaluasi model.

Hasilnya adalah subclass dict dengan tiga atribut: top1 dan top5 menyimpan dua nilai akurasi, dan confusion_matrix menghitung setiap gambar pada kelas top-1-nya terhadap labelnya, diindeks matrix[predicted, true]. plots=True menulisnya sebagai hitungan ke confusion_matrix.png dan sebagai proporsi tiap label ke confusion_matrix_normalized.png. Di atas 2.000 kelas, matriks padat dan plotnya tidak tersedia, dan nonzero(), tp_fp(), serta class_accuracy() membaca hitungannya; lihat Validasi dan metrik.

Ekspor

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreResNet50-cls.pt")model.export(format="onnx")
CLI
libreyolo export model=LibreResNet50-cls.pt format=onnx
Gunakan berkas yang diekspor
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Pabrik mengarahkan berdasarkan akhiran berkas, sehingga artifak yang diekspor memuat# seperti checkpoint dan mengembalikan objek Results yang sama.model = LibreYOLO("LibreResNet50-cls.onnx")result = model(SAMPLE_IMAGE) print(result.probs.top1, result.probs.top1conf)

Sebuah artefak yang diekspor dapat dimuat kembali melalui LibreYOLO() berdasarkan akhiran berkas-nya, jadi sebuah berkas .onnx atau .engine berperilaku seperti checkpoint dan mengembalikan Results yang sama. Cakupan format berbeda menurut family; matriks di setiap halaman model adalah dihasilkan dari set yang tervalidasi daripada diketik secara manual. Lihat ekspor dan deploy untuk format, tambahan mereka dan batasannya.

Diverifikasi dengan LibreYOLO v1.6.0.