Precisie ECG Analyzer met Edge Impulse en Arduino Nano 33 BLE Sense
Onderdelen en Benodigdheden
| Arduino Nano 33 BLE Sense | 1 |
| SparkFun Single Lead Heart Rate Monitor - AD8232 | 1 |
| ElectroPeak 0.96" OLED 64x128 Display Module | 1 |
Nodige Tools en Machines
- Soldeerbout (standaard)
- Soldeerdraad, Loodvrij
- 10 Stk. Draadjes Set, 5 cm Lang
Apps en Online Services
- Edge Impulse Studio
- MATLAB
- Arduino IDE
- Microsoft Visual Studio 2017
Over dit Project
Plotselinge Hartaanval en Toename in Sterfte: Groeiende Zorg
In het afgelopen decennium zijn de sterftgevallen door plotselinge hartaanvallen enorm toegenomen. Vooral in ontwikkelingslanden zoals India, naast genetische factoren en leefstijl, zorgt het gebrek aan medische hulpmiddelen in landelijke gebieden voor de meeste sterftgevallen bij hartaanvallen.
Technologische Bijdrage aan Oplossing van dit Wereldwijde Probleem
Ik werkte aan een TinyML-applicatie aangedreven door Edge Impulse om een mini-diagnostische ECG-analyzer te ontwikkelen die in een zak past en hartziektes onafhankelijk kan diagnosticeren zonder cloud-connectiviteit.
Huidige ECG Analyzers op de Markt en hun Kenmerken
- Huidige IoT-medische apparaten sturen bulk ECG-data naar de mobiel/server en analyse wordt gedaan op hogere processor / mobiele app.
- Computergebaseerde applicatie die signalen ontvangt van ECG-apparaat en ECG-patronen analyseert.
- Alle ECG-analysetools hebben een afhankelijkheid van internet of hoge verwerkingscomputers/mobiele applicaties.
Dit kan samengevat worden in het onderstaande diagram.
Belangrijkste Oplossing
- ECG Analyzer aangedreven door Edge Impulse analyseert ECG-data zonder afhankelijkheid van internet.
- Latentie is laagst vergeleken met IoT-apparaten.
- Een 15KB ROM - ECG Analyserende TinyML-model kan draaien op elke TinyML-ondersteunde microcontroller.
- Het apparaat analyseert ECG-patronen en classificeert ze in Normaal, Boorzroomfibrilatie en Eerste-graads Hartblok.
Architectuur
De ECG-analyzer omvat:
- ECG uitlezen met AD8232
- Verschillende hartziekte ECG-patronen simuleren
- Nieuwe benadering om kwalitatieve datasets te produceren
- Het model trainen
- Model test nauwkeurigheid en integreren van applicatiecode met gedeployde bibliotheek
Kennis over ECG Grafiek
Voordat we doorgaan met het technische werk, gaan we eerst door enkele basisprincipes van de ECG-grafiek.
De ECG-grafiek werd opgesplitst in 5 Golven - P, Q, R, S en T golven.
Boorzroomfibrilatie
Eerste-graads Hartblok
Laten we de ECG Analyzer Bouwen
1. ECG Uitlezen met AD8232
Sluit de ECG-sensor AD8232 aan op de Arduino Nano 33 BLE Sense volgens het onderstaande verbindingsdiagram.
Flash de onderstaande code en druk dan op "Ctrl+Shift+L" om de grafische streamingdata te visualiseren.
void setup() {
// initialiseer de seriële communicatie:
Serial.begin(115200);
pinMode(2, INPUT); // Instellen voor leads off detectie LO +
pinMode(3, INPUT); // Instellen voor leads off detectie LO -
}
void loop() {
if((digitalRead(2) == 1)||(digitalRead(3) == 1)){
Serial.println('!');
} else {
// stuur de waarde van analoge input 0:
Serial.println(analogRead(A0));
}
// Wacht even om seriële data te verzadigen
delay(5);
}
1.1 Plaatsing van ECG Elektroden
De ECG-elektroden worden geplaatst in RA, LA en LL zoals in het bovenstaande diagram vermeld en de jack verbinden met de AD8232-sensor op de ECG-analyzer.
2. Verschillende ECG-patronen Simuleren met Matlab Signal Builder
Stap 2.1: Normale ECG-data opslaan in Excel
Kopieer en sla de seriële monitor data op in het Excel-bestand als onderstaande sjabloon. De ECG-waarde moet in de tweede kolom onder 'Y' staan. De eerste kolom is de tijdreeks. Deze moet geïncrementeerd worden met (* 0.005) 5ms.
Stap 2.2: Signal Builder in Matlab
Maak een nieuw Simulink-model in Matlab. Typ vervolgens 'signal builder' in de werkruimte en selecteer het. Voeg ook de 'scope' toe om het met de signal builder te verbinden.
Om de opgeslagen Excel-data te laden, open de signal builder en selecteer de optie 'import from file'.
Selecteer de genoemde opties om de data te importeren. Bevestig de selectie en importeer zonder het model op te slaan, aangezien we nog meer stappen nodig hebben.
2.3: ECG Data Visualisatie in Signal Builder
Een 60 seconden ECG-data ziet er zo uit in de signal builder weergave. Voor handmatige bewerking, zoom in op 5 seconden data en sleep om de ECG-golf te bewerken.
Na inzoomen, wanneer je de muisaanwijzer dicht bij de ECG-golf plaatst, kun je elk punt in de ECG selecteren en verslepen volgens je toepassingsvereiste.
2.4: P-R Interval Data Bewerken in Signal Builder voor AV Blok 1 Geval
Ik heb de P-golf handmatig omlaag getrokken en de P-golf veel vóór de R-golf verschoven, zodat het P-R interval 200ms overschrijdt. Herhaal deze stap in verschillende tijdlijnen in de signal builder data.
Na bewerken, exporteer de data naar het mat-bestand. Je vindt deze optie in de signal builder. Zodra het mat-bestand opgeslagen is, volg dan de onderstaande stappen.
Stappen om te volgen --> Dubbelklik mat-bestand eerst en dubbelklik de 1x1 Dataset --> je ziet de gewijzigde data onder Data:1. Kopieer en plak de data in een nieuw Excel-bestand.
Stap 2.5: Excel Data Exporteren naar Array
Ik schreef een .m script dat de Excel-data kan converteren naar een array. Voer dit script uit in Matlab, vervang voordat je draait de ExcelFilename met je lokaal opgeslagen bestandsnaam en ExcelSheetName in de corresponderende bladnaam.
data=xlsread('ExcelFilename.xlsx','ExcelSheetName');
ECGExtract=(data(1:end,1)); %%Kolom A data
fid=fopen('test.txt','wt');%openen met de t flag auto-converteert \n naar \r\n op Windows
fprintf(fid,'{');
FormatSpec=[repmat('%i ',1,size(ECGExtract,2)) ','];
fprintf(fid,FormatSpec, ECGExtract);
fprintf(fid,'}')
fclose(fid);
Het tekstbestand wordt gegenereerd in de huidige directory locatie. Kopieer de array-inhoud en plak het in de ECGAnalyzer.c code voor het simuleren van Boorzroomfibrilatie en Eerste-graads Hartblok.
3. Nieuwe Benadering voor Kwalitatieve Datasets
Als je naar ECG-data kijkt, is het echt moeilijk om de verschillende hartcondities ECG-data te onderscheiden van normale ECG-data in een korter tijdvenster (voorbeeld: 3 seconden).
Toen ik een model trainde met alleen gefilterde ECG-data voor boorzroomfibrilatie, normaal en eerste-graads hartblok, was de nauwkeurigheid minder dan 23%. De reden was dat in het kortere venster het model het verschil niet kon onderscheiden. Als ik voor een langere venstertijd ging, nam de verwerkingstijd en piek RAM-gebruik aanzienlijk toe. Er was nog steeds geen nauwkeurigheid.
Achtergrond van Nieuwe Benadering:
Wanneer een dokter of getraind persoon probeert de ECG-grafiek te analyseren, tellen ze de kleine vakjes tussen R-naar-R golf, P-naar-R interval en schrijven ze de tellingen in de grafiek of onthouden ze ze voor berekening.
Ik creëerde afzonderlijke golven uit gefilterde ECG-data.
Nieuwe Golven:
- R-R Interval
- PR Interval
Gegenereerde Datasets voor Normale ECG Data: Het gedecodeerde R-R interval en PR interval data is altijd 100 en 50 voor normale ECG-data.
Gegenereerde Datasets voor Boorzroomfibrilatie - ECG Data: Wanneer er een afwijking is tussen vorig R-R interval en huidig R-R interval, zal R-R interval data voor één cyclus dalen naar -100.
Gegenereerde Datasets voor Eerste-graads Hartblok - ECG Data: Wanneer het P-naar-R interval 200ms overschrijdt, dan zal PR Interval data voor één cyclus dalen naar -50.
Deze benadering verbeterde mijn modelnauwkeurigheid tot meer dan 90%.
4. Het Model Trainen in Edge Impulse
Voordat we in Edge Impulse ML training duiken, moeten we enkele parameters in het bibliotheekbestand configureren voor simulatie en real-time ECG-sensor uitlezing.
Stap 4.1: Configureer SIMULATIE op 0, als de data-acquisitie van real-time ECG-sensor uitlezing was, OF configureer SIMULATIE op 1, als de data-acquisitie van gesimuleerde ECG-data was voor Boorzroomfibrilatie en Eerste-graads Hartblok (volgens Matlab sessies).
Stap 4.2: Comment/uncomment de benodigde data buffer voor simulatie
Stap 4.3: Data-acquisitie
Verzamel ECG-data onder drie verschillende labels: Normaal, Boorzroomfibrilatie en Eerste-graads Hartblok.
Edge Impulse Docs en selecteer de frequentie als 202:
$ edge-impulse-daemon --frequency 202
Stap 4.4: Impuls Creëren
In de create impulse sectie, venstergrootte is 3000ms en venstertoename is 2999ms, selecteer k-means anomaliedetectie.
Stap 4.5: Spectrale Kenmerken
In de spectrale kenmerken, selecteer filtertype als None.
Stap 4.6: NN Classifier:
Ik stelde 40 trainingscycli in en leersnelheid op 0.005. Ik kreeg 92.9% nauwkeurigheid. En voor anomaliedetectie selecteerde ik PR interval RMS en RR interval RMS.
5. Model Test Nauwkeurigheid & Integratie
In de model test nauwkeurigheid kwam het uit op ongeveer 97% nauwkeurig.
5.1 Implementatie: Selecteer Arduino als implementatie. Voeg het gedownloade EI geïmplementeerde bestand toe aan de Arduino bibliotheek.
Let op: Voeg de ECG_Analyzer bibliotheek van de GitHub link ook toe aan de Arduino bibliotheek. Dit helpt om mijn ECG-decoderingsalgoritmecode te integreren met het EI gegenereerde model.
5.2 Applicatiecode Integreren met de Core Gegenereerde EI Code
Ik heb de applicatiecode samengevoegd in de EI geïmplementeerde "nano_ble33_sense_accelerometer_continuous" en opgeslagen als ECGAnalyzer.ino. Het is beschikbaar in de bijgevoegde GitHub link. Flash de code met SIMULATIE als 0 in ECG_Analyzer.c op het apparaat.
Hardware
Sluit aan volgens het Fritzing diagram.
Eindproduct
Hier is het eindproduct en het nauwkeurigheidsniveau in testdata!
Credits
ECG: https://geekymedics.com/how-to-read-an-ecg/
Code
GitHub Repository
https://github.com/Manivannan-maker/ECGAnalyzer
Unzip de ECGAnalyzer.zip Code om te Flashen: EI_Deployed_Library\examples\ECGAnalyzer\ECGAnalyzer.ino Bibliotheek om Simulatie te Bewerken: ECGAnalyzer_lib\ecg_analyzer.c Matlab script en signalbuilder model: script om in matlab te draaien --> Matlab_Simulation\Excel2Arrayconverter.m Signal builder --> Matlab_Simulation\signalbuilder.slx
Schema's
Sluit aan volgens het diagram. Fritzing bestand: ecgdefault_SjMMcgW8jY.fzz
Productieproces
- De Kunst en Vakmanschap van Tiara's: Geschiedenis, Materialen en Modern Ontwerp
- Prikkeldraad Uitgelegd: Geschiedenis, Constructie en Modern Gebruik
- Walabot-aangedreven toilet-hygiënemonitor
- Hands-on Machine Learning met de reTerminal: Edge Impulse & ARM NN Demo Gids
- Een Kapotte Speelgoedcamion Ombouwen tot een Raspberry Pi-aangedreven RC-Voertuig
- MOSMusic Project Kit: MOSFET, Arduino en meer
- Premium Hexagonale Draadnettingmachine voor Landbouw & Pluimveehouderij
- Draadsnijden Beheersen: Een Uitgebreide Gids voor Wire EDM
- CNC draadsnijden: definitie, proces en toepassingen
- De geavanceerde EDM-draadsnijdmachine: Precisie & Betrouwbaarheid
- 6 organisatietypen die de edge-computing-revolutie drijven