Ultralytics YOLO27: Bekleme listesine katıl.
Get Started
Bilgisayarlı Görünün Temelleri·Problemi Tanımla·Ders 1/10
Dersbaşlangıç düzeyi

Problemi Tanımla

Belirsiz bir ürün fikrini üç satırlık görev tanımına dönüştür ve iş kuralını, yeniden eğitim yapmadan değiştirebileceğin kodda tut.

Yukarıdan görülen, güneşli bir şehir kavşağı; yayaların, bisikletlilerin, bir otobüsün ve otomobillerin üzerinde Ultralytics YOLO kutuları

Sonuçlanmayan bilgisayarlı görü projelerinin çoğunda baştan net bir soru yoktur. "Güvenli olmayan davranışı algıla" bir gereksinim gibi görünür, ancak bir etiketleyici bunu etiketleyemez, model bunu öğrenemez ve hiç kimse ne zaman işe yaradığını anlayamaz. Üç satırlık bir tanım bunu bir öğleden sonra içinde çözer; ayrıca hangi görevi eğiteceğine, neyi etiketleyeceğine ve hangi metriği raporlayacağına karar verir.

Sonuç

Üç satırlık bir görev tanımı yaz (girdi, çıktı, karar) ve YOLO26 çıktısını okuyan kodla kararı uygula.

Hızlı Başlangıç
Nasıl ilerleyeceğini zaten biliyorsan, işte kısa sürüm.
  1. Girdi: kaynak, çözünürlük, kare hızı ve sahne.

  2. Çıktı: bir veri türü — etiket, kutular, maskeler, kilit noktaları veya piksel başına bir harita — asla bir fiil değil.

  3. Karar: kimin, ne zaman ve hangi kurala göre harekete geçeceği.

  4. Çıktı satırının sahibi modeldir. Karar satırı ise yeniden eğitim yapmadan değiştirebileceğin koddur.

  5. Kurala güvenmeden önce gerçek çıktı üzerinde test et: görüntüdeki örtüşme, fiziksel yakınlık anlamına gelmez.

Uygulamalı

Tanım neden ilk sırada gelir?#

0'dan 4'e bilgisayarlı görü proje adımları: temel oluşturma, veri toplama ve hazırlama, özellik mühendisliği ve model geliştirme, model dağıtımı ve model izleme

Bir bilgisayarlı görü projesinin her adımı, hedefini 0. adımdan devralır. Belirsiz bir soru, belirsiz bir veri kümesine, anlaşamayan etiketleyicilere ve yanlış şeyi ölçen bir metriğe yol açar — 2. adımda ne kadar eğitim yaparsan yap bunu düzeltemezsin.

Üç satır#

Görev tanımı, her satırda bir cümle olacak şekilde üç cümleden oluşur. Her cümle, projedeki farklı bir kişinin soracağı bir soruyu yanıtlar:

SatırYanıtladığı soruZayıfGüçlü
GirdiModel ne görüyor?"Kamera görüntüleri""12 tavan kamerasından saniyede 5 kare hızında alınan 1920×1080 kareler"
ÇıktıHangi veriler döndürülüyor?"Güvenlik sorunlarını algıla""forklift ve person için kutular; her birine bir güven puanı eşlik eder"
KararKim, ne zaman harekete geçecek?"Güvenliği artır""Forklift ile bir kişi 2 saniye boyunca 2 m mesafede olduğunda vardiya amirine bildirim gönder"

Çıktı satırına en çok özen gösterilmelidir; çünkü veri türü görevi belirler:

Yan yana yedi Ultralytics YOLO görevinin çıktıları: nesne algılama, poz, bölütleme, sınıflandırma, OBB, anlamsal bölütleme ve derinlik

Tüm görüntüye ait tek bir etiket, sınıflandırma demektir; kutular nesne algılama, dış hatlar bölütleme, eklemler poz, döndürülmüş kutular OBB, piksel başına sınıf veya mesafe ise anlamsal bölütleme ya da derinlik demektir. Sonraki derste yedi görevin tamamını ele alacağız.

Uygulamalı örnek: modeli ve kuralı birbirinden ayır#

