Poz Modellerini Etiketle ve Eğit
Görünürlük bilgisiyle anahtar nokta etiketleri oluştur, kpt_shape ve flip_idx değerlerini doğru ayarla, COCO8-pose üzerinde eğitim yap ve anahtar noktaları güven eşiğine bağlı eklem açılarına dönüştür.
Poz tahmini, her kişiyi numaralandırılmış 17 noktaya dönüştürür; ürünlerin sattığı ölçümler de bu noktalardan elde edilir: ergonomi için dirsek açıları, rehabilitasyon için diz açıları, düşme tespiti için kalça yüksekliği. İki veri kümesi anahtarı, bu noktalara güvenilip güvenilemeyeceğini belirler. Bunlardan birini bile yanlış ayarlamak hata üretmez; yalnızca sağla solu karıştıran veya en ucuz veri artırma yöntemini sessizce kullanmadan eğitim yapan bir model elde edersin.
Uygulamalı
Anahtar nokta etiket satırı#

Poz etiketi satırı, sonuna anahtar noktalar eklenmiş bir tespit satırıdır. Her koordinat 0–1 aralığına normalize edilir ve anahtar noktalar her satırda aynı sabit sırada yer alır. Gerçek bir COCO8-pose satırının ilk dört anahtar noktadan sonra kısaltılmış hâli:
0 0.671279 0.617945 0.645759 0.726859 0.519751 0.381250 2.000000 0.550936 0.348438 2.000000 0.488565 0.367188 2.000000 0.642412 0.354687 2.000000 ...| Değerler | Anlamı |
|---|---|
0 | sınıf indeksi (kişi) |
0.671279 0.617945 0.645759 0.726859 | kutu merkezi x, merkez y, genişlik, yükseklik |
0.519751 0.381250 2 | anahtar nokta 0 (burun): x, y, görünürlük |
| … | Aynı düzeni izleyen 16 anahtar nokta daha: satır başına 5 + 17 × 3 = 56 değer |
Görünürlük bayrağı COCO kuralını izler: 2 görünür, 1 etiketlenmiş ancak örtülü, 0 etiketlenmemiş. Ultralytics, kayıp hesabında v = 0 değerine sahip anahtar noktaları maskeler; böylece eksik bir bilek, modele bilekleri (0, 0) konumunda tahmin etmeyi öğretmez.

Konumunu güvenle belirleyebildiğin örtülü bir eklem için 1 kullan — örneğin masanın arkasındaki bir kalça veya sırtın arkasındaki bir bilek; bu eklem yine de eğitime katkı sağlar. 0 değerini, kimsenin yerini belirleyemeyeceği eklemler için ayır. Gizli tüm eklemleri 0 olarak etiketlemek, modelin ihtiyaç duyduğu zorlu örnekleri tam da ortadan kaldırır.
Poz veri kümesi kılavuzu, görünürlük bilgisi içermeyen veri kümeleri için iki değerli değişkeni de (x y yalnızca, kpt_shape: [K, 2]) ele alıyor.
kpt_shape ve flip_idx#
Veri kümesi YAML dosyası, olağan path, train, val ve names değerlerine iki anahtar ekler:
kpt_shape: [17, 3] # 17 keypoints, each x, y, visibility
flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]
flip_idx, yatay çevirme veri artırma işleminin ayna görüntüsünde her anahtar noktanın hangisine dönüşeceğini belirtir. Bir kişiyi aynaladığında sol bileği (9), sağ bileğin (10) bulunduğu konuma gelir; bu nedenle flip_idx dizisinin 9. konumunda 10, 10. konumunda 9 bulunur; burun (0) ise kendisiyle eşleşir. Her veri artırma işlemi iskeleti piksellerle birlikte taşır; dizin eşlemesini gerektiren tek işlem yatay çevirmedir:

flip_idx yanlış olduğunda ne olur? Yüklü kaynak kodunda doğrulandığı üzere:
- Eksik: eğitim bir uyarı verir ve
fliplrileflipuddeğerlerini 0 olarak ayarlar; böylece en düşük maliyetli artırımı kaybedersin. - Uzunluk yanlış: eğitim, uyuşmazlığı belirten bir
ValueErrorile durur — tek açık hata budur. - Uzunluk doğru, eşleşmeler yanlış: hiçbir uyarı verilmez. Çevrilmiş örneklerin yarısı modele solun sağ olduğunu öğretir ve doğrulama görüntülerinde simetrik pozlarda sağ-sol değişimleri görülür.
COCO8-pose üzerinde eğitim yap#

