Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import numpy as np | |
| from tensorflow.keras.models import load_model | |
| from tensorflow.keras.preprocessing import image | |
| from gtts import gTTS | |
| from deep_translator import GoogleTranslator | |
| from PIL import Image | |
| import tempfile | |
| import json | |
| import os | |
| # === Load model === | |
| model = load_model("DermNet_Samples.keras") | |
| # === Load metadata === | |
| with open("dermnet_disease.json", "r") as f: | |
| disease_metadata = json.load(f) | |
| # === Class names must match the model's output order === | |
| class_names = [ | |
| 'Acne and Rosacea', 'Actinic Keratosis Basal Cell Carcinoma and other Malignant Lesions', | |
| 'Atopic Dermatitis', 'Bullous Disease', | |
| 'Cellulitis Impetigo and other Bacterial Infections', 'Eczema', | |
| 'Exanthems and Drug Eruptions', 'Hair Loss Alopecia and other Hair Diseases', | |
| 'Herpes HPV and other STDs', 'Light Diseases and Disorders of Pigmentation', | |
| 'Lupus and other Connective Tissue diseases', 'Melanoma Skin Cancer Nevi and Moles', | |
| 'Nail Fungus and other Nail Disease', 'Poison Ivy and other Contact Dermatitis', | |
| 'Psoriasis pictures Lichen Planus and related diseases', | |
| 'Scabies Lyme Disease and other Infestations and Bites', | |
| 'Seborrheic Keratoses and other Benign Tumors', 'Systemic Disease', | |
| 'Tinea Ringworm Candidiasis and other Fungal Infections', 'Urticaria Hives', | |
| 'Vascular Tumors', 'Vasculitis', | |
| 'Warts Molluscum and other Viral Infections' | |
| ] | |
| # === Health tips === | |
| original_tips = { | |
| 'Acne and Rosacea': "Wash your face twice daily and use gentle skin products. For serious breakouts, consult a dermatologist.", | |
| 'Actinic Keratosis Basal Cell Carcinoma and other Malignant Lesions': "Protect your skin from sun exposure and consult a dermatologist immediately if any skin changes appear.", | |
| 'Atopic Dermatitis': "Moisturize your skin frequently, avoid known irritants, and apply anti-inflammatory creams as prescribed.", | |
| 'Bullous Disease': "Avoid trauma to the skin and seek immediate care, as these conditions may be autoimmune-related.", | |
| 'Cellulitis Impetigo and other Bacterial Infections': "Keep the area clean and take antibiotics as prescribed by a healthcare provider.", | |
| 'Eczema': "Avoid hot showers, use mild soap, and moisturize daily. Severe cases may require corticosteroid creams.", | |
| 'Exanthems and Drug Eruptions': "Stop using the suspected medication and consult a healthcare provider urgently.", | |
| 'Hair Loss Alopecia and other Hair Diseases': "Be gentle with hair, avoid tight hairstyles, and consult a doctor for treatment options.", | |
| 'Herpes HPV and other STDs': "Avoid direct contact during outbreaks and use antiviral medication as prescribed.", | |
| 'Light Diseases and Disorders of Pigmentation': "Use sunscreen regularly and seek expert evaluation for sudden pigmentation changes.", | |
| 'Lupus and other Connective Tissue diseases': "Avoid sunlight exposure and follow the treatment prescribed by a rheumatologist.", | |
| 'Melanoma Skin Cancer Nevi and Moles': "Monitor for any skin changes in moles and consult a dermatologist for screening.", | |
| 'Nail Fungus and other Nail Disease': "Keep nails dry and trimmed; antifungal treatments may be required for infections.", | |
| 'Poison Ivy and other Contact Dermatitis': "Avoid contact with allergens and use anti-itch or steroid creams as directed.", | |
| 'Psoriasis pictures Lichen Planus and related diseases': "Keep skin moisturized and use medicated creams. Stress management can help.", | |
| 'Scabies Lyme Disease and other Infestations and Bites': "Apply prescribed topical treatments and wash all clothes and bedding.", | |
| 'Seborrheic Keratoses and other Benign Tumors': "Usually harmless, but removal may be done for cosmetic reasons. Consult a dermatologist.", | |
| 'Systemic Disease': "Skin symptoms may reflect an internal condition. Immediate medical consultation is advised.", | |
| 'Tinea Ringworm Candidiasis and other Fungal Infections': "Apply antifungal cream regularly and keep the area dry. Avoid sharing personal items.", | |
| 'Urticaria Hives': "Avoid known allergens and take antihistamines. If persistent, consult a doctor.", | |
| 'Vascular Tumors': "Some vascular tumors are harmless, but others may need medical imaging or removal.", | |
| 'Vasculitis': "Seek medical care promptly, as vasculitis may indicate an underlying autoimmune disorder.", | |
| 'Warts Molluscum and other Viral Infections': "Avoid scratching, maintain hygiene, and use antiviral or cryotherapy treatments as needed." | |
| } | |
| # === Language codes === | |
| tts_lang_codes = { | |
| "English": "en", | |
| "Hausa": "ha", | |
| "Yoruba": "yo", | |
| "Igbo": "ig" | |
| } | |
| # === TTS Function === | |
| def generate_tip_audio(disease, language, translated_tip): | |
| message = ( | |
| f"This disease is most likely to be {disease}. " | |
| f"The health tip for this predicted disease is: {translated_tip}" | |
| ) | |
| lang_code = tts_lang_codes.get(language, "en") | |
| tts = gTTS(text=message, lang=lang_code) | |
| temp_audio = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") | |
| tts.save(temp_audio.name) | |
| return temp_audio.name | |
| # === Prediction Function === | |
| def predict_and_translate(img, language): | |
| img = img.resize((224, 224)) | |
| img_array = image.img_to_array(img) | |
| img_array = np.expand_dims(img_array, axis=0) / 255.0 | |
| prediction = model.predict(img_array)[0] | |
| predicted_index = np.argmax(prediction) | |
| most_likely_class = class_names[predicted_index] | |
| # Translate tip | |
| tip_text = original_tips.get(most_likely_class, "Maintain good hygiene and seek professional care.") | |
| tip_text += " Contact a dermatologist for better treatment." | |
| translated_tip = GoogleTranslator(source='en', target=tts_lang_codes[language]).translate(tip_text) | |
| # Metadata | |
| meta = disease_metadata.get(most_likely_class, {}) | |
| meta_text = f"**Description**: {meta.get('description', 'N/A')}\n\n" | |
| meta_text += f"**Symptoms**: {', '.join(meta.get('symptoms', []))}\n\n" | |
| meta_text += f"**Causes**: {', '.join(meta.get('causes', []))}\n\n" | |
| meta_text += f"**Treatments**: {', '.join(meta.get('treatments', []))}\n\n" | |
| meta_text += f"**Is Contagious?**: {meta.get('is_contagious', 'Unknown')}" | |
| # Prepare Audio | |
| audio_path = generate_tip_audio(most_likely_class, language, translated_tip) | |
| return ( | |
| f"This disease is most likely to be: {most_likely_class}", | |
| meta_text, | |
| f"The health tip for this predicted disease is:\n{translated_tip}", | |
| audio_path | |
| ) | |
| # === AI Assistant Bot === | |
| def ai_assistant_bot(message): | |
| message = message.lower() | |
| if "hello" in message or "hi" in message: | |
| return "π Hello! How can I assist you with skin diseases or this app?" | |
| elif "symptom" in message: | |
| return "Upload an image to get the predicted disease and its symptoms." | |
| elif "treatment" in message: | |
| return "I'll give treatment advice once a disease is predicted." | |
| elif "tip" in message: | |
| return "Tips will appear after prediction in your selected language." | |
| elif "thank" in message: | |
| return "You're welcome! π" | |
| else: | |
| return "I'm your AI Assistant. Ask me about skin conditions, translations, or app usage." | |
| # === Main Interface === | |
| skin_disease_interface = gr.Interface( | |
| fn=predict_and_translate, | |
| inputs=[ | |
| gr.Image(type="pil", label="Upload or Capture Skin Image", sources=["upload", "webcam"]), | |
| gr.Radio(choices=["English", "Hausa", "Yoruba", "Igbo"], label="Select Language", value="English") | |
| ], | |
| outputs=[ | |
| gr.Text(label="Most Likely Disease Prediction"), | |
| gr.Text(label="Disease Metadata"), | |
| gr.Text(label="Health Tip (Translated)"), | |
| gr.Audio(label="Text-to-Speech Health Tip") | |
| ], | |
| title="π§ AI Skin Disease Classifier", | |
| description="Upload an image to get disease prediction, health tips, TTS, and detailed metadata." | |
| ) | |
| chatbot_interface = gr.Interface( | |
| fn=ai_assistant_bot, | |
| inputs=gr.Textbox(lines=2, placeholder="Ask the AI Assistant about skin diseases or the app..."), | |
| outputs="text", | |
| title="π¬ AI Assistant Chatbot" | |
| ) | |
| # === Combined UI === | |
| demo = gr.TabbedInterface( | |
| [skin_disease_interface, chatbot_interface], | |
| ["π· Skin Classifier", "π€ Chatbot Assistant"] | |
| ) | |
| demo.launch() | |