"Depo alanında forkliftlerin tehlikeli bir şey yaptığı durumları bilmek istiyoruz."

Bu cümle bir görev değil, bir projedir. İki işi birbirine karıştırır: forkliftleri ve insanları bulmak — piksellerle ilgili iş — ve neyin tehlikeli sayılacağına karar vermek — politikayla ilgili iş. Bunları ayır:

Yalnızca algılayıcı modeldir. Baklava dilimi sıradan bir koddur. Bu ayrımı hemen deneyebilirsin: bus.jpg içinde forklift yok, ancak bir otobüs ve dört kişi aynı testi yapmaya yeter. İlk kural şöyle der: "Bir kişinin kutusu, bir aracın kutusuyla %30'dan fazla örtüştüğünde uyarı ver":

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", verbose=False)[0]

# The model's job ends here: a class, a box, and a confidence per object.
people = [b.xyxy[0].tolist() for b in result.boxes if result.names[int(b.cls)] == "person"]
vehicles = [b.xyxy[0].tolist() for b in result.boxes if result.names[int(b.cls)] == "bus"]

def share_inside(a, b):
    """Fraction of box a's area that lies inside box b."""
    w = max(0, min(a[2], b[2]) - max(a[0], b[0]))
    h = max(0, min(a[3], b[3]) - max(a[1], b[1]))
    return w * h / ((a[2] - a[0]) * (a[3] - a[1]))

# The decision rule is plain code: change the policy without retraining.
ALERT_SHARE = 0.30
for person in people:
    share = max(share_inside(person, v) for v in vehicles)
    print(f"person at x={person[0]:3.0f}: {share:4.0%} inside the bus box -> {'ALERT' if share > ALERT_SHARE else 'ok'}")
person at x= 49:  70% inside the bus box -> ALERT
person at x=223:  76% inside the bus box -> ALERT
person at x=670:  70% inside the bus box -> ALERT
person at x=  0:  62% inside the bus box -> ALERT

Dört uyarının hepsi yanlış: insanlar, park halindeki otobüsün önündeki kaldırımda. Algılayıcı her kutu konusunda doğru; kural ise yanlış, çünkü 2B görüntüdeki örtüşme, iki şeyin gerçek dünyada birbirine yakın olduğu anlamına gelmez. Kural kod olduğuna göre çözüm de koddur. Her kişinin ayaklarının yere değdiği noktayı otobüsün tekerlek hizasıyla karşılaştır:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", verbose=False)[0]
people = [b.xyxy[0].tolist() for b in result.boxes if result.names[int(b.cls)] == "person"]
vehicles = [b.xyxy[0].tolist() for b in result.boxes if result.names[int(b.cls)] == "bus"]

def same_ground_line(person, vehicle, tolerance=40):
    """True when the person's feet are level with the vehicle's wheels and inside its width."""
    feet_x, feet_y = (person[0] + person[2]) / 2, person[3]
    return vehicle[0] < feet_x < vehicle[2] and abs(feet_y - vehicle[3]) < tolerance

for person in people:
    alert = any(same_ground_line(person, v) for v in vehicles)
    print(f"person at x={person[0]:3.0f}: feet y={person[3]:.0f}, bus wheels y={vehicles[0][3]:.0f} -> {'ALERT' if alert else 'ok'}")
person at x= 49: feet y=902, bus wheels y=751 -> ok
person at x=223: feet y=861, bus wheels y=751 -> ok
person at x=670: feet y=880, bus wheels y=751 -> ok
person at x=  0: feet y=871, bus wheels y=751 -> ok

Herkesin ayakları tekerlek hizasının 110–150 piksel altında; yani otobüsten daha yakında, kameraya doğru duruyorlar. Yeniden eğitim yok, yeniden etiketleme yok: algılayıcı sabit kalırken güvenlik ekibi kuralı iyileştiriyor. Üretim sürümünde ayakların konumu, kalibre edilmiş bir kamerayla zemin koordinatlarına dönüştürülür ve nesne takibi aracılığıyla 2 saniyelik kalıcılık eklenir — yine aynı kutuların üzerinde çalışan kod.

Politikayı modelin dışına taşı

