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.
Uygulamalı
Poz: duruşun sinyal olduğu durumlar#

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ı.
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#

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#
| Senaryo | En uygun görev | Neden |
|---|---|---|
| Kaldırımda yürüyen kişileri sayma | Algılama | Yanıt, kişilerin varlığı ve konumudur |
| Bakımevinde düşme algılama | Poz | Sinyal, bedenin yönelimidir |
| Spor salonunda squat tekrarlarını sayma | Poz | Sinyal, diz ve kalça açılarıdır |
| Drone görüntüsünden rıhtıma bağlı tekneleri sayma | OBB | Tekneler çapraz ve birbirine yakın duruyor |
| Üstten görülen konveyördeki paketler | OBB | Yönelim değişiyor ve nesneler birbirine değiyor |
| Sokak seviyesindeki arabalar | Algılama | Arabalar görüntüde yaklaşık dik duruyor |
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.
Çö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 boxesFarkı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.