mirror of
https://github.com/mikegerber/ocrd_calamari.git
synced 2025-06-09 11:49:53 +02:00
Merge branch 'master' into image-features
This commit is contained in:
commit
c0902cdef5
12 changed files with 385 additions and 105 deletions
|
@ -2,6 +2,8 @@ import os
|
|||
import shutil
|
||||
import subprocess
|
||||
import urllib.request
|
||||
from lxml import etree
|
||||
from glob import glob
|
||||
|
||||
import pytest
|
||||
import logging
|
||||
|
@ -10,9 +12,14 @@ from ocrd.resolver import Resolver
|
|||
from ocrd_calamari import CalamariRecognize
|
||||
from .base import assets
|
||||
|
||||
METS_KANT = assets.url_of('kant_aufklaerung_1784-page-block-line-word_glyph/data/mets.xml')
|
||||
CHECKPOINT = os.path.join(os.getcwd(), 'gt4histocr-calamari/*.ckpt.json')
|
||||
METS_KANT = assets.url_of('kant_aufklaerung_1784-page-region-line-word_glyph/data/mets.xml')
|
||||
WORKSPACE_DIR = '/tmp/test-ocrd-calamari'
|
||||
CHECKPOINT_DIR = os.path.join(os.getcwd(), 'gt4histocr-calamari1')
|
||||
CHECKPOINT = os.path.join(CHECKPOINT_DIR, '*.ckpt.json')
|
||||
|
||||
# Because XML namespace versions are so much fun, we not only use one, we use TWO!
|
||||
NSMAP = { "pc": "http://schema.primaresearch.org/PAGE/gts/pagecontent/2019-07-15" }
|
||||
NSMAP_GT = { "pc": "http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15" }
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
@ -32,10 +39,6 @@ def workspace():
|
|||
"https://github.com/OCR-D/assets/raw/master/data/kant_aufklaerung_1784/data/OCR-D-IMG/" + f,
|
||||
os.path.join(WORKSPACE_DIR, 'OCR-D-IMG', f))
|
||||
|
||||
return workspace
|
||||
|
||||
|
||||
def test_recognize(workspace):
|
||||
# The binarization options I have are:
|
||||
#
|
||||
# a. ocrd_kraken which tries to install cltsm, whose installation is borken on my machine (protobuf)
|
||||
|
@ -48,17 +51,49 @@ def test_recognize(workspace):
|
|||
ff = os.path.join(WORKSPACE_DIR, 'OCR-D-IMG', f)
|
||||
subprocess.call(['convert', ff, '-threshold', '50%', ff])
|
||||
|
||||
# XXX Should remove GT text to really test this
|
||||
# Remove GT Words and TextEquivs, to not accidently check GT text instead of the OCR text
|
||||
# XXX Review data again
|
||||
# XXX Make this more robust against namespace version changes
|
||||
for of in workspace.mets.find_files(fileGrp="OCR-D-GT-SEG-LINE"):
|
||||
workspace.download_file(of)
|
||||
for to_remove in ["//pc:Word", "//pc:TextEquiv"]:
|
||||
for ff in glob(os.path.join(WORKSPACE_DIR, "OCR-D-GT-SEG-LINE", "*")):
|
||||
tree = etree.parse(ff)
|
||||
for e in tree.xpath(to_remove, namespaces=NSMAP_GT):
|
||||
e.getparent().remove(e)
|
||||
tree.write(ff, xml_declaration=True, encoding="utf-8")
|
||||
|
||||
return workspace
|
||||
|
||||
|
||||
def test_recognize(workspace):
|
||||
CalamariRecognize(
|
||||
workspace,
|
||||
input_file_grp="OCR-D-GT-SEG-LINE",
|
||||
output_file_grp="OCR-D-OCR-CALAMARI",
|
||||
parameter={'checkpoint': CHECKPOINT}
|
||||
parameter={
|
||||
"checkpoint": CHECKPOINT,
|
||||
}
|
||||
).process()
|
||||
workspace.save_mets()
|
||||
|
||||
page1 = os.path.join(workspace.directory, 'OCR-D-OCR-CALAMARI/OCR-D-OCR-CALAMARI_0001.xml')
|
||||
page1 = os.path.join(workspace.directory, "OCR-D-OCR-CALAMARI/OCR-D-OCR-CALAMARI_0001.xml")
|
||||
assert os.path.exists(page1)
|
||||
with open(page1, "r", encoding="utf-8") as f:
|
||||
assert "verſchuldeten" in f.read()
|
||||
|
||||
def test_recognize_with_checkpoint_dir(workspace):
|
||||
CalamariRecognize(
|
||||
workspace,
|
||||
input_file_grp="OCR-D-GT-SEG-LINE",
|
||||
output_file_grp="OCR-D-OCR-CALAMARI",
|
||||
parameter={
|
||||
"checkpoint_dir": CHECKPOINT_DIR,
|
||||
}
|
||||
).process()
|
||||
workspace.save_mets()
|
||||
|
||||
page1 = os.path.join(workspace.directory, "OCR-D-OCR-CALAMARI/OCR-D-OCR-CALAMARI_0001.xml")
|
||||
assert os.path.exists(page1)
|
||||
with open(page1, 'r', encoding='utf-8') as f:
|
||||
assert 'verſchuldeten' in f.read()
|
||||
|
@ -75,3 +110,61 @@ def test_recognize_should_warn_if_given_rgb_image_and_single_channel_model(works
|
|||
|
||||
interesting_log_messages = [t[2] for t in caplog.record_tuples if "Using raw image" in t[2]]
|
||||
assert len(interesting_log_messages) > 10 # For every line!
|
||||
with open(page1, "r", encoding="utf-8") as f:
|
||||
assert "verſchuldeten" in f.read()
|
||||
|
||||
|
||||
def test_word_segmentation(workspace):
|
||||
CalamariRecognize(
|
||||
workspace,
|
||||
input_file_grp="OCR-D-GT-SEG-LINE",
|
||||
output_file_grp="OCR-D-OCR-CALAMARI",
|
||||
parameter={
|
||||
"checkpoint": CHECKPOINT,
|
||||
"textequiv_level": "word", # Note that we're going down to word level here
|
||||
}
|
||||
).process()
|
||||
workspace.save_mets()
|
||||
|
||||
page1 = os.path.join(workspace.directory, "OCR-D-OCR-CALAMARI/OCR-D-OCR-CALAMARI_0001.xml")
|
||||
assert os.path.exists(page1)
|
||||
tree = etree.parse(page1)
|
||||
|
||||
# The result should contain a TextLine that contains the text "December"
|
||||
line = tree.xpath(".//pc:TextLine[pc:TextEquiv/pc:Unicode[contains(text(),'December')]]", namespaces=NSMAP)[0]
|
||||
assert line
|
||||
|
||||
# The textline should a. contain multiple words and b. these should concatenate fine to produce the same line text
|
||||
words = line.xpath(".//pc:Word", namespaces=NSMAP)
|
||||
assert len(words) >= 2
|
||||
words_text = " ".join(word.xpath("pc:TextEquiv/pc:Unicode", namespaces=NSMAP)[0].text for word in words)
|
||||
line_text = line.xpath("pc:TextEquiv/pc:Unicode", namespaces=NSMAP)[0].text
|
||||
assert words_text == line_text
|
||||
|
||||
# For extra measure, check that we're not seeing any glyphs, as we asked for textequiv_level == "word"
|
||||
glyphs = tree.xpath("//pc:Glyph", namespaces=NSMAP)
|
||||
assert len(glyphs) == 0
|
||||
|
||||
|
||||
def test_glyphs(workspace):
|
||||
CalamariRecognize(
|
||||
workspace,
|
||||
input_file_grp="OCR-D-GT-SEG-LINE",
|
||||
output_file_grp="OCR-D-OCR-CALAMARI",
|
||||
parameter={
|
||||
"checkpoint": CHECKPOINT,
|
||||
"textequiv_level": "glyph", # Note that we're going down to glyph level here
|
||||
}
|
||||
).process()
|
||||
workspace.save_mets()
|
||||
|
||||
page1 = os.path.join(workspace.directory, "OCR-D-OCR-CALAMARI/OCR-D-OCR-CALAMARI_0001.xml")
|
||||
assert os.path.exists(page1)
|
||||
tree = etree.parse(page1)
|
||||
|
||||
# The result should contain a lot of glyphs
|
||||
glyphs = tree.xpath("//pc:Glyph", namespaces=NSMAP)
|
||||
assert len(glyphs) >= 100
|
||||
|
||||
|
||||
# vim:tw=120:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue