Tesseract: Запуск консольного приложения .net core на AWS linux 2.

Созданный на 15 нояб. 2018  ·  25Комментарии  ·  Источник: charlesw/tesseract

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

Я запускаю сборку 3.2.0 alpha 4 в проекте основной консоли .net. Я получаю следующую ошибку при попытке загрузить изображение из памяти.

Метод не найден: «System.Reflection.Emit.AssemblyBuilder System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName, System.Reflection.Emit.AssemblyBuilderAccess)». !StackTrace: в InteropDotNet.InteropRuntimeImplementer.CreateInstance T
в Tesseract.Interop.LeptonicaApi.Initialize()
в Tesseract.Interop.LeptonicaApi.get_Native()
в Tesseract.Pix.LoadTiffFromMemory (байт [] байт)

Итак, мой вопрос: я вообще использую правильную сборку или мне нужно попытаться перейти на ветку разработки tesseract 4.0? Есть ли что-то еще, что мне не хватает?

Спасибо!

Самый полезный комментарий

@cypressious это мой Dockerfile. Это для веб-приложения, а не для консольного приложения, поэтому у них может быть несколько отличий.

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
# Install packages required for tesseract 3.3.0
RUN apt update && apt install libgif7 libjpeg62 libopenjp2-7 libpng16-16 libtiff5 libwebp6 libc6-dev libgdiplus -y && apt clean
WORKDIR "/app"
EXPOSE 80

ENV ASPNETCORE_URLS=http://*:80/

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR "/src"
COPY ["Scriptum/Scriptum.csproj", "Scriptum/"]
WORKDIR "/src/Scriptum"

RUN dotnet restore -nowarn:msb3202,nu1503
WORKDIR "/src"
COPY . .
WORKDIR "/src/Scriptum"
RUN dotnet build "Scriptum.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "Scriptum.csproj" -c Release -o /app

FROM base AS final
COPY --from=publish /app .
RUN sed -i 's/false/true/g' web.config
ENTRYPOINT ["dotnet", "Scriptum.dll"]

Я добавил файлы .so в папку x64 в рабочей области VisualStudio. Так что мне не нужно их копировать. Я собрал эти файлы из исходников, как описано здесь . Я скомпилировал файлы .so в контейнере, точно таком же, как и в моем Dockerfile. Я прикрепил zip-файл, содержащий файлы в моей папке x64.

x64.zip

Все 25 Комментарий

Привет, я бы рекомендовал собрать проект из исходного кода в тот момент, когда NuGet
пакеты сильно устарели. Ветка основного устройства (tesseract 3.05)
поддерживает ядро ​​.net, как и ветку Tesseract 4. у меня лично нет
протестировали их в Linux, но другие сообщили об успехе.

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

Удачи

Пт, 16 ноября 2018 г., 00:51 fhbiii < [email protected] написал:

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

Я запускаю сборку 3.2.0 alpha 4 в проекте основной консоли .net. я получил
следующая ошибка при попытке загрузить пикс из памяти.

Метод не найден: «System.Reflection.Emit.AssemblyBuilder
System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName,
System.Reflection.Emit.AssemblyBuilderAccess)». !StackTrace: в
InteropDotNet.InteropRuntimeImplementer.CreateInstanceT
в Tesseract.Interop.LeptonicaApi.Initialize()
в Tesseract.Interop.LeptonicaApi.get_Native()
в Tesseract.Pix.LoadTiffFromMemory (байт [] байт)

Итак, мой вопрос: я даже использую правильную сборку или мне нужно попробовать
и перейти на вилку разработки tesseract 4.0? Что-нибудь еще
Я скучаю?

Спасибо!


Вы получаете это, потому что подписаны на эту тему.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/charlesw/tesseract/issues/451 или отключить поток
https://github.com/notifications/unsubscribe-auth/AAPzyPzzYCjzgd2H0CE_QeQlHPUmxNGRks5uvXFPgaJpZM4Yf1f8
.

Итак, я собрал и попробовал как ветку 4.0, так и ветку разработки. Интересно, что теперь я получаю ту же ошибку, что и в Linux, в моей среде разработки Windows.

Метод не найден: «System.Reflection.Emit.AssemblyBuilder System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName, System.Reflection.Emit.AssemblyBuilderAccess)». !StackTrace: в InteropDotNet.InteropRuntimeImplementer.CreateInstanceT
в Tesseract.Interop.LeptonicaApi.Initialize()
в Tesseract.Interop.LeptonicaApi.get_Native()
в Tesseract.Pix.LoadTiffFromMemory (байт [] байт)

Я делаю что-то неправильно? У меня есть только файл eng.traineddata в моей папке tessdata, где раньше у меня были куб и биграммы. кроме версий dll, это единственная разница, которую я вижу.

Спасибо

Хорошо,
поэтому я добавил в свой проект пакет tesseract-test для 4 и продвинулся немного дальше.
Я столкнулся с проблемой отсутствия libdl.so, которая была исправлена ​​путем создания ссылки на libdl.so.2 с именем libdl.so. (sudo ln -s /lib64/libdl.so.2 /lib64/libdl.so)
В настоящее время я получаю сообщение «не удалось найти библиотеку liblept1760.so для платформы x64 с использованием логики UnixLibraryLoaderLogic», что, я думаю, указывает мне прямо на проблему № 433. И хотя я очень хочу, чтобы это работало, мне не очень нравятся шаги по решению, упомянутые этими пользователями.

Планируете ли вы разрешение на # 433 или «сборку Linux» в ближайшее время?
Спасибо

Моя основная проблема с разрешением # 433 заключается в том, что у меня нет банкомата для установки Linux. Придется сначала настроить это на виртуальной машине, когда у меня будет время.

У меня была библиотека, работающая с некоторыми незначительными изменениями в ядре .NET в Linux и на Mac, с системными и пользовательскими сборками tesseract. См. также мои комментарии к #433. Я готов больше экспериментировать, чтобы внести свой вклад в эти усилия, но, к сожалению, у меня нет времени. Надеюсь, у нас будет время для этого в ближайшие несколько недель.

Может ли кто-нибудь увидеть, решена ли эта проблема для AWS Linux в последней версии (3.3). Я реализовал исправления, описанные в #433. Обратите внимание, что вам нужно будет связать двоичные файлы tesseract 3.05.02 и leptonica 1.75.3 для Linux (т. е. файлы .so). Обратите внимание, что я считаю, что вам нужно будет разместить их с ожидаемыми именами в x86 или x64 (в зависимости от вашей целевой архитектуры). Недостаточно просто использовать менеджер пакетов для установки библиотек (извините!).

Наконец я добрался до испытаний. К сожалению, у меня нет на руках установки tesseract 3.0.5. Поэтому я тестировал на ванильном сервере Ubuntu 18.04 LTS с tesseract 4 по умолчанию. Итак, в основном я применил вашу фиксацию для # 433 к функциональной ветке tesseract 4 и построил ее.

Симлинки (или копии, как вы предложили) необходимы для файлов .so в их ожидаемых позициях, например:
x64/liblept1760.so -> /usr/lib/x86_64-linux-gnu/liblept.so.5
x64/libtesseract400.so -> /usr/lib/x86_64-linux-gnu/libtesseract.so.4

И это работает :)

Некоторые замечания и детали для записи:

  • Я тестировал .net core SDK 2.2.
  • Он пожаловался на следующее сообщение об ошибке:

System.DllNotFoundException: невозможно загрузить общую библиотеку libdl.so или одну из ее зависимостей.

Итак, я пошел и установил gcc, и все заработало. Не знаю, есть ли какой-нибудь меньший пакет, который удовлетворял бы этой зависимости. (мне было бы интересно, если бы кто-нибудь знал)

@charlesw Я могу подтвердить, что пакет NuGet v3.3 работает на AWS Lambda (я полагаю, CentOS) с упомянутыми вами файлами .so : liblept1753.so и libtesseract3052.so . Я поместил файлы .so в папку типа <MyProject>/x64 .

Мне все еще не нравится, что для этого требуются файлы библиотек с такой точной схемой именования, как указано выше (версия в имени файла), но это работает.

