
    khn                        d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZ ddlZddlmZ ddlmc mZ ddlmZ 	 ddlmZmZmZ dd	lmZ dd
lmZmZm Z  dZ!dZ" ed      Z# G d dejH                        Z% G d dejL                        Z' G d dejL                        Z( G d dejL                        Z) G d dejH                        Z* G d dejL                        Z+ G d dejL                        Z, G d dejL                        Z- G d dejL                        Z. G d d ejL                        Z/d&d!Z0d&d"Z1d# Z2 G d$ d%ejL                        Z3y# e$ r ddlmZmZmZ Y !w xY w)'z PyTorch EfficientDet model

Based on official Tensorflow version at: https://github.com/google/automl/tree/master/efficientdet
Paper: https://arxiv.org/abs/1911.09070

Hacked together by Ross Wightman
    N)OrderedDict)partial)ListCallableOptionalUnionTuple)create_model)create_conv2dcreate_pool2dget_act_layer   )get_feat_sizes)get_fpn_configset_config_writeableset_config_readonlyFsiluc                   f     e Zd ZdZ fdZdeej                     deej                     fdZ xZ	S )SequentialListzI This module exists to work around torchscript typing issues list -> listc                 &    t        t        | 
  |  y N)superr   __init__)selfargs	__class__s     O/var/www/teggl/fontify/venv/lib/python3.12/site-packages/effdet/efficientdet.pyr   zSequentialList.__init__!   s    nd,d3    xreturnc                 $    | D ]
  } ||      } |S r    )r   r   modules      r   forwardzSequentialList.forward$   s     	Fq	A	r   )
__name__
__module____qualname____doc__r   r   torchTensorr$   __classcell__r   s   @r   r   r      s0    S4ell+ U\\0B r   r   c                   F     e Zd Zddddej                  ef fd	Zd Z xZS )ConvBnAct2dr    Fc
           	          t         t        |           t        |||||||      | _        |d n ||      | _        |	d | _        y  |	d      | _        y )N)stridedilationpaddingbiasTinplace)r   r.   r   r   convbnact)r   in_channelsout_channelskernel_sizer1   r2   r3   r4   
norm_layer	act_layerr   s             r   r   zConvBnAct2d.__init__+   s_     	k4)+!
	 %,$*\2J$,4)D2Ir   c                     | j                  |      }| j                  | j                  |      }| j                  | j                  |      }|S r   )r7   r8   r9   r   r   s     r   r$   zConvBnAct2d.forwardD   sB    IIaL77
A88Ar   )	r%   r&   r'   nnBatchNorm2d
_ACT_LAYERr   r$   r+   r,   s   @r   r.   r.   *   s&     ~~ J2r   r.   c            	       P     e Zd ZdZdddddddej
                  ef	 fd	Zd Z xZ	S )	SeparableConv2dz Separable Conv
       r   r/   F      ?c           	         t         t        |           t        |t	        ||z        ||||d      | _        t        t	        ||z        ||	||      | _        |
d n |
|      | _        |d | _        y  |d      | _        y )NT)r1   r2   r3   	depthwise)r3   r4   r5   )	r   rE   r   r   intconv_dwconv_pwr8   r9   )r   r:   r;   r<   r1   r2   r3   r4   channel_multiplierpw_kernel_sizer=   r>   r   s               r   r   zSeparableConv2d.__init__P   s     	ot-/$001
 %001
 %,$*\2J$,4)D2Ir   c                     | j                  |      }| j                  |      }| j                  | j                  |      }| j                  | j                  |      }|S r   )rK   rL   r8   r9   r@   s     r   r$   zSeparableConv2d.forwardr   sO    LLOLLO77
A88Ar   )
r%   r&   r'   r(   rA   rB   rC   r   r$   r+   r,   s   @r   rE   rE   M   s5     "~~  JDr   rE   c                   $    e Zd ZU dZg dZeed<   eee	e
e	e	f   f      ed<   eeee
eef   f      ed<   eed<   ee   ed<   	 	 	 	 ddeee	e
e	e	f   f      deeee
eef   f      deded	df
 fd
