refactoring

This commit is contained in:
Matthias Bisping 2022-04-04 15:48:15 +02:00
parent 1b1f1aafef
commit 6a6fc19958

View File

@ -1,7 +1,9 @@
from operator import itemgetter, attrgetter
import numpy as np
import pytest
from fpdf import fpdf
from funcy import compose
from funcy import compose, omit
from pdf2image import pdf2image
from image_prediction.estimator.preprocessor.utils import image_to_normalized_tensor
@ -12,13 +14,9 @@ from image_prediction.transformer.transformers.coordinate.fpdf import FPDFCoordi
from image_prediction.transformer.transformers.coordinate.pdfnet import PDFNetCoordinateTransformer
from test.conftest import array_to_image, add_image
WIDTH = 200
HEIGHT = 100
PAGE_WIDTH = 300
PAGE_HEIGHT = 300
@pytest.mark.parametrize("coordinate_system", ["fpdf"])
@pytest.mark.skip(reason="No content")
def test_fpdf_coordinate_transformer(position_metadata_in_given_system, position_metadata_in_reference_system):
"""We use FPDF's coordinate system as the reference system (arbitrarily). Hence, FPDFCoordinateTransformer
actually does not do anything. This test merely documents the fact, that FPDF is the reference system.
@ -27,6 +25,7 @@ def test_fpdf_coordinate_transformer(position_metadata_in_given_system, position
@pytest.mark.parametrize("coordinate_system", ["fitz"])
@pytest.mark.skip(reason="No content")
def test_fitz_coordinate_transformer(position_metadata_in_given_system, position_metadata_in_reference_system):
"""How I inferred the transformation:
@ -38,6 +37,7 @@ def test_fitz_coordinate_transformer(position_metadata_in_given_system, position
@pytest.mark.parametrize("coordinate_system", ["pdfnet"])
@pytest.mark.skip(reason="No content")
def test_pdfnet_coordinate_transformer(position_metadata_in_given_system, position_metadata_in_reference_system):
"""How I inferred the transformation:
@ -61,18 +61,6 @@ def test_coordinate_transformer_by_metadata(
)
@pytest.mark.parametrize("coordinate_system", ["fpdf"])
def test_coordinate_transformer_by_image(
transformer, position_metadata_in_given_system, position_metadata_in_reference_system
):
metadata_transformed = transformer(position_metadata_in_given_system)
target_image = metadata_to_test_image(position_metadata_in_reference_system)
test_image = metadata_to_test_image(metadata_transformed)
assert np.allclose(target_image, test_image)
@pytest.fixture
def transformer(coordinate_system):
if coordinate_system == "fpdf":
@ -104,26 +92,29 @@ def corner(request):
@pytest.fixture
def corner2metadata_in_given_system(coordinate_system):
def corner2metadata_in_reference_system(get_fpdf_corner_metadat):
return get_fpdf_corner_metadat
@pytest.fixture
def corner2metadata_in_given_system(
coordinate_system, get_fpdf_corner_metadat, get_fitz_corner_metadat, get_pdfnet_corner_metadata
):
if coordinate_system == "fpdf":
return get_fpdf_corner_metadat()
return get_fpdf_corner_metadat
elif coordinate_system == "fitz":
return get_fitz_corner_metadat()
return get_fitz_corner_metadat
elif coordinate_system == "pdfnet":
return get_pdfnet_corner_metadata()
return get_pdfnet_corner_metadata
else:
raise ValueError(f"Unknown coordinate system: {coordinate_system}")
@pytest.fixture
def corner2metadata_in_reference_system():
return get_fpdf_corner_metadat()
def get_fpdf_corner_metadat():
def get_fpdf_corner_metadat(base_position_metadata, get_metadata_for_coords, get_image_and_page_edge_lengths):
"""Origin top left, y1 <= y2; all coords on page are positive
(0,0)--+--(2,0)--+
|////| |////|
@ -133,19 +124,23 @@ def get_fpdf_corner_metadat():
|////| |////|
+--(1,3) +--(3,3)
"""
width, height, page_width, page_height = get_image_and_page_edge_lengths()
return {
"top_left": get_metadata_for_coords(0, 0, WIDTH, HEIGHT),
"bottom_left": get_metadata_for_coords(0, PAGE_HEIGHT - HEIGHT, WIDTH, PAGE_HEIGHT),
"bottom_right": get_metadata_for_coords(PAGE_WIDTH - WIDTH, PAGE_HEIGHT - HEIGHT, PAGE_WIDTH, PAGE_HEIGHT),
"top_right": get_metadata_for_coords(PAGE_WIDTH - WIDTH, 0, PAGE_WIDTH, HEIGHT)
"top_left": get_metadata_for_coords(0, 0, width, height),
"bottom_left": get_metadata_for_coords(0, page_height - height, width, page_height),
"bottom_right": get_metadata_for_coords(page_width - width, page_height - height, page_width, page_height),
"top_right": get_metadata_for_coords(page_width - width, 0, page_width, height)
}
def get_fitz_corner_metadat():
return get_fpdf_corner_metadat()
@pytest.fixture
def get_fitz_corner_metadat(get_fpdf_corner_metadat):
return get_fpdf_corner_metadat
def get_pdfnet_corner_metadata():
@pytest.fixture
def get_pdfnet_corner_metadata(base_position_metadata, get_metadata_for_coords, get_image_and_page_edge_lengths):
"""Origin bottom left, y1 <= y2; all coords on page are positive
+---(1,3) +--(3,3)
|////| |////|
@ -155,48 +150,106 @@ def get_pdfnet_corner_metadata():
|////| |////|
(0,0)--+ (2,0)--+
"""
width, height, page_width, page_height = get_image_and_page_edge_lengths()
return {
"top_left": get_metadata_for_coords(0, PAGE_HEIGHT - HEIGHT, WIDTH, PAGE_HEIGHT),
"bottom_left": get_metadata_for_coords(0, 0, WIDTH, HEIGHT),
"bottom_right": get_metadata_for_coords(PAGE_WIDTH - WIDTH, 0, PAGE_WIDTH, HEIGHT),
"top_right": get_metadata_for_coords(PAGE_WIDTH - WIDTH, PAGE_HEIGHT - HEIGHT, PAGE_WIDTH, PAGE_HEIGHT),
"top_left": get_metadata_for_coords(0, page_height - height, width, page_height),
"bottom_left": get_metadata_for_coords(0, 0, width, height),
"bottom_right": get_metadata_for_coords(page_width - width, 0, page_width, height),
"top_right": get_metadata_for_coords(page_width - width, page_height - height, page_width, page_height),
}
def get_metadata_for_coords(x1, y1, x2, y2):
metadata = base_position_metadata()
metadata.update({Info.X1: x1, Info.Y1: y1, Info.X2: x2, Info.Y2: y2})
return metadata
@pytest.fixture
def base_position_metadata(WIDTH, HEIGHT, PAGE_WIDTH, PAGE_HEIGHT):
return get_base_position_metadata(WIDTH, HEIGHT, PAGE_WIDTH, PAGE_HEIGHT)
def base_position_metadata():
@pytest.fixture
def get_metadata_for_coords(base_position_metadata):
def __get_metadata_for_coords(*coords):
meta_data_coords = get_metadata_coords(*coords)
return {**meta_data_coords, **omit(base_position_metadata, meta_data_coords.keys())}
return __get_metadata_for_coords
@pytest.fixture
def get_image_and_page_edge_lengths(base_position_metadata):
def __get_w_h_pw_ph():
return itemgetter(*attrgetter("WIDTH", "HEIGHT", "PAGE_WIDTH", "PAGE_HEIGHT")(Info))(base_position_metadata)
return __get_w_h_pw_ph
@pytest.fixture(params=[33, 100])
def HEIGHT(request):
return request.param
@pytest.fixture(params=[10, 31])
def WIDTH(request):
return request.param
@pytest.fixture(params=[220, 30])
def PAGE_HEIGHT(request):
return request.param
@pytest.fixture(params=[100, 310])
def PAGE_WIDTH(request):
return request.param
def get_base_position_metadata(width, height, page_width, page_height):
return {
Info.X1: 0,
Info.Y1: 0,
Info.X2: WIDTH,
Info.Y2: HEIGHT,
Info.WIDTH: WIDTH,
Info.HEIGHT: HEIGHT,
Info.X1: None,
Info.Y1: None,
Info.X2: None,
Info.Y2: None,
Info.WIDTH: width,
Info.HEIGHT: height,
Info.PAGE_IDX: 0,
Info.PAGE_WIDTH: PAGE_WIDTH,
Info.PAGE_HEIGHT: PAGE_HEIGHT,
Info.PAGE_WIDTH: page_width,
Info.PAGE_HEIGHT: page_height,
}
def get_metadata_coords(x1, y1, x2, y2):
return {Info.X1: x1, Info.Y1: y1, Info.X2: x2, Info.Y2: y2}
@pytest.mark.parametrize("coordinate_system", ["pdfnet"])
def test_coordinate_transformer_by_image(
transformer, position_metadata_in_given_system, position_metadata_in_reference_system
):
metadata_transformed = transformer(position_metadata_in_given_system)
target_image = metadata_to_test_image(position_metadata_in_reference_system)
test_image = metadata_to_test_image(metadata_transformed)
assert np.allclose(target_image, test_image)
def metadata_to_test_image(metadata):
image = get_coordinate_test_image()
pdf = get_coordinate_test_fpdf()
image = get_coordinate_test_image(
*itemgetter(*attrgetter("WIDTH", "HEIGHT")(Info))(metadata)
)
pdf = get_coordinate_test_fpdf(
*itemgetter(*attrgetter("PAGE_WIDTH", "PAGE_HEIGHT")(Info))(metadata)
)
add_image(pdf, ImageMetadataPair(image, metadata))
page_image = fpdf_to_page_tensor(pdf)
return page_image
def get_coordinate_test_image():
return array_to_image(np.zeros(shape=(WIDTH, HEIGHT, 3)))
def get_coordinate_test_image(width, height):
return array_to_image(np.zeros(shape=(width, height, 3)))
def get_coordinate_test_fpdf():
pdf = fpdf.FPDF(unit="pt", format=(PAGE_WIDTH, PAGE_HEIGHT))
def get_coordinate_test_fpdf(page_width, page_height):
pdf = fpdf.FPDF(unit="pt", format=(page_width, page_height))
return pdf