R&D LAB Recherche appliquée En développement Version Android en test terrain

Vellum

Un scanner de documents qui calcule sur le téléphone

Bords, perspective, lumière et texte sont calculés sur le téléphone. Un document ne quitte l'appareil que lorsque quelqu'un l'envoie.

  • 0serveur par lequel passe une page
  • 1passe GPU pour la déformation et les tons
  • 11modes d'image dans le même shader
  • 2détecteurs de bords : viseur et prise de vue
Trois écrans de téléphone de Vellum côte à côte : la bibliothèque avec un document, le viseur avec une page posée de biais sur un bureau, et la page terminée, redressée, dans le document

Capture réalisée dans le banc d'essai du navigateur, qui exécute le même détecteur et le même shader que l'application. La page est un document de test synthétique projeté dans une photo de bureau.

Pourquoi c'est publié

Nous construisons de l'IA documentaire et conseillons sur l'endroit où les données ont le droit de résider. Vellum montre la part de ce travail qui précède tout modèle : préparer une image pour qu'elle soit lisible, et le faire là où se trouve déjà le document. Cela suppose un traitement d'image dont la précision est mesurée plutôt qu'estimée, et la discipline de tester sur du vrai matériel, car c'est là qu'apparaissent des défauts qu'aucun navigateur ne trouve. Si vous prévoyez de traiter des documents sensibles sans détour par les serveurs d'un tiers, vous voyez ici comment nous construisons ce type d'outil.

Un scanner photographie des documents qu'on préfère ne pas confier : contrats, bons de livraison, pièces d'identité. Vellum trouve les bords de la page dès l'image de la caméra, redresse la perspective par une homographie, égalise la lumière et le contraste dans un fragment shader sur le GPU et reconnaît le texte sur le téléphone. Aucun serveur n'intervient sur le trajet d'une page. Les PDF et les images quittent l'appareil par le menu de partage du système d'exploitation, c'est-à-dire uniquement lorsque quelqu'un appuie lui-même sur Envoyer. L'application est construite avec Expo et React Native ; une version Android est actuellement éprouvée sur un émulateur et sur un téléphone.

La décision

Le téléphone est déjà là où se trouve le document

La première question posée à ce scanner n'était pas de savoir s'il trouve bien les bords, mais où va une page pendant ce temps. Un serveur qui prépare les images et lit le texte se construit vite. C'est aussi un endroit de plus où résident contrats, pièces d'identité et bons de livraison, avec toutes les questions qui s'y rattachent : qui y a accès, pour combien de temps, dans quel pays. Vellum n'en a donc pas. Détection, redressement, correction des tons et reconnaissance du texte s'exécutent sur le téléphone.

Presque toutes les décisions suivantes en découlent. La correction de perspective est une homographie dans un fragment shader et non un appel à un service. La reconnaissance du texte écrit une couche de texte invisible dans le PDF, à l'emplacement de chaque ligne reconnue, et rend la bibliothèque consultable sans que le texte soit jamais téléversé. Envoyer signifie que l'application de messagerie ou le menu de partage du système s'ouvre avec le fichier joint, et qu'une personne appuie sur Envoyer.

Le prix à payer mérite d'être nommé. Tout ce qui exige un serveur manque délibérément : synchronisation entre appareils, liens de partage, traduction, reconnaissance de texte dans le cloud. L'envoi sans intervention n'existe pas non plus, car chaque envoi passe par une personne. Et la puissance de calcul est celle du téléphone, si bien que chaque étape doit tenir dans son budget.

Ce qui ne quitte pas l'appareil ne se trouve nulle part ailleurs.

Le parcours d'une page

