Hackster Inc.
Avtor: Nick Bild
Brezžično merite svoj srčni utrip z uporabo razvojnih plošč ESP32 in umetne inteligence.
Zanimiva študija [1] je nedavno pokazala, kako je mogoče neinvazivno spremljati srčni utrip osebe z uporabo Wi-Fi signalov. V medijih je bila deležna velike pozornosti, zato domnevam, da bi jo mnogi radi preizkusili. Vendar je članek dostopen le za plačljive naročnike, in tudi če ga uspete dobiti, je za večino ljudi težko razumeti (kaj šele ponoviti) metode raziskovalcev.
Zato sem se odločil, da bom poskusil. Priskrbel sem si kopijo članka in nekaj časa preučeval ter kodiral rešitev, ki bolj ali manj reproducira delo. Nekatere podrobnosti v članku niso v celoti pojasnjene, ekipa pa ni objavila niti svojega programa niti podatkov, zato ne morem zagotoviti, da je moja metoda 100 % enaka. Čeprav morda ni identična, je vsaj precej podobna in, kar je še pomembneje, deluje. In sumim, da je večina ljudi bolj zainteresirana za igranje s sistemom, ki deluje, kot za popolno reprodukcijo metod Pulse-Fi.
Ta vsebina je samo za naročnike
V naslednjem poglavju bom najprej podal pregled delovanja Pulse-Fi, nato pa opisal svojo implementacijo.
Pomembno opozorilo: Ta sistem ni namenjen uporabi kot medicinski pripomoček. Lahko daje napačne meritve, zato je namenjen izključno izobraževalnim namenom.



Zahvaljujem se Pranayu Kocheti, Nayanu Sanjayju Bhatii in Katiji Obraczki za njihovo delo na Pulse-Fi, ki je navdihnilo ta projekt.
Kaj potrebujemo za ta projekt
Adafruit HUZZAH32 – ESP32 Feather Board ×1
ESP32 Espressif ESP32 ×1
Arduino Nano 33 IoT ×1
Maxim Integrated MAX30102 ×1
Kako deluje, pregled delovanja Pulse-Fi
Za brezstično merjenje srčnega utripa mora biti oseba nameščena med dvema mikrokontrolerjema ESP32. Ena od naprav oddaja neprekinjen tok paketov Channel State Information (CSI), druga pa te pakete sprejema. Paketi CSI zagotavljajo podrobne informacije, ki opisujejo, kako se signal širi od oddajnika do sprejemnika. Vse, kar prekine signal, na primer gibanje osebe, spremeni signal na merljiv način. To dejstvo se je v preteklosti izkoristilo za aplikacije, kot je prepoznavanje aktivnosti.
Srčni utripi prav tako vključujejo gibanje, čeprav je to zelo neopazno v primerjavi z gibanjem, ki ga zaznavajo sistemi za prepoznavanje aktivnosti, kot je na primer hoja. Da bi se osredotočili na srčne utripe, so raziskovalci razvili večstopenjski postopek obdelave podatkov, ki izgleda takole:
Ti obdelani podatki se nato vnesejo v večplastno omrežje LSTM, ki napoveduje srčni utrip.
Moja implementacija: napovedovanje srčnega utripa
Imam Adafruit HUZZAH32 in ESP32-DevKitC v4, oba z mikrokontrolerjem ESP32-WROOM-32E (to sta tista, ki sem jih imel pri roki; druge plošče ESP32 bi morale delovati brez težav). Razmaknjena sta nekaj metrov, merilno območje pa je med njima. Ena je bila opremljena s kodo Espressif csi_send [2], druga pa s kodo Espressif csi_recv [3]. Izvorna koda je bila prevedena in prenesena na naprave z uporabo IDF docker imager [4], npr.:
git clone https://github.com/espressif/esp-csi.git
docker pull espressif/idf
Build csi_send
docker run –rm -v $PWD:~/project -w /project -u $UID -e HOME=/tmp -it espressif/idf
cd esp-csi/examples/get-started/csi_send
idf.py set-target esp32
idf.py flash -b 921600 -p /dev/ttyUSB0
exit
Flash csi_send
docker run –rm -v $PWD:~/csi_hr/esp-csi/
examples/get-started/csi_send/project -w /
project espressif/idf:latest idf.py –port /dev/ttyUSB0 flash
Build csi_send
docker run –rm -v $PWD:~/project -w /project -u $UID -e HOME=/tmp -it espressif/idf
cd esp-csi/examples/get-started/csi_recv
idf.py set-target esp32
idf.py flash -b 921600 -p /dev/ttyUSB0
exit
Flash csi_send
ždocker run –rm -v $PWD:~/csi_hr/esp-csi/
examples/get-started/csi_recv/project -w /
project espressif/idf:latest idf.py –port
/dev/ttyUSB0 flash
Po programiranju obeh plošč se sprejemna naprava prek USB-ja poveže z računalnikom, da se lahko podatki CSI zbirajo prek serijske povezave. Zelo sem spremenil skript csi_data_read_parse.py podjetja [5] Espressif. Moja nova različica je read_and_process_csi.py [6], ki odpravlja grafični vmesnik, izvaja pet korakov obdelave podatkov Pulse-Fi CSI, nato pa obdelane podatke posreduje v usposobljen model LSTM z enako arhitekturo kot v članku za napovedovanje srčnega utripa. Zažene se z:
python read_and_process_csi.py -p /dev/
ttyUSB0


