Tesseract: Ejecutando la aplicación de consola .net core en AWS linux 2.

Creado en 15 nov. 2018  ·  25Comentarios  ·  Fuente: charlesw/tesseract

Charles,
La última vez que hablamos sobre mono fue hace mucho tiempo. Las cosas de .net core son emocionantes, así que estoy corriendo a toda velocidad y siento que estoy cerca, pero tengo un problema, ya que no veo muchas pruebas reales de Linux, pensé Compartiría lo que tengo y vería adónde me lleva.

Estoy ejecutando la compilación 3.2.0 alpha 4 en un proyecto de consola .net core. Recibo el siguiente error al intentar cargar fotos desde la memoria.

Método no encontrado: 'System.Reflection.Emit.AssemblyBuilder System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName, System.Reflection.Emit.AssemblyBuilderAccess)'. !StackTrace: en InteropDotNet.InteropRuntimeImplementer.CreateInstance T
en Tesseract.Interop.LeptonicaApi.Initialize()
en Tesseract.Interop.LeptonicaApi.get_Native()
en Tesseract.Pix.LoadTiffFromMemory(Byte[] bytes)

Así que mi pregunta es... ¿estoy usando la compilación correcta o necesito intentar migrar a la bifurcación de desarrollo tesseract 4.0? ¿Hay algo más que me esté perdiendo?

¡Gracias!

Comentario más útil

@cypressious este es mi Dockerfile. Es para una aplicación web y no para una aplicación de consola, por lo que puede haber algunas diferencias.

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"]

Agregué los archivos .so a la carpeta x64 en mi espacio de trabajo de Visualstudio. Así que no necesito copiarlos. He compilado estos archivos desde la fuente como se describe aquí . Compilé los archivos .so en un contenedor que es exactamente el mismo que el de mi Dockerfile. Adjunté un archivo zip que contiene los archivos dentro de mi carpeta x64.

x64.zip

Todos 25 comentarios

Hola, recomendaría compilar el proyecto desde la fuente en el momento en que NuGet
Los paquetes están bastante desactualizados. La rama del dispositivo principal (tesseract 3.05)
admite .net core al igual que la rama Tesseract 4. yo personalmente no he
Sin embargo, los probé en Linux, pero otros han informado que han tenido cierto éxito.

Cabe señalar que algunas de las pruebas están fallando para tesseract 4
(principalmente detectando la orientación de la página) que todavía estoy investigando, así que use el
desarrolle una rama en su lugar si necesita esta funcionalidad.

Buena suerte

El viernes, 16 de noviembre de 2018, 00:51 fhbiii < [email protected] escribió:

Charles,
La última vez que hablamos sobre mono fue hace mucho tiempo. El material de .net core es
emocionante, así que corro a toda velocidad y siento que estoy cerca, pero
Tengo un problema, ya que no veo muchas pruebas de Linux reales,
Pensé en compartir lo que tengo y ver adónde lleva.

Estoy ejecutando la compilación 3.2.0 alpha 4 en un proyecto de consola .net core. yo obtengo
el siguiente error al intentar cargar imágenes desde la memoria.

Método no encontrado: 'System.Reflection.Emit.AssemblyBuilder
System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName,
System.Reflection.Emit.AssemblyBuilderAccess)'. !StackTrace: en
InteropDotNet.InteropRuntimeImplementer.CreateInstanceT
en Tesseract.Interop.LeptonicaApi.Initialize()
en Tesseract.Interop.LeptonicaApi.get_Native()
en Tesseract.Pix.LoadTiffFromMemory(Byte[] bytes)

Así que mi pregunta es... ¿estoy usando la compilación correcta o necesito intentarlo?
y migrar a la bifurcación de desarrollo tesseract 4.0? Hay algo mas
¿Estoy perdido?

¡Gracias!


Estás recibiendo esto porque estás suscrito a este hilo.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/charlesw/tesseract/issues/451 , o silencia el hilo
https://github.com/notifications/unsubscribe-auth/AAPzyPzzYCjzgd2H0CE_QeQlHPUmxNGRks5uvXFPgaJpZM4Yf1f8
.

Bien, he creado y probado tanto la rama 4.0 como la rama de desarrollo. Curiosamente, recibo el mismo error que recibí en Linux, en mi entorno de desarrollo de Windows ahora.

Método no encontrado: 'System.Reflection.Emit.AssemblyBuilder System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName, System.Reflection.Emit.AssemblyBuilderAccess)'. !StackTrace: en InteropDotNet.InteropRuntimeImplementer.CreateInstanceT
en Tesseract.Interop.LeptonicaApi.Initialize()
en Tesseract.Interop.LeptonicaApi.get_Native()
en Tesseract.Pix.LoadTiffFromMemory(Byte[] bytes)

