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.

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.
Uygulamalı
Tanım neden ilk sırada gelir?#

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ır | Yanıtladığı soru | Zayıf | Güçlü |
|---|---|---|---|
| Girdi | Model 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" |
| Karar | Kim, 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:

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 -> ALERTDö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 -> okHerkesin 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.
Ö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#
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".
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şı.
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.
Çö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ı:
productveempty_facingiç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_facingkutusu 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.