Ultralytics ile K-Katlı Çapraz Doğrulama#
Giriş#
Bu kapsamlı kılavuz, Ultralytics ekosistemindeki nesne algılama veri kümeleri için K-Katlı Çapraz Doğrulamanın uygulanışını gösterir. Gerekli kurulumu, özellik vektörlerinin oluşturulmasını ve K-Katlı veri kümesi bölme işlemini adım adım açıklamak için YOLO algılama biçiminden ve sklearn, pandas ve PyYAML gibi temel Python kütüphanelerinden yararlanacağız.
Projen Fruit Detection veri kümesini ya da özel bir veri kaynağını içeriyor olsun, bu eğitim K-Katlı Çapraz Doğrulamayı anlamana ve uygulamana yardımcı olarak makine öğrenimi modellerinin güvenilirliğini ve sağlamlığını artırmayı amaçlar. Bu eğitimde k=5 kat kullanacak olsak da en uygun kat sayısının veri kümesine ve projenin özelliklerine göre değişebileceğini unutma. K-Katlı Çapraz Doğrulama; veri kümen küçük, gürültülü veya yüksek değişkenlik gösterdiğinde en çok faydayı sağlar; büyük ve çeşitli veri kümeleri için iyi tasarlanmış bir train/val/test bölmesi genellikle yeterlidir.
Başlayalım.
Kurulum#
-
Ek açıklamaların YOLO algılama biçiminde olmalıdır.
-
Bu kılavuzda ek açıklama dosyalarının yerel olarak erişilebilir olduğu varsayılır.
-
Örneğimizde Fruit Detection veri kümesini kullanıyoruz.
- Bu veri kümesinde toplam 8479 görüntü bulunur.
- Veri kümesi 6 sınıf etiketi içerir ve her sınıfın toplam örnek sayısı aşağıda listelenmiştir.
| Sınıf Etiketi | Örnek Sayısı |
|---|---|
| Elma | 7049 |
| Üzüm | 7202 |
| Ananas | 1613 |
| Portakal | 15549 |
| Muz | 3536 |
| Karpuz | 1976 |
-
Gerekli Python paketleri:
ultralyticssklearnpandaspyyaml
-
Bu eğitimde
k=5kat kullanılır. Ancak kendi veri kümen için en uygun kat sayısını belirlemelisin.
-
Projen için yeni bir Python sanal ortamı (
venv) oluşturup etkinleştir. Yüklemek içinpip(veya tercih ettiğin paket yöneticisini) kullan:- Ultralytics kütüphanesi:
pip install -U ultralytics. Alternatif olarak resmî depoyu klonlayabilirsin. - Scikit-learn, pandas ve PyYAML:
pip install -U scikit-learn pandas pyyaml.
- Ultralytics kütüphanesi:
-
Ek açıklamalarının YOLO algılama biçiminde olduğunu doğrula.
- Bu eğitimde tüm ek açıklama dosyaları
Fruit-Detection/labelsdizininde bulunur.
- Bu eğitimde tüm ek açıklama dosyaları
Nesne Algılama Veri Kümesi için Özellik Vektörleri Oluşturma#
-
Aşağıdaki adımlar için yeni bir
example.pyPython dosyası oluşturarak başla. -
Yapılandırılmış eğitim ve doğrulama görüntülerini paket veri kümesi sahibi aracılığıyla yükle; test bölümüne dokunma.
from pathlib import Path from ultralytics.data.dataset import YOLODataset from ultralytics.data.utils import check_det_dataset yaml_file = "path/to/data.yaml" data = check_det_dataset(yaml_file) dataset_path = Path(data["path"]) sources = [] for split in ("train", "val"): source = data.get(split) if source: sources.extend(source if isinstance(source, list) else [source]) dataset = YOLODataset(sources, data=data, augment=False) images = [Path(p) for p in dataset.im_files] -
Şimdi veri kümesinin YAML dosyasını oku ve sınıf etiketlerinin indekslerini çıkar.
classes = data["names"] cls_idx = sorted(classes.keys()) -
Boş bir
pandasDataFrame'i başlat.import pandas as pd labels_df = pd.DataFrame(0.0, columns=cls_idx, index=images) -
Ek açıklama dosyalarındaki her sınıf etiketinin örneklerini say.
from collections import Counter for image, label in zip(images, dataset.labels): lbl_counter = Counter(label["cls"].flatten().astype(int)) labels_df.loc[image, list(lbl_counter)] = list(lbl_counter.values()) -
Doldurulmuş DataFrame'in örnek görünümü aşağıdadır:
0 1 2 3 4 5 '0000a16e4b057580_jpg.rf.00ab48988370f64f5ca8ea4...' 0.0 0.0 0.0 0.0 0.0 7.0 '0000a16e4b057580_jpg.rf.7e6dce029fb67f01eb19aa7...' 0.0 0.0 0.0 0.0 0.0 7.0 '0000a16e4b057580_jpg.rf.bc4d31cdcbe229dd022957a...' 0.0 0.0 0.0 0.0 0.0 7.0 '00020ebf74c4881c_jpg.rf.508192a0a97aa6c4a3b6882...' 0.0 0.0 0.0 1.0 0.0 0.0 '00020ebf74c4881c_jpg.rf.5af192a2254c8ecc4188a25...' 0.0 0.0 0.0 1.0 0.0 0.0 ... ... ... ... ... ... ... 'ff4cd45896de38be_jpg.rf.c4b5e967ca10c7ced3b9e97...' 0.0 0.0 0.0 0.0 0.0 2.0 'ff4cd45896de38be_jpg.rf.ea4c1d37d2884b3e3cbce08...' 0.0 0.0 0.0 0.0 0.0 2.0 'ff5fd9c3c624b7dc_jpg.rf.bb519feaa36fc4bf630a033...' 1.0 0.0 0.0 0.0 0.0 0.0 'ff5fd9c3c624b7dc_jpg.rf.f0751c9c3aa4519ea3c9d6a...' 1.0 0.0 0.0 0.0 0.0 0.0 'fffe28b31f2a70d4_jpg.rf.7ea16bd637ba0711c53b540...' 0.0 6.0 0.0 0.0 0.0 0.0
Satırlarda mutlak görüntü yolları, sütunlarda ise sınıf etiketi indeksleri yer alır. Eksik etiketler, tüm değerleri sıfır olan arka plan satırları olarak kalır. Bu veri yapısı, nesne algılama veri kümesine K-Katlı Çapraz Doğrulama uygulanmasını sağlar.
K-Katlı Veri Kümesi Bölmesi#
-
Şimdi veri kümesini
kbölüme ayırmak içinsklearn.model_selectioniçindekiKFoldsınıfını kullanacağız.- Önemli:
shuffle=Trueayarı, bölümlerde sınıfların rastgele dağıtılmasını sağlar.Mseçilen bir tam sayı olduğundarandom_state=Mayarını yaparak tekrarlanabilir sonuçlar elde edebilirsin.
from sklearn.model_selection import KFold ksplit = 5 kf = KFold(n_splits=ksplit, shuffle=True, random_state=20) # tekrarlanabilir sonuçlar için random_state ayarlanıyor kfolds = list(kf.split(labels_df)) - Önemli:
-
Veri kümesi artık
kkata bölündü; her kattatrainvevalindekslerinden oluşan bir liste bulunuyor. Sonuçları daha net görüntülemek için bir DataFrame oluşturacağız.folds = [f"split_{n}" for n in range(1, ksplit + 1)] folds_df = pd.DataFrame(index=labels_df.index, columns=folds) for i, (train, val) in enumerate(kfolds, start=1): folds_df.loc[labels_df.index[train], f"split_{i}"] = "train" folds_df.loc[labels_df.index[val], f"split_{i}"] = "val" -
Şimdi her kat için sınıf etiketlerinin dağılımını,
valiçindeki sınıflarıntrainiçindeki sınıflara oranı olarak hesaplayacağız.fold_lbl_distrb = pd.DataFrame(index=folds, columns=cls_idx) for n, (train_indices, val_indices) in enumerate(kfolds, start=1): train_totals = labels_df.iloc[train_indices].sum() val_totals = labels_df.iloc[val_indices].sum() # To avoid division by zero, we add a small value (1E-7) to the denominator ratio = val_totals / (train_totals + 1e-7) fold_lbl_distrb.loc[f"split_{n}"] = ratioİdeal durumda tüm sınıf oranları her bölmede ve sınıflar arasında makul ölçüde benzer olmalıdır. Ancak bu, veri kümenin özelliklerine bağlıdır.
-
Her bölme için görüntü listelerini ve bir veri kümesi YAML dosyası yaz. Metin listeleri, veri kümesini
kkez kopyalama ihtiyacını ortadan kaldırır.import yaml save_path = dataset_path.parent / f"{ksplit}-Fold_Cross-val" save_path.mkdir(parents=True, exist_ok=True) ds_yamls = [] for split in folds_df.columns: for partition in ("train", "val"): split_images = folds_df.index[folds_df[split] == partition] paths = "\n".join(map(str, split_images)) (save_path / f"{split}_{partition}.txt").write_text(f"{paths}\n") dataset_yaml = save_path / f"{split}.yaml" ds_yamls.append(dataset_yaml) with open(dataset_yaml, "w") as ds_y: yaml.safe_dump( { "path": save_path.as_posix(), "train": f"{split}_train.txt", "val": f"{split}_val.txt", "names": classes, }, ds_y, )
Kayıtları Kaydetme (İsteğe Bağlı)#
İstersen K-Katlı bölme ve etiket dağılımı DataFrame'lerinin kayıtlarını ileride başvurmak üzere CSV dosyaları olarak kaydedebilirsin.
folds_df.to_csv(save_path / "kfold_datasplit.csv")
fold_lbl_distrb.to_csv(save_path / "kfold_label_distribution.csv")K-Katlı Veri Bölmeleriyle YOLO Eğitme#
-
Önce YOLO modelini yükle.
from ultralytics import YOLO weights_path = "path/to/weights.pt" # küçük bir model için yolo26n.pt kullan model = YOLO(weights_path, task="detect") -
Ardından eğitimi çalıştırmak için veri kümesi YAML dosyalarını sırayla işle. Sonuçlar,
projectvenamebağımsız değişkenleriyle belirtilen dizine kaydedilir. Varsayılan olarak bu dizin, # işaretinin bir tam sayı indeksi olduğu 'runs/detect/train#' dizinidir.results = {} # Define your additional arguments here batch = 16 project = "kfold_demo" epochs = 100 for k, dataset_yaml in enumerate(ds_yamls): model = YOLO(weights_path, task="detect") results[k] = model.train( data=dataset_yaml, epochs=epochs, batch=batch, project=project, name=f"fold_{k + 1}" ) # include any additional train arguments -
Otomatik veri kümesi bölme için Ultralytics data.split.autosplit işlevini de kullanabilirsin:
from ultralytics.data.split import autosplit # Veri kümesini otomatik olarak train/val/test bölümlerine ayır autosplit(path="path/to/images", weights=(0.8, 0.2, 0.0), annotated_only=True)
Sonuç#
Bu kılavuzda, YOLO nesne algılama modelini eğitmek için K-Katlı çapraz doğrulama kullanımını inceledik. Eğitim ve doğrulama havuzunu K bölüme ayırmayı ve rastgele bölme sonrasında sınıf dengesini incelemek için oluşturulan oran tablosunu kullanmayı öğrendik.
Ayrıca veri bölmelerini ve bu bölmelerdeki etiket dağılımlarını görselleştirmek için rapor DataFrame'leri oluşturma yöntemini inceledik; böylece eğitim ve doğrulama kümelerimizin yapısı hakkında net bir fikir edindik.
Kayıtlarımızı isteğe bağlı olarak ileride başvurmak üzere kaydettik. Bu, büyük ölçekli projelerde veya model performansıyla ilgili sorunları giderirken özellikle yararlı olabilir.
Son olarak, her bölmeyi bir döngüde kullanarak model eğitimini uyguladık ve eğitim sonuçlarımızı daha sonra analiz ve karşılaştırma yapmak üzere kaydettik.
Bu K-Katlı çapraz doğrulama tekniği, elindeki verilerden en iyi şekilde yararlanmanın sağlam bir yoludur ve farklı veri alt kümelerinde model performansının güvenilir ve tutarlı olmasını sağlamaya yardımcı olur. Böylece belirli veri örüntülerine aşırı uyum gösterme olasılığı daha düşük, genelleme kabiliyeti ve güvenilirliği daha yüksek bir model elde edilir.
Bu kılavuzda YOLO kullanmış olsak da bu adımların çoğunun diğer makine öğrenimi modellerine de uygulanabileceğini unutma. Bu adımları anlamak, kendi makine öğrenimi projelerinde çapraz doğrulamayı etkili biçimde uygulamanı sağlar.
Sık Sorulan Sorular#
K-Katlı Çapraz Doğrulama, model performansını daha güvenilir biçimde değerlendirmek için veri kümesinin 'k' alt kümeye (kata) bölündüğü bir tekniktir. Her kat hem eğitim hem de doğrulama verisi olarak kullanılır. Nesne algılama bağlamında K-Katlı Çapraz Doğrulama, Ultralytics YOLO modelinin farklı veri bölmelerindeki performansının sağlam ve genellenebilir olmasını sağlayarak güvenilirliğini artırmaya yardımcı olur. Ultralytics YOLO ile K-Katlı Çapraz Doğrulamayı ayarlama konusunda ayrıntılı talimatlar için Ultralytics ile K-Katlı Çapraz Doğrulama başlıklı kaynağa bak.
Ultralytics YOLO ile K-Katlı Çapraz Doğrulamayı uygulamak için şu adımları izle:
- Ek açıklamaların YOLO algılama biçiminde olduğunu doğrula.
sklearn,pandasvepyyamlgibi Python kütüphanelerini kullan.- Veri kümen üzerinden özellik vektörleri oluştur.
- Veri kümeni
sklearn.model_selectioniçindekiKFoldöğesini kullanarak böl. - YOLO modelini her bölmede eğit.
Kapsamlı bir kılavuz için belgelerimizdeki K-Katlı Veri Kümesi Bölmesi bölümüne bak.
Bu kılavuzdaki iş akışı YOLO algılama biçimini hedefler, ancak aynı yaklaşım tüm YOLO görevlerine uyarlanabilir: görev, çapraz doğrulamanın faydalı olup olmadığını değil, katları nasıl oluşturacağını değiştirir:
Görev Kat tasarımı detectNesne ve sınıf dağılımlarını katlar arasında dengeleyerek görüntü düzeyinde böl. İlişkili görüntüleri (aynı hasta, video dizisi, kamera veya konum) tek bir katta tut. segmentAlgılamayla aynı görüntü düzeyindeki stratejiyi kullan ve buna ek olarak her kattaki maske ve sınıf kapsamını koru. classifySınıf sıklıklarının eğitim ve doğrulama arasında dengeli kalması için katmanlı katları tercih et. poseAynı kişi veya hayvanın bir katın iki tarafında da yer almaması için denek ya da dizi bazında böl. obbGörüntü düzeyinde bölme yap ve aynı sahneden gelen döşemeleri veya kırpmaları bir arada tut; bu, özellikle hava görüntüleri için önemlidir. Görev ne olursa olsun, neredeyse aynı olan ve birbiriyle ilişkili örnekleri karşıt katlarda bulundurma: bu tür veri sızıntıları doğrulama metriklerini, modelin üretimde ulaşacağı seviyenin çok üzerine çıkarır.
Ultralytics YOLO, yüksek doğruluk ve verimlilikle son teknoloji gerçek zamanlı nesne algılama sunar. Çok yönlü yapısıyla algılama, örnek segmentasyonu, anlamsal segmentasyon ve sınıflandırma gibi birden fazla bilgisayarlı görü görevini destekler. Ayrıca kod yazmadan model eğitimi ve dağıtımı için Ultralytics Platform gibi araçlarla sorunsuz biçimde bütünleşir. Daha fazla bilgi için Ultralytics YOLO sayfamızda avantajları ve özellikleri incele.
Ek açıklamaların YOLO algılama biçimine uygun olmalıdır. Her ek açıklama dosyası, nesne sınıfını ve görüntüdeki sınırlayıcı kutu koordinatlarını listelemelidir. YOLO biçimi, nesne algılama modellerini eğitmek için veri işlemenin verimli ve standartlaştırılmış olmasını sağlar. Ek açıklamaları doğru biçimlendirme hakkında daha fazla bilgi için YOLO algılama biçimi kılavuzunu ziyaret et.
Evet, ek açıklamalar YOLO algılama biçimindeyse herhangi bir özel veri kümesiyle K-Katlı Çapraz Doğrulama kullanabilirsin. Veri kümesi yollarını ve sınıf etiketlerini kendi veri kümene özgü olanlarla değiştir. Bu esneklik, her nesne algılama projesinin K-Katlı Çapraz Doğrulama ile sağlam model değerlendirmesinden yararlanmasını sağlar. Uygulamalı bir örnek için Özellik Vektörleri Oluşturma bölümümüzü incele.