Я пытаюсь запустить tesseract в контейнере Docker, но сначала я получил ошибку «libdl.so» не найден. Я мог бы исправить это, создав символическую ссылку с /lib/x86_64-linux-gnu/libdl.so.2 на /usr/lib/x86_64-linux-gnu/libdl.so.

Теперь я с ошибкой
System.DllNotFoundException: не удалось найти библиотеку liblept1753.so для платформы x64.

Я уже скопировал свой liblept1753.so в папку /app/x64, но он все еще не может найти библиотеку.
На родной Ubuntu все отлично работает с тем же liblept1753.so в папке x64.

@HelgeL , не могли бы вы пошагово описать, как вы создавали символические ссылки на liblept1760.so и libtesseract400.so? В настоящее время у меня есть оба этих файла в каталоге проекта внутри папки x64.

Я получаю сообщение об ошибке " Failed to find library "liblept1760.so" for platform x64 using logic UnixLibraryLoaderLogic ".

Я попытался скопировать эти файлы в папку /usr/lib/x86_64-linux-gnu/ , но все равно не работает.

Спасибо

@charlesw , не могли бы вы внедрить эти изменения и в ветку версии 4?

@HelgeL , не могли бы вы пошагово описать, как вы создавали символические ссылки на liblept1760.so и libtesseract400.so? В настоящее время у меня есть оба этих файла в каталоге проекта внутри папки x64.

Я получаю сообщение об ошибке " Failed to find library "liblept1760.so" for platform x64 using logic UnixLibraryLoaderLogic ".

Я попытался скопировать эти файлы в папку /usr/lib/x86_64-linux-gnu/ , но все равно не работает.

Спасибо

@charlesw , не могли бы вы внедрить эти изменения и в ветку версии 4?

Создайте папку «x64» в каталоге вашего проекта (где находится ваш файл .csproj) и скопируйте в нее liblept1760.so и libtesseract400.so. Теперь вы сможете увидеть оба файла в Visual Studio. Вам нужно будет установить «копировать в выходной каталог» (свойство называется так по-английски?) для обоих файлов на «всегда»

Убедитесь, что в вашем контейнере установлены следующие пакеты
apt-get install -y libgif7 libjpeg62 libopenjp2-7 libpng16-16 libtiff5 libwebp6

В противном случае команда dlopen для liblept завершится ошибкой, и вы получите упомянутое сообщение об ошибке.

Если у вас не установлен пакет liblept внутри вашего контейнера и вы скопировали только файл .so в каталог x64, команда открытия для libtesseract завершится ошибкой.

Чтобы исправить это, вам нужно создать символическую ссылку на ваш общий объект liblept.
Просто запустите внутри своего контейнера/Dockerfile
ln -s /app/x64/liblept1760.so /usr/lib/x86_64-linux-gnu/liblept.so.5
Убедитесь, что вы используете правильный исходный путь. Для основных образов docker asp.net по умолчанию и мой описанный способ /app/x64/liblept1760.so должны работать.

Смело ставьте задачу, если что-то не получится :)

@chixlol спасибо, к сожалению, я все еще получаю ту же ошибку.

Я получил эти пакеты libgif7 libjpeg62 libopenjp2-7 libpng16-16 libtiff5 libwebp6 внутри контейнера. Я также создал символическую ссылку с /app/x64/liblept1760.so на /usr/lib/x86_64-linux-gnu/liblept.so.5 . Не знаю, почему до сих пор не может найти.

@chixlol спасибо за информацию. Прошло некоторое время с тех пор, как я возился с этим, но обнаружил, что мне не нужно копировать файлы .so в папку x64, а только создавать символические ссылки:

ln -s /usr/lib/x86_64-linux-gnu/libtesseract.so.4 libtesseract400.so
ln -s /usr/lib/x86_64-linux-gnu/liblept.so.5 liblept1760.so

и результат выглядит так:

root<strong i="10">@testdotnet</strong>:/home/test/test/ocr/publish/x64# ls -l
total 6272
-rwxr--r-- 1 test test 3742208 Jul  5  2018 liblept1760.dll
lrwxrwxrwx 1 root     root          38 Dez 30 17:35 liblept1760.so -> /usr/lib/x86_64-linux-gnu/liblept.so.5
-rwxr--r-- 1 test test 2677248 Jul  5  2018 libtesseract400.dll
lrwxrwxrwx 1 root     root          43 Dez 30 17:32 libtesseract400.so -> /usr/lib/x86_64-linux-gnu/libtesseract.so.4

