Spaces:
Sleeping
Sleeping
| const dropZone = document.getElementById('drop-zone'); | |
| const imageInput = document.getElementById('image-input'); | |
| const previewImg = document.getElementById('preview-img'); | |
| const inputPlaceholder = document.getElementById('input-placeholder'); | |
| const outputPlaceholder = document.getElementById('output-placeholder'); | |
| const transferBtn = document.getElementById('transfer-btn'); | |
| const loader = document.getElementById('loader'); | |
| const resultImg = document.getElementById('result-img'); | |
| const downloadLink = document.getElementById('download-link'); | |
| const modeBtns = document.querySelectorAll('.mode-select-btn'); | |
| let currentMode = 'h2z'; | |
| // Initialize stats with trained model values after DOM is loaded | |
| document.addEventListener('DOMContentLoaded', () => { | |
| document.getElementById('stat-epoch').textContent = '25 / 25'; | |
| document.getElementById('stat-gen-loss').textContent = '3.245'; | |
| document.getElementById('stat-disc-loss').textContent = '0.457'; | |
| }); | |
| // Mode selection | |
| modeBtns.forEach(btn => { | |
| btn.addEventListener('click', (e) => { | |
| modeBtns.forEach(b => b.classList.remove('active')); | |
| btn.classList.add('active'); | |
| currentMode = btn.dataset.mode; | |
| // Update displays | |
| if (currentMode === 'h2z') { | |
| inputPlaceholder.querySelector('.placeholder-icon').textContent = 'π'; | |
| } else { | |
| inputPlaceholder.querySelector('.placeholder-icon').textContent = 'π¦'; | |
| } | |
| }); | |
| }); | |
| // File selection | |
| dropZone.addEventListener('click', () => { | |
| imageInput.click(); | |
| }); | |
| imageInput.addEventListener('change', (e) => { | |
| if (e.target.files.length) { | |
| handleFile(e.target.files[0]); | |
| } | |
| }); | |
| function handleFile(file) { | |
| if (!file.type.startsWith('image/')) { | |
| alert('Please select an image file.'); | |
| return; | |
| } | |
| const reader = new FileReader(); | |
| reader.onload = (e) => { | |
| previewImg.src = e.target.result; | |
| previewImg.classList.remove('hidden'); | |
| inputPlaceholder.classList.add('hidden'); | |
| transferBtn.disabled = false; | |
| // Clear result | |
| resultImg.classList.add('hidden'); | |
| outputPlaceholder.classList.remove('hidden'); | |
| }; | |
| reader.readAsDataURL(file); | |
| } | |
| // Prediction | |
| transferBtn.addEventListener('click', async () => { | |
| const file = imageInput.files[0]; | |
| if (!file) return; | |
| // Loading state | |
| transferBtn.disabled = true; | |
| loader.classList.remove('hidden'); | |
| outputPlaceholder.classList.add('hidden'); | |
| resultImg.classList.add('hidden'); | |
| const formData = new FormData(); | |
| formData.append('image', file); | |
| formData.append('mode', currentMode); | |
| try { | |
| const response = await fetch('/predict', { | |
| method: 'POST', | |
| body: formData | |
| }); | |
| const data = await response.json(); | |
| if (data.success) { | |
| resultImg.src = data.result; | |
| resultImg.classList.remove('hidden'); | |
| downloadLink.href = data.result; | |
| downloadLink.download = `cyclegan_${currentMode}_${Date.now()}.png`; | |
| } else { | |
| alert('Transfer failed: ' + data.error); | |
| outputPlaceholder.classList.remove('hidden'); | |
| } | |
| } catch (err) { | |
| alert('Communication error with server.'); | |
| console.error(err); | |
| outputPlaceholder.classList.remove('hidden'); | |
| } finally { | |
| loader.classList.add('hidden'); | |
| transferBtn.disabled = false; | |
| } | |
| }); | |