БэкендData и ИИPython

Как распознать текст с фото на Python: OCR для новичка

Превращаем фотографию страницы или чека в текст через EasyOCR, сохраняем уверенность распознавания и разбираем качество изображения, языки и ошибки.

Кодик

Автор

7 мин чтения

OCR превращает пиксели фотографии в строки, но хороший результат начинается не с модели, а с понятного изображения и проверки уверенности. Мы запустим EasyOCR локально, распознаем русский и английский текст, выведем вероятность каждой строки и сохраним чистый результат в TXT. Заодно увидим, почему наклон, блики и мелкий шрифт влияют сильнее, чем лишняя настройка кода.

Компьютер видит фотографию как сетку чисел. OCR-система сначала находит области, похожие на строки, затем распознаёт символы внутри каждой области. Поэтому задача состоит из двух разных частей: обнаружить текст и прочитать его. В статье используем готовую модель, чтобы сосредоточиться на входных данных, структуре результата и проверке качества.

1Готовим

Берём резкое фото, поворачиваем его правильно и ограничиваем языки русским и английским.

2Распознаём

EasyOCR возвращает рамку, текст и confidence для каждого найденного фрагмента.

3Проверяем

Отбрасываем слишком неуверенные строки и сохраняем результат рядом с исходной картинкой.

Что OCR делает с фотографией

На вход программа получает путь к image.jpg. Reader загружает модели для ru и en, затем readtext анализирует изображение. В режиме detail=1 каждый результат содержит координаты четырёх углов, распознанную строку и число уверенности от 0 до 1. Мы печатаем все кандидаты, а в итоговый файл берём строки с confidence не ниже 0.35.

ЭтапЧто происходитПризнак результата
ФотоФайл читается и приводится к формату моделиИзображение открывается без ошибки
ПоискДетектор выделяет области с текстомПолучены рамки строк
ЧтениеРаспознаватель строит последовательность символовЕсть текст и confidence
ЭкспортСтроки фильтруются и пишутся в UTF-8Создан result.txt

У проекта есть один главный маршрут: получить входные данные, проверить их, выполнить действие и показать результат. Если каждый этап можно проверить отдельно, ошибка перестаёт быть загадкой.

Как фотография становится текстом
От входных данных до видимого результата. Модель сначала ищет область, затем читает символы

Сначала прочитайте изображение глазами. Если буквы размыты, обрезаны или залиты бликом, модель не восстановит достоверно то, чего нет в пикселях. Сделайте контрольное фото при ровном свете и используйте его как эталон.

Запускаем EasyOCR и сохраняем текст

Создайте окружение и установите пакет: uv init ocr-lab, затем uv add easyocr. На Windows официальный README рекомендует сначала подобрать сборку PyTorch под CPU или вашу CUDA. Положите фотографию как image.jpg. Первый запуск скачает веса модели, поэтому он длится дольше последующих. Код ниже работает на CPU и явно указывает два языка.

from pathlib import Path
import easyocr

image_path = Path("image.jpg")
if not image_path.exists():
    raise SystemExit("Положите фотографию в image.jpg")

reader = easyocr.Reader(["ru", "en"], gpu=False)
items = reader.readtext(str(image_path), detail=1, paragraph=False)

accepted = []
for box, text, confidence in items:
    print(f"{confidence:.0%} | {text}")
    if confidence >= 0.35 and text.strip():
        accepted.append(text.strip())

result = "\n".join(accepted)
Path("result.txt").write_text(result, encoding="utf-8")
print(f"Сохранено строк: {len(accepted)}")
Что должно произойти после запуска
  • При первом запуске загружаются файлы моделей, следующие старты используют кеш.
  • В терминале каждая строка выводится вместе с процентом уверенности.
  • Фрагменты ниже порога остаются в диагностике, но не попадают в итоговый текст.
  • result.txt сохраняется в UTF-8 и открывается с русскими буквами без кракозябр.

Мы не прячем сомнительные строки. Полный вывод остаётся в терминале, а итоговый файл содержит отфильтрованную версию. Такой подход позволяет вернуться к источнику и проверить, где программа могла ошибиться.

Слепая выгрузка и проверяемый OCR
Что отличает устойчивый проект от случайного успеха. Сомнение нужно показать, а не спрятать

Как читать рамки и confidence

EasyOCR сочетает детектор текстовых областей и модель распознавания. Координаты box описывают не просто прямоугольник, а четыре угла, поэтому строка может быть немного наклонена. text является гипотезой модели, confidence оценивает её уверенность, но не является гарантией правильности.

ЧастьОтветственностьЧто проверить
ReaderЗагружает модели для выбранных языковЯзыки совместимы и нужны проекту
DetectorИщет области, похожие на строкиРамки не режут символы
RecognizerЧитает символы внутри областиТекст похож на оригинал
ConfidenceПоказывает относительную уверенностьПорог не скрывает важные строки
ExporterСобирает и сохраняет UTF-8Порядок строк остаётся читаемым