¿Estoy haciendo algo mal? Solo tengo el archivo eng.traineddata en mi carpeta tessdata, donde antes tenía cube y bigrams. aparte de las versiones dll, esa es la única diferencia que puedo ver.

Gracias

OK,
así que agregué el paquete tesseract-test para 4 a mi proyecto, y avancé un poco más.
Me encontré con un problema con un libdl.so faltante, que se corrigió creando un enlace a libdl.so.2 llamado libdl.so. (sudo ln -s /lib64/libdl.so.2 /lib64/libdl.so)
Actualmente me aparece "no se pudo encontrar la biblioteca liblept1760.so para la plataforma x64 usando la lógica UnixLibraryLoaderLogic", lo que creo que me remite directamente al problema n.º 433. Y aunque estoy ansioso por hacer que funcione, no me siento tan cómodo con los pasos hacia la resolución que mencionaron esos usuarios.

¿Está planeando una resolución a # 433 o una "compilación de Linux" en el corto plazo?
Gracias

Mi problema principal al resolver el problema #433 es que no tengo un cajero automático de configuración de Linux. Tendré que configurar eso en una máquina virtual primero cuando tenga tiempo.

He tenido la biblioteca ejecutándose con algunos cambios menores en .NET core en Linux y en una Mac, con compilaciones de tesseract vinculadas personalizadas y proporcionadas por el sistema. Vea mis comentarios sobre el #433 también. Estoy dispuesto a experimentar más para contribuir a este esfuerzo, pero lamentablemente no tengo tiempo. Espero tener algo de tiempo para esto en las próximas semanas.

¿Alguien puede ver si esto se resolvió para AWS Linux en la última versión (3.3). Implementé las correcciones discutidas en #433. Tenga en cuenta que necesitará empaquetar los binarios tesseract 3.05.02 y leptonica 1.75.3 para Linux en usted mismo (es decir, los archivos .so). Tenga en cuenta que creo que deberá colocarlos con los nombres esperados en un x86 o x64 (según la arquitectura de destino). No será suficiente usar un administrador de paquetes para instalar las bibliotecas (¡lo siento!).

Finalmente llegué a las pruebas. Desafortunadamente, no tengo una configuración de tesseract 3.0.5 en mis manos. Así que probé en un servidor Vanilla Ubuntu 18.04 LTS con tesseract 4 como predeterminado. Entonces, básicamente, apliqué su confirmación para el n. ° 433 a la rama de características de tesseract 4 y la construí.

Se necesitan enlaces simbólicos (o copias como sugirió) para los archivos .so en sus posiciones esperadas de la siguiente manera:
x64/liblept1760.so -> /usr/lib/x86_64-linux-gnu/liblept.so.5
x64/libtesseract400.so -> /usr/lib/x86_64-linux-gnu/libtesseract.so.4

Y funciona :)

Algunos comentarios y detalles para el registro:

  • Probé con .net core SDK 2.2
  • Se quejó con el siguiente mensaje de error:

System.DllNotFoundException: no se puede cargar la biblioteca compartida 'libdl.so' o una de sus dependencias.

Así que fui e instalé gcc, y luego funcionó. No tengo idea si hay algún paquete más pequeño que cumpla con esta dependencia. (Me interesaría si alguien sabe)

@charlesw Puedo confirmar que el paquete NuGet v3.3 funciona en AWS Lambda (CentOS, creo) con los archivos .so que mencionó: liblept1753.so y libtesseract3052.so . Coloqué los archivos .so en una carpeta como <MyProject>/x64 .

Todavía no me gusta cómo requiere archivos de biblioteca con ese esquema de nombres exacto como el anterior (la versión en el nombre de archivo), pero funciona.

Intento ejecutar tesseract en un contenedor Docker, pero primero aparece el error "libdl.so" no encontrado. Podría arreglar eso creando un enlace simbólico desde /lib/x86_64-linux-gnu/libdl.so.2 a /usr/lib/x86_64-linux-gnu/libdl.so

ahora estoy con el error
System.DllNotFoundException: no se pudo encontrar la biblioteca "liblept1753.so" para la plataforma x64

Ya copié mi liblept1753.so en la carpeta /app/x64 pero aún no puedo encontrar la biblioteca.
En Ubuntu nativo todo funciona bien con el mismo liblept1753.so en la carpeta x64.

@HelgeL , ¿podría proporcionar paso a paso cómo creó los enlaces simbólicos en liblept1760.so y libtesseract400.so? Actualmente tengo estos dos archivos en el directorio del proyecto dentro de la carpeta x64.

Recibo un error " Failed to find library "liblept1760.so" for platform x64 using logic UnixLibraryLoaderLogic ".

