[Fix] Fix RandomCrop

pull/1178/head
jiangqing.vendor 2022-05-26 10:54:20 +00:00 committed by gaotongxiao
parent fe43259a05
commit 58c59e80dd
3 changed files with 13 additions and 14 deletions

View File

@ -13,7 +13,7 @@ from shapely.geometry import Polygon as plg
import mmocr.core.evaluation.utils as eval_utils
from mmocr.registry import TRANSFORMS
from mmocr.utils import (bbox2poly, crop_polygon, is_poly_outside_rect,
from mmocr.utils import (bbox2poly, crop_polygon, is_poly_inside_rect,
poly2bbox, rescale_polygon)
from .wrappers import ImgAug
@ -888,7 +888,7 @@ class RandomCrop(BaseTransform):
for idx, poly in enumerate(polys):
poly = poly.reshape(-1, 2)
poly = poly - (crop_x, crop_y)
if not is_poly_outside_rect(poly, [0, 0, crop_w, crop_h]):
if is_poly_inside_rect(poly.flatten(), [0, 0, crop_w, crop_h]):
valid_polys.append(poly.flatten())
valid_labels.append(labels[idx])
valid_ignored.append(ignored[idx])
@ -905,7 +905,8 @@ class RandomCrop(BaseTransform):
for bbox in bboxes:
bbox = bbox.reshape(-1, 2)
bbox = bbox - (crop_x, crop_y)
if not is_poly_outside_rect(bbox, [0, 0, crop_w, crop_h]):
if is_poly_inside_rect(
bbox2poly(bbox.flatten()), [0, 0, crop_w, crop_h]):
valid_bboxes.append(bbox.flatten())
assert (len(valid_bboxes) == len(valid_polys))
results['gt_bboxes'] = np.array(valid_bboxes).astype(np.float32)

View File

@ -14,7 +14,7 @@ from .img_util import drop_orientation, is_not_png
from .lmdb_util import recog2lmdb
from .logger import get_root_logger
from .model import revert_sync_batchnorm
from .polygon_utils import (crop_polygon, is_poly_outside_rect, poly2bbox,
from .polygon_utils import (crop_polygon, is_poly_inside_rect, poly2bbox,
poly2shapely, poly_intersection, poly_iou,
poly_make_valid, poly_union, polys2shapely,
rescale_polygon, rescale_polygons)
@ -29,7 +29,7 @@ __all__ = [
'stitch_boxes_into_lines', 'StringStrip', 'revert_sync_batchnorm',
'bezier_to_polygon', 'sort_points', 'recog2lmdb', 'dump_ocr_data',
'recog_anno_to_imginfo', 'rescale_polygons', 'rescale_polygon',
'rescale_bboxes', 'bbox2poly', 'crop_polygon', 'is_poly_outside_rect',
'rescale_bboxes', 'bbox2poly', 'crop_polygon', 'is_poly_inside_rect',
'poly2bbox', 'poly_intersection', 'poly_iou', 'poly_make_valid',
'poly_union', 'poly2shapely', 'polys2shapely', 'register_all_modules'
]

View File

@ -260,19 +260,17 @@ def poly_iou(poly_a: Polygon,
return area_inters / area_union if area_union != 0 else zero_division
def is_poly_outside_rect(poly: ArrayLike, rect: np.ndarray) -> bool:
"""Check if the polygon is outside the target region.
def is_poly_inside_rect(poly: ArrayLike, rect: np.ndarray) -> bool:
"""Check if the polygon is inside the target region.
Args:
poly (ArrayLike): Polygon in shape (N, ).
rect (ndarray): Target region [x1, y1, x2, y2].
Returns:
bool: Whether the polygon is outside the cropping region.
bool: Whether the polygon is inside the cropping region.
"""
poly = np.array(poly).reshape(-1, 2)
if poly[:, 0].max() < rect[0] or poly[:, 0].min() > rect[2]:
return True
if poly[:, 1].max() < rect[1] or poly[:, 1].min() > rect[3]:
return True
return False
poly = poly2shapely(poly)
rect = poly2shapely(bbox2poly(rect))
inter = poly.intersection(rect)
return inter.area == poly.area