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 numpy as np
import pytest import pytest
from fpdf import fpdf from fpdf import fpdf
from funcy import compose from funcy import compose, omit
from pdf2image import pdf2image from pdf2image import pdf2image
from image_prediction.estimator.preprocessor.utils import image_to_normalized_tensor 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 image_prediction.transformer.transformers.coordinate.pdfnet import PDFNetCoordinateTransformer
from test.conftest import array_to_image, add_image 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.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): 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 """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. 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.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): def test_fitz_coordinate_transformer(position_metadata_in_given_system, position_metadata_in_reference_system):
"""How I inferred the transformation: """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.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): def test_pdfnet_coordinate_transformer(position_metadata_in_given_system, position_metadata_in_reference_system):
"""How I inferred the transformation: """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 @pytest.fixture
def transformer(coordinate_system): def transformer(coordinate_system):
if coordinate_system == "fpdf": if coordinate_system == "fpdf":
@ -104,26 +92,29 @@ def corner(request):
@pytest.fixture @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": if coordinate_system == "fpdf":
return get_fpdf_corner_metadat() return get_fpdf_corner_metadat
elif coordinate_system == "fitz": elif coordinate_system == "fitz":
return get_fitz_corner_metadat() return get_fitz_corner_metadat
elif coordinate_system == "pdfnet": elif coordinate_system == "pdfnet":
return get_pdfnet_corner_metadata() return get_pdfnet_corner_metadata
else: else:
raise ValueError(f"Unknown coordinate system: {coordinate_system}") raise ValueError(f"Unknown coordinate system: {coordinate_system}")
@pytest.fixture @pytest.fixture
def corner2metadata_in_reference_system(): def get_fpdf_corner_metadat(base_position_metadata, get_metadata_for_coords, get_image_and_page_edge_lengths):
return get_fpdf_corner_metadat()
def get_fpdf_corner_metadat():
"""Origin top left, y1 <= y2; all coords on page are positive """Origin top left, y1 <= y2; all coords on page are positive
(0,0)--+--(2,0)--+ (0,0)--+--(2,0)--+
|////| |////| |////| |////|
@ -133,19 +124,23 @@ def get_fpdf_corner_metadat():
|////| |////| |////| |////|
+--(1,3) +--(3,3) +--(1,3) +--(3,3)
""" """
width, height, page_width, page_height = get_image_and_page_edge_lengths()
return { return {
"top_left": get_metadata_for_coords(0, 0, 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_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), "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_right": get_metadata_for_coords(page_width - width, 0, page_width, height)
} }
def get_fitz_corner_metadat(): @pytest.fixture
return get_fpdf_corner_metadat() 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 """Origin bottom left, y1 <= y2; all coords on page are positive
+---(1,3) +--(3,3) +---(1,3) +--(3,3)
|////| |////| |////| |////|
@ -155,48 +150,106 @@ def get_pdfnet_corner_metadata():
|////| |////| |////| |////|
(0,0)--+ (2,0)--+ (0,0)--+ (2,0)--+
""" """
width, height, page_width, page_height = get_image_and_page_edge_lengths()
return { return {
"top_left": get_metadata_for_coords(0, PAGE_HEIGHT - HEIGHT, 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_left": get_metadata_for_coords(0, 0, width, height),
"bottom_right": get_metadata_for_coords(PAGE_WIDTH - WIDTH, 0, PAGE_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_right": get_metadata_for_coords(page_width - width, page_height - height, page_width, page_height),
} }
def get_metadata_for_coords(x1, y1, x2, y2): @pytest.fixture
metadata = base_position_metadata() def base_position_metadata(WIDTH, HEIGHT, PAGE_WIDTH, PAGE_HEIGHT):
metadata.update({Info.X1: x1, Info.Y1: y1, Info.X2: x2, Info.Y2: y2}) return get_base_position_metadata(WIDTH, HEIGHT, PAGE_WIDTH, PAGE_HEIGHT)
return metadata
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 { return {
Info.X1: 0, Info.X1: None,
Info.Y1: 0, Info.Y1: None,
Info.X2: WIDTH, Info.X2: None,
Info.Y2: HEIGHT, Info.Y2: None,
Info.WIDTH: WIDTH, Info.WIDTH: width,
Info.HEIGHT: HEIGHT, Info.HEIGHT: height,
Info.PAGE_IDX: 0, Info.PAGE_IDX: 0,
Info.PAGE_WIDTH: PAGE_WIDTH, Info.PAGE_WIDTH: page_width,
Info.PAGE_HEIGHT: PAGE_HEIGHT, 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): def metadata_to_test_image(metadata):
image = get_coordinate_test_image() image = get_coordinate_test_image(
pdf = get_coordinate_test_fpdf() *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)) add_image(pdf, ImageMetadataPair(image, metadata))
page_image = fpdf_to_page_tensor(pdf) page_image = fpdf_to_page_tensor(pdf)
return page_image return page_image
def get_coordinate_test_image(): def get_coordinate_test_image(width, height):
return array_to_image(np.zeros(shape=(WIDTH, HEIGHT, 3))) return array_to_image(np.zeros(shape=(width, height, 3)))
def get_coordinate_test_fpdf(): def get_coordinate_test_fpdf(page_width, page_height):
pdf = fpdf.FPDF(unit="pt", format=(PAGE_WIDTH, PAGE_HEIGHT)) pdf = fpdf.FPDF(unit="pt", format=(page_width, page_height))
return pdf return pdf