-
Notifications
You must be signed in to change notification settings - Fork 7.2k
Add clamping_mode
for KeyPoints
#9234
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
c92bc32
fe51080
4368999
e9e901d
4db3c2e
b22688a
2e2ea83
6f5a3b7
37d73d4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,7 +2,7 @@ | |
|
||
from torchvision import tv_tensors | ||
from torchvision.transforms.v2 import functional as F, Transform | ||
from torchvision.tv_tensors._bounding_boxes import CLAMPING_MODE_TYPE | ||
from torchvision.tv_tensors import CLAMPING_MODE_TYPE | ||
|
||
|
||
class ConvertBoundingBoxFormat(Transform): | ||
|
@@ -46,17 +46,27 @@ def transform(self, inpt: tv_tensors.BoundingBoxes, params: dict[str, Any]) -> t | |
class ClampKeyPoints(Transform): | ||
"""Clamp keypoints to their corresponding image dimensions. | ||
|
||
The clamping is done according to the keypoints' ``canvas_size`` meta-data. | ||
Args: | ||
clamping_mode: Default is "auto" which relies on the input keypoint' | ||
``clamping_mode`` attribute. | ||
The clamping is done according to the keypoints' ``canvas_size`` meta-data. | ||
Read more in :ref:`clamping_mode_tuto` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
for more details on how to use this transform. | ||
|
||
""" | ||
|
||
def __init__(self, clamping_mode: Union[CLAMPING_MODE_TYPE, str] = "auto") -> None: | ||
super().__init__() | ||
self.clamping_mode = clamping_mode | ||
|
||
_transformed_types = (tv_tensors.KeyPoints,) | ||
|
||
def transform(self, inpt: tv_tensors.KeyPoints, params: dict[str, Any]) -> tv_tensors.KeyPoints: | ||
return F.clamp_keypoints(inpt) # type: ignore[return-value] | ||
return F.clamp_keypoints(inpt, clamping_mode=self.clamping_mode) # type: ignore[return-value] | ||
|
||
|
||
class SetClampingMode(Transform): | ||
"""Sets the ``clamping_mode`` attribute of the bounding boxes for future transforms. | ||
"""Sets the ``clamping_mode`` attribute of the bounding boxes and keypoints for future transforms. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think it could be useful to allow setting the clamping modes of bounding boxes and keypoints to different values by passing a dictionary. For example:
|
||
|
||
|
||
|
||
|
@@ -73,9 +83,10 @@ def __init__(self, clamping_mode: CLAMPING_MODE_TYPE) -> None: | |
if self.clamping_mode not in (None, "soft", "hard"): | ||
raise ValueError(f"clamping_mode must be soft, hard or None, got {clamping_mode}") | ||
|
||
_transformed_types = (tv_tensors.BoundingBoxes,) | ||
_transformed_types = (tv_tensors.BoundingBoxes, tv_tensors.KeyPoints) | ||
|
||
def transform(self, inpt: tv_tensors.BoundingBoxes, params: dict[str, Any]) -> tv_tensors.BoundingBoxes: | ||
# this method works for both `tv_tensors.BoundingBoxes`` and `tv_tensors.KeyPoints`. | ||
out: tv_tensors.BoundingBoxes = inpt.clone() # type: ignore[assignment] | ||
out.clamping_mode = self.clamping_mode | ||
return out |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like this line is redundant and can be removed.