
    Ngn                        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 n# e$ r ddlmZmZmZ Y nw xY w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j$                  Z% G d dej&                  Z' G d dej&                  Z( G d dej&                  Z) G d dej$                  Z* G d dej&                  Z+ G d dej&                  Z, G d dej&                  Z- G d dej&                  Z. G d d ej&                  Z/d'd"Z0d'd#Z1d$ Z2 G d% d&ej&                  Z3dS )(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                   ^     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                 B     t          t          |           j        |  d S N)superr   __init__)selfargs	__class__s     O/var/www/html/ai-engine/env/lib/python3.11/site-packages/effdet/efficientdet.pyr   zSequentialList.__init__!   s#    ,nd##,d3333    xreturnc                 &    | D ]} ||          }|S r    )r   r   modules      r   forwardzSequentialList.forward$   s%     	 	Fq		AAr   )
__name__
__module____qualname____doc__r   r   torchTensorr$   __classcell__r   s   @r   r   r      sn        SS4 4 4 4 4el+ U\0B        r   r   c                   <     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 n |	d          | _        d S )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  ))+++!
 
 
	 %,$$**\2J2J$,44))D2I2I2Ir   c                     |                      |          }| j        |                     |          }| j        |                     |          }|S r   )r7   r8   r9   r   r   s     r   r$   zConvBnAct2d.forwardD   sD    IIaLL7

A8Ar   )	r%   r&   r'   nnBatchNorm2d
_ACT_LAYERr   r$   r+   r,   s   @r   r.   r.   *   sh         ~ J J J J J J2      r   r.   c            	       F     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           	      P   t          t          |                                            t          |t	          ||z            ||||d          | _        t          t	          ||z            ||	||          | _        |
d n
 |
|          | _        |d n |d          | _        d S )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1
 
 
 %0011
 
 
 %,$$**\2J2J$,44))D2I2I2Ir   c                     |                      |          }|                     |          }| j        |                     |          }| j        |                     |          }|S r   )rK   rL   r8   r9   r@   s     r   r$   zSeparableConv2d.forwardr   sS    LLOOLLOO7

A8Ar   )
r%   r&   r'   r(   rA   rB   rC   r   r$   r+   r,   s   @r   rE   rE   M   s|          "~  J  J  J  J  J  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   NnearestFr    c                 Z   t          t          |                                            t          |           j        | _        || _        t          |t                    rt          d |D                       | _	        n|rt          |          nd | _	        || _        |dk    rd n|| _        d S )Nc              3   4   K   | ]}t          |          V  d S r   )float).0factors     r   	<genexpr>z)Interpolate2d.__init__.<locals>.<genexpr>   s(      %O%OeFmm%O%O%O%O%O%Or   rW   )r   rQ   r   typer%   rV   rR   
isinstancetuplerS   rZ   rT   rU   )r   rR   rS   rT   rU   r   s        r   r   zInterpolate2d.__init__   s     	mT""++---JJ'		lE** 	N %%O%O,%O%O%O O OD7C Ml 3 3 3D	%)Y%6%6TTM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   s7    }II#(
 
 
 	
r   )NNrW   F)r%   r&   r'   r(   __constants__str__annotations__r   r   rJ   r	   rZ   boolr   r)   r*   r$   r+   r,   s   @r   rQ   rQ   |   sd         4 NMMM
III
5eCHo-.
////5eUl(;!;<====
IIID>!!! ;?HL!"'J J5eCHo!567J #5eUl0C)C#DEJ 	J
  J 
J J J J J J"
U\ 
el 
 
 
 
 
 
 
 