Intenté copiar estos archivos en la carpeta /usr/lib/x86_64-linux-gnu/ pero aún no funciona.

Gracias

@charlesw , ¿podría implementar esos cambios también en la rama de la versión 4?

@HelgeL , ¿podría proporcionar paso a paso cómo creó los enlaces simbólicos en liblept1760.so y libtesseract400.so? Actualmente tengo estos dos archivos en el directorio del proyecto dentro de la carpeta x64.

Recibo un error " Failed to find library "liblept1760.so" for platform x64 using logic UnixLibraryLoaderLogic ".

Intenté copiar estos archivos en la carpeta /usr/lib/x86_64-linux-gnu/ pero aún no funciona.

Gracias

@charlesw , ¿podría implementar esos cambios también en la rama de la versión 4?

Cree una carpeta "x64" en el directorio de su proyecto (donde se encuentra su archivo .csproj) y copie liblept1760.so y libtesseract400.so en ella. Ahora debería poder ver sus dos archivos en Visual Studio. Tendrá que configurar "copiar en el directorio de salida" (¿la propiedad se llama así en inglés?) para ambos archivos en "siempre"

Asegúrese de tener los siguientes paquetes instalados dentro de su contenedor
apt-get install -y libgif7 libjpeg62 libopenjp2-7 libpng16-16 libtiff5 libwebp6

De lo contrario, el comando dlopen para liblept fallará y obtendrá el mensaje de error mencionado.

Si no tiene el paquete liblept instalado dentro de su contenedor y solo copió el archivo .so en el directorio x64, el comando de apertura de libtesseract fallará.

Para solucionar esto, debe crear un enlace simbólico a su objeto compartido liblept.
Simplemente ejecute dentro de su contenedor / Dockerfile
ln -s /app/x64/liblept1760.so /usr/lib/x86_64-linux-gnu/liblept.so.5
Asegúrese de utilizar la ruta de origen correcta. Para las imágenes predeterminadas de asp.net core docker y mi forma descrita /app/x64/liblept1760.so debería estar funcionando.

Siéntase libre de realizar tareas, si algo no funciona :)

@chixlol gracias, desafortunadamente sigo recibiendo el mismo error.

Tengo estos paquetes libgif7 libjpeg62 libopenjp2-7 libpng16-16 libtiff5 libwebp6 dentro del contenedor. También creé un enlace simbólico de /app/x64/liblept1760.so a /usr/lib/x86_64-linux-gnu/liblept.so.5 . No tengo idea de por qué todavía no puede encontrarlo.

@chixlol gracias por proporcionar la información. Ha pasado un tiempo desde que jugué con esto, pero descubrí que no necesitaba copiar los archivos .so a la carpeta x64, sino que solo creaba enlaces simbólicos:

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

y el resultado se parece a:

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

y funcionó (para referencia: Ubuntu 18.04.1 LTS, .net core 2.2. Los archivos dll son de Windows y se ignoran en ese cuadro)

Si habilita los rastreos, ¿no dice dónde verifica y si lo encontró o no?

Gracias a todos, parece que fue un problema de mi parte, ya que soy bastante nuevo en Docker. No sabía que necesitaba confirmar (confirmar) los cambios en la imagen de la ventana acoplable.

Los enlaces simbólicos de Chixlol no funcionan para mí, pero los de HelgeL lo hacen al menos por liblept , cuando instalo tesseract en el contenedor. No funciona para tesseract porque el contenedor es Debian donde la versión estable actual es 3 y no 4. Traté de copiar libtesseract400.so como libtesseract.so.4 pero por alguna razón esto no funciona trabajo

Editar: después de instalar la versión 4 desde backports, parece funcionar (me deshice de ese error de tesseract, pero obtuve uno nuevo de otra biblioteca). Gracias por la ayuda.

¿Alguien tiene (o puede crear) una guía completa para que esto funcione de principio a fin?

Estoy buscando hacer que esto funcione en la última versión de Raspbian, si es posible.

@BrentMcFerrin Necesito los archivos liblept1753.so y libtesseract3052.so . ¿Puede proporcionarlos o explicar cómo puedo obtenerlos de otra manera?

Estoy tratando de hacer que funcione para la versión actual en NuGet (3.3.0) que depende de Tesseract 3.0.5 dentro de un contenedor Docker.

Actualmente estoy atascado con System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.DllNotFoundException: Failed to find library "libtesseract3052.so" for platform x64.

Aquí está mi 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

Estoy instalando la dependencia liblept5 a través apt-get y creando un enlace simbólico como el que mostró @HelgeL . Desafortunadamente, Tesseract 3 no está disponible a través apt-get así que lo estoy copiando de la imagen acoplable webuni/ tesseract:3 .