Zdej                  d	ej                  fdZ xZS )Interpolate2daw  Resamples a 2d Image

    The input data is assumed to be of the form
    `minibatch x channels x [optional depth] x [optional height] x width`.
    Hence, for spatial inputs, we expect a 4D Tensor and for volumetric inputs, we expect a 5D Tensor.

    The algorithms available for upsampling are nearest neighbor and linear,
    bilinear, bicubic and trilinear for 3D, 4D and 5D input Tensor,
    respectively.

    One can either give a :attr:`scale_factor` or the target output :attr:`size` to
    calculate the output size. (You cannot give both, as it is ambiguous)

    Args:
        size (int or Tuple[int] or Tuple[int, int] or Tuple[int, int, int], optional):
            output spatial sizes
        scale_factor (float or Tuple[float] or Tuple[float, float] or Tuple[float, float, float], optional):
            multiplier for spatial size. Has to match input size if it is a tuple.
        mode (str, optional): the upsampling algorithm: one of ``'nearest'``,
            ``'linear'``, ``'bilinear'``, ``'bicubic'`` and ``'trilinear'``.
            Default: ``'nearest'``
        align_corners (bool, optional): if ``True``, the corner pixels of the input
            and output tensors are aligned, and thus preserving the values at
            those pixels. This only has effect when :attr:`mode` is
            ``'linear'``, ``'bilinear'``, or ``'trilinear'``. Default: ``False``
    )sizescale_factormodealign_cornersnamerV   rR   rS   rT   rU   Nr    c                    t         t        |           t        |       j                  | _        || _        t        |t              rt        d |D              | _	        n|rt        |      nd | _	        || _        |dk(  rd | _        y || _        y )Nc              3   2   K   | ]  }t        |        y wr   )float).0factors     r   	<genexpr>z)Interpolate2d.__init__.<locals>.<genexpr>   s     %OeFm%Os   nearest)r   rQ   r   typer%   rV   rR   
isinstancetuplerS   rY   rT   rU   )r   rR   rS   rT   rU   r   s        r   r   zInterpolate2d.__init__   su     	mT+-J''		lE* %%O,%O OD7Cl 3D	%)Y%6TMr   inputc                     t        j                  || j                  | j                  | j                  | j
                  d      S )NF)recompute_scale_factor)FinterpolaterR   rS   rT   rU   )r   ra   s     r   r$   zInterpolate2d.forward   s9    }}IIII#(
 	
r   )NNr]   F)r%   r&   r'   r(   __constants__str__annotations__r   r   rJ   r	   rY   boolr   r)   r*   r$   r+   r,   s   @r   rQ   rQ   |   s    4 NM
I
5eCHo-.
//5eUl(;!;<==
ID>! ;?HL!"'J5eCHo!567J #5eUl0C)C#DEJ 	J
  J 
J"
U\\ 
ell 
r   rQ   c                   @     e Zd Zdddej                  ddf fd	Z xZS )ResampleFeatureMapr/   NFc                 <   t         t        |           |xs d}|xs d}|| _        || _        || _        || _        ||k7  r+| j                  dt        ||d||	r|nd |	 xs |
d              |d   |d   kD  r|d   |d   kD  r|dv r_t        |d   dz
  |d   z  dz         }t        |d   dz
  |d   z  dz         }||k(  r|dz   }|}n|dz   |dz   f}||f}t        ||||      }n7t        r$|d   |d   z  |d   |d   z  f}t        ||	      }nt        ||
      }| j                  d|       y |d   |d   k  s|d   |d   k  rXt        r4|d   |d   z  |d   |d   z  f}| j                  dt        ||	             y | j                  dt        ||
             y y )Nmaxr]   r7   r   )r<   r3   r=   r4   r>   r   )rm   avg)r<   r1   r3   )rS   rT   )rR   rT   
