Nowe technologie w fizyce biomedycznej/Kamery 3D: Różnice pomiędzy wersjami

Z Brain-wiki
 
(Nie pokazano 1 pośredniej wersji utworzonej przez tego samego użytkownika)
Linia 88: Linia 88:
 
[[Plik:KASR.png|400px|thumb|center|<figure id="fig:kinect_joints"></figure>knee-to-ankle separation ration]]
 
[[Plik:KASR.png|400px|thumb|center|<figure id="fig:kinect_joints"></figure>knee-to-ankle separation ration]]
 
*zmiana w czasie średniej pozycji bioder, kolan i stóp.
 
*zmiana w czasie średniej pozycji bioder, kolan i stóp.
Wyniki opracowane powinny zostać w formie tabeli, gdzie zestawione zostaną wartości KVM, FPKA, KASR otrzymane dla każdej osoby z grupy (uśrednione po realizacjach - 3 powtórzeniach). Trajektoria (w kierunku pionowym) średniej pozycji bioder, kolan i stóp podczas wykonywania zadania powinna zostać przedstawiona na wykresie.
+
Wyniki opracowane powinny zostać w formie tabeli, gdzie zestawione zostaną wartości KVM, FPKA, KASR otrzymane dla każdej osoby z grupy (uśrednione po realizacjach - 3 powtórzeniach). Trajektoria (w kierunku pionowym i poziomym) średniej pozycji bioder, kolan i stóp podczas wykonywania zadania powinna zostać przedstawiona na wykresie.
  
 
===Analiza danych===
 
===Analiza danych===
Linia 293: Linia 293:
 
             joints.append(self.unserialize_joint(f))
 
             joints.append(self.unserialize_joint(f))
 
         return SkeletonFrameMock(v[0], v[1], v[2], v[3], v[4], v[5], v[6], joints)
 
         return SkeletonFrameMock(v[0], v[1], v[2], v[3], v[4], v[5], v[6], joints)
          
+
 
 +
class KinectDataReader(object):
 +
    def __init__(self, file_name):
 +
         super(KinectDataReader, self).__init__()
 +
        self.file_name = file_name
 +
        self.in_algs_file = open(self.file_name + '.algs', 'rb')
 +
        self._s = Serialization()
 +
 
 +
    def readNextFrame(self):
 +
        return self._s.unserialize_frame(self.in_algs_file)
 +
 
 
</source>
 
</source>
 
{{clear}}
 
{{clear}}
Linia 304: Linia 314:
 
# -*- coding: utf-8 -*-
 
# -*- coding: utf-8 -*-
  
from KinectUtils import Serialization
+
from KinectUtils import KinectDataReader
  
class KinectDataReader(object):
+
FILE_PATH = '......'
    def __init__(self, file_name):
+
file_name = '......'
        super(KinectDataReader, self).__init__()
 
        self.file_name = file_name
 
        self.in_algs_file = open(self.file_name + '.algs', 'rb')
 
        self._s = Serialization()
 
  
    def readNextFrame(self):
+
kinect = KinectDataReader(FILE_PATH+file_name)
        return self._s.unserialize_frame(self.in_algs_file)
 
  
 
first_time = 0
 
first_time = 0
Linia 320: Linia 325:
 
Time = []
 
Time = []
  
FILE_PATH = '......'
 
file_name = '......'
 
 
kinect = KinectDataReader(FILE_PATH+file_name)
 
 
while True:
 
while True:
 
     frame = kinect.readNextFrame()
 
     frame = kinect.readNextFrame()

Aktualna wersja na dzień 06:48, 9 maj 2018

Kamery 3D

Plan zajęć

Zajęcia 1:

  • Wstęp teoretyczny:
    • Budowa i zasada działania sensora Kinect.
    • Opis podstawowych bibliotek wykorzystywanych do komunikacji z urządzeniem.
    • Profesjonalne systemy do rejestracji ruchu
    • Zastosowania w biomechanice oraz rehabilitacji.
  • Zapoznanie się z działaniem sensora Kinect
  • Pomiary:
    • W ramach pomiarów studenci wykonają standardowy test wykorzystywany w medycynie sportowej do oceny prawdopodobieństwa urazów więzadła krzyżowego przedniego (ACL).

Media:3D_Kinect.pdf Informacje wstępne oraz opis zadań
Media:3D_Kinect_ENG.pdf Theoretical information and description of tasks

