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ı.
import numpy as nprng = np.random.default_rng(3)FPS, ANG, WIN = 10, 60, 20 # kare/s, açı eşiği °, pencere (kare)kt = [5, 5.6, 6.6, 7.3, 10.5, 11.1, 14, 14.6, 18, 18.7] # anahtar anlar (s)kth = [5, 75, 75, 5, 5, 25, 25, 5, 5, 88] # gövde açısı (°)kh = [.92, .4, .4, .92, .92, .42, .42, .92, .92, .12] # kalça yüksekliği (m)t = np.arange(0, 26, 1 / FPS)th = np.radians(np.interp(t, kt, kth))hip = np.stack([0 * t, np.interp(t, kt, kh)], 1) # kalça ortasısh = hip + 0.5 * np.stack([np.sin(th), np.cos(th)], 1) # omuz ortasıhip += rng.normal(0, 0.015, hip.shape) # poz tahmini gürültüsüsh += rng.normal(0, 0.015, sh.shape)d = sh - hip # gövde vektörüang = np.degrees(np.arctan2(np.abs(d[:, 0]), d[:, 1])) # dikeyden açıratio = hip[:, 1] / np.median(hip[:20, 1]) # ayakta duruşa orandrop = np.r_[0, 0, 0, hip[:-3, 1] - hip[3:, 1]] * FPS / 3 # iniş hızı m/slow = (ang > ANG) & (ratio < 0.5) # yerde mi?n, last = 0, -99 # sayaç, son hızlı inişhistory = {'t': [], 'ang': [], 'ratio': [], 'drop': [], 'count': []} # kare kare geçmişfor i in range(len(t)):if drop[i] > 0.6: last = i # hızlı inişn = n + 1 if low[i] and (n or i - last <= 15) else 0 # yerde kalma sayacır = [round(t[i], 1), ang[i], ratio[i], drop[i], n]for k, v in zip(history, r): history[k].append(float(v))if n == WIN: print(f'ALARM: t = {t[i]:.1f} s')print('eğilmede yerde kare:', low[50:75].sum(), '<', WIN)y = t >= 18 # gerçek: düşme anı ve sonrasıpred = np.array(history['count']) >= WIN # kuralın kararıtp = (pred & y).sum(); p, r = tp / max(pred.sum(), 1), tp / y.sum()for k, v in [('precision', p), ('recall', r), ('f1', 2 * p * r / max(p + r, 1e-9))]: # son ölçümlerprint(f'{k:<10}{v:>8.3f}')import csvwith open('egitim_gecmisi.csv', 'w', newline='') as f: # satır başına bir karecsv.writer(f).writerows([list(history), *zip(*history.values())])try:import matplotlib.pyplot as plt # varsa grafik çizplt.plot(history['t'], history['ang'], label='ang')plt.plot(history['t'], np.array(history['count']) * 3, label='count × 3')plt.axvline(18, ls='--'); plt.xlabel('t (s)'); plt.legend(); plt.show()except ImportError: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.
Veri seti
Tüm veri setleri →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.
Çıktı
Çıktı burada görünecek.Nasıl çalışır
- Gövde açısı: omuz ortasından kalça ortasına giden çizginin dikeyle yaptığı açı. Ayakta 5°, yerde yatarken 90°'ye yakın.
- 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ığı.
- 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.
- 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.
- Ş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 →