De l'image de la caméra au fichier consultable

  1. 01 Les bords dans le viseur À chaque image de la caméra, un worklet lit le plan de luminosité sur une grille grossière, et seulement la partie que l'écran affiche réellement. Il en sort un contour lissé, maintenu pendant quelques images manquées. Les coins peuvent être déplacés avant la prise de vue.
  2. 02 Les coins après la prise Sur la photo, un détecteur plus approfondi cherche : seuil d'Otsu, régions connexes, uniquement les cellules de bord situées sur une vraie marche de luminosité, puis une droite par côté ajustée par moindres carrés. S'il ne trouve rien, l'image entière est retenue et les coins se placent à la main. Par défaut, une vérification des coins suit.
  3. 03 Redresser et égaliser la lumière Une seule passe GPU. Le shader ramène chaque coordonnée de sortie dans la photo par l'homographie et lit à cet endroit. Il estime le blanc du papier à partir de deux copies réduites de la photo, de sorte que chaque luminosité est relative au papier, où que se trouve la lampe.
  4. 04 Reconnaître le texte La reconnaissance du texte s'exécute sur l'appareil. À partir de la direction des lignes reconnues, l'application lit si la page doit être tournée et de combien elle penche, et corrige les deux via la liste des coins. Si les lignes ne concordent pas, la page reste telle quelle.
  5. 05 PDF et envoi Les pages deviennent un PDF avec couche de texte invisible, ou des images séparées. Une taille cible abaisse d'abord la qualité JPEG, puis seulement la résolution. Le fichier sort par l'application de messagerie ou le menu de partage du système.

On ne cherche que ce que l'on voit

L'aperçu remplit l'écran, mais l'image de la caméra a un autre format. Sur un téléphone allongé, environ un tiers de chaque image se trouve donc hors de l'écran. Tant que le détecteur fouillait aussi ce tiers, il pouvait placer un coin à un endroit que personne ne voyait ni ne pouvait déplacer. Les deux détecteurs ne cherchent désormais que dans la zone visible.

La deuxième cause d'un bord décalé était une zone claire à côté de la page, par exemple un halo de lampe, qui fusionnait avec le papier en une seule tache. Depuis, chaque côté du contour est jugé selon qu'une vraie marche de luminosité le traverse. Un halo de lumière s'estompe doucement ; un bord de papier, non.

Les deux détecteurs disposent d'un environnement de mesure qui donne l'erreur sur les coins, sur un jeu fixe de pages de test, face à des valeurs de référence déterminées indépendamment. Chaque modification est mesurée avant et après.

Viseur de Vellum : une page intitulée Mietvertrag, Seite 3 posée de biais sur un bureau sombre, une grille des tiers par-dessus, le déclencheur en bas
Le viseur dans le banc d'essai. La page est synthétique et calculée dans la photo de bureau par une vraie projection en perspective, éclairage inégal compris.

Ce qui est fixé sur l'appareil

01 Le caviardage modifie les pixels Les zones caviardées sont des uniforms du shader et sont peintes dans le bitmap de la page lors du rendu. Il ne reste ensuite rien sous le rectangle noir, et chaque export ultérieur conserve le caviardage. La limite de douze rectangles par page est la taille de ce tableau.
02 Les signatures ne deviennent jamais un fichier Une signature est conservée comme tracé vectoriel dans le stockage protégé du système d'exploitation et dessinée dans le PDF comme un tracé. Le menu de partage ne reçoit que des fichiers du dossier d'export, et n'a donc aucun accès à la signature enregistrée.
03 Le texte comme couche invisible Chaque ligne reconnue est écrite de façon invisible dans le PDF, à sa position. Le fichier reste une image de la page et devient en même temps sélectionnable et consultable.
04 L'original reste à côté de la page La prise de vue d'origine est conservée à côté de chaque page rendue. Coins, mode d'image, rotation et caviardage restent ainsi modifiables, car chaque correction est recalculée à partir de l'original. Cela double l'espace de stockage par page.
05 Un autotest dans l'application Dans les réglages, une page de test fournie, photographiée de biais, passe par la détection, le redressement, un contrôle contre une sortie noire, l'ordre des lignes, l'orientation et la reconnaissance du texte, avec des temps et un rapport copiable. L'application consigne ses propres erreurs sur l'appareil.

