Ultralytics YOLO27: Bekleme listesine katıl.
Get Started
Dersorta düzey

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.

Sonuç

yolo26n-pose.pt modelini coco8-pose.yaml üzerinde eğit ve result.keypoints verilerinden her kişinin sol ve sağ dirsek açılarını hesapla; modelin yeterince güvenmediği eklemleri atla.

Hızlı Başlangıç
Nasıl ilerleyeceğini zaten biliyorsan, işte kısa sürüm.
  1. Etiket satırı: sınıf, kutu (4 değer), ardından her anahtar nokta için x y v; tüm değerler normalize edilir. v 0 (etiketlenmemiş), 1 (örtülü) veya 2 (görünür) değerini alır.

  2. kpt_shape: [K, 3] değerini ve her sol-sağ eşini değiştiren bir flip_idx ayarla.

  3. yolo pose train data=coco8-pose.yaml model=yolo26n-pose.pt epochs=1 imgsz=320.

  4. result.keypoints.xy ve .conf değerlerini oku; eklemleri güven eşiğinin altında kalan hesaplamaları atla.

Uygulamalı

Anahtar nokta etiket satırı#

Üç koşucunun Ultralytics YOLO poz tahmini; her birinde kişi kutusu ve 17 anahtar noktalı vücut iskeleti bulunuyor

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ğerlerAnlamı
0sınıf indeksi (kişi)
0.671279 0.617945 0.645759 0.726859kutu merkezi x, merkez y, genişlik, yükseklik
0.519751 0.381250 2anahtar 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.

Pasta kesen kişilerin üzerinde çizilmiş 17 anahtar noktalı iskeletlerle, COCO8-pose görüntüsündeki Ultralytics Platform açıklama editörü

Konumunu belirleyebildiğin örtülü eklemleri etiketle

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]

Ayakta duran bir kişi üzerinde COCO'nun 17 anahtar noktalı sıralaması; 0 burundan 16 sağ ayak bileğine kadar numaralandırılmış

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:

Bir koşucunun poz artırımları: orijinal, yatay çevirme, döndürme, ölçekleme, HSV renk ve mozaik; her dönüşümün ardından anahtar nokta iskeleti

flip_idx yanlış olduğunda ne olur? Yüklü kaynak kodunda doğrulandığı üzere:

  • Eksik: eğitim bir uyarı verir ve fliplr ile flipud değerlerini 0 olarak ayarlar; böylece en düşük maliyetli artırımı kaybedersin.
  • Uzunluk yanlış: eğitim, uyuşmazlığı belirten bir ValueError ile 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#

COCO8-pose eğitim mozaiği: motosiklet üzerindeki, pembe şemsiyenin altındaki, kaykay parkındaki ve at sırtındaki kişiler; her birinde bir kişi kutusu ve renkli bir anahtar nokta iskeleti

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.326

Segmentasyonda 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 enough

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

Her eklem için güven eşiği uygula

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.

Dene

coco8-pose.yaml üzerinde bir epoch eğitim yap ve kutu ile poz mAP50-95 değerlerini kaydet. Ardından pose.py öğesini sağ dirsek açısını da raporlayacak şekilde genişlet (anahtar noktalar 6, 8, 10) ve otobüs görüntüsünde iki kolu da ölçülebilen kişileri listele.

Tamamlanma ölçütü
Aşağıdakilerin tümü doğru olduğunda dersi tamamlamış olursun.
  • Eğitim tamamlandı ve kutu ile poz mAP50-95 değerlerini kaydettin.

  • Betiğin, güven eşiğinin altındaki kolları atlayarak kişi başına iki dirsek açısını da yazdırıyor.

  • flip_idx eksik, uzunluğu yanlış veya eşleşmeleri hatalı olduğunda ne olduğunu açıklayabilirsin.

Çö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 deg

0. 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.

Sırada ne var

Sonraki derste insan olmayan nesneler için anahtar noktalar tasarlıyor ve OKS'nin bir anahtar noktanın doğru olup olmadığına nasıl karar verdiğini öğreniyoruz.

İlerlemeni kaydetmek için giriş yap