Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

Bölüm 7 · Görüntü işleme · Ders 30

Düşme tespiti: iskeletten alarma

Gövde açısı, kalça yüksekliği ve zaman penceresiyle kural

Veri. Hastane odasındaki kamera ve bakım robotu, hastayı 26 saniye boyunca izliyor. Poz tahmini modeli saniyede 10 kez yedi iskelet noktası veriyor: baş, omuz ortası, kalça ortası, iki diz, iki ayak (her biri ±1,5 cm gürültülü). Hasta yürüyor, yerden bir şey almak için derin eğiliyor, sandalyeye oturuyor, kalkıyor ve 18. saniyede düşüyor. Robot yalnız gerçek düşmede hemşireyi çağırmalı.

poz tahmini: 7 iskelet noktası, saniyede 10 kezaçı > 60° · kalça < 0,5 · 2,0 s yerde
1 / 133
dusme.pypython
  1. import numpy as np
  2. rng = np.random.default_rng(3)
  3. FPS, ANG, WIN = 10, 60, 20 # kare/s, açı eşiği °, pencere (kare)
  4. kt = [5, 5.6, 6.6, 7.3, 10.5, 11.1, 14, 14.6, 18, 18.7] # anahtar anlar (s)
  5. kth = [5, 75, 75, 5, 5, 25, 25, 5, 5, 88] # gövde açısı (°)
  6. kh = [.92, .4, .4, .92, .92, .42, .42, .92, .92, .12] # kalça yüksekliği (m)
  7. t = np.arange(0, 26, 1 / FPS)
  8. th = np.radians(np.interp(t, kt, kth))
  9. hip = np.stack([0 * t, np.interp(t, kt, kh)], 1) # kalça ortası
  10. sh = hip + 0.5 * np.stack([np.sin(th), np.cos(th)], 1) # omuz ortası
  11. hip += rng.normal(0, 0.015, hip.shape) # poz tahmini gürültüsü
  12. sh += rng.normal(0, 0.015, sh.shape)
  13. d = sh - hip # gövde vektörü
  14. ang = np.degrees(np.arctan2(np.abs(d[:, 0]), d[:, 1])) # dikeyden açı
  15. ratio = hip[:, 1] / np.median(hip[:20, 1]) # ayakta duruşa oran
  16. drop = np.r_[0, 0, 0, hip[:-3, 1] - hip[3:, 1]] * FPS / 3 # iniş hızı m/s
  17. low = (ang > ANG) & (ratio < 0.5) # yerde mi?
  18. n, last = 0, -99 # sayaç, son hızlı iniş
  19. history = {'t': [], 'ang': [], 'ratio': [], 'drop': [], 'count': []} # kare kare geçmiş
  20. for i in range(len(t)):
  21. if drop[i] > 0.6: last = i # hızlı iniş
  22. n = n + 1 if low[i] and (n or i - last <= 15) else 0 # yerde kalma sayacı
  23. r = [round(t[i], 1), ang[i], ratio[i], drop[i], n]
  24. for k, v in zip(history, r): history[k].append(float(v))
  25. if n == WIN: print(f'ALARM: t = {t[i]:.1f} s')
  26. print('eğilmede yerde kare:', low[50:75].sum(), '<', WIN)
  27. y = t >= 18 # gerçek: düşme anı ve sonrası
  28. pred = np.array(history['count']) >= WIN # kuralın kararı
  29. tp = (pred & y).sum(); p, r = tp / max(pred.sum(), 1), tp / y.sum()
  30. for k, v in [('precision', p), ('recall', r), ('f1', 2 * p * r / max(p + r, 1e-9))]: # son ölçümler
  31. print(f'{k:<10}{v:>8.3f}')
  32. import csv
  33. with open('egitim_gecmisi.csv', 'w', newline='') as f: # satır başına bir kare
  34. csv.writer(f).writerows([list(history), *zip(*history.values())])
  35. try:
  36. import matplotlib.pyplot as plt # varsa grafik çiz
  37. plt.plot(history['t'], history['ang'], label='ang')
  38. plt.plot(history['t'], np.array(history['count']) * 3, label='count × 3')
  39. plt.axvline(18, ls='--'); plt.xlabel('t (s)'); plt.legend(); plt.show()
  40. except ImportError:
  41. print('matplotlib yok: grafik atlandı')

Eğitim paneli

Eğitim çalıştırılıyor…

Sahnedeki her sayı, aynı algoritmanın tarayıcında yapılan gerçek çalıştırmasından gelir (sabit tohum, her seferinde aynı sonuç). Python kodunu kendi bilgisayarında çalıştırırsan rastgele başlangıçlar farklı olacağı için sayılar biraz değişebilir.

Bu dersin kodu verisini kendi içinde üretir; indirilecek dosya yok. Kodu yine de aşağıda tarayıcında çalıştırabilirsin.

Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide

Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.

dusme.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Gövde açısı: omuz ortasından kalça ortasına giden çizginin dikeyle yaptığı açı. Ayakta 5°, yerde yatarken 90°'ye yakın.
  2. Kalça yüksekliği, ilk 2 saniyedeki ayakta duruşa oranlanır (kişinin boyu ve kamera uzaklığı sadeleşir). İniş hızı: kalçanın 0,3 saniyede ne kadar alçaldığı.
  3. Kural: açı eşiği geçilmiş ve kalça yarı yüksekliğin altındaysa kişi "yerde" sayılır; bu durum hızlı bir inişle (> 0,6 m/s) başlamış ve 2 saniye (20 kare) sürmüşse alarm.
  4. Eğilmede açı 75°'ye çıkar ve kalça da iner, ama kişi 1 saniye sonra doğrulur: sayaç 20'ye varmaz. Oturmada kalça iner ama gövde dik kalır.
  5. Şunu dene: zaman penceresini 1 saniyeye indir, eğilme yanlış alarm verir. Açı eşiğini 20°'ye indir, oturma da alarm verir.

Neden önemli

Yaşlı bakım evlerinde, hastanelerde ve evde yalnız yaşayanlarda düşmeden sonra yardımın ne kadar çabuk geldiği hayati önem taşır. Kamera görüntüsü kaydedilmeden yalnız iskelet işlendiği için mahremiyet de korunur. Aynı açı ve zaman kuralları, iş güvenliğinde yerde kalan işçiyi ve robotikte insansı robotun kendi düşüşünü fark etmede de kullanılır.

ESOF 323, 11. hafta: robotlarda derin öğrenme →
Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç