Tesseract OCR дает странный вывод в экземпляре Cloud Run, в то время как локальный вывод правильный

У нас есть конвейер, работающий в Google Cloud Platform, который:

  1. извлекает обрезки из изображения текстового документа
  2. обрабатывает эти кадры, чтобы они всегда были черным текстом на белом фоне
  3. передает кадры в pytesseract для извлечения текста.

В большинстве случаев все работает хорошо, и извлеченный текст правильный, за исключением некоторых обрезков.

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

35LURC194-     -> output as SSLUBe404-
6                           6      

(это немного измененный экземпляр проблемы, но суть вы поняли)

Теперь, вот где вещи становятся странными.

В рамках нашего процесса отладки мы запускали один и тот же код локально, и в каждом случае, когда текст OCR был ошибочным на производстве (в облаке), он работал точно на локальном компьютере!

Различия между локальной и облачной средой:

Местный Облако Операционная система Арх Линукс Образ Debian Slim Buster Docker версия Python 3.10.10 3.8.6 БАРАН 8 ГБ 3 ГБ Среда Родной Контейнер Docker (Cloud Run)

Вещи, которые мы пробовали до сих пор:

  • Обеспечено, что версии важных пакетов (pytesseract, torch, torchvision, Tesseract) одинаковы для локальной и рабочей среды.
  • Добавлено больше ОЗУ и ЦП в экземпляр Cloud Run.
  • Обновлена ​​версия Python в контейнере Dockerfile до 3.10.10.
  • Гарантировано, что обрезанное изображение, которое передается в Tesseract, одинаково в обоих сценариях (одинаковое соотношение сторон, выглядит одинаково)
  • Tripled проверил, что код, работающий локально, совпадает с кодом, работающим в облаке.
  • Запустил Tesseract с разными настройками OEM и правильным PSM (многострочным) в обоих сценариях.

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

Хотелось бы услышать любые идеи о том, что еще мы могли бы попробовать, или у кого-то еще был подобный опыт.

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

Chanpols 03.04.2023 22:02

@Chanpols действительно, одна из моих последних попыток состояла в том, чтобы запустить док-контейнер локально, и он по-прежнему выдает неверный вывод с точно таким же тестовым кодом, так что это определенно среда. Я довольно много поиграл с версиями пакетов, убедился, что у меня точно такие же версии, как и на моем локальном ПК, где он работает правильно, но это не помогло. Я проверю еще немного и обновлю, если у меня есть что-нибудь, спасибо!

ephores 04.04.2023 14:03
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
3
2
115
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Так что, в конце концов, это действительно была проблема с версией, связанная с версиями файлов языковых данных.

Этот ответ решил эту проблему для меня, я в основном загрузил файлы языковых данных с помощью wget, скопировал их в Dockerfile в /usr/share/tesseract-ocr/4.00/tessdata (каталог может отличаться в зависимости от вашей ОС), и это сработало как шарм.

Странно то, что обычной установки пакетов, предоставляющих файлы этого языка, должно быть достаточно (например, apt install tesseract-ocr-eng в Debian), но в моем случае эти предоставленные версии не давали мне правильных результатов.

Примечание. Важным шагом, который помог мне найти решение, был локальный запуск контейнера (обычно он работает в Cloud Run на GCP), что позволило гораздо быстрее проводить отладку и экспериментировать.

Другие вопросы по теме