
    Ng                     f   d Z ddlmZmZmZ ddlZddlmZ ddlm	Z	m
Z
mZ ddlmZ 	 ddeej                 d	eej                 d
ededef
dZej        j        	 	 	 	 ddedeej                 deej                 dedef
d            Z G d dej                  Z G d dej                  Zd ZdS )zH PyTorch EfficientDet support benches

Hacked together by Ross Wightman
    )OptionalDictListN   )AnchorsAnchorLabelergenerate_detections)DetectionLoss  cls_outputsbox_outputs
num_levelsnum_classesmax_detection_pointsc           	           d         j         d         t          j         fdt          |          D             d          }t          j        fdt          |          D             d          }t          j        |                    d          d|          \  }}|z  }	|z  }
t          j        |d|	                    d                              ddd                    }t          j        |d|	                    d                              dd                    }t          j        |d|
                    d                    }|||	|
fS )	ai  Selects top-k predictions.

    Post-proc code adapted from Tensorflow version at: https://github.com/google/automl/tree/master/efficientdet
    and optimized for PyTorch.

    Args:
        cls_outputs: an OrderDict with keys representing levels and values
            representing logits in [batch_size, height, width, num_anchors].

        box_outputs: an OrderDict with keys representing levels and values
            representing box regression targets in [batch_size, height, width, num_anchors * 4].

        num_levels (int): number of feature levels

        num_classes (int): number of output classes
    r   c                 x    g | ]6}|                              d ddd                              dg          7S )r         r   permutereshape).0level
batch_sizer   r   s     H/var/www/html/ai-engine/env/lib/python3.11/site-packages/effdet/bench.py
<listcomp>z!_post_process.<locals>.<listcomp>,   sW     !( !( !( 	E""1aA..66
B7TUU!( !( !(    r   c                 x    g | ]6}|                              d ddd                              ddg          7S )r   r   r   r   r      r   )r   r   r   r   s     r   r   z!_post_process.<locals>.<listcomp>0   sW     !( !( !( 	E""1aA..66
B7JKK!( !( !(r   r   )dimkr   r    )	shapetorchcatrangetopkr   gather	unsqueezeexpand)r   r   r   r   r   cls_outputs_allbox_outputs_all_cls_topk_indices_allindices_allclasses_allbox_outputs_all_after_topkcls_outputs_all_after_topkr   s   `` `         @r   _post_processr3      s   . Q%a(Ji !( !( !( !( !( !(:&&!( !( !()*, ,O i !( !( !( !( !(:&&!( !( !()*, ,O $j)@)@R)P)PVW[opppA '+5K&4K!&K11!44;;BAFF"H "H "'K11!44;;BKPP"R "R!&"A{'<'<Q'?'?"A "A &'A;P[[[r   d   Fr   	img_scaleimg_sizemax_det_per_imagesoft_nmsc
                    g }
t          |           D ]_}|d n||         }|d n||         }t          ||         ||         |||         ||         ||||		  	        }|
                    |           `t          j        |
d          S )Nr7   r8   r   )r!   )r&   r	   appendr$   stack)r   	class_outbox_outanchor_boxesindicesclassesr5   r6   r7   r8   batch_detectionsiimg_scale_i
img_size_i
detectionss                  r   _batch_detectionrG   E   s     : , ,'/ddYq\%-TT8A;
(aLAJAJAJ/

 

 


 	
++++;'Q////r   c                   R     e Zd Z fdZddeeeej        f                  fdZ	 xZ
S )DetBenchPredictc                 b   t          t          |                                            || _        |j        | _        |j        j        | _        |j        j        | _        t          j        |j                  | _	        |j        j
        | _
        |j        j        | _        |j        j        | _        d S N)superrI   __init__modelconfigr   r   r   from_configanchorsr   r7   r8   )selfrN   	__class__s     r   rM   zDetBenchPredict.__init__b   s    ot$$--///