downsampleupsample)r   rk   r   r:   r;   
input_sizeoutput_size
add_moduler.   rJ   r   
_USE_SCALErQ   )r   r:   r;   rq   rr   pad_typero   rp   r=   apply_bnredundant_biasstride_size_hstride_size_wr<   r1   	down_instscaler   s                    r   r   zResampleFeatureMap.__init__   s     	 $02(5
(y&($&,&OO  !$-5z4%7" a=;q>)jmk!n.L^+ #Z]Q%6;q>$IA$M N #Z]Q%6;q>$IA$M N M1"/!"3K*F $11#4ma6G"HK+];F)*+V\fno	(^jm;[^jYZm=[\E -5z RI -;Z PIOOL)4!}{1~-AQ1O(^jm;[^jYZm=[\EOOJ5W_0`aOOJ;U]0^_ 2Pr   )r%   r&   r'   rA   rB   r   r+   r,   s   @r   rk   rk      s'     ~~ <` <`r   rk   c                   h     e Zd Zdddej                  dddf fd	Zdeej                     fdZ	 xZ
S )
FpnCombiner/   NFattnc                    t         t        |           || _        || _        t        j                         | _        t        |      D ]<  \  }}t        ||   d   |||   d   ||||||	|

      | j                  t        |      <   > |dk(  s|dk(  r9t        j                  t        j                  t        |            d      | _        y d | _        y )Nnum_chsrR   )rq   rr   ru   ro   rp   r=   rv   rw   r~   fastattnT)requires_grad)r   r}   r   inputs_offsetsweight_methodrA   
ModuleDictresample	enumeraterk   rg   	Parameterr)   oneslenedge_weights)r   feature_infofpn_channelsr   rr   ru   ro   rp   r=   apply_resample_bnrw   r   idxoffsetr   s                 r   r   zFpnCombine.__init__   s     	j$(*,*$^4 	KC);V$Y/'/7'!%!%*-*DMM#f+&	 F"mz&A "UZZN8K-L\` aD $Dr   r   c                    |d   j                   }g }t        | j                  | j                  j	                               D ]#  \  }}||   } ||      }|j                  |       % | j                  dk(  rLt        j                  | j                  j                  |      d      }t        j                  |d      |z  }n| j                  dk(  rt        j                  j                  | j                  j                  |            }	t        j                  |	      }
t        j                  t!        t#        |            D cg c]  }||   |	|   z  |
dz   z   c}d      }nK| j                  dk(  rt        j                  |d      }n$t%        d	j'                  | j                              t        j                  |d      }|S c c}w )
Nr   r~   )dtype)dimr   g-C6?sumzunknown weight_method {})r   zipr   r   valuesappendr   r)   softmaxr   tostackrA   
functionalrelur   ranger   
ValueErrorformat)r   r   r   nodesr   r   
input_nodenormalized_weightsoutr   weights_sumis               r   r$   zFpnCombine.forward"  s   !

 #D$7$79M9M9O P 	%FH6J!*-JLL$	%
 '!&t/@/@/C/C%/C/PVW!X++e,/AAC:-==--d.?.?.B.B.B.OPL))L1K++PUVYZ_V`Pab1%(\!_,v1EFbhjlC5(++e,C7>>t?Q?QRSSii$
 cs   G	)r%   r&   r'   rA   rB   r   r   r)   r*   r$   r+   r,   s   @r   r}   r}      s9     ~~#  $%Lell+ r   r}   c                        e Zd ZdZdej
                  dej
                  f fdZdeej                     dej                  fdZ
 xZS )Fnodez A simple wrapper used in place of nn.Sequential for torchscript typing
    Handles input type List[Tensor] -> output type Tensor
    combineafter_combinec                 F    t         t        |           || _        || _        y r   )r   r   r   r   r   )r   r   r   r   s      r   r   zFnode.__init__>  s    eT#%*r   r   r    c                 B    | j                  | j                  |            S r   )r   r   r@   s     r   r$   zFnode.forwardC  s    !!$,,q/22r   )r%   r&   r'   r(   rA   Moduler   r   r)   r*   r$   r+   r,   s   @r   r   r   :  sC    +		 +")) +
3ell+ 3 3r   r   c            
       n     e Zd Zddddej                  eddddf
 fd	Zdeej                     fdZ
 xZS )	
BiFpnLayer   r/   NFTc                    t         t        |           || _        ||j                  D cg c]  }t        |||d             c}z   }t        j                         | _        t        |j                        D ]  \  }}t        j                  dj                  ||             t        ||t        |d         ||d      ||||	|||d         }t        j                         }t        ||d|d|	|
	      }|r#||d