from ultralytics import YOLO
model = YOLO("yolo26n-pose.pt")
model.train(data="coco8-pose.yaml", epochs=1, imgsz=320, device="cpu")
metrics = model.val()
print(f"box mAP50-95: {metrics.box.map:.3f}")
print(f"pose mAP50-95: {metrics.pose.map:.3f}") Class Images Instances Box(P R mAP50 mAP50-95) Pose(P R mAP50 mAP50-95)
all 4 14 1 0.783 0.893 0.643 0.966 0.571 0.575 0.326
box mAP50-95: 0.643
pose mAP50-95: 0.326Segmentasyonda olduğu gibi tabloda da iki blok vardır. Box, kişi kutularını puanlar; Pose, aynı mAP mekanizması içinde Anahtar Nokta Benzerliği (OKS) ile anahtar noktaların yerleşimini puanlar. Pose mAP50-95, bir poz ürünü için sürüm yayımlama eşiğidir — sonraki derste OKS'nin bir anahtar noktanın doğru olup olmadığına nasıl karar verdiği gösteriliyor.
Anahtar noktalardan eklem açılarına#
result.keypoints, COCO sıralamasında xy (N × K × 2, piksel), xyn (normalize edilmiş) ve conf (N × K) değerlerini tutar. Bir eklemin açısı, orada birleşen iki uzuv vektörü arasındaki açıdır — nokta çarpımı:
import numpy as np
from ultralytics import YOLO
model = YOLO("yolo26n-pose.pt")
result = model("https://ultralytics.com/images/bus.jpg")[0]
kpts = result.keypoints.cpu().numpy() # people x 17 x (x, y, conf)
SHOULDER, ELBOW, WRIST = 5, 7, 9 # left arm, COCO keypoint order
for person, (xy, conf) in enumerate(zip(kpts.xy, kpts.conf)):
if conf[[SHOULDER, ELBOW, WRIST]].min() < 0.5:
print(f"person {person}: left arm not visible enough")
continue
a, b, c = xy[SHOULDER], xy[ELBOW], xy[WRIST]
cos = np.dot(a - b, c - b) / (np.linalg.norm(a - b) * np.linalg.norm(c - b))
print(f"person {person}: left elbow angle {np.degrees(np.arccos(cos)):.0f} deg")person 0: left elbow angle 71 deg
person 1: left elbow angle 96 deg
person 2: left elbow angle 59 deg
person 3: left arm not visible enough
person 4: left arm not visible enoughSatır satır: kpts.xy[p], p kişisinin piksel cinsinden 17 noktasını içerir; a - b ve c - b, dirsekten başlayan vektörler olarak üst kolu ve ön kolu gösterir; normalize edilmiş nokta çarpımları aralarındaki açının kosinüsüdür. Düz bir kol yaklaşık 180°, tamamen bükülmüş bir kol ise yaklaşık 30° gösterir. 3. ve 4. kişilerin en az bir sol kol ekleminin güven değeri 0.5'in altında olduğundan betik bu kişilerin ölçümünü yapmaz.
Belirti: Kolları kadraj dışında kalan kişiler için güvenilir görünen açılar. Neden: Model, örtülü olsun veya olmasın her anahtar nokta için koordinat döndürür. Çözüm: Eklemleri güven tabanının altında kalan her hesaplamayı atla (burada 0.5) ve ne sıklıkta atladığını kaydet — atlama oranının artması kamera veya aydınlatma değişikliğinin erken bir işaretidir.
Çözümü göster
import numpy as np
from ultralytics import YOLO
ARMS = {"left": (5, 7, 9), "right": (6, 8, 10)} # shoulder, elbow, wrist
kpts = YOLO("yolo26n-pose.pt")("https://ultralytics.com/images/bus.jpg")[0].keypoints.cpu().numpy()
for person, (xy, conf) in enumerate(zip(kpts.xy, kpts.conf)):
for side, (s, e, w) in ARMS.items():
if conf[[s, e, w]].min() < 0.5:
continue
a, b, c = xy[s], xy[e], xy[w]
cos = np.dot(a - b, c - b) / (np.linalg.norm(a - b) * np.linalg.norm(c - b))
print(f"person {person}: {side} elbow {np.degrees(np.arccos(cos)):.0f} deg")person 0: left elbow 71 deg
person 0: right elbow 94 deg
person 1: left elbow 96 deg
person 2: left elbow 59 deg
person 2: right elbow 135 deg0. ve 2. kişilerin iki kolu da ölçülebilir. 1. kişinin sağ kolu ile 3. ve 4. kişilerin her iki kolu da 0.5 güven eşiğinin altında kalır; bu nedenle betik tahminde bulunmak yerine bu kolları atlar.
flip_idx eksikse uyarı verilerek çevirme artırımı devre dışı bırakılır; uzunluk yanlışsa eğitim bir ValueError ile durur; geçerli görünen ancak eşleşmeleri yanlış olan bir flip_idx, yansıtılmış etiketlerle sessizce eğitim yapar ve doğrulamada sağ-sol değişimleri olarak ortaya çıkar.