r   rQ   c                   6     e Zd Zdddej        ddf fd	Z xZS )ResampleFeatureMapr/   NFc                 J   t          t          |                                            |pd}|pd}|| _        || _        || _        || _        ||k    r1|                     dt          ||d||	r|nd |	 p|
d                      |d         |d         k    r|d         |d         k    r|dv rxt          |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          ||||          }nLt          r4|d         |d         z  |d         |d         z  f}t          ||	          }nt          ||
          }|                     d|           d S |d         |d         k     s|d         |d         k     rwt          rI|d         |d         z  |d         |d         z  f}|                     dt          ||	                     d S |                     dt          ||
                     d S d S )NmaxrW   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0222(5
(y&($&,&&OO  !$-5?zz4%7"     a=;q>))jmk!n.L.L^++ #Z]Q%6;q>$IA$M N N #Z]Q%6;q>$IA$M N N M11"/!"3K*FF $11#4ma6G"HK+];F)*+V\fnooo		 Q(^jm;[^jYZm=[\E -5z R R RII -;Z P P PIOOL)44444!}{1~--AQ1O1O `(^jm;[^jYZm=[\EOOJ5W_0`0`0`aaaaaOOJ;U]0^0^0^_____ 2P1Or   )r%   r&   r'   rA   rB   r   r+   r,   s   @r   rk   rk      s]         ~ <` <` <` <` <` <` <` <` <` <`r   rk   c                   Z     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 ]K\  }}t          ||         d         |||         d         ||||||	|

  
        | j        t          |          <   L|dk    s|dk    r<t          j        t          j        t          |                    d          | _        d S d | _        d S )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4 	 	KC);V$Y/'/7'!%!%*-* * *DM#f++&& F""mz&A&A "UZN8K8K-L-L\` a a aD $Dr   r   c                 p  	
 |d         j         }g 	t          | j        | j                                                  D ]-\  }}||         } ||          }	                    |           .| j        dk    rIt          j        | j	        
                    |          d          }t          j        	d          |z  }n| j        dk    rt          j                            | j	        
                    |                    t          j                  
t          j        	
fdt!          t#          	                    D             d          }nI| j        dk    rt          j        	d          }n't%          d	                    | j                            t          j        |d          }|S )
Nr   r~   )dtype)dimr   c                 >    g | ]}|         |         z  d z   z  S )g-C6?r"   )r[   ir   nodesweights_sums     r   
<listcomp>z&FpnCombine.forward.<locals>.<listcomp>1  s0    bbb1%(\!_,v1EFbbbr   sumzunknown weight_method {})r   zipr   r   valuesappendr   r)   softmaxr   tostackrA   
functionalrelur   ranger   
ValueErrorformat)r   r   r   r   r   
input_nodenormalized_weightsoutr   r   r   s           @@@r   r$   zFpnCombine.forward"  s   !
 #D$79M9M9O9O P P 	% 	%FH6J!*--JLL$$$$''!&t/@/C/C%/C/P/PVW!X!X!X+e,,,/AACC:--=--d.?.B.B.B.O.OPPL)L11K+bbbbbbPUVYZ_V`V`PaPabbbhjl l lCC5((+e,,,CC7>>t?QRRSSSi$$$
r   )r%   r&   r'   rA   rB   r   r   r)   r*   r$   r+   r,   s   @r   r}   r}      sy         ~#  $% $% $% $% $% $%Lel+        r   r}   c                   p     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                 r    t          t          |                                            || _        || _        d S r   )r   r   r   r   r   )r   r   r   r   s      r   r   zFnode.__init__>  s4    eT##%%%*r   r   r    c                 R    |                      |                     |                    S r   )r   r   r@   s     r   r$   zFnode.forwardC  s     !!$,,q//222r   )r%   r&   r'   r(   rA   Moduler   r   r)   r*   r$   r+   r,   s   @r   r   r   :  s         +	 +") + + + + + +
3el+ 3 3 3 3 3 3 3 3 3r   r   c            
       `     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                 D   t          t          |                                            || _        |fd|j        D             z   }t          j                    | _        t          |j                  D ]\  }}t          j
        d                    ||                     t          |t          |d                   |d                  ||||	|||d                   }t          j                    }t          d|d|	|
	          }|r*||d
<   d |d<   |                    d |
d                     |                    d|rt#          di |nt%          di |           | j                            t)          ||                     || d          | _        d S )Nc                 J    g | ]}t          |d                              S )
feat_levelr   rR   dict)r[   fc
feat_sizesr   s     r   r   z'BiFpnLayer.__init__.<locals>.<listcomp>\  sC     +f +f +fNPDJr,7G,HIII+f +f +fr   zfnode {} : {}r   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   rA   
ModuleListfnoder   loggingdebugr   r}   r`   
Sequentialr   rs   rE   r.   r   r   r   )r   r   r   
fpn_configr   r   ru   ro   rp   r=   r>   r   pre_actseparable_convrw   fpn_feature_infor   	fnode_cfgr   r   conv_kwargsr   s     ` `                r   r   zBiFpnLayer.__init__H  s   " 	j$((***$' +f +f +f +f +fT^Td+f +f +f f ]__
%j&677 !	S !	SLAyM/00I>>???  i 0122&y'>?!%!%"3-'8  G MOOM() %#  K  I&4F#+/K(((		$0G0G0GHHH$$.h66+666kNhNh\gNhNhj j j JeG=QQQRRRR,j[]];r   r   c                 r    | j         D ] }|                     ||                     !|| j         d          S r   )r   r   r   )r   r   fns      r   r$   zBiFpnLayer.forward  sB    * 	 	BHHRRUUOOOO$/!##$$r   )r%   r&   r'   rA   rB   rC   r   r   r)   r*   r$   r+   r,   s   @r   r   r   G  s         ~ # ;< ;< ;< ;< ;< ;<z%el+ % % % % % % % %r   r   c                   @     e Zd Z fdZdeej                 fdZ xZS )BiFpnc                    t          t          |                                            |j        | _        |j        pt
          j        }|j        rt          |fi |j        }t          |j
                  pt          }|j        p t          |j        |j        |j                  }t#          |j        |j                  }||j                 }t          j                    | _        t+          |j                  D ]}|||j        z            }	|t-          |          k     r||         d         }