Scenarij pošlje neprekinjen tok napovedi srčnega utripa na standardni izhod.
Učenje modela strojnega učenja
Kodo read_and_process_csi.py lahko nastavite v način, v katerem zbira in obdeluje CSI podatke ter jih zapiše v besedilno datoteko (COLLECT_TRAINING_DATA = True), namesto da napoveduje srčni utrip. Spodaj je grafikon, ki prikazuje obdelane CSI podatke za eno podnosilno frekvenco, ki so bili zbrani na ta način. Signal srčnega utripa je jasno viden.
Ti CSI podatki so združeni z dejanskimi podatki o srčnem utripu, zbranimi z uporabo Arduino Nano 33 IoT in generične razširitvene plošče z modulom za merjenje pulza in srčnega utripa MAX30102 (ta senzor je potreben le za zbiranje podatkov o treningu). Arduino koda za senzor srčnega utripa je na voljo tukaj [7]. Potrebni bodo podatki z različnimi srčnimi utripi, zato je treba nekatere podatke zbrati med ali takoj po vadbi ali drugi fizični aktivnosti.
Vsi podatki se nato uporabijo v mojem programu [8] za usposabljanje, ki v TensorFlowu zgradi model LSTM z naslednjo arhitekturo:
main_input = keras.Input(shape=(100, 192), name=’main_input’)
layers = keras.layers.LSTM(64, return_sequences=True, name=’lstm_1′)(main_input)
layers = keras.layers.Dropout(0.2,
name=’dropout_1′)(layers)
layers = keras.layers.LSTM(32,
name=’lstm_2′)(layers)
layers = keras.layers.Dropout(0.2,
name=’dropout_2′)(layers)
layers = keras.layers.Dense(16,
activation=’relu’, name=’dense_1′)(layers)
hr_output = keras.layers.Dense(1, name=’hr_
output’)(layers)
Model v drsnem oknu hkrati sprejme 100 zaporednih paketov CSI. Povprečna srčna frekvenca, izmerjena v tem oknu, je vrednost, za napovedovanje katere je model usposobljen. Po usposabljanju se model shrani kot csi_hr.keras, ki ga read_and_process_csi.py naloži in uporabi za napovedovanje srčne frekvence.
Spisek materiala uporabljenega v tem projektu:
1 x Adafruit HUZZAH32 (ESP32-WROOM-32E)
1 x ESP32-DevKitC v4 (ESP32-WROOM-32E)
1 x Arduino Nano 33 IoT
1 x Generic breakout board with MAX30102 pulse oximetry and heart-rate monitor module
Povzeto po:
Izmerite srčni utrip preko WIFI:
https://www.hackster.io/nickbild/measuring-heart-rate-using-wi-fi-e61743
Viri:
1: https://www.hackster.io/news/i-heart-wi-fi-f3f726a38a1f
2: https://github.com/espressif/esp-csi/blob/master/examples/get-started/csi_send
3: https://github.com/espressif/esp-csi/blob/master/examples/get-started/csi_recv
4: https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/tools/idf-docker-image.html
5: https://github.com/espressif/esp-csi/blob/master/examples/get-started/tools/csi_data_read_parse.py
6: https://github.com/nickbild/csi_hr/blob/main/read_and_process_csi.py
7: https://github.com/nickbild/csi_hr/tree/main/arduino_hr
8: https://github.com/nickbild/csi_hr/blob/main/train.py
