─░├žeri─če ge├ž

K-Katl─▒ ├çapraz Do─črulama ile Ultralytics

Giri┼č

Bu kapsaml─▒ k─▒lavuz, Ultralytics ekosistemindeki nesne alg─▒lama veri k├╝meleri i├žin K-Kat ├çapraz Do─črulama uygulamas─▒n─▒ g├Âstermektedir. Gerekli kurulum, ├Âzellik vekt├Ârleri olu┼čturma s├╝reci ve K-Fold veri k├╝mesi b├Âlme i┼čleminin y├╝r├╝t├╝lmesinde size rehberlik etmek i├žin YOLO alg─▒lama format─▒ndan ve sklearn, pandas ve PyYaml gibi temel Python k├╝t├╝phanelerinden yararlanaca─č─▒z.

K-Katl─▒ ├çapraz Do─črulamaya Genel Bak─▒┼č

Projeniz ister Fruit Detection veri setini ister ├Âzel bir veri kayna─č─▒n─▒ i├žersin, bu e─čitim makine ├Â─črenimi modellerinizin g├╝venilirli─čini ve sa─člaml─▒─č─▒n─▒ art─▒rmak i├žin K-Kat ├çapraz Do─črulamay─▒ anlaman─▒za ve uygulaman─▒za yard─▒mc─▒ olmay─▒ ama├žlamaktad─▒r. Biz uygularken k=5 Bu e─čitim i├žin katlama say─▒s─▒n─▒ belirlerken, optimum katlama say─▒s─▒n─▒n veri setinize ve projenizin ├Âzelliklerine ba─čl─▒ olarak de─či┼čebilece─čini unutmay─▒n.

Laf─▒ daha fazla uzatmadan i├žeri dalal─▒m!

Kurulum

  • Ek a├ž─▒klamalar─▒n─▒z YOLO alg─▒lama format─▒nda olmal─▒d─▒r.

  • Bu k─▒lavuz ek a├ž─▒klama dosyalar─▒n─▒n yerel olarak mevcut oldu─čunu varsayar.

  • G├Âsterimiz i├žin Meyve Tespiti veri k├╝mesini kullan─▒yoruz.

    • Bu veri k├╝mesi toplam 8479 g├Âr├╝nt├╝ i├žermektedir.
    • Her biri a┼ča─č─▒da listelenen toplam ├Ârnek say─▒lar─▒yla birlikte 6 s─▒n─▒f etiketi i├žerir.
S─▒n─▒f Etiketi ├ľrnek Say─▒s─▒
Elma 7049
├ťz├╝mler 7202
Ananas 1613
Turuncu 15549
Muz 3536
Karpuz 1976
  • Gerekli Python paketleri ┼čunlar─▒ i├žerir:

    • ultralytics
    • sklearn
    • pandas
    • pyyaml
  • Bu e─čitim ┼ču ┼čekilde ├žal─▒┼č─▒r k=5 katlar. Ancak, kendi veri k├╝meniz i├žin en iyi katlama say─▒s─▒n─▒ belirlemelisiniz.

  • Yeni bir Python sanal ortam─▒ ba┼člat─▒n (venv) projeniz i├žin se├žin ve etkinle┼čtirin. Kullan─▒m pip (veya tercih etti─činiz paket y├Âneticisi) ile y├╝kleyebilirsiniz:

    • Ultralytics k├╝t├╝phanesi: pip install -U ultralytics. Alternatif olarak, resmi repo.
    • Scikit-learn, pandas ve PyYAML: pip install -U scikit-learn pandas pyyaml.
  • Ek a├ž─▒klamalar─▒n─▒z─▒n YOLO alg─▒lama bi├žiminde oldu─čunu do─črulay─▒n.

    • Bu e─čitim i├žin, t├╝m ek a├ž─▒klama dosyalar─▒ Fruit-Detection/labels dizin.

