Helper functions for working with keypoints (augmentations.core.keypoints_utils)¶
class KeypointParams
(format, label_fields=None, remove_invisible=True, angle_in_degrees=True, check_each_transform=True)
[view source on GitHub] ¶
Parameters of keypoints
Parameters:
Name | Type | Description |
---|---|---|
format | str | format of keypoints. Should be 'xy', 'yx', 'xya', 'xys', 'xyas', 'xysa'. x - X coordinate, y - Y coordinate s - Keypoint scale a - Keypoint orientation in radians or degrees (depending on KeypointParams.angle_in_degrees) |
label_fields | list | list of fields that are joined with keypoints, e.g labels. Should be same type as keypoints. |
remove_invisible | bool | to remove invisible points after transform or not |
angle_in_degrees | bool | angle in degrees or radians in 'xya', 'xyas', 'xysa' keypoints |
check_each_transform | bool | if |
Source code in albumentations/core/keypoints_utils.py
class KeypointParams(Params):
"""Parameters of keypoints
Args:
format (str): format of keypoints. Should be 'xy', 'yx', 'xya', 'xys', 'xyas', 'xysa'.
x - X coordinate,
y - Y coordinate
s - Keypoint scale
a - Keypoint orientation in radians or degrees (depending on KeypointParams.angle_in_degrees)
label_fields (list): list of fields that are joined with keypoints, e.g labels.
Should be same type as keypoints.
remove_invisible (bool): to remove invisible points after transform or not
angle_in_degrees (bool): angle in degrees or radians in 'xya', 'xyas', 'xysa' keypoints
check_each_transform (bool): if `True`, then keypoints will be checked after each dual transform.
Default: `True`
"""
def __init__(
self,
format: str,
label_fields: Optional[Sequence[str]] = None,
remove_invisible: bool = True,
angle_in_degrees: bool = True,
check_each_transform: bool = True,
):
super().__init__(format, label_fields)
self.remove_invisible = remove_invisible
self.angle_in_degrees = angle_in_degrees
self.check_each_transform = check_each_transform
def to_dict_private(self) -> Dict[str, Any]:
data = super().to_dict_private()
data.update(
{
"remove_invisible": self.remove_invisible,
"angle_in_degrees": self.angle_in_degrees,
"check_each_transform": self.check_each_transform,
},
)
return data
@classmethod
def is_serializable(cls) -> bool:
return True
@classmethod
def get_class_fullname(cls) -> str:
return "KeypointParams"
class KeypointsProcessor
(params, additional_targets=None)
[view source on GitHub] ¶
Source code in albumentations/core/keypoints_utils.py
class KeypointsProcessor(DataProcessor):
def __init__(self, params: KeypointParams, additional_targets: Optional[Dict[str, str]] = None):
super().__init__(params, additional_targets)
@property
def default_data_name(self) -> str:
return "keypoints"
def ensure_data_valid(self, data: Dict[str, Any]) -> None:
if self.params.label_fields and not all(i in data for i in self.params.label_fields):
msg = "Your 'label_fields' are not valid - them must have same names as params in 'keypoint_params' dict"
raise ValueError(msg)
def filter(self, data: Sequence[KeypointType], rows: int, cols: int) -> Sequence[KeypointType]:
"""The function filters a sequence of data based on the number of rows and columns, and returns a
sequence of keypoints.
:param data: The `data` parameter is a sequence of sequences. Each inner sequence represents a
set of keypoints
:type data: Sequence[Sequence]
:param rows: The `rows` parameter represents the number of rows in the data matrix. It specifies
the number of rows that will be used for filtering the keypoints
:type rows: int
:param cols: The parameter "cols" represents the number of columns in the grid that the
keypoints will be filtered on
:type cols: int
:return: a sequence of KeypointType objects.
"""
self.params: KeypointParams
return filter_keypoints(data, rows, cols, remove_invisible=self.params.remove_invisible)
def check(self, data: Sequence[KeypointType], rows: int, cols: int) -> None:
check_keypoints(data, rows, cols)
def convert_from_albumentations(self, data: Sequence[KeypointType], rows: int, cols: int) -> List[KeypointType]:
params = self.params
return convert_keypoints_from_albumentations(
data,
params.format,
rows,
cols,
check_validity=params.remove_invisible,
angle_in_degrees=params.angle_in_degrees,
)
def convert_to_albumentations(self, data: Sequence[KeypointType], rows: int, cols: int) -> List[KeypointType]:
params = self.params
return convert_keypoints_to_albumentations(
data,
params.format,
rows,
cols,
check_validity=params.remove_invisible,
angle_in_degrees=params.angle_in_degrees,
)
filter (self, data, rows, cols)
¶
The function filters a sequence of data based on the number of rows and columns, and returns a sequence of keypoints.
:param data: The data
parameter is a sequence of sequences. Each inner sequence represents a set of keypoints :type data: Sequence[Sequence] :param rows: The rows
parameter represents the number of rows in the data matrix. It specifies the number of rows that will be used for filtering the keypoints :type rows: int :param cols: The parameter "cols" represents the number of columns in the grid that the keypoints will be filtered on :type cols: int :return: a sequence of KeypointType objects.
Source code in albumentations/core/keypoints_utils.py
def filter(self, data: Sequence[KeypointType], rows: int, cols: int) -> Sequence[KeypointType]:
"""The function filters a sequence of data based on the number of rows and columns, and returns a
sequence of keypoints.
:param data: The `data` parameter is a sequence of sequences. Each inner sequence represents a
set of keypoints
:type data: Sequence[Sequence]
:param rows: The `rows` parameter represents the number of rows in the data matrix. It specifies
the number of rows that will be used for filtering the keypoints
:type rows: int
:param cols: The parameter "cols" represents the number of columns in the grid that the
keypoints will be filtered on
:type cols: int
:return: a sequence of KeypointType objects.
"""
self.params: KeypointParams
return filter_keypoints(data, rows, cols, remove_invisible=self.params.remove_invisible)
def check_keypoint (kp, rows, cols)
[view source on GitHub]¶
Check if keypoint coordinates are less than image shapes
Source code in albumentations/core/keypoints_utils.py
def check_keypoint(kp: KeypointType, rows: int, cols: int) -> None:
"""Check if keypoint coordinates are less than image shapes"""
for name, value, size in zip(["x", "y"], kp[:2], [cols, rows]):
if not 0 <= value < size:
raise ValueError(f"Expected {name} for keypoint {kp} to be in the range [0.0, {size}], got {value}.")
angle = kp[2]
if not (0 <= angle < 2 * math.pi):
raise ValueError(f"Keypoint angle must be in range [0, 2 * PI). Got: {angle}")
def check_keypoints (keypoints, rows, cols)
[view source on GitHub]¶
Check if keypoints boundaries are less than image shapes