68 lines
1.5 KiB
Python
68 lines
1.5 KiB
Python
import json
|
|
from itertools import chain
|
|
|
|
from image_prediction.exceptions import InvalidBox
|
|
from image_prediction.formatter.formatters.enum import EnumFormatter
|
|
from image_prediction.info import Info
|
|
|
|
|
|
def flatten_groups_once(groups):
|
|
return chain.from_iterable(groups)
|
|
|
|
|
|
def make_coord_getter(c):
|
|
return {
|
|
"x1": make_getter(Info.X1),
|
|
"x2": make_getter(Info.X2),
|
|
"y1": make_getter(Info.Y1),
|
|
"y2": make_getter(Info.Y2),
|
|
}[c]
|
|
|
|
|
|
def make_getter(key):
|
|
def getter(pair):
|
|
return pair.metadata[key]
|
|
|
|
return getter
|
|
|
|
|
|
def make_length_getter(dim):
|
|
return {
|
|
"width": make_getter(Info.WIDTH),
|
|
"height": make_getter(Info.HEIGHT),
|
|
}[dim]
|
|
|
|
|
|
def validate_box(box):
|
|
validate_box_coords(box)
|
|
validate_box_size(box)
|
|
return box
|
|
|
|
|
|
def validate_box_coords(box):
|
|
|
|
x_diff = box[Info.WIDTH] - (box[Info.X2] - box[Info.X1])
|
|
y_diff = box[Info.HEIGHT] - (box[Info.Y2] - box[Info.Y1])
|
|
|
|
if x_diff:
|
|
raise InvalidBox(f"Width and x-coordinates differ by {x_diff} units: {format_box(box)}")
|
|
if y_diff:
|
|
raise InvalidBox(f"Width and y-coordinates differ by {y_diff} units: {format_box(box)}")
|
|
|
|
return box
|
|
|
|
|
|
def validate_box_size(box):
|
|
|
|
if not box[Info.WIDTH]:
|
|
raise InvalidBox(f"Zero width box: {format_box(box)}")
|
|
|
|
if not box[Info.HEIGHT]:
|
|
raise InvalidBox(f"Zero height box: {format_box(box)}")
|
|
|
|
return box
|
|
|
|
|
|
def format_box(box):
|
|
return json.dumps(EnumFormatter()(box), indent=2)
|