from flask import Flask, request, jsonify, send_from_directory import tensorflow as tf import numpy as np import json from tensorflow.keras.preprocessing import image from PIL import Image import io import os import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from datetime import datetime from flask_cors import CORS app = Flask(__name__, static_folder='.', static_url_path='') CORS(app) # ───────────────────────────────────────────── # Paths (relative — works on HuggingFace) # ───────────────────────────────────────────── WEIGHTS_PATH = "best_weights.weights.h5" ARCH_PATH = "model_architecture.json" CLASS_NAMES_PATH = "class_names.json" SYMPTOMS_PATH = "symptoms.json" MEDICINES_PATH = "medicines.json" IMG_SIZE = (224, 224) PORT = 7860 # ───────────────────────────────────────────── # Email Configuration # ───────────────────────────────────────────── SENDER_EMAIL = "angrajkarn2004@gmail.com" SENDER_PASSWORD = "wpjh gfuv ipma ibyi" # ───────────────────────────────────────────── # Load Model & Data # ───────────────────────────────────────────── print("Loading model architecture from JSON...") with open(ARCH_PATH, 'r', encoding='utf-8') as f: model_json = f.read() model = tf.keras.models.model_from_json(model_json) print("Loading trained weights...") model.load_weights(WEIGHTS_PATH) with open(CLASS_NAMES_PATH, 'r', encoding='utf-8') as f: class_names = json.load(f) with open(SYMPTOMS_PATH, 'r', encoding='utf-8') as f: DISEASE_SYMPTOMS = json.load(f) with open(MEDICINES_PATH, 'r', encoding='utf-8') as f: MEDICINES_DB = json.load(f) print(f"Model and data loaded! {len(class_names)} classes ready.") # ───────────────────────────────────────────── # Image Preprocessing (identical to local backend) # ───────────────────────────────────────────── def preprocess_image(img_bytes): img = Image.open(io.BytesIO(img_bytes)).convert('RGB').resize(IMG_SIZE) img_array = image.img_to_array(img) img_array = np.expand_dims(img_array, axis=0) img_array = (img_array / 127.5) - 1.0 # ← exact same as local backend return img_array # ───────────────────────────────────────────── # Medicine Lookup # ───────────────────────────────────────────── def get_medicine_info(disease_name): return MEDICINES_DB.get(disease_name, {}) # ───────────────────────────────────────────── # Medicine HTML Block (for email) # ───────────────────────────────────────────── def build_medicine_html_block(meds): if not meds: return "
No specific medication data available.
" SECTION_LABELS = { "topical": "Topical Treatment", "oral_moderate": "Oral Treatment (Moderate)", "oral_severe": "Oral Treatment (Severe)", "systemic": "Systemic Treatment", "first_line": "First-Line Treatment", "adjuvants": "Adjuvant Therapy", "antipruritic": "Antipruritic (Itch Relief)", "antihistamines": "Antihistamines", "emollients": "Emollients / Moisturizers", "surgical": "Surgical Treatment", "immunotherapy": "Immunotherapy", "targeted_therapy": "Targeted Therapy", "biologics_psoriasis": "Biologic Therapy", "systemic_psoriasis": "Systemic (Psoriasis)", "topical_psoriasis": "Topical (Psoriasis)", "lichen_planus": "Lichen Planus Treatment", "rosacea_specific": "Rosacea-Specific", "vitiligo": "Vitiligo Treatment", "melasma": "Melasma Treatment", "photodermatoses": "Photodermatosis Treatment", "actinic_keratosis": "Actinic Keratosis", "basal_cell_carcinoma": "Basal Cell Carcinoma", "squamous_cell_carcinoma": "Squamous Cell Carcinoma", "impetigo_topical": "Impetigo (Topical)", "cellulitis_oral": "Cellulitis (Oral)", "severe_iv": "Severe / IV Therapy", "scabies_first_line": "Scabies First-Line", "scabies_adjuncts": "Scabies Adjuncts", "lyme_disease": "Lyme Disease", "insect_bites": "Insect Bite Relief", "onychomycosis_topical": "Nail Fungus (Topical)", "onychomycosis_oral": "Nail Fungus (Oral)", "nail_psoriasis": "Nail Psoriasis", "tinea_topical": "Tinea (Topical)", "tinea_oral": "Tinea (Oral)", "candidiasis": "Candidiasis", "acute_urticaria": "Acute Urticaria", "chronic_urticaria": "Chronic Urticaria", "anaphylaxis_emergency": "Anaphylaxis Emergency", "herpes_simplex": "Herpes Simplex", "herpes_zoster": "Herpes Zoster", "hpv_warts": "HPV / Warts", "androgenetic_alopecia": "Androgenetic Alopecia", "alopecia_areata": "Alopecia Areata", "telogen_effluvium": "Telogen Effluvium", "tinea_capitis": "Tinea Capitis", "mild": "Mild Cases", "moderate_to_severe": "Moderate-Severe Cases", "allergic_contact_dermatitis": "Allergic Contact Dermatitis", "mild_to_moderate": "Mild to Moderate", "sjs_ten_emergency": "SJS / TEN Emergency", "infantile_hemangioma": "Infantile Hemangioma", "pyogenic_granuloma": "Pyogenic Granuloma", "port_wine_stain": "Port Wine Stain", "cherry_angioma": "Cherry Angioma", "cutaneous_small_vessel": "Cutaneous Vasculitis", "systemic_vasculitis": "Systemic Vasculitis", "cutaneous_lupus": "Cutaneous Lupus", "systemic_lupus": "Systemic Lupus (SLE)", "warts": "Warts Treatment", "molluscum_contagiosum": "Molluscum Contagiosum", "viral_skin_infections_general": "General Viral Care", "seborrheic_keratosis": "Seborrheic Keratosis", "dermatofibroma": "Dermatofibroma", "lipoma": "Lipoma", "general_approach": "General Approach", "diabetes_related": "Diabetes-Related Skin", "thyroid_related": "Thyroid-Related Skin", "liver_disease": "Liver Disease Skin", "bullous_pemphigoid": "Bullous Pemphigoid", "wound_care": "Wound / Erosion Care", "topical_steroids": "Topical Steroids", "calcineurin_inhibitors": "Calcineurin Inhibitors", "supportive": "Supportive Care", } SKIP_KEYS = {"monitoring", "caution"} html = "" for key, value in meds.items(): if key in SKIP_KEYS: continue label = SECTION_LABELS.get(key, key.replace("_", " ").title()) if isinstance(value, list): items = "".join(f"{value}
Generated on {report_date}
Dear {name},
Thank you for using DermAI Skin Condition Analyzer.
Below is your personalized analysis report based on the image and symptoms provided.
| Predicted Condition | {disease} |
| Confidence Level | {confidence}% |
| Symptom Alignment | {match_score} |
| Symptoms You Reported | {symptoms_text or "None"} |
| Matching Symptoms | {matching_str} |
| Additional Notes | {missing_str} |
Based on standard clinical guidelines for the predicted condition. These are reference guidelines only — always follow your dermatologist's prescription.
{medicine_block}