Scarnox · Blog

OCR de captcha image et texte : comment lire les captchas déformés

Un captcha image affiche une courte suite de lettres ou de chiffres sous forme d'image, parfois avec du bruit, une rotation et des lignes ondulées. La reconnaissance optique de caractères (OCR) peut lire des versions simples de ces captchas grâce à un moteur libre comme Tesseract. La précision dépend de la propreté de l'image, donc l'essentiel du travail consiste en un prétraitement. Ce guide présente une configuration Python fonctionnelle, explique où elle échoue, et précise un point : l'API en production de Scarnox résout des jetons de widgets PopularCaptcha, pas des captchas image vers texte. Prévoyez l'OCR comme votre propre code, pas comme un appel d'API.

Quand l'OCR fonctionne et quand il ne fonctionne pas

L'OCR est un premier essai raisonnable lorsque le texte :

Il peine avec les lettres tournées, les lettres qui se touchent, les textures de fond et les lignes tracées à travers les caractères. Chacun de ces cas demande une étape de prétraitement spécifique, et certains exigent un modèle complètement différent. Préparez-vous à mesurer la précision plutôt que de la supposer.

Installer les outils

Il vous faut Python, le binaire Tesseract et deux paquets Python :

pip install pillow pytesseract

Tesseract s'installe séparément. Sous Windows, utilisez l'installeur du projet Tesseract et assurez-vous que l'exécutable est dans votre PATH, ou pointez pytesseract.pytesseract.tesseract_cmd vers lui.

Prétraiter, puis lire

La plus grande part de la précision vient d'une entrée propre. La séquence ci-dessous convertit en niveaux de gris, renforce le contraste, applique un seuillage strict, agrandit l'image et limite la sortie aux caractères utilisés par le captcha :

from PIL import Image, ImageOps
import pytesseract

# Caractères possibles dans le captcha. Retirez les caractères qui se ressemblent,
# comme 0/O et 1/I, si le captcha ne les utilise jamais.
ALLOWED = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"

def read_text(path: str) -> str:
    img = Image.open(path)
    gray = ImageOps.grayscale(img)
    gray = ImageOps.autocontrast(gray)
    # Seuillage strict : les pixels plus clairs que 140 deviennent blancs, les autres noirs.
    bw = gray.point(lambda p: 255 if p > 140 else 0)
    # Tesseract lit mieux les gros caractères.
    bw = bw.resize((bw.width * 3, bw.height * 3))
    config = f"--psm 7 -c tessedit_char_whitelist={ALLOWED}"  # psm 7 : une seule ligne de texte
    return pytesseract.image_to_string(bw, config=config).strip()

if __name__ == "__main__":
    print(read_text("sample_captcha.png"))

La valeur de seuil de 140 n'est qu'un point de départ. Affichez l'image traitée, comparez-la avec l'originale, et ajustez jusqu'à ce que les lettres soient pleines et le fond propre.

Mesurer la précision avant de s'y fier

Une seule lecture correcte sur une seule image ne prouve rien. Enregistrez un ensemble de captchas dont les réponses sont connues, lancez la fonction sur tous, et comptez les correspondances :

def accuracy(samples: dict[str, str]) -> float:
    # samples associe un chemin de fichier au texte réel
    hits = sum(read_text(path) == truth for path, truth in samples.items())
    return hits / len(samples)

labelled = {
    "samples/0001.png": "K7PQ2",
    "samples/0002.png": "M3XN9",
}
print(f"accuracy: {accuracy(labelled):.0%}")

Suivez ce chiffre chaque fois que vous modifiez le prétraitement. Si la valeur reste basse après plusieurs modifications, l'OCR est probablement le mauvais outil pour ce style de captcha, et il faut regarder une autre approche.

Là où ça casse

Une liste de vérification du prétraitement

Quand une lecture échoue, passez en revue ces points dans l'ordre. Modifiez une seule chose à la fois pour voir quelle étape a aidé :

  1. Vérifiez la taille de l'image d'entrée. Les très petits captchas se lisent souvent mieux après un agrandissement de 3x.
  2. Convertissez en niveaux de gris et étirez le contraste pour faire ressortir les lettres.
  3. Appliquez un seuillage, et essayez plusieurs valeurs avant d'en retenir une.
  4. Supprimez le bruit ponctuel avec un filtre médian, puis reseuillez si nécessaire.
  5. Recadrez l'image sur la zone de texte pour que le fond ne perturbe pas le moteur.
  6. Limitez le jeu de caractères à celui utilisé par le captcha.
  7. Essayez un autre mode de segmentation de page si le texte est dispersé ou empilé.

Conservez l'ordre et les réglages dans votre gestionnaire de versions, à côté de vos échantillons étiquetés. Un pipeline de prétraitement est du code, et il doit être relu comme du code.

OCR ou modèle que vous exécutez vous-même

L'OCR classique est rapide et tourne sur un ordinateur portable, mais il est fragile lorsque le style d'un captcha change. Les modèles d'image entraînés sur votre propre ensemble étiqueté peuvent gérer davantage de variations, au prix de la collecte de données et de l'exécution de l'inférence. Les deux solutions sont à votre charge, à construire et à maintenir. Aucune n'est aujourd'hui un point d'accès Scarnox hébergé, donc prévoyez l'infrastructure avant de choisir l'une d'elles.

Ce que Scarnox fait et ne fait pas ici

L'API en production de Scarnox résout des jetons de widgets PopularCaptcha. La requête est POST https://api.scarnox.com/api/tasks/create avec un type de tâche PopularCaptcha, une sitekey et une URL de page, et la réponse est un jeton destiné au champ de formulaire. C'est un travail différent de la lecture du texte d'une image, et Scarnox ne propose pas aujourd'hui de point d'accès image vers texte. Si votre problème est un captcha image, utilisez l'OCR ou un modèle que vous exécutez vous-même, et consultez les autres guides pour savoir ce que Scarnox couvre. Vous pouvez créer un compte et commencer avec un crédit d'essai gratuit, sans carte bancaire, pour les flux PopularCaptcha pris en charge. Les tarifs actuels sont sur la page tarifs.

Usages légitimes

N'utilisez pas l'OCR pour contourner un captcha sur un site qui n'autorise pas l'accès automatisé. Les captchas image existent précisément pour ralentir ce type d'usage.

Prochaines étapes