l,1 <3*5<88$)L$E!!&!?-r   Nimg_infoc                 "   |                      |          \  }}t          ||| j        | j        | j                  \  }}}}|d\  }}n|d         |d         }}t          |j        d         ||| j        j        ||||| j	        | j
        
  
        S )Nr   r   r   )NNr5   r6   r   r:   )rN   r3   r   r   r   rG   r#   rQ   boxesr7   r8   )	rR   xrT   r=   r>   r@   rA   r5   r6   s	            r   forwardzDetBenchPredict.forwardm   s    !ZZ]]	7/<(!%!:0
 0
 0
,	7GW ",Ixx"*;"7*9MxIGAJL"4]
 
 
 	
r   rK   )__name__
__module____qualname__rM   r   r   strr$   TensorrY   __classcell__rS   s   @r   rI   rI   a   si        	. 	. 	. 	. 	.
 
8Del1B,C#D 
 
 
 
 
 
 
 
r   rI   c                   F     e Zd Zd fd	Zdeeej        f         fdZ xZ	S )DetBenchTrainTc                    t          t          |                                            || _        |j        | _        |j        j        | _        |j        j        | _        t          j        |j                  | _	        |j        j
        | _
        |j        j        | _        |j        j        | _        d | _        |r!t          | j	        | j        d          | _        t          |j                  | _        d S )Ng      ?)match_threshold)rL   rb   rM   rN   rO   r   r   r   rP   rQ   r   r7   r8   anchor_labelerr   r
   loss_fn)rR   rN   create_labelerrS   s      r   rM   zDetBenchTrain.__init__   s    mT""++---
l,1 <3*5<88$)L$E!!&!?-" 	"/  ## # #D
 %U\22r   targetc                 l   |                      |          \  }}| j        Odv sJ fdt          | j                  D             }fdt          | j                  D             }d         }n+| j                            d         d                   \  }}}|                     |||||          \  }}	}
||	|
d}| j        sot          ||| j        | j        | j	                  \  }}}}t          |j        d         ||| j        j        ||d	         d
         | j        | j        
  
        |d<   |S )Nlabel_num_positivesc                 &    g | ]}d |          S )
label_cls_ r   lrh   s     r   r   z)DetBenchTrain.forward.<locals>.<listcomp>   s'    TTT6"2q"2"23TTTr   c                 &    g | ]}d |          S )label_bbox_rm   rn   s     r   r   z)DetBenchTrain.forward.<locals>.<listcomp>   s'    UUU6"3"3"34UUUr   bboxcls)loss
class_lossbox_lossrV   r   r5   r6   r:   rF   )rN   re   r&   r   batch_label_anchorsrf   trainingr3   r   r   rG   r#   rQ   rW   r7   r8   )rR   rX   rh   r=   r>   cls_targetsbox_targetsnum_positivesrt   ru   rv   outputclass_out_pp
box_out_ppr@   rA   s     `             r   rY   zDetBenchTrain.forward   s   !ZZ]]	7&(F2222TTTTU4?=S=STTTKUUUUeDO>T>TUUUK"#89MM6:6I6]6]vu7 73Km
 &*\\&
 &
"j( jhOO} 	9F? ,%)%>: : :6L*gw $4
"{#z""&"8$ $ $F<  r   )T)
rZ   r[   r\   rM   r   r]   r$   r^   rY   r_   r`   s   @r   rb   rb      sd        3 3 3 3 3 3&+c5<&7!8 + + + + + + + +r   rb   c                     t          | d          rt          | j                  S t          | d          rt          | j                  S | S )NmodulerN   )hasattrunwrap_benchr   rN   )rN   s    r   r   r      sM     uh EL)))		 	  EK(((r   )r   )NNr4   F)__doc__typingr   r   r   r$   torch.nnnnrQ   r   r   r	   rt   r
   r^   intr3   jitscriptboolrG   ModulerI   rb   r   rm   r   r   <module>r      s    ( ' ' ' ' ' ' ' ' '        @ @ @ @ @ @ @ @ @ @       %).\ .\%,'.\%,'.\ .\ 	.\
 ".\ .\ .\ .\b  -1+/!$0 00EL)0 5<(0 	0
 0 0 0 06$
 $
 $
 $
 $
bi $
 $
 $
N? ? ? ? ?BI ? ? ?D    r   