|	||         d<   nwt/          |
|j        ||	|j        |j        |j        ||j        |j        
  
        | j        t=          |          <   |j        }
|                    tA          |
|	                     |	}tC                      | _"        t+          |j#                  D ]}tI          j%        d&                    |                     tO          ||||j        |j        |j        |j        |j        |||j(        |j        |j)         |j                  }| j"        *                    t=          |          |           |j+        }d S )	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__  s   eT##%%% +&8".
 	C BBv/ABBJ!&/22@j	& U.Ov'76CS+U +U +U
 $F$5AQRRR
#F$456,-- 	' 	'E"56+;#;<Is<((((%e,Y7.7U#F++ -? &!'!4- )#_%5#1)#5#)#8- - -c%jj)  ,##Di$H$H$HIII&NN"$$	011 	2 	2CM,33C88999")%%#0!,!1-%#%4"(":"77%4  I  I  S9555$1LL'	2 	2r   r   c                     | j                                         D ]&}|                     ||d                              '|                     |          }|S )Nr   )r   r   r   r   )r   r   r   s      r   r$   zBiFpn.forward  sT    ,,.. 	& 	&HHHXXae__%%%%IIaLLr   )	r%   r&   r'   r   r   r)   r*   r$   r+   r,   s   @r   r   r     s[        82 82 82 82 82tel+        r   r   c                   T    e Zd Z fdZej                                        d             Ze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        pt          j        
j	        rt          
fi j	        
t	          dd           rj        nj        }t          |          pt          }j        rt           nt"          t%          j        j        dj        j        d d           	t          j        	fdt/          j                  D                       | _        t          j                    | _        | j        rct/          | j                  D ]M}| j                            t          j        
fdt/          j                  D                                  Nnbt/          j                  D ]M}| j                            t          j        
fdt/          | j                  D                                  N |d	
          | _        t;          j                  j        z  }t%          j        ||z  dj        d	d d           } di || _         d S )Nhead_bn_level_firstFhead_act_typerF   )r:   r;   r<   r3   r4   r>   r=   c                      g | ]
} d i S )r"   r"   )r[   _conv_fnr   s     r   r   z$HeadNet.__init__.<locals>.<listcomp>  s)    &g&g&g!ww'='='='=&g&g&gr   c                 0    g | ]} j                   S r"   )r   r[   r   r   r=   s     r   r   z$HeadNet.__init__.<locals>.<listcomp>  s9     2^ 2^ 2^89JJv2332^ 2^ 2^r   c           
      t    g | ]4}t          j        t          d  j                  fg                    5S )r8   )rA   r   r   r   r   s     r   r   z$HeadNet.__init__.<locals>.<listcomp>  sP     25 25 25 M+jjAT6U6U/V.W"X"XYY25 25 25r   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   r9   r   aspect_ratios
