Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
## 1.6.14

### Fixes
- **Normalize object-detection model results**: the object-detection boundary now converts legacy list results to `LayoutElements`, so page-layout routing works consistently across built-in detection models.

## 1.6.13

### Fixes
Expand Down
36 changes: 36 additions & 0 deletions test_unstructured_inference/inference/test_layout.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,42 @@ def test_get_page_elements(monkeypatch, mock_final_layout):
assert elements == page.elements_array


class ListPredictingDetectionModel(UnstructuredObjectDetectionModel):
def __init__(self, predictions):
super().__init__()
self.predictions = predictions

def initialize(self, *args, **kwargs):
pass

def predict(self, x):
return self.predictions


@pytest.mark.parametrize(
("predictions", "expected_texts"),
[
([layoutelement.LayoutElement.from_coords(0, 0, 1, 1, text="detected")], ["detected"]),
([], []),
],
)
def test_get_page_elements_with_detection_model_returning_a_list(
mock_image,
predictions,
expected_texts,
):
page = layout.PageLayout(
number=1,
image=mock_image,
detection_model=ListPredictingDetectionModel(predictions),
)

result = page.get_elements_with_detection_model(inplace=False)

assert isinstance(result, layoutelement.LayoutElements)
assert result.texts.tolist() == expected_texts


class MockPool:
def map(self, f, xs):
return [f(x) for x in xs]
Expand Down
6 changes: 4 additions & 2 deletions test_unstructured_inference/models/test_detectron2onnx.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import unstructured_inference.models.base as models
import unstructured_inference.models.detectron2onnx as detectron2
from unstructured_inference.inference.layoutelement import LayoutElements


class MockDetectron2ONNXLayoutModel:
Expand Down Expand Up @@ -50,7 +51,7 @@ def test_unstructured_detectron_model():
model.model = 1
with patch.object(detectron2.UnstructuredDetectronONNXModel, "predict", return_value=[]):
result = model(None)
assert isinstance(result, list)
assert isinstance(result, LayoutElements)
assert len(result) == 0


Expand All @@ -67,8 +68,9 @@ def test_inference():
image = Image.open(fp)
image.load()
elements = model(image)
assert isinstance(elements, LayoutElements)
assert len(elements) == 1
element = elements[0]
element = elements.as_list()[0]
(x1, y1), _, (x2, y2), _ = element.bbox.coordinates
assert hasattr(
element,
Expand Down
2 changes: 1 addition & 1 deletion unstructured_inference/__version__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "1.6.13" # pragma: no cover
__version__ = "1.6.14" # pragma: no cover
5 changes: 4 additions & 1 deletion unstructured_inference/models/unstructuredmodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,10 @@ def predict(self, x: Image) -> LayoutElements | list[LayoutElement]:

def __call__(self, x: Image) -> LayoutElements:
"""Inference using function call interface."""
return super().__call__(x)
predictions = super().__call__(x)
if isinstance(predictions, LayoutElements):
return predictions
return LayoutElements.from_list(predictions)

@staticmethod
def enhance_regions(
Expand Down
Loading