La constitution d'un dataset de qualité est fondamentale pour le succès d'un projet de Computer Vision. Cette section détaille notre approche pour collecter et préparer les données d'entraînement.
Notre stratégie s'articule autour de trois axes principaux :
- Collecte automatisée via des outils de scraping web
- Diversification des sources et types de contenu
- Validation manuelle pour garantir la qualité
.. mermaid::
flowchart LR
A[SerpAPI] --> B[Liste d'URLs]
B --> C[Selenium + Chrome]
C --> D[Captures d'écran]
D --> E[~3000 images brutes]
E --> F[Nettoyage manuel]
F --> G[~2663 images finales]
La capture est effectuée avec un navigateur piloté par Selenium, combiné à undetected-chromedriver
pour éviter les blocages par Google ou les systèmes anti-automatisation.
from selenium import webdriver
from undetected_chromedriver import Chrome
# Configuration du navigateur
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--window-size=1280,800')
driver = Chrome(options=options)Étape 1 : Génération d'URLs via SerpAPI
# Requêtes utilisées pour la collecte
queries = [
"actualités france",
"articles de blog",
"sites d'information",
"pages produits e-commerce",
"documentation technique",
"forums de discussion"
]Note
SerpAPI génère des liens de pages existant sur internet à partir de nos requêtes. Pour chaque requête, maximum 100 liens sont collectés et une sauvegarde des liens est effectuée. Le code a été relancé 5 fois pour diversifier les sources.
Étape 2 : Configuration de la Capture
| Paramètre | Valeur |
|---|---|
| Largeur fenêtre | 1280 pixels |
| Hauteur minimum | 800 pixels |
| Hauteur maximum | 10000 pixels |
| Nombre de scrolls max | 30 |
| Temps de pause | 1 seconde |
Étape 3 : Capture avec Scroll Progressif
def capture_with_scroll(driver, url):
driver.get(url)
# Scroll progressif et fluide
total_height = driver.execute_script("return document.body.scrollHeight")
current_position = 0
scroll_step = total_height // 30 # Max 30 scrolls
while current_position < total_height:
driver.execute_script(f"window.scrollTo(0, {current_position});")
time.sleep(1) # Pause pour le chargement
current_position += scroll_step
# Capture d'écran complète
return driver.get_screenshot_as_png()Étape 4 : Sauvegarde et Métadonnées
Chaque capture est sauvegardée avec :
- L'image au format PNG
- L'URL correspondante
- La timestamp de capture
- Les dimensions de la page
- Le statut de chargement
{
"filename": "capture_001.png",
"url": "https://example.com/article",
"timestamp": "2025-06-16T10:30:00Z",
"dimensions": {"width": 1280, "height": 3500},
"status": "success"
}Volume de Données Collectées
.. grid:: 3
.. grid-item-card:: 📊 Images Brutes
:text-align: center
~3000 captures initiales
.. grid-item-card:: 🧹 Après Nettoyage
:text-align: center
2663 images conservées
.. grid-item-card:: 🎯 Priorisées
:text-align: center
Articles et vidéos YouTube
Warning
Défis identifiés lors de la collecte :
- Certaines captures ont de très grandes tailles (> 5000px de hauteur)
- Les captures très longues posaient des problèmes de RAM à l'ouverture
- Aucun redimensionnement appliqué par choix (préservation de la résolution)
- Articles de Presse et Blogs
- Structure claire avec titre, contenu, sidebar
- Présence fréquente de publicités
- Bon équilibre des classes d'annotation
- Pages de Visualisation YouTube
- Interface standardisée
- Éléments spécifiques : likes, vues, commentaires, recommandations
- Excellent pour tester la précision du modèle
- Sites E-commerce
- Mise en page complexe
- Nombreux éléments visuels (images produits, prix, avis)
- Cas d'usage réaliste pour l'application
Le nettoyage manuel s'est concentré sur :
✗ Suppression des erreurs de domaine (pages d'erreur 404, 500)
✗ Élimination des captures vides ou corrompues
✗ Retrait des contenus non-pertinents (captchas, redirections)
✓ Conservation des pages avec structure web classique
✓ Priorisation du contenu textuel riche
Critères de Conservation :
- Présence de contenu textuel significatif
- Structure web reconnaissable (header, content, footer)
- Qualité de capture acceptable (pas de flou majeur)
- Diversité des mises en page
- Absence d'éléments perturbateurs (pop-ups bloquants, erreurs)
Un système complet de traçabilité a été mis en place :
metadata_structure = {
"collection_info": {
"date_start": "2025-01-15",
"date_end": "2025-02-28",
"total_queries": 30,
"urls_collected": 3000,
"images_captured": 2980,
"images_kept": 2663
},
"quality_metrics": {
"success_rate": 0.89,
"avg_loading_time": 3.2,
"error_types": ["timeout", "404", "captcha", "blocked"]
}
}| Problème | Solution Adoptée |
|---|---|
| Contenu chargé en JavaScript | Attente supplémentaire après scroll |
| Protection anti-bot | undetected-chromedriver + rotation User-Agent |
| Infinite scroll | Limitation à 30 scrolls maximum |
| Pop-ups cookies/RGPD | Script de fermeture automatique |
| Redirections | Suivi et validation de l'URL finale |
Gestion de la Mémoire :
# Optimisations appliquées
def optimize_memory():
# Nettoyage cache navigateur
driver.delete_all_cookies()
driver.execute_script("window.localStorage.clear();")
# Limitation taille images
max_height = 10000
if image_height > max_height:
# Scroll partiel uniquement
passParallélisation :
- Utilisation de plusieurs instances Chrome
- Traitement par lots de 50 URLs
- Gestion des timeouts et reprises automatiques
def validate_capture_quality(image_path):
image = cv2.imread(image_path)
# Vérifications automatiques
checks = {
"min_height": image.shape[0] > 600,
"min_width": image.shape[1] > 800,
"not_blank": cv2.countNonZero(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)) > 1000,
"has_content": detect_text_presence(image),
"valid_format": image is not None
}
return all(checks.values())Un échantillonnage de 10% des images a été vérifié manuellement pour :
- Cohérence de la structure de page
- Lisibilité du contenu textuel
- Présence des éléments web standard
- Absence d'artefacts de capture
Tip
Bonnes Pratiques Identifiées :
- Prioriser la diversité sur la quantité
- Maintenir une traçabilité complète
- Valider la qualité à chaque étape
- Préserver la résolution originale pour l'annotation
Les images validées sont organisées selon la structure suivante :
dataset_raw/
├── images/
│ ├── capture_001.png
│ ├── capture_002.png
│ └── ...
├── metadata/
│ ├── urls.json
│ ├── capture_info.json
│ └── quality_report.json
└── logs/
├── collection.log
└── errors.log
Cette organisation facilite l'étape suivante d'annotation manuelle via Roboflow et assure une transition fluide vers la phase de modélisation.
