A semi-automatic open-source tool for Layout Analysis and Region EXtraction on early printed books.

Overview

larex

LAREX

Build Status

LAREX is a semi-automatic open-source tool for layout analysis on early printed books. It uses a rule based connected components approach which is very fast, easily comprehensible for the user and allows an intuitive manual correction if necessary. The PageXML format is used to support integration into existing OCR workflows. Evaluations showed that LAREX provides an efficient and flexible way to segment pages of early printed books.

Please feel free to visit the tool homepage and the web application. A short user manual is available here.

Table of Contents

Additional information about developing for LAREX see here

Installation

Linux

This guide uses tomcat 8 and Ubuntu (please adjust accordingly for your setup)

  • Install required packages: apt-get install tomcat8 maven openjdk-8-jdk
  • Clone Repository: git clone https://github.com/OCR4all/LAREX.git
  • Compile: mvn clean install -f LAREX/pom.xml.
  • Copy or link the created war file to tomcat:
    • Copy cp LAREX/target/Larex.war /var/lib/tomcat8/webapps/Larex.war
    • Link: sudo ln -s $PWD/LAREX/target/Larex.war /var/lib/tomcat8/webapps/Larex.war
  • Start Tomcat: systemctl start tomcat8
    • (Restart Tomcat via systemctl restart tomcat8)
    • (To start Tomcat automatically at system boot systemctl enable tomcat8)

Windows

This guide uses eclipse to simplify the setup on Windows

  • Install Eclipse IDE for Enterprise Java Developers from the official website
  • Download tomcat 8 or up from the official website
  • Create a tomcat server in eclipse:
    • Open Window -> Show View -> Other... -> Server -> Servers
    • Click prompt to add a new server, select Apache -> Tomcat <version> Server -> Next-> set your Tomcat installation directory -> Finish.
  • Clone Repository:
    • File -> Import -> Git -> Projects from Git -> Clone URI -> Set URI: https://github.com/OCR4all/LAREX.git -> [✓] master -> Next > -> Next > -> Import as gernal project -> Finish
  • Set as Maven Project:
  • Import Project
    • Right click on Larex -> Configure -> Convert to Maven Project -> Finish
  • Update maven project (if not updated automatically)
    • Rightclick on Larex -> Maven -> Update Project... -> OK
  • Start Larex
    • Right click on Larex -> Run As -> Run on Server.

Mac OS X

