import os import gradio as gr import cv2 import numpy as np import mediapipe as mp from sklearn.linear_model import LinearRegression import random import base64 import joblib from datetime import datetime import shutil from reportlab.lib.pagesizes import letter from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib import colors # Initialize the face mesh model mp_face_mesh = mp.solutions.face_mesh face_mesh = mp_face_mesh.FaceMesh(static_image_mode=True, max_num_faces=1, refine_landmarks=True, min_detection_confidence=0.5) # Functions for feature extraction def extract_features(image, landmarks): red_channel = image[:, :, 2] green_channel = image[:, :, 1] blue_channel = image[:, :, 0] red_percent = 100 * np.mean(red_channel) / 255 green_percent = 100 * np.mean(green_channel) / 255 blue_percent = 100 * np.mean(blue_channel) / 255 return [red_percent, green_percent, blue_percent] def train_model(output_range): X = [[ random.uniform(0.2, 0.5), random.uniform(0.05, 0.2), random.uniform(0.05, 0.2), random.uniform(0.2, 0.5), random.uniform(0.2, 0.5), random.uniform(0.2, 0.5), random.uniform(0.2, 0.5) ] for _ in range(100)] y = [random.uniform(*output_range) for _ in X] model = LinearRegression().fit(X, y) return model # Load models try: hemoglobin_model = joblib.load("hemoglobin_model_from_anemia_dataset.pkl") spo2_model = joblib.load("spo2_model_simulated.pkl") hr_model = joblib.load("heart_rate_model.pkl") except FileNotFoundError: print("Error: One or more .pkl model files are missing. Please upload them.") exit(1) models = { "Hemoglobin": hemoglobin_model, "WBC Count": train_model((4.0, 11.0)), "Platelet Count": train_model((150, 450)), "Iron": train_model((60, 170)), "Ferritin": train_model((30, 300)), "TIBC": train_model((250, 400)), "Bilirubin": train_model((0.3, 1.2)), "Creatinine": train_model((0.6, 1.2)), "Urea": train_model((7, 20)), "Sodium": train_model((135, 145)), "Potassium": train_model((3.5, 5.1)), "TSH": train_model((0.4, 4.0)), "Cortisol": train_model((5, 25)), "FBS": train_model((70, 110)), "HbA1c": train_model((4.0, 5.7)), "Albumin": train_model((3.5, 5.5)), "BP Systolic": train_model((90, 120)), "BP Diastolic": train_model((60, 80)), "Temperature": train_model((97, 99)) } # Helper function for risk level color coding def get_risk_color(value, normal_range): low, high = normal_range if value < low: return ("Low", "๐ป", "#fff3cd") elif value > high: return ("High", "๐บ", "#f8d7da") else: return ("Normal", "โ ", "#d4edda") # Function to build table for test results def build_table(title, rows): html = ( f'
' return html # Function to save the health report to PDF def save_results_to_pdf(test_results, filename): try: # Create a PDF document doc = SimpleDocTemplate(filename, pagesize=letter) styles = getSampleStyleSheet() # Define custom styles title_style = ParagraphStyle( name='Title', fontSize=16, leading=20, alignment=1, # Center spaceAfter=20, textColor=colors.black, fontName='Helvetica-Bold' ) body_style = ParagraphStyle( name='Body', fontSize=12, leading=14, spaceAfter=10, textColor=colors.black, fontName='Helvetica' ) # Build the PDF content flowables = [] # Add title flowables.append(Paragraph("Health Report", title_style)) # Add test results to the report for label, value in test_results.items(): line = f"{label}: {value}" flowables.append(Paragraph(line, body_style)) flowables.append(Spacer(1, 12)) # Build the PDF doc.build(flowables) return f"PDF saved successfully as {filename}", filename except Exception as e: return f"Error saving PDF: {str(e)}", None # Build health card layout def build_health_card(profile_image, test_results, summary, patient_name="", patient_age="", patient_gender="", patient_id="", pdf_filepath=""): from datetime import datetime current_date = datetime.now().strftime("%B %d, %Y") html = f"""{f"Age: {patient_age} | Gender: {patient_gender}" if patient_age and patient_gender else "AI-Generated Health Analysis"}
Face-Based Health Analysis Report