Dua task spesialis YOLO: pose estimation untuk deteksi keypoint tubuh manusia (-pose) dan oriented bounding box (-obb) untuk objek berorientasi seperti citra drone/aerial — praktik pose pada video dan deteksi OBB

Episode lalu kita menuntaskan tiga task inti: detect, segment, classify. Kini dua task spesialis yang membuka pintu industri berbeda: pose estimation dan oriented bounding box (OBB).
Kenapa keduanya layak episode sendiri? Karena bounding box biasa punya keterbatasan fundamental yang di industri tertentu fatal: kotak tegak tidak bisa menggambarkan orang yang sedang jongkok atau melayang, dan tidak bisa presisi menutupi kapal yang miring 30 derajat dari udara. Pose menjawab pertanyaan "bagaimana postur tubuhnya?", OBB menjawab "dengan orientasi berapa?" — dua informasi yang mengubah hasil deteksi menjadi sinyal analitik.
Model -pose mendeteksi manusia sekaligus 17 keypoint standar COCO: hidung, mata, telinga, bahu, siku, pergelangan, pinggul, lutut, dan pergelangan kaki — kanan dan kiri. Setiap keypoint punya koordinat (x, y) plus confidence-nya sendiri.
Dari rangkaian keypoint itu lahirlah aplikasi nyata: analisis teknik olahraga, hitungan repetisi gym, deteksi jatuh untuk monitoring lansia, compliance APD di pabrik, sampai motion capture murah.
Pola API-nya identik dengan episode 4–5:
yolo predict model=yolo26n-pose.pt source=workout.mp4 save=TrueStruktur baru yang perlu dicatat: results.keypoints bertipe tensor (N, 17, 2/3) — dimensi ketiga adalah pasangan (x, y) atau (x, y, confidence) sesuai mode. Urutan indeks keypoint mengikuti konvensi COCO (bahu kiri = 5, bahu kanan = 6, dst).
Nilai pose baru "hidup" ketika diubah jadi logika. Contoh klasik: menghitung sudut siku untuk counter push-up:
import math
def angle(a, b, c):
"""Sudut abc dalam derajat (a,b,c = tuple xy)."""
ba = (a[0] - b[0], a[1] - b[1])
bc = (c[0] - b[0], c[1] - b[1])
dot = ba[0] * bc[0] + ba[1] * bc[1]
mag = math.hypot(*ba) * math.hypot(*bc)
return math.degrees(math.acos(max(-1, min(1, dot / mag)))) if mag else 0
# contoh: siku melurus ~170°, menekuk ~60° → transisinya = satu repetisi
print(angle((100, 200), (120, 260), (140, 320)))Kombinasi state machine sederhana ("turun" saat sudut < 90°, "naik" saat > 160°) sudah cukup membangun rep-counter yang akurat — tanpa training apa pun, murni geometri di atas keypoint.
Warning
Keypoint dengan confidence rendah (orang tersembunyi sebagian, blur motion) bisa melompat liar antar frame. Selalu filter via keypoints.conf dan smoothing eksponensial sebelum dipakai untuk logika bisnis — jangan percaya koordinat mentah 100%.
Bounding box axis-aligned selalu sejajar sumbu gambar. Untuk objek diagonal, box biasa membawa banyak area kosong — IoU antar prediksi jadi menyesatkan dan overlap antar objek semu naik. Kasus di mana ini masalah besar:
| Domain | Objek Berorientasi | Masalah Box Biasa |
|---|---|---|
| Citra drone/aerial | Kapal, pesawat, kendaraan | Parkiran miring = box saling tumpang tindih semua |
| Remote sensing | Bangunan, sawah | Bentuk memanjang tak sejajar utara |
| Dokumen scan | Teks miring | Rotasi halaman membuat box meleset |
| Industri port/logistik | Kontainer | Orientasi = data bisnis itu sendiri |
OBB menambahkan satu parameter: sudut rotasi. Satu box kini digambarkan oleh (x_center, y_center, w, h, θ) — presisi mengikuti bentuk objek.
from ultralytics import YOLO
model = YOLO("yolo26n-obb.pt") # pretrained DOTAv1: 15 kelas aerial
results = model.predict(source="port.jpg", conf=0.4, save=True)
r = results[0]
print(r.obb.xywhr) # x, y center + w, h + ROTASI (radian)
print([model.names[int(c)] for c in r.obb.cls]) # misal: ship, ship, ...Perbedaan struktur output: Results.obb menggantikan boxes, dengan properti tambahan xywhr — huruf R terakhir menyimpan rotasi dalam radian. Bobot pretrained -obb dilatih di dataset DOTA (Dataset for Object Detection in Aerial Images): kapal, pesawat, kendaraan, lapangan bola, jembatan, dan lainnya.
Untuk visualisasi manual, polygon keempat sudut box tersedia lewat r.obb.xyxyxyxy — berguna saat menggambar dengan OpenCV cv2.polylines.
Aturan praktis: pakai OBB jika (1) orientasi objek adalah informasi yang dibutuhkan, atau (2) kerapatan objek tinggi sehingga box biasa saling tumpang tindih parah. Jika objek jarang dan orientasi tidak penting — tetap di detection biasa, karena annotation OBB lebih mahal (butuh 8 titik polygon vs 2 titik box).
yolo26n.pt tidak punya head pose/OBB — results.keypoints akan None. Sufiks -pose/-obb wajib.math.degrees).Rangkuman episode ini:
-pose memberikan 17 keypoint COCO per orang — fondasi rep-counter, deteksi jatuh, dan analisis gerakan.results.keypoints berbentuk (N, 17, x/y/conf); filter confidence + smoothing wajib.-obb menambahkan parameter rotasi (xywhr) — solusi untuk aerial/drone/dokumen miring.Di episode 7 kita bahas keputusan yang menghantui setiap project vision: memilih ukuran model n/s/m/l/x — trade-off kecepatan vs akurasi, strategi mulai dari nano lalu scale-up, plus cara benchmark yang adil di dataset kalian sendiri. Sampai jumpa!