This guid uses homebrew (please adjust accordingly for your setup)

  • Install Homebrew (see https://brew.sh/).
  • Install required packages:
    • brew cask install java
    • brew install tomcat git maven
  • (Verify tomcat installation):
    • brew services list tomcat should be listed in the output of this command
  • Clone Repository:
    • git clone https://github.com/OCR4all/LAREX.git
  • Compile:
    • run mvn clean install -f LAREX/pom.xml.
  • Copy or link the created war file to tomcat
    • Copy: cp LAREX/target/Larex.war /usr/local/Cellar/tomcat/[version]/libexec/webapps/Larex.war
    • Link: ln -s $PWD/LAREX/target/Larex.war /usr/local/Cellar/tomcat/[version]/libexec/webapps/Larex.war
  • Start Tomcat:
    • brew services start tomcat
    • (Restart Tomcat via brew services restart tomcat)

Usage

Access in browser

Go to localhost:8080/Larex.

Using your own images and books

You can add your own books by copying them to src/webapp/resources/books

(Or an alternative direction set in the config file. See section Configuration for more information).

Book directories must have the following structure:

bookDir/
├── <book_name>/ 
│    ├── <page_name>.png 
│    └── <page_name>.xml
└── <book2_name>/
     └── …

More information

Detailed information about the usage of LAREX can be found in the OCR4all getting started guides.

See sections and chapters about Segmentation, Ground Truth Correction and Post Correction.

Configuration

Larex contains a configuration file (src/webapp/WEB-INF/larex.config) with a few settings that can be set before running the application.

bookpath

The setting bookpath sets the file path of the books folder.

e.g. bookpath:/home/user/books (Linux)

e.g. bookpath:C:\Users\user\Documents\books (Windows)

Larex will load the books from this folder.

[default /src/main/webapp/resources/books]

localsave

The setting localsave tells the application how to handle results locally when saved.

<mode>=[bookpath|savedir|none]

bookpath: save the result in the bookpath

savedir: save the result in a defined savedir

none: do not save the result locally [default]

e.g. localsave:bookpath

savedir

The setting savedir is needed if localsave mode is set to "savedir".

e.g. savedir:/home/user/save (Linux)

e.g. savedir:C:\Users\user\Documents\save (Windows)

websave

The setting websave tells the application how to handle results on the browser side when saved.

<value>=[true|false]

true: download the result after saving [default]

false: no action after saving

e.g. websave:true

modes

Set the accessible modes in the Larex gui <value>=[[segment][edit][lines][text]] A combination of the modes "segment", "edit", "lines" and "text" can be set as a space separated string. e.g. modes:segment lines

The order of those modes in the string also determines which mode is opened on startup, with the first in the list being opened as main mode. The mode "segment" can be replaced with "edit" in order to hide all auto segmentation features. ("edit" will be ignored if both are present)

[Default]modes:segment lines text

directrequest

This setting enables or disables the direct open feature.

<value>=[enable|disable]

This feature allows users to load a book from everywhere on the servers drive aswell as to alter the options websave, localsave and savedir.

enable: enable direct request

disable: disable direct request [default]

e.g. directrequest:enable

This feature should be used with caution but is very useful when using Larex in a workflow with other web applications. (e.g. in docker)

The easiest direct request would be via a html form with the values bookpath, bookname, websave (optional), localsave (optional) and savedir (optional).

<form action="http://localhost:8080/Larex/direct" method="POST">
	bookpath: <input type="text" name="bookpath"/><br>
	bookname: <input type="text" name="bookname"/><br>
	websave: <input type="text" name="websave"/><br>
	localsave: <input type="text" name="localsave"/><br>
	savedir: <input type="text" name="savedir"/><br>
	modes: <input type="text" name="modes"/><br>
	<input type="submit"/>
</form>

OCR4all UI mode

This setting enables or disables OCR4all UI mode.

<value>=[enable|disable]

This setting allows displaying and/or hiding certain UI elements when LAREX is used in combination with OCR4all.

enable: enable OCR4all UI mode

disable: disable OCR4all UI mode [default]

e.g. ocr4all:enable

Related Publications:

Reul, Christian; Springmann, Uwe; Puppe, Frank: LAREX – A semi-automatic open-source Tool for Layout Analysis and Region Extraction on Early Printed Books. In Proceedings of the 2nd International Conference on Digital Access to Textual Cultural Heritage (2017). ACM. Draft available at arXiv.

Reul, Christian; Dittrich, Marco; Gruner, Martin: Case Study of a highly automated Layout Analysis and OCR of an incunabulum: ‘Der Heiligen Leben’ (1488). In Proceedings of the 2nd International Conference on Digital Access to Textual Cultural Heritage (2017). ACM. Draft available at arXiv.

Comments
  • cannot build LAREX on macOS

    cannot build LAREX on macOS

    Hi, LAREX looks perfect for our digital humanities project here at the University of Georgia (USA) but I am not very knowledgeable about web application deployment. When I follow the macOS installation directions on Big Sur (11.4) the maven build fails with an error about API incompatibility. I'll be grateful for any suggestions about how to proceed! -john

    [INFO] --------------------------< de.uniwue:Larex >--------------------------- [INFO] Building Larex 0.5.0 [INFO] --------------------------------[ war ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ Larex --- [INFO] Deleting /Users/john/projects/quechua/LAREX/target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ Larex --- [WARNING] Using platform encoding (ISO8859-1 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory /Users/john/projects/quechua/LAREX/src/main/resources [INFO] [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ Larex --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 61 source files to /Users/john/projects/quechua/LAREX/target/classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ Larex --- [WARNING] Using platform encoding (ISO8859-1 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory /Users/john/projects/quechua/LAREX/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ Larex --- [INFO] No sources to compile [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ Larex --- [INFO] No tests to run. [INFO] [INFO] --- maven-war-plugin:2.2:war (default-war) @ Larex --- [WARNING] Error injecting: org.apache.maven.plugin.war.WarMojo com.google.inject.ProvisionException: Unable to provision, see the following errors:

    1. Error injecting constructor, java.lang.ExceptionInInitializerError: Cannot access defaults field of Properties at org.apache.maven.plugin.war.WarMojo.(Unknown Source) while locating org.apache.maven.plugin.war.WarMojo

    org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project Larex: Execution default-war of goal org.apache.maven.plugins:maven-war-plugin:2.2:war failed: Unable to load the mojo 'war' in the plugin 'org.apache.maven.plugins:maven-war-plugin:2.2' due to an API incompatibility: org.codehaus.plexus.component.repository.exception.ComponentLookupException: Cannot access defaults field of Properties

    realm = plugin>org.apache.maven.plugins:maven-war-plugin:2.2 strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy urls[0] = file:/Users/john/.m2/repository/org/apache/maven/plugins/maven-war-plugin/2.2/maven-war-plugin-2.2.jar urls[1] = file:/Users/john/.m2/repository/org/apache/maven/reporting/maven-reporting-api/2.0.6/maven-reporting-api-2.0.6.jar urls[2] = file:/Users/john/.m2/repository/org/apache/maven/doxia/doxia-sink-api/1.0-alpha-7/doxia-sink-api-1.0-alpha-7.jar urls[3] = file:/Users/john/.m2/repository/commons-cli/commons-cli/1.0/commons-cli-1.0.jar urls[4] = file:/Users/john/.m2/repository/org/codehaus/plexus/plexus-interactivity-api/1.0-alpha-4/plexus-interactivity-api-1.0-alpha-4.jar urls[5] = file:/Users/john/.m2/repository/org/apache/maven/maven-archiver/2.5/maven-archiver-2.5.jar urls[6] = file:/Users/john/.m2/repository/org/codehaus/plexus/plexus-io/2.0.2/plexus-io-2.0.2.jar urls[7] = file:/Users/john/.m2/repository/org/codehaus/plexus/plexus-archiver/2.1/plexus-archiver-2.1.jar urls[8] = file:/Users/john/.m2/repository/org/codehaus/plexus/plexus-interpolation/1.15/plexus-interpolation-1.15.jar urls[9] = file:/Users/john/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar urls[10] = file:/Users/john/.m2/repository/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar urls[11] = file:/Users/john/.m2/repository/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar urls[12] = file:/Users/john/.m2/repository/org/codehaus/plexus/plexus-utils/3.0/plexus-utils-3.0.jar urls[13] = file:/Users/john/.m2/repository/org/apache/maven/shared/maven-filtering/1.0-beta-2/maven-filtering-1.0-beta-2.jar Number of foreign imports: 1 import: Entry[import from realm ClassRealm[maven.api, parent: null]]

    opened by jthale76 16
  • Unclear: localsave proper configuration

    Unclear: localsave proper configuration

    Issue description

    In my interpretation of the regular standalone LAREX-setup, it is possible to configure a local path for storing the data by adjusting the larex.config. Thus, having localsave set to bookpath to do so, but no PAGE is actually written at the specified location, it wants to be downloaded if the SAVE RESULT- Button is pressed.

    Steps to reproduce the issue

    1. Edit larex.config, set bookpath to a local path alike bookpath:/home/hartwig/Dokumente/larex-testdaten/books
    2. Start Webapp
    3. Confirm data is loaded from configured bookpath: ok
    4. Do something, like correct some text, press Enter, see text goes green: ok
    5. Presse SAVE RESULT

    What's the expected result?

    • PAGE overwritten with latest changes

    What's the actual result?

    • LAREX wants to download file, original PAGE XML stays at it is

    Plattform

    • LAREX 0.5 (latest master)
    • Ubuntu 18.04 LTS
    • Tomcat 8.5.47
    • JDK 11
    • Firefox 89.0 / Chromium 91.0.4472.101
    opened by M3ssman 9
  • Feature/page orientation

    Feature/page orientation

    Larex now deskews images and regions according to the @orientation angle annotated. /PcGts/Page/@orientation is read from pageXML and is added to the PageAnnotations send to the client. The rotation of each region will be executed during controller.loadAnnotations() and rotated back on export. closes #173

    Type: Enhancement 
    opened by chaddy314 9
  • content of PageXML overwritten

    content of PageXML overwritten

    I have a problem that has repeatedly led to considerable data loss (and I have the impression that I have seen some Issue/discussion on that, so I apologize in advance):

    In a set of legacy PageXMLs some run through smoothly in v.0.6, other however get overwritten. Here is a diff of the first 7 resp. 8 lines. The file on the left is processed without problem, the file on the left is overwritten as soon as saved.

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>	      |	<?xml version="1.0"?>
    <PcGts xmlns="http://schema.primaresearch.org/PAGE/gts/pageco	<PcGts xmlns="http://schema.primaresearch.org/PAGE/gts/pageco
      <Metadata>							  <Metadata>
        <Creator/>						      |	    <Creator>User123</Creator>
        <Created>2022-01-19T20:02:07</Created>		      |	    <Created>2021-06-16T20:13:22</Created>
        <LastChange>1970-01-01T00:00:00</LastChange>	      |	    <LastChange>2021-06-16T20:13:22</LastChange>
        <Comments/>						      <
      </Metadata>							  </Metadata>
    
    

    Here is a file that gets overwritten when saved with the current OCR4all docker version: https://cloud.uni-halle.de/s/cgzRExPB0xPRP3I

    After saving the right file is reduced to the following:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>

    Do you happen to know how to avoid this behaviour?

    opened by alexander-winkler 7
  • more crashes when standalone with bookpath set

    more crashes when standalone with bookpath set

    I don't know how to approach this further myself. In addition to the problems reported in #160, when I do set a bookpath in larex.config, and merely copy the src/main/webapp/resources/books/Test directory into the applications server's home directory (since anything else would not work anyway), I still cannot use the application.

    The behaviour is the same on jetty9 and on tomcat8: I can open the Test book, but then a circle hourglass appears forever (and the browser consumes ever more memory).

    For what they're worth, I'll include the application servers' logs (minus timestamps).

    From jetty9:

    javax.servlet.ServletException: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.util.ConcurrentModificationException
    #011at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)
    #011at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    #011at org.eclipse.jetty.server.Server.handle(Server.java:502)
    #011at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370)
    #011at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267)
    #011at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
    #011at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
    #011at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
    #011at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
    #011at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
    #011at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
    #011at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
    #011at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
    #011at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
    #011at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
    #011at java.base/java.lang.Thread.run(Thread.java:834)
    Caused by:
    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.util.ConcurrentModificationException
    #011at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    #011at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:890)
    #011at javax.servlet.http.HttpServlet.service(HttpServlet.java:645)
    #011at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:875)
    #011at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
    #011at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:873)
    #011at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1623)
    #011at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:214)
    #011at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)
    #011at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
    #011at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    #011at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1602)
    #011at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540)
    #011at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
    #011at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
    #011at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    #011at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
    #011at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1701)
    #011at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
    #011at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345)
    #011at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
    #011at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)
    #011at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1668)
    #011at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
    #011at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247)
    #011at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
    #011at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:220)
    #011at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)
    #011at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    #011at org.eclipse.jetty.server.Server.handle(Server.java:502)
    #011at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370)
    #011at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267)
    #011at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
    #011at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
    #011at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
    #011at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
    #011at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
    #011at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
    #011at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
    #011at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
    #011at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
    #011at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
    #011at java.base/java.lang.Thread.run(Thread.java:834)
    Caused by:
    java.util.ConcurrentModificationException
    #011at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1134)
    #011at org.springframework.util.LinkedMultiValueMap.add(LinkedMultiValueMap.java:89)
    #011at org.springframework.web.accept.MappingMediaTypeFileExtensionResolver.addMapping(MappingMediaTypeFileExtensionResolver.java:80)
    #011at org.springframework.web.accept.AbstractMappingContentNegotiationStrategy.resolveMediaTypeKey(AbstractMappingContentNegotiationStrategy.java:121)
    #011at org.springframework.web.accept.AbstractMappingContentNegotiationStrategy.resolveMediaTypes(AbstractMappingContentNegotiationStrategy.java:102)
    #011at org.springframework.web.accept.ContentNegotiationManager.resolveMediaTypes(ContentNegotiationManager.java:124)
    #011at org.springframework.web.servlet.mvc.condition.ProducesRequestCondition.getAcceptedMediaTypes(ProducesRequestCondition.java:262)
    #011at org.springframework.web.servlet.mvc.condition.ProducesRequestCondition.getMatchingCondition(ProducesRequestCondition.java:199)
    #011at org.springframework.web.servlet.mvc.method.RequestMappingInfo.getMatchingCondition(RequestMappingInfo.java:222)
    #011at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getMatchingMapping(RequestMappingInfoHandlerMapping.java:93)
    #011at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getMatchingMapping(RequestMappingInfoHandlerMapping.java:57)
    #011at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.addMatchingMappings(AbstractHandlerMethodMapping.java:406)
    #011at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:373)
    #011at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:347)
    #011at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:62)
    #011at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:401)
    #011at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1231)
    #011at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1014)
    #011at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    #011at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:998)
    #011at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:890)
    #011at javax.servlet.http.HttpServlet.service(HttpServlet.java:645)
    #011at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:875)
    #011at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
    #011at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:873)
    #011at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1623)
    #011at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:214)
    #011at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)
    #011at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
    #011at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    #011at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1602)
    #011at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540)
    #011at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
    #011at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
    #011at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    #011at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
    #011at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1701)
    #011at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
    #011at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345)
    #011at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
    #011at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)
    #011at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1668)
    #011at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
    #011at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247)
    #011at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
    #011at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:220)
    #011at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)
    #011at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    #011at org.eclipse.jetty.server.Server.handle(Server.java:502)
    #011at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370)
    #011at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267)
    #011at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
    #011at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
    #011at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
    #011at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
    #011at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
    #011at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
    #011at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
    #011at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
    #011at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
    #011at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
    #011at java.base/java.lang.Thread.run(Thread.java:834)
    2020-02-24 15:11:26.647:INFO:oejsh.ContextHandler:Scanner-0: Stopped o.e.j.w.WebAppContext@5c44c582{books,/books,null,UNAVAILABLE}{/books}
    2020-02-24 15:11:26.961:INFO:oeja.AnnotationConfiguration:Scanner-0: Scanning elapsed time=0ms
    2020-02-24 15:11:27.034:INFO:oejshC.books:Scanner-0: Warning: No org.apache.tomcat.JarScanner set in ServletContext. Falling back to default JarScanner implementation.
    2020-02-24 15:11:27.826:INFO:oajs.TldScanner:Scanner-0: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
    2020-02-24 15:11:27.961:INFO:oejsh.ContextHandler:Scanner-0: Started o.e.j.w.WebAppContext@7b368fbb{books,/books,file:///var/lib/jetty9/webapps/books/,AVAILABLE}{/books}
    

    From tomcat8:

    INFORMATION [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.undeploy Undeploying context [/Larex]
    INFORMATION [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/var/lib/tomcat8/webapps/Larex.war]
    INFORMATION [localhost-startStop-2] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
    INFORMATION [localhost-startStop-2] org.springframework.web.context.ContextLoader.initWebApplicationContext Root WebApplicationContext: initialization started
    INFORMATION [localhost-startStop-2] org.springframework.web.context.ContextLoader.initWebApplicationContext Root WebApplicationContext initialized in 2014 ms
    INFORMATION [localhost-startStop-2] org.springframework.web.servlet.FrameworkServlet.initServletBean Initializing Servlet 'SpringDispatcher'
    SCHWERWIEGEND [localhost-startStop-2] org.springframework.web.servlet.FrameworkServlet.initServletBean Context initialization failed
     java.lang.IllegalStateException: Cannot load configuration class: de.uniwue.web.config.MvcConfiguration
    	at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:413)
    	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:253)
    	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:286)
    	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:130)
    	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:693)
    	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:530)
    	at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:696)
    	at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:662)
    	at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:710)
    	at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:587)
    	at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:526)
    	at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:169)
    	at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    	at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1144)
    	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1091)
    	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:983)
    	at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4956)
    	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5270)
    	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
    	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
    	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:980)
    	at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1852)
    	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    	at java.base/java.lang.Thread.run(Thread.java:834)
    Caused by: java.lang.IllegalStateException: Unable to load cache item
    	at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:79)
    	at org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34)
    	at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:130)
    	at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:315)
    	at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:569)
    	at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:416)
    	at org.springframework.context.annotation.ConfigurationClassEnhancer.createClass(ConfigurationClassEnhancer.java:137)
    	at org.springframework.context.annotation.ConfigurationClassEnhancer.enhance(ConfigurationClassEnhancer.java:109)
    	at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:402)
    	... 28 more
    Caused by: java.lang.UnsatisfiedLinkError: Native Library /tmp/tomcat8-tomcat8-tmp/opencv_openpnp6687510310539867733/nu/pattern/opencv/linux/x86_64/libopencv_java342.so already loaded in another classloader
    	at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2456)
    	at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684)
    	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2649)
    	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829)
    	at java.base/java.lang.System.loadLibrary(System.java:1870)
    	at nu.pattern.OpenCV$SharedLoader.<init>(OpenCV.java:192)
    	at nu.pattern.OpenCV$SharedLoader.<init>(OpenCV.java:187)
    	at nu.pattern.OpenCV$SharedLoader$Holder.<clinit>(OpenCV.java:228)
    	at nu.pattern.OpenCV$SharedLoader.getInstance(OpenCV.java:232)
    	at nu.pattern.OpenCV.loadShared(OpenCV.java:181)
    	at de.uniwue.web.config.MvcConfiguration.<clinit>(MvcConfiguration.java:29)
    	at java.base/java.lang.Class.forName0(Native Method)
    	at java.base/java.lang.Class.forName(Class.java:398)
    	at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:537)
    	at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:359)
    	at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:582)
    	at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:106)
    	at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:104)
    	at org.springframework.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54)
    	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    	at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61)
    	... 36 more
    
    INFORMATION [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/var/lib/tomcat8/webapps/Larex.war] has finished in [13,414] ms
    INFORMATION [localhost-startStop-3] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/var/lib/tomcat8/webapps/books]
    INFORMATION [localhost-startStop-3] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
    INFORMATION [localhost-startStop-3] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/var/lib/tomcat8/webapps/books] has finished in [1,276] ms
    INFORMATION [Thread-3] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access: this web application instance has been stopped already. Could not load [java.nio.file.LinkOption]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
     java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [java.nio.file.LinkOption]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
    	at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1384)
    	at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1372)
    	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1224)
    	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1185)
    	at nu.pattern.OpenCV$TemporaryDirectory.delete(OpenCV.java:148)
    	at nu.pattern.OpenCV$TemporaryDirectory.delete(OpenCV.java:173)
    	at nu.pattern.OpenCV$TemporaryDirectory$1.run(OpenCV.java:140)
    
    INFORMATION [Thread-4] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8081"]
    INFORMATION [Thread-4] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
    INFORMATION [Thread-4] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8081"]
    INFORMATION [Thread-4] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8081"]
    WARNUNG [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [/var/lib/tomcat8/common/classes], exists: [false], isDirectory: [false], canRead: [false]
    WARNUNG [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [/var/lib/tomcat8/common], exists: [false], isDirectory: [false], canRead: [false]
    WARNUNG [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [/usr/share/tomcat8/common/classes], exists: [false], isDirectory: [false], canRead: [false]
    WARNUNG [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [/usr/share/tomcat8/common], exists: [false], isDirectory: [false], canRead: [false]
    WARNUNG [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [/var/lib/tomcat8/server/classes], exists: [false], isDirectory: [false], canRead: [false]
    WARNUNG [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [/var/lib/tomcat8/server], exists: [false], isDirectory: [false], canRead: [false]
    WARNUNG [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [/usr/share/tomcat8/server/classes], exists: [false], isDirectory: [false], canRead: [false]
    WARNUNG [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [/usr/share/tomcat8/server], exists: [false], isDirectory: [false], canRead: [false]
    WARNUNG [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [/var/lib/tomcat8/shared/classes], exists: [false], isDirectory: [false], canRead: [false]
    WARNUNG [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [/var/lib/tomcat8/shared], exists: [false], isDirectory: [false], canRead: [false]
    WARNUNG [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [/usr/share/tomcat8/shared/classes], exists: [false], isDirectory: [false], canRead: [false]
    WARNUNG [main] org.apache.catalina.startup.ClassLoaderFactory.validateFile Problem with directory [/usr/share/tomcat8/shared], exists: [false], isDirectory: [false], canRead: [false]
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.5.39 (Ubuntu)
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Sep 9 2019 19:47:51 UTC
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         8.5.39.0
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            4.15.0-72-generic
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/lib/jvm/java-11-openjdk-amd64
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           11.0.5+10-post-Ubuntu-0ubuntu1.118.04
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Private Build
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /var/lib/tomcat8
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/share/tomcat8
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/var/lib/tomcat8/conf/logging.properties
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.awt.headless=true
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -XX:+UseConcMarkSweepGC
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/var/lib/tomcat8
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/share/tomcat8
    INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/tmp/tomcat8-tomcat8-tmp
    INFORMATION [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded APR based Apache Tomcat Native library [1.2.21] using APR version [1.6.3].
    INFORMATION [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
    INFORMATION [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
    INFORMATION [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1  11 Sep 2018]
    INFORMATION [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8081"]
    INFORMATION [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
    INFORMATION [main] org.apache.catalina.startup.Catalina.load Initialization processed in 712 ms
    INFORMATION [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
    INFORMATION [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.39 (Ubuntu)
    INFORMATION [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/var/lib/tomcat8/webapps/Larex.war]
    INFORMATION [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
    INFORMATION [localhost-startStop-1] org.springframework.web.context.ContextLoader.initWebApplicationContext Root WebApplicationContext: initialization started
    INFORMATION [localhost-startStop-1] org.springframework.web.context.ContextLoader.initWebApplicationContext Root WebApplicationContext initialized in 251 ms
    INFORMATION [localhost-startStop-1] org.springframework.web.servlet.FrameworkServlet.initServletBean Initializing Servlet 'SpringDispatcher'
    INFORMATION [localhost-startStop-1] org.springframework.web.servlet.FrameworkServlet.initServletBean Completed initialization in 1830 ms
    INFORMATION [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/var/lib/tomcat8/webapps/Larex.war] has finished in [5,042] ms
    INFORMATION [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/var/lib/tomcat8/webapps/ROOT]
    INFORMATION [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
    INFORMATION [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/var/lib/tomcat8/webapps/ROOT] has finished in [461] ms
    INFORMATION [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/var/lib/tomcat8/webapps/books]
    INFORMATION [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
    INFORMATION [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/var/lib/tomcat8/webapps/books] has finished in [331] ms
    INFORMATION [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8081"]
    INFORMATION [main] org.apache.catalina.startup.Catalina.start Server startup in 6080 ms
    
    Type: Bug 
    opened by bertsky 7
  • 500 (Internal Server Error) on Segmentation request

    500 (Internal Server Error) on Segmentation request

    The ajax call to "/segment" fails with a 500 error upon opening a newly uploaded book. The response header is:

    HTTP/1.1 500 Internal Server Error Server: Apache-Coyote/1.1 Content-Type: text/html;charset=UTF-8 Content-Language: pl-PL Content-Length: 4122 Date: Sat, 14 Jul 2018 10:21:53 GMT Connection: close.

    Previous requests (resize etc.) work fine and the error is being followed by another: "Uncaught TypeError: Cannot read property 'status' of undefined". Now, everything seems to be working just fine also with the test resource provided, so it may be effectively a server configuration or docker-related issue as I'm deploying Larex in a docker container.

    The book folder contains a dozen of ~200 kb .tif files each with an accompanying PAGE XML file (the latter don't seem to be loaded by default, though).

    request_header.txt request_payload.txt

    Type: Enhancement 
    opened by novacellus 7
  • Question: Howto create a new

    Question: Howto create a new "book"?

    After successfully compiling and running LAREX, I try to figure out how to add a new book to the LAREX Library. What I have tried so far is to create a new directory under LAREX/Larex/target/Larex/resources (i.e next to Test) and put some JPEG file into it. But it does not show up in the web app even after restarting the tomcat server. It would be great if @chreul could give me some hint. Thanks in advance.

    opened by wrznr 7
  • avoid automatically switching to ReadingOrder editing

    avoid automatically switching to ReadingOrder editing

    For some reason, whenever I finish some action in SEGMENTSRegions on a region imported from PAGE-XML – for example change the class – the UI will immediately switch over to SEGMENTSReading Order afterwards.

    This is annoying and elusive: I would understand it if the region did not have a position in ReadingOrder yet (as do newly created regions) in order to "fill the hole right away", but to summon this view when there is actually nothing to do feels strange.

    Is there anything I can do for mitigation? Can ReadingOrder editing be disabled complete (maybe in larex.config)?

    Type: Enhancement 
    opened by bertsky 6
  • Support loading external PageXML files

    Support loading external PageXML files

    Tesseract does a pretty good job at fully automatic segmentation. I was hoping I could do a first pass with that, via tesseract-recognize, and then fix the results by loading the file directly in LAREX.

    What I tried:

    1. Started a project with OCR4all as normal and performed preprocessing.
    2. Used tesseract-recognize on one of the images and put the output in OCR4all's processing directory.
    3. Tried launching LAREX (via the ground truth prediction menu).

    The problem is that LAREX doesn't seem to like the format produced by tesseract-recognize and gets stuck on the "loading" screen forever.

    I am happy to provide example files (via email preferably)

    opened by Baciccin 5
  • open other book symbol is gone

    open other book symbol is gone

    With current dev and staging, the "directory" symbol in the upper left navigation area is gone. It has been replaced (or shadowed?) with a pop-up menu for the page selection. The latter is redundant IMHO, because there is already a thumbnail preview-based navigation panel to the left for that. But the former is very important to quickly navigate from document to document (esp. if they are not as large as a book).

    bug-navigation-book

    opened by bertsky 5
  • describe bookpath layout, show informative error

    describe bookpath layout, show informative error

    When I configure a non-default bookpath as described by the documentation, I always get this:

    Ooopps!
    
    That should not have happened!
    
    It seems like the server has mixed something up.
    
    Error code: 500
    

    This does not help at all. The server's log then showed several null pointer exceptions, among them de.uniwue.web.io.FileDatabase.listBookFiles.

    Digging into that, I found that there is sufficient documentation on the expected directory structure in the sources. But I cannot browse that API documentation, and IMHO this particular piece of knowledge crucially belongs into the user documentation as well.

    Also, IIUC, a bookpath must always be a flat directory with certain file name patterns to separate pages but group annotations. This strikes me as overly restrictive. Perhaps this can be generalized to layouts like those we have in OCR-D – subdirectories for annotations, PAGE-XML's @imageFilename relative to the root directory of the book?

    So please,

    1. document the expected directory structure for bookpath in the README (or similar)
    2. catch the null pointer exception and give a meaningful error message
    3. [optionally] generalize expectation to non-flat directory structure
    opened by bertsky 5
  • Bump spring-webmvc from 5.1.0.RELEASE to 5.2.20.RELEASE

    Bump spring-webmvc from 5.1.0.RELEASE to 5.2.20.RELEASE

    Bumps spring-webmvc from 5.1.0.RELEASE to 5.2.20.RELEASE.

    Release notes

    Sourced from spring-webmvc's releases.

    v5.2.20.RELEASE

    :star: New Features

    • Restrict access to property paths on Class references #28262
    • Improve diagnostics in SpEL for large array creation #28257

    v5.2.19.RELEASE

    :star: New Features

    • Declare serialVersionUID on DefaultAopProxyFactory #27785
    • Use ByteArrayDecoder in DefaultClientResponse::createException #27667

    :lady_beetle: Bug Fixes

    • ProxyFactoryBean getObject called before setInterceptorNames, silently creating an invalid proxy [SPR-7582] #27817
    • Possible NPE in Spring MVC LogFormatUtils #27783
    • UndertowHeadersAdapter's remove() method violates Map contract #27593
    • Fix assertion failure messages in DefaultDataBuffer.checkIndex() #27577

    :notebook_with_decorative_cover: Documentation

    • Lazy annotation throws exception if non-required bean does not exist #27660
    • Incorrect Javadoc in [NamedParameter]JdbcOperations.queryForObject methods regarding exceptions #27581
    • DefaultResponseErrorHandler update javadoc comment #27571

    :hammer: Dependency Upgrades

    • Upgrade to Reactor Dysprosium-SR25 #27635
    • Upgrade to Log4j2 2.16.0 #27825

    v5.2.18.RELEASE

    :star: New Features

    • Enhance DefaultResponseErrorHandler to allow logging complete error response body #27558
    • DefaultMessageListenerContainer does not log an error/warning when consumer tasks have been rejected #27457

    :lady_beetle: Bug Fixes

    • Performance impact of con.getContentLengthLong() in AbstractFileResolvingResource.isReadable() downloading huge jars to check component length #27549
    • Performance impact of ResourceUrlEncodingFilter on HttpServletResponse#encodeURL #27548
    • Avoid duplicate JCacheOperationSource bean registration in #27547
    • Non-escaped closing curly brace in RegEx results in initialization error on Android #27502
    • Proxy generation with Java 17 fails with "Cannot invoke "Object.getClass()" because "cause" is null" #27498
    • ConcurrentReferenceHashMap's entrySet violates the Map contract #27455

    :hammer: Dependency Upgrades

    • Upgrade to Reactor Dysprosium-SR24 #27526

    v5.2.17.RELEASE

    ... (truncated)

    Commits
    • cfa701b Release v5.2.20.RELEASE
    • 996f701 Refine PropertyDescriptor filtering
    • 90cfde9 Improve diagnostics in SpEL for large array creation
    • 94f52bc Upgrade to Artifactory Resource 0.0.17
    • d4478ba Upgrade Java versions in CI image
    • 136e6db Upgrade Ubuntu version in CI images
    • 8f1f683 Upgrade Java versions in CI image
    • ce2367a Upgrade to Log4j2 2.17.1
    • acf7823 Next development version (v5.2.20.BUILD-SNAPSHOT)
    • 1a03ffe Upgrade to Log4j2 2.16.0
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump spring-web from 5.1.0.RELEASE to 6.0.0

    Bump spring-web from 5.1.0.RELEASE to 6.0.0

    Bumps spring-web from 5.1.0.RELEASE to 6.0.0.

    Release notes

    Sourced from spring-web's releases.

    v6.0.0

    See What's New in Spring Framework 6.x and Upgrading to Spring Framework 6.x for upgrade instructions and details of new features.

    :star: New Features

    • Avoid direct URL construction and URL equality checks #29486
    • Simplify creating RFC 7807 responses from functional endpoints #29462
    • Allow test classes to provide runtime hints via declarative mechanisms #29455

    :notebook_with_decorative_cover: Documentation

    • Align javadoc of DefaultParameterNameDiscoverer with its behavior #29494
    • Document AOT support in the TestContext framework #29482
    • Document Ahead of Time processing in the reference guide #29350

    :hammer: Dependency Upgrades

    • Upgrade to Reactor 2022.0.0 #29465

    :heart: Contributors

    Thank you to all the contributors who worked on this release:

    @​ophiuhus and @​wilkinsona

    v6.0.0-RC4

    :star: New Features

    • Introduce DataFieldMaxValueIncrementer for SQL Server sequences #29447
    • Introduce findAllAnnotationsOnBean variant on ListableBeanFactory #29446
    • Introduce support for Jakarta WebSocket 2.1 #29436
    • Allow @ControllerAdvice in WebFlux to handle exceptions before a handler is selected #22991

    :lady_beetle: Bug Fixes

    • Bean with unresolved generics do not use fallback algorithms with AOT #29454
    • TomcatRequestUpgradeStrategy is not compatible with Tomcat 10.1 #29434
    • Autowiring of a generic type produced by a factory bean fails after AOT processing #29385

    :notebook_with_decorative_cover: Documentation

    • Reference PDF containing full docs not available #28451

    :hammer: Dependency Upgrades

    • Revisit Servlet API baseline: Servlet 6.0 in the build, Servlet 5.0 compatibility at runtime #29435
    • Upgrade to Context Propagation 1.0.0 #29442
    • Upgrade to Jackson 2.14.0 #29351
    • Upgrade to Micrometer 1.10.0 #29441

    ... (truncated)

    Commits
    • 5a30a43 Release v6.0.0
    • 42856ba Add milestone repo for optional Netty 5 support
    • 9be6cea Polishing deprecated methods
    • 37b4391 Align javadoc of DefaultParameterNameDiscoverer with its behavior
    • 09a58a5 Polish
    • 10f4ad1 Assert fixed in DefaultErrorResponseBuilder
    • 9457ed3 Document AOT support in the TestContext framework
    • 074ec97 Fix section formatting in the testing chapter
    • 9ede4af Revert "Ignore HttpComponents Javadoc"
    • bfc1251 Merge branch '5.3.x'
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • "Load Result" with parsererror

    Hello I'm running the OCR4all Docker container on my Ubuntu 20.04. It works quite well but there is an error, when I tried to load a PageXML in LAREX.

    When I have a page in the LAREX editor, which went through every OCR4all steps till recognition, I wanted to load an already existing PageXML of this page - to check if I could load a ground truth text for training - I get the error message: "Couldn't retrieve annotations from file."

    And in the console it says "request:/file/upload/annotations - fail 'parsererror'" which is indicated by Larex/resources/js/viewer/communicator.js, Line 17 - failed Post-request. The writing permissions of the data-folder on the server should be good (777). The PageXML file is v2013-07-15.

    Any hint for this problem? Or any hint how to load ground truth from existing PageXMLs to train a new model?

    opened by l0rn0r 1
  • Bump jackson-databind from 2.13.0 to 2.13.4.1

    Bump jackson-databind from 2.13.0 to 2.13.4.1

    Bumps jackson-databind from 2.13.0 to 2.13.4.1.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Feature request: Region highlighting - on/off-Button

    Feature request: Region highlighting - on/off-Button

    Would it be possible to integrate an option - maybe an "on"/"off"-button - that makes segments appear permanently colored / filled, like when you hover the mouse cursor over them?

    This would make it much quicker and easier to distinguish marked regions. Especially when you have many different region types on a page, it's not always easy to distinguish them if you only have a thin line at the edge of a region.

    Type: Enhancement Type: Feature Priority: Medium 
    opened by L-FL 0
  • polygon tool: double-click too sensitive

    polygon tool: double-click too sensitive

    One of the most used tools is probably the polygon drawer. However, there are some practical nuisances here IMO:

    • there is no way to "undo" the last vertex
    • there is no way to cancel the final closure
    • the time and distance for the double click rule are way too sensitive

    (In effect, I often have to redo long polgons simply because LAREX thought the next vertex was the final one.)

    Type: Enhancement Status: Confirmed Priority: Medium 
    opened by bertsky 0
Releases(0.7.4)
  • 0.7.4(Apr 12, 2022)

  • 0.7.3(Apr 4, 2022)

    Bugfixes

    • Only suppress default context menu for viewer modes which need it, therefore allowing e.g. browser based dictionary correction in the text viewer
    Source code(tar.gz)
    Source code(zip)
  • 0.7.2(Mar 31, 2022)

  • 0.7.1(Mar 3, 2022)

  • 0.7.0(Mar 1, 2022)

    Features

    • adds interactive confidence view based on confidences in PAGE XML
    • adds ability to view and select alternative glyphs (if present in PAGE XML)
    • adds simplification of polygons (regions & lines)
    • minimizes JSON files to speed up loading
    • adds provisional cache busting mechanism to avoid cache related bugs
    • increases VK button text visibility

    Bugfixes

    • fixes missing textline orientation
    • fixes OCR4all interface
    • sets Andrond Scriptor Web as default for all texts (also for e. g. diff view)
    • explicitly sets maven war plugin version to avoid build issues

    Other

    • updates several dependencies with minor security vulnerabilities
    Source code(tar.gz)
    Source code(zip)
  • 0.7-RC2(Feb 7, 2022)

    Features

    • allows polygon simplification on lines as well
    • add shortcut for polygon simplification

    Bugs

    • fixes regression regarding saving annotations with Glyph elements which was introduced in the last release candidate
    • fixes bug which didn't allow to use LOAD RESULT
    • fixes .property example file
    • minor refactoring and removal of unused code
    • fixes syncing of textline content
    • fixes a bug which allowed creating polygons with negative coordinate points

    Other

    • updates several dependencies with minor security vulnerabilities
    Source code(tar.gz)
    Source code(zip)
  • 0.7-RC1(Nov 23, 2021)

    Features

    • adds interactive confidence view based on confidences in PAGE XML files
    • adds ability to view and select alternative glyphs (if present in PAGE XML)
    • adds simplification of polygons
    • minimizes JSON files to speed up loading
    • adds provisional cache busting mechanism to avoid cache related bugs

    Bugfix

    • fixes missing textline orientation
    • fixes OCR4all interface
    • sets Andrond Scriptor Web as default for all texts (also for e. g. diff view)
    • explicitly set maven war plugin version to avoid build issues
    Source code(tar.gz)
    Source code(zip)
  • 0.6.0(Sep 6, 2021)

    Features

    Major

    • Adds Diff View to ease filtering and comparing differences between recognition and ground truth text
    • Completely refactors PAGE XML reading and writing so that the input annotation isn't discarded on saving but instead merged with the annotation in LAREX (when possible)
    • Allows directly opening OCR-D workspaces by parsing the associated METS file
    • Library UI overhauled to leverage the above mentioned implementation (Library View now also uses the direct request interface which was completely overhauled as well)
    • Allows displaying / editing images and segmentation according to the orientation set in the PAGE XML files
    • Adds displaying baselines
    • Adds basic metadata editing (Creator, Comments, ...)
    • Adds basic development enviroment
    • Adds visibility toggle for TextLine polygons and baselines

    Minor

    • Adds fullscreen mode
    • Updates OpenCV to v4.3.0-2
    • Updates PaperJS to 0.12.15
    • Updates Prima-Core-Libs to latest Git build
    • Replaces custom config file with .properties file
    • Refactors backend models (Polygons, Elements, ...)
    • Extracts widely used code to functions and methods
    • Outputs pretty printed XML files
    • Adds more concrete messages to some error messages

    Bugfixes

    • Fixes bug which caused an error on saving when a TextLine is missing from the Region Order
    • TextLines are now correctly removed in the frontend when TextRegion (or subtype) is changed to a region type which doesn't allow TextLines
    • Now correctly uses XML files in savedir when loading annotations (thanks to @Witiko)
    • Increased session timeouts
    • Minor JS bugfixes
    Source code(tar.gz)
    Source code(zip)
  • 0.6-RC1(Jul 28, 2021)

    Features

    Major

    • Adds Diff View to ease filtering and comparing differences between recognition and ground truth text
    • Completely refactors PAGE XML reading and writing so that the input annotation isn't discarded on saving but instead merged with the annotation in LAREX (when possible)
    • Allows directly opening OCR-D workspaces by parsing the associated METS file
    • Library UI overhauled to leverage the above mentioned implementation (Library View now also uses the direct request interface which was completely overhauled as well)
    • Allows displaying / editing images and segmentation according to the orientation set in the PAGE XML files
    • Adds displaying baselines
    • Adds basic metadata editing (Creator, Comments, ...)
    • Adds basic development enviroment
    • Adds visibility toggle for TextLine polygons and baselines

    Minor

    • Adds fullscreen mode
    • Updates OpenCV to v4.3.0-2
    • Updates PaperJS to 0.12.15
    • Updates Prima-Core-Libs to latest Git build
    • Replaces custom config file with .properties file
    • Refactors backend models (Polygons, Elements, ...)
    • Extracts widely used code to functions and methods
    • Outputs pretty printed XML files
    • Adds more concrete messages to some error messages

    Bugfixes

    • Fixes bug which caused an error on saving when a TextLine is missing from the Region Order
    • TextLines are now correctly removed in the frontend when TextRegion (or subtype) is changed to a region type which doesn't allow TextLines
    • Now correctly uses XML files in savedir when loading annotations (thanks to @Witiko)
    • Increased session timeouts
    • Minor JS bugfixes
    Source code(tar.gz)
    Source code(zip)
  • 0.5.0(Nov 7, 2020)

    Features

    • Added Batch Processing capabilities (Segmentation, Reading Order, Export)
    • Added possibility to visually hide existing segmentation
    • Added PAGE XML 2019 as default schema version

    Bugfixes

    • Fixed bug which made it impossible to load certain TIFF images
    • LAREX won't be stuck when a local XML file is invalid anymore and lets the user see/edit the page instead
    • Fixed a bug where users couldn't manually add lines to TextRegion elements without a specific subtype
    • Fixed a bug which caused a crash during exporting annotations to PAGE XML files when no reading order for text lines existed
    • Updated prima-core-libs version number
    • Fixed minor GUI issues and inconsistencies
    • Pages with empty annotations are now loaded correctly
    Source code(tar.gz)
    Source code(zip)
  • 0.5-RC4(Nov 6, 2020)

    Bugfixes

    • Pages with empty annotations are now loaded correctly
    • LAREX now collects local page annotations prior to running batch processing
    • Various other fixes related to batch processing
    Source code(tar.gz)
    Source code(zip)
  • 0.5-RC3(Oct 21, 2020)

    Bugfixes

    • Fixes a bug where users couldn't manually add lines to TextRegion elements without a specific subtype
    • Fixes a bug which caused a crash during exporting annotations to PAGE XML files when no reading order for text lines existed
    • Updated prima-core-libs version number
    Source code(tar.gz)
    Source code(zip)
  • 0.5-RC2(Oct 18, 2020)

  • 0.5-RC1(Oct 18, 2020)

    Features

    • Added Batch Processing (Segmentation, Reading Order, Export)
    • Added possibility to visually hide existing segmentation
    • Added PAGE XML 2019 as default schema version

    Bugfixes

    • TIFF images are now correctly loaded
    • LAREX won't be stuck when a local XML file is invalid anymore and lets the user see/edit the page
    Source code(tar.gz)
    Source code(zip)
  • 0.4.0(Aug 5, 2020)

    Features

    • Added subtraction rectangle/polygon for segments and textlines
    • Added move mode for segments and textlines
    • Overhauled page dropdown and added e.g. search functionality
    • Added keyboard shortcut info modal
    • Added possibility to discard ground truth with keyboard shortcut (Alt + D)
    • The reading order info section can now be completely disabled from automatically opening
    • Page Up and Page Down shortcuts added for navigating to the previous/next page
    • Added option to disable reading order info panel
    • Segmentation is now undoable
    • marginalia and page_number were removed from the default regions

    Bugfixes

    • Changed unintuitive "textline fade" shortcut from Shift to Alt
    • The reading order info section won't be triggered on changes which don't affect the reading order anymore
    • Actually load existing annotations when the according button is clicked
    • TextRegions without a subtype can now be imported, labeled and exported
    • marginalia and page_number no longer reappear in the sidebar on pange change after deleting them
    Source code(tar.gz)
    Source code(zip)
  • 0.3.1(May 27, 2020)

  • 0.3.0(May 27, 2020)

    Features

    • Different image types (binary, greyscale, despeckled) can now be directly selected within LAREX
    • LAREX now provides a small selection of preconfigured virtual keyboards
    • Adds page selection dropdown to allow easier navigation in large projects
    • Adds OCR4all UI mode which hides UI elements which aren't needed for usage in conjunction with OCR4all
    • Adds textline selection and deselection via the mouse cursor during Ground Truth Production

    Bugfixes

    • Last selected image type (bin, grey, …) will now be remembered on page change
    • Fixes UnknownRegion related bug described in #175
    • Fixes various typos and faulty tooltips
    • Includes updated prima-core-libs to fix various bugs during PAGE XML reading and writing
    • The last selected mode of the Text Viewer will now be correctly remembered on page change
    • Textlines now have a minimum width to selection problems when the recognized text is empty or only consists out of very few characters
    Source code(tar.gz)
    Source code(zip)
  • 0.3-RC3(May 27, 2020)

  • 0.3-RC2(May 19, 2020)

    Second pre-release for LAREX v0.3.

    • Adds basic batch segmentation
    • Now remembers last selected image type (bin, grey, …) on page change
    • Fixes UnknownRegion related bug described in #175
    • Fixes various typos and faulty tooltips
    Source code(tar.gz)
    Source code(zip)
Owner
An Open Source Tool Providing a Comprehensive But Easy to Use (Semi-)Automatic OCR Workflow for Historical Printings
null
Page to PAGE Layout Analysis Tool

P2PaLA Page to PAGE Layout Analysis (P2PaLA) is a toolkit for Document Layout Analysis based on Neural Networks. ?? Try our new DEMO for online baseli

Lorenzo Quirós Díaz 180 Nov 24, 2022
Deep learning based page layout analysis

Deep Learning Based Page Layout Analyze This is a Python implementaion of page layout analyze tool. The goal of page layout analyze is to segment page

null 186 Dec 29, 2022
Document Layout Analysis Projects

Layout_Analysis Introduction This is an implementation of RLSA and X-Y Cut with OpenCV Dependencies OpenCV 3.0+ How to use Compile with g++ : g++ -std

null 22 Dec 8, 2022
A simple document layout analysis using Python-OpenCV

Run the application: python main.py *Note: For first time running the application, create a folder named "output". The application is a simple documen

Roinand Aguila 109 Dec 12, 2022
ocroseg - This is a deep learning model for page layout analysis / segmentation.

ocroseg This is a deep learning model for page layout analysis / segmentation. There are many different ways in which you can train and run it, but by

NVIDIA Research Projects 71 Dec 6, 2022
a deep learning model for page layout analysis / segmentation.

OCR Segmentation a deep learning model for page layout analysis / segmentation. dependencies tensorflow1.8 python3 dataset: uw3-framed-lines-degraded-

null 99 Dec 12, 2022
Document Layout Analysis

Eynollah Document Layout Analysis Introduction This tool performs document layout analysis (segmentation) from image data and returns the results as P

QURATOR-SPK 198 Dec 29, 2022
CVPR 2021 Oral paper "LED2-Net: Monocular 360˚ Layout Estimation via Differentiable Depth Rendering" official PyTorch implementation.

LED2-Net This is PyTorch implementation of our CVPR 2021 Oral paper "LED2-Net: Monocular 360˚ Layout Estimation via Differentiable Depth Rendering". Y

Fu-En Wang 83 Jan 4, 2023
Scene text detection and recognition based on Extremal Region(ER)

Scene text recognition A real-time scene text recognition algorithm. Our system is able to recognize text in unconstrain background. This algorithm is

HSIEH, YI CHIA 155 Dec 6, 2022
Multi-Oriented Scene Text Detection via Corner Localization and Region Segmentation

This is the official implementation of "Multi-Oriented Scene Text Detection via Corner Localization and Region Segmentation". For more details, please

Pengyuan Lyu 309 Dec 6, 2022
CellProfiler is a open-source application for biological image analysis

CellProfiler is a free open-source software designed to enable biologists without training in computer vision or programming to quantitatively measure phenotypes from thousands of images automatically.

CellProfiler 732 Dec 23, 2022
Corner-based Region Proposal Network

Corner-based Region Proposal Network CRPN is a two-stage detection framework for multi-oriented scene text. It employs corners to estimate the possibl

xhzdeng 140 Nov 4, 2022
caffe re-implementation of R2CNN: Rotational Region CNN for Orientation Robust Scene Text Detection

R2CNN: Rotational Region CNN for Orientation Robust Scene Text Detection Abstract This is a caffe re-implementation of R2CNN: Rotational Region CNN fo

candler 80 Dec 28, 2021
A novel region proposal network for more general object detection ( including scene text detection ).

DeRPN: Taking a further step toward more general object detection DeRPN is a novel region proposal network which concentrates on improving the adaptiv

Deep Learning and Vision Computing Lab, SCUT 151 Dec 12, 2022
Rotational region detection based on Faster-RCNN.

R2CNN_Faster_RCNN_Tensorflow Abstract This is a tensorflow re-implementation of R2CNN: Rotational Region CNN for Orientation Robust Scene Text Detecti

UCAS-Det 581 Nov 22, 2022
Official implementation of Character Region Awareness for Text Detection (CRAFT)

CRAFT: Character-Region Awareness For Text detection Official Pytorch implementation of CRAFT text detector | Paper | Pretrained Model | Supplementary

Clova AI Research 2.5k Jan 3, 2023
CRAFT-Pyotorch:Character Region Awareness for Text Detection Reimplementation for Pytorch

CRAFT-Reimplementation Note:If you have any problems, please comment. Or you can join us weChat group. The QR code will update in issues #49 . Reimple

null 453 Dec 28, 2022
Table Extraction Tool

Tree Structure - Table Extraction Fonduer has been successfully extended to perform information extraction from richly formatted data such as tables.

HazyResearch 88 Jun 2, 2022