Skip to content

Commit

Permalink
feat: round numbers to reduce undeterministic behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
badGarnet committed Oct 19, 2024
1 parent 208c7ed commit d119a90
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 12 deletions.
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
## 0.16.1-dev3
## 0.16.1-dev4

### Enhancements

* **Round coordinates**

### Features

### Fixes
Expand Down
2 changes: 1 addition & 1 deletion unstructured/__version__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.16.1-dev3" # pragma: no cover
__version__ = "0.16.1-dev4" # pragma: no cover
27 changes: 17 additions & 10 deletions unstructured/partition/pdf_image/pdfminer_processing.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,19 +115,19 @@ def _create_text_region(x1, y1, x2, y2, coef, text, source, region_class):
)


def get_coords_from_bboxes(bboxes) -> np.ndarray:
def get_coords_from_bboxes(bboxes, round_to: int = 6) -> np.ndarray:
"""convert a list of boxes's coords into np array"""
# preallocate memory
coords = np.zeros((len(bboxes), 4), dtype=np.float32)

for i, bbox in enumerate(bboxes):
coords[i, :] = [bbox.x1, bbox.y1, bbox.x2, bbox.y2]

return coords
return coords.round(round_to)


def areas_of_boxes_and_intersection_area(
coords1: np.ndarray, coords2: np.ndarray, threshold: float = 0.5
coords1: np.ndarray, coords2: np.ndarray, round_to: int = 6
):
"""compute intersection area and own areas for two groups of bounding boxes"""
x11, y11, x12, y12 = np.split(coords1, 4, axis=1)
Expand All @@ -139,26 +139,33 @@ def areas_of_boxes_and_intersection_area(
boxa_area = (x12 - x11 + 1) * (y12 - y11 + 1)
boxb_area = (x22 - x21 + 1) * (y22 - y21 + 1)

return inter_area, boxa_area, boxb_area
return inter_area.round(round_to), boxa_area.round(round_to), boxb_area.round(round_to)


def bboxes1_is_almost_subregion_of_bboxes2(bboxes1, bboxes2, threshold: float = 0.5) -> np.ndarray:
def bboxes1_is_almost_subregion_of_bboxes2(
bboxes1, bboxes2, threshold: float = 0.5, round_to: int = 6
) -> np.ndarray:
"""compute if each element from bboxes1 is almost a subregion of one or more elements in
bboxes2"""
coords1, coords2 = get_coords_from_bboxes(bboxes1), get_coords_from_bboxes(bboxes2)
coords1 = get_coords_from_bboxes(bboxes1, round_to=round_to)
coords2 = get_coords_from_bboxes(bboxes2, round_to=round_to)

inter_area, boxa_area, boxb_area = areas_of_boxes_and_intersection_area(coords1, coords2)
inter_area, boxa_area, boxb_area = areas_of_boxes_and_intersection_area(
coords1, coords2, round_to=round_to
)

return (inter_area / np.maximum(boxa_area, EPSILON_AREA) > threshold) & (
boxa_area <= boxb_area.T
)


def boxes_self_iou(bboxes, threshold: float = 0.5) -> np.ndarray:
def boxes_self_iou(bboxes, threshold: float = 0.5, round_to: int = 6) -> np.ndarray:
"""compute iou for a group of elements"""
coords = get_coords_from_bboxes(bboxes)
coords = get_coords_from_bboxes(bboxes, round_to=round_to)

inter_area, boxa_area, boxb_area = areas_of_boxes_and_intersection_area(coords, coords)
inter_area, boxa_area, boxb_area = areas_of_boxes_and_intersection_area(
coords, coords, round_to=round_to
)

return (inter_area / np.maximum(EPSILON_AREA, boxa_area + boxb_area.T - inter_area)) > threshold

Expand Down

0 comments on commit d119a90

Please sign in to comment.