Scarnox · Blog

OCR для текстових капч із зображень: як читати спотворені капчі

Капча із зображення показує короткий рядок літер або цифр у вигляді картинки, іноді з шумом, поворотом і хвилястими лініями. Оптичне розпізнавання символів (OCR) може прочитати прості версії таких капч за допомогою відкритого движка, наприклад Tesseract. Точність залежить від того, наскільки чисте зображення, тож більшість роботи - це попередня обробка. Цей посібник показує робочу налаштування на Python, пояснює, де воно ламається, і чітко говорить про одне: жива API Scarnox розв'язує токени віджетів PopularCaptcha, а не капчі "зображення в текст". Плануйте OCR як власний код, а не як виклик API.

Коли OCR працює, а коли ні

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, імовірно, не той інструмент для цього стилю капчі, і варто шукати інший підхід.

Де це ламається

Чеклист попередньої обробки

Коли читання не вдається, пройдіться по цих пунктах у такому порядку. Змінюйте одну річ за раз, щоб бачити, який крок допоміг:

  1. Перевірте розмір вхідного зображення. Дуже маленькі капчі часто краще читаються після збільшення у 3 рази.
  2. Перетворіть на відтінки сірого і розтягніть контраст, щоб літери виділялися.
  3. Застосуйте поріг і спробуйте кілька значень, перш ніж вибрати одне.
  4. Приберіть точковий шум медіанним фільтром, а потім при потребі повторіть порогову обробку.
  5. Обріжте зображення до області тексту, щоб фон не збивав движок.
  6. Обмежте набір символів тим, що використовує капча.
  7. Спробуйте інший режим сегментації сторінки, якщо текст розкидано або він розташований у кілька рядків.

Зберігайте порядок і налаштування у системі контролю версій разом із зразками з розміткою. Конвеєр попередньої обробки - це код, і його варто перевіряти так само, як код.

OCR чи модель, яку ви запускаєте самі

Класичний OCR швидкий і працює на ноутбуці, але крихкий, коли капча змінює стиль. Моделі зору, навчені на вашому наборі з розміткою, можуть впоратися з більшою різноманітністю, але потребують збору даних і запуску інференсу. Обидва варіанти - ваша відповідальність за побудову та підтримку. Жодний із них сьогодні не є ендпоінтом, який хостить Scarnox, тож сплануйте інфраструктуру, перш ніж обирати.

Що Scarnox робить і чого не робить тут

Жива API Scarnox розв'язує токени віджетів PopularCaptcha. Запит - це POST https://api.scarnox.com/api/tasks/create з типом завдання PopularCaptcha, sitekey і URL сторінки, а відповідь - токен для поля форми. Це інша задача, ніж читання тексту із зображення, і Scarnox сьогодні не пропонує ендпоінт "зображення в текст". Якщо ваша проблема - капча з зображення, використовуйте OCR або модель, яку запускаєте самі, а про те, що покриває Scarnox, дивіться в інших посібниках. Ви можете створити обліковий запис і почати з безкоштовного пробного кредиту, картка не потрібна, для потоків PopularCaptcha, які підтримуються. Актуальні тарифи вказано на сторінці цін.

Легітимне використання

Не використовуйте OCR, щоб обійти капчу на сайті, який не дозволяє автоматизований доступ. Капчі з зображень існують саме для того, щоб сповільнювати такі дії.

Що далі