Farm_Easy / index.html
Subh775's picture
Update index.html
e08db9c verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tulsi Analytics — DETR & YOLO12</title>
<style>
:root {
--primary-orange: #EA782D;
--accent-orange: #FF7A5A;
--dark-bg: #121212;
--surface: #1E1E2E;
--text: #E0E0E0;
--border: rgba(255, 255, 255, 0.1);
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: var(--dark-bg);
color: var(--text);
margin: 0;
padding: 20px;
}
.container {
max-width: 1400px;
margin: 0 auto;
background: var(--surface);
border-radius: 12px;
border: 1px solid var(--border);
overflow: hidden;
}
header {
padding: 25px;
text-align: center;
border-bottom: 1px solid var(--border);
background: rgba(0,0,0,0.2);
}
h1 { color: var(--primary-orange); margin: 0; font-weight: 500; }
.layout {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
padding: 20px;
}
@media (max-width: 1000px) {
.layout { grid-template-columns: 1fr; }
}
.panel {
background: rgba(0,0,0,0.15);
padding: 20px;
border-radius: 10px;
}
.image-view {
width: 100%;
height: 450px;
background: #000;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 15px;
border: 1px solid var(--border);
overflow: hidden;
}
img { max-width: 100%; max-height: 100%; object-fit: contain; }
.controls {
display: flex;
flex-direction: column;
gap: 15px;
}
.control-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px;
background: rgba(255,255,255,0.03);
border-radius: 6px;
}
.slider-group { padding: 10px; }
input[type="range"] { width: 100%; accent-color: var(--primary-orange); }
/* Toggle Switch */
.switch {
position: relative;
display: inline-block;
width: 44px;
height: 22px;
}
.switch input { opacity: 0; width: 0; height: 0; }
.slider {
position: absolute;
cursor: pointer;
top: 0; left: 0; right: 0; bottom: 0;
background-color: #444;
transition: .4s;
border-radius: 34px;
}
.slider:before {
position: absolute;
content: "";
height: 16px; width: 16px;
left: 3px; bottom: 3px;
background-color: white;
transition: .4s;
border-radius: 50%;
}
input:checked + .slider { background-color: var(--primary-orange); }
input:checked + .slider:before { transform: translateX(22px); }
.predict-btn {
background: var(--primary-orange);
color: white;
border: none;
padding: 15px;
border-radius: 8px;
font-weight: 600;
cursor: pointer;
transition: 0.2s;
width: 100%;
}
.predict-btn:hover { background: var(--accent-orange); }
.predict-btn:disabled { opacity: 0.5; cursor: not-allowed; }
.upload-box {
border: 2px dashed var(--border);
padding: 20px;
text-align: center;
cursor: pointer;
margin-bottom: 15px;
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>Tulsi Disease Analysis</h1>
</header>
<div class="layout">
<div class="panel">
<div class="upload-box" id="drop-zone">Click/Drop Image</div>
<input type="file" id="file-input" hidden accept="image/*">
<div class="image-view">
<img id="input-preview" src="" style="display:none;">
</div>
<div class="controls">
<div class="control-row">
<span>Enable Segmentation</span>
<label class="switch"><input type="checkbox" id="seg-enable" checked><span class="slider"></span></label>
</div>
<div class="slider-group">
<label>Seg. Confidence: <span id="seg-val">0.25</span></label>
<input type="range" id="seg-conf" min="5" max="95" value="25">
</div>
<div class="control-row">
<span>Show Seg. Confidence</span>
<label class="switch"><input type="checkbox" id="seg-show-conf"><span class="slider"></span></label>
</div>
<div class="control-row">
<span>Enable Classification</span>
<label class="switch"><input type="checkbox" id="cls-enable" checked><span class="slider"></span></label>
</div>
<div class="control-row">
<span>Show Label</span>
<label class="switch"><input type="checkbox" id="cls-show-label" checked><span class="slider"></span></label>
</div>
<div class="control-row">
<span>Show Cls. Confidence</span>
<label class="switch"><input type="checkbox" id="cls-show-conf" checked><span class="slider"></span></label>
</div>
<button id="predict-btn" class="predict-btn" disabled>Run Analysis</button>
</div>
</div>
<div class="panel">
<h3 style="margin-top:0;">Overlay Result</h3>
<div class="image-view">
<img id="output-preview" src="">
</div>
<div id="status">Status: Waiting for input</div>
</div>
</div>
</div>
<script>
const fileInput = document.getElementById('file-input');
const dropZone = document.getElementById('drop-zone');
const inputImg = document.getElementById('input-preview');
const outputImg = document.getElementById('output-preview');
const predictBtn = document.getElementById('predict-btn');
const segConf = document.getElementById('seg-conf');
const segVal = document.getElementById('seg-val');
segConf.oninput = () => segVal.innerText = (segConf.value / 100).toFixed(2);
dropZone.onclick = () => fileInput.click();
fileInput.onchange = (e) => handleFile(e.target.files[0]);
function handleFile(file) {
if (!file) return;
const reader = new FileReader();
reader.onload = (e) => {
inputImg.src = e.target.result;
inputImg.style.display = 'block';
predictBtn.disabled = false;
};
reader.readAsDataURL(file);
}
predictBtn.onclick = async () => {
predictBtn.disabled = true;
predictBtn.innerText = "Processing...";
const payload = {
image: inputImg.src,
seg_enabled: document.getElementById('seg-enable').checked,
seg_conf: segConf.value / 100,
seg_show_conf: document.getElementById('seg-show-conf').checked,
cls_enabled: document.getElementById('cls-enable').checked,
cls_show_conf: document.getElementById('cls-show-conf').checked,
cls_show_label: document.getElementById('cls-show-label').checked
};
try {
const resp = await fetch('/predict', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(payload)
});
const data = await resp.json();
outputImg.src = data.annotated;
document.getElementById('status').innerText = `Status: Detected ${data.count} leaves`;
} catch (e) {
alert("Error running inference");
} finally {
predictBtn.disabled = false;
predictBtn.innerText = "Run Analysis";
}
};
</script>
</body>
</html>