Spaces:
Sleeping
Sleeping
import gradio as gr | |
import torch | |
from PIL import Image | |
import torchvision.transforms as transforms | |
from ultralytics import YOLO | |
# Load models and map them to the CPU | |
skin_tone_model = torch.load("SkinTone.pth", map_location=torch.device('cpu')) | |
disease_model = YOLO("last.pt") | |
CONFIDENCE_THRESHOLD = 0.5 | |
# Define image transformations for the skin tone model | |
transform_skin_tone = transforms.Compose([ | |
transforms.Resize((224, 224)), | |
transforms.ToTensor(), | |
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) | |
]) | |
# Define prediction function for skin tone model | |
def predict_skin_tone(image): | |
image_tensor = transform_skin_tone(image).unsqueeze(0) | |
with torch.no_grad(): | |
prediction = skin_tone_model(image_tensor) | |
_, predicted_class = torch.max(prediction, 1) | |
skin_tone_classes = ['dark', 'light'] | |
return skin_tone_classes[predicted_class.item()] | |
def predict_disease(image): | |
results = disease_model(image) | |
detected_classes = [] | |
for result in results: | |
boxes = result.boxes | |
if boxes is not None: | |
for box in boxes: | |
if box.conf > CONFIDENCE_THRESHOLD: | |
class_id = int(box.cls) | |
detected_classes.append(result.names[class_id]) | |
return ', '.join(detected_classes) if detected_classes else "No disease detected" | |
# cream recommendation logic | |
def recommend_creams(skin_tone, disease): | |
recommendations = { | |
"No disease detected": { | |
"light": [ | |
"Face10.jpg", | |
"Face08.jpg", | |
"Face07.jpg", | |
"Face06.jpg", | |
"Face05.jpg" | |
], | |
"dark": [ | |
"Face04.jpg", | |
"Face03.jpg", | |
"Face02.jpg", | |
"Face01.jpg", | |
"Face09.jpg" | |
] | |
}, | |
"acne": { | |
"light": [ | |
"Face01.jpg", | |
"Face02.jpg", | |
"Face03.jpg", | |
"Face04.jpg", | |
"Face05.jpg" | |
], | |
"dark": [ | |
"Face06.jpg", | |
"Face07.jpg", | |
"Face08.jpg", | |
"Face09.jpg", | |
"Face10.jpg" | |
], | |
}, | |
"redness": { | |
"light": [ | |
"Face03.jpg", | |
"Face04.jpg", | |
"Face08.jpg", | |
"Face10.jpg", | |
"Face06.jpg" | |
], | |
"dark": [ | |
"Face07.jpg", | |
"Face02.jpg", | |
"Face01.jpg", | |
"Face09.jpg" | |
], | |
}, | |
} | |
# Return a list of cream images based on skin tone and disease | |
disease = disease.split(', ')[0] | |
if disease in recommendations: | |
return recommendations[disease].get(skin_tone, ["No specific cream recommended."]) | |
return [] | |
# Define message generation based on predictions | |
def generate_message(skin_tone, disease): | |
messages = { | |
("dark", "acne"): "Hello, ඔබගේ සම අදුරු පැහැති සමක්. ඒ වගේම ඔබගේ මුහුණේ කුරුලෑ දකින්න ලැබෙනවා. ඔබගේ සම තවත් පැහැපත් කරගන්න අතරතුර කරදරකාරී කුරුලෑ වලිනුත් මිදීමට පහත ඇති ඔබ වෙනුවෙන්ම නිෂ්පාදනය කළ අපගේ Face ක්රීම් භාවිතා කරන්න. ඔබට ස්තූතීයි! .", | |
("light", "acne"): "Hello, ඔබට ඇත්තේ පැහැපත් සමක්. ඒ වගේම ඔබගේ මුහුණේ කුරුලෑ දකින්න ලැබෙනවා. ඔබගේ සම තවත් පැහැපත් කරගන්න අතරතුර කරදරකාරී කුරුලෑ වලිනුත් මිදීමට පහත ඇති ඔබ වෙනුවෙන්ම නිෂ්පාදනය කළ අපගේ Face ක්රීම් භාවිතා කරන්න. ඔබට ස්තූතීයි! .", | |
("dark", "redness"): "Your skin is dark colored, with redness detected. You might want to use a cream that soothes redness.", | |
("light", "redness"): "Your skin is light colored, with redness detected. A soothing cream can help alleviate this.", | |
("dark", "No disease detected"): "Your skin is dark colored, and there are no visible issues. Keep up the good skincare!", | |
("light", "No disease detected"): "Your skin is light colored, and there are no visible issues. Maintain your skincare routine!", | |
} | |
disease = disease.split(', ')[0] | |
message = messages.get((skin_tone, disease), "No specific recommendations available.") | |
return f"<span style='font-size: 18px; color: #4A90E2; font-weight: bold;'>{message}</span>" | |
def analyze_image(image): | |
if image is None: | |
return "No image captured. Please capture an image.", "No disease detected", [], "" | |
skin_tone = predict_skin_tone(image) | |
disease = predict_disease(image) | |
recommended_creams = recommend_creams(skin_tone, disease) | |
# return messages.get((skin_tone, disease), "No specific recommendations available.") | |
message = generate_message(skin_tone, disease) | |
return f"Skin Tone: {skin_tone}", f"Disease: {disease}", recommended_creams, message | |
def clear_interface(): | |
return "", "", [], "" | |
# Gradio interface for capturing an image | |
with gr.Blocks(theme='earneleh/paris') as interface: | |
gr.Markdown( | |
""" | |
<h1 style='text-align: center; color: #4A90E2;'>Skin Analysis Application</h1> | |
<p style='text-align: center; color: #333;'>Hello!</p> | |
""", | |
elem_id="header" | |
) | |
with gr.Row(): | |
with gr.Column(): | |
image_input = gr.Image(label="Capture Image", type="pil") | |
analyze_button = gr.Button("Analyze", elem_id="analyze-btn") | |
clear_button = gr.Button("Clear", elem_id="clear-btn") | |
with gr.Column(): | |
skin_tone_display = gr.Textbox(label="Skin Tone", lines=1, interactive=False) | |
disease_display = gr.Textbox(label="identified Special Charateristics", lines=1, interactive=False) | |
# message_display = gr.Textbox(label="Message", lines=2, interactive=False) | |
message_display = gr.HTML(label="Message") | |
# Using a gallery to display recommended creams | |
recommended_creams_display = gr.Gallery( | |
label="Recommended Creams", | |
show_label=True, | |
elem_id="cream-gallery" | |
) | |
analyze_button.click( | |
analyze_image, | |
inputs=image_input, | |
outputs=[skin_tone_display, disease_display, recommended_creams_display, message_display] | |
) | |
clear_button.click( | |
clear_interface, | |
outputs=[skin_tone_display, disease_display, recommended_creams_display, message_display] | |
) | |
# Launch the app | |
interface.launch(debug=True) | |