YOLO Vision 2026:

Ultralytics ile K-Fold Çapraz Doğrulama#

Giriş#

Bu kapsamlı kılavuz, Ultralytics ekosisteminde nesne tespiti veri kümeleri için K-Katlı Çapraz Doğrulama (K-Fold Cross Validation) uygulamasını göstermektedir. Gerekli kurulum, özellik vektörleri oluşturma süreci ve K-Katlı veri kümesi bölümünün yürütülmesi boyunca sana rehberlik etmek için YOLO algılama formatından ve sklearn, pandas ve PyYAML gibi temel Python kütüphanelerinden yararlanacağız.

K-fold cross validation data splitting

Projen ister Meyve Tespiti veri kümesini ister özel bir veri kaynağını içersin, bu eğitimin amacı makine öğrenimi modellerinin güvenilirliğini ve sağlamlığını artırmak için K-Katlı Çapraz Doğrulama'yı anlamana ve uygulamana yardımcı olmaktır. Bu eğitim için k=5 kat kullanacak olsak da, optimum kat sayısının veri kümene ve projenin özelliklerine göre değişebileceğini unutma.

Haydi başlayalım.

Kurulum#

  • Etiketlerin YOLO algılama formatında olmalıdır.

  • Bu rehber, açıklama dosyalarının yerel olarak mevcut olduğunu varsayar.

  • Gösterimimiz için Meyve Tespiti veri kümesini kullanıyoruz.

    • Bu veri seti toplam 8479 görsel içermektedir.
    • Her birinin toplam örnek sayıları aşağıda listelenen 6 sınıf etiketi içerir.
Sınıf EtiketiÖrnek Sayısı
Elma7049
Üzüm7202
Ananas1613
Portakal15549
Muz3536
Karpuz1976
  • Gerekli Python paketleri şunlardır:

    • ultralytics
    • sklearn
    • pandas
    • pyyaml
  • Bu eğitim k=5 kat ile çalışır. Ancak, özel veri kümen için en iyi kat sayısını belirlemelisin.

  1. Projen için yeni bir Python sanal ortamı (venv) başlat ve bunu etkinleştir. Kurulum için pip (veya tercih ettiğin paket yöneticisini) kullan:

    • Ultralytics kütüphanesi: pip install -U ultralytics. Alternatif olarak, resmi depoyu klonlayabilirsin.
    • Scikit-learn, pandas ve PyYAML: pip install -U scikit-learn pandas pyyaml.
  2. Etiketlerinin YOLO algılama formatında olduğunu doğrula.

    • Bu eğitim için tüm etiket dosyaları Fruit-Detection/labels dizininde bulunabilir.

Nesne Tespiti Veri Seti için Özellik Vektörleri Oluşturma#

  1. Aşağıdaki adımlar için yeni bir example.py Python dosyası oluşturarak başla.

  2. Veri setin için tüm etiket dosyalarını almaya devam et.

    from pathlib import Path
    
    dataset_path = Path("./Fruit-detection")  # replace with 'path/to/dataset' for your custom data
    labels = sorted(dataset_path.rglob("*labels/*.txt"))  # all data in 'labels'
  3. Şimdi, veri seti YAML dosyasının içeriğini oku ve sınıf etiketi indekslerini çıkar.

    import yaml
    
    yaml_file = "path/to/data.yaml"  # your data YAML with data directories and names dictionary
    with open(yaml_file, encoding="utf8") as y:
        classes = yaml.safe_load(y)["names"]
    cls_idx = sorted(classes.keys())
  4. Boş bir pandas DataFrame başlat.

    import pandas as pd
    
    index = [label.stem for label in labels]  # uses base filename as ID (no extension)
    labels_df = pd.DataFrame([], columns=cls_idx, index=index)
  5. Açıklama dosyalarında bulunan her bir sınıf etiketinin örneklerini say.

    from collections import Counter
    
    for label in labels:
        lbl_counter = Counter()
    
        with open(label) as lf:
            lines = lf.readlines()
    
        for line in lines:
            # classes for YOLO label uses integer at first position of each line
            lbl_counter[int(line.split(" ", 1)[0])] += 1
    
        labels_df.loc[label.stem] = lbl_counter
    
    labels_df = labels_df.fillna(0.0)  # replace `nan` values with `0.0`
  6. Aşağıdakiler, doldurulmuş DataFrame'in örnek bir görünümüdü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ırlar, her biri veri kümendeki bir görüntüye karşılık gelen etiket dosyalarını dizinler ve sütunlar sınıf etiketi indekslerine karşılık gelir. Her satır, veri kümenizde bulunan her sınıf etiketinin sayısı ile sözde bir özellik vektörünü temsil eder. Bu veri yapısı, bir nesne tespiti veri kümesine K-Katlı Çapraz Doğrulama uygulanmasını sağlar.