num_scalespredict)r   r   num_outputsr   r>   r   num_anchorspredict_kwargsr   r   r=   r   s    `      @@@r   r   zHeadNet.__init__  s   gt%%''' +%f.CUKK&8".
 	C BBv/ABBJ+26?D+Q+Qf6''W]Wf!(++9z	 &,%:K//+,O&
 
 
 &g&g&g&g&guVMeGfGf&g&g&ghh
 moo 	74?++ ` `""2= 2^ 2^ 2^ 2^ 2^=B6C[=\=\2^ 2^ 2^ $_ $_ ` ` ` `` 6344 7 7""2= 25 25 25 25 25"4?3325 25 25 $6 $6 7 7 7 7 9T*** &.//&2CC+${2O
 
 
 w0000r   c                 J   t          j                    5  t          j                    }t	          t          | j        d                             D ]}t          j                    }| j                                        D ]c}||         }|                    t          |t          j
                  r|d         n#t          j
        t          d|fg                               d|                    |           | j         | _        || _        ddd           dS # 1 swxY w Y   dS )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  sP    ]__ 	% 	%J3t{1~..// , ,=??--// w wA!A OOJq"-,H,H$uAaDDbm\gjnpqirhs\t\tNuNuvvvv!!(++++&*&9"9D$DK	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%s   C7DDDr   r    c                 :   g }t          | j                  D ]}||         }t          | j        | j                  D ]6\  }} ||          } ||         |          }|                     |          }7|                    |                     |                     |S r   )r   r   r   r   r   r9   r   r   )r   r   outputsr   x_levelr7   r8   s          r   _forwardzHeadNet._forward  s    4?++ 	2 	2EhGt{;; , ,b$w--#"U)G,,((7++NN4<<001111r   c                 *   g }t          | j                  D ]{\  }}||         }t          | j        |          D ]0\  }} ||          } ||          }|                     |          }1|                    |                     |                     ||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3 	2 	2ME6hGv66 , ,b$w--"W++((7++NN4<<001111r   c                 d    | j         r|                     |          S |                     |          S r   )r   r  r  r@   s     r   r$   zHeadNet.forward0  s3     	$,,Q///==###r   )r%   r&   r'   r   r)   jitignorer   r   r*   r  r  r$   r+   r,   s   @r   r   r     s       21 21 21 21 21h Y% % %( Y	$u|, 	el1C 	 	 	 		d5<&8 	T%,=O 	 	 	 	$el+ $U\0B $ $ $ $ $ $ $ $r   r   r/   c                 (   dddfd	}dfd	}t          | t                    rd|v sd|v r || j        j        | j        j                    || j        j                   | j        j        bd	|v r9| j        j        j                            t          j
        d
                      dS | j        j        j                                         dS dS  || j        j        | j        j                    || j        j                   | j        j        %| j        j        j                                         dS dS t          | t                    rd|v sd|v r| j        j        j                            d           | j        j        bd	|v r9| j        j        j                            t          j
        d
                      dS | j        j        j                                         dS dS  || j        j                   | j        j        %| j        j        j                                         dS dS t          | t          j                  r?| j        j                            d           | j        j                                         dS dS )zG Weight initialization as per Tensorflow official implementations.
    r   c                 B   |                                  }|dk     rt          d          |                     d          }|                     d          }d}|                                  dk    r | d         d                                         }||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    UUWW
>>mnnn&&))66!99 5577Q;;#$Q47==??  #77"%99Fwr   c                      | |          \  }}|t          d||z   dz            z  }t          j        d|z            }| j                            | |           d S )NrG          @g      @)rm   mathsqrtdatauniform_)r  gainr  r  r  limitr  s         r   _glorot_uniformz%_init_weight.<locals>._glorot_uniformI  sg    %+a00B')R/000	#*%%	&&&&&r   c                      | |          \  }}|t          d|          z  }t          j        |          }| j                            |           d S )NrG   std)rm   r  r  r  normal_)r  r  r  r  r  r  r  s         r   _variance_scalingz'_init_weight.<locals>._variance_scalingO  sU    %+a00B ioo	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--ai.qy7GHHHHai.///y~)&!++IN'--tx8I/J/J.JKKKKKIN'--/////	 *) OAI,QY5EFFFFOAI,---y~)	#))+++++ *)	A{	#	# >>[A--FM&&3&///v{&&!++FK$**DH5F,G,G+GHHHHHFK$**,,,,,	 '& OAFM***v{& &&((((( '&	Ar~	&	& 	C   	 r   c                 r   t          | t          j                  r| j        d         | j        d         z  | j        z  }|| j        z  }| j        j                            dt          j
        d|z                       | j        Xd|v r4| j        j                            t          j        d                      dS | j        j                                         dS dS t          | t          j                  r?| j        j                            d           | j        j                                         dS dS )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"    !RY -"Q]1%55FAH	a3=!9!9:::6"a''!!48,=#>#>">?????!!#####	 
 
