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)