refactoring
This commit is contained in:
parent
1b1f1aafef
commit
6a6fc19958
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user