verify / docs /modules.md
YassmineNouisser
Verify — multimodal disinformation detection platform (6 modules + chatbot)
179d606
|
Raw
History Blame Contribute Delete
7.91 kB
# Modules — Détails techniques
Chaque module est un sous-paquet `backend/modules/ioN_*/` indépendant. Tous suivent le même contrat :
- `pipeline.py` — fonctions de chargement (`init()`) et d'inférence (`analyze_*`)
- `router.py``APIRouter` FastAPI exposant les endpoints
- `__init__.py` — réexporte `router`, `init_models`, `MODULE_INFO`
---
## io1 — Fake Media Detection (deepfake & AI-generated)
**Responsable** : Islem · **Statut** : production
### Pipeline
1. **MTCNN** (facenet-pytorch) — détection visage, crop 224×224 avec marge 20px (matche exactement
l'entraînement d'Islem)
2. **ResNet50 ensemble** — moyenne des `prob_fake` de :
- `io1_resnet50.pth` (best_ResNet50.pth d'Islem, linear head, idx 0=FAKE)
- `io1_resnet50_deepfake.pth` (Model X d'Islem, dropout+linear head, idx 0=REAL)
Le seuil de décision est **0.60** (au-dessus du naïf 0.50 pour compenser le biais OOD)
3. **AI consensus** (escalation REAL→FAKE) — pour rattraper les visages GAN/diffusion :
- **Tier 1** : Organika/sdxl-detector ≥0.95 ET umm-maybe/AI-image-detector ≥0.20 → escalade
- **Tier 2** : Organika ≥0.90 ET umm-maybe ≥0.40 → escalade
### XAI
- **Grad-CAM** sur `layer4[-1]` du ResNet50 → heatmap visualisant les régions qui ont pesé
- **Geometric heatmap analysis** → texte explicatif sans jargon ("zones concentrées au centre du visage")
- Optionnel : **LLaVA 1.5 7B** (4-bit, GPU requis) pour un commentaire libre
### Limites connues
- ~66% de recall sur TPDNE (StyleGAN3) — meilleur sur diffusion/DALL-E
- Modèles d'Islem entraînés sur FaceForensics → faux positifs possibles sur photos OOD
---
## io2 — Visual Manipulation / Persuasion
**Responsable** : Malek · **Statut** : production (modèles HF spécialisés en remplacement des poids
fine-tunés non livrés)
### Pipeline
1. **TrOCR** (microsoft/trocr-base-printed) — extraction du texte visible
2. **DistilRoBERTa fine-tuned clickbait** (valurank/distilroberta-clickbait) — score manipulation NLP
3. **CLIP ViT-B/32 zero-shot** — score visuel "clickbait/sensational" vs "ordinary informational"
en comparant les similarités à 3 prompts positifs et 3 prompts négatifs
4. **EasyOCR + regex urgence** (FR/EN, 15 patterns) — détecte "LIMITED TIME", "ONLY 3 LEFT",
countdown timers, "X% OFF", "SHOCKING", excès de ponctuation, etc.
5. **Fusion heuristique** : `0.45×nlp + 0.30×clickbait + 0.25×urgence`
6. **Optionnel** : MarianMT FR→EN pour faire passer le texte français au classifieur anglais
### XAI
- **Gradient saliency** sur CLIP (backprop de la différence positif-négatif)
- **Bounding boxes** sur les keywords d'urgence détectés par OCR
### Verdicts (4 bandes)
| Score | Label | Couleur |
|---|---|---|
| 0.0 - 0.4 | AUTHENTIC | vert |
| 0.4 - 0.6 | SUSPECT | jaune |
| 0.6 - 0.8 | MANIPULATIVE | orange |
| ≥ 0.8 | HIGHLY MANIPULATIVE | rouge |
---
## io3 — Image-Caption Coherence
**Responsable** : Youssef · **Statut** : production
### Pipeline (5 signaux fusionnés)
1. **CLIP ViT-L/14** (laion2b) — similarité directe image↔texte
2. **YOLOv8m** — détection d'objets, vérifie que les objets nommés dans le texte sont présents
3. **EasyOCR** — extraction du texte écran, cross-check avec la légende
4. **SAM ViT-B** (optional) — segmentation, score d'incohérence régionale ; fallback grille 3×3 sinon
5. **Whisper small** — transcription audio (vidéos uniquement)
### Fusion
- **Image** : `0.40×CLIP + 0.25×SAM + 0.15×Whisper + 0.10×YOLO + 0.10×OCR`
- **Vidéo** : pondération différente avec ajout de scores temporels et audio↔image
### XAI
- **Grad-CAM CLIP** sur `transformer.resblocks[-1].ln_1`
- **Waterfall chart** matplotlib des contributions des 5 modules
- **SHAP-style attribution** dictionary
---
## io4 — Image Tampering (Photoshop forensics)
**Responsable** : Rayen · **Statut** : production (forensique pure — pas de poids requis)
### Pipeline (3 signaux indépendants)
1. **ELA (Error-Level Analysis)** — re-sauvegarde JPEG quality=90, diff amplifié → détecte les
régions ré-encodées différemment (splicing)
2. **Noise residual** — soustraction d'un filtre médian 3×3, std par bloc 32×32 → détecte les zones
avec un bruit de capteur étranger (inpainting/paste)
3. **JPEG ghost** — re-save à 6 qualités (60-90), détecte les régions avec un minimum d'erreur à une
qualité différente du reste (compression mismatch)
### Décision
- Fusion pondérée : `0.45×ELA + 0.30×noise + 0.25×ghost`
- Bonus +0.10 si ≥2 signaux accord (≥0.40 chacun)
- Verdict :
- `< 0.35` → AUTHENTIC
- `0.35-0.55` → AUTHENTIC sauf si ≥2 signaux accord → FAKE
- `≥ 0.55` → FAKE
### Classes
- `Inpainting` — région remplie algorithmiquement
- `Copy-move` — partie dupliquée et collée
- `Splicing` — contenu d'une autre image inséré
- `Enhancement` — ajustements globaux (luminosité, contraste) cachant une édition
### Endpoint compare
`POST /api/io4/analyze/compare` — diff pixel-à-pixel entre suspect et original. Verdict très fiable
quand l'original est disponible.
---
## io5 — Caption Fidelity
**Responsable** : Verify team · **Statut** : production (nouveau)
### Pipeline (4 signaux)
1. **CLIP ViT-B/32** — similarité globale image↔caption (calibrée via sigmoid centré sur 0.20)
2. **CLIP per-phrase** — découpe la caption en noun phrases, score chaque fragment séparément →
identifie quelles parties ne sont pas supportées par l'image
3. **EasyOCR cross-check** — mots de la caption qui apparaissent dans le texte écran de l'image
4. **Tone gap** — caption alarmiste sur image neutre = signal de fidélité dégradée
### Décision
- `score = calibrated_sim`
- Bonus +0.15×ocr_overlap si overlap ≥30%
- Malus -0.20×tone_gap si tone_gap ≥30%
- Verdict :
- `≥ 0.60` → FAITHFUL
- `0.40-0.60` → PARTIAL
- `< 0.40` → MISLEADING
### Output
Le champ `unsupported_phrases` liste les fragments de la caption qui n'ont pas trouvé d'écho dans
l'image — particulièrement utile pour expliquer pourquoi une caption est jugée MISLEADING.
---
## io6 — Cosmetic Ads Fact-Check
**Responsable** : Yassmine · **Statut** : production
### Pipeline (4 phases)
1. **ffmpeg** — extraction audio (16 kHz mono WAV) et frames (1 par 1.4s, max 12)
2. **Whisper tiny** — transcription audio
3. **YOLOv8n** — détection objets + **EasyOCR** sur les frames pour texte écran
4. **Extraction de claims** :
- Fallback : sentence-split + filtrage par longueur (mode rapide, défaut)
- Optionnel : Phi-3 mini 4k (extraction LLM, mode `IO6_ENABLE_PHI3=on`)
### Vérification (5 sources)
- **KB Excel patterns** : 25 regex pour patterns globaux
- **KB Excel fake_claims** : 33 phrases mensongères connues + regex
- **MiniLM semantic** : similarité sémantique avec la base de fake claims pré-encodées
- **KB ingredients/brands** : whitelist de 145 ingrédients INCI et 93 marques cosmétiques validées
- **Decisive Post-Processor** : 15 patterns FAUX (interdits EU 655/2013, ex: "in 7 days", "100% effective",
"miracle", "reduce wrinkles by X%") + 8 patterns VRAI (vocabulaire acceptable, marques connues)
### Trust score
Moyenne pondérée par confiance des verdicts TRUE/FALSE :
- ≥ 50 → RELIABLE
- < 50 → MISLEADING
### Articles EU cités
Chaque claim FALSE peut citer un article EU spécifique (ex: `EU 655/2013 art. 4.2` pour les claims
quantifiées non-substantiées, `EU 1223/2009` pour les claims médicales interdites). Le champ
`eu_articles_cited` agrège tous les articles violés.
### KB Excel
La base de connaissances est dans `backend/data/IO6_Base_Reference_V3_FULL.xlsx`, 8 feuilles :
`Global_Patterns`, `Global_Fake_Claims`, `Products`, `Synonyms`, `Category_Rules`,
`Extended_Ingredients`, `Extended_Brands`, `Extended_Certifications`.