U Php+@sdZddlmZddlZddlmZddlZddlmZddlm Z m Z m Z m Z m Z ddlmZddddd d d ZGd d d ZdS)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_optionr)gt_boxes proposalsweightsreturnc Cs:|jd|jdkrtdtt|ddgd}t|sBtdt|sRtdt|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 | s.t | r6td |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$Y/home/dell461/cl/sdc2/HISourceFinder-master-l/src/monai/apps/detection/utils/box_coder.py encode_boxes@s, && r&c@sleZdZdZdddddddZd d d d d d Zdddd ddZdd ddddZddddddZdS)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 NzSequence[float]z float | NoneNone)r boxes_xform_cliprcCs:|dkrtd}tt|ddgd|_||_||_dS)Ng@O@rrr)mathrr rr"r r))selfr r)r$r$r%__init__}s  zBoxCoder.__init__zSequence[Tensor]z tuple[Tensor])r r rcCsNdd|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)r7r8r as_tensorr r&)r+r r r7r8r r#r$r$r%r2s  zBoxCoder.encode_single) rel_codesreference_boxesrcCst|trt|tjstddd|D}tjt|dd}d}|D] }||7}qF|dkrh||d}|||}|dkr||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)sizer-r$r$r%r0sz#BoxCoder.decode..rrr) isinstancerrrrrr1reshape decode_singler")r+r:r;r4 concat_boxesbox_sumval pred_boxesr$r$r%decodes    zBoxCoder.decodecCs||j}|jd}g}t|ttd}t|jD]2}|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 | s*t | r2tdt jd| j| jd| } || | || | q2|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`` r=rN)maxzpred_whd_axis is NaN or Inf.g?r6rrr)tor7rrrrranger"r rclamprr)exprr r!rtensorr8appendstackflatten)r+r:r;offsetrDZ boxes_cccwhdaxisZwhd_axisZ ctr_xyz_axisZ dxyz_axisZ dwhd_axisZpred_ctr_xyx_axisZ pred_whd_axisZc_to_c_whd_axisZpred_boxes_finalr$r$r%r@s,   ,$  zBoxCoder.decode_single)N) __name__ __module__ __qualname____doc__r,r5r2rEr@r$r$r$r%r'is r')rT __future__rr*collections.abcrrrmonai.data.box_utilsrrrrr monai.utils.moduler r&r'r$r$r$r%.s    )