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

Poz Tahmini ve OBB

YOLO26 anahtar noktalarını ve döndürülmüş kutuları oku, her birinin üzerine bir kural yaz ve asıl sinyalin duruş mu yoksa açı mı olduğunu belirle.

Bir bakımevinin birinin ne zaman düştüğünü bilmesi gerekir; bir limanınsa drone görüntüsünde yan yana sıkışmış gemileri sayması. Standart kutular her iki durumda da yetersiz kalır: Bir kutu kişinin dik durup durmadığını göstermez; çapraz duran bir geminin etrafındaki dik kutu da çoğunlukla suyu kapsar. Poz tahmini ve OBB tam da bu iki sorun için geliştirilmiştir.

Sonuç

YOLO26 anahtar noktalarından bir duruş kuralı yaz ve döndürülmüş kutuların hava görüntülerinde ne kazandırdığını ölç.

Hızlı Başlangıç
Nasıl ilerleyeceğini zaten biliyorsan, işte kısa sürüm.
  1. Poz: kişi başına bir kutu ve 17 anahtar nokta (COCO sırası: 0 burun, 5–6 omuzlar, 11–12 kalçalar, 15–16 ayak bilekleri).

  2. Kullanmadan önce anahtar noktaları güven değerine göre filtrele; gizli eklemler de koordinat alır.

  3. OBB: merkez, boyut ve açı (xywhr, açı radyan cinsindendir).

  4. Duruş sinyal olduğunda poz, nesneler üstten görünümde açılı durduğunda OBB kullan; diğer durumlarda nesne algılama kullan.

Uygulamalı

Poz: duruşun sinyal olduğu durumlar#

Ultralytics YOLO poz tahmininden kişi kutusu ve 17 ana noktalı iskeletle işaretlenmiş, sahil yolunda koşan üç kişi

Bir poz modeli, her kişi için bir kutu ve sabit bir anahtar nokta listesi döndürür. COCO-Pose ile eğitilen modeller kişi başına 17 nokta tahmin eder: burun, gözler, kulaklar, omuzlar, dirsekler, bilekler, kalçalar, dizler ve ayak bilekleri. Bunlar her zaman aynı sıradadır; dolayısıyla 0. indeks burun, 11 sol kalça ve 15 sol ayak bileğidir. Her anahtar noktanın ayrıca bir güven değeri vardır.

En basit işe yarar kural şudur: Ayakta duran bedenin boyu eninden uzundur; yerde yatan bedenin eni boyundan uzundur. İşte otobüs görüntüsünde, yalnızca modelin emin olduğu anahtar noktalar kullanılarak uygulaması:

from ultralytics import YOLO

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

for xy, conf in zip(result.keypoints.xy, result.keypoints.conf):
    visible = xy[conf > 0.5]  # drop keypoints the model couldn't see
    width = float(visible[:, 0].max() - visible[:, 0].min())
    height = float(visible[:, 1].max() - visible[:, 1].min())
    posture = "unknown" if len(visible) < 5 else "lying" if width > height else "upright"
    print(f"{len(visible):2d}/17 keypoints visible, body {width:3.0f} px wide x {height:3.0f} px tall -> {posture}")
16/17 keypoints visible, body 117 px wide x 427 px tall -> upright
 6/17 keypoints visible, body  80 px wide x 359 px tall -> upright
16/17 keypoints visible, body  91 px wide x 384 px tall -> upright
 1/17 keypoints visible, body   0 px wide x   0 px tall -> unknown
 2/17 keypoints visible, body   3 px wide x   6 px tall -> unknown

Üç kişi açıkça dik duruyor. Son iki satır, sol kenardan kesilmiş kişiyi ve güven değeri düşük bir kopyayı gösteriyor: Görünen bir ya da iki anahtar noktayla karar vermek mümkün değil; bu yüzden kural tahmin yürütmek yerine "bilinmiyor" diyor. Üretim ortamındaki bir düşme algılayıcı, takip yoluyla süreyi de hesaba katar: hızlı bir düşüşün ardından birkaç saniyeden uzun süre yerde yatmayı.

Gizli eklemlerin de koordinatları vardır

Belirti: bilekleri havada duran iskeletler ve yarısı görünür kişilerde çalışan duruş kuralları. Neden: keypoints.xy, modelin göremediği noktalar da dahil olmak üzere 17 anahtar noktanın tümü için konum döndürür. Çözüm: yukarıdaki gibi keypoints.conf ile filtrele ve herhangi bir karar vermeden önce görünür anahtar noktaların asgari sayıda olmasını şart koş.

Yanıt bedenin ne yaptığına bağlı olduğunda poz kullanmak anlamlıdır: iş güvenliği için düşme veya beli bükerek yük kaldırma, sporda eklem açıları ve tekrar sayıları (örneğin antrenman takibi) ya da hayvancılıkta duruş ve özel bir anahtar nokta düzenine sahip parçalardaki sabit işaret noktaları. "Burada bir kişi var mı?" sorusunu yanıtlamak için standart nesne algılama kullan.

OBB: açının önemli olduğu durumlar#

Hava görüntüsünde farklı açılarda demirlemiş üç yatın her biri, Ultralytics YOLO OBB tarafından sıkı bir döndürülmüş kutuyla çevrelenmiş

Standart bir kutunun kenarları görüntüye paraleldir. Bir yönlendirilmiş sınırlayıcı kutu dönüş ekler; dönüş merkez, genişlik, yükseklik ve açı olarak saklanır (xywhr). Uydu, drone ve üstten bakan konveyör kameralarından alınan görüntülerde nesneler her açıda durur; çapraz bir nesnenin etrafındaki dik kutu çoğunlukla arka planı kapsar; yukarıdaki yatlarda da bu görülüyor. Bir marina drone görüntüsünde farkı ölç:

from ultralytics import YOLO

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

obb = result.obb
rotated_area = obb.xywhr[:, 2] * obb.xywhr[:, 3]  # width x height of each rotated box
x1, y1, x2, y2 = obb.xyxy.T  # the axis-aligned box that would enclose the same object
upright_area = (x2 - x1) * (y2 - y1)

print(f"{len(obb)} objects, classes: {sorted({result.names[int(c)] for c in obb.cls})}")
cx, cy, w, h, angle = obb.xywhr[0].tolist()
print(f"first box: center=({cx:.0f}, {cy:.0f}) size={w:.0f}x{h:.0f} angle={angle:.2f} rad")
ratio = float((upright_area / rotated_area).median())
print(f"an axis-aligned box would be {ratio:.1f}x larger (median)")
173 objects, classes: ['harbor', 'ship']
first box: center=(619, 850) size=33x108 angle=-0.25 rad
an axis-aligned box would be 2.1x larger (median)

Dik bir kutu, aynı teknenin etrafındaki döndürülmüş kutunun yaklaşık iki katı alanı kaplar; fazladan alan sudur. Bunun iki zararı vardır: NMS, yan yana teknelerin dik kutularının üst üste geldiğini görerek gerçekte var olan tekneleri bastırabilir ve boyut tahminleri şişer. DOTA gibi hava görüntüsü veri kümeleriyle eğitilen OBB modelleri bu sahneleri doğrudan ele alır. Açının radyan cinsinden olduğunu unutma: -0.25 rad yaklaşık -14°'dir.

Nesne algılama, poz ve OBB arasında seçim#

SenaryoEn uygun görevNeden
Kaldırımda yürüyen kişileri saymaAlgılamaYanıt, kişilerin varlığı ve konumudur
Bakımevinde düşme algılamaPozSinyal, bedenin yönelimidir
Spor salonunda squat tekrarlarını saymaPozSinyal, diz ve kalça açılarıdır
Drone görüntüsünden rıhtıma bağlı tekneleri saymaOBBTekneler çapraz ve birbirine yakın duruyor
Üstten görülen konveyördeki paketlerOBBYönelim değişiyor ve nesneler birbirine değiyor
Sokak seviyesindeki arabalarAlgılamaArabalar görüntüde yaklaşık dik duruyor
Poz ve OBB, algılamaya eklenen tek bir şeyden ibarettir

Poz, her kutuya anahtar noktalar ekler; OBB ise açı ekler. Kodun anahtar noktaları veya açıyı hiç okumuyorsa standart bir algılayıcıyı etiketlemek daha hızlıdır, çalıştırması daha hızlıdır ve hata ayıklaması daha kolaydır.

Dene

Marina görüntüsünde çözümdeki karşılaştırmayı çalıştır: COCO ile önceden eğitilmiş algılayıcıyı OBB modeliyle karşılaştır. İki sayımı da kaydet; ardından farkın ne kadarının kutu geometrisinden, ne kadarının her modelin eğitim aldığı veriden kaynaklandığını açıklayan tek bir cümle yaz. Son olarak kendi çalışmalarından pozun veya OBB'nin standart nesne algılamadan daha iyi olacağı bir sorun ve kodunun uygulayacağı kuralı belirt.

Tamamlanma ölçütü
Aşağıdakilerin tümü doğru olduğunda dersi tamamlamış olursun.
  • boats.jpg için iki sayım da elinde ve aradaki farkı açıklayan tek cümlen hazır.

  • Duruş kuralında gizli anahtar noktaları filtreleyen satırı gösterebilir ve neden gerekli olduğunu açıklayabilirsin.

  • Çalışmalarından poz veya OBB için uygun bir sorunu ve kodunun uygulayacağı kuralı belirttin.

Çözümü göster
from ultralytics import YOLO

image = "https://ultralytics.com/images/boats.jpg"
upright = YOLO("yolo26n.pt")(image, verbose=False)[0]
rotated = YOLO("yolo26n-obb.pt")(image, verbose=False)[0]
print(f"axis-aligned detector: {len(upright.boxes)} boxes")
print(f"OBB model: {len(rotated.obb)} rotated boxes")
axis-aligned detector: 0 boxes
OBB model: 173 rotated boxes

Farkın büyük bölümü geometriden değil, eğitim verisinden kaynaklanıyor. yolo26n.pt, teknelerin çoğunlukla yandan fotoğraflandığı COCO ile eğitildi; varsayılan eşikte yukarıdan bakıldığında hiçbir şey bulmuyor (eşiği conf değerine, yani 0.05'e düşürürsen birkaçını şişe olarak algılıyor). OBB modeli hava görüntüleriyle eğitildi. Bunun yanında geometri de önem taşıyor: Hava görüntülerindeki teknilerle eğitilmiş bir algılayıcı bile yaklaşık iki kat büyük kutular çizer ve sıkışık sıralarda NMS ile sorun yaşar. Hem görev hem de eğitim verisi, dağıtım ortamındaki görüntüyle eşleşmelidir.

Sırada ne var

Marina örneği, eğitim verisinin görev kadar önemli olduğunu gösterdi. Sırada: veri kümesinin dağıtım yapacağın dünyayı yansıtıp yansıtmadığını kontrol etmek var.

İlerlemeni kaydetmek için giriş yap