Automatisation de l'extraction de nomenclatures sur plans de construction grâce à GLM-OCR

L'Intégration de GLM-OCR dans les Flux de Travail du BTP

La gestion des matériaux dans les projets de génie civil repose souvent sur une conversion manuelle d'informations visuelles vers des formats structurés. Cette tâche présente un risque élevé d'erreur humaine et consomme un temps précieux sur les chantiers. L'utilisation de modèles de vision avancés permet de transformer cette opération fastidieuse en un processus automatisé.

Le modèle GLM-OCR se distingue par sa capacité à comprendre la sémantique des documents complexes. Contrairement aux solutions OCR classiques qui se limitent à la reconnaissance de caractères, ce moteur analyse la disposition spatiale du contenu. Il est particulièrement efficace pour extraire des tableaux techniques contenant des spécifications techniques, des quantités et des unités de mesure à partir de schémas d'architecture ou de métrés.

Configuration et Mise en Production Rapide

Pour déployer la solution dans un environnement local ou sur serveur, le processus nécessite une préparation minimaliste de l'environnement logiciel.

Ressources Système Requises

  • Environnement exécutif : Python 3.10 ou version ultérieure recommandée.
  • Accès au terminal pour l'interaction avec les scripts de démarrage.

Déploiement du Serveur

Une fois les dépendances installées, initiez le service d'inférence en exécutant le script de lancement dédié. Celui-ci gère l'allocation des ressources GPU et charge les poids du modèle en mémoire.

# Changement vers le répertoire racine du projet
cd /opt/GLM-OCR

# Lancement du démon
./start_inference_service.sh

Le temps d'initialisation varie selon la puissance matérielle disponible, généralement entre une et deux minutes pour le chargement complet du modèle. Une fois prêt, le service écoutera sur le port défini par défaut.

Vérification de l'état du service

Avant d'envoyer des requêtes, confirmez que le serveur est accessible :

  1. Vérifiez les logs de sortie pour s'assurer qu'il n'y a pas d'erreurs de chargement.
  2. Sondez le port actif avec : sudo netstat -tlnp | grep [PORT].
  3. Ouvrez l'interface utilisateur graphique via votre navigateur web.

Extraction de Données via Interface Utilisateur

L'outil propose une interface visuelle permettant de tester rapidement les capacités de reconnaissance sans écrire de code. Pour les besoins spécifiques comme l'extraction de listes de matériel :

Paramétrage des Prompts

La précision de l'extraction dépend fortement de la formulation de l'instruction envoyée au modèle. Il est crucial de définir explicitement les champs attendus.

Tableau : Identifiez tous les éléments listés ci-dessous et renvoyez-les sous forme de tableau structuré :
- Nom du matériau
- Désignation technique (diamètre, classe, etc.)
- Unité de mesure
- Quantité totale
- Observations spéciales

Analyse des Résultats

Le moteur retourne généralement des données au format Markdown ou JSON. Un exemple de sortie typique incluant les colonnes nécessaires ressemble à ceci :

Matière Spécification Unité Qté Note
Acier laminé Diamètre 12mm kg 500 Livré le 15/10
Béton prêt à l'emploi C25/30 m³ 12 Avec adjuvant

Ces données peuvent être directement copiées vers des feuilles de calcul ou importées via des connecteurs ETL.

Implémentation Automatisée via API Python

Pour des volumes importants ou une intégration système, l'accès programmatique via REST est la méthode privilégiée.

Initialisation de la Client

Assurez-vous d'avoir installé la librairie cliente nécessaire avant d'exécuter le script.

pip install gradio-client

Fonction d'Extraction Unique

Voici un exemple d'intégration modifié pour traiter une image spécifique et retourner les résultats bruts.

import requests
import json

