21
21
from torch .testing ._comparison import BooleanPair , NonePair , not_close_error_metas , NumberPair , TensorLikePair
22
22
from torchvision import io , tv_tensors
23
23
from torchvision .transforms ._functional_tensor import _max_value as get_max_value
24
- from torchvision .transforms .v2 .functional import clamp_bounding_boxes , to_image , to_pil_image
24
+ from torchvision .transforms .v2 .functional import to_image , to_pil_image
25
25
26
26
27
27
IN_OSS_CI = any (os .getenv (var ) == "true" for var in ["CIRCLECI" , "GITHUB_ACTIONS" ])
@@ -410,6 +410,7 @@ def make_bounding_boxes(
410
410
canvas_size = DEFAULT_SIZE ,
411
411
* ,
412
412
format = tv_tensors .BoundingBoxFormat .XYXY ,
413
+ clamping_mode = "soft" ,
413
414
num_boxes = 1 ,
414
415
dtype = None ,
415
416
device = "cpu" ,
@@ -423,13 +424,6 @@ def sample_position(values, max_value):
423
424
format = tv_tensors .BoundingBoxFormat [format ]
424
425
425
426
dtype = dtype or torch .float32
426
- int_dtype = dtype in (
427
- torch .uint8 ,
428
- torch .int8 ,
429
- torch .int16 ,
430
- torch .int32 ,
431
- torch .int64 ,
432
- )
433
427
434
428
h , w = (torch .randint (1 , s , (num_boxes ,)) for s in canvas_size )
435
429
y = sample_position (h , canvas_size [0 ])
@@ -456,31 +450,19 @@ def sample_position(values, max_value):
456
450
elif format is tv_tensors .BoundingBoxFormat .XYXYXYXY :
457
451
r_rad = r * torch .pi / 180.0
458
452
cos , sin = torch .cos (r_rad ), torch .sin (r_rad )
459
- x1 = torch . round ( x ) if int_dtype else x
460
- y1 = torch . round ( y ) if int_dtype else y
461
- x2 = torch . round ( x1 + w * cos ) if int_dtype else x1 + w * cos
462
- y2 = torch . round ( y1 - w * sin ) if int_dtype else y1 - w * sin
463
- x3 = torch . round ( x2 + h * sin ) if int_dtype else x2 + h * sin
464
- y3 = torch . round ( y2 + h * cos ) if int_dtype else y2 + h * cos
465
- x4 = torch . round ( x1 + h * sin ) if int_dtype else x1 + h * sin
466
- y4 = torch . round ( y1 + h * cos ) if int_dtype else y1 + h * cos
453
+ x1 = x
454
+ y1 = y
455
+ x2 = x1 + w * cos
456
+ y2 = y1 - w * sin
457
+ x3 = x2 + h * sin
458
+ y3 = y2 + h * cos
459
+ x4 = x1 + h * sin
460
+ y4 = y1 + h * cos
467
461
parts = (x1 , y1 , x2 , y2 , x3 , y3 , x4 , y4 )
468
462
else :
469
463
raise ValueError (f"Format { format } is not supported" )
470
464
out_boxes = torch .stack (parts , dim = - 1 ).to (dtype = dtype , device = device )
471
- if tv_tensors .is_rotated_bounding_format (format ):
472
- # The rotated bounding boxes are not guaranteed to be within the canvas by design,
473
- # so we apply clamping. We also add a 2 buffer to the canvas size to avoid
474
- # numerical issues during the testing
475
- buffer = 4
476
- out_boxes = clamp_bounding_boxes (
477
- out_boxes , format = format , canvas_size = (canvas_size [0 ] - buffer , canvas_size [1 ] - buffer )
478
- )
479
- if format is tv_tensors .BoundingBoxFormat .XYWHR or format is tv_tensors .BoundingBoxFormat .CXCYWHR :
480
- out_boxes [:, :2 ] += buffer // 2
481
- elif format is tv_tensors .BoundingBoxFormat .XYXYXYXY :
482
- out_boxes [:, :] += buffer // 2
483
- return tv_tensors .BoundingBoxes (out_boxes , format = format , canvas_size = canvas_size )
465
+ return tv_tensors .BoundingBoxes (out_boxes , format = format , canvas_size = canvas_size , clamping_mode = clamping_mode )
484
466
485
467
486
468
def make_detection_masks (size = DEFAULT_SIZE , * , num_masks = 1 , dtype = None , device = "cpu" ):
0 commit comments