Spaces:
Sleeping
Sleeping
| # Face Detection-Based AI Automation of Lab Tests | |
| # Streamlit App with OpenCV + rPPG + MediaPipe Integration (Deployable on Hugging Face Spaces) | |
| import streamlit as st | |
| import cv2 | |
| import numpy as np | |
| import mediapipe as mp | |
| import pandas as pd | |
| import time | |
| import os | |
| # Setup Mediapipe Face Mesh | |
| mp_face_mesh = mp.solutions.face_mesh | |
| face_mesh = mp_face_mesh.FaceMesh(static_image_mode=False, max_num_faces=1, refine_landmarks=True, min_detection_confidence=0.5) | |
| # Function to calculate mean green intensity (simplified rPPG) | |
| def estimate_heart_rate(frame, landmarks): | |
| h, w, _ = frame.shape | |
| forehead_pts = [landmarks[10], landmarks[338], landmarks[297], landmarks[332]] | |
| mask = np.zeros((h, w), dtype=np.uint8) | |
| pts = np.array([[int(pt.x * w), int(pt.y * h)] for pt in forehead_pts], np.int32) | |
| cv2.fillConvexPoly(mask, pts, 255) | |
| green_channel = cv2.split(frame)[1] | |
| mean_intensity = cv2.mean(green_channel, mask=mask)[0] | |
| heart_rate = int(60 + 30 * np.sin(mean_intensity / 255.0 * np.pi)) # Simulated | |
| return heart_rate | |
| # Estimate SpO2 and Respiratory Rate (dummy based on heart rate) | |
| def estimate_spo2_rr(heart_rate): | |
| spo2 = min(100, max(90, 97 + (heart_rate % 5 - 2))) | |
| rr = int(12 + abs(heart_rate % 5 - 2)) | |
| return spo2, rr | |
| # Streamlit UI setup | |
| st.set_page_config(page_title="Face-Based Lab Test Automation", layout="wide") | |
| st.title("🧠 Face Detection-Based AI Automation of Lab Tests") | |
| col1, col2 = st.columns([1, 2]) | |
| # Left: Webcam and Face Scan | |
| with col1: | |
| st.header("📷 Scan Face") | |
| run = st.checkbox("Start Camera") | |
| FRAME_WINDOW = st.image([]) | |
| camera = cv2.VideoCapture(0) | |
| results = {} | |
| while run: | |
| ret, frame = camera.read() | |
| if not ret: | |
| break | |
| frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) | |
| result = face_mesh.process(frame_rgb) | |
| if result.multi_face_landmarks: | |
| landmarks = result.multi_face_landmarks[0].landmark | |
| heart_rate = estimate_heart_rate(frame_rgb, landmarks) | |
| spo2, rr = estimate_spo2_rr(heart_rate) | |
| results = { | |
| "Hemoglobin": "12.3 g/dL (Estimated)", | |
| "SpO2": f"{spo2}%", | |
| "Heart Rate": f"{heart_rate} bpm", | |
| "Blood Pressure": "Low", | |
| "Respiratory Rate": f"{rr} breaths/min", | |
| "Risk Flags": ["Anemia Mild", "Hydration Low"] | |
| } | |
| FRAME_WINDOW.image(frame_rgb) | |
| if cv2.waitKey(1) & 0xFF == ord('q'): | |
| break | |
| camera.release() | |
| # Right: Health Report | |
| with col2: | |
| st.header("🧪 AI-Based Diagnostic Report") | |
| if results: | |
| with st.expander("Hematology & Blood Tests", expanded=True): | |
| st.metric("Hemoglobin", results["Hemoglobin"], "Anemia Mild") | |
| with st.expander("Vital Signs and Biochemical Tests", expanded=True): | |
| st.metric("SpO2", results["SpO2"]) | |
| st.metric("Heart Rate", results["Heart Rate"]) | |
| st.metric("Blood Pressure", results["Blood Pressure"], "Low") | |
| st.metric("Respiratory Rate", results["Respiratory Rate"], "Hydration Low") | |
| with st.expander("Risk Flags"): | |
| for flag in results["Risk Flags"]: | |
| st.error(flag) | |
| # Export Button | |
| if st.button("📥 Export Report as CSV"): | |
| df = pd.DataFrame([results]) | |
| df.to_csv("lab_scan_report.csv", index=False) | |
| st.success("Report saved as lab_scan_report.csv") | |
| else: | |
| st.info("No face scan detected yet.") | |
| # Footer | |
| st.markdown("---") | |
| st.caption("© 2025 FaceLab AI by Sathkrutha Tech Solutions. Built with Streamlit, OpenCV, MediaPipe, and rPPG techniques.") | |