<   d |d<   |j!                  d |
d             |j!                  d|rt#        di |n
t%        di |       | j                  j'                  t)        ||              || d  | _        y c c}w )N
feat_levelr   rR   zfnode {} : {}r   r   )rr   ru   ro   rp   r=   r   rw   r   rF   Fr:   r;   r<   r3   r4   r=   r>   r4   r>   r9   Tr5   r7   )r   r   r"   )r   r   r   
num_levelsr   dictrA   
ModuleListfnoder   loggingdebugr   r}   r`   
Sequentialrs   rE   r.   r   r   r   )r   r   
feat_sizes
fpn_configr   r   ru   ro   rp   r=   r>   r   pre_actseparable_convrw   fcfpn_feature_infor   	fnode_cfgr   r   conv_kwargsr   s                         r   r   zBiFpnLayer.__init__H  s   " 	j$(*$'T^TdTd+fNPDJr,7G,HI+f f ]]_
%j&6&67 !	SLAyMM/00I>?  i 012&y'>?!%!%"3-'8G MMOM() %#K &4F#+/K(((	$0GH$$.6+6kNh\gNhj JJeG=QRC!	SF -j[];O+fs   E4r   c                 r    | j                   D ]  }|j                   ||              || j                   d  S r   )r   r   r   )r   r   fns      r   r$   zBiFpnLayer.forward  s9    ** 	BHHRUO	$//!#$$r   )r%   r&   r'   rA   rB   rC   r   r   r)   r*   r$   r+   r,   s   @r   r   r   G  sB     ~~ # ;<z%ell+ %r   r   c                   D     e Zd Z fdZdeej                     fdZ xZS )BiFpnc                    t         t        |           |j                  | _        |j                  xs t
        j                  }|j                  rt        |fi |j                  }t        |j                        xs t        }|j                  xs, t        |j                  |j                  |j                         }t#        |j$                  |j                         }||j                     }t        j&                         | _        t+        |j                        D ]  }|||j                  z      }	|t-        |      k  r||   d   }
|	||   d<   nt/        
|j0                  ||	|j2                  |j4                  |j6                  ||j8                  |j:                  
      | j(                  t=        |      <   |j0                  }
|j?                  tA        |
|	             |	} tC               | _"        t+        |jF                        D ]  }tI        jJ                  djM                  |             tO        ||||j0                  |j                  |j2                  |j4                  |j6                  |||jP                  |j8                  |jR                   |j:                        }| jD                  jU                  t=        |      |       |jV                  } y )	N)	min_level	max_level)r   r   rR   )
r:   r;   rq   rr   ru   ro   rp   r=   rv   rw   r   zbuilding cell {})r   r   r   r   r   ru   ro   rp   r=   r>   r   r   r   rw   ),r   r   r   r   r=   rA   rB   norm_kwargsr   r   act_typerC   r   r   fpn_namer   r   r   
image_sizer   r   r   r   rk   r   ru   downsample_typeupsample_typer   rw   rg   r   r   r   cellfpn_cell_repeatsr   r   r   r   r   conv_bn_relu_patternrs   r   )r   configr   r=   r>   r   r   prev_feat_sizelevel	feat_sizein_chsrep	fpn_layerr   s                r   r   zBiFpn.__init__  sq   eT#% ++&&8"..
 Bv/A/ABJ!&//2@j	&& U.OOv'7'76CSCS+U
 $F$5$5AQAQR
#F$4$456,,- 	'E"56+;+;#;<Is<((%e,Y7.7U#F+ -? &!'!4!4- )#__%55#11)#55#)#8#8-c%j)  ,,##Di$HI&N+	'. #$	001 	2CMM,33C89")%%#00!,,!11--%#%44"(":":"777%44I  II  S95$11L'	2r   r   c                     | j                   j                         D ]  }|j                   ||d                 | j                  |      }|S )Nr   )r   r   r   r   )r   r   r   s      r   r$   zBiFpn.forward  sD    ,,. 	&HHHXae_%	&IIaLr   )	r%   r&   r'   r   r   r)   r*   r$   r+   r,   s   @r   r   r     s    82tell+ r   r   c                   d    e Zd Z fdZej
                  j                         d        Zej
                  j                         deej                     deej                     fd       Z
deej                     deej                     fdZdeej                     deej                     fdZ xZS )HeadNetc                    t         t        |           |j                  | _        t	        |dd      | _        |j                  xs t        j                  }|j                  rt        |fi |j                  }t	        |dd       r|j                  n|j                  }t        |      xs t        }|j                  rt         nt"        }t%        |j&                  |j&                  d|j(                  |j*                  d d       }t        j,                  t/        |j0                        D cg c]
  } |d
i | c}      | _        t        j,                         | _        | j
                  rzt/        | j                        D ]a  }| j4                  j7                  t        j,                  t/        |j0                        D cg c]  } ||j&                         c}             c nt/        |j0                        D ]  }| j4                  j7                  t        j,                  t/        | j                        D cg c]3  }t        j8                  t;        d ||j&                        fg            5 c}               |d      | _        t?        |j@                        |jB                  z  }	t%        |j&                  ||	z  d|j(                  dd d 	      }
 |d
i |
| _"        y c c}w c c}w c c}w )Nhead_bn_level_firstFhead_act_typerF   )r:   r;   r<   r3   r4   r>   r=   r8   Tr5   r   r"   )#r   r   r   r   getattrbn_level_firstr=   rA   rB   r   r   r   r   r   rC   r   rE   r.   r   r   ru   rw   r   r   box_class_repeatsconv_repbn_repr   r   r   r9   r   aspect_ratios
num_scalespredict)r   r   num_outputsr=   r   r>   conv_fnr   _num_anchorspredict_kwargsr   s              r   r   zHeadNet.__init__  su   gt%' ++%f.CUK&&8"..
 Bv/A/ABJ+26?D+Q6''W]WfWf!(+9z	 &,%:%:/++,,OO&&
 uVMeMeGf&g!w'='=&gh
 mmo4??+ `""2===B6C[C[=\2^89Jv2232^ $_ `` 6334 7""2=="4??325 MM+jATAT6U/V.W"XY25 $6 77
 T* &../&2C2CC++${2OO
 00; 'h2^25s   'K :K%48K*c                 ,   t        j                         5  t        j                         }t	        t        | j                  d               D ]  }t        j                         }| j                  j                         D ]V  }||   }|j                  t        |t        j                        r|d   n t        j                  t        d|fg                   X |j                  |        | j                   | _        || _        ddd       y# 1 sw Y   yxY w)a@   Toggle the batchnorm layers between feature level first vs repeat first access pattern
        Limitations in torchscript require feature levels to be iterated over first.

        This function can be used to allow loading weights in the original order, and then toggle before
        jit scripting the model.
        r   r8   N)r)   no_gradrA   r   r   r   r   childrenr   r_   r   r   r   )r   
