instance_cropping
sleap_nn.data.instance_cropping
¶
Handle cropping of instances.
Functions:
| Name | Description |
|---|---|
compute_augmentation_padding |
Compute padding needed to accommodate augmentation transforms. |
count_clipped_instances |
Count labeled instances that a given crop size would clip. |
find_instance_crop_size |
Compute a crop size that contains every labeled instance. |
find_max_instance_bbox_size |
Find the maximum bounding box dimension across all instances in labels. |
generate_crops |
Generate cropped image for the given centroid. |
iter_required_crop_sizes |
Yield the crop size each labeled instance needs to avoid being clipped. |
make_centered_bboxes |
Create centered bounding boxes around centroid. |
compute_augmentation_padding(bbox_size, rotation_max=0.0, scale_max=1.0)
¶
Compute padding needed to accommodate augmentation transforms.
When rotation and scaling augmentations are applied, the bounding box of an instance can expand beyond its original size. This function calculates the padding needed to ensure the full instance remains visible after augmentation.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
bbox_size
|
float
|
The size of the instance bounding box (max of width/height). |
required |
rotation_max
|
float
|
Maximum absolute rotation angle in degrees. For symmetric rotation ranges like [-180, 180], pass 180. |
0.0
|
scale_max
|
float
|
Maximum scaling factor. For scale range [0.9, 1.1], pass 1.1. |
1.0
|
Returns:
| Type | Description |
|---|---|
int
|
Padding in pixels to add around the bounding box (total, not per side). |
Source code in sleap_nn/data/instance_cropping.py
count_clipped_instances(labels, crop_size, max_hw=None, anchor_ind=None, centroid_method=None, centroid_fallback=None, user_instances_only=False)
¶
Count labeled instances that a given crop size would clip.
Used to warn about an explicitly configured crop_size, which we must not
silently override -- some users knowingly accept clipping an extremity.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
labels
|
Labels
|
A |
required |
crop_size
|
int
|
The configured crop size, in size-matched pixels. |
required |
max_hw
|
Optional[Tuple[Optional[int], Optional[int]]]
|
The configured |
None
|
anchor_ind
|
Optional[int]
|
Index of the anchor node, or |
None
|
centroid_method
|
Optional[str]
|
The resolved centroid method, or |
None
|
centroid_fallback
|
Optional[str]
|
The reduce method for a non-visible anchor node. |
None
|
user_instances_only
|
bool
|
When |
False
|
Returns:
| Type | Description |
|---|---|
Tuple[int, int, float]
|
|
Source code in sleap_nn/data/instance_cropping.py
find_instance_crop_size(labels, padding=0, maximum_stride=2, min_crop_size=None, max_hw=None, anchor_ind=None, centroid_method=None, centroid_fallback=None, user_instances_only=False)
¶
Compute a crop size that contains every labeled instance.
The size is measured the way the crop is actually taken: centered on each
instance's centroid (iter_required_crop_sizes) and, when max_hw is
given, in the size-matched pixel space that cropping happens in. Both
matter -- a bounding-box measurement in native pixels under-sizes the crop
whenever the centroid is off-center or the video is rescaled to max_hw.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
labels
|
Labels
|
A |
required |
padding
|
int
|
Integer number of pixels to add to the bounds as margin padding. |
0
|
maximum_stride
|
int
|
Ensure that the returned crop size is divisible by this value. Useful for ensuring that the crop size will not be truncated in a given architecture. |
2
|
min_crop_size
|
Optional[int]
|
A floor for the returned crop size, before padding. |
None
|
max_hw
|
Optional[Tuple[Optional[int], Optional[int]]]
|
The configured |
None
|
anchor_ind
|
Optional[int]
|
Index of the anchor node the crop is centered on, or
|
None
|
centroid_method
|
Optional[str]
|
The resolved centroid method, or |
None
|
centroid_fallback
|
Optional[str]
|
The reduce method used when the anchor node is not visible on an instance. |
None
|
user_instances_only
|
bool
|
When |
False
|
Returns:
| Type | Description |
|---|---|
int
|
An integer crop size denoting the length of the side of the boxes that
will contain the instances when cropped. The returned crop size will be
larger or equal to the input This accounts for stride and padding when ensuring divisibility. |
Source code in sleap_nn/data/instance_cropping.py
find_max_instance_bbox_size(labels, max_hw=None, user_instances_only=False)
¶
Find the maximum bounding box dimension across all instances in labels.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
labels
|
Labels
|
A |
required |
max_hw
|
Optional[Tuple[Optional[int], Optional[int]]]
|
The configured |
None
|
user_instances_only
|
bool
|
When |
False
|
Returns:
| Type | Description |
|---|---|
float
|
The maximum bounding box dimension (max of width or height) across all instances. |
Source code in sleap_nn/data/instance_cropping.py
generate_crops(image, instance, centroid, crop_size)
¶
Generate cropped image for the given centroid.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
image
|
Tensor
|
Input source image. (n_samples, C, H, W) |
required |
instance
|
Tensor
|
Keypoints for the instance to be cropped. (n_nodes, 2) |
required |
centroid
|
Tensor
|
Centroid of the instance to be cropped. (2) |
required |
crop_size
|
Tuple[int]
|
(height, width) of the crop to be generated. |
required |
Returns:
| Type | Description |
|---|---|
Dict[str, Tensor]
|
A dictionary with cropped images, bounding box for the cropped instance, keypoints and centroids adjusted to the crop. |
Source code in sleap_nn/data/instance_cropping.py
iter_required_crop_sizes(labels, max_hw=None, anchor_ind=None, centroid_method=None, centroid_fallback=None, user_instances_only=False)
¶
Yield the crop size each labeled instance needs to avoid being clipped.
Crops are centered on the instance's centroid, not on its bounding-box
midpoint (see generate_crops / make_centered_bboxes), so the size an
instance requires is twice its greatest node offset from that centroid --
not its bounding-box extent. The two agree only when the centroid happens
to sit at the middle of the bounding box. For an anchor node near one end of
the animal (a mouse anchored on the thorax, with a long tail) the required
size approaches twice the extent, which is why a crop sized to the bounding
box still clips the far nodes.
The centroid is derived through generate_centroids, the same op that
positions the crop at training time, so this can't disagree with the actual
crop center.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
labels
|
Labels
|
A |
required |
max_hw
|
Optional[Tuple[Optional[int], Optional[int]]]
|
The configured |
None
|
anchor_ind
|
Optional[int]
|
Index of the anchor node, or |
None
|
centroid_method
|
Optional[str]
|
The resolved centroid method, or |
None
|
centroid_fallback
|
Optional[str]
|
The reduce method used when the anchor node is not visible on an instance. |
None
|
user_instances_only
|
bool
|
When |
False
|
Yields:
| Type | Description |
|---|---|
float
|
The required crop side length, in size-matched pixels, per instance. Instances whose centroid is undefined are skipped. |
Source code in sleap_nn/data/instance_cropping.py
make_centered_bboxes(centroids, box_height, box_width)
¶
Create centered bounding boxes around centroid.
To be used with kornia.geometry.transform.crop_and_resizein the following
(clockwise) order: top-left, top-right, bottom-right and bottom-left.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
centroids
|
Tensor
|
A tensor of centroids with shape (n_centroids, 2), where n_centroids is the number of centroids, and the last dimension represents x and y coordinates. |
required |
box_height
|
int
|
The desired height of the bounding boxes. |
required |
box_width
|
int
|
The desired width of the bounding boxes. |
required |
Returns:
| Type | Description |
|---|---|
Tensor
|
torch.Tensor: A tensor containing bounding box coordinates for each centroid. The output tensor has shape (n_centroids, 4, 2), where n_centroids is the number of centroids, and the second dimension represents the four corner points of the bounding boxes, each with x and y coordinates. The order of the corners follows a clockwise arrangement: top-left, top-right, bottom-right, and bottom-left. |