Update templates/index.html
Browse files- templates/index.html +0 -31
templates/index.html
CHANGED
|
@@ -123,14 +123,6 @@
|
|
| 123 |
<canvas id="barChart" height="220"></canvas>
|
| 124 |
</div>
|
| 125 |
|
| 126 |
-
<div class="glass-card p-4">
|
| 127 |
-
<h3 class="text-xl font-bold mb-3">🧠 Model Attention (Grad-CAM)</h3>
|
| 128 |
-
<img id="camImage"
|
| 129 |
-
class="rounded-xl border border-gray-700 hidden"/>
|
| 130 |
-
<p id="camHint" class="text-gray-400 text-sm">
|
| 131 |
-
Grad-CAM visualization of affected regions
|
| 132 |
-
</p>
|
| 133 |
-
</div>
|
| 134 |
</div>
|
| 135 |
</div>
|
| 136 |
|
|
@@ -147,49 +139,37 @@ function previewImage(event) {
|
|
| 147 |
img.src = URL.createObjectURL(event.target.files[0]);
|
| 148 |
img.classList.remove("hidden");
|
| 149 |
}
|
| 150 |
-
|
| 151 |
/* ------------------ Clear ------------------ */
|
| 152 |
function clearImage() {
|
| 153 |
document.getElementById("file").value = "";
|
| 154 |
document.getElementById("preview").classList.add("hidden");
|
| 155 |
document.getElementById("result").classList.add("hidden");
|
| 156 |
}
|
| 157 |
-
|
| 158 |
/* ------------------ Submit ------------------ */
|
| 159 |
let chartInstance = null;
|
| 160 |
-
|
| 161 |
async function submitForm() {
|
| 162 |
const file = document.getElementById("file").files[0];
|
| 163 |
if (!file) return alert("Upload an image first");
|
| 164 |
-
|
| 165 |
const formData = new FormData();
|
| 166 |
formData.append("file", file);
|
| 167 |
-
|
| 168 |
const start = performance.now();
|
| 169 |
const res = await fetch("/predict", { method: "POST", body: formData });
|
| 170 |
const data = await res.json();
|
| 171 |
const end = performance.now();
|
| 172 |
-
|
| 173 |
document.getElementById("result").classList.remove("hidden");
|
| 174 |
-
|
| 175 |
document.getElementById("prediction").innerText = data.prediction;
|
| 176 |
document.getElementById("confidenceText").innerText = data.confidence + "%";
|
| 177 |
document.getElementById("confidenceFill").style.width = data.confidence + "%";
|
| 178 |
-
|
| 179 |
const badge = document.getElementById("riskBadge");
|
| 180 |
badge.innerText = data.risk + " RISK";
|
| 181 |
badge.className = "badge badge-" + data.risk.toLowerCase();
|
| 182 |
-
|
| 183 |
document.getElementById("description").innerText = data.description;
|
| 184 |
document.getElementById("treatment").innerText = data.treatment;
|
| 185 |
-
|
| 186 |
document.getElementById("inferenceTime").innerText =
|
| 187 |
((end - start) / 1000).toFixed(2) + " sec";
|
| 188 |
-
|
| 189 |
// History
|
| 190 |
document.getElementById("historyList").innerHTML +=
|
| 191 |
`<li>${data.prediction} - ${data.confidence}%</li>`;
|
| 192 |
-
|
| 193 |
// Top-5 table
|
| 194 |
const table = document.getElementById("top5Table");
|
| 195 |
table.innerHTML = "";
|
|
@@ -200,11 +180,9 @@ async function submitForm() {
|
|
| 200 |
<td class="p-2 text-right">${(row.probability * 100).toFixed(2)}%</td>
|
| 201 |
</tr>`;
|
| 202 |
});
|
| 203 |
-
|
| 204 |
// Bar chart
|
| 205 |
const ctx = document.getElementById("barChart");
|
| 206 |
if (chartInstance) chartInstance.destroy();
|
| 207 |
-
|
| 208 |
chartInstance = new Chart(ctx, {
|
| 209 |
type: "bar",
|
| 210 |
data: {
|
|
@@ -219,16 +197,7 @@ async function submitForm() {
|
|
| 219 |
scales: { y: { beginAtZero: true } }
|
| 220 |
}
|
| 221 |
});
|
| 222 |
-
|
| 223 |
-
// Grad-CAM
|
| 224 |
-
if (data.cam_image_url) {
|
| 225 |
-
const cam = document.getElementById("camImage");
|
| 226 |
-
cam.src = data.cam_image_url + "?t=" + Date.now();
|
| 227 |
-
cam.classList.remove("hidden");
|
| 228 |
-
document.getElementById("camHint").classList.add("hidden");
|
| 229 |
-
}
|
| 230 |
}
|
| 231 |
-
|
| 232 |
/* ------------------ Login (demo) ------------------ */
|
| 233 |
function loginUser() {
|
| 234 |
const user = document.getElementById("username").value;
|
|
|
|
| 123 |
<canvas id="barChart" height="220"></canvas>
|
| 124 |
</div>
|
| 125 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
</div>
|
| 127 |
</div>
|
| 128 |
|
|
|
|
| 139 |
img.src = URL.createObjectURL(event.target.files[0]);
|
| 140 |
img.classList.remove("hidden");
|
| 141 |
}
|
|
|
|
| 142 |
/* ------------------ Clear ------------------ */
|
| 143 |
function clearImage() {
|
| 144 |
document.getElementById("file").value = "";
|
| 145 |
document.getElementById("preview").classList.add("hidden");
|
| 146 |
document.getElementById("result").classList.add("hidden");
|
| 147 |
}
|
|
|
|
| 148 |
/* ------------------ Submit ------------------ */
|
| 149 |
let chartInstance = null;
|
|
|
|
| 150 |
async function submitForm() {
|
| 151 |
const file = document.getElementById("file").files[0];
|
| 152 |
if (!file) return alert("Upload an image first");
|
|
|
|
| 153 |
const formData = new FormData();
|
| 154 |
formData.append("file", file);
|
|
|
|
| 155 |
const start = performance.now();
|
| 156 |
const res = await fetch("/predict", { method: "POST", body: formData });
|
| 157 |
const data = await res.json();
|
| 158 |
const end = performance.now();
|
|
|
|
| 159 |
document.getElementById("result").classList.remove("hidden");
|
|
|
|
| 160 |
document.getElementById("prediction").innerText = data.prediction;
|
| 161 |
document.getElementById("confidenceText").innerText = data.confidence + "%";
|
| 162 |
document.getElementById("confidenceFill").style.width = data.confidence + "%";
|
|
|
|
| 163 |
const badge = document.getElementById("riskBadge");
|
| 164 |
badge.innerText = data.risk + " RISK";
|
| 165 |
badge.className = "badge badge-" + data.risk.toLowerCase();
|
|
|
|
| 166 |
document.getElementById("description").innerText = data.description;
|
| 167 |
document.getElementById("treatment").innerText = data.treatment;
|
|
|
|
| 168 |
document.getElementById("inferenceTime").innerText =
|
| 169 |
((end - start) / 1000).toFixed(2) + " sec";
|
|
|
|
| 170 |
// History
|
| 171 |
document.getElementById("historyList").innerHTML +=
|
| 172 |
`<li>${data.prediction} - ${data.confidence}%</li>`;
|
|
|
|
| 173 |
// Top-5 table
|
| 174 |
const table = document.getElementById("top5Table");
|
| 175 |
table.innerHTML = "";
|
|
|
|
| 180 |
<td class="p-2 text-right">${(row.probability * 100).toFixed(2)}%</td>
|
| 181 |
</tr>`;
|
| 182 |
});
|
|
|
|
| 183 |
// Bar chart
|
| 184 |
const ctx = document.getElementById("barChart");
|
| 185 |
if (chartInstance) chartInstance.destroy();
|
|
|
|
| 186 |
chartInstance = new Chart(ctx, {
|
| 187 |
type: "bar",
|
| 188 |
data: {
|
|
|
|
| 197 |
scales: { y: { beginAtZero: true } }
|
| 198 |
}
|
| 199 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 200 |
}
|
|
|
|
| 201 |
/* ------------------ Login (demo) ------------------ */
|
| 202 |
function loginUser() {
|
| 203 |
const user = document.getElementById("username").value;
|