127 lines
5.3 KiB
Markdown
127 lines
5.3 KiB
Markdown
# 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/
|
||
```
|