new_bn_repr   bn_firstrms         r   toggle_bn_level_firstzHeadNet.toggle_bn_level_first  s     ]]_ 	%J3t{{1~./ ,==?--/ wA!A OOJq"--,HAaDbmm\gjnpqirhs\tNuv	w
 !!(+, '+&9&9"9D$DK	% 	% 	%s   C,D

Dr   r    c                     g }t        | j                        D ]s  }||   }t        | j                  | j                        D ])  \  }} ||      } ||   |      }| j                  |      }+ |j                  | j                  |             u |S r   )r   r   r   r   r   r9   r   r   )r   r   outputsr   x_levelr7   r8   s          r   _forwardzHeadNet._forward  s    4??+ 	2EhGt{{; ,bw-#"U)G,((7+, NN4<<01	2 r   c                    g }t        | j                        D ]i  \  }}||   }t        | j                  |      D ]&  \  }} ||      } ||      }| j	                  |      }( |j                  | j                  |             k |S r   )r   r   r   r   r9   r   r   )r   r   r   r   r   r   r7   r8   s           r   _forward_level_firstzHeadNet._forward_level_first%  s    &t{{3 	2ME6hGv6 ,bw-W+((7+, NN4<<01	2 r   c                 ^    | j                   r| j                  |      S | j                  |      S r   )r   r   r   r@   s     r   r$   zHeadNet.forward0  s+    ,,Q//==##r   )r%   r&   r'   r   r)   jitignorer   r   r*   r   r   r$   r+   r,   s   @r   r   r     s    21h YY% %( YY	$u||, 	ell1C 	 		d5<<&8 	T%,,=O 	$ell+ $U\\0B $r   r   c                 t   dddfd	}dfd	}t        | t              ryd|v sd|v r || j                  j                  | j                  j                          || j
                  j                         | j
                  j                  d|v rD| j
                  j                  j                  j                  t        j                  d	              y| j
                  j                  j                  j                          y || j                  j                  | j                  j                          || j
                  j                         | j
                  j                  /| j
                  j                  j                  j                          yyyt        | t              r(d|v sd|v r| j                  j                  j                  j                  d
       | j                  j                  d|v rD| j                  j                  j                  j                  t        j                  d	              y| j                  j                  j                  j                          y || j                  j                         | j                  j                  /| j                  j                  j                  j                          yyyt        | t        j                         rJ| j                  j                  j                  d       | j                  j                  j                          yy)zG Weight initialization as per Tensorflow official implementations.
    c                    | j                         }|dk  rt        d      | j                  d      }| j                  d      }d}| j                         dkD  r| d   d   j                         }||z  }||z  }||z  }||fS )N   zNFan in and fan out can not be computed for tensor with fewer than 2 dimensionsr   r   )r   r   rR   numel)wgroups