Öznel ifadeler — "güvensiz", "kusurlu", "şüpheli", "VIP" — model çıktısını okuyan kodda yer almalı. Model, piksellerle ilgili soruları yanıtlar. İki uzman bir etiket üzerinde tartışacaksa bu tartışma, sürümleyebileceğin, test edebileceğin ve değiştirebileceğin bir kurala ait.

Yaygın Hatalar#

Çıktı satırı bir eylem fiili olsun

Belirti: spesifikasyonda "güvenlik sorunlarını algıla" veya "sahneyi anla" yazıyor ve etiketleyiciler ne çizmeleri gerektiğini soruyor. Çözüm: çıktıyı adlandırılmış sınıfları olan bir veri türü olarak yeniden yaz: "forklift ve person için kutular".

Göstermesi zor bir sınıf

Belirti: aynı karede iki etiketleyicinin farklı etiketlediği suspicious_behavior veya dangerous gibi bir sınıf. Çözüm: bunu görünür kanıtlarla değiştir — kısıtlı bir bölgede bulunan kişi, açık tutulan bir kapı — ve değerlendirmeyi karar satırına taşı.

Çıktı bir cümle ya da tahmin

Belirti: "neler olduğunu açıkla" (resim açıklama) veya "forkliftin birine çarpıp çarpmayacağını tahmin et" (tahminleme). Çözüm: önce nesnelerin konumunu belirle, ardından üzerine izleme ve hareket kuralları ekle. Tahminden önce nesne algılayıcıyı oluştur.

Tanımdan başarı ölçütlerine#

Tanım, modelin ne yaptığını belirtir; yeterince iyi olmanın ne anlama geldiğini veya bir hatanın yanlış alarma kıyasla ne kadara mal olduğunu değil. Yüksek Performanslı YOLO Veri Kümeleri içindeki İş Hedefiyle Başla bölümü, tanımı ölçülebilir hedeflere dönüştürür. Bu kurstaki sonraki her ders, üç satırına geri döner.

Dene

Kendi projen için — ya da boş raf alanlarını işaretlemesi gereken bir mağaza kamerası için — üç satırlık tanımı yaz. Her satırı tek cümleyle sınırla. Ardından karar satırında modelin piksellerde göremediği tüm sözcükleri listele ve kararı model çıktısı üzerinde çalışan tek satırlık bir kural olarak yaz (sözde kod da olur).

Tamamlanma ölçütü
Aşağıdakilerin tümü doğru olduğunda dersi tamamlamış olursun.
  • Girdi satırında kaynak, çözünürlük ve kare hızı belirtiliyor.

  • Çıktı satırında fiil değil, adı belirlenmiş sınıfları olan bir veri türü yer alıyor.

  • Kararın, çıktı üzerinde çalışan bir kural olarak yazılıyor ve öznel tüm sözcükler sınıf adında değil, bu kuralda yer alıyor.

Çözümü göster

Raf kamerası için bir tanım:

  • Girdi: tek bir koridora bakan sabit kameradan her 60 saniyede bir alınan 1920×1080 hareketsiz görüntü.
  • Çıktı: product ve empty_facing için sınırlayıcı kutular (ürün bulunmayan bir raf gözü); her birine bir güven puanı eşlik eder.
  • Karar: mağazanın açık olduğu saatlerde aynı raftaki üç veya daha fazla empty_facing kutusu art arda beş hareketsiz görüntü boyunca devam ederse yeniden stoklama görevi oluştur.

Modelin göremediği sözcükler yeniden stoklama görevi, aynı raf, beş görüntü boyunca devam etme ve mağaza saatleri. Kural şöyle yazılır:

if count(empty_facing on shelf S) >= 3 in each of the last 5 stills and store_is_open(now):
    create_restock_task(shelf=S)

Mağaza, tek bir görüntüyü bile yeniden etiketlemeden "3" değerini, "5" değerini veya açılış saatlerini değiştirebilir.

Sırada ne var

Sırada: Ultralytics YOLO'nun desteklediği yedi görev ve çıktı satırını bunlardan tam olarak biriyle eşleştirme.

İlerlemeni kaydetmek için giriş yap