o
    {i                     @   s>   d Z ddlZddlZdd Zdd Z	
dddZdddZdS )z3
Utilities for bounding box manipulation and GIoU.
    Nc                 C   sL   |  d\}}}}|d|  |d|  |d|  |d|  g}tj|ddS )N      ?dimunbindtorchstack)xx_cy_cwhb r   N/data/cameron/keygrip/volume_dino_tracks/dinov3/eval/detection/util/box_ops.pybox_cxcywh_to_xyxy   s   ,r   c                 C   sD   |  d\}}}}|| d || d || || g}tj|ddS )Nr      r   r   )r
   x0y0x1y1r   r   r   r   box_xyxy_to_cxcywh    s   $r   Mb?TF    c                 C   s(  |dd df }|ddd f }| dd df }	| ddd f }
|
| }t t |}|r?tj||| d}tj||d}n|j| |d}|	| }|
|  }||d  }||d  }tj||gdd}|r|d ur|dd	d df jd	d
j|d d |ddd df jd	d
j|d	 d |S )N.r   )maxmin)r   )r   r   r   r   r   r   )r      )npabslogr   clampexpcatclamp_)	proposalsdeltas	max_shapeZwh_ratio_clipZclip_borderZadd_ctr_clampZ	ctr_clampZdxyZdwhZpxyZpwhZdxy_wh	max_ratioZgxyZgwhZx1y1Zx2y2bboxesr   r   r   
delta2bbox&   s&   &&r*           r,   r,   r,         ?r.   r.   r.   c                 C   s   |   |  kr| d d d f } |d  }|  } | }| d\}}}}|d\}}	}
}|| |d  }|	| |d  }t|
|d  }t||d  }tj||||gdd}|dksc|dkr{||d}||d}||	|}|S )Nr   g?r   r+   r-   r   )
sizefloatr   r   r    r	   
new_tensor	unsqueezesub_div_)r%   gtmeansstdspxpypwphgxgygwghdxdydwdhr&   r   r   r   
bbox2deltaD   s"   rD   )Nr   TFr   )r+   r-   )__doc__numpyr   r   r   r   r*   rD   r   r   r   r   <module>   s   