dimensionsnum_input_fmapsnum_output_fmapsreceptive_field_sizefan_infan_outs           r   _fan_in_outz!_init_weight.<locals>._fan_in_out;  s    UUW
>mnn&&)66!9 557Q;#$Q47==?  #77"%99Fwr   c                      | |      \  }}|t        d||z   dz        z  }t        j                  d|z        }| j                  j	                  | |       y )NrG          @g      @)rm   mathsqrtdatauniform_)r  gainr  r	  r
  limitr  s         r   _glorot_uniformz%_init_weight.<locals>._glorot_uniformI  sT    %a0B')R/00		#*%	&r   c                      | |      \  }}|t        d|      z  }t        j                  |      }| j                  j	                  |       y )NrG   std)rm   r  r  r  normal_)r  r  r  r	  r
  r  r  s         r   _variance_scalingz'_init_weight.<locals>._variance_scalingO  sD    %a0B iio	3r   box_net	class_net)r  Nclass_net.predict     X@g{Gz?r  rG   )r   )r   r   )r_   rE   rK   weightr  rL   r4   r  fill_r  logzero_r.   r7   r  rA   rB   )r   nr  r  r  s       @r   _init_weightr#  7  s*   '
  !_%>[A-aii..qyy7G7GHaii../yy~~)&!+IINN''--txx8I/J.JKIINN''--/AII,,QYY5E5EFAII,,-yy~~)		##))+ * * 
