
    kh                        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y)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                  t        |      D cg c]+  }| |   j	                  dddd      j                  |d|g      - c}d      }t        j                  t        |      D cg c]+  }||   j	                  dddd      j                  |ddg      - c}d      }t        j                  |j                  |d      d|      \  }	}
|
|z  }|
|z  }t        j                  |d|j                  d      j                  ddd            }t        j                  |d|j                  d      j                  dd|            }t        j                  |d|j                  d            }||||fS c c}w c c}w )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         r      )dimk)
shapetorchcatrangepermutereshapetopkgather	unsqueezeexpand)r   r   r   r   r   
batch_sizelevelcls_outputs_allbox_outputs_all_cls_topk_indices_allindices_allclasses_allbox_outputs_all_after_topkcls_outputs_all_after_topks                  H/var/www/teggl/fontify/venv/lib/python3.12/site-packages/effdet/bench.py_post_processr,      s   . Q%%a(Jii:&!( 	E""1aA.66
B7TU!()*,O ii:&!( 	E""1aA.66
B7JK!()*,O $jj)@)@R)PVW[opA '+5K&4K!&K11!4;;BAF"H "'K11!4;;BKP"R!&"A{'<'<Q'?"A &'A;P[[[-!(!(s   0F
0Fr!   	img_scaleimg_sizemax_det_per_imagesoft_nmsc
                     g }
t        |       D ]E  }|d n||   }|d n||   }t        ||   ||   |||   ||   ||||		      }|
j                  |       G t        j                  |
d      S )Nr/   r0   r   )r   )r   r	   appendr   stack)r!   	class_outbox_outanchor_boxesindicesclassesr-   r.   r/   r0   batch_detectionsiimg_scale_i
img_size_i
detectionss                  r+   _batch_detectionr?   E   s     : ,'/dYq\%-T8A;
(aLAJAJAJ/


 	
+, ;;'Q//    c                   P     e Zd Z fdZddeeeej                  f      fdZ	 xZ
S )DetBenchPredictc                    t         t        |           || _        |j                  | _        |j                  j
                  | _        |j                  j                  | _        t        j                  |j                        | _	        |j                  j                  | _
        |j                  j                  | _        |j                  j                  | _        y N)superrB   __init__modelconfigr   r   r   from_configanchorsr   r/   r0   )selfrG   	__class__s     r+   rF   zDetBenchPredict.__init__b   s    ot-/
ll,,11 <<33**5<<8$)LL$E$E!!&!?!?--r@   img_infoc                 H   | j                  |      \  }}t        ||| j                  | j                  | j                        \  }}}}|d\  }}n
|d   |d   }}t        |j                  d   ||| j                  j                  ||||| j                  | j                  
      S )Nr   r   r   )NNr-   r.   r   r2   )rG   r,   r   r   r   r?   r   rJ   boxesr/   r0   )	rK   xrM   r5   r6   r8   r9   r-   r.   s	            r+   forwardzDetBenchPredict.forwardm   s    !ZZ]	7/<((!%!:!:0
,	7GW ",Ix"*;"7*9MxIGGAJLL"44]]
 	
r@   rD   )__name__
__module____qualname__rF   r   r   strr   TensorrR   __classcell__rL   s   @r+   rB   rB   a   s'    	.
8Dell1B,C#D 
r@   rB   c                   J     e Zd Zd fd	Zdeeej                  f   fdZ xZ	S )DetBenchTrainc                 D   t         t        |           || _        |j                  | _        |j                  j
                  | _        |j                  j                  | _        t        j                  |j                        | _	        |j                  j                  | _
        |j                  j                  | _        |j                  j                  | _        d | _        |r't        | j                  | j                  d      | _        t        |j                        | _        y )Ng      ?)match_threshold)rE   r[   rF   rG   rH   r   r   r   rI   rJ   r   r/   r0   anchor_labelerr   r
   loss_fn)rK   rG   create_labelerrL   s      r+   rF   zDetBenchTrain.__init__   s    mT+-
ll,,11 <<33**5<<8$)LL$E$E!!&!?!?--""/   ##D
 %U\\2r@   targetc                    | j                  |      \  }}| j                  \d|v sJ t        | j                        D cg c]
  }|d|     }}t        | j                        D cg c]
  }|d|     }}|d   }n&| j                  j	                  |d   |d         \  }}}| j                  |||||      \  }	}
}|	|
|d}| j                  st        ||| j                  | j                  | j                        \  }}}}t        |j                  d   ||| j                  j                  |||d	   |d
   | j                  | j                  
      |d<   |S c c}w c c}w )Nlabel_num_positives
label_cls_label_bbox_bboxcls)loss
class_lossbox_lossrO   r   r-   r.   r2   r>   )rG   r^   r   r   batch_label_anchorsr_   trainingr,   r   r   r?   r   rJ   rP   r/   r0   )rK   rQ   ra   r5   r6   lcls_targetsbox_targetsnum_positivesrh   ri   rj   outputclass_out_pp
box_out_ppr8   r9   s                    r+   rR   zDetBenchTrain.forward   s   !ZZ]	7&(F222=B4??=ST6Jqc"23TKT>CDOO>TU6Ks"34UKU"#89M6:6I6I6]6]vu73Km
 &*\\&
"j( jhO}}9F?? ,,%)%>%>:6L*gw $4
""{#z""&"8"8$F<  M UUs   E&E)T)
rS   rT   rU   rF   r   rV   r   rW   rR   rX   rY   s   @r+   r[   r[      s"    3&+c5<<&7!8 +r@   r[   c                     t        | d      rt        | j                        S t        | d      rt        | j                        S | S )NmodulerG   )hasattrunwrap_benchru   rG   )rG   s    r+   rw   rw      s;     uhELL))		 EKK((r@   )i  )NNd   F)__doc__typingr   r   r   r   torch.nnnnrJ   r   r   r	   rh   r
   rW   intr,   jitscriptboolr?   ModulerB   r[   rw    r@   r+   <module>r      s   ( '   @ @  %).\%,,'.\%,,'.\ .\ 	.\
 ".\b  -1+/!$00ELL)0 5<<(0 	0
 0 06$
bii $
N?BII ?Dr@   