Spaces:
Runtime error
Runtime error
Upload 8 files
Browse files- app.yaml +19 -0
- main.py +102 -0
- requirements.txt +6 -0
- skin_disorder.json +53 -0
- skin_disorder_classifier_EfficientNetB2.h5 +3 -0
- templates/error.html +10 -0
- templates/index.html +172 -0
- templates/results.html +129 -0
app.yaml
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
entrypoint: gunicorn -b :$PORT main:app
|
2 |
+
env: flex
|
3 |
+
|
4 |
+
runtime: python
|
5 |
+
runtime_config:
|
6 |
+
python_version: "3.11"
|
7 |
+
operating_system: "ubuntu22"
|
8 |
+
|
9 |
+
manual_scaling:
|
10 |
+
instances: 1
|
11 |
+
|
12 |
+
resources:
|
13 |
+
cpu: 2
|
14 |
+
memory_gb: 4
|
15 |
+
# disk_size_gb: 20
|
16 |
+
|
17 |
+
handlers:
|
18 |
+
- url: /.*
|
19 |
+
script: auto
|
main.py
ADDED
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from keras.models import load_model
|
2 |
+
from flask import Flask, render_template, request, jsonify
|
3 |
+
from tensorflow.keras.preprocessing.image import img_to_array
|
4 |
+
import numpy as np
|
5 |
+
import json
|
6 |
+
from PIL import Image
|
7 |
+
import io
|
8 |
+
import os
|
9 |
+
import cv2
|
10 |
+
|
11 |
+
# Creating the app
|
12 |
+
app = Flask(__name__)
|
13 |
+
|
14 |
+
# Loading the model
|
15 |
+
model = load_model("skin_disorder_classifier_EfficientNetB2.h5")
|
16 |
+
|
17 |
+
# Loading the json file with the skin disorders
|
18 |
+
def get_treatment(path):
|
19 |
+
with open(path) as f:
|
20 |
+
return json.load(f)
|
21 |
+
treatment_dict = get_treatment("skin_disorder.json")
|
22 |
+
|
23 |
+
# function to check if the file is an allowed image type
|
24 |
+
def allowed_file(filename):
|
25 |
+
return '.' in filename and filename.rsplit('.', 1)[1].lower() in {'png', 'jpg', 'jpeg'}
|
26 |
+
|
27 |
+
# function to detect skin color
|
28 |
+
def is_skin(img):
|
29 |
+
# convert image to HSV color space
|
30 |
+
hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
|
31 |
+
# define range of skin color in HSV
|
32 |
+
lower_skin = np.array([0, 20, 70], dtype=np.uint8)
|
33 |
+
upper_skin = np.array([20, 255, 255], dtype=np.uint8)
|
34 |
+
# create a binary mask of skin color pixels
|
35 |
+
mask = cv2.inRange(hsv, lower_skin, upper_skin)
|
36 |
+
# count the number of skin color pixels
|
37 |
+
skin_pixels = np.sum(mask > 0)
|
38 |
+
# calculate the percentage of skin color pixels in the image
|
39 |
+
skin_percent = skin_pixels / (img.shape[0] * img.shape[1]) * 100
|
40 |
+
# return True if skin percentage is above a threshold, else False
|
41 |
+
return skin_percent > 5
|
42 |
+
|
43 |
+
# Define the route for the home page
|
44 |
+
@app.route('/')
|
45 |
+
def home():
|
46 |
+
return render_template('index.html')
|
47 |
+
|
48 |
+
# Define the route for the prediction
|
49 |
+
@app.route('/predict', methods=['POST'])
|
50 |
+
def predict():
|
51 |
+
# Get the image from the request
|
52 |
+
file = request.files['file']
|
53 |
+
|
54 |
+
# check if the file is an image
|
55 |
+
if not file or not allowed_file(file.filename):
|
56 |
+
return render_template('error.html', error='Only image files are allowed')
|
57 |
+
|
58 |
+
# Open the image using PIL
|
59 |
+
image = Image.open(file)
|
60 |
+
|
61 |
+
# check if the image contains human skin
|
62 |
+
if not is_skin(np.array(image)):
|
63 |
+
return render_template('error.html', error='The uploaded image could not be processed.\
|
64 |
+
Please ensure that the image contains skin and try again.')
|
65 |
+
|
66 |
+
# Preprocess the image
|
67 |
+
img = image.resize((300,300))
|
68 |
+
img_array = img_to_array(img)
|
69 |
+
img = img_array / 255.0
|
70 |
+
image = np.expand_dims(img, axis=0)
|
71 |
+
|
72 |
+
# Make prediction
|
73 |
+
pred = model.predict(image)
|
74 |
+
class_idx = np.argmax(pred)
|
75 |
+
|
76 |
+
# Classes
|
77 |
+
classes = ["Acne", "Basal cell carcinoma", "Benign Keratosis-like Lesions (BKL)", "Atopic dermatitis(Eczema)",
|
78 |
+
"Actinic keratosis(AK)", "Melanoma", "Psoriasis","Tinea(Ringworm)"]
|
79 |
+
|
80 |
+
# Predicted class
|
81 |
+
pred_class = classes[class_idx]
|
82 |
+
|
83 |
+
# Probability of prediction
|
84 |
+
prob = pred[0][class_idx]
|
85 |
+
|
86 |
+
# Set probability threshold
|
87 |
+
threshold = 0.6
|
88 |
+
|
89 |
+
# Check if probability is above threshold
|
90 |
+
if prob < threshold:
|
91 |
+
return render_template('error.html', error='Inconclusive result.\
|
92 |
+
Please consult a healthcare professional for an accurate diagnosis')
|
93 |
+
|
94 |
+
# Treatment options
|
95 |
+
treatments = treatment_dict.get(pred_class, [])
|
96 |
+
|
97 |
+
# Render the results page with the prediction
|
98 |
+
return render_template('results.html', prediction=pred_class, probability=prob, treatments=treatments)
|
99 |
+
|
100 |
+
# Run the application
|
101 |
+
if __name__ == '__main__':
|
102 |
+
app.run(debug=True)
|
requirements.txt
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
gunicorn
|
2 |
+
flask
|
3 |
+
keras
|
4 |
+
numpy
|
5 |
+
Pillow
|
6 |
+
tensorflow
|
skin_disorder.json
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"Acne": [
|
3 |
+
"Topical retinoids (such as tretinoin) - helps unclog pores and prevent new acne lesions from forming.",
|
4 |
+
"Benzoyl peroxide - kills bacteria and reduces inflammation.",
|
5 |
+
"Salicylic acid - helps unclog pores and reduces inflammation.",
|
6 |
+
"Topical antibiotics (such as clindamycin) - helps kill bacteria and reduce inflammation.",
|
7 |
+
"Oral antibiotics (such as doxycycline) - helps kill bacteria and reduce inflammation."
|
8 |
+
],
|
9 |
+
"Basal cell carcinoma": [
|
10 |
+
"Surgical excision - removal of the tumor and surrounding tissue.",
|
11 |
+
"Mohs surgery - a specialized procedure to remove the cancerous tissue layer by layer, minimizing damage to healthy tissue.",
|
12 |
+
"Radiation therapy - using high-energy radiation to destroy cancer cells.",
|
13 |
+
"Topical chemotherapy - applying a cream or lotion containing medication to kill cancer cells."
|
14 |
+
],
|
15 |
+
"Benign Keratosis-like Lesions (BKL)": [
|
16 |
+
"Cryotherapy - using liquid nitrogen to freeze off the lesion.",
|
17 |
+
"Electrodesiccation and curettage - scraping off the lesion and using an electric needle to destroy any remaining cells.",
|
18 |
+
"Topical medications (such as imiquimod) - stimulates the immune system to attack the lesion.",
|
19 |
+
"Shave excision - shaving off the lesion with a surgical blade."
|
20 |
+
],
|
21 |
+
"Atopic dermatitis(Eczema)": [
|
22 |
+
"Emollients - moisturizers that help to repair the skin barrier and reduce dryness.",
|
23 |
+
"Topical corticosteroids - reduce inflammation and itching.",
|
24 |
+
"Oral antihistamines - reduce itching and improve sleep.",
|
25 |
+
"Light therapy (phototherapy) - exposing the skin to specific types of light to reduce inflammation."
|
26 |
+
],
|
27 |
+
"Actinic keratosis(AK)": [
|
28 |
+
"Cryotherapy - using liquid nitrogen to freeze off the lesion.",
|
29 |
+
"Topical medications (such as imiquimod) - stimulates the immune system to attack the lesion.",
|
30 |
+
"Chemical peels - applying a chemical solution to the skin to remove the lesion.",
|
31 |
+
"Photodynamic therapy - applying a medication to the skin that is activated by light to destroy the lesion."
|
32 |
+
],
|
33 |
+
"Melanoma": [
|
34 |
+
"Surgical excision - removing the tumor and surrounding tissue.",
|
35 |
+
"Immunotherapy - using medications to stimulate the immune system to attack cancer cells.",
|
36 |
+
"Chemotherapy - using medications to kill cancer cells.",
|
37 |
+
"Radiation therapy - using high-energy radiation to destroy cancer cells."
|
38 |
+
],
|
39 |
+
"Psoriasis": [
|
40 |
+
"Topical corticosteroids - reduce inflammation and itching.",
|
41 |
+
"Topical retinoids - helps slow down the growth of skin cells.",
|
42 |
+
"Topical calcineurin inhibitors (such as tacrolimus or pimecrolimus) -reduce inflammation and itching, particularly for sensitive areas like the face and neck.",
|
43 |
+
"Phototherapy (UVB light therapy) - slows down skin cell turnover and reduces inflammation."
|
44 |
+
],
|
45 |
+
|
46 |
+
"Tinea (Ringworm)": [
|
47 |
+
"Antifungal creams, ointments or powders (such as clotrimazole, miconazole or terbinafine) - applied to the affected area for 2-4 weeks to kill the fungus.",
|
48 |
+
"Oral antifungal medications (such as terbinafine or fluconazole) - prescribed for more severe or resistant cases.",
|
49 |
+
"Keeping the affected area clean and dry - to prevent the fungus from spreading.",
|
50 |
+
"Avoiding sharing personal items - such as towels, clothing, and combs to prevent the spread of the fungus to others.",
|
51 |
+
"Washing clothes and bedding in hot water and drying them in a hot dryer - to kill any fungus that may be present."
|
52 |
+
]
|
53 |
+
}
|
skin_disorder_classifier_EfficientNetB2.h5
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:2f0b51ceb586b7aba1b8c4c822b55d008d7dee7be82265a33f1756ad9bac7dd4
|
3 |
+
size 136
|
templates/error.html
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html>
|
3 |
+
<head>
|
4 |
+
<title>DermaAI</title>
|
5 |
+
<link rel="stylesheet" href="style.css">
|
6 |
+
</head>
|
7 |
+
<body>
|
8 |
+
<h3><i>Error! {{ error }}</i>.</h3>
|
9 |
+
</body>
|
10 |
+
</html>
|
templates/index.html
ADDED
@@ -0,0 +1,172 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html>
|
3 |
+
|
4 |
+
<head>
|
5 |
+
<meta charset="utf-8" />
|
6 |
+
<title>Derma AI</title>
|
7 |
+
<meta content="width=device-width, initial-scale=1" name="viewport" />
|
8 |
+
<meta content="Webflow" name="generator" />
|
9 |
+
<link href="https://uploads-ssl.webflow.com/6436bd9de183596b1cff71c7/css/amoss-wondrous-site.webflow.8f0db2681.css"
|
10 |
+
rel="stylesheet" type="text/css" />
|
11 |
+
<link href="https://fonts.googleapis.com" rel="preconnect" />
|
12 |
+
<link crossorigin="anonymous" href="https://fonts.gstatic.com" rel="preconnect" />
|
13 |
+
<script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script>
|
14 |
+
<script type="text/javascript">
|
15 |
+
WebFont.load({
|
16 |
+
google: {
|
17 |
+
families: [
|
18 |
+
"Montserrat:100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic",
|
19 |
+
],
|
20 |
+
},
|
21 |
+
});
|
22 |
+
</script>
|
23 |
+
|
24 |
+
<script type="text/javascript">
|
25 |
+
!(function (o, c) {
|
26 |
+
var n = c.documentElement,
|
27 |
+
t = " w-mod-";
|
28 |
+
(n.className += t + "js"),
|
29 |
+
("ontouchstart" in o ||
|
30 |
+
(o.DocumentTouch && c instanceof DocumentTouch)) &&
|
31 |
+
(n.className += t + "touch");
|
32 |
+
})(window, document);
|
33 |
+
</script>
|
34 |
+
<link href="https://uploads-ssl.webflow.com/6436bd9de183596b1cff71c7/643827ab458011b9b674fc3e_1.png"
|
35 |
+
rel="shortcut icon" type="image/x-icon" />
|
36 |
+
<link href="https://uploads-ssl.webflow.com/6436bd9de183596b1cff71c7/643827ab458011b9b674fc3e_1.png"
|
37 |
+
rel="apple-touch-icon" />
|
38 |
+
</head>
|
39 |
+
|
40 |
+
<body class="body">
|
41 |
+
<div class="navbar-logo-left wf-section" id="section1">
|
42 |
+
<div class="navbar-logo-left-container shadow-three w-nav" data-animation="default" data-collapse="medium"
|
43 |
+
data-duration="400" data-easing="ease" data-easing2="ease" role="banner">
|
44 |
+
<div class="how-to-use-derma-ai">
|
45 |
+
<div class="navbar-wrapper">
|
46 |
+
<a class="navbar-brand w-nav-brand" href="#"><img alt="LOGO DERMA AI" height="50" loading="lazy"
|
47 |
+
src="https://uploads-ssl.webflow.com/6436bd9de183596b1cff71c7/643827ab458011b9b674fc3e_1.png"
|
48 |
+
width="50" />
|
49 |
+
<div>
|
50 |
+
<h1 class="heading-2">Derma AI</h1>
|
51 |
+
</div>
|
52 |
+
</a>
|
53 |
+
<nav class="nav-menu-wrapper w-nav-menu" role="navigation">
|
54 |
+
<ul class="nav-menu-two w-list-unstyled" role="list">
|
55 |
+
<li><a class="nav-link" href="/">Home</a></li>
|
56 |
+
<li>
|
57 |
+
<div class="nav-divider"></div>
|
58 |
+
</li>
|
59 |
+
<li class="mobile-margin-top-10">
|
60 |
+
<a class="button-primary w-button" href="#contacts">Contact us</a>
|
61 |
+
</li>
|
62 |
+
</ul>
|
63 |
+
</nav>
|
64 |
+
<div class="menu-button w-nav-button">
|
65 |
+
<div class="w-icon-nav-menu"></div>
|
66 |
+
</div>
|
67 |
+
</div>
|
68 |
+
</div>
|
69 |
+
</div>
|
70 |
+
</div>
|
71 |
+
<div class="div_steps">
|
72 |
+
<section class="hero-without-image wf-section">
|
73 |
+
<div class="how-to-use-derma-ai">
|
74 |
+
<div class="hero-wrapper-two">
|
75 |
+
<h1 class="heading">SKINCARE ONLINE</h1>
|
76 |
+
<p class="margin-bottom-24px">DON'T WAIT TO BE SKINCHECK</p>
|
77 |
+
<form action="{{ url_for('predict') }}" method="post" enctype="multipart/form-data">
|
78 |
+
<label class="button-primary w-button">
|
79 |
+
CHECK YOUR SKIN
|
80 |
+
<input type="file" name="file" style="display: none;" onchange="form.submit()">
|
81 |
+
</label>
|
82 |
+
</form>
|
83 |
+
</div>
|
84 |
+
</div>
|
85 |
+
|
86 |
+
</section>
|
87 |
+
<div class="container-2 w-container"></div>
|
88 |
+
</div>
|
89 |
+
<section class="team-slider wf-section">
|
90 |
+
<div class="how-to-use-derma-ai">
|
91 |
+
<h2 class="centered-heading">How to use Derma AI</h2>
|
92 |
+
<div class="all_steps_wrapper w-slider" data-animation="slide" data-autoplay="false" data-autoplay-limit="0"
|
93 |
+
data-delay="4000" data-disable-swipe="false" data-duration="500" data-easing="ease" data-hide-arrows="false"
|
94 |
+
data-infinite="true" data-nav-spacing="12">
|
95 |
+
<div class="w-slider-mask">
|
96 |
+
<div class="steps_wrapper w-slide">
|
97 |
+
<div class="team-block">
|
98 |
+
<img alt="" class="team-member-image-two" loading="lazy"
|
99 |
+
src="https://uploads-ssl.webflow.com/6436bd9de183596b1cff71c7/64382674cacaa11db3a65e79_Screenshot%202023-04-13%20185653.png"
|
100 |
+
width="249" />
|
101 |
+
<div class="team-block-info">
|
102 |
+
<p class="team-member-text">
|
103 |
+
<strong>Take a photo*<br /></strong>Keep zoomed at the
|
104 |
+
closest distance (less than 10 cm), keep in focus and center
|
105 |
+
only the skin mark (without hair, wrinkles and other
|
106 |
+
objects)
|
107 |
+
</p>
|
108 |
+
</div>
|
109 |
+
</div>
|
110 |
+
</div>
|
111 |
+
<div class="steps_wrapper w-slide">
|
112 |
+
<div class="team-block">
|
113 |
+
<img alt="" loading="lazy"
|
114 |
+
src="https://uploads-ssl.webflow.com/6436bd9de183596b1cff71c7/64382674d482ac373df4c96d_Screenshot%202023-04-13%20185604.png" />
|
115 |
+
<div class="team-block-info">
|
116 |
+
<p class="team-member-text">
|
117 |
+
<strong>Identify and send<br /></strong>Send your photo to
|
118 |
+
the Artificial Intelligence. The system will analyze it and
|
119 |
+
send you a risk assessment.
|
120 |
+
</p>
|
121 |
+
</div>
|
122 |
+
</div>
|
123 |
+
</div>
|
124 |
+
<div class="steps_wrapper w-slide">
|
125 |
+
<div class="team-block">
|
126 |
+
<img alt="" class="team-member-image-two" loading="lazy"
|
127 |
+
src="https://uploads-ssl.webflow.com/6436bd9de183596b1cff71c7/6438267498748042229f1445_Screenshot%202023-04-13%20185626.png"
|
128 |
+
width="242" />
|
129 |
+
<div class="team-block-info">
|
130 |
+
<p class="team-member-text">
|
131 |
+
<strong>Receive your risk assessment <br /></strong>Get the
|
132 |
+
result within 60 seconds and related advice on the next
|
133 |
+
steps to take.
|
134 |
+
</p>
|
135 |
+
</div>
|
136 |
+
</div>
|
137 |
+
</div>
|
138 |
+
|
139 |
+
</section>
|
140 |
+
<section class="footer-subscribe wf-section">
|
141 |
+
<div class="how-to-use-derma-ai">
|
142 |
+
<div class="footer-wrapper-three">
|
143 |
+
<div class="footer-block-three">
|
144 |
+
<a class="footer-link-three" href="#">About us</a><a class="footer-link-three" href="#">Home</a><a
|
145 |
+
class="footer-link-three" href="#">Get checked</a>
|
146 |
+
</div>
|
147 |
+
<div class="footer-social-block-three" , id="contacts">
|
148 |
+
<a class="footer-social-link-three w-inline-block" href="#"><img alt="" loading="lazy"
|
149 |
+
src="https://uploads-ssl.webflow.com/62434fa732124a0fb112aab4/62434fa732124a705912aaeb_facebook%20big%20filled.svg" /></a><a
|
150 |
+
class="footer-social-link-three w-inline-block" href="#"><img alt="" loading="lazy"
|
151 |
+
src="https://uploads-ssl.webflow.com/62434fa732124a0fb112aab4/62434fa732124ab37a12aaf0_twitter%20big.svg" /></a><a
|
152 |
+
class="footer-social-link-three w-inline-block" href="#"><img alt="" loading="lazy"
|
153 |
+
src="https://uploads-ssl.webflow.com/62434fa732124a0fb112aab4/62434fa732124a61f512aaed_instagram%20big.svg" /></a><a
|
154 |
+
class="footer-social-link-three w-inline-block" href="#"><img alt="" loading="lazy"
|
155 |
+
src="https://uploads-ssl.webflow.com/62434fa732124a0fb112aab4/62434fa732124a717f12aaea_youtube%20small.svg" /></a>
|
156 |
+
</div>
|
157 |
+
</div>
|
158 |
+
<div class="footer-divider-two"></div>
|
159 |
+
<div class="footer-bottom">
|
160 |
+
<div class="footer-copyright">
|
161 |
+
© 2023 Derma AI. All rights reserved
|
162 |
+
</div>
|
163 |
+
<div class="footer-legal-block">
|
164 |
+
<a class="footer-legal-link" href="#">Terms Of Use</a><a class="footer-legal-link" href="#">Privacy Policy</a>
|
165 |
+
</div>
|
166 |
+
</div>
|
167 |
+
</div>
|
168 |
+
</section>
|
169 |
+
|
170 |
+
</body>
|
171 |
+
|
172 |
+
</html>
|
templates/results.html
ADDED
@@ -0,0 +1,129 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html>
|
3 |
+
|
4 |
+
<head>
|
5 |
+
<meta charset="utf-8" />
|
6 |
+
<title>Derma AI</title>
|
7 |
+
<meta content="width=device-width, initial-scale=1" name="viewport" />
|
8 |
+
<meta content="Webflow" name="generator" />
|
9 |
+
<link href="https://uploads-ssl.webflow.com/6436bd9de183596b1cff71c7/css/amoss-wondrous-site.webflow.ebef6ed16.css"
|
10 |
+
rel="stylesheet" type="text/css" />
|
11 |
+
<link href="https://fonts.googleapis.com" rel="preconnect" />
|
12 |
+
<link crossorigin="anonymous" href="https://fonts.gstatic.com" rel="preconnect" />
|
13 |
+
<script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script>
|
14 |
+
<script type="text/javascript">
|
15 |
+
WebFont.load({
|
16 |
+
google: {
|
17 |
+
families: [
|
18 |
+
"Montserrat:100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic",
|
19 |
+
],
|
20 |
+
},
|
21 |
+
});
|
22 |
+
</script>
|
23 |
+
<script type="text/javascript">
|
24 |
+
!(function (o, c) {
|
25 |
+
var n = c.documentElement,
|
26 |
+
t = " w-mod-";
|
27 |
+
(n.className += t + "js"),
|
28 |
+
("ontouchstart" in o ||
|
29 |
+
(o.DocumentTouch && c instanceof DocumentTouch)) &&
|
30 |
+
(n.className += t + "touch");
|
31 |
+
})(window, document);
|
32 |
+
</script>
|
33 |
+
<link href="https://uploads-ssl.webflow.com/6436bd9de183596b1cff71c7/643827ab458011b9b674fc3e_1.png"
|
34 |
+
rel="shortcut icon" type="image/x-icon" />
|
35 |
+
<link href="https://uploads-ssl.webflow.com/6436bd9de183596b1cff71c7/643827ab458011b9b674fc3e_1.png"
|
36 |
+
rel="apple-touch-icon" />
|
37 |
+
</head>
|
38 |
+
|
39 |
+
<body class="body">
|
40 |
+
<div class="navbar-logo-left wf-section">
|
41 |
+
<div class="navbar-logo-left-container shadow-three w-nav" data-animation="default" data-collapse="medium"
|
42 |
+
data-duration="400" data-easing="ease" data-easing2="ease" role="banner">
|
43 |
+
<div class="how-to-use-derma-ai">
|
44 |
+
<div class="navbar-wrapper">
|
45 |
+
<a class="navbar-brand w-nav-brand" href="#"><img alt="LOGO DERMA AI" height="50" loading="lazy"
|
46 |
+
src="https://uploads-ssl.webflow.com/6436bd9de183596b1cff71c7/643827ab458011b9b674fc3e_1.png"
|
47 |
+
width="50" />
|
48 |
+
<div>
|
49 |
+
<h1 class="heading-2">Derma AI</h1>
|
50 |
+
</div>
|
51 |
+
</a>
|
52 |
+
<nav class="nav-menu-wrapper w-nav-menu" role="navigation">
|
53 |
+
<ul class="nav-menu-two w-list-unstyled" role="list">
|
54 |
+
<li>
|
55 |
+
<div class="nav-divider"></div>
|
56 |
+
</li>
|
57 |
+
<li class="mobile-margin-top-10">
|
58 |
+
<li><a class="nav-link" href="/" target="_blank">Home</a>
|
59 |
+
</li>
|
60 |
+
</li>
|
61 |
+
<li class="mobile-margin-top-10">
|
62 |
+
<a class="button-primary w-button" href="#">contact us</a>
|
63 |
+
</li>
|
64 |
+
</ul>
|
65 |
+
</nav>
|
66 |
+
<div class="menu-button w-nav-button">
|
67 |
+
<div class="w-icon-nav-menu"></div>
|
68 |
+
</div>
|
69 |
+
</div>
|
70 |
+
</div>
|
71 |
+
</div>
|
72 |
+
</div>
|
73 |
+
<div class="div_steps"></div>
|
74 |
+
<section class="testimonial-stack wf-section">
|
75 |
+
<div class="container">
|
76 |
+
<div class="testimonial-card-three">
|
77 |
+
<div class="testimonial-card-content">
|
78 |
+
<h3 class="testimonial-card-heading">Skin Condition Diagnosis</h3>
|
79 |
+
<p class="testimonial-text-three">
|
80 |
+
Based on our analysis, you may have <strong><i>{{ prediction }}</i></strong>.
|
81 |
+
</p>
|
82 |
+
<div class="testimonial-info-four">
|
83 |
+
<div>
|
84 |
+
<h3 class="testimonial-author-name-three">Common treatments include:</h3>
|
85 |
+
<div class="testimonial-title">
|
86 |
+
<ul>
|
87 |
+
{% for treatment in treatments %}
|
88 |
+
|
89 |
+
<li>{{treatment }}</li>
|
90 |
+
</br>
|
91 |
+
{% endfor %}
|
92 |
+
</ul>
|
93 |
+
|
94 |
+
</div>
|
95 |
+
</div>
|
96 |
+
</div>
|
97 |
+
</div>
|
98 |
+
</div>
|
99 |
+
<div>
|
100 |
+
</br>
|
101 |
+
<em>Disclaimer: This information is provided for educational purposes
|
102 |
+
only and should not be used as a substitute for medical advice.
|
103 |
+
Please consult a healthcare professional for an accurate diagnosis
|
104 |
+
and treatment plan.</em>
|
105 |
+
</div>
|
106 |
+
</div>
|
107 |
+
</section>
|
108 |
+
<section class="footer-subscribe-2 wf-section">
|
109 |
+
<div class="container">
|
110 |
+
<div class="footer-divider-two-2"></div>
|
111 |
+
<div class="footer-bottom-2">
|
112 |
+
<div class="footer-copyright-2">
|
113 |
+
© 2023 Derma AI. All rights reserved
|
114 |
+
</div>
|
115 |
+
<div class="footer-legal-block-2">
|
116 |
+
<a class="footer-legal-link-2" href="#">Terms Of Use</a><a class="footer-legal-link-2" href="#">Privacy
|
117 |
+
Policy</a>
|
118 |
+
</div>
|
119 |
+
</div>
|
120 |
+
</div>
|
121 |
+
</section>
|
122 |
+
<script crossorigin="anonymous" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
|
123 |
+
src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=6436bd9de183596b1cff71c7"
|
124 |
+
type="text/javascript"></script>
|
125 |
+
<script src="https://uploads-ssl.webflow.com/6436bd9de183596b1cff71c7/js/webflow.d24760b11.js"
|
126 |
+
type="text/javascript"></script>
|
127 |
+
</body>
|
128 |
+
|
129 |
+
</html>
|