A{	#>[A-FFMM&&3&/vv{{&&!+FFKK$$**DHH5F,G+GHFFKK$$**,AFFMM*vv{{&  &&( ' ' 
Ar~~	&	C 	 
'r   c                    t        | t        j                        r| j                  d   | j                  d   z  | j                  z  }|| j
                  z  }| j                  j                  j                  dt        j                  d|z               | j                  cd|v r:| j                  j                  j                  t        j                  d              y| j                  j                  j                          yyt        | t        j                        rJ| j                  j                  j                  d       | j                  j                  j                          yy)z Weight initialization alternative, based on EfficientNet bacbkone init w/ class bias addition
    NOTE: this will likely be removed after some experimentation
    r   r   r  Nr  r  rG   )r_   rA   Conv2dr<   r;   r  r  r  r  r  r  r4   r  r   r!  rB   )r   r"  r
  s      r   _init_weight_altr&  {  s     !RYY--"Q]]1%55FAHH	a3=!9:66"a'!!488,=#>">?!!#	 
 
Ar~~	&	C 	 
'r   c           	          t        | j                  t              r>t        | j                               D cg c]  \  }}t	        |d   |d          }}}|S | j                  j                  ddg      }|S c c}}w )Nr   	reduction)r   r(  )keys)r_   r   r   r   r   	get_dicts)backboner   fr   s       r   get_feature_infor-    s    (''2 "("7"7"9:<1 9;@< <   ,,66Y<T6U<s   A9c                        e Zd Zd fd	Zej
                  j                         dd       Zej
                  j                         d        Zd Z	 xZ
S )EfficientDetc                 L   t         t        |           || _        t	        | j                         t        |j                  fd| j                  j                  xs d|d|j                  | _	        t        | j                        }t        | j                  |      | _        t        | j                  | j                  j                        | _        t        | j                  d      | _        | j#                         D ]%  \  }}d|vs|rt%        ||       t'        ||       ' y )NT)r  rF      )features_onlyout_indices
pretrainedr   r1  r+  )r   r/  r   r   r   r
   backbone_namebackbone_indicesbackbone_argsr+  r-  r   fpnr   num_classesr  r  named_modulesr&  r#  )r   r   pretrained_backbonealternate_initr   r"  r   r   s          r   r   zEfficientDet.__init__  s    lD*,DKK($  
44A	*	

 ""
 (6l3 $++:Q:QRt{{:&&( 	'DAq"!$Q* A&	'r   c                 |   d}d}t        | j                         |d}|| j                  _        |d}|| j                  _        |d}|| j                  _        t        | j                         |rot        | j                  | j                  j                        | _        | j                  j                  d      D ]   \  }}|rt        ||       t        ||       " |r\t        | j                  d      | _        | j                  j                  d      D ]   \  }}|rt        ||       t        ||       " y y )NFTr5  r  )prefixr1  r  )r   r   r:  r   r   r   r   r  r;  r&  r#  r  )	r   r:  r   r   r=  reset_class_headreset_box_headr"  r   s	            r   
reset_headzEfficientDet.reset_head  s    T[[)"#&1DKK#$!N(5DKK%!!N%/DKK"DKK($T[[dkk>U>UVDN44K4H '1!$Q* A&	' "4;;A>DL22)2D '1!$Q* A&	' r   c                 l    | j                   j                          | j                  j                          y)zb Toggle the head batchnorm layers between being access with feature_level first vs repeat
        N)r  r   r  )r   s    r   toggle_head_bn_level_firstz'EfficientDet.toggle_head_bn_level_first  s$     	,,.**,r   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }||fS r   )r+  r9  r  r  )r   r   x_classx_boxs       r   r$   zEfficientDet.forward  sB    MM!HHQK..#Q~r   )TF)NNNF)r%   r&   r'   r   r)   r   r   rB  rD  r$   r+   r,   s   @r   r/  r/    sO    '. YY' '> YY- -r   r/  )r/   )4r(   r   r  collectionsr   	functoolsr   typingr   r   r   r   r	   r)   torch.nnrA   torch.nn.functionalr   rd   timmr
   timm.layersr   r   r   ImportErrortimm.models.layersanchorsr   r   r   r   r   _DEBUGrt   rC   r   r   r   r.   rE   rQ   rk   r}   r   r   r   r   r#  r&  r-  r/  r"   r   r   <module>rS     sE     #  9 9     OGG $ M M	
6"
R]]  "))  F,bii ,^;
BII ;
|>` >`B< <~
3BII 
3A% A%H@BII @Ff$bii f$RAH$	E299 EI  ONNOs   
E E+*E+