Erstellen Sie einen KI-Workout-Form-Korrektor mit React Native, TensorFlow.js und Expo
Schritt-für-Schritt-Anleitung für eine KI-Fitness-App mit React Native, TensorFlow.js und Posenschätzung zur Übungskorrektur mit Datenschutz.
Auf dieser Seite
Wir kennen das alle: Wir folgen einem Trainingsvideo zu Hause und fragen uns, ob unsere Form stimmt. Ist mein Rücken bei dieser Kniebeuge gerade? Kippen meine Knie nach innen ein? Eine falsche Übungsausführung reduziert nicht nur die Effektivität eines Trainings, sondern ist eine häufige Ursache für Verletzungen. Professionelle Trainer sind teuer, und die meisten Fitness-Apps sind kaum mehr als Videoplayer.
Was wäre, wenn Ihr Telefon Ihr persönlicher Trainer sein könnte?
In diesem Tutorial werden wir genau das bauen: Eine React Native-Anwendung, die die Kamera Ihres Telefons und On-Device-Machine-Learning nutzt, um Echtzeit-Feedback zur Übungsausführung zu geben. Wir nutzen die Leistungsfähigkeit von TensorFlow.js, um ein hochmodernes Pose-Schätzungsmodell namens MoveNet direkt auf dem Gerät auszuführen. Dieser Ansatz ist schnell, funktioniert offline und ist vor allem vollständig privat – der Kamerastrom wird niemals an einen Server gesendet.
Was wir bauen werden: Wir erstellen einen einfachen Trainingsassistenten, der:
- Die Frontkamera mit Expo Camera anzapft.
- Den Videostream in Echtzeit mit TensorFlow.js und dem MoveNet-Pose-Erkennungsmodell analysiert.
- Die erkannten Körper-Schlüsselpunkte und das Skelett über das Kamerabild zeichnet.
- Gelenkwinkel berechnet, um zu bestimmen, ob eine Kniebeuge korrekt ausgeführt wird.
- Einfaches, umsetzbares Feedback wie „Geh tiefer!" oder „Gute Kniebeuge!" anzeigt.
Dieses Projekt ist ein perfekter Einstieg in die aufregende Welt der KI-gestützten Gesundheitstechnologie und kombiniert Computer Vision und mobile Entwicklung auf praktische, wirkungsvolle Weise.
Das Problem verstehen
Die zentrale Herausforderung besteht darin, einen visuellen Stream einer trainierenden Person in umsetzbares Feedback zu übersetzen. Dies lässt sich in einige technische Hürden aufteilen:
- Echtzeit-Analyse: Wir müssen Videobilder schnell genug verarbeiten, um sofortiges Feedback ohne Verzögerung zu geben.
- Präzise Pose-Schätzung: Das System muss die Positionen wichtiger Körpergelenke (Schultern, Ellbogen, Hüften, Knie usw.) genau identifizieren.
- Biomechanische Logik: Sobald wir die Gelenkpositionen haben, müssen wir regelbasierte Biomechanik anwenden, um die Form zu bewerten. Zum Beispiel müssen wir bei einer Kniebeuge den Kniewinkel messen, um die Tiefe zu bestimmen.
- On-Device-Leistung: Das Ausführen eines Deep-Learning-Modells auf einem Telefon kann ressourcenintensiv sein. Wir benötigen ein effizientes Modell und optimierten Code, um ein flüssiges Benutzererlebnis zu gewährleisten.
Unsere Lösung verwendet MoveNet, ein für Geschwindigkeit und Genauigkeit auf Geräten wie Smartphones optimiertes Modell, was es ideal für unsere Echtzeit-Anwendung macht.
Voraussetzungen
Um diesem Tutorial zu folgen, benötigen Sie:
- Node.js (LTS-Version empfohlen).
- Yarn oder npm für die Paketverwaltung.
- Die Expo Go-App auf Ihrem iOS- oder Android-Telefon zum Testen.
- Ein physisches Gerät ist erforderlich, um die Kamerafunktionalität zu testen. Die iOS/Android-Simulatoren funktionieren nicht.
- Grundlegende Kenntnisse in React und React Hooks (
useState,useEffect).
Schritt 1: Das Projekt einrichten
Zunächst erstellen wir ein neues Expo-Projekt und installieren die erforderlichen Abhängigkeiten.
Was wir tun
Wir initialisieren eine leere Expo-App und fügen Bibliotheken für die Kamera, TensorFlow.js, WebGL für GPU-Beschleunigung und eine 2D-Grafikbibliothek zum Zeichnen des Feedbacks hinzu.
Implementierung
Öffnen Sie Ihr Terminal und führen Sie die folgenden Befehle aus:
# Neues Expo-Projekt erstellen
npx create-expo-app ai-workout-trainer
cd ai-workout-trainer
# TensorFlow.js und Abhängigkeiten installieren
npm install @tensorflow/tfjs @tensorflow-models/pose-detection @react-native-async-storage/async-storage
# Expo-Module für Kamera, WebGL (für GPU-Unterstützung) und Dateisystem installieren
npm install expo-camera expo-gl expo-gl-cpp expo-file-system
# Eine Canvas-Bibliothek zum Zeichnen installieren. Wir werden React Native Skia verwenden.
npm install @shopify/react-native-skia
Wie es funktioniert
@tensorflow/tfjs: Die Kern-TensorFlow.js-Bibliothek.@tensorflow-models/pose-detection: Bietet vortrainierte Modelle, einschließlich MoveNet.expo-camera: Ermöglicht den Zugriff auf und die Anzeige des Gerätekamerabilds.expo-gl&expo-gl-cpp: Diese ermöglichen WebGL und erlauben TensorFlow.js, die GPU des Telefons für deutlich schnellere Modell-Inferenz zu nutzen.@shopify/react-native-skia: Eine leistungsstarke 2D-Grafikbibliothek, die wir verwenden werden, um das Skelett und Feedback auf einer Canvas-Überlagerung zu zeichnen.
Schritt 2: Kamera und TensorFlow.js integrieren
Jetzt bringen wir die Kamera zum Laufen und laden unser KI-Modell. Wir beginnen mit der Erstellung eines Custom Hooks zur Verwaltung des TensorFlow.js-Setups.
Was wir tun
Wir richten die Kamera-Komponente ein, fordern Benutzerberechtigungen an und erstellen einen wiederverwendbaren Hook zur Initialisierung von TensorFlow.js und zum Laden des MoveNet-Modells. Dies hält unsere Hauptkomponente sauber.
Implementierung
Erstellen Sie eine neue Datei src/useTensorFlow.js:
// src/useTensorFlow.js
import { useEffect, useState } from 'react';
import * as tf from '@tensorflow/tfjs';
import '@tensorflow/tfjs-react-native';
import * as poseDetection from '@tensorflow-models/pose-detection';
export const useTensorFlow = () => {
const [isReady, setIsReady] = useState(false);
const [model, setModel] = useState(null);
useEffect(() => {
const setup = async () => {
// 1. Warten, bis TensorFlow.js bereit ist
await tf.ready();
// 2. MoveNet-Detektor erstellen
const detectorConfig = {
modelType: poseDetection.movenet.modelType.SINGLEPOSE_LIGHTNING,
};
const detector = await poseDetection.createDetector(
poseDetection.SupportedModels.MoveNet,
detectorConfig
);
setModel(detector);
// 3. Bereit-Flag setzen
setIsReady(true);
console.log('TF und Modell bereit!');
};
setup();
}, []);
return { model, isReady };
};
Jetzt aktualisieren wir App.js, um diesen Hook zu verwenden und die Kamera anzuzeigen.
// App.js
import React, { useState, useEffect } from 'react';
import { StyleSheet, Text, View, Dimensions } from 'react-native';
import { Camera, CameraType } from 'expo-camera';
import { useTensorFlow } from './src/useTensorFlow';
const { width, height } = Dimensions.get('window');
export default function App() {
const [cameraPermission, setCameraPermission] = useState(null);
const { model, isReady } = useTensorFlow();
useEffect(() => {
(async () => {
const { status } = await Camera.requestCameraPermissionsAsync();
setCameraPermission(status === 'granted');
})();
}, []);
if (cameraPermission === null) {
return <View />;
}
if (cameraPermission === false) {
return <Text>Kein Zugriff auf die Kamera</Text>;
}
return (
<View style={styles.container}>
<Text style={styles.loadingText}>
{isReady ? 'Bereit!' : 'Modell wird geladen...'}
</Text>
<Camera
style={styles.camera}
type={CameraType.front}
// Hier werden wir später die Frame-Verarbeitungslogik hinzufügen
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
camera: {
width: width,
height: height,
},
loadingText: {
position: 'absolute',
top: 50,
color: 'white',
fontSize: 18,
zIndex: 10,
},
});
Wie es funktioniert
useTensorFlow-Hook: Dieser kapselt die Modelllade-Logik. Wir rufentf.ready()auf, um das TF.js-Backend zu initialisieren, und dannposeDetection.createDetector, um das vortrainierte MoveNet-Modell zu laden. Wir habenSINGLEPOSE_LIGHTNINGgewählt, weil es die schnellste Version ist – perfekt für die Echtzeit-Nutzung auf mobilen Geräten.App.js: Wir fordern die Kameraberechtigung mitCamera.requestCameraPermissionsAsync()an. Dann zeigen wir eine Lademeldung an, bis unser Custom Hook meldet, dass das Modell bereit ist. Schließlich rendern wir die Vollbild-Camera-Komponente.
Führen Sie die App jetzt mit npx expo start aus und öffnen Sie sie auf Ihrem Telefon. Sie sollten die Lademeldung sehen, gefolgt von „Bereit!" und Ihrem Frontkamera-Bild.
Schritt 3: Echtzeit-Pose-Schätzung
Hier passiert die Magie! Wir müssen Frames von der Kamera erfassen, sie an unser Modell senden und die Pose-Schlüsselpunkte zurückbekommen. expo-camera bietet keinen direkten Frame-für-Frame-Stream. Für dieses Tutorial verwenden wir einen cleveren Workaround mit takePictureAsync in einer Schleifenfunktion.
Hinweis: Für eine Produktions-App ist react-native-vision-camera mit seiner Frame Processor API eine leistungsfähigere Wahl, da der Overhead des Speicherns von Bildern entfällt.
Was wir tun
Wir erstellen eine Funktion, die kontinuierlich Bilder von der Kamera erfasst, sie in das Tensor-Format konvertiert, das TensorFlow.js erwartet, das Modell ausführt und die erkannten Posen im State unserer Komponente speichert.
Implementierung
Aktualisieren Sie App.js mit der Pose-Erkennungslogik:
// App.js (Ergänzungen)
import { cameraWithTensors } from '@tensorflow/tfjs-react-native';
import * as FileSystem from 'expo-file-system';
// Camera mit cameraWithTensors HOC wrappen
const TensorCamera = cameraWithTensors(Camera);
// ... innerhalb der App-Komponente
const [poses, setPoses] = useState([]);
const cameraRef = React.useRef(null);
// Diese Funktion wird für jeden Frame von der Kamera aufgerufen
const handleCameraStream = (images) => {
const loop = async () => {
const nextImageTensor = images.next().value;
if (!nextImageTensor) {
// Kein neues Bild, nichts tun
requestAnimationFrame(loop);
return;
}
// 1. Posen schätzen
const estimatedPoses = await model.estimatePoses(nextImageTensor);
setPoses(estimatedPoses);
// 2. Den Tensor entsorgen, um Speicher freizugeben
tf.dispose(nextImageTensor);
// 3. Zur nächsten Frame Schleife
requestAnimationFrame(loop);
};
loop();
};
// ... in der return-Anweisung, <Camera> durch <TensorCamera> ersetzen
<TensorCamera
ref={cameraRef}
style={styles.camera}
type={CameraType.front}
cameraTextureHeight={1920}
cameraTextureWidth={1080}
resizeHeight={200}
resizeWidth={152}
resizeDepth={3}
onReady={handleCameraStream}
autorender={true}
/>
Wie es funktioniert
cameraWithTensors: Dies ist eine Higher-Order Component von@tensorflow/tfjs-react-native. Sie umschließt die Standard-Camera-Komponente und bietet eine neue Prop,onReady, die uns einen Stream von Bild-Tensoren direkt aus dem Kamerabild liefert. Dies ist weitaus effizienter als das Aufnehmen von Bildern und manuelle Konvertierung.handleCameraStream: Diese Funktion empfängt den Bild-Stream. Wir erstellen eine asynchroneloop, die dasnextImageTensoraus dem Stream holt.model.estimatePoses(): Dies ist die Kern-TensorFlow.js-Funktion. Wir übergeben ihr den Bild-Tensor, und sie gibt ein Array erkannter Posen zurück. Da wir ein Single-Pose-Modell verwenden, hat dieses Array maximal ein Pose-Objekt.tf.dispose(): Entscheidend für die Leistung! Tensoren verbrauchen GPU-Speicher. Wir müssen sie explizit entsorgen, wenn wir fertig sind, um Speicherlecks zu verhindern, die die App zum Absturz bringen würden.requestAnimationFrame(loop): Dies erstellt eine effiziente Schleife, die Frames so schnell verarbeitet, wie das Gerät es verarbeiten kann, ohne den UI-Thread zu blockieren.
Schritt 4: Das Skelett zeichnen (visuelles Feedback)
Jetzt, da wir die Pose-Daten haben, visualisieren wir sie! Wir überlagern eine Skia-Canvas über die Kamera und zeichnen die Schlüsselpunkte und die Linien, die sie verbinden.
Was wir tun
Wir erstellen eine neue Komponente, PoseSkeleton, die die Pose-Daten als Prop entgegennimmt und React Native Skia verwendet, um Kreise für die Schlüsselpunkte und Linien für die Knochen zu zeichnen.
Implementierung
Erstellen Sie zunächst src/PoseSkeleton.js:
// src/PoseSkeleton.js
import React from 'react';
import { Canvas, Path, Skia, Circle } from '@shopify/react-native-skia';
import { StyleSheet } from 'react-native';
const PoseSkeleton = ({ poses, cameraWidth, cameraHeight }) => {
if (!poses || poses.length === 0) {
return null;
}
// Verbindungen zwischen Schlüsselpunkten definieren, um das Skelett zu bilden
const skeletonConnections = [
['nose', 'left_eye'], ['left_eye', 'left_ear'],
['nose', 'right_eye'], ['right_eye', 'right_ear'],
['nose', 'left_shoulder'], ['nose', 'right_shoulder'],
['left_shoulder', 'right_shoulder'],
['left_shoulder', 'left_elbow'], ['left_elbow', 'left_wrist'],
['right_shoulder', 'right_elbow'], ['right_elbow', 'right_wrist'],
['left_shoulder', 'left_hip'], ['right_shoulder', 'right_hip'],
['left_hip', 'right_hip'],
['left_hip', 'left_knee'], ['left_knee', 'left_ankle'],
['right_hip', 'right_knee'], ['right_knee', 'right_ankle'],
];
const pose = poses; // Wir haben nur eine Pose
const keypoints = pose.keypoints.reduce((acc, keypoint) => {
acc[keypoint.name] = keypoint;
return acc;
}, {});
const path = Skia.Path.Make();
skeletonConnections.forEach(([startName, endName]) => {
const start = keypoints[startName];
const end = keypoints[endName];
if (start && end && start.score > 0.5 && end.score > 0.5) {
path.moveTo(start.x, start.y);
path.lineTo(end.x, end.y);
}
});
return (
<Canvas style={StyleSheet.absoluteFill}>
{Object.values(keypoints).map((p) => {
if (p.score > 0.5) { // Nur selbstbewusste Schlüsselpunkte zeichnen
return <Circle key={p.name} cx={p.x} cy={p.y} r={5} color="cyan" />;
}
return null;
})}
<Path
path={path}
color="aqua"
style="stroke"
strokeWidth={3}
/>
</Canvas>
);
};
export default PoseSkeleton;
Jetzt integrieren Sie es in App.js:
// App.js (Ergänzungen)
import PoseSkeleton from './src/PoseSkeleton';
// ... in der return-Anweisung der App-Komponente, nach TensorCamera
{poses && poses.length > 0 && (
<PoseSkeleton poses={poses} cameraWidth={width} cameraHeight={height} />
)}
Wie es funktioniert
- Die
PoseSkeleton-Komponente empfängt dasposes-Array. - Wir prüfen, ob der
score(Konfidenzniveau) eines Schlüsselpunkts über einem Schwellenwert (0,5) liegt, bevor wir ihn zeichnen. - Schlüsselpunkte zeichnen: Wir mappen über die Schlüsselpunkte und rendern einen Skia-
<Circle>für jeden. - Das Skelett zeichnen: Wir erstellen eine
skeletonConnections-Map, die definiert, welche Gelenke verbunden werden sollen. Dann erstellen wir einen Skia-<Path>und verwendenmoveToundlineTo, um die Linien zu zeichnen, effectively connecting the dots. - Wir verwenden
StyleSheet.absoluteFillauf dem<Canvas>, um es zu einer transparenten Überlagerung zu machen, die perfekt zu den Kamera-Dimensionen passt.
Wenn Sie die App jetzt ausführen, sollten Sie ein cyanfarbenes Skelett in Echtzeit über Ihrem Körper sehen!
Schritt 5: Kniebeuge-Korrekturlogik implementieren
Dies ist der „Trainer"-Teil unseres KI-Trainers. Wir berechnen den Winkel der Knie und Hüften, um zu bestimmen, ob eine Kniebeuge tief genug ist, und geben Feedback.
Was wir tun
Wir schreiben eine Hilfsfunktion zur Berechnung des Winkels zwischen drei Punkten. Dann verwenden wir in unserer Hauptkomponente diese Funktion für die Hüft-, Knie- und Knöchel-Schlüsselpunkte, um die Kniebeuge-Tiefe zu messen und Feedback anzuzeigen.
Implementierung
Erstellen Sie zunächst eine Utility-Datei src/geometry.js:
// src/geometry.js
// Funktion zur Berechnung des Winkels zwischen drei Punkten
export function calculateAngle(a, b, c) {
const radians = Math.atan2(c.y - b.y, c.x - b.x) - Math.atan2(a.y - b.y, a.x - b.x);
let angle = Math.abs(radians * 180.0 / Math.PI);
if (angle > 180.0) {
angle = 360 - angle;
}
return angle;
}
Jetzt verwenden wir dies in App.js, um Feedback zu geben.
// App.js (Ergänzungen)
import { calculateAngle } from './src/geometry';
// ... innerhalb der App-Komponente
const [feedback, setFeedback] = useState('');
// Dieser useEffect wird ausgeführt, wenn sich die Posen ändern
useEffect(() => {
if (poses && poses.length > 0) {
const keypoints = poses.keypoints.reduce((acc, keypoint) => {
acc[keypoint.name] = keypoint;
return acc;
}, {});
const leftHip = keypoints['left_hip'];
const leftKnee = keypoints['left_knee'];
const leftAnkle = keypoints['left_ankle'];
if (leftHip && leftKnee && leftAnkle &&
leftHip.score > 0.5 && leftKnee.score > 0.5 && leftAnkle.score > 0.5) {
// Den Winkel des linken Knies berechnen
const kneeAngle = calculateAngle(leftHip, leftKnee, leftAnkle);
// Einfache Logik für die Kniebeuge-Tiefe
if (kneeAngle > 160) {
setFeedback('Kniebeuge starten');
} else if (kneeAngle < 100) {
setFeedback('Gute Kniebeuge!');
} else {
setFeedback('Geh tiefer!');
}
}
}
}, [poses]);
// ... in der return-Anweisung, eine Text-Komponente für Feedback hinzufügen
<Text style={styles.feedbackText}>{feedback}</Text>
// ... in StyleSheet, Stile für den Feedback-Text hinzufügen
feedbackText: {
position: 'absolute',
bottom: 100,
left: 20,
backgroundColor: 'rgba(0, 0, 0, 0.5)',
color: 'white',
fontSize: 24,
padding: 10,
borderRadius: 5,
zIndex: 10,
}
Wie es funktioniert
calculateAngle: Diese Funktion verwendet Vektormathematik (atan2), um den von drei Schlüsselpunkten gebildeten Winkel zu finden. Wir verwenden dies, um die Beugung unserer Gelenke zu messen.useEffect-Hook: Wir führen unsere Analyselogik in einemuseEffectaus, das vonposesabhängt. Dies stellt sicher, dass die Logik jedes Mal ausgeführt wird, wenn eine neue Pose erkannt wird.- Form-Logik: Wir holen die Hüft-, Knie- und Knöchel-Schlüsselpunkte. Wir berechnen den
kneeAngleund wenden einfache Regeln an:- Wenn der Winkel > 160° ist, steht der Benutzer wahrscheinlich.
- Wenn der Winkel < 100° ist, hat er eine gute Kniebeuge-Tiefe erreicht.
- Andernfalls muss er tiefer gehen.
- Das Feedback wird im State gespeichert und in einer
<Text>-Komponente über dem Bildschirm angezeigt.
Leistungsüberlegungen
- Modellauswahl: Wir haben aus einem Grund
SINGLEPOSE_LIGHTNINGverwendet – es ist schnell. Für höhere Genauigkeit könnten SieSINGLEPOSE_THUNDERverwenden, aber erwarten Sie einen Leistungsabfall. - Tensor-Verwaltung: Wenn Sie vergessen,
tf.dispose()auf Tensoren aufzurufen, führt dies zu Speicherlecks und App-Abstürzen.cameraWithTensorshilft bei der Verwaltung, aber seien Sie vorsichtig, wenn Sie Tensoren manuell erstellen. - Bildrate: Der
cameraWithTensors-Ansatz ist gut, aber nicht perfekt. Für Produktions-Apps, die konsistent hohe FPS benötigen, erkunden Siereact-native-vision-cameraund seine JSI-basierten Frame Processors, die es Ihnen ermöglichen, JavaScript-Code synchron auf dem Kamera-Thread für maximale Leistung auszuführen. - Modell-Quantisierung: Für noch bessere Leistung können Sie Post-Training-Quantisierung verwenden, um die Größe Ihres Modells zu reduzieren, was zu schnelleren Ladezeiten und Inferenz führt.
Best Practices für die Sicherheit
Einer der größten Vorteile dieser Architektur ist ihre Privatsphäre.
- On-Device-Verarbeitung: Alle Bildverarbeitung findet auf dem Gerät des Benutzers statt. Es werden keine Videos oder persönlichen Daten in die Cloud gesendet. Dies ist ein entscheidendes Feature für jede Gesundheits- und Fitness-App und ein großer Verkaufsvorteil.
- Berechtigungen: Wir fordern korrekt Kameraberechtigungen an und behandeln den Fall, in dem der Benutzer sie verweigert. Erklären Sie immer, warum Sie eine Berechtigung benötigen, bevor Sie danach fragen.
Fazit
Herzlichen Glückwunsch! Sie haben gerade eine raffinierte KI-gestützte Fitness-Anwendung mit React Native gebaut. Wir haben einen Echtzeit-Kamerastrom genommen, ein leistungsstarkes On-Device-Machine-Learning-Modell verwendet, um menschliche Posen zu verstehen, und sofortiges, umsetzbares Feedback gegeben, um einem Benutzer zu helfen, seine Kniebeuge-Form zu verbessern.
Dies ist erst der Anfang. Sie können auf diesem Fundament aufbauen:
- Logik für andere Übungen hinzufügen (Liegestütze, Ausfallschritte).
- Einen Wiederholungszähler implementieren.
- Vollständige Trainingseinheiten erstellen.
- Fortschritt über die Zeit verfolgen und lokal speichern.
Die Kombination aus mobiler Entwicklung mit On-Device-KI eröffnet eine Welt voller Möglichkeiten für die Erstellung intelligenter, privater und genuin hilfreicher Anwendungen.
Ressourcen
- TensorFlow.js Offizielle Website
- Expo Camera Dokumentation
- React Native Skia Dokumentation
- MoveNet Modell-Informationen
Kurzreferenz
| Aspekt | Wichtige Informationen |
|---|---|
| Thema | Entwicklung |
| Relevanz | Patientenaufklärung und -bewusstsein |
| Maßnahme | Besprechen Sie dies mit Ihrem medizinischen Betreuer |
| Häufigkeit | Wie von Ihrem Betreuungsteam empfohlen |
| Evidenz | Basierend auf aktuellen klinischen Richtlinien |
Häufig gestellte Fragen
F: Woher weiß ich, ob dies für mich gilt? A: Besprechen Sie Ihre persönliche und familiäre Krankengeschichte mit Ihrem medizinischen Betreuer, um Ihre individuellen Risikofaktoren zu bewerten und geeignete nächste Schritte zu bestimmen.
F: Was sollte ich meinen Arzt fragen? A: Gute Fragen sind unter anderem: „Was bedeuten meine Ergebnisse?", „Was sind meine Optionen?", „Welche Lebensstiländerungen würden helfen?" und „Wann sollte ich nachuntersuchen?"
F: Gibt es Lebensstiländerungen, die helfen können? A: Die meisten Gesundheitszustände profitieren von grundlegenden Maßnahmen: ausgewogene Ernährung, regelmäßige körperliche Aktivität (150+ Minuten/Woche), качественный Schlaf (7-9 Stunden), Stressbewältigung und Vermeidung von Tabak.
Haftungsausschluss
Dieser Artikel dient nur zu Bildungszwecken und stellt keine medizinische Beratung dar. Konsultieren Sie immer einen qualifizierten medizinischen Betreuer, bevor Sie Entscheidungen über Ihre Gesundheit, Behandlung oder Pflege treffen. Individuelle Umstände variieren, und was für eine Person angemessen ist, ist möglicherweise nicht für eine andere geeignet.
Wenn Sie einen medizinischen Notfall haben, rufen Sie sofort 911 (oder Ihre lokale Notrufnummer) an.