Zajęcia 2,3,4:

  • Analiza zebranych danych
  • Zaprezentowanie uzyskanych wyników

Sensor Kinect

Śledzenie ruchów postaci ludzkiej w ogólności znajduje zastosowanie m.in. w analizie chodu, diagnostyce chorób związanych z układem ruchu człowieka, analizie ruchu sportowców, czy nawet w procesie animacji postaci na potrzeby produkcji filmów i gier. W tym celu wykorzystuje się głównie profesjonalne markerowe systemy śledzenia ruchu (marker-based motion capture systems) określane w skrócie jako systemy mocap. Systemy te wymagają zastosowania specjalistycznego sprzętu, a na ciele śledzonej postaci muszą zostać umieszczone odpowiednie markery, przez co rejestracja musi odbywać się w warunkach laboratoryjnych. Systemy te nie nadają się do śledzenia ruchu w czasie rzeczywistym, a przesłonięcie lub przemieszczenie markerów w trakcie ruchu może być przyczyną błędów. Z tych względów coraz większe zainteresowanie zyskują bezmarkerowe systemy śledzenia ruchu, które wykorzystują zaawansowane algorytmy analizy obrazu.

Sensor Kinect firmy Microsoft do śledzenia ruchu postaci wykorzystuje informacje z kamery głębokości. Znajduje on zastosowanie w różnego rodzaju systemach umożliwiających interakcję człowiek-komputer, ale zaczyna również budzić coraz większe zainteresowanie w dziedzinach związanych z biomechaniką i rehabilitacją. W tym celu konieczne jest jednak określenie dokładności pozycji estymowanych przy pomocy bibliotek obsługujących sensor. Problem ten został poruszony w pracy (Webster, 2014).


Sensor Kinect Xbox 360.


Budowa sensora Kinect Xbox 360 (rys. 1):

  • kamera wizyjna RGB (typu CMOS, o rozdzielczości 640x480) - przesyła serię obrazów z prędkością 30 klatek na sekundę,
  • kamera głębokości (typu CMOS, o rozdzielczości ~300x200) - zwraca informację o głębokości poprzez analizę zniekształconej przez obiekt wiązki promieni podczerwonych,
  • emiter podczerwieni - emituje wiązkę promieni podczerwonych,
  • 4 mikrofony kierunkowe - wykorzystywane przez funkcje rozpoznawania mowy,
  • napęd umożliwiający ruch głowicą z akcelerometrem.

Pomiary

Pomiary przeprowadzane są w środowisku OpenBCI przy użyciu aplikacji Brain4edu. Obsługa sensora wraz z algorytmami estymacji poszczególnych pozycji anatomicznych śledzonej postaci, możliwa jest dzięki bibliotekom OpenNI i NiTE.

Zaczynamy od uruchomienia aplikacji Brain. W prawym górnym rogu ekranu pojawi się ikona mózgu będąca interfejsem graficznym aplikacji. Do pomiarów przy użyciu kamery 3D wybieramy opcję 'Kinect App', która otworzy okno do zapisu lub odczytu danych.

Interfejs graficzny aplikacji Brain4edu
Okno wyboru rejestracji/odczytu danych aplikacji KinectApp

W wyświetlonym oknie wpisz katalog zapisu/odczytu, wybierz tryb działania, a następnie naciśnij przycisk Start. Po uruchomieniu wyświetlone zostanie okno z podglądem zarówno mapy głębokości jak i obrazu RGB.


Drop Vertical Jump

Zeskok z następującym wyskokiem pionowym (drop vertical jump, DVJ) należy do badań przesiewowych, pozwalających oszacować ryzyko występienia urazu (w szczególności więzadła krzyżowego przedniego u kobiet) lub określić efekty rehabilitacji. Przed rozpoczęciem skoku osoba badana stoi na platformie o wysokości ok. 30 cm. Ma ona za zadanie wykonać zeskok z platformy na ziemię, a następnie maksymalny skok pionowy w górę. W dalszej analizie interesujące będą momenty: kontaktu pięt z podłożem (initial contact, IC) zaraz po wykonaniu zeskoku oraz moment maksymalnego zgięcia kolan (peak flexion, PF) zaraz po IC, ale przed oderwaniem pięt od podłoża w celu wykonania skoku pionowego.

Przebieg zeskoku z następującym wyskokiem pionowym. Źródło: Stone et al., 2013

Analiza danych

