File size: 5,847 Bytes
ca72ed3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SkyGuard | Bird vs Drone Classifier</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
    <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;600&display=swap" rel="stylesheet">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/js/all.min.js"></script>
</head>
<body>
    <div class="container">
        <header>
            <div class="logo">
                <i class="fas fa-shield-alt"></i>
                <h1>SkyGuard AI</h1>
            </div>
            <p>Advanced Aerial Identification System</p>
        </header>

        <main>
            <div class="glass-card upload-section">
                <div class="drop-zone" id="drop-zone">
                    <i class="fas fa-cloud-upload-alt"></i>
                    <p>Drag & drop or Click to Upload Image</p>
                    <input type="file" id="file-input" hidden accept="image/*">
                </div>
                <button id="predict-btn" class="btn-primary" disabled>Analyze Target</button>
            </div>

            <div class="result-section" id="result-section" style="display: none;">
                <div class="glass-card result-card">
                    <div class="image-preview">
                        <img id="preview-img" src="" alt="Target Analysis">
                        <div class="scan-line"></div>
                    </div>
                    <div class="analysis-info">
                        <h2>Analysis Results</h2>
                        <div class="result-item">
                            <span class="label">Classification:</span>
                            <span id="res-label" class="value badge">---</span>
                        </div>
                        <div class="result-item">
                            <span class="label">Confidence:</span>
                            <div class="progress-bar">
                                <div id="res-conf-bar" class="progress-fill" style="width: 0%"></div>
                            </div>
                            <span id="res-conf-text" class="value">0%</span>
                        </div>
                    </div>
                </div>
            </div>
        </main>

        <footer>
            <p>&copy; 2026 Deep Learning Aerial Surveillance Project</p>
        </footer>
    </div>

    <script>

        const dropZone = document.getElementById('drop-zone');

        const fileInput = document.getElementById('file-input');

        const predictBtn = document.getElementById('predict-btn');

        const resultSection = document.getElementById('result-section');

        const previewImg = document.getElementById('preview-img');

        const resLabel = document.getElementById('res-label');

        const resConfText = document.getElementById('res-conf-text');

        const resConfBar = document.getElementById('res-conf-bar');



        let selectedFile = null;



        dropZone.onclick = () => fileInput.click();



        fileInput.onchange = (e) => {

            selectedFile = e.target.files[0];

            if (selectedFile) {

                const reader = new FileReader();

                reader.onload = (e) => {

                    previewImg.src = e.target.result;

                    resultSection.style.display = 'block';

                    predictBtn.disabled = false;

                    // Reset labels

                    resLabel.textContent = '---';

                    resLabel.className = 'value badge';

                    resConfText.textContent = '0%';

                    resConfBar.style.width = '0%';

                };

                reader.readAsDataURL(selectedFile);

            }

        };



        predictBtn.onclick = async () => {

            if (!selectedFile) return;



            predictBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Analyzing...';

            predictBtn.disabled = true;



            const formData = new FormData();

            formData.append('file', selectedFile);



            try {

                const response = await fetch('/predict', {

                    method: 'POST',

                    body: formData

                });

                const data = await response.json();



                if (data.error) {

                    alert(data.error);

                } else {

                    resLabel.textContent = data.label;

                    resLabel.classList.add(data.label.toLowerCase());

                    resConfText.textContent = data.confidence;

                    resConfBar.style.width = data.confidence;

                    

                    // Smooth scroll to results

                    resultSection.scrollIntoView({ behavior: 'smooth' });

                }

            } catch (error) {

                console.error('Error:', error);

                alert('Analysis failed. Check console for details.');

            } finally {

                predictBtn.innerHTML = 'Analyze Target';

                predictBtn.disabled = false;

            }

        };



        // Drag and Drop

        dropZone.ondragover = (e) => {

            e.preventDefault();

            dropZone.classList.add('active');

        };

        dropZone.ondragleave = () => dropZone.classList.remove('active');

        dropZone.ondrop = (e) => {

            e.preventDefault();

            dropZone.classList.remove('active');

            fileInput.files = e.dataTransfer.files;

            fileInput.onchange({ target: fileInput });

        };

    </script>
</body>
</html>