|
<!DOCTYPE html> |
|
<html lang="fr"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>Analyse Satellite Avancée</title> |
|
<script src="https://cdn.tailwindcss.com"></script> |
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script> |
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/ScrollTrigger.min.js"></script> |
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
|
<script> |
|
tailwind.config = { |
|
theme: { |
|
extend: { |
|
colors: { |
|
'primary-camo': '#5a6249', |
|
'secondary-camo': '#1e293b', |
|
'camo-green': '#4a5538', |
|
'camo-brown': '#6d5835', |
|
'camo-tan': '#d2b48c', |
|
}, |
|
animation: { |
|
'gradient': 'gradient 8s linear infinite', |
|
'spinner': 'spin 1.5s linear infinite', |
|
}, |
|
keyframes: { |
|
gradient: { |
|
'0%, 100%': { |
|
'background-size': '200% 200%', |
|
'background-position': 'left center' |
|
}, |
|
'50%': { |
|
'background-size': '200% 200%', |
|
'background-position': 'right center' |
|
} |
|
}, |
|
spin: { |
|
'0%': { transform: 'rotate(0deg)' }, |
|
'100%': { transform: 'rotate(360deg)' } |
|
} |
|
} |
|
} |
|
} |
|
} |
|
</script> |
|
<style> |
|
|
|
body { |
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100'%3E%3Cg fill-rule='evenodd'%3E%3Cg fill='%235a6249' fill-opacity='0.4'%3E%3Cpath opacity='.5' d='M96 95h4v1h-4v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9zm-1 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9z'/%3E%3Cpath d='M6 5V0H5v5H0v1h5v94h1V6h94V5H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); |
|
background-size: 200px 200px; |
|
} |
|
|
|
.gradient-animate { |
|
background: linear-gradient(270deg, #5a6249, #4a5538); |
|
background-size: 200% 200%; |
|
animation: gradient 8s ease infinite; |
|
} |
|
|
|
.card-hover { |
|
transition: transform 0.3s ease-in-out; |
|
background-color: rgba(255, 255, 255, 0.8); |
|
} |
|
|
|
.card-hover:hover { |
|
transform: translateY(-5px); |
|
} |
|
|
|
.progress-bar { |
|
width: 0%; |
|
transition: width 0.5s ease-in-out; |
|
} |
|
|
|
.loader { |
|
border: 8px solid #f3f3f3; |
|
border-top: 8px solid #5a6249; |
|
border-radius: 50%; |
|
width: 60px; |
|
height: 60px; |
|
animation: spin 1.5s linear infinite; |
|
display: none; |
|
margin: 20px auto; |
|
} |
|
|
|
@keyframes spin { |
|
0% { transform: rotate(0deg); } |
|
100% { transform: rotate(360deg); } |
|
} |
|
|
|
.fade-in { |
|
opacity: 0; |
|
animation: fadeIn 1s ease-in-out forwards; |
|
} |
|
|
|
@keyframes fadeIn { |
|
to { |
|
opacity: 1; |
|
} |
|
} |
|
|
|
.slide-up { |
|
transform: translateY(50px); |
|
opacity: 0; |
|
transition: transform 0.8s ease-out, opacity 0.8s ease-out; |
|
} |
|
|
|
.slide-up.active { |
|
transform: translateY(0); |
|
opacity: 1; |
|
} |
|
|
|
#imagePreview { |
|
max-width: 100%; |
|
max-height: 300px; |
|
margin-top: 20px; |
|
display: none; |
|
} |
|
|
|
|
|
.text-camo-green { |
|
color: #4a5538; |
|
} |
|
|
|
.text-camo-brown { |
|
color: #6d5835; |
|
} |
|
|
|
.text-camo-tan { |
|
color: #d2b48c; |
|
} |
|
nav, footer{ |
|
background-color: #5a6249 !important; |
|
} |
|
nav span, footer h3, footer a, footer p{ |
|
color: #d2b48c !important; |
|
} |
|
</style> |
|
</head> |
|
<body class="min-h-screen"> |
|
|
|
<nav class="shadow-lg fixed w-full z-50"> |
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> |
|
<div class="flex justify-between h-16"> |
|
<div class="flex items-center"> |
|
<span class="text-xl font-bold">SatelliteAI</span> |
|
</div> |
|
<div class="flex items-center space-x-4"> |
|
<a href="https://github.com/Yusufibin" target="_blank" |
|
class="flex items-center space-x-2 hover:text-primary-camo transition-colors"> |
|
<i class="fab fa-github text-xl"></i> |
|
<span>GitHub</span> |
|
</a> |
|
</div> |
|
</div> |
|
</div> |
|
</nav> |
|
|
|
|
|
<header class="pt-24 pb-12 gradient-animate"> |
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center text-camo-tan"> |
|
<h1 class="text-4xl font-bold mb-4">Reconnaissance d'Objets Satellite</h1> |
|
<p class="text-xl mb-8">Analyse avancée d'images satellite alimentée par l'IA</p> |
|
<div class="flex justify-center space-x-4"> |
|
<a href="#upload" class="bg-camo-tan text-primary-camo px-6 py-3 rounded-lg font-medium hover:bg-camo-brown hover:text-camo-tan transition-colors"> |
|
Commencer l'analyse |
|
</a> |
|
<a href="#about" class="border border-camo-tan text-camo-tan px-6 py-3 rounded-lg font-medium hover:bg-camo-tan hover:text-primary-camo transition-colors"> |
|
En savoir plus |
|
</a> |
|
</div> |
|
</div> |
|
</header> |
|
|
|
<main class="max-w-7xl mx-auto py-12 px-4 sm:px-6 lg:px-8"> |
|
|
|
<section id="about" class="mb-16"> |
|
<div class="grid md:grid-cols-2 gap-8"> |
|
<div class="card-hover bg-white rounded-xl shadow-lg p-6 slide-up"> |
|
<h2 class="text-2xl font-bold text-camo-green mb-4">À propos du projet</h2> |
|
<p class="text-camo-brown mb-4"> |
|
Ce système utilise l'API Gemini pour analyser des images satellite et détecter automatiquement les objets présents. |
|
Il combine la puissance du deep learning avec une interface utilisateur intuitive pour fournir des analyses détaillées |
|
et précises des images satellite. |
|
</p> |
|
<ul class="space-y-2 text-camo-brown"> |
|
<li class="flex items-center"> |
|
<i class="fas fa-check text-camo-green mr-2"></i> |
|
Détection d'objets en temps réel |
|
</li> |
|
<li class="flex items-center"> |
|
<i class="fas fa-check text-camo-green mr-2"></i> |
|
Analyse détaillée du contenu |
|
</li> |
|
<li class="flex items-center"> |
|
<i class="fas fa-check text-camo-green mr-2"></i> |
|
Interface utilisateur moderne |
|
</li> |
|
</ul> |
|
</div> |
|
<div class="card-hover bg-white rounded-xl shadow-lg p-6 slide-up"> |
|
<h2 class="text-2xl font-bold text-camo-green mb-4">Technologies utilisées</h2> |
|
<div class="grid grid-cols-2 gap-4"> |
|
<div class="flex items-center space-x-2"> |
|
<i class="fab fa-python text-2xl text-blue-500"></i> |
|
<span class="text-camo-brown">Python/Flask</span> |
|
</div> |
|
<div class="flex items-center space-x-2"> |
|
<i class="fab fa-js text-2xl text-yellow-500"></i> |
|
<span class="text-camo-brown">JavaScript</span> |
|
</div> |
|
<div class="flex items-center space-x-2"> |
|
<i class="fab fa-google text-2xl text-primary-camo"></i> |
|
<span class="text-camo-brown">Gemini API</span> |
|
</div> |
|
<div class="flex items-center space-x-2"> |
|
<i class="fab fa-css3 text-2xl text-blue-400"></i> |
|
<span class="text-camo-brown">Tailwind CSS</span> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</section> |
|
|
|
|
|
<section id="upload" class="mb-16"> |
|
<div class="card-hover bg-white rounded-xl shadow-lg p-8 slide-up"> |
|
<h2 class="text-2xl font-bold text-camo-green mb-6">Analyse d'image</h2> |
|
<div class="border-2 border-dashed border-gray-300 rounded-lg p-8 transition-colors hover:border-primary-camo"> |
|
<form id="uploadForm" class="space-y-6"> |
|
<div class="text-center"> |
|
<i class="fas fa-satellite text-5xl text-primary-camo mb-4"></i> |
|
<div class="mt-4"> |
|
<label class="block text-lg font-medium text-camo-brown mb-2"> |
|
Sélectionner une image satellite |
|
</label> |
|
<input type="file" id="fileInput" |
|
class="mt-1 block w-full text-sm text-gray-500 |
|
file:mr-4 file:py-2 file:px-4 |
|
file:rounded-full file:border-0 |
|
file:text-sm file:font-semibold |
|
file:bg-primary-camo file:text-camo-tan |
|
hover:file:bg-camo-green |
|
transition-colors" |
|
accept="image/*"> |
|
<img id="imagePreview" src="#" alt="Prévisualisation de l'image" /> |
|
</div> |
|
</div> |
|
<div class="flex justify-center"> |
|
<button type="submit" class="bg-primary-camo text-camo-tan px-8 py-3 rounded-full font-semibold hover:bg-camo-green transition-colors"> |
|
Lancer l'analyse |
|
</button> |
|
</div> |
|
<div id="loader" class="loader"></div> |
|
</form> |
|
</div> |
|
</div> |
|
</section> |
|
|
|
|
|
<section id="results" class="opacity-0"> |
|
<div class="grid md:grid-cols-2 gap-8"> |
|
<div class="card-hover bg-white rounded-xl shadow-lg p-6 slide-up"> |
|
<h3 class="text-xl font-bold text-camo-green mb-4">Objets Détectés</h3> |
|
<div id="detectedObjects" class="space-y-3"> |
|
|
|
</div> |
|
</div> |
|
<div class="card-hover bg-white rounded-xl shadow-lg p-6 slide-up"> |
|
<h3 class="text-xl font-bold text-camo-green mb-4">Description Détaillée</h3> |
|
<div id="description" class="prose text-camo-brown"> |
|
|
|
</div> |
|
</div> |
|
</div> |
|
</section> |
|
</main> |
|
|
|
|
|
<footer class="text-camo-tan py-8 mt-16"> |
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> |
|
<div class="flex justify-between items-center"> |
|
<div> |
|
<h3 class="text-lg font-semibold">SatelliteAI</h3> |
|
<p class="text-gray-400">Développé par Yusufibin</p> |
|
</div> |
|
<div> |
|
<a href="https://github.com/Yusufibin" target="_blank" |
|
class="hover:text-camo-brown transition-colors"> |
|
<i class="fab fa-github text-2xl"></i> |
|
</a> |
|
</div> |
|
</div> |
|
</div> |
|
</footer> |
|
|
|
<script> |
|
|
|
gsap.registerPlugin(ScrollTrigger); |
|
|
|
|
|
gsap.from("header", { |
|
opacity: 0, |
|
y: -50, |
|
duration: 1, |
|
ease: "power3.out" |
|
}); |
|
|
|
|
|
gsap.utils.toArray(".slide-up").forEach((el, index) => { |
|
gsap.from(el, { |
|
scrollTrigger: { |
|
trigger: el, |
|
start: "top bottom-=100", |
|
onEnter: () => { |
|
el.classList.add("active"); |
|
}, |
|
}, |
|
}); |
|
}); |
|
|
|
|
|
const fileInput = document.getElementById('fileInput'); |
|
const imagePreview = document.getElementById('imagePreview'); |
|
|
|
fileInput.addEventListener('change', function(e) { |
|
const file = e.target.files[0]; |
|
const reader = new FileReader(); |
|
|
|
reader.onload = function(e) { |
|
imagePreview.src = e.target.result; |
|
imagePreview.style.display = 'block'; |
|
} |
|
|
|
if (file) { |
|
reader.readAsDataURL(file); |
|
} else { |
|
imagePreview.src = '#'; |
|
imagePreview.style.display = 'none'; |
|
} |
|
}); |
|
|
|
|
|
document.getElementById('uploadForm').addEventListener('submit', async function(e) { |
|
e.preventDefault(); |
|
|
|
const fileInput = document.getElementById('fileInput'); |
|
const loader = document.getElementById('loader'); |
|
const resultsSection = document.getElementById('results'); |
|
const detectedObjectsDiv = document.getElementById('detectedObjects'); |
|
const descriptionDiv = document.getElementById('description'); |
|
|
|
|
|
if (!fileInput.files[0]) { |
|
alert('Veuillez sélectionner une image.'); |
|
return; |
|
} |
|
|
|
|
|
loader.style.display = 'block'; |
|
|
|
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 3000)); |
|
|
|
|
|
loader.style.display = 'none'; |
|
|
|
|
|
resultsSection.classList.add('fade-in'); |
|
|
|
|
|
detectedObjectsDiv.innerHTML = ` |
|
<div class="space-y-2 animate-pulse"> |
|
<div class="flex items-center justify-between p-3 bg-gray-50 rounded-lg"> |
|
<span class="text-camo-brown">Bâtiments</span> |
|
<div class="w-32 bg-gray-200 rounded-full h-2"> |
|
<div class="bg-primary-camo h-2 rounded-full progress-bar" style="width: 85%"></div> |
|
</div> |
|
</div> |
|
<div class="flex items-center justify-between p-3 bg-gray-50 rounded-lg"> |
|
<span class="text-camo-brown">Routes</span> |
|
<div class="w-32 bg-gray-200 rounded-full h-2"> |
|
<div class="bg-primary-camo h-2 rounded-full progress-bar" style="width: 70%"></div> |
|
</div> |
|
</div> |
|
<div class="flex items-center justify-between p-3 bg-gray-50 rounded-lg"> |
|
<span class="text-camo-brown">Végétation</span> |
|
<div class="w-32 bg-gray-200 rounded-full h-2"> |
|
<div class="bg-primary-camo h-2 rounded-full progress-bar" style="width: 90%"></div> |
|
</div> |
|
</div> |
|
<div class="flex items-center justify-between p-3 bg-gray-50 rounded-lg"> |
|
<span class="text-camo-brown">Eau</span> |
|
<div class="w-32 bg-gray-200 rounded-full h-2"> |
|
<div class="bg-primary-camo h-2 rounded-full progress-bar" style="width: 60%"></div> |
|
</div> |
|
</div> |
|
<div class="flex items-center justify-between p-3 bg-gray-50 rounded-lg"> |
|
<span class="text-camo-brown">Véhicules</span> |
|
<div class="w-32 bg-gray-200 rounded-full h-2"> |
|
<div class="bg-primary-camo h-2 rounded-full progress-bar" style="width: 50%"></div> |
|
</div> |
|
</div> |
|
</div> |
|
`; |
|
descriptionDiv.innerHTML = "<p class='text-camo-brown'>Analyse détaillée de l'image satellite. La détection a permis d'identifier plusieurs types d'objets avec une grande précision.</p>"; |
|
|
|
|
|
setTimeout(() => { |
|
document.querySelectorAll('.progress-bar').forEach(bar => { |
|
bar.style.width = bar.parentElement.dataset.value || '75%'; |
|
}); |
|
}, 100); |
|
}); |
|
</script> |
|
</body> |
|
</html> |