Studenci zapoznają się z modułami (napisanymi w języku programowania Python) do wczytywania oraz wstępnego przetwarzania danych. Następnie samodzielnie wyznaczą wskaźniki biomechaniczne, opisane w pracy (Stone et al., 2013), którą można znaleźć pod adresem: [1].

Zeskok z pionowym wyskokiem powtórzony został 3-krotnie w celu większej wiarygodności wyników. Należy zatem dla każdego powtórzenia oddzielnie wyznaczyć momenty IC oraz PF, wyliczyć wartość każdego z parametrów. A następnie należy uśrednić uzyskane wyniki i podać je wraz z niepewnością średniej. Omawiane wskaźniki biomechaniczne:

  • knee valgus motion (KVM) - przesunięcie kolan w płaszczyźnie czołowej (x) pomiędzy momentami IC a PF
Knee valgus motion
  • frontal plane knee angle (FPKA) - kąt pod jakim znajduje się wektor (od kolana do stopy) oddzielnie dla prawej i lewej nogi, w dwóch momentach: IC oraz PF
Frontal plane knee angle
  • knee-to-ankle separation ration (KASR) - stosunek rozsunięcia kolan do kostek w momencie PF
knee-to-ankle separation ration
  • zmiana w czasie średniej pozycji bioder, kolan i stóp.

Wyniki opracowane powinny zostać w formie tabeli, gdzie zestawione zostaną wartości KVM, FPKA, KASR otrzymane dla każdej osoby z grupy (uśrednione po realizacjach - 3 powtórzeniach). Trajektoria (w kierunku pionowym i poziomym) średniej pozycji bioder, kolan i stóp podczas wykonywania zadania powinna zostać przedstawiona na wykresie.

Analiza danych

Implementacja klasy Serialization umożliwiająca łatwe wczytanie danych (proszę zapisać ten plik jako KinectUtils).


Przykładowy skrypt do wczytywania wyników algorytmów śledzenia pozycji anatomicznych (wraz z metadanymi rejestracji):

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from KinectUtils import KinectDataReader

FILE_PATH = '......'
file_name = '......'

kinect = KinectDataReader(FILE_PATH+file_name)

first_time = 0
joints = []
Time = []

while True:
    frame = kinect.readNextFrame()
    if frame is None:
        print('END OF FILE')
        break
 
    frame_index = frame[0]
    hands_included = frame[1]
    skeleton_included = frame[2]
    frame_time = frame[3]
 
    if not first_time:
        first_time = frame_time

    if skeleton_included:
        skel = frame[8]
        Time.append(frame_time-first_time)
        joints.append(skel.joints)

        print('Idx:', frame_index, 'Time:', frame_time-first_time)
        print('Head x,y,z [mm]: ', joints[-1][0].x, joints[-1][0].y, joints[-1][0].z)
        print('Torso x,y,z [mm]: ', joints[-1][8].x, joints[-1][8].y, joints[-1][8].z)

Plik z metadanymi rejestracji zawiera: nagłówek, wyniki algorytmów śledzenia 15 pozycji anatomicznych, wyniki algorytmów śledzenia pozycji rąk (oddzielna opcja w scenariuszu). Pozycje anatomiczne sylwetki zapisane są w następującej kolejności:

   joints = [JOINT_HEAD,
             JOINT_NECK,
             JOINT_RIGHT_SHOULDER,
             JOINT_LEFT_SHOULDER,
             JOINT_RIGHT_ELBOW,
             JOINT_LEFT_ELBOW,
             JOINT_RIGHT_HAND,
             JOINT_LEFT_HAND,
             JOINT_TORSO,
             JOINT_RIGHT_HIP,
             JOINT_LEFT_HIP,
             JOINT_RIGHT_KNEE,
             JOINT_LEFT_KNEE,
             JOINT_RIGHT_FOOT,
             JOINT_LEFT_FOOT]

Ich położenie (x,y,z) wyrażone jest w jednostkach [mm].

Układ pozycji anatomicznych.

Literatura

  • Stone E.E., Butler M., McRuer A., Gray A., Marks J., Skubic M., Evaluation of the Microsoft Kinect for Screening ACL Injury, Conference proceedings: ... Annual International Conference of the IEEE Engineering in Medicine and Biology Society, 2013:4152-5, 2013.
  • Webster D., Celik O., Systematic review of Kinect applications in elderly care and stroke rehabilitation, Journal of NeuroEngineering and Rehabilitation, 11:108, 2014.