Качество OCR удобно улучшать по одному фактору. Сначала выровняйте поворот, затем обрежьте пустой фон, поднимите контраст и только после этого меняйте параметры модели. Иначе вы не поймёте, что именно помогло. Для фото с телефона полезны ровное освещение, камера параллельно листу и достаточное разрешение.

Confidence не заменяет проверку смысла. Строка «1 000» и «7 000» может иметь близкую уверенность, но для чека разница критична. Проверяйте суммы, даты и идентификаторы отдельными правилами и сохраняйте связь с исходным изображением.

Улучшаем плохой снимок по одному признаку

Сделайте три версии одной страницы: ровное фото, поворот примерно на десять градусов и кадр с тенью. Запустите программу для каждой, переименовывая файл результата. Сравните количество найденных строк и самые низкие confidence. Затем обрежьте тень обычным редактором и повторите тест. Добавьте список rejected, куда попадут фрагменты ниже порога, и сохраните его в review.txt.

Проверка своими руками
  1. Распознайте крупный печатный текст и вручную сверьте каждую строку.
  2. Сравните результаты для порогов 0.2, 0.35 и 0.7.
  3. Поверните фото и измерьте, какие строки исчезли или изменились.
  4. Сохраните низкоуверенные фрагменты в отдельный review.txt.
  5. Добавьте поиск даты или суммы и проверьте формат регулярным выражением.
  6. Повторите запуск без сети и убедитесь, что модели уже находятся в кеше.
Готово, если выполняются все пункты
  • Текст контрольного фото совпадает с оригиналом.
  • Каждая строка имеет видимый confidence.
  • Сомнительные фрагменты не теряются бесследно.
  • Вы можете улучшить снимок и объяснить изменение результата.

OCR становится полезным не тогда, когда один раз угадал текст, а когда процесс умеет показать сомнения. Файл review.txt и контроль формата делают ошибку заметной до того, как данные попадут дальше.

Четыре проверки распознавания
Четыре проверки перед следующим шагом. Контрольное фото делает качество измеримым

Собираем OCR в полезный мини-инструмент

Из этого примера легко сделать пакетный обработчик папки или интерфейс на Streamlit. Для нескольких файлов создайте Reader один раз и переиспользуйте его, иначе модель будет загружаться для каждой картинки. Храните оригинал, распознанный текст и метаданные проверки вместе.

Как изучить тему в Кодике

В Кодике сначала закрепите строки, списки, циклы и работу с Path. Затем разберите кортеж из трёх значений и фильтрацию по условию. После этого результат EasyOCR перестаёт быть сложным объектом: это коллекция записей, которую Python перебирает и сохраняет.

ШагЧто изучить в КодикеМини-проверка
1Файлы и Path в PythonПроверить существование image.jpg
2Циклы и распаковкаРазобрать box, text и confidence
3Условия и спискиОтфильтровать строки по порогу
4UTF-8 и запись текстаСоздать result.txt без потери кириллицы
5Проверка форматаНайти дату и отправить сомнение в review

Не пытайтесь запомнить весь API. В тренажёре Кодика сначала воспроизведите чистую логику без библиотеки, затем восстановите подключение и обработку ошибок. Финальный тест: объяснить проект по памяти и добавить одну свою функцию.

Включены все языки

Оставьте только реально встречающиеся алфавиты. Это уменьшает неоднозначность и нагрузку.

Порог считается гарантией

Даже высокий confidence требует смысловой проверки для критичных чисел и идентификаторов.

Reader создаётся внутри цикла

Загрузка модели дорогая. Создайте объект один раз и обрабатывайте им все файлы.

Фото улучшают десятью фильтрами сразу

Меняйте один фактор и сравнивайте с контрольным результатом, иначе причина улучшения неизвестна.

Сверьтесь с первичным источником. Команды, версии и ограничения примера проверяйте по официальному README EasyOCR. Если интерфейс изменился, первичная документация важнее старого скриншота.

Что получится в итоге

Готовый результат: Как распознать текст с фото на Python: OCR для новичка
Фотография проходит обнаружение строк, распознавание и фильтр уверенности, а программа сохраняет читаемый UTF-8 файл и список сомнительных мест.

Короткие ответы
Почему OCR иногда уверенно ошибается?

Confidence отражает оценку модели, а не фактическую проверку смысла. Похожие символы могут дать правдоподобную, но неверную строку.

Зачем сохранять низкоуверенные фрагменты?

Чтобы человек мог проверить их по оригиналу и программа не скрывала потенциальную потерю данных.

Что улучшать первым при плохом результате?

Исходное изображение: резкость, поворот, свет и обрезку. Затем сравнивать параметры на том же контрольном фото.

Как понять, что проект действительно работает?

Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай. Затем объясните путь данных своими словами.

Можно ли начать с готового кода из статьи?

Да. Добейтесь результата, измените одно правило и соберите ключевой файл заново без копирования.

Научите Python работать с изображением как с данными

Строки, циклы и файлы закрепите в курсе Python. Для ещё одного проекта с картинкой разберите статью про QR-код на Python.

Когда консольный вариант станет понятным, добавьте интерфейс по материалу про Streamlit и при необходимости соберите программу через