fix(vision): Corriger les seuils CLIP/Template pour éviter les clics erronés

Problème résolu:
- Le workflow cliquait au mauvais endroit (200-500px de distance)
- Les seuils de matching étaient trop permissifs

Corrections apportées:
- CLIP: MAX_DISTANCE=120px, MIN_SCORE=0.55, MIN_COMBINED=0.5
- Template zonée: MAX_DISTANCE=150px
- Template global: MAX_DISTANCE=150px (était 500px)
- Ajout de logs détaillés pour debug des candidats rejetés
- Désactivation de l'overlay debug (polling intensif inutile)

Fichiers modifiés:
- intelligent_executor.py: Seuils stricts + logs
- execute.py: Logique d'exécution modes basic/intelligent/debug
- ui_detection_service.py: Backend UI-DETR-1
- App.tsx: Overlay désactivé
- ExecutionOverlay.tsx: URLs API corrigées

Documentation:
- docs/REFERENCE_VISION_RPA.md: Guide complet de référence

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Dom
2026-01-24 02:15:04 +01:00
parent d8d086dac5
commit f04f156144
6 changed files with 2088 additions and 156 deletions

View File

@@ -0,0 +1,230 @@
# VWB Vision RPA - Document de Référence
## Session du 24 Janvier 2026
---
## 1. RÉSUMÉ DU PROBLÈME INITIAL
Le workflow "Onlyoffice" (12 étapes) cliquait au mauvais endroit :
- **Symptôme** : Gedit s'ouvrait au lieu de OnlyOffice
- **Cause** : Les seuils de matching étaient trop permissifs (acceptait des matches à 200+ pixels de distance)
- **Impact** : Le workflow continuait même après un clic erroné
---
## 2. ARCHITECTURE DU SYSTÈME DE VISION
```
┌─────────────────────────────────────────────────────────────┐
│ PIPELINE DE MATCHING │
├─────────────────────────────────────────────────────────────┤
│ 1. UI-DETR-1 (rfdetr) │
│ → Détecte tous les éléments UI à l'écran │
│ → Retourne des bounding boxes │
│ │
│ 2. CLIP (OpenCLIP) │
│ → Compare l'ancre avec chaque élément détecté │
│ → Score de similarité sémantique (0-1) │
│ → Pondéré par la distance à la position originale │
│ │
│ 3. Template Matching (OpenCV) │
│ → Fallback si CLIP échoue │
│ → Comparaison pixel à pixel │
│ → Zoned (100-200px) puis Global │
│ │
│ 4. Static Fallback │
│ → Dernier recours : coordonnées originales │
└─────────────────────────────────────────────────────────────┘
```
---
## 3. SEUILS CRITIQUES (VALEURS ACTUELLES)
### Dans `intelligent_executor.py` - Méthode CLIP
```python
# === SEUILS ÉQUILIBRÉS ===
MAX_DISTANCE_PX = 120 # Rejeter tout élément > 120px de la position originale
MIN_CLIP_SCORE = 0.55 # Score CLIP minimum requis
MIN_COMBINED_SCORE = 0.5 # Score combiné minimum pour accepter un match
```
### Dans `intelligent_executor.py` - Template Matching Zoné
```python
MAX_TEMPLATE_DISTANCE = 150 # Dans zoned_template_match()
```
### Dans `intelligent_executor.py` - Template Matching Global
```python
MAX_GLOBAL_DISTANCE = 150 # Dans find_and_click()
```
---
## 4. FICHIERS MODIFIÉS
| Fichier | Modifications |
|---------|---------------|
| `services/intelligent_executor.py` | Seuils CLIP, limites de distance, logs détaillés |
| `api_v3/execute.py` | Logique d'exécution avec modes basic/intelligent/debug |
| `services/ui_detection_service.py` | Backend UI-DETR-1 |
| `frontend_v4/src/App.tsx` | Overlay debug désactivé |
| `frontend_v4/src/components/ExecutionOverlay.tsx` | URLs API corrigées |
| `catalog_routes_v2_vlm.py` | Intégration VLM Ollama |
---
## 5. MODES D'EXÉCUTION
| Mode | Comportement | Vitesse | Utilisation |
|------|--------------|---------|-------------|
| **basic** | Coordonnées statiques uniquement | Rapide | Écran identique à l'enregistrement |
| **intelligent** | Vision (CLIP + Template) | Lent | Interface peut changer |
| **debug** | Vision + logs détaillés | Lent | Débogage |
---
## 6. ORDRE DES STRATÉGIES DE MATCHING
```
1. CLIP (UI-DETR-1 + embeddings CLIP)
├── Si trouvé avec confiance ≥ 0.5 et distance ≤ 120px → UTILISER
└── Sinon → Fallback
2. Template Matching Zoné (100px)
├── Si trouvé avec confiance ≥ 0.7 et distance ≤ 150px → UTILISER
└── Sinon → Élargir
3. Template Matching Zoné Élargi (200px)
├── Si trouvé avec confiance ≥ 0.6 et distance ≤ 150px → UTILISER
└── Sinon → Global
4. Template Matching Global
├── Si trouvé avec confiance ≥ 0.75 et distance ≤ 150px → UTILISER
└── Sinon → Static Fallback
5. Static Fallback
└── Utiliser les coordonnées originales de l'enregistrement
```
---
## 7. PROBLÈMES COURANTS ET SOLUTIONS
### Problème : "Aucun candidat valide (tous rejetés par seuils stricts)"
**Cause** : Les seuils CLIP sont trop stricts ou UI-DETR-1 ne détecte pas l'élément
**Solution** :
- Baisser `MIN_CLIP_SCORE` (ex: 0.50)
- Augmenter `MAX_DISTANCE_PX` (ex: 150)
### Problème : Clic au mauvais endroit
**Cause** : Template matching trouve un faux positif loin de la cible
**Solution** :
- Réduire `MAX_TEMPLATE_DISTANCE` et `MAX_GLOBAL_DISTANCE`
- Vérifier que l'ancre est bien distinctive
### Problème : Workflow très lent
**Cause** :
- Modèles rechargés à chaque étape
- Ollama sur CPU
- Multiples fallbacks
**Solutions** :
- Utiliser mode `basic` pour workflows stables
- Configurer Ollama pour GPU
- Implémenter un cache des modèles
### Problème : Ollama sur CPU au lieu de GPU
**Vérification** : `ollama ps`
**Solution** :
```bash
# Vérifier CUDA
nvidia-smi
# Relancer Ollama avec GPU
CUDA_VISIBLE_DEVICES=0 ollama serve
```
---
## 8. MODÈLES UTILISÉS
| Modèle | Utilisation | Emplacement |
|--------|-------------|-------------|
| UI-DETR-1 (rfdetr) | Détection éléments UI | `/home/dom/ai/rpa_vision_v3/models/ui-detr-1/model.pth` |
| CLIP (ViT-B-32) | Similarité sémantique | OpenCLIP (téléchargé automatiquement) |
| qwen2.5vl:3b | Analyse IA (vision) | Ollama |
### Modèles Ollama recommandés pour meilleure qualité :
- `qwen2.5vl:7b` - Meilleur que 3b
- `llama3.2-vision:11b` - Encore meilleur
- `mistral:7b` - Pour texte pur (pas de vision)
---
## 9. COMMANDES UTILES
```bash
# Démarrer le backend VWB
cd /home/dom/ai/rpa_vision_v3/visual_workflow_builder/backend
./venv/bin/python app.py
# Vérifier le port 5001
lsof -i :5001
# Voir les logs d'exécution
tail -f /tmp/vwb_backend.log | grep -E "(Execute|Vision|CLIP)"
# Vérifier le status d'une exécution
curl -s http://localhost:5001/api/v3/execute/status | python3 -m json.tool
# Lister les modèles Ollama
ollama list
# Voir si Ollama utilise le GPU
ollama ps
```
---
## 10. RÉSULTAT FINAL
Le workflow "Onlyoffice" (12 étapes) fonctionne maintenant :
| Étape | Action | Méthode | Status |
|-------|--------|---------|--------|
| 1 | Clic menu | CLIP 99.8% | ✅ |
| 2 | Saisie "onlyoffice" | - | ✅ |
| 3 | Clic OnlyOffice | static_fallback | ✅ |
| 4 | Clic docx | CLIP 99.2% | ✅ |
| 5 | Attente 5s | - | ✅ |
| 6 | Saisie texte | - | ✅ |
| 7 | Analyse IA | qwen2.5vl:3b | ✅ |
| 8 | Clic menu | CLIP 98.9% | ✅ |
| 9 | Saisie "gedit" | - | ✅ |
| 10 | Clic gedit | static_fallback | ✅ |
| 11 | Attente 10s | - | ✅ |
| 12 | Coller résultat IA | - | ✅ |
---
## 11. PROCHAINES AMÉLIORATIONS SUGGÉRÉES
1. **Cache des modèles** : Charger UI-DETR-1 et CLIP une seule fois au démarrage
2. **Ollama GPU** : Configurer pour utiliser le GPU
3. **Seuils adaptatifs** : Ajuster automatiquement selon le contexte
4. **Vérification post-action** : Confirmer que l'action a eu l'effet attendu
5. **Mode hybride** : Basic par défaut, vision uniquement si échec
---
## 12. CONTACT / HISTORIQUE
- **Date de résolution** : 24 Janvier 2026
- **Durée de débogage** : ~2 heures
- **Fichiers sauvegardés** : `/home/dom/ai/rpa_vision_v3/backups_24janv.2026_vision_fix/`
---
*Document généré automatiquement - Ne pas modifier manuellement*