Spaces:
Sleeping
Sleeping
File size: 7,104 Bytes
bde3598 7fd6315 bde3598 4b3813e bde3598 4b3813e bde3598 4b3813e bde3598 4b3813e bde3598 4b3813e bde3598 4b3813e bde3598 4b3813e bde3598 4b3813e bde3598 dcfa85c bde3598 12a11a3 bde3598 d3a283c a22320a bde3598 12a11a3 bde3598 8fbf525 12a11a3 8fbf525 bde3598 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
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)
|