K-Fold Veri Seti Bölme#

  1. Şimdi veri kümesinin k bölünmelerini oluşturmak için sklearn.model_selection içindeki KFold sınıfını kullanacağız.

    • Önemli:
      • shuffle=True ayarlanması, bölümlerinizde sınıfların rastgele bir dağılımını sağlar.
      • M seçilen bir tamsayı olduğunda random_state=M değerini ayarlayarak tekrarlanabilir sonuçlar elde edebilirsin.
    import random
    
    from sklearn.model_selection import KFold
    
    random.seed(0)  # for reproducibility
    ksplit = 5
    kf = KFold(n_splits=ksplit, shuffle=True, random_state=20)  # setting random_state for repeatable results
    
    kfolds = list(kf.split(labels_df))
  2. Veri kümesi artık her biri bir train ve val indeksleri listesine sahip olan k katmana bölünmüştür. Bu sonuçları daha net göstermek için bir DataFrame oluşturacağız.

    folds = [f"split_{n}" for n in range(1, ksplit + 1)]
    folds_df = pd.DataFrame(index=index, columns=folds)
    
    for i, (train, val) in enumerate(kfolds, start=1):
        folds_df[f"split_{i}"].loc[labels_df.iloc[train].index] = "train"
        folds_df[f"split_{i}"].loc[labels_df.iloc[val].index] = "val"
  3. Şimdi, val içinde bulunan sınıfların train içinde bulunanlara oranı olarak her kat için sınıf etiketlerinin dağılımını 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 senaryo, tüm sınıf oranlarının her bölme için ve sınıflar arasında makul ölçüde benzer olmasıdır. Ancak bu, veri setinin özelliklerine bağlı olacaktır.

  4. Ardından, her bölme için dizinleri ve veri seti YAML dosyalarını oluşturuyoruz.

    from datetime import datetime, timezone
    
    supported_extensions = [".jpg", ".jpeg", ".png"]
    
    # Initialize an empty list to store image file paths
    images = []
    
    # Loop through supported extensions and gather image files
    for ext in supported_extensions:
        images.extend(sorted((dataset_path / "images").rglob(f"*{ext}")))
    
    # Create the necessary directories and dataset YAML files
    date = datetime.now(timezone.utc).date().isoformat()
    save_path = Path(dataset_path / f"{date}_{ksplit}-Fold_Cross-val")
    save_path.mkdir(parents=True, exist_ok=True)
    ds_yamls = []
    
    for split in folds_df.columns:
        # Create directories
        split_dir = save_path / split
        split_dir.mkdir(parents=True, exist_ok=True)
        (split_dir / "train" / "images").mkdir(parents=True, exist_ok=True)
        (split_dir / "train" / "labels").mkdir(parents=True, exist_ok=True)
        (split_dir / "val" / "images").mkdir(parents=True, exist_ok=True)
        (split_dir / "val" / "labels").mkdir(parents=True, exist_ok=True)
    
        # Create dataset YAML files
        dataset_yaml = split_dir / f"{split}_dataset.yaml"
        ds_yamls.append(dataset_yaml)
    
        with open(dataset_yaml, "w") as ds_y:
            yaml.safe_dump(
                {
                    "path": split_dir.as_posix(),
                    "train": "train",
                    "val": "val",
                    "names": classes,
                },
                ds_y,
            )
  5. Son olarak, görselleri ve etiketleri her bölme için ilgili dizine ('train' veya 'val') kopyala.

    • NOT: Kodun bu kısmı için gereken süre, veri setinin boyutuna ve sistem donanımına göre değişecektir.
    import shutil
    
    from tqdm import tqdm
    
    for image, label in tqdm(zip(images, labels), total=len(images), desc="Copying files"):
        for split, k_split in folds_df.loc[image.stem].items():
            # Destination directory
            img_to_path = save_path / split / k_split / "images"
            lbl_to_path = save_path / split / k_split / "labels"
    
            # Copy image and label files to new directory (SamefileError if file already exists)
            shutil.copy(image, img_to_path / image.name)
            shutil.copy(label, lbl_to_path / label.name)

Kayıtları Kaydet (İsteğe bağlı)#

İsteğe bağlı olarak, K-Fold 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-Fold Veri Bölmelerini kullanarak YOLO Eğitimi#

  1. İlk olarak, YOLO modelini yükle.

    from ultralytics import YOLO
    
    weights_path = "path/to/weights.pt"  # use yolo26n.pt for a small model
    model = YOLO(weights_path, task="detect")
  2. Ardından, eğitimi çalıştırmak için veri kümesi YAML dosyaları üzerinde gezinin. Sonuçlar, project ve name argümanları tarafından belirtilen bir dizine kaydedilecektir. Varsayılan olarak bu dizin, # bir tamsayı indeksi olmak üzere 'runs/detect/train#' şeklindedir.

    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
  3. Otomatik veri kümesi bölme için Ultralytics data.split.autosplit fonksiyonunu da kullanabilirsin:

    from ultralytics.data.split import autosplit
    
    # Automatically split dataset into train/val/test
    autosplit(path="path/to/images", weights=(0.8, 0.2, 0.0), annotated_only=True)

Sonuç#

