o  i+@s|dZddlmZddlZddlmZddlZddlmZddlm Z m Z m Z m Z m Z ddlmZdd dZGdddZdS)z This script is modified from torchvision to support N-D images, https://github.com/pytorch/vision/blob/main/torchvision/models/detection/_utils.py ) annotationsN)Sequence)Tensor) COMPUTE_DTYPECenterSizeMode StandardModeconvert_box_modeis_valid_box_values)look_up_optiongt_boxesr proposalsweightsreturnc Cs6|jd|jdkrtdtt|ddgd}t|s!tdt|s)tdt|ttd}t|ttd}|d |d|d d d |f|d d d |f|d d |d f}||d dt |d d |d f|d d |d f}t j ||fd d }t | st | rtd |S) a Encode a set of proposals with respect to some reference ground truth (gt) boxes. Args: gt_boxes: gt boxes, Nx4 or Nx6 torch tensor. The box mode is assumed to be ``StandardMode`` proposals: boxes to be encoded, Nx4 or Nx6 torch tensor. The box mode is assumed to be ``StandardMode`` weights: the weights for ``(cx, cy, w, h) or (cx,cy,cz, w,h,d)`` Return: encoded gt, target of box regression that is used to convert proposals into gt_boxes, Nx4 or Nx6 torch tensor. rz8gt_boxes.shape[0] should be equal to proposals.shape[0].z?gt_boxes is not valid. Please check if it contains empty boxes.z@proposals is not valid. Please check if it contains empty boxes.src_modedst_modeNdimztargets is NaN or Inf.)shape ValueErrorr lenr rrr unsqueezetorchlogcatisnananyisinf) r r r spatial_dimsZ ex_cccwhdZ gt_cccwhdZ targets_dxyzZ targets_dwhdtargetsr$f/home/dell461/cl/sdc2/last_ska_mid/HISourceFinder-master-l/src/monai/apps/detection/utils/box_coder.py encode_boxes@s, &&r&c@sDeZdZdZddd d ZdddZdddZdddZdddZdS) BoxCodera This class encodes and decodes a set of bounding boxes into the representation used for training the regressors. Args: weights: 4-element tuple or 6-element tuple boxes_xform_clip: high threshold to prevent sending too large values into torch.exp() Example: .. code-block:: python box_coder = BoxCoder(weights=[1., 1., 1., 1., 1., 1.]) gt_boxes = torch.tensor([[1,2,1,4,5,6],[1,3,2,7,8,9]]) proposals = gt_boxes + torch.rand(gt_boxes.shape) rel_gt_boxes = box_coder.encode_single(gt_boxes, proposals) gt_back = box_coder.decode_single(rel_gt_boxes, proposals) # We expect gt_back to be equal to gt_boxes Nr Sequence[float]boxes_xform_clip float | NonerNonecCs:|dur td}tt|ddgd|_||_||_dS)Ng@O@rrr)mathrr rr"r r))selfr r)r$r$r%__init__}s   zBoxCoder.__init__r Sequence[Tensor]r tuple[Tensor]cCsNdd|D}tjt|dd}tjt|dd}|||}||d}|S)a Encode a set of proposals with respect to some ground truth (gt) boxes. Args: gt_boxes: list of gt boxes, Nx4 or Nx6 torch tensor. The box mode is assumed to be ``StandardMode`` proposals: list of boxes to be encoded, each element is Mx4 or Mx6 torch tensor. The box mode is assumed to be ``StandardMode`` Return: A tuple of encoded gt, target of box regression that is used to convert proposals into gt_boxes, Nx4 or Nx6 torch tensor. cSsg|]}t|qSr$)r.0br$r$r% sz#BoxCoder.encode..rr)rrtuple encode_singlesplit)r-r r boxes_per_imageZconcat_gt_boxesZconcat_proposalsZconcat_targetsr#r$r$r%encodes    zBoxCoder.encodercCs.|j}|j}tj|j||d}t|||}|S)a Encode proposals with respect to ground truth (gt) boxes. Args: gt_boxes: gt boxes, Nx4 or Nx6 torch tensor. The box mode is assumed to be ``StandardMode`` proposals: boxes to be encoded, Nx4 or Nx6 torch tensor. The box mode is assumed to be ``StandardMode`` Return: encoded gt, target of box regression that is used to convert proposals into gt_boxes, Nx4 or Nx6 torch tensor. dtypedevice)r;r<r as_tensorr r&)r-r r r;r<r r#r$r$r%r6s   zBoxCoder.encode_single rel_codesreference_boxescCst|tr t|tjstddd|D}tjt|dd}d}|D]}||7}q#|dkr4||d}|||}|dkrH||dd|j }|S)a From a set of original reference_boxes and encoded relative box offsets, Args: rel_codes: encoded boxes, Nx4 or Nx6 torch tensor. reference_boxes: a list of reference boxes, each element is Mx4 or Mx6 torch tensor. The box mode is assumed to be ``StandardMode`` Return: decoded boxes, Nx1x4 or Nx1x6 torch tensor. The box mode will be ``StandardMode`` zInput arguments wrong type.cSsg|]}|dqS)r)sizer1r$r$r%r4sz#BoxCoder.decode..rrr) isinstancerrrrrr5reshape decode_singler")r-r>r?r8 concat_boxesbox_sumval pred_boxesr$r$r%decodes    zBoxCoder.decodecCs||j}|jd}g}t|ttd}t|jD]}|dd||jf}|dd|f}|dd|d|f|j|} |dd|j|d|f|j||j} t j | t |j d} | |dddf|dddf} t | |dddf} | | j} t | st | rtdt jd| j| jd| } || | || | q|ddd|d dd}t j|dd d }|S) a From a set of original boxes and encoded relative box offsets, Args: rel_codes: encoded boxes, Nx(4*num_box_reg) or Nx(6*num_box_reg) torch tensor. reference_boxes: reference boxes, Nx4 or Nx6 torch tensor. The box mode is assumed to be ``StandardMode`` Return: decoded boxes, Nx(4*num_box_reg) or Nx(6*num_box_reg) torch tensor. The box mode will to be ``StandardMode`` rArN)maxzpred_whd_axis is NaN or Inf.g?r:rrr)tor;rrrrranger"r rclamprr)exprr r!rtensorr<appendstackflatten)r-r>r?offsetrHZ boxes_cccwhdaxisZwhd_axisZ ctr_xyz_axisZ dxyz_axisZ dwhd_axisZpred_ctr_xyx_axisZ pred_whd_axisZc_to_c_whd_axisZpred_boxes_finalr$r$r%rDs0  ,$ zBoxCoder.decode_single)N)r r(r)r*rr+)r r/r r/rr0)r rr rrr)r>rr?r/rr)r>rr?rrr) __name__ __module__ __qualname____doc__r.r9r6rIrDr$r$r$r%r'is    r')r rr rr rrr)rX __future__rr,collections.abcrrrmonai.data.box_utilsrrrrr monai.utils.moduler r&r'r$r$r$r%s-     )