import streamlit as st import keras from keras.preprocessing.image import img_to_array import numpy as np from PIL import Image import base64 import torch from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM from reportlab.lib.pagesizes import letter from reportlab.pdfgen import canvas import io import logging # -------------- Logging Configuration -------------- logging.basicConfig(level=logging.INFO) logger = logging.getLogger() # -------------- Page Config -------------- st.set_page_config(page_title="VisiHealth AI", layout="centered") # -------------- Custom CSS -------------- def set_custom_styles(bg_img_path): try: with open(bg_img_path, "rb") as img_file: encoded = base64.b64encode(img_file.read()).decode() css = f""" """ st.markdown(css, unsafe_allow_html=True) except Exception as e: logger.error(f"Error in set_custom_styles: {e}") set_custom_styles("img1.png") # -------------- Cache and Load Models -------------- @st.cache_resource def load_hair_model(): try: model = keras.models.load_model('VGG19-Final.h5') return model except Exception as e: logger.error(f"Error loading hair model: {e}") @st.cache_resource def load_skin_model(): try: model = keras.models.load_model('skin_cancer_detection_model.h5') return model except Exception as e: logger.error(f"Error loading skin model: {e}") @st.cache_resource def load_dental_model(): try: model = keras.models.load_model('oral_disease.h5') return model except Exception as e: logger.error(f"Error loading dental model: {e}") @st.cache_resource def load_cure_generator(): try: tokenizer = AutoTokenizer.from_pretrained("TinyLlama/TinyLlama-1.1B-Chat-v1.0") model = AutoModelForCausalLM.from_pretrained("TinyLlama/TinyLlama-1.1B-Chat-v1.0") return pipeline("text-generation", model=model, tokenizer=tokenizer, device=0) except Exception as e: logger.error(f"Error loading cure generator: {e}") hair_model = load_hair_model() skin_model = load_skin_model() dental_model = load_dental_model() cure_generator = load_cure_generator() # -------------- Disease Labels -------------- hair_diseases = ['Alopecia Areata', 'Contact Dermatitis', 'Folliculitis', 'Head Lice', 'Lichen Planus', 'Male Pattern Baldness', 'Psoriasis', 'Seborrheic Dermatitis', 'Telogen Effluvium', 'Tinea Capitis'] skin_diseases = ['Actinic Keratoses', 'Basal Cell Carcinoma', 'Benign Keratosis', 'Dermatofibroma', 'Melanoma', 'Nevus', 'Vascular Lesion'] dental_diseases = ['Calculus', 'Caries_Gingivitus_ToothDiscoloration', 'Data caries', 'Gingivitis', 'Mouth Ulcer', 'Tooth Discoloration', 'hypodontia'] # -------------- Cure Generator -------------- def generate_cure_details(disease_name): try: prompt = f"""<|user|> Provide detailed medical information for the disease: {disease_name}: 1. Description 2. Symptoms 3. Possible Treatments 4. Cost Estimate (in Rs. or USD) 5. Estimated Recovery Time <|assistant|>""" result = cure_generator(prompt, max_length=2048, do_sample=True, temperature=0.7)[0]['generated_text'] return result except Exception as e: logger.error(f"Error generating cure details for {disease_name}: {e}") # -------------- Preprocessing -------------- def preprocess_image(img): try: img = img.resize((224, 224)) return np.expand_dims(np.array(img) / 255.0, axis=0) except Exception as e: logger.error(f"Error preprocessing image: {e}") # -------------- Predict Functions -------------- def predict_hair_disease(img_array): try: return hair_diseases[np.argmax(hair_model.predict(img_array), axis=1)[0]] except Exception as e: logger.error(f"Error predicting hair disease: {e}") def predict_skin_disease(img_array): try: return skin_diseases[np.argmax(skin_model.predict(img_array))] except Exception as e: logger.error(f"Error predicting skin disease: {e}") def predict_dental_disease(img_array): try: return dental_diseases[np.argmax(dental_model.predict(img_array))] except Exception as e: logger.error(f"Error predicting dental disease: {e}") # -------------- PDF Generation -------------- def generate_pdf(cure_info, disease_name): try: buffer = io.BytesIO() c = canvas.Canvas(buffer, pagesize=letter) c.setFont("Helvetica", 12) c.drawString(100, 750, f"VisiHealth AI - Disease: {disease_name}") c.drawString(100, 730, "--------------------------------------------------------") y_position = 710 for line in cure_info.split("\n"): c.drawString(100, y_position, line) y_position -= 15 c.save() buffer.seek(0) return buffer except Exception as e: logger.error(f"Error generating PDF: {e}") # -------------- Main App -------------- st.markdown("