Brightsun10 commited on
Commit
ebf0780
·
verified ·
1 Parent(s): 674e4a8

Update static/index.html

Browse files
Files changed (1) hide show
  1. static/index.html +111 -66
static/index.html CHANGED
@@ -1,66 +1,111 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>AI Image Classifier</title>
7
- <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
8
- </head>
9
- <body class="bg-light">
10
- <div class="container py-5">
11
- <h2 class="text-center mb-4">Upload an Image for Classification</h2>
12
- <form id="uploadForm" class="mb-4">
13
- <div class="mb-3">
14
- <input type="file" id="imageInput" class="form-control" accept="image/*" required>
15
- </div>
16
- <button type="submit" class="btn btn-primary">Predict</button>
17
- </form>
18
-
19
- <div id="result" class="alert d-none"></div>
20
- <img id="preview" src="" class="img-fluid mt-4 d-none" alt="Preview">
21
- </div>
22
-
23
- <script>
24
- const form = document.getElementById('uploadForm');
25
- const imageInput = document.getElementById('imageInput');
26
- const result = document.getElementById('result');
27
- const preview = document.getElementById('preview');
28
-
29
- form.addEventListener('submit', async (e) => {
30
- e.preventDefault();
31
-
32
- const file = imageInput.files[0];
33
- if (!file) return;
34
-
35
- const formData = new FormData();
36
- formData.append('file', file);
37
-
38
- // Show image preview
39
- const reader = new FileReader();
40
- reader.onload = () => {
41
- preview.src = reader.result;
42
- preview.classList.remove('d-none');
43
- };
44
- reader.readAsDataURL(file);
45
-
46
- result.classList.add('d-none');
47
- result.classList.remove('alert-success', 'alert-danger');
48
-
49
- try {
50
- const response = await fetch('http://127.0.0.1:8000/predict', {
51
- method: 'POST',
52
- body: formData
53
- });
54
- const data = await response.json();
55
- result.textContent = `Prediction: ${data.prediction}`;
56
- result.classList.add('alert', 'alert-success');
57
- result.classList.remove('d-none');
58
- } catch (err) {
59
- result.textContent = 'Error occurred while predicting';
60
- result.classList.add('alert', 'alert-danger');
61
- result.classList.remove('d-none');
62
- }
63
- });
64
- </script>
65
- </body>
66
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
6
+ <title>AI Image Classifier</title>
7
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"/>
8
+ <style>
9
+ body {
10
+ background: #f8f9fa;
11
+ }
12
+ .preview-box {
13
+ border: 1px dashed #6c757d;
14
+ border-radius: 10px;
15
+ padding: 1rem;
16
+ text-align: center;
17
+ }
18
+ #preview {
19
+ max-height: 300px;
20
+ }
21
+ </style>
22
+ </head>
23
+ <body>
24
+ <div class="container py-5">
25
+ <h1 class="text-center text-primary mb-4">🧠 AI Image Classifier</h1>
26
+
27
+ <div class="card shadow-lg">
28
+ <div class="card-body">
29
+ <form id="uploadForm">
30
+ <div class="mb-3">
31
+ <label for="imageInput" class="form-label">Choose an Image</label>
32
+ <input type="file" class="form-control" id="imageInput" accept="image/*" required />
33
+ </div>
34
+ <div class="text-center">
35
+ <button type="submit" class="btn btn-primary px-4">Predict</button>
36
+ </div>
37
+ </form>
38
+
39
+ <div class="preview-box mt-4 d-none" id="previewContainer">
40
+ <p class="text-muted mb-2">Image Preview</p>
41
+ <img id="preview" src="#" class="img-fluid rounded" alt="Image Preview"/>
42
+ </div>
43
+
44
+ <div id="loader" class="text-center mt-4 d-none">
45
+ <div class="spinner-border text-primary" role="status"></div>
46
+ <p class="text-muted mt-2">Processing...</p>
47
+ </div>
48
+
49
+ <div id="result" class="alert d-none mt-4"></div>
50
+ </div>
51
+ </div>
52
+ </div>
53
+
54
+ <script>
55
+ const form = document.getElementById('uploadForm');
56
+ const imageInput = document.getElementById('imageInput');
57
+ const preview = document.getElementById('preview');
58
+ const previewContainer = document.getElementById('previewContainer');
59
+ const result = document.getElementById('result');
60
+ const loader = document.getElementById('loader');
61
+
62
+ form.addEventListener('submit', async (e) => {
63
+ e.preventDefault();
64
+
65
+ const file = imageInput.files[0];
66
+ if (!file) return;
67
+
68
+ // Show image preview
69
+ const reader = new FileReader();
70
+ reader.onload = () => {
71
+ preview.src = reader.result;
72
+ previewContainer.classList.remove('d-none');
73
+ };
74
+ reader.readAsDataURL(file);
75
+
76
+ // UI state: show loader, hide result
77
+ loader.classList.remove('d-none');
78
+ result.classList.add('d-none');
79
+
80
+ const formData = new FormData();
81
+ formData.append('file', file);
82
+
83
+ try {
84
+ const response = await fetch('/predict', {
85
+ method: 'POST',
86
+ body: formData
87
+ });
88
+
89
+ const data = await response.json();
90
+
91
+ loader.classList.add('d-none');
92
+
93
+ if (data.prediction) {
94
+ result.textContent = `🔍 Prediction: ${data.prediction}`;
95
+ result.className = 'alert alert-success mt-4';
96
+ } else {
97
+ result.textContent = '⚠️ No prediction returned.';
98
+ result.className = 'alert alert-warning mt-4';
99
+ }
100
+
101
+ result.classList.remove('d-none');
102
+ } catch (err) {
103
+ loader.classList.add('d-none');
104
+ result.textContent = '❌ Error during prediction.';
105
+ result.className = 'alert alert-danger mt-4';
106
+ result.classList.remove('d-none');
107
+ }
108
+ });
109
+ </script>
110
+ </body>
111
+ </html>