danielle2003 commited on
Commit
c7f7b24
·
verified ·
1 Parent(s): b7f0c5d

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +607 -0
app.py ADDED
@@ -0,0 +1,607 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import streamlit as st
3
+ st.set_page_config(layout="wide")
4
+ import streamlit.components.v1 as components
5
+ import time
6
+ import numpy as np
7
+ import tensorflow as tf
8
+ import matplotlib.pyplot as plt
9
+ import matplotlib.cm as cm
10
+ from PIL import Image
11
+ from tf_keras_vis.gradcam import Gradcam
12
+ from io import BytesIO
13
+
14
+ if "model" not in st.session_state:
15
+ st.session_state.model = tf_model = tf.keras.models.load_model('best_model.h5')
16
+ import base64
17
+ import os
18
+
19
+ #****************************************/
20
+ # GRAD CAM
21
+ #*********************************************#
22
+
23
+ gradcam = Gradcam(st.session_state.model, model_modifier=None, clone=False)
24
+
25
+ def generate_gradcam(pil_image, target_class):
26
+ # Convert PIL to array and preprocess
27
+ img_array = np.array(pil_image)
28
+ img_preprocessed = tf.keras.applications.vgg16.preprocess_input(img_array.copy())
29
+ img_tensor = tf.expand_dims(img_preprocessed, axis=0)
30
+
31
+ # Generate heatmap
32
+ loss = lambda output: tf.reduce_mean(output[:, target_class])
33
+ cam = gradcam(loss, img_tensor, penultimate_layer=-1)
34
+
35
+ # Process heatmap
36
+ cam = cam
37
+ if cam.ndim > 2:
38
+ cam = cam.squeeze()
39
+ cam = np.maximum(cam, 0)
40
+ cam = cv2.resize(cam, (224, 224))
41
+ cam = cam / cam.max() if cam.max() > 0 else cam
42
+ return cam
43
+
44
+ def convert_image_to_base64(pil_image):
45
+ buffered = BytesIO()
46
+ pil_image.save(buffered, format="PNG")
47
+ return base64.b64encode(buffered.getvalue()).decode()
48
+
49
+
50
+ #--------------------------------------------------#
51
+ class_labels=[ 'Cyst', 'Normal','Stone', 'Tumor']
52
+ def load_tensorflow_model():
53
+ tf_model = tf.keras.models.load_model('best_model.h5')
54
+ return tf_model
55
+ def predict_image(image):
56
+ time.sleep(2)
57
+ image = image.resize((224, 224))
58
+ image = np.expand_dims(image, axis=0)
59
+ predictions = st.session_state.model.predict(image)
60
+ return predictions
61
+ logo_path = "images/tensorflow.png"
62
+ main_bg_ext = 'png'
63
+ main_bg = 'images/bg1.jpg'
64
+ # Read and encode the logo image
65
+ with open(logo_path, "rb") as image_file:
66
+ encoded_logo = base64.b64encode(image_file.read()).decode()
67
+
68
+ # Custom CSS to style the logo above the sidebar
69
+ st.markdown(
70
+ f"""
71
+ <style>
72
+ /* Container for logo and text */
73
+ .logo-text-container {{
74
+ position: fixed;
75
+ top: 20px; /* Adjust vertical position */
76
+ left: 30px; /* Align with sidebar */
77
+ display: flex;
78
+ align-items: center;
79
+ gap: 5px;
80
+ width: 70%;
81
+ z-index:1000;
82
+ }}
83
+
84
+ /* Logo styling */
85
+ .logo-text-container img {{
86
+ width: 50px; /* Adjust logo size */
87
+ border-radius: 10px; /* Optional: round edges */
88
+ margin-top:-10px;
89
+ margin-left:-5px;
90
+
91
+
92
+ }}
93
+
94
+ /* Bold text styling */
95
+ .logo-text-container h1 {{
96
+ font-family: Nunito;
97
+ color: #0175C2;
98
+ font-size: 28px;
99
+ font-weight: bold;
100
+ margin-right :100px;
101
+ padding:0px;
102
+ }}
103
+ .logo-text-container i{{
104
+ font-family: Nunito;
105
+ color: orange;
106
+ font-size: 15px;
107
+ margin-right :10px;
108
+ padding:0px;
109
+ margin-left:-18.5%;
110
+ margin-top:1%;
111
+ }}
112
+ /* Sidebar styling */
113
+ section[data-testid="stSidebar"][aria-expanded="true"] {{
114
+ margin-top: 100px !important; /* Space for the logo */
115
+ border-radius: 0 60px 0px 60px !important; /* Top-left and bottom-right corners */
116
+ width: 200px !important; /* Sidebar width */
117
+ background:none; /* Gradient background */
118
+ /* box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2); /* Shadow effect */
119
+ /* border: 1px solid #FFD700; /* Shiny golden border */
120
+ margin-bottom: 1px !important;
121
+ color:white !important;
122
+
123
+ }}
124
+ header[data-testid="stHeader"] {{
125
+ /*background: transparent !important;*/
126
+ background: white;
127
+
128
+ /*margin-right: 10px !important;*/
129
+ margin-top: 0.5px !important;
130
+ z-index: 1 !important;
131
+
132
+ color: orange; /* White text */
133
+ font-family: "Times New Roman " !important; /* Font */
134
+ font-size: 18px !important; /* Font size */
135
+ font-weight: bold !important; /* Bold text */
136
+ padding: 10px 20px; /* Padding for buttons */
137
+ border: none; /* Remove border */
138
+ border-radius: 1px; /* Rounded corners */
139
+ box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.2); /* Shadow effect */
140
+ transition: all 0.3s ease-in-out; /* Smooth transition */
141
+ align-items: left;
142
+ justify-content: center;
143
+ /*margin: 10px 0;*/
144
+ width:100%;
145
+ height:80px;
146
+ backdrop-filter: blur(10px);
147
+ border: 2px solid rgba(255, 255, 255, 0.4); /* Light border */
148
+
149
+
150
+ }}
151
+ div[data-testid="stDecoration"]{{
152
+ background-image:none;
153
+ }}
154
+ div[data-testid="stApp"]{{
155
+ /*background: grey;*/
156
+ background: rgba(255, 255, 255, 0.5); /* Semi-transparent white background */
157
+
158
+ height: 100vh; /* Full viewport height */
159
+ width: 99.5%;
160
+ border-radius: 2px !important;
161
+ margin-left:5px;
162
+ margin-right:5px;
163
+ margin-top:0px;
164
+ /* box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.2); /* Shadow effect */
165
+
166
+
167
+ background: url(data:image/{main_bg_ext};base64,{base64.b64encode(open(main_bg, "rb").read()).decode()});
168
+ background-size: cover; /* Ensure the image covers the full page */
169
+ background-position: center;
170
+
171
+ overflow: hidden;
172
+
173
+ }}
174
+ .content-container {{
175
+ background-color: rgba(173, 216, 230, 0.5); /* Light blue with 50% transparency */
176
+ backdrop-filter: blur(10px); /* Adds a slight blur effect */ border-radius: 1px;
177
+ width: 28%;
178
+ margin-left: 150px;
179
+ /* margin-top: -60px;*/
180
+ margin-bottom: 10px;
181
+ margin-right:10px;
182
+ padding:0;
183
+ /* border-radius:0px 0px 15px 15px ;*/
184
+ border:1px solid transparent;
185
+ overflow-y: auto; /* Enable vertical scrolling for the content */
186
+ position: fixed; /* Fix the position of the container */
187
+ top: 10%; /* Adjust top offset */
188
+ left: 60%; /* Adjust left offset */
189
+ height: 89.5vh; /* Full viewport height */
190
+
191
+ }}
192
+ .content-container2 {{
193
+ background-color: rgba(0, 0, 0, 0.1); /* Light blue with 50% transparency */
194
+ backdrop-filter: blur(10px); /* Adds a slight blur effect */ border-radius: 1px;
195
+ width: 90%;
196
+ margin-left: 10px;
197
+ /* margin-top: -10px;*/
198
+ margin-bottom: 160px;
199
+ margin-right:10px;
200
+ padding:0;
201
+ border-radius:1px ;
202
+ border:1px solid transparent;
203
+ overflow-y: auto; /* Enable vertical scrolling for the content */
204
+ position: fixed; /* Fix the position of the container */
205
+ top: 3%; /* Adjust top offset */
206
+ left: 2.5%; /* Adjust left offset */
207
+ height: 78vh; /* Full viewport height */
208
+
209
+ }}
210
+ .content-container4 {{
211
+ background-color: rgba(0, 0, 0, 0.1); /* Light blue with 50% transparency */
212
+ backdrop-filter: blur(10px); /* Adds a slight blur effect */ width: 40%;
213
+ margin-left: 10px;
214
+ margin-bottom: 160px;
215
+ margin-right:10px;
216
+ padding:0;
217
+ overflow-y: auto; /* Enable vertical scrolling for the content */
218
+ position: fixed; /* Fix the position of the container */
219
+ top: 60%; /* Adjust top offset */
220
+ left: 2.5%; /* Adjust left offset */
221
+ height: 10vh; /* Full viewport height */
222
+
223
+ }}
224
+ .content-container4 h3 ,p {{
225
+ font-family: "Times New Roman" !important; /* Elegant font for title */
226
+ font-size: 1rem;
227
+ font-weight: bold;
228
+ text-align:center;
229
+ }}
230
+ .content-container5 h3 ,p {{
231
+ font-family: "Times New Roman" !important; /* Elegant font for title */
232
+ font-size: 1rem;
233
+ font-weight: bold;
234
+ text-align:center;
235
+ }}
236
+ .content-container6 h3 ,p {{
237
+ font-family: "Times New Roman" !important; /* Elegant font for title */
238
+ font-size: 1rem;
239
+ font-weight: bold;
240
+ text-align:center;
241
+ }}
242
+ .content-container7 h3 ,p {{
243
+ font-family: "Times New Roman" !important; /* Elegant font for title */
244
+ font-size: 1rem;
245
+ font-weight: bold;
246
+ text-align:center;
247
+ }}
248
+ .content-container5 {{
249
+ background-color: rgba(0, 0, 0, 0.1); /* Light blue with 50% transparency */
250
+ backdrop-filter: blur(10px); /* Adds a slight blur effect */ width: 40%;
251
+ margin-left: 180px;
252
+ margin-bottom: 130px;
253
+ margin-right:10px;
254
+ padding:0;
255
+ overflow-y: auto; /* Enable vertical scrolling for the content */
256
+ position: fixed; /* Fix the position of the container */
257
+ top: 60%; /* Adjust top offset */
258
+ left: 5.5%; /* Adjust left offset */
259
+ height: 10vh; /* Full viewport height */
260
+
261
+ }}
262
+ .content-container3 {{
263
+ background-color: rgba(216, 216, 230, 0.5); /* Light blue with 50% transparency */
264
+ backdrop-filter: blur(10px); /* Adds a slight blur effect */ border-radius: 1px;
265
+ width: 92%;
266
+ margin-left: 10px;
267
+ /* margin-top: -10px;*/
268
+ margin-bottom: 160px;
269
+ margin-right:10px;
270
+ padding:0;
271
+ border: 10px solid white;
272
+ overflow-y: auto; /* Enable vertical scrolling for the content */
273
+ position: fixed; /* Fix the position of the container */
274
+ top: 3%; /* Adjust top offset */
275
+ left: 1.5%; /* Adjust left offset */
276
+ height: 40vh; /* Full viewport height */
277
+
278
+ }}
279
+ .content-container6 {{
280
+ background-color: rgba(0, 0, 0, 0.1); /* Light blue with 50% transparency */
281
+ backdrop-filter: blur(10px); /* Adds a slight blur effect */ width: 40%;
282
+ margin-left: 10px;
283
+ margin-bottom: 160px;
284
+ margin-right:10px;
285
+ padding:0;
286
+ overflow-y: auto; /* Enable vertical scrolling for the content */
287
+ position: fixed; /* Fix the position of the container */
288
+ top: 80%; /* Adjust top offset */
289
+ left: 2.5%; /* Adjust left offset */
290
+ height: 10vh; /* Full viewport height */
291
+
292
+ }}
293
+ .content-container7 {{
294
+ background-color: rgba(0, 0, 0, 0.1); /* Light blue with 50% transparency */
295
+ backdrop-filter: blur(10px); /* Adds a slight blur effect */ width: 40%;
296
+ margin-left: 180px;
297
+ margin-bottom: 130px;
298
+ margin-right:10px;
299
+ padding:0;
300
+ overflow-y: auto; /* Enable vertical scrolling for the content */
301
+ position: fixed; /* Fix the position of the container */
302
+ top: 80%; /* Adjust top offset */
303
+ left: 5.5%; /* Adjust left offset */
304
+ height: 10vh; /* Full viewport height */
305
+
306
+ }}
307
+ .content-container2 img {{
308
+ width:99%;
309
+ height:50%;
310
+
311
+ }}
312
+ .content-container3 img {{
313
+ width:100%;
314
+ height:100%;
315
+
316
+ }}
317
+ div.stButton > button {{
318
+ background: rgba(255, 255, 255, 0.2);
319
+ color: blue; /* White text */
320
+ font-family: "Times New Roman " !important; /* Font */
321
+ font-size: 18px !important; /* Font size */
322
+ font-weight: bold !important; /* Bold text */
323
+ padding: 10px 20px; /* Padding for buttons */
324
+ border: none; /* Remove border */
325
+ border-radius: 15px; /* Rounded corners */
326
+ box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.2); /* Shadow effect */
327
+ transition: all 0.3s ease-in-out; /* Smooth transition */
328
+ display: flex;
329
+ align-items: center;
330
+ justify-content: center;
331
+ margin: 10px 0;
332
+ width:170px;
333
+ height:60px;
334
+ backdrop-filter: blur(10px);
335
+
336
+ }}
337
+
338
+ /* Hover effect */
339
+ div.stButton > button:hover {{
340
+ background: rgba(255, 255, 255, 0.2);
341
+ box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.4); /* Enhanced shadow on hover */
342
+ transform: scale(1.05); /* Slightly enlarge button */
343
+ transform: scale(1.1); /* Slight zoom on hover */
344
+ box-shadow: 0px 4px 12px rgba(255, 255, 255, 0.4); /* Glow effect */
345
+ }}
346
+ .titles{{
347
+ margin-top:50px !important;
348
+ }}
349
+ /* Title styling */
350
+ .titles h1{{
351
+ /*font-family: "Times New Roman" !important; /* Elegant font for title */
352
+ /* font-size: 2.9rem;*/
353
+ /*font-weight: bold;*/
354
+ margin-left: 5px;
355
+ /* margin-top:-50px;*/
356
+ margin-bottom:50px;
357
+ padding: 0;
358
+ color: black; /* Neutral color for text */
359
+ }}
360
+ .titles > div{{
361
+ font-family: "Times New Roman" !important; /* Elegant font for title */
362
+ font-size: 1.2rem;
363
+ margin-left: 5px;
364
+ margin-bottom:1px;
365
+ padding: 0;
366
+ color:black; /* Neutral color for text */
367
+ }}
368
+ /* Recently viewed section */
369
+ .recently-viewed {{
370
+ display: flex;
371
+ align-items: center;
372
+ justify-content: flex-start; /* Align items to the extreme left */
373
+ margin-bottom: 10px;
374
+ margin-top: 20px;
375
+ gap: 10px; /* Add spacing between the elements */
376
+ padding-left: 20px; /* Add some padding if needed */
377
+ margin-left:35px;
378
+ height:100px;
379
+
380
+ }}
381
+
382
+
383
+
384
+
385
+
386
+ /* Style for the upload button */
387
+ [class*="st-key-upload-btn"] {{
388
+ position: absolute;
389
+ top: 100%; /* Position from the top of the inner circle */
390
+ left: -3%; /* Position horizontally at the center */
391
+ padding: 10px 20px;
392
+ color: red;
393
+ border: none;
394
+ border-radius: 20px;
395
+ cursor: pointer;
396
+ font-size: 35px !important;
397
+ width:30px;
398
+ height:20px;
399
+ }}
400
+
401
+ .upload-btn:hover {{
402
+ background-color: rgba(0, 123, 255, 1);
403
+ }}
404
+ div[data-testid="stFileUploader"] label > div > p {{
405
+ display:none;
406
+ color:white !important;
407
+ }}
408
+ section[data-testid="stFileUploaderDropzone"] {{
409
+ width:200px;
410
+ height: 60px;
411
+ background-color: white;
412
+ border-radius: 40px;
413
+ display: flex;
414
+ justify-content: center;
415
+ align-items: center;
416
+ margin-top:-10px;
417
+ box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.3);
418
+ margin:20px;
419
+ background-color: rgba(255, 255, 255, 0.7); /* Transparent blue background */
420
+ color:white;
421
+ }}
422
+ div[data-testid="stFileUploaderDropzoneInstructions"] div > small{{
423
+ color:white !important;
424
+ display:none;
425
+ }}
426
+ div[data-testid="stFileUploaderDropzoneInstructions"] span{{
427
+ margin-left:65px;
428
+ color:orange;
429
+ }}
430
+ div[data-testid="stFileUploaderDropzoneInstructions"] div{{
431
+ display:none;
432
+ }}
433
+ section[data-testid="stFileUploaderDropzone"] button{{
434
+ display:none;
435
+ }}
436
+ div[data-testid="stMarkdownContainer"] p {{
437
+ font-family: "Times New Roman" !important; /* Elegant font for title */
438
+ color:white !important;
439
+ }}
440
+ .highlight {{
441
+ border: 4px solid lime;
442
+ font-weight: bold;
443
+ background: radial-gradient(circle, rgba(0,255,0,0.3) 0%, rgba(0,0,0,0) 70%);
444
+ box-shadow: 0px 0px 30px 10px rgba(0, 255, 0, 0.9),
445
+ 0px 0px 60px 20px rgba(0, 255, 0, 0.6),
446
+ inset 0px 0px 15px rgba(0, 255, 0, 0.8);
447
+ transition: all 0.3s ease-in-out;
448
+
449
+ }}
450
+ .highlight:hover {{
451
+ transform: scale(1.05);
452
+ background: radial-gradient(circle, rgba(0,255,0,0.6) 0%, rgba(0,0,0,0) 80%);
453
+ box-shadow: 0px 0px 40px 15px rgba(0, 255, 0, 1),
454
+ 0px 0px 70px 30px rgba(0, 255, 0, 0.7),
455
+ inset 0px 0px 20px rgba(0, 255, 0, 1);
456
+ }}
457
+ </style>
458
+ <div class="logo-text-container">
459
+ <img src="data:image/png;base64,{encoded_logo}" alt="Logo">
460
+ <h1>KidneyScan AI<br>
461
+
462
+ </h1>
463
+ <i>Empowering Early Diagnosis with AI</ai>
464
+
465
+
466
+ </div>
467
+ """, unsafe_allow_html=True
468
+ )
469
+ loading_html = """
470
+ <style>
471
+ .loader {
472
+ border: 8px solid #f3f3f3;
473
+ border-top: 8px solid #0175C2; /* Blue color */
474
+ border-radius: 50%;
475
+ width: 50px;
476
+ height: 50px;
477
+ animation: spin 1s linear infinite;
478
+ margin: auto;
479
+ }
480
+ @keyframes spin {
481
+ 0% { transform: rotate(0deg); }
482
+ 100% { transform: rotate(360deg); }
483
+ }
484
+
485
+ </style>
486
+ <div class="loader"></div>
487
+ """
488
+
489
+ page = "Home"
490
+
491
+ # Display content based on the selected page
492
+ # Define the page content dynamically
493
+ if page == "Home":
494
+
495
+
496
+ #components.html(html_string) # JavaScript works
497
+ #st.markdown(html_string, unsafe_allow_html=True)
498
+ image_path = "images/download.jfif"
499
+
500
+ st.container()
501
+ st.markdown(f"""
502
+
503
+ <div class="titles">
504
+ <h1>Kidney Disease Classfication</br> Using Transfer learning</h1>
505
+ <div> This web application utilizes deep learning to classify kidney ultrasound images</br>
506
+ into four categories: Normal, Cyst, Tumor, and Stone Class.
507
+ Built with Streamlit and powered by </br>a TensorFlow transfer learning
508
+ model based on <strong>VGG16</strong>
509
+ the app provides a simple and efficient way for users </br>
510
+ to upload kidney scans and receive instant predictions. The model analyzes the image
511
+ and classifies it based </br>on learned patterns, offering a confidence score for better interpretation.
512
+ </div>
513
+ </div>
514
+ """,
515
+ unsafe_allow_html=True,
516
+ )
517
+ uploaded_file = st.file_uploader("Choose a file", type=["png", "jpg", "jpeg"],key="upload-btn")
518
+ if uploaded_file is not None:
519
+ images = Image.open(uploaded_file)
520
+ # Rewind file pointer to the beginning
521
+ uploaded_file.seek(0)
522
+
523
+ file_content = uploaded_file.read() # Read file once
524
+ # Convert to base64 for HTML display
525
+ encoded_image = base64.b64encode(file_content).decode()
526
+ # Read and process image
527
+ pil_image = Image.open(uploaded_file).convert('RGB').resize((224, 224))
528
+ img_array = np.array(pil_image)
529
+
530
+ prediction = predict_image(images)
531
+ max_index = int(np.argmax(prediction[0]))
532
+ print(f"max index:{max_index}")
533
+ max_score = prediction[0][max_index]
534
+ predicted_class = np.argmax(prediction[0])
535
+
536
+ highlight_class = "highlight" # Special class for the highest confidence score
537
+
538
+
539
+ # Generate Grad-CAM
540
+ cam = generate_gradcam(pil_image, predicted_class)
541
+
542
+ # Create overlay
543
+ heatmap = cm.jet(cam)[..., :3]
544
+ heatmap = (heatmap * 255).astype(np.uint8)
545
+ overlayed_image = cv2.addWeighted(img_array, 0.6, heatmap, 0.4, 0)
546
+
547
+ # Convert to PIL
548
+ overlayed_pil = Image.fromarray(overlayed_image)
549
+ # Convert to base64
550
+ orig_b64 = convert_image_to_base64(pil_image)
551
+ overlay_b64 = convert_image_to_base64(overlayed_pil)
552
+ content = f"""
553
+ <div class="content-container">
554
+ <!-- Title -->
555
+ <!-- Recently Viewed Section -->
556
+ <div class="content-container2">
557
+ <div class="content-container3">
558
+ <img src="data:image/png;base64,{orig_b64}" alt="Uploaded Image">
559
+ </div>
560
+ <div class="content-container3">
561
+ <img src="data:image/png;base64,{overlay_b64}" class="result-image">
562
+ </div>
563
+ <div class="content-container4 {'highlight' if max_index == 0 else ''}">
564
+ <h3>{class_labels[0]}</h3>
565
+ <p>T Score: {prediction[0][0]:.2f}</p>
566
+ </div>
567
+ <div class="content-container5 {'highlight' if max_index == 1 else ''}">
568
+ <h3> {class_labels[1]}</h3>
569
+ <p>T Score: {prediction[0][1]:.2f}</p>
570
+ </div>
571
+ <div class="content-container6 {'highlight' if max_index == 2 else ''}">
572
+ <h3> {class_labels[2]}</h3>
573
+ <p>T Score: {prediction[0][2]:.2f}</p>
574
+ </div>
575
+ <div class="content-container7 {'highlight' if max_index == 3 else ''}">
576
+ <h3>{class_labels[3]}</h3>
577
+ <p>T Score: {prediction[0][3]:.2f}</p>
578
+ </div>
579
+
580
+
581
+ """
582
+
583
+ # Close the gallery and content div
584
+
585
+ # Render the content
586
+ st.markdown(content, unsafe_allow_html=True)
587
+ else:
588
+ default_image_path = "images/download.jfif"
589
+ with open(image_path, "rb") as image_file:
590
+ encoded_image = base64.b64encode(image_file.read()).decode()
591
+
592
+
593
+ st.markdown(f"""
594
+ <div class="content-container">
595
+ <!-- Title -->
596
+ <!-- Recently Viewed Section -->
597
+ <div class="content-container2">
598
+ <div class="content-container3">
599
+ <img src="data:image/png;base64,{encoded_image}" alt="Default Image">
600
+ </div>
601
+ </div>
602
+
603
+ """,
604
+ unsafe_allow_html=True,
605
+ )
606
+
607
+