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.
Projeniz ister Fruit Detection veri setini ister özel bir veri kaynağını içersin, bu eğitim K-Kat Çapraz Doğrulamayı anlamanıza ve uygulamanıza yardımcı olarak projenizin güvenilirliğini ve sağlamlığını artırmayı amaçlamaktadır. makine öğrenimi modeller. 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ımpip
(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
.
- Ultralytics kütüphanesi:
-
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.
- Bu eğitim için, tüm ek açıklama dosyaları
Nesne Algılama Veri Kümesi için Özellik Vektörleri Oluşturma
-
Yeni bir
example.py
Python dosyasını aşağıdaki adımlar için açın. -
Veri setiniz için tüm etiket dosyalarını almaya devam edin.
-
Şimdi, veri kümesi YAML dosyasının içeriğini okuyun ve sınıf etiketlerinin indekslerini çıkarın.
-
Boş bir başlatma
pandas
DataFrame. -
Ek açıklama dosyalarında bulunan her sınıf etiketinin örneklerini sayın.
from collections import Counter for label in labels: lbl_counter = Counter() with open(label, "r") 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(" ")[0])] += 1 labels_df.loc[label.stem] = lbl_counter labels_df = labels_df.fillna(0.0) # replace `nan` values with `0.0`
-
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
-
Şimdi kullanacağımız
KFold
sınıfındansklearn.model_selection
üretmek içink
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
neredeM
seçilen bir tamsayı ise, tekrarlanabilir sonuçlar elde edebilirsiniz.
- Ayar
- Önemli:
-
Veri kümesi şimdi şu bölümlere ayrılmıştır
k
katlar, her biri birtrain
veval
endeksler. Bu sonuçları daha net bir şekilde görüntülemek için bir DataFrame oluşturacağız. -
Ş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 bulunanlaratrain
.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.
-
Ardından, her bir bölünme için dizinleri ve veri kümesi YAML dosyalarını oluşturuyoruz.
import datetime 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, )
-
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.
import shutil 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
-
İlk olarak YOLO modelini yükleyin.
-
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
vename
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 = YOLO(weights_path, task="detect") 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!
SSS
K-Kat Çapraz Doğrulama nedir ve nesne algılamada neden yararlıdır?
K-Kat Çapraz Doğrulama, model performansını daha güvenilir bir şekilde değerlendirmek için veri kümesinin 'k' alt kümeye (kat) 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-Kat Çapraz Doğrulama kullanmak Ultralytics YOLO modelinizin 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-Kat Çapraz Doğrulama kurulumu hakkında ayrıntılı talimatlar için Ultralytics ile K-Kat Çapraz Doğrulama bölümüne bakın.
Ultralytics YOLO kullanarak K-Katlamalı Çapraz Doğrulamayı nasıl uygulayabilirim?
Ultralytics YOLO ile K-Katlamalı Çapraz Doğrulamayı uygulamak için aşağıdaki adımları izlemeniz gerekir:
- Ek açıklamaların YOLO algılama biçiminde olduğunu doğrulayın.
- Python gibi kütüphaneleri kullanın
sklearn
,pandas
vepyyaml
. - Veri kümenizden özellik vektörleri oluşturun.
- kullanarak veri kümenizi bölün
KFold
itibarensklearn.model_selection
. - YOLO modelini her bir bölünme üzerinde eğitin.
Kapsamlı bir kılavuz için belgelerimizdeki K-Fold Veri Kümesi Bölme bölümüne bakın.
Nesne algılama için neden Ultralytics YOLO adresini kullanmalıyım?
Ultralytics YOLO yüksek doğruluk ve verimlilikle son teknoloji ürünü, gerçek zamanlı nesne algılama sunar. Çok yönlüdür ve algılama, segmentasyon ve sınıflandırma gibi birden fazla bilgisayarla görme görevini destekler. Ayrıca, kodsuz model eğitimi ve dağıtımı için Ultralytics HUB gibi araçlarla sorunsuz bir şekilde entegre olur. Daha fazla ayrıntı için Ultralytics YOLO sayfamızdaki avantajları ve özellikleri keşfedin.
Ek açıklamalarımın Ultralytics YOLO için doğru formatta olmasını nasıl sağlayabilirim?
Ek açıklamalarınız YOLO algılama formatına uygun olmalıdır. Her ek açıklama dosyası, görüntüdeki sınırlayıcı kutu koordinatlarının yanı sıra nesne sınıfını da listelemelidir. YOLO formatı, nesne algılama modellerinin eğitimi için kolaylaştırılmış ve standartlaştırılmış veri işleme sağlar. Doğru ek açıklama biçimlendirmesi hakkında daha fazla bilgi için YOLO algılama biçimi kılavuzunu ziyaret edin.
K-Fold Cross Validation'ı Meyve Tespiti dışındaki özel veri kümeleriyle kullanabilir miyim?
Evet, ek açıklamalar YOLO algılama biçiminde olduğu sürece K-Fold Çapraz Doğrulamayı herhangi bir özel veri kümesiyle kullanabilirsiniz. Veri kümesi yollarını ve sınıf etiketlerini özel veri kümenize özgü olanlarla değiştirin. Bu esneklik, herhangi bir nesne algılama projesinin K-Fold Cross Validation kullanarak sağlam model değerlendirmesinden yararlanabilmesini sağlar. Pratik bir örnek için Özellik Vektörleri Oluşturma bölümümüzü inceleyin.