Après la prise, tout reste modifiable

La vue document affiche chaque page avec son mode d'image et sa taille de sortie. De là, chaque page peut être retravaillée : déplacer les coins, avec une loupe qui saute du côté opposé pour que le doigt ne masque jamais le coin, et choisir un mode d'image dans une barre qui montre chaque mode en petit aperçu du cadrage actuel.

Tourner, replacer les coins et scinder une double page de livre au niveau du pli sont des modifications de la liste des coins du même original, et non des retouches de pixels. La double page n'exige pour cela aucune seconde photo. Les pages peuvent aussi être déplacées, reprises et fusionnées avec un autre document.

Vue document de Vellum avec une page blanche redressée, en dessous le mode LIFT et la taille 805 x 1179, en bas les boutons Add et Send
La même page synthétique après redressement et correction de lumière dans le mode par défaut Lift, 805 sur 1179 pixels dans le banc d'essai.

Ce que prouve le banc d'essai, et ce que seul l'appareil montre

Vérifiable dans le navigateur

  • La géométrie de la détection des bords, car le banc exécute le même détecteur.
  • Le rendu tonal de chaque mode d'image, car le même shader GLSL ES 1.00 tourne sur WebGL.
  • Un liseré clair le long du bord de page, dû à un contour choisi très légèrement trop grand.
  • L'erreur sur les coins par page de test, mesurée face à des valeurs de référence fixes.

Visible seulement dans la version Android

  • Une session caméra impossible à configurer, car la vue caméra apporte déjà son propre aperçu.
  • Des contours au mauvais endroit, car les coordonnées du capteur arrivent dans l'orientation du capteur et doivent d'abord être tournées.
  • Des pages inversées verticalement, car un framebuffer se lit de bas en haut.
  • Des pages noires, car un décodage d'image natif échouait sans signaler d'erreur.
  • Des plantages qui ne surviennent que dans la version de production et ne sont au plus qu'un avertissement en développement.

Chercher dans ce que le téléphone a lu

La bibliothèque filtre par étiquette, par ancienneté et par le texte reconnu sur les pages. Un document porte jusqu'à huit étiquettes. Des préréglages pour reçu, contrat et pièce d'identité fixent ensemble le mode d'image et la mise en page ; pour la pièce d'identité, deux prises de vue se retrouvent sur une feuille A4.

Sur demande, une file d'attente traite la reconnaissance du texte des pages déjà enregistrées, une page après l'autre et seulement tant que l'application est au premier plan. Une photo transmise à Vellum par une autre application passe par la même chaîne qu'une prise de vue. Dans les deux cas, aucune image ne quitte l'appareil.

Bibliothèque de Vellum avec un document nommé Lieferschein 4471, une page, 0,7 Mo, avec vignette, le bouton Scan en bas
La bibliothèque dans le banc d'essai, avec un bon de livraison synthétique pour seul document.

Ce pour quoi cette construction est pensée

  • Les documents qui ne doivent pas résider chez un service de numérisation : contrats, dossiers du personnel, copies de pièces d'identité.
  • Le service terrain et l'entrepôt, où un bon de livraison est saisi sur place et envoyé de là.
  • Les reçus à impression thermique pâlie, pour lesquels il existe un mode d'image dédié.
  • Comme première étape d'une IA documentaire avec données conservées en interne : les pages sont rendues lisibles sur l'appareil avant tout traitement ultérieur.
  • Comme modèle pour vos propres applications qui traitent les images avec des shaders sur l'appareil plutôt que sur un serveur.

Pourquoi c'est publié

Ce que cela signifie pour votre projet

Plus du laboratoire

Des documents sensibles doivent-ils devenir lisibles sans détour par les serveurs d'un tiers ? C'est précisément à cela que sert un pilote.

Nous contacter

Grace Hopper

“La phrase la plus nuisible de la langue est : on a toujours fait comme ça.”