Ar~	&	& 	C   	 r   c                     t          | j        t                    r,d t          |                                           D             }n| j                            ddg          }|S )Nc                 N    g | ]"\  }}t          |d          |d                   #S )r   	reduction)r   r1  r   )r[   r   fs      r   r   z$get_feature_info.<locals>.<listcomp>  sA     < < <1 9;@@@< < <r   r   r1  )keys)r_   r   r   r   	get_dicts)backboner   s     r   get_feature_infor6    sr    ('22 V< <!("7"7"9"9::< < <
  ,66Y<T6UUr   c                        e Zd Zd fd	Zej                                        d	d            Zej                                        d             Zd Z	 xZ
S )
EfficientDetTFc                 B   t          t          |                                            || _        t	          | j                   t          |j        fd| j        j        pd|d|j        | _	        t          | j	                  }t          | j        |          | _        t          | j        | j        j                  | _        t          | j        d          | _        |                                 D ],\  }}d|vr#|rt%          ||           t'          ||           -d S )NT)r	  rF      )features_onlyout_indices
pretrainedr   r:  r5  )r   r8  r   r   r   r
   backbone_namebackbone_indicesbackbone_argsr5  r6  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!!**,,,DK((($ 
4A	*	
 

 "
 
 (66l33 $+:QRRRt{:::&&(( 	' 	'DAq""! '$Q**** A&&&	' 	'r   Nc                 Z   d}d}t          | j                   |d}|| j        _        |d}|| j        _        |d}|| j        _        t          | j                   |rit          | j        | j        j                  | _        | j                            d          D ](\  }}|rt          ||           t          ||           )|r_t          | j        d          | _        | j                            d          D ]*\  }}|rt          ||           t          ||           )d S d S )NFTr>  r#  )prefixr:  r"  )r   r   rC  r   r   r   r   r#  rD  r.  r+  r"  )	r   rC  r   r   rF  reset_class_headreset_box_headr*  r   s	            r   
reset_headzEfficientDet.reset_head  sj    T[)))"#&1DK#$!N(5DK%!!N%/DK"DK((( 	'$T[dk>UVVVDN44K4HH ' '1! '$Q**** A&&&& 	'"4;A>>>DL22)2DD ' '1! '$Q**** A&&&&	' 	'' 'r   c                 j    | j                                          | j                                         dS )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  s2     	,,...**,,,,,r   c                     |                      |          }|                     |          }|                     |          }|                     |          }||fS r   )r5  rB  r#  r"  )r   r   x_classx_boxs       r   r$   zEfficientDet.forward  sL    MM!HHQKK..##Q~r   )TF)NNNF)r%   r&   r'   r   r)   r  r  rK  rM  r$   r+   r,   s   @r   r8  r8    s        ' ' ' ' ' '. Y' ' ' '> Y- - -      r   r8  )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.  r6  r8  r"   r   r   <module>r\     s      # # # # # #       9 9 9 9 9 9 9 9 9 9 9 9 9 9                      OGGGGGGGGGGG O O ONNNNNNNNNNNNO # # # # # # M M M M M M M M M M	
]6""
    R]            ")      F, , , , ,bi , , ,^;
 ;
 ;
 ;
 ;
BI ;
 ;
 ;
|>` >` >` >` >` >` >` >`B< < < < < < < <~
3 
3 
3 
3 
3BI 
3 
3 
3A% A% A% A% A% A% A% A%H@ @ @ @ @BI @ @ @Ff$ f$ f$ f$ f$bi f$ f$ f$RA A A AH   $	 	 	E E E E E29 E E E E Es   
A
 
AA