class ExtracteurPlansBTP:
    def __init__(self, endpoint_url):
        self.api_base = f"{endpoint_url}/predict"
        
    def extraire_champs_cle(self, chemin_image, instructions=None):
        """
        Déclenche l'analyse OCR sur une image de plan.
        
        Paramètres:
            chemin_image (str): Chemin absolu ou URL vers le fichier.
            instructions (str): Prompt textuel guidant l'extraction.
            
        Retourne:
            dict ou str: Résultat brut retourné par l'API.
        """
        payload = {
            "image_path": chemin_image,
            "prompt_text": instructions or "Extraire les lignes de nomenclature du tableau."
        }
        
        # Remplacer 'client.predict' par un appel HTTP direct si nécessaire
        # Ici on simule la structure d'appel standard
        response = requests.post(self.api_base, data=payload)
        
        if response.status_code == 200:
            return response.text
        raise Exception(f"Echec de l'API : {response.status_code}")

# Utilisation
service_btp = ExtracteurPlansBTP("http://192.168.1.50:7860")
resultat = service_btp.extraire_champs_cle(
    "/données/champ_A/plans/nomenclature_01.png",
    "Identifier: Matière, Taille, Unité, Quantité, Remarques"
)

Gestion de Traitements Massifs

Lorsqu'un dossier contient plusieurs variantes de plans, un script parcourant le filesystem permet de centraliser les données. Ce script utilise os pour scanner les fichiers et sauvegarde le cumul des extractions dans un seul fichier Excel.

import os
from pandas import DataFrame
import json

def traiter_dossier_entier(root_dir):
    donnees_globales = []
    
    for nom_fichier in os.listdir(root_dir):
        chemin_complet = os.path.join(root_dir, nom_fichier)
        
        if nom_fichier.endswith('.png') or nom_fichier.endswith('.jpg'):
            print(f"Traitement en cours : {nom_fichier}")
            
            try:
                res_brut = service_btp.extraire_champs_cle(chemin_complet)
                
                # Simulation de parsing JSON si l'API retourne du JSON
                if isinstance(res_brut, str):
                    try:
                        row_data = json.loads(res_brut)
                        row_data['source'] = nom_fichier
                        donnees_globales.append(row_data)
                    except json.JSONDecodeError:
                        print(f"Parsing échoué pour {nom_fichier}, texte brut conservé.")
                        
            except Exception as e:
                print(f"Erreur critique sur {nom_fichier}: {str(e)}")

    if donnees_globales:
        df_sortie = DataFrame(donnees_globales)
        df_sortie.to_excel("./rapport_final_matériaux.xlsx", index=False)
        print("Fichier généré avec succès.")
    else:
        print("Aucune donnée récupérable.")

if __name__ == "__main__":
    path_source = "./images_plans/"
    traiter_dossier_entier(path_source)

Optimisation et Fiabilité

Pour garantir une qualité optimale des données extraites, plusieurs facteurs techniques doivent être pris en compte lors du paramétrage du pipeline.

Préprocessing Image

Les plans scannés sont souvent imparfaits. Appliquer un redressement perspectif ou augmenter le contraste avant l'envoi à l'API peut améliorer la lisibilité des zones de petite taille.

Gestion des Erreurs de Parsing

Les structures de tableaux ne sont pas toujours uniformes. Le script de récupération doit contenir des vérifications de type rigoureuses. Par exemple, vérifier que le champ 'Quantité' correspond bien à une valeur numérique valide.

Intégration Systémique

Les données structurées obtenues s'insèrent facilement dans des bases SQL ou des ERP existants via des connexions standards. Cela permet d'automatiser les commandes d'approvisionnement directement après extraction sans intervention manuelle intermédiaire.

Amélioration Continue

Si certaines erreurs persistent sur des termes techniques spécifiques (ex: nuances d'acier, normes ISO), il est possible d'ajuster le prompt système pour inclure un dictionnaire de référence ou de fine-tuner le modèle sur des exemples locaux du bâtiment.

Étiquettes: GLM-OCR Python-API Computer-Vision BTP-Digital Automatisation-Proces

Publié le 17 septembre à 20h26