Bu rehberde, YOLO nesne tespiti modelini eğitmek için K-Fold çapraz doğrulama kullanma sürecini inceledik. Veri setimizi K parçaya nasıl böleceğimizi ve farklı katlamalar arasında dengeli bir sınıf dağılımı sağlamayı öğ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 prosedürünü inceledik, bu bize eğitim ve doğrulama setlerimizin yapısı hakkında net bir içgörü sağladı.

İsteğe bağlı olarak, kayıtlarımızı gelecekte başvurmak üzere sakladık; bu, büyük ölçekli projelerde veya model performansında sorun giderirken özellikle yararlı olabilir.

Son olarak, her bir bölmeyi bir döngü içinde kullanarak gerçek model eğitimini uyguladık ve eğitim sonuçlarımızı daha fazla analiz ve karşılaştırma için kaydettik.

Bu K-Katlı çapraz doğrulama tekniği, mevcut verilerinden en iyi şekilde yararlanmanın sağlam bir yoludur ve model performansının farklı veri alt kümelerinde güvenilir ve tutarlı olmasını sağlamaya yardımcı olur. Bu, belirli veri modellerine aşırı uyum (overfit) sağlama olasılığı daha düşük olan, daha genelleştirilebilir ve güvenilir bir modelle sonuçlanır.

Bu rehberde YOLO kullansak da, bu adımların çoğunun diğer makine öğrenimi modellerine aktarılabilir olduğunu unutma. Bu adımları anlamak, kendi makine öğrenimi projelerinde çapraz doğrulamayı etkili bir şekilde uygulamanı sağlar.

SSS#

K-Fold Çapraz Doğrulama nedir ve nesne tespitinde neden yararlıdır?#

K-Katlı Çapraz Doğrulama, model performansını daha güvenilir bir şekilde 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 hizmet eder. Nesne tespiti bağlamında, K-Katlı Çapraz Doğrulama kullanmak, Ultralytics YOLO modelinin performansının farklı veri bölünmeleri arasında sağlam ve genelleştirilebilir olmasını sağlamaya yardımcı olarak güvenilirliğini artırır. Ultralytics YOLO ile K-Katlı Çapraz Doğrulama kurulumu hakkında ayrıntılı talimatlar için Ultralytics ile K-Katlı Çapraz Doğrulama bölümüne bakın.

Ultralytics YOLO kullanarak K-Fold Çapraz Doğrulamayı nasıl uygularım?#

Ultralytics YOLO ile K-Fold Çapraz Doğrulamayı uygulamak için şu adımları izlemen gerekir:

  1. Etiketlerin YOLO algılama formatında olduğunu doğrula.
  2. sklearn, pandas ve pyyaml gibi Python kütüphanelerini kullan.
  3. Veri setinden özellik vektörleri oluştur.
  4. sklearn.model_selection içindeki KFold kullanarak veri kümeni böl.
  5. YOLO modelini her bölme üzerinde eğit.

Kapsamlı bir kılavuz için dokümantasyonumuzdaki K-Katlı Veri Kümesi Bölme bölümüne bakın.

Nesne tespiti için neden Ultralytics YOLO kullanmalıyım?#

Ultralytics YOLO, yüksek accuracy ve verimlilik ile en son teknolojiye sahip, gerçek zamanlı nesne tespiti sunar. detection, instance segmentation, semantic segmentation ve classification gibi birden çok computer vision görevini destekleyen çok yönlüdür. Ek olarak, kodsuz model eğitimi ve dağıtımı için Ultralytics Platform gibi araçlarla sorunsuz bir şekilde bütünleşir. Daha fazla ayrıntı için Ultralytics YOLO page sayfamızdaki avantajları ve özellikleri incele.

Açıklamalarımın Ultralytics YOLO için doğru formatta olduğundan nasıl emin olabilirim?#

Etiketlerin YOLO algılama formatını izlemelidir. Her etiket dosyası, nesne sınıfını görüntüdeki sınırlayıcı kutu koordinatlarıyla birlikte listelemelidir. YOLO formatı, nesne tespiti modellerini eğitmek için akıcı ve standartlaştırılmış veri işlemeyi garanti eder. Uygun etiket biçimlendirmesi hakkında daha fazla bilgi için YOLO algılama formatı kılavuzunu ziyaret edin.

K-Fold Çapraz Doğrulamayı Fruit Detection dışındaki özel veri setleri ile kullanabilir miyim?#

Evet, etiketler YOLO algılama formatında olduğu sürece K-Katlı Çapraz Doğrulama'yı herhangi bir özel veri kümesiyle kullanabilirsin. Veri kümesi yollarını ve sınıf etiketlerini kendi özel veri kümene özgü olanlarla değiştir. Bu esneklik, herhangi bir nesne tespiti projesinin K-Katlı Çapraz Doğrulama kullanarak sağlam model değerlendirmesinden yararlanabilmesini sağlar. Pratik bir örnek için Özellik Vektörleri Oluşturma bölümümüzü incele.

Yorumlar