и это сработало (для справки: Ubuntu 18.04.1 LTS, .net core 2.2. dll-файлы из Windows и игнорируются в этом поле)

Если вы включаете трассировку, разве он не говорит, где он проверяет и нашел ли он это?

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

Символические ссылки Chixlol не работают для меня, но HelgeL работает по крайней мере для liblept , когда я устанавливаю tesseract в контейнере. Это не работает для tesseract , потому что контейнером является Debian, где текущая стабильная версия 3, а не 4. Я попытался скопировать libtesseract400.so как libtesseract.so.4 , но по какой-то причине это не работает. т работать.

Редактировать: после установки версии 4 из бэкпорта, кажется, работает (я избавился от этой ошибки тессеракта, но получил новую из другой библиотеки). Спасибо за помощь.

Есть ли у кого-нибудь (или может создать) полное руководство по работе с этим от начала до конца?

Я хочу запустить это на последней версии Raspbian, если это возможно.

@BrentMcFerrin Мне нужны файлы liblept1753.so и libtesseract3052.so . Можете ли вы предоставить их или объяснить, как я могу получить их в противном случае?

Я пытаюсь заставить его работать с текущей версией NuGet (3.3.0), которая зависит от Tesseract 3.0.5 внутри контейнера Docker.

В настоящее время я застрял с System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.DllNotFoundException: Failed to find library "libtesseract3052.so" for platform x64.

Вот мой Dockerfile

...

FROM microsoft/dotnet:2.2.2-aspnetcore-runtime-bionic
WORKDIR /app

RUN apt-get update
RUN apt-get install -y libgif7 libjpeg62 libopenjp2-7 libpng16-16 libtiff5 libwebp6 liblept5

COPY --from=builder /dockerout .
COPY --from=webuni/tesseract:3 /usr/lib/libtesseract.so.3.0.5 ./x64/libtesseract3052.so

RUN ln -s /usr/lib/x86_64-linux-gnu/liblept.so.5 x64/liblept1753.so
RUN ln -s /lib/x86_64-linux-gnu/libdl.so.2 /usr/lib/x86_64-linux-gnu/libdl.so

Я устанавливаю зависимость liblept5 через apt-get и создаю символическую ссылку, как показано @HelgeL . К сожалению, Tesseract 3 недоступен через apt-get , поэтому я копирую его из образа докера webuni/tesseract :3 .

@cypressious У меня была такая же проблема. Вам также понадобится пакет "libgdiplus".

@FerronN Я добавил libgdiplus в строку установки apt-get, но результат тот же. Можете ли вы поделиться своим Dockerfile? Если вы не используете Docker, можете ли вы поделиться, откуда вы взяли файл tesseract .so?

@cypressious это мой Dockerfile. Это для веб-приложения, а не для консольного приложения, поэтому у них может быть несколько отличий.

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
# Install packages required for tesseract 3.3.0
RUN apt update && apt install libgif7 libjpeg62 libopenjp2-7 libpng16-16 libtiff5 libwebp6 libc6-dev libgdiplus -y && apt clean
WORKDIR "/app"
EXPOSE 80

ENV ASPNETCORE_URLS=http://*:80/

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR "/src"
COPY ["Scriptum/Scriptum.csproj", "Scriptum/"]
WORKDIR "/src/Scriptum"

RUN dotnet restore -nowarn:msb3202,nu1503
WORKDIR "/src"
COPY . .
WORKDIR "/src/Scriptum"
RUN dotnet build "Scriptum.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "Scriptum.csproj" -c Release -o /app

FROM base AS final
COPY --from=publish /app .
RUN sed -i 's/false/true/g' web.config
ENTRYPOINT ["dotnet", "Scriptum.dll"]

Я добавил файлы .so в папку x64 в рабочей области VisualStudio. Так что мне не нужно их копировать. Я собрал эти файлы из исходников, как описано здесь . Я скомпилировал файлы .so в контейнере, точно таком же, как и в моем Dockerfile. Я прикрепил zip-файл, содержащий файлы в моей папке x64.

