OCR для текстовых капч: как распознавать искаженные капчи
Картиночная капча показывает короткую строку букв или цифр в виде изображения, иногда с шумом, поворотом и волнистыми линиями. Оптическое распознавание символов (OCR) может читать простые версии таких капч с помощью открытого движка, например Tesseract. Точность зависит от чистоты изображения, поэтому большая часть работы — предобработка. В этом руководстве показана рабочая настройка на Python, объяснено, где она не справляется, и сказано одно важное: живой API Scarnox решает токены для виджетов PopularCaptcha, а не капчи «изображение в текст». OCR нужно планировать как ваш собственный код, а не как вызов API.
Когда OCR работает, а когда нет
OCR — разумная первая попытка, если текст:
- находится в одну строку с ровными промежутками;
- имеет высокий контраст: темные буквы на светлом фоне;
- без сильных искажений, перекрывающихся символов и пересекающих линий.
Ему трудно с повернутыми буквами, буквами, которые касаются друг друга, текстурами фона и линиями, проведенными через символы. Каждая из этих проблем требует отдельного шага предобработки, а некоторым нужна модель совсем другого типа. Будьте готовы измерять точность, а не предполагать ее.
Установка инструментов
Нужны Python, программа Tesseract и два пакета Python:
pip install pillow pytesseract
Tesseract устанавливается отдельно. В Windows используйте установщик из проекта Tesseract и убедитесь, что исполняемый файл есть в PATH, или укажите путь в pytesseract.pytesseract.tesseract_cmd.
Предобработка, затем чтение
Большая часть точности достигается чистым входом. Последовательность ниже переводит изображение в оттенки серого, повышает контраст, применяет жесткий порог, увеличивает изображение и ограничивает вывод символами, которые использует капча:
from PIL import Image, ImageOps
import pytesseract
# Символы, которые может использовать капча. Уберите похожие знаки, например 0/O и 1/I,
# если капча их никогда не использует.
ALLOWED = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"
def read_text(path: str) -> str:
img = Image.open(path)
gray = ImageOps.grayscale(img)
gray = ImageOps.autocontrast(gray)
# Жесткий порог: пиксели ярче 140 становятся белыми, остальные черными.
bw = gray.point(lambda p: 255 if p > 140 else 0)
# Tesseract лучше работает с крупными символами.
bw = bw.resize((bw.width * 3, bw.height * 3))
config = f"--psm 7 -c tessedit_char_whitelist={ALLOWED}" # psm 7: одна строка текста
return pytesseract.image_to_string(bw, config=config).strip()
if __name__ == "__main__":
print(read_text("sample_captcha.png"))
Значение порога 140 — отправная точка. Выведите обработанное изображение, сравните его с оригиналом и подстраивайте, пока буквы не станут сплошными, а фон чистым.
Измеряйте точность перед тем, как на нее полагаться
Одно правильное чтение одного изображения ничего не доказывает. Сохраните набор капч с известными ответами, запустите функцию на всех и посчитайте совпадения:
def accuracy(samples: dict[str, str]) -> float:
# samples сопоставляет путь к файлу с верным текстом
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%}")
Отслеживайте это число каждый раз, когда меняете предобработку. Если после нескольких изменений показатель остается низким, OCR, скорее всего, не подходит для данного стиля капчи, и стоит искать другой подход.
Где он ломается
- Шум и линии. Удаляйте линии морфологическими операциями или примите более низкий процент распознавания.
- Поворот. Оцените угол и поверните изображение перед чтением.
- Касающиеся буквы. Разделение символов по колонкам и чтение каждого отдельно часто работает лучше, чем чтение всей строки.
- Изменения со временем. Сайт может без предупреждения поменять стиль, и точность упадет за ночь. Храните размеченный набор и регулярно перезапускайте проверку.
Чек-лист предобработки
Когда чтение не удается, пройдите эти пункты по порядку. Меняйте одну вещь за раз, чтобы видеть, какой шаг помог:
- Проверьте размер входа. Очень мелкие капчи часто лучше читаются после увеличения в 3 раза.
- Переведите в оттенки серого и растяните контраст, чтобы буквы выделялись.
- Примените порог и попробуйте несколько значений, прежде чем остановиться на одном.
- Уберите точечный шум медианным фильтром, при необходимости повторите порог.
- Обрежьте изображение до области текста, чтобы фон не сбивал движок.
- Ограничьте набор символов тем, который использует капча.
- Попробуйте другой режим сегментации страницы, если текст разбросан или расположен в несколько строк.
Храните порядок шагов и настройки в системе контроля версий рядом с размеченными образцами. Конвейер предобработки — это код, и его нужно проверять так же, как код.
OCR или модель, которую вы запускаете сами
Классический OCR быстрый и работает на ноутбуке, но он хрупок, когда стиль капчи меняется. Модели изображений, обученные на вашем размеченном наборе, справляются с большим разнообразием, но требуют сбора данных и запуска инференса. За оба варианта отвечаете вы: вам их строить и поддерживать. Ни один из них сегодня не является размещенной конечной точкой Scarnox, поэтому спланируйте инфраструктуру, прежде чем выбирать.
Что Scarnox делает здесь, а чего не делает
Живой API Scarnox решает токены виджетов PopularCaptcha. Запрос — POST https://api.scarnox.com/api/tasks/create с типом задачи PopularCaptcha, sitekey и URL страницы, а ответ — токен для поля формы. Это другая задача, чем чтение текста из изображения, и Scarnox сегодня не предлагает конечную точку «изображение в текст». Если ваша проблема — картиночная капча, используйте OCR или модель, которую запускаете сами, а остальные руководства расскажут, что покрывает Scarnox. Вы можете создать аккаунт и начать с бесплатного пробного баланса, карта не нужна, для поддерживаемых потоков PopularCaptcha. Актуальные тарифы указаны на странице цен.
Законное использование
- Чтение текста со отсканированных документов, скриншотов или ваших собственных тестовых изображений.
- Инструменты доступности, которые описывают или читают капчу, чтобы пользователь с нарушением зрения мог воспользоваться альтернативным путем, который предоставляет сайт.
- Проверка собственного дизайна капчи: насколько легко ее прочитали бы автоматические инструменты, чтобы сделать ее сильнее.
Не используйте OCR, чтобы обойти капчу на сайте, который не разрешает автоматизированный доступ. Картиночные капчи существуют именно для того, чтобы замедлять такие действия.