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, імовірно, не той інструмент для цього стилю капчі, і варто шукати інший підхід.
Де це ламається
- Шум і лінії. Прибирайте лінії морфологічними операціями або приймайте нижчий відсоток успіху.
- Поворот. Оцініть кут і поверніть зображення перед читанням.
- Літери, що торкаються одна одної. Розділення символів по колонках і читання кожного окремо часто працює краще, ніж читання всього рядка.
- Зміни з часом. Сайт може змінити стиль без попередження, і точність впаде за одну ніч. Зберігайте набір з розміткою і регулярно перевіряйте його.
Чеклист попередньої обробки
Коли читання не вдається, пройдіться по цих пунктах у такому порядку. Змінюйте одну річ за раз, щоб бачити, який крок допоміг:
- Перевірте розмір вхідного зображення. Дуже маленькі капчі часто краще читаються після збільшення у 3 рази.
- Перетворіть на відтінки сірого і розтягніть контраст, щоб літери виділялися.
- Застосуйте поріг і спробуйте кілька значень, перш ніж вибрати одне.
- Приберіть точковий шум медіанним фільтром, а потім при потребі повторіть порогову обробку.
- Обріжте зображення до області тексту, щоб фон не збивав движок.
- Обмежте набір символів тим, що використовує капча.
- Спробуйте інший режим сегментації сторінки, якщо текст розкидано або він розташований у кілька рядків.
Зберігайте порядок і налаштування у системі контролю версій разом із зразками з розміткою. Конвеєр попередньої обробки - це код, і його варто перевіряти так само, як код.
OCR чи модель, яку ви запускаєте самі
Класичний OCR швидкий і працює на ноутбуці, але крихкий, коли капча змінює стиль. Моделі зору, навчені на вашому наборі з розміткою, можуть впоратися з більшою різноманітністю, але потребують збору даних і запуску інференсу. Обидва варіанти - ваша відповідальність за побудову та підтримку. Жодний із них сьогодні не є ендпоінтом, який хостить Scarnox, тож сплануйте інфраструктуру, перш ніж обирати.
Що Scarnox робить і чого не робить тут
Жива API Scarnox розв'язує токени віджетів PopularCaptcha. Запит - це POST https://api.scarnox.com/api/tasks/create з типом завдання PopularCaptcha, sitekey і URL сторінки, а відповідь - токен для поля форми. Це інша задача, ніж читання тексту із зображення, і Scarnox сьогодні не пропонує ендпоінт "зображення в текст". Якщо ваша проблема - капча з зображення, використовуйте OCR або модель, яку запускаєте самі, а про те, що покриває Scarnox, дивіться в інших посібниках. Ви можете створити обліковий запис і почати з безкоштовного пробного кредиту, картка не потрібна, для потоків PopularCaptcha, які підтримуються. Актуальні тарифи вказано на сторінці цін.
Легітимне використання
- Читання тексту із сканованих документів, скриншотів або власних тестових зображень.
- Інструменти доступності, які описують або читають капчу, щоб користувач з вадами зору міг скористатися альтернативним шляхом, який надає сам сайт.
- Тестування власного дизайну капчі, щоб побачити, наскільки легко її прочитають автоматичні інструменти, і зробити її сильнішою.
Не використовуйте OCR, щоб обійти капчу на сайті, який не дозволяє автоматизований доступ. Капчі з зображень існують саме для того, щоб сповільнювати такі дії.