# Classement Automatique de Captures d'Écran de Tweets par Harcèlement Ce projet permet d'automatiser le classement de captures d'écran de tweets, en analysant leur contenu textuel pour détecter des types de harcèlement en français. Il utilise **EasyOCR** pour extraire le texte des images et un modèle d'apprentissage profond Zero-Shot multilingue de **Hugging Face** (par défaut `MoritzLaurer/mDeBERTa-v3-base-xnli-multilingual-nli-2mil7`) pour classer le texte extrait. Le système s'appuie sur une base de données **CSV** pour suivre l'état de traitement de chaque fichier. --- ## Fonctionnalités - 🔎 **Extraction de texte (OCR)** : Reconnaissance optique de caractères robuste et multilingue grâce à EasyOCR. - 🏷️ **Classification Zero-Shot** : Classification automatique de texte en catégories de harcèlement (*Cyberharcèlement*, *Insulte*, *Menace*, *Non-harcèlement*). - 💾 **Base de données CSV** : Suivi persistant de chaque fichier (`pending`, `processed`, `error`). - 📁 **Organisation automatique** : Déplacement (ou copie) des images dans des dossiers `ok/{catégorie}/`. - 📊 **Rapport Web** : Génération d'un rapport HTML interactif (filtres, recherche, tri, lightbox) pour consulter les résultats. - 🧪 **Mode simulation** : Option `--dry-run` pour prévisualiser le classement sans déplacer de fichiers. - 💻 **CLI complète** : Contrôle total via la ligne de commande. --- ## Catégories de classification Chaque image se voit attribuer l'une des catégories suivantes : | Catégorie | Origine | |---|---| | `Cyberharcèlement`, `Insulte`, `Menace`, `Non-harcèlement` | Labels Zero-Shot retenus lorsque le score dépasse le seuil. | | `Inclassable` | Le meilleur score est en dessous du seuil de confiance (`--threshold`). | | `Sans_Texte` | Aucun texte n'a pu être extrait de l'image. | | `Non-classifié` | Valeur de repli en cas de résultat inattendu. | --- ## Structure du Projet ```text classement-image/ ├── requirements.txt # Dépendances du projet ├── main.py # Point d'entrée principal ├── captures/ # Dossier d'entrée des captures à traiter │ └── ok/ # Sortie par défaut : images classées + CSV + rapports │ ├── tweets.csv # Base de données de suivi (générée automatiquement) │ ├── report_*.html # Rapports visuels horodatés (--generate-report) │ └── {catégorie}/ # Images classées par catégorie ├── tweet_classifier/ # Package principal │ ├── ocr.py # Extraction de texte (EasyOCR) │ ├── classifier.py # Classification Zero-Shot (Hugging Face) │ ├── organizer.py # Orchestrateur du traitement │ ├── database_manager.py # Gestionnaire de la base CSV │ ├── web_generator.py # Générateur de rapport HTML (Jinja2) │ └── cli.py # Interface en ligne de commande └── tests/ # Suite de tests unitaires ``` --- ## Installation Installez les dépendances : ```bash pip install -r requirements.txt ``` > ℹ️ Au premier lancement, EasyOCR et Hugging Face téléchargent automatiquement > leurs modèles (quelques centaines de Mo). Un GPU est utilisé s'il est > disponible, sinon le traitement s'effectue sur CPU. --- ## Utilisation Le script `main.py` gère le traitement des images et la génération de rapports. ### 1. Traitement des images Pour traiter les images du dossier `captures/` : ```bash python main.py -i ./captures ``` Les images sont classées dans des sous-dossiers de `./captures/ok/` (par défaut) selon la catégorie détectée, et leur état est mis à jour dans `captures/ok/tweets.csv`. Pour choisir un autre dossier de destination : ```bash python main.py -i ./captures -o ./resultats ``` ### 2. Génération du rapport Web Une fois le traitement terminé, générez un rapport HTML depuis la base de données : ```bash python main.py --generate-report ``` Un fichier `report_{horodatage}.html` est créé dans le dossier de sortie (`captures/ok/` par défaut). Ouvrez-le dans votre navigateur pour consulter la galerie des tweets classés avec leurs images, textes et catégories détectées. ### Options de la ligne de commande | Option | Raccourci | Description | Défaut | |---|---|---|---| | `--input-dir` | `-i` | Dossier contenant les captures à classer. | *Requis pour le traitement* | | `--output-dir` | `-o` | Dossier de destination des images classées. | `{input-dir}/ok` | | `--db` | *Aucun* | Chemin du fichier base de données CSV. | `captures/ok/tweets.csv` | | `--generate-report` | *Aucun* | Génère un rapport HTML depuis le CSV (n'effectue pas de traitement). | `False` | | `--model` | `-m` | Modèle Hugging Face Zero-Shot à utiliser. | `MoritzLaurer/mDeBERTa-v3-base-xnli-multilingual-nli-2mil7` | | `--languages` | `-l` | Langues EasyOCR, séparées par des virgules. | `fr,en` | | `--threshold` | `-t` | Seuil de confiance de classification (0.0 à 1.0). | `0.35` | | `--copy` | *Aucun* | Copie les images au lieu de les déplacer. | `False` | | `--dry-run` | *Aucun* | Simulation : ne modifie ni ne déplace les fichiers. | `False` | | `--verbose` | `-v` | Active les logs de débogage. | `False` | --- ## Exécuter les Tests ```bash python3 -m pytest tests/ ```