Чарльз,
В последний раз мы говорили о моно очень давно. Ядро .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? Есть ли что-то еще, что мне не хватает?
Спасибо!
Привет, я бы рекомендовал собрать проект из исходного кода в тот момент, когда 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
И это работает :)
Некоторые замечания и детали для записи:
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.
@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 , как ты заставил это работать?
Самый полезный комментарий
@cypressious это мой Dockerfile. Это для веб-приложения, а не для консольного приложения, поэтому у них может быть несколько отличий.
Я добавил файлы .so в папку x64 в рабочей области VisualStudio. Так что мне не нужно их копировать. Я собрал эти файлы из исходников, как описано здесь . Я скомпилировал файлы .so в контейнере, точно таком же, как и в моем Dockerfile. Я прикрепил zip-файл, содержащий файлы в моей папке x64.
x64.zip