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.
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ı |
|---|---|
| Elma | 7049 |
| Üzüm | 7202 |
| Ananas | 1613 |
| Portakal | 15549 |
| Muz | 3536 |
| Karpuz | 1976 |
-
Gerekli Python paketleri şunlardır:
ultralyticssklearnpandaspyyaml
-
Bu eğitim
k=5kat ile çalışır. Ancak, özel veri kümen için en iyi kat sayısını belirlemelisin.
-
Projen için yeni bir Python sanal ortamı (
venv) başlat ve bunu etkinleştir. Kurulum içinpip(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.
- Ultralytics kütüphanesi:
-
Etiketlerinin YOLO algılama formatında olduğunu doğrula.
- Bu eğitim için tüm etiket dosyaları
Fruit-Detection/labelsdizininde bulunabilir.
- Bu eğitim için tüm etiket dosyaları
Nesne Tespiti Veri Seti için Özellik Vektörleri Oluşturma#
-
Aşağıdaki adımlar için yeni bir
example.pyPython dosyası oluşturarak başla. -
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' -
Ş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()) -
Boş bir
pandasDataFrame 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) -
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` -
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#
-
Şimdi veri kümesinin
kbölünmelerini oluşturmak içinsklearn.model_selectioniçindekiKFoldsınıfını kullanacağız.- Önemli:
shuffle=Trueayarlanması, bölümlerinizde sınıfların rastgele bir dağılımını sağlar.Mseçilen bir tamsayı olduğundarandom_state=Mdeğ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)) - Önemli:
-
Veri kümesi artık her biri bir
trainvevalindeksleri listesine sahip olankkatmana 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" -
Şimdi,
valiçinde bulunan sınıflarıntrainiç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.
-
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, ) -
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#
-
İ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") -
Ardından, eğitimi çalıştırmak için veri kümesi YAML dosyaları üzerinde gezinin. Sonuçlar,
projectvenameargü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 -
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:
- Etiketlerin YOLO algılama formatında olduğunu doğrula.
sklearn,pandasvepyyamlgibi Python kütüphanelerini kullan.- Veri setinden özellik vektörleri oluştur.
sklearn.model_selectioniçindekiKFoldkullanarak veri kümeni böl.- 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.