Nesne Alg─▒lama Veri K├╝mesi i├žin ├ľzellik Vekt├Ârleri Olu┼čturma

  1. Yeni bir Python dosyas─▒ olu┼čturarak ba┼člay─▒n ve gerekli k├╝t├╝phaneleri i├že aktar─▒n.

    import datetime
    import shutil
    from collections import Counter
    from pathlib import Path
    
    import numpy as np
    import pandas as pd
    import yaml
    from sklearn.model_selection import KFold
    
    from ultralytics import YOLO
    
  2. Veri setiniz i├žin t├╝m etiket dosyalar─▒n─▒ almaya devam edin.

    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 k├╝mesi YAML dosyas─▒n─▒n i├žeri─čini okuyun ve s─▒n─▒f etiketlerinin indekslerini ├ž─▒kar─▒n.

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

    indx = [l.stem for l in labels]  # uses base filename as ID (no extension)
    labels_df = pd.DataFrame([], columns=cls_idx, index=indx)
    
  5. Ek a├ž─▒klama dosyalar─▒nda bulunan her s─▒n─▒f etiketinin ├Ârneklerini say─▒n.

    for label in labels:
        lbl_counter = Counter()
    
        with open(label, "r") as lf:
            lines = lf.readlines()
    
        for l in lines:
            # classes for YOLO label uses integer at first position of each line
            lbl_counter[int(l.split(" ")[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─č─▒da, doldurulmu┼č DataFrame'in ├Ârnek bir g├Âr├╝n├╝m├╝ yer almaktad─▒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├╝menizdeki bir g├Âr├╝nt├╝ye kar┼č─▒l─▒k gelen etiket dosyalar─▒n─▒ indeksler ve s├╝tunlar s─▒n─▒f-etiket indekslerinize kar┼č─▒l─▒k gelir. Her sat─▒r, veri k├╝menizde bulunan her s─▒n─▒f etiketinin say─▒s─▒yla birlikte s├Âzde bir ├Âzellik vekt├Âr├╝n├╝ temsil eder. Bu veri yap─▒s─▒, bir nesne alg─▒lama veri k├╝mesine K-Kat ├çapraz Do─črulama uygulanmas─▒n─▒ sa─člar.

K-Katl─▒ Veri K├╝mesi B├Âlme

  1. ┼×imdi kullanaca─č─▒m─▒z KFold s─▒n─▒f─▒ndan sklearn.model_selection ├╝retmek i├žin k veri k├╝mesinin b├Âl├╝nmesi.

    • ├ľnemli:
      • Ayar shuffle=True b├Âl├╝nmelerinizde s─▒n─▒flar─▒n rastgele da─č─▒l─▒m─▒n─▒ sa─člar.
      • Ayarlayarak random_state=M nerede M se├žilen bir tamsay─▒ ise, tekrarlanabilir sonu├žlar elde edebilirsiniz.
    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 ┼čimdi ┼ču b├Âl├╝mlere ayr─▒lm─▒┼čt─▒r k katlar, her biri bir train ve val endeksler. Bu sonu├žlar─▒ daha net bir ┼čekilde 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=indx, columns=folds)
    
    for idx, (train, val) in enumerate(kfolds, start=1):
        folds_df[f"split_{idx}"].loc[labels_df.iloc[train].index] = "train"
        folds_df[f"split_{idx}"].loc[labels_df.iloc[val].index] = "val"
    
  3. ┼×imdi her bir kat i├žin s─▒n─▒f etiketlerinin da─č─▒l─▒m─▒n─▒, mevcut s─▒n─▒flar─▒n bir oran─▒ olarak hesaplayaca─č─▒z. val orada bulunanlara train.

    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├Âl├╝nme i├žin ve s─▒n─▒flar aras─▒nda makul ├Âl├ž├╝de benzer olmas─▒d─▒r. Ancak bu, veri setinizin ├Âzelliklerine ba─čl─▒ olacakt─▒r.

  4. Ard─▒ndan, her bir b├Âl├╝nme i├žin dizinleri ve veri k├╝mesi YAML dosyalar─▒n─▒ olu┼čturuyoruz.

    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 (unchanged)
    save_path = Path(dataset_path / f"{datetime.date.today().isoformat()}_{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├Âr├╝nt├╝leri ve etiketleri her bir b├Âl├╝nme i├žin ilgili dizine ('train' veya 'val') kopyalay─▒n.

    • NOT: Kodun bu k─▒sm─▒ i├žin gereken s├╝re, veri k├╝menizin boyutuna ve sistem donan─▒m─▒n─▒za ba─čl─▒ olarak de─či┼čecektir.
    for image, label in zip(images, labels):
        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─č─▒t─▒m DataFrame'lerinin kay─▒tlar─▒n─▒ ileride ba┼čvurmak ├╝zere CSV dosyalar─▒ olarak kaydedebilirsiniz.

folds_df.to_csv(save_path / "kfold_datasplit.csv")
fold_lbl_distrb.to_csv(save_path / "kfold_label_distribution.csv")

K-Katl─▒ Veri B├Âlmeleri kullanarak YOLO 'u e─čitin

  1. ─░lk olarak YOLO modelini y├╝kleyin.

    weights_path = "path/to/weights.pt"
    model = YOLO(weights_path, task="detect")
    
  2. Ard─▒ndan, e─čitimi ├žal─▒┼čt─▒rmak i├žin veri k├╝mesi YAML dosyalar─▒ ├╝zerinde yineleyin. Sonu├žlar ┼ču ┼čekilde belirtilen bir dizine kaydedilecektir project ve name arg├╝manlar. Varsay─▒lan olarak bu dizin 'exp/runs#' ┼čeklindedir ve burada # bir tamsay─▒ dizinidir.

    results = {}
    
    # Define your additional arguments here
    batch = 16
    project = "kfold_demo"
    epochs = 100
    
    for k in range(ksplit):
        dataset_yaml = ds_yamls[k]
        model.train(data=dataset_yaml, epochs=epochs, batch=batch, project=project)  # include any train arguments
        results[k] = model.metrics  # save output metrics for further analysis
    

Sonu├ž

Bu k─▒lavuzda, YOLO nesne alg─▒lama modelini e─čitmek i├žin K-Kat ├žapraz do─črulama kullanma s├╝recini inceledik. Farkl─▒ katlar aras─▒nda dengeli bir s─▒n─▒f da─č─▒l─▒m─▒ sa─člayarak veri k├╝memizi K b├Âl├╝mlerine nas─▒l ay─▒raca─č─▒m─▒z─▒ ├Â─črendik.

Ayr─▒ca, e─čitim ve do─črulama setlerimizin yap─▒s─▒ hakk─▒nda net bir fikir edinmemizi sa─člayan veri b├Âl├╝nmelerini ve bu b├Âl├╝nmelerdeki etiket da─č─▒l─▒mlar─▒n─▒ g├Ârselle┼čtirmek i├žin rapor DataFrames olu┼čturma prosed├╝r├╝n├╝ de ara┼čt─▒rd─▒k.

─░ste─če ba─čl─▒ olarak, kay─▒tlar─▒m─▒z─▒ ileride ba┼čvurmak ├╝zere kaydettik; bu, ├Âzellikle b├╝y├╝k ├Âl├žekli projelerde veya model performans─▒nda sorun giderirken yararl─▒ olabilir.

Son olarak, her bir b├Âl├╝nmeyi 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-Kat ├žapraz do─črulama tekni─či, elinizdeki verilerden en iyi ┼čekilde yararlanman─▒n sa─člam bir yoludur ve model performans─▒n─▒z─▒n farkl─▒ veri alt k├╝meleri aras─▒nda g├╝venilir ve tutarl─▒ olmas─▒n─▒ sa─člamaya yard─▒mc─▒ olur. Bu, belirli veri modellerine a┼č─▒r─▒ uyum sa─člama olas─▒l─▒─č─▒ daha d├╝┼č├╝k olan daha genelle┼čtirilebilir ve g├╝venilir bir modelle sonu├žlan─▒r.

Bu k─▒lavuzda YOLO adresini kullanmam─▒za ra─čmen, bu ad─▒mlar─▒n ├žo─čunlukla di─čer makine ├Â─črenimi modellerine de aktar─▒labilece─čini unutmay─▒n. Bu ad─▒mlar─▒ anlamak, kendi makine ├Â─črenimi projelerinizde ├žapraz do─črulamay─▒ etkili bir ┼čekilde uygulaman─▒za olanak tan─▒r. Mutlu kodlamalar!



Created 2023-11-12, Updated 2024-06-10
Authors: glenn-jocher (8), IvorZhu331 (1), Burhan-Q (1)

Yorumlar