@cypressious Tuve el mismo problema. También necesita el paquete "libgdiplus".

@FerronN Agregué libgdiplus a la línea de instalación apt-get pero el mismo resultado. ¿Puedes compartir tu Dockerfile? Si no está utilizando Docker, ¿puede compartir de dónde obtuvo el archivo tesseract .so?

@cypressious este es mi Dockerfile. Es para una aplicación web y no para una aplicación de consola, por lo que puede haber algunas diferencias.

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"]

Agregué los archivos .so a la carpeta x64 en mi espacio de trabajo de Visualstudio. Así que no necesito copiarlos. He compilado estos archivos desde la fuente como se describe aquí . Compilé los archivos .so en un contenedor que es exactamente el mismo que el de mi Dockerfile. Adjunté un archivo zip que contiene los archivos dentro de mi carpeta x64.

x64.zip

@FerronN Genial! Creo que está funcionando. Ahora vamos a descubrir cómo hacer que OpenCV funcione...

Hola, gracias por tu comentario. Tengo varias preguntas para usar tesseract en el sistema operativo Linux o en el contenedor docker. ¿Cambió contant.cs con libtesseractxxx.so y leptonicaxxxx.so? ¿Probaste con tesseract v4?

@HelgeL , ¿podría proporcionar paso a paso cómo creó los enlaces simbólicos en liblept1760.so y libtesseract400.so? Actualmente tengo estos dos archivos en el directorio del proyecto dentro de la carpeta x64.
Recibo un error " Failed to find library "liblept1760.so" for platform x64 using logic UnixLibraryLoaderLogic ".
Intenté copiar estos archivos en la carpeta /usr/lib/x86_64-linux-gnu/ pero aún no funciona.
Gracias
@charlesw , ¿podría implementar esos cambios también en la rama de la versión 4?

Cree una carpeta "x64" en el directorio de su proyecto (donde se encuentra su archivo .csproj) y copie liblept1760.so y libtesseract400.so en ella. Ahora debería poder ver sus dos archivos en Visual Studio. Tendrá que configurar "copiar en el directorio de salida" (¿la propiedad se llama así en inglés?) para ambos archivos en "siempre"

Asegúrese de tener los siguientes paquetes instalados dentro de su contenedor
apt-get install -y libgif7 libjpeg62 libopenjp2-7 libpng16-16 libtiff5 libwebp6

De lo contrario, el comando dlopen para liblept fallará y obtendrá el mensaje de error mencionado.

Si no tiene el paquete liblept instalado dentro de su contenedor y solo copió el archivo .so en el directorio x64, el comando de apertura de libtesseract fallará.

Para solucionar esto, debe crear un enlace simbólico a su objeto compartido liblept.
Simplemente ejecute dentro de su contenedor / Dockerfile
ln -s /app/x64/liblept1760.so /usr/lib/x86_64-linux-gnu/liblept.so.5
Asegúrese de utilizar la ruta de origen correcta. Para las imágenes predeterminadas de asp.net core docker y mi forma descrita /app/x64/liblept1760.so debería estar funcionando.

Siéntase libre de realizar tareas, si algo no funciona :)

Hola @chixlol , estoy trabajando en la dockerización de la aplicación .net core 2.2 que usa Genesis.Tesseract4 . después de crear la imagen de la ventana acoplable, no puedo aplicar OCR en una imagen, da la excepción interna Failed to find library "liblept1760.so" for platform x64 antes de la ventana acoplable, estaba trabajando en el entorno de Windows donde tesseract necesitaba liblept1760.dll que está disponible (y tesseract está funcionando) pero no puedo encuentre "liblept1760.so" y "libtesseract400.so" en cualquier lugar. También probé su solución agregando paquetes de tesseract en el archivo docker y luego creé un enlace de sistema, pero aparece el mismo error nuevamente. a continuación está mi archivo docker, vea si estoy haciendo algo mal.

`DESDE mcr.microsoft.com/dotnet/core/sdk:2.2 AS build-env
WORKDIR /aplicación

COPIAR *.csproj ./
EJECUTAR restauración dotnet

COPIAR . ./

EJECUTAR dotnet publicar -c Liberar -o salir

DESDE mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /aplicación
COPIA --from=build-env /app/out .

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

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

EJECUTAR apt install -y ghostscript

PUNTO DE ENTRADA ["dotnet", "Mi.dll"]`

@aqibshabbir ¿encontró una solución para este error?

@cypressious , ¿cómo lograste que esto funcionara?

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

chrishaly picture chrishaly  ·  11Comentarios

arthrp picture arthrp  ·  20Comentarios

goodtogood picture goodtogood  ·  9Comentarios

garora picture garora  ·  14Comentarios

FlorinMax picture FlorinMax  ·  21Comentarios