OCR превращает пиксели фотографии в строки, но хороший результат начинается не с модели, а с понятного изображения и проверки уверенности. Мы запустим EasyOCR локально, распознаем русский и английский текст, выведем вероятность каждой строки и сохраним чистый результат в TXT. Заодно увидим, почему наклон, блики и мелкий шрифт влияют сильнее, чем лишняя настройка кода.
Компьютер видит фотографию как сетку чисел. OCR-система сначала находит области, похожие на строки, затем распознаёт символы внутри каждой области. Поэтому задача состоит из двух разных частей: обнаружить текст и прочитать его. В статье используем готовую модель, чтобы сосредоточиться на входных данных, структуре результата и проверке качества.
Берём резкое фото, поворачиваем его правильно и ограничиваем языки русским и английским.
EasyOCR возвращает рамку, текст и confidence для каждого найденного фрагмента.
Отбрасываем слишком неуверенные строки и сохраняем результат рядом с исходной картинкой.
Что 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 и открывается с русскими буквами без кракозябр.
Мы не прячем сомнительные строки. Полный вывод остаётся в терминале, а итоговый файл содержит отфильтрованную версию. Такой подход позволяет вернуться к источнику и проверить, где программа могла ошибиться.

Что отличает устойчивый проект от случайного успеха. Сомнение нужно показать, а не спрятать
Как читать рамки и confidence
EasyOCR сочетает детектор текстовых областей и модель распознавания. Координаты box описывают не просто прямоугольник, а четыре угла, поэтому строка может быть немного наклонена. text является гипотезой модели, confidence оценивает её уверенность, но не является гарантией правильности.
| Часть | Ответственность | Что проверить |
|---|---|---|
| Reader | Загружает модели для выбранных языков | Языки совместимы и нужны проекту |
| Detector | Ищет области, похожие на строки | Рамки не режут символы |
| Recognizer | Читает символы внутри области | Текст похож на оригинал |
| Confidence | Показывает относительную уверенность | Порог не скрывает важные строки |
| Exporter | Собирает и сохраняет UTF-8 | Порядок строк остаётся читаемым |
Качество OCR удобно улучшать по одному фактору. Сначала выровняйте поворот, затем обрежьте пустой фон, поднимите контраст и только после этого меняйте параметры модели. Иначе вы не поймёте, что именно помогло. Для фото с телефона полезны ровное освещение, камера параллельно листу и достаточное разрешение.
Улучшаем плохой снимок по одному признаку
Сделайте три версии одной страницы: ровное фото, поворот примерно на десять градусов и кадр с тенью. Запустите программу для каждой, переименовывая файл результата. Сравните количество найденных строк и самые низкие confidence. Затем обрежьте тень обычным редактором и повторите тест. Добавьте список rejected, куда попадут фрагменты ниже порога, и сохраните его в review.txt.
- Распознайте крупный печатный текст и вручную сверьте каждую строку.
- Сравните результаты для порогов 0.2, 0.35 и 0.7.
- Поверните фото и измерьте, какие строки исчезли или изменились.
- Сохраните низкоуверенные фрагменты в отдельный review.txt.
- Добавьте поиск даты или суммы и проверьте формат регулярным выражением.
- Повторите запуск без сети и убедитесь, что модели уже находятся в кеше.
- Текст контрольного фото совпадает с оригиналом.
- Каждая строка имеет видимый confidence.
- Сомнительные фрагменты не теряются бесследно.
- Вы можете улучшить снимок и объяснить изменение результата.
OCR становится полезным не тогда, когда один раз угадал текст, а когда процесс умеет показать сомнения. Файл review.txt и контроль формата делают ошибку заметной до того, как данные попадут дальше.

Четыре проверки перед следующим шагом. Контрольное фото делает качество измеримым
Собираем OCR в полезный мини-инструмент
Из этого примера легко сделать пакетный обработчик папки или интерфейс на Streamlit. Для нескольких файлов создайте Reader один раз и переиспользуйте его, иначе модель будет загружаться для каждой картинки. Храните оригинал, распознанный текст и метаданные проверки вместе.
Как изучить тему в Кодике
В Кодике сначала закрепите строки, списки, циклы и работу с Path. Затем разберите кортеж из трёх значений и фильтрацию по условию. После этого результат EasyOCR перестаёт быть сложным объектом: это коллекция записей, которую Python перебирает и сохраняет.
| Шаг | Что изучить в Кодике | Мини-проверка |
|---|---|---|
| 1 | Файлы и Path в Python | Проверить существование image.jpg |
| 2 | Циклы и распаковка | Разобрать box, text и confidence |
| 3 | Условия и списки | Отфильтровать строки по порогу |
| 4 | UTF-8 и запись текста | Создать result.txt без потери кириллицы |
| 5 | Проверка формата | Найти дату и отправить сомнение в review |
Не пытайтесь запомнить весь API. В тренажёре Кодика сначала воспроизведите чистую логику без библиотеки, затем восстановите подключение и обработку ошибок. Финальный тест: объяснить проект по памяти и добавить одну свою функцию.
Оставьте только реально встречающиеся алфавиты. Это уменьшает неоднозначность и нагрузку.
Даже высокий confidence требует смысловой проверки для критичных чисел и идентификаторов.
Загрузка модели дорогая. Создайте объект один раз и обрабатывайте им все файлы.
Меняйте один фактор и сравнивайте с контрольным результатом, иначе причина улучшения неизвестна.
Что получится в итоге

Фотография проходит обнаружение строк, распознавание и фильтр уверенности, а программа сохраняет читаемый UTF-8 файл и список сомнительных мест.
Почему OCR иногда уверенно ошибается?
Confidence отражает оценку модели, а не фактическую проверку смысла. Похожие символы могут дать правдоподобную, но неверную строку.
Зачем сохранять низкоуверенные фрагменты?
Чтобы человек мог проверить их по оригиналу и программа не скрывала потенциальную потерю данных.
Что улучшать первым при плохом результате?
Исходное изображение: резкость, поворот, свет и обрезку. Затем сравнивать параметры на том же контрольном фото.
Как понять, что проект действительно работает?
Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай. Затем объясните путь данных своими словами.
Можно ли начать с готового кода из статьи?
Да. Добейтесь результата, измените одно правило и соберите ключевой файл заново без копирования.
Строки, циклы и файлы закрепите в курсе Python. Для ещё одного проекта с картинкой разберите статью про QR-код на Python.
Когда консольный вариант станет понятным, добавьте интерфейс по материалу про Streamlit и при необходимости соберите программу через