x64.zip

@FerronN Потрясающе! Я думаю, это работает. Теперь перейдем к выяснению того, как заставить работать OpenCV...

Здравствуйте, спасибо за ваш комментарий. У меня есть несколько вопросов по использованию tesseract под ОС Linux или контейнером Docker. Вы меняли contant.cs на libtesseractxxx.so и leptonicaxxxx.so? Вы пробовали с tesseract v4?

@HelgeL , не могли бы вы пошагово описать, как вы создавали символические ссылки на liblept1760.so и libtesseract400.so? В настоящее время у меня есть оба этих файла в каталоге проекта внутри папки x64.
Я получаю сообщение об ошибке " Failed to find library "liblept1760.so" for platform x64 using logic UnixLibraryLoaderLogic ".
Я попытался скопировать эти файлы в папку /usr/lib/x86_64-linux-gnu/ , но все равно не работает.
Спасибо
@charlesw , не могли бы вы внедрить эти изменения и в ветку версии 4?

Создайте папку «x64» в каталоге вашего проекта (где находится ваш файл .csproj) и скопируйте в нее liblept1760.so и libtesseract400.so. Теперь вы сможете увидеть оба файла в Visual Studio. Вам нужно будет установить «копировать в выходной каталог» (свойство называется так по-английски?) для обоих файлов на «всегда»

Убедитесь, что в вашем контейнере установлены следующие пакеты
apt-get install -y libgif7 libjpeg62 libopenjp2-7 libpng16-16 libtiff5 libwebp6

В противном случае команда dlopen для liblept завершится ошибкой, и вы получите упомянутое сообщение об ошибке.

Если у вас не установлен пакет liblept внутри вашего контейнера и вы скопировали только файл .so в каталог x64, команда открытия для libtesseract завершится ошибкой.

Чтобы исправить это, вам нужно создать символическую ссылку на ваш общий объект liblept.
Просто запустите внутри своего контейнера/Dockerfile
ln -s /app/x64/liblept1760.so /usr/lib/x86_64-linux-gnu/liblept.so.5
Убедитесь, что вы используете правильный исходный путь. Для основных образов docker asp.net по умолчанию и мой описанный способ /app/x64/liblept1760.so должны работать.

Смело ставьте задачу, если что-то не получится :)

Привет @chixlol , я работаю над докеризацией приложения .net core 2.2, которое использует Genesis.Tesseract4 . после создания образа докера я не могу применить OCR к изображению, он дает внутреннее исключение Failed to find library "liblept1760.so" for platform x64 до того, как докер работал в среде Windows, где tesseract нуждался в liblept1760.dll, который доступен (и tesseract работает), но я не могу найдите «liblept1760.so» и «libtesseract400.so» в любом месте, я также попробовал ваше решение, добавив пакеты tesseract в файл докера, а затем создал ссылку sys, но снова появляется та же ошибка. ниже мой файл докера, пожалуйста, посмотрите, делаю ли я что-то не так.

`ОТ mcr.microsoft.com/dotnet/core/sdk:2.2 AS build-env
РАБОЧИЙКАТАЛОГ /приложение

КОПИРОВАТЬ *.csproj ./
ЗАПУСТИТЬ восстановление дотнета

КОПИРОВАТЬ . ./

ВЫПОЛНИТЬ dotnet publish -c Release -o out

С mcr.microsoft.com/dotnet/core/aspnet:2.2
РАБОЧИЙКАТАЛОГ /приложение
КОПИРОВАТЬ --from=build-env /app/out .

RUN apt update && apt install libgif7 libjpeg62 libopenjp2-7 libpng16-16 libtiff5 libwebp6 libc6-dev libgdiplus -y && apt clean

RUN ln -s /app/x64/liblept1760.so /usr/lib/x86_64-linux-gnu/liblept.so.5
RUN ln -s /app/x64/libtesseract400.so /usr/lib/x86_64-linux-gnu/libtesseract.so.4

RUN apt install -y ghostscript

ENTRYPOINT ["dotnet", "My.dll"]`

@aqibshabbir вы нашли решение этой ошибки?

@cypressious , как ты заставил это работать?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги