Constitution et Acquisition des Données

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.

Stratégie d’Acquisition

Notre stratégie s’articule autour de trois axes principaux :

  1. Collecte automatisée via des outils de scraping web

  2. Diversification des sources et types de contenu

  3. Validation manuelle pour garantir la qualité

        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]
    

Début de Constitution du Dataset

Capture via Selenium + undetected-chromedriver

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)

Process de Collecte d’URLs

É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ètres de 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"
}

Résultats de la Collecte

Volume de Données Collectées

Distribution des Tailles d’Images

Distribution des tailles d'images collectées

Avertissement

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)

Types de Contenu Priorisés

  1. Articles de Presse et Blogs

    • Structure claire avec titre, contenu, sidebar

    • Présence fréquente de publicités

    • Bon équilibre des classes d’annotation

  2. Pages de Visualisation YouTube

    • Interface standardisée

    • Éléments spécifiques : likes, vues, commentaires, recommandations

    • Excellent pour tester la précision du modèle

  3. Sites E-commerce

    • Mise en page complexe

    • Nombreux éléments visuels (images produits, prix, avis)

    • Cas d’usage réaliste pour l’application

Méthode de Nettoyage

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)

Traçabilité et Métadonnées

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"]
    }
}

Défis Techniques Rencontrés

Gestion des Sites Modernes

Problèmes et Solutions

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

Performance et Optimisation

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
        pass

Parallélisation :

  • Utilisation de plusieurs instances Chrome

  • Traitement par lots de 50 URLs

  • Gestion des timeouts et reprises automatiques

Validation de la Qualité

Métriques de Qualité 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())

Contrôle Qualité Manuel

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

Astuce

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

Préparation 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.