Yüksek Kaliteli, Temsili Veriler Topla
Görüntüleri gerçek dağıtım koşullarından al, çekim meta verilerini her dosya adında tut, kapsamı spesifikasyona göre izle ve veri kümesini gereksiz yere büyütmeden videodan örnek seç.
Veri kümelerindeki sorunların çoğu veri toplama aşamasındaki hatalardan kaynaklanır. Bir ekip, bir hafta boyunca tek kameradan temiz örnekler toplar; doğrulama sonuçları harika görünür, ancak model ikinci sahada başarısız olur. Veri toplama, başarının üst sınırını belirler: Etiket kalitesi, veri artırma veya hiperparametreler, veri kümesinde hiç bulunmayan bir sahneyi modele öğretemez.
Uygulamalı
Çeşitlilik hacimden önemlidir#
Aynı dağıtım hedefi için hazırlanmış iki veri kümesini karşılaştır:
| Veri kümesi | Doğrulama sonucu | Üretimde |
|---|---|---|
| Bir kameradan yalnızca öğle vakti alınmış, neredeyse birbirinin aynısı 10.000 kare | Yüksek: Doğrulama kareleri eğitim karelerine benziyor | Farklı bir kamerada ve alacakaranlıkta performans düşer |
| Spesifikasyondaki 12 senaryoya dağıtılmış 1.500 kare | Daha sınırlı | Üretim verilerdekine benzediğinden performansını korur |
İlk veri kümesinin doğrulama puanı, doğrulamanın yalnızca kapsadığı tek koşulu ölçmesi nedeniyle yüksektir. Üretimde model, karşılaştığı senaryolar arasında kapsamı en zayıf olan kadar iyidir. Önce spesifikasyonun kapsamını, sonra veri hacmini artırmaya odaklan.
Kaynakları doğru sırayla seç#
Veri kümesinin çoğu gerçek üretim kurulumundan gelmelidir. Veri toplama ve etiketleme kılavuzu her kaynağı daha ayrıntılı ele alır:
| Kaynak | Ne zaman yararlı olur | Ne zaman sakıncalı olur |
|---|---|---|
| Canlı üretim kameraları | Dağıtım ortamına en yakın seçenek | Yavaştır; veri anlaşmaları gerekebilir |
| Arşivlenmiş üretim kamerası görüntüleri | Kısa sürede çok çeşitli veri sağlar | Eski görüntüler mevcut kurulumla uyuşmayabilir |
| Kamuya açık veri kümeleri (COCO, Open Images, VOC) | Yaygın sınıflar için başlangıç verisi oluşturma | Sahnelerinle aranda alan kayması olabilir |
| Sahnelenmiş çekimler | Belirli uç durumları isteğe göre sağlama | Fazla temizdir; aşırı güvenmeye yol açabilir |
| Sentetik veya üretilmiş görüntüler | Bekleyemeyeceğin nadir tehlikeler ve arızalar | Model, üreticinin tarzını öğrenebilir |
| Web'den veri kazıma | Düşük maliyetle çeşitlilik sağlar | Kalite tutarsızdır ve lisans riski taşır |
Spesifikasyondaki belirli ve adı konmuş eksikleri gidermek için sahnelenmiş, kamuya açık ve sentetik görüntüler kullan; işe yarayıp yaramadıklarını ölçebilmek için veri kümesindeki paylarını izle. Ultralytics Platform üzerindeki Benzer görüntüler oluştur özelliği, mevcut bir görüntünün etiketlenmemiş ve etiketlemeye hazır türevlerini veri kümesine ekler.
Meta verileri dosya adına ekle#
Her görüntüde en azından kamera kimliği, çekim günü ve kare veya klip numarası bulunmalıdır. Bunlar olmadan daha sonra gruplara göre ayırma yapamaz, gerilemenin kaynağını izleyemez veya yeterince temsil edilmeyen bir senaryodan daha fazla veri toplayamazsın. En kalıcı taşıyıcı dosya adıdır: cam2_2026-05-01_000124.jpg tüm araçlarda, dışa aktarımlarda ve yüklemelerde korunur. Ultralytics Platform veri kümesi araması dosya adlarıyla özel meta verilerde eşleşme bulur; böylece yüklemeden sonra da bu anahtarlar aranabilir kalır.
Bu betik, kursun geri kalanında kullanılacak alıştırma veri kümesini oluşturur. COCO128'in etiketli görüntülerini kopyalar ve sanki dört kamera bunları dört gün boyunca çekmiş gibi yeniden adlandırır; ayrıca, elverişli bir kamerada genellikle olduğu gibi cam1 fazla örneklenir:
import shutil
from pathlib import Path
from ultralytics.data.utils import check_det_dataset, img2label_paths
data = check_det_dataset("coco128.yaml") # 128 COCO images stand in for your camera captures
out = Path("datasets/practice")
(out / "images").mkdir(parents=True, exist_ok=True)
(out / "labels").mkdir(parents=True, exist_ok=True)
for i, image in enumerate(sorted(Path(data["train"]).glob("*.jpg"))):
camera = ("cam1", "cam1", "cam2", "cam3", "cam4")[i % 5] # cam1 over-collected, like a real site
name = f"{camera}_2026-05-0{i // 32 + 1}_{i:06d}" # camera, capture day, frame number
shutil.copy(image, out / "images" / f"{name}.jpg")
label = Path(img2label_paths([str(image)])[0])
if label.exists():
shutil.copy(label, out / "labels" / f"{name}.txt")
print(len(list((out / "images").glob("*.jpg"))), "images written to", out)128 images written to datasets/practice
Ultralytics Platform'a yükleme, bu dosya adlarını korur. Yükleme iletişim kutusu videoları ve tüm veri kümelerini de kabul eder; ayarlar arasında gizlilik için yüz bulanıklaştırma seçeneği de bulunur.
Kapsamı spesifikasyona göre izle#
Meta veriler dosya adlarında olduğunda kapsamı saymak yeterlidir. Kotaları spesifikasyonuna göre belirle ve betiğin sırada ne toplanması gerektiğini belirtmesini sağla:
from collections import Counter
from pathlib import Path
QUOTA = {"cam1": 30, "cam2": 30, "cam3": 30, "cam4": 30} # images per camera, from your spec
images = sorted(Path("datasets/practice/images").glob("*.jpg"))
cameras = Counter(p.stem.split("_")[0] for p in images)
days = Counter(p.stem.split("_")[1] for p in images)
for camera, quota in QUOTA.items():
gap = quota - cameras[camera]
print(f"{camera}: {cameras[camera]:3d} / {quota} {'ok' if gap <= 0 else f'collect {gap} more'}")
print("days:", dict(sorted(days.items())))cam1: 52 / 30 ok
cam2: 26 / 30 collect 4 more
cam3: 25 / 30 collect 5 more
cam4: 25 / 30 collect 5 more
days: {'2026-05-01': 32, '2026-05-02': 32, '2026-05-03': 32, '2026-05-04': 32}Karar kuralı: Kotayı aşan kaynaklardan veri toplamayı durdur ve çabayı eksiklere yönelt. Burada cam1 zaten görüntülerin %40'ını oluşturuyor. Bu kaynaktan bir hafta daha görüntü almak hacmi artırır, ancak kapsama yeni bir katkı sağlamaz.
Veri kümesini şişirmeden videodan örnek seç#
Video, en ucuz kaynak ve yanlış kullanımı en kolay olanıdır. Saniyede 30 kare hızında bir dakika, neredeyse birbirinin aynısı 1.800 kare üretir; aynı anı iki kez etiketlemek hem maliyetlidir hem de metrikleri şişirir. Yalnızca sahne, tuttuğun son kareden bu yana değiştiğinde yeni bir kareyi sakla:
from pathlib import Path
import cv2
from ultralytics.utils.downloads import safe_download
video = "solutions_ci_demo.mp4" # a short public demo clip; swap in your own footage
safe_download(f"https://github.com/ultralytics/assets/releases/download/v0.0.0/{video}")
Path("frames").mkdir(exist_ok=True)
cap = cv2.VideoCapture(video)
fps = cap.get(cv2.CAP_PROP_FPS)
read = kept = 0
last = None
while True:
ok, frame = cap.read()
if not ok:
break
thumb = cv2.cvtColor(cv2.resize(frame, (64, 64)), cv2.COLOR_BGR2GRAY).astype(float)
if last is None or abs(thumb - last).mean() > 10: # keep a frame only when the scene has changed
cv2.imwrite(f"frames/clip01_{read:06d}.jpg", frame) # the clip ID stays in the filename
kept, last = kept + 1, thumb
read += 1
print(f"{read} frames at {fps:.0f} FPS -> {kept} kept")62 frames at 30 FPS -> 6 keptİki saniyelik klipte 62 kare bulunmasına rağmen görsel olarak farklı yalnızca 6 an var. Betik, küçük gri tonlamalı küçük resimleri karşılaştırır; bu nedenle saatlerce süren görüntülerde bile hızlı çalışır. Sabit kameralardan daha az kare tutmak için 10 eşiğini yükselt; hızlı hareket eden sahnelerde düşür. Bütçeyi klipler arasında da dağıt: 50 klipten 20'şer kare almak, tek klipten 1.000 kare almaktan daha iyidir.
Aralarında bir saniye olan iki kare aynı aydınlatmayı, arka planı ve genellikle aynı nesneleri paylaşır. Hem eğitim hem doğrulama kümesine düşerlerse modelin etkili biçimde gördüğü görüntüler üzerinden puanlanırsın. Klipleri bir arada tutabilmesi için her dosya adında klip kimliğini sakla; böylece Veri Kümesini Doğru Böl bunu yapabilir.
Veri toplarken yapılan hatalardan kaçın#
| Hata | Belirti | Çözüm |
|---|---|---|
| Tek haftada veri toplama | mAP değeri yüksek olur, ancak diğer mevsimlerde veya vardiyalarda nesneler kaçırılır | Veri toplamayı haftalara veya aylara yayın |
| Tek kamera | İkinci kamerada başarısız olur | Kullanıma alacağın her kamera türünden görüntü topla |
| Yalnızca kontrollü koşullarda çekilmiş veriler | Gerçek dünyadaki karmaşık sahnelerde başarısız olur | Kontrollü koşullarda çekilen görüntüleri azınlıkta tut ve sayılarını takip et |
| Yinelenen kareler | Şişirilmiş metrikler, boşa harcanan etiketleme emeği | Sahne değişimine göre örnekle; Ultralytics Platform yükleme sırasında birebir kopyaları da atlar |
| Tek operatör veya vardiya | Planlanmamış görünüm çeşitliliği ve sınıf dengesizliği | Vardiyalardan, sahalardan ve kişilerden örnekler al |
| Nadir durumların eksikliği | En önemli güvenlik olaylarını kaçırır | Hedefli veri toplama, kontrollü çekim veya sentetik veriyle tamamlama |
Önyargı ve rıza#
Önyargı bir modelleme sorunu değil, veri toplama sorunudur: veride hiç yer almayan bir grubu hiçbir hiperparametre telafi edemez. Veri toplama kılavuzu dört yöntem sıralar: çeşitli kaynaklar, dengeli temsil, kapsama alanının düzenli olarak yeniden denetlenmesi ve yeterince temsil edilmeyen grupların fazla örneklenmesi gibi azaltma yöntemleri.
Görüntüler yüz, plaka veya başka kişisel veriler içeriyorsa, veri toplamaya başlamadan önce rıza alman ve bir saklama politikası belirlemen gerekir. Veri gizliliği sözlük maddesi iyi bir başlangıç noktasıdır; dataRegion ile verileri doğru yargı bölgesinde tutmayı Gizlilik, Bölgeler ve Uyumluluk açıklar.
Çözümü göster
Alıştırma veri kümesi için kapsama raporu doğrudan bir plan sunar:
| Kaynak | Sayı / kota | Eylem |
|---|---|---|
cam1 | 52 / 30 | Veri toplamayı durdur; tüm görüntülerin şimdiden %40'ı |
cam2 | 26 / 30 | 4 tane daha topla |
cam3 | 25 / 30 | 5 tane daha topla |
cam4 | 25 / 30 | 5 tane daha topla |
Her kamera dört günün tamamını kapsadığından, açıklar gün başına değil kamera başınadır. Yeni 14 görüntüyü en az iki yeni güne yay; böylece aynı öğleden sonradan daha fazla görüntü yerine yeni bir koşul eklemiş olursun. Açığı karşılayamayan bir kamera için (yalnızca geceleri görüntü alan bir kamera gibi), eksik koşul için gereksinimlere bir satır ekle ve bu açığı kontrollü koşullarda çekilmiş görüntülerin mi yoksa üretilmiş görüntülerin mi kapattığını kaydet; böylece etkisi daha sonra ölçülebilir.