
    ^j;                     X   d 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ZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZmZ dgZ G d dej4                        Z G d dej4                        Z G d dej4                        Z G d dej4                        Z G d dej4                        Z G d dej4                        Z  G d dej4                        Z! G d dej4                        Z" G d dej4                        Z#d+de#fdZ$ edd d!d"d#d$d%eed&d'd(d)i      Z%ed+d*       Z&y),z Pytorch Inception-V4 implementation
Sourced from https://github.com/Cadene/tensorflow-model-zoo.torch (MIT License) which is
based upon Google's Tensorflow implementation and pretrained weights (Apache 2.0 License)
    )partial)ListOptionalTupleUnionTypeN)IMAGENET_INCEPTION_MEANIMAGENET_INCEPTION_STD)create_classifierConvNormAct   )build_model_with_cfg)feature_take_indices)register_modelgenerate_default_cfgsInceptionV4c                   L     e Zd Zeddfdeej                     f fdZd Z xZ	S )Mixed3aN
conv_blockc                     ||d}t         |           t        j                  dd      | _         |dddd|| _        y )Ndevicedtype      stridekernel_sizer   @   `   )super__init__nn	MaxPool2dmaxpoolconvselfr   r   r   dd	__class__s        c/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/inception_v4.pyr$   zMixed3a.__init__   sB     /||Aa0E1QE"E	    c                 z    | j                  |      }| j                  |      }t        j                  ||fd      }|S Nr   )r'   r(   torchcatr*   xx0x1outs        r-   forwardzMixed3a.forward    s5    \\!_YYq\iiR!$
r.   
__name__
__module____qualname__r   r   r%   Moduler$   r8   __classcell__r,   s   @r-   r   r      s*     +6		FRYY	Fr.   r   c                   L     e Zd Zeddfdeej                     f fdZd Z xZ	S )Mixed4aNr   c                    ||d}t         |           t        j                   |dddd| |dddd|      | _        t        j                   |dddd| |ddddd| |dddd	d| |dd
dd|      | _        y )Nr   r   r   r   r      r   r   r   r   paddingrD   r   r   r   )r   r   )   r!   r    )r!   r!   )r#   r$   r%   
Sequentialbranch0branch1r)   s        r-   r$   zMixed4a.__init__(   s     /}}>Aa>2>=1Q="=

 }}>Aa>2>R6!VRrRR6!VRrRB6!BrB	
r.   c                 z    | j                  |      }| j                  |      }t        j                  ||fd      }|S r0   )rL   rM   r1   r2   r3   s        r-   r8   zMixed4a.forward=   s5    \\!_\\!_iiR!$
r.   r9   r?   s   @r-   rA   rA   '   s(     +6	
RYY
*r.   rA   c                   L     e Zd Zeddfdeej                     f fdZd Z xZ	S )Mixed5aNr   c                     ||d}t         |            |dddd|| _        t        j                  dd      | _        y )Nr   r   r   r   r      rS   )r#   r$   r(   r%   r&   r'   r)   s        r-   r$   zMixed5a.__init__E   sB     /GQqGBG	||Aa0r.   c                 z    | j                  |      }| j                  |      }t        j                  ||fd      }|S r0   )r(   r'   r1   r2   r3   s        r-   r8   zMixed5a.forwardP   s5    YYq\\\!_iiR!$
r.   r9   r?   s   @r-   rP   rP   D   s(     +6		1RYY	1r.   rP   c                   L     e Zd Zeddfdeej                     f fdZd Z xZ	S )
InceptionANr   c                    ||d}t         |            |dddd|| _        t        j                   |d	ddd| |d
dddd|      | _        t        j                   |d	ddd| |d
dddd| |ddddd|      | _        t        j                  t        j                  dddd       |dddd|      | _        y )Nr   r   r   r   rF   Fr   rG   count_include_pad)  r"   )rZ   r!   r    )r"   r"   	r#   r$   rL   r%   rK   rM   branch2	AvgPool2dbranch3r)   s        r-   r$   zInceptionA.__init__X   s     /!IqIbI}}>Aa>2>H1QHRH

 }}>Aa>2>H1QHRHH1QHRH
 }}LL1a5I>Aa>2>
r.   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }t	        j
                  ||||fd      }|S r0   rL   rM   r\   r^   r1   r2   r*   r4   r5   r6   x2x3r7   s          r-   r8   zInceptionA.forwardr   T    \\!_\\!_\\!_\\!_iiRR(!,
r.   r9   r?   s   @r-   rV   rV   W   s(     +6	
RYY
4r.   rV   c                   L     e Zd Zeddfdeej                     f fdZd Z xZ	S )
ReductionANr   c           
          ||d}t         |            |dddd|| _        t        j                   |d	ddd| |d
dddd| |dddd|      | _        t        j                  dd      | _        y )Nr   r   r   r   r   rF   r   )rZ   rZ   )rZ   rS   rS      ri      )r#   r$   rL   r%   rK   rM   r&   r\   r)   s        r-   r$   zReductionA.__init__|   s     /!J!JrJ}}?Qq?B?JQq!JrJ?Qq?B?
 ||Aa0r.   c                     | j                  |      }| j                  |      }| j                  |      }t        j                  |||fd      }|S r0   rL   rM   r\   r1   r2   r*   r4   r5   r6   rb   r7   s         r-   r8   zReductionA.forward   D    \\!_\\!_\\!_iiRa(
r.   r9   r?   s   @r-   rf   rf   {   s(     +6	1RYY1$r.   rf   c                   L     e Zd Zeddfdeej                     f fdZd Z xZ	S )
InceptionBNr   c                    ||d}t         |            |dddd|| _        t        j                   |dddd| |ddddd| |ddddd|      | _        t        j                   |dddd| |ddddd| |ddddd| |ddddd| |ddddd|      | _        t        j                  t        j                  d	ddd
       |dddd|      | _        y )Nr   r   r   rC   rE   rF   rH   rI   r   FrX   )   rZ   rs   rS   rh   rj   rR   )ri   ri   )rs      r[   r)   s        r-   r$   zInceptionB.__init__   s*    /!K1KK}}@a@R@TVAvTQSTTVAvTQST
 }}@a@R@TVAvTQSTTVAvTQSTTVAvTQSTTVAvTQST
 }}LL1a5I@a@R@
r.   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }t	        j
                  ||||fd      }|S r0   r`   ra   s          r-   r8   zInceptionB.forward   rd   r.   r9   r?   s   @r-   rq   rq      s(     +6	
RYY
:r.   rq   c                   L     e Zd Zeddfdeej                     f fdZd Z xZ	S )
ReductionBNr   c                 D   ||d}t         |           t        j                   |dddd| |dddd|      | _        t        j                   |dddd| |ddddd| |dd	dd
d| |dddd|      | _        t        j                  dd      | _        y )Nr   r   r   r   r   rC   rE   rF   rH   rI   r   rt   rR   )rs   rk   )rk   rk   )rk   @  )rz   rz   )r#   r$   r%   rK   rL   rM   r&   r\   r)   s        r-   r$   zReductionB.__init__   s     /}}@a@R@?Qq?B?

 }}@a@R@TVAvTQSTTVAvTQST?Qq?B?	
 ||Aa0r.   c                     | j                  |      }| j                  |      }| j                  |      }t        j                  |||fd      }|S r0   rm   rn   s         r-   r8   zReductionB.forward   ro   r.   r9   r?   s   @r-   rx   rx      s(     +6	1RYY1.r.   rx   c                   L     e Zd Zeddfdeej                     f fdZd Z xZ	S )
InceptionCNr   c           	         ||d}t         |            |dddd|| _         |dddd|| _         |ddddd|| _         |ddddd|| _         |dddd|| _         |ddddd|| _         |ddddd|| _         |ddddd|| _	         |ddddd|| _
        t        j                  t        j                  d	ddd
       |dddd|      | _        y )Nr   r   r   )r   r   )r   r   rF   )r   r   )r   r   r   FrX   )   rk   )r   rZ   )rZ   rk   )rZ     )r      )r   rk   )r#   r$   rL   	branch1_0
branch1_1a
branch1_1b	branch2_0	branch2_1	branch2_2
branch2_3a
branch2_3br%   rK   r]   r^   r)   s        r-   r$   zInceptionC.__init__   s,    /!K1KK#M1QM"M$b6!U[b_ab$b6!U[b_ab#M1QM"M#a&TZa^`a#a&TZa^`a$b6!U[b_ab$b6!U[b_ab}}LL1a5I@a@R@
r.   c                    | j                  |      }| j                  |      }| j                  |      }| j                  |      }t	        j
                  ||fd      }| j                  |      }| j                  |      }| j                  |      }	| j                  |	      }
| j                  |	      }t	        j
                  |
|fd      }| j                  |      }t	        j
                  ||||fd      }|S r0   )rL   r   r   r   r1   r2   r   r   r   r   r   r^   )r*   r4   r5   x1_0x1_1ax1_1br6   x2_0x2_1x2_2x2_3ax2_3brb   rc   r7   s                  r-   r8   zInceptionC.forward   s    \\!_~~a %%YYu~q)~~a ~~d#~~d#%%YYu~q)\\!_iiRR(!,
r.   r9   r?   s   @r-   r}   r}      s(     +6	
RYY
4r.   r}   c                   .    e Zd Z	 	 	 	 	 	 	 	 	 	 ddededededededed	ed
df fdZej                  j                  dd       Z
ej                  j                  d d       Zej                  j                  d
ej                  fd       Zd!dedefdZ	 	 	 	 	 d"dej                   deeeee   f      dedededed
eeej                      eej                   eej                      f   f   fdZ	 	 	 d#deeee   f   dedefdZd ZddefdZd Z xZS )$r   Nnum_classesin_chansoutput_stride	drop_rateglobal_pool
norm_layernorm_eps	act_layerreturnc           
         |	|
d}t         |           |dk(  sJ || _        || _        dx| _        | _        t        t        d||t        |      t        d            } ||dfd	d
d| |dd	dd| |dd	ddd|t        |fi |t        |fi |t        |fi |g}|t        d      D cg c]  }t        |fi | c}z  }|t        |fi |gz  }|t        d      D cg c]  }t        |fi | c}z  }|t!        |fi |gz  }|t        d	      D cg c]  }t#        |fi | c}z  }t%        j&                  | | _        t        dd
d      t        ddd      t        ddd      t        ddd      t        ddd      g| _        t-        | j                  | j                  f||d|\  | _        | _        | _        y c c}w c c}w c c}w )Nr       r   r   )epsT)inplace)rG   r   r   norm_kwargs
act_kwargsr   r   r   r   r!   rF      rD   z
features.2)num_chs	reductionmodulerJ   z
features.3rZ      z
features.9rs      zfeatures.17zfeatures.21)	pool_typer   )r   r   )r   r!   )r#   r$   r   r   num_featureshead_hidden_sizer   r   dictr   rA   rP   rangerV   rf   rq   rx   r}   r%   rK   featuresfeature_infor   r   	head_droplast_linear)r*   r   r   r   r   r   r   r   r   r   r   r+   r   r   _r,   s                  r-   r$   zInceptionV4.__init__  s    /"""& 488D1!*D)

 xC1CC=1Q="=H1QHRHJ%"%J%"%J%"%
 	58DaZ
1b1DDZ
1b12258DaZ
1b1DDZ
1b12258DaZ
1b1DDx0q>,?,?MBMB
 >O>
 "	>

 >
:$.$*: EDDs   3G)GGc                     t        dd      S )Nz^features\.[012]\.z^features\.(\d+))stemblocks)r   )r*   coarses     r-   group_matcherzInceptionV4.group_matcherG  s    &&
 	
r.   c                     |rJ d       y )Nz$gradient checkpointing not supported )r*   enables     r-   set_grad_checkpointingz"InceptionV4.set_grad_checkpointingN  s    AAAz6r.   c                     | j                   S N)r   )r*   s    r-   get_classifierzInceptionV4.get_classifierR  s    r.   c                 p    || _         t        | j                  | j                   |      \  | _        | _        y )N)r   )r   r   r   r   r   )r*   r   r   s      r-   reset_classifierzInceptionV4.reset_classifierV  s3    &->t//;.H*$*r.   r4   indicesnorm
stop_early
output_fmtintermediates_onlyc                    |dv sJ d       g }| j                   D cg c]"  }t        |d   j                  d      d         $ }	}t        t	        |	      |      \  }
}|
D cg c]  }|	|   	 }
}|	|   }t
        j                  j                         s|s| j                  }n| j                  d|dz    }t        |      D ]#  \  }} ||      }||
v s|j                  |       % |r|S ||fS c c}w c c}w )a   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        Returns:

        )NCHWzOutput shape must be NCHW.r   .Nr   )r   intsplitr   lenr1   jitis_scriptingr   	enumerateappend)r*   r4   r   r   r   r   r   intermediatesinfo
stage_endstake_indices	max_indexistagesfeat_idxstages                   r-   forward_intermediatesz!InceptionV4.forward_intermediates[  s   * Y&D(DD&EIEVEVWTc$x...s3B78W
W"6s:"Pi/;<!
1<<y)	 99!!#:]]F]]>IM2F(0 	(OHeaA<'$$Q'	(
   -' X<s   'C,!C1
prune_norm
prune_headc                    | j                   D cg c]"  }t        |d   j                  d      d         $ }}t        t	        |      |      \  }}||   }| j
                  d|dz    | _        |r| j                  dd       |S c c}w )z@ Prune layers not required for specified intermediates.
        r   r   r   Nr   r    )r   r   r   r   r   r   r   )r*   r   r   r   r   r   r   r   s           r-   prune_intermediate_layersz%InceptionV4.prune_intermediate_layers  s     FJEVEVWTc$x...s3B78W
W"6s:"Piy)	ny1}5!!!R( Xs   'Bc                 $    | j                  |      S r   )r   r*   r4   s     r-   forward_featureszInceptionV4.forward_features  s    }}Qr.   
pre_logitsc                 p    | j                  |      }| j                  |      }|r|S | j                  |      S r   )r   r   r   )r*   r4   r   s      r-   forward_headzInceptionV4.forward_head  s8    QNN1q7D$4$4Q$77r.   c                 J    | j                  |      }| j                  |      }|S r   )r   r   r   s     r-   r8   zInceptionV4.forward  s'    !!!$a r.   )
  r   r   g        avgbatchnorm2dgMbP?reluNNF)T)r   )NFFr   F)r   FT)r:   r;   r<   r   floatstrr$   r1   r   ignorer   r   r%   r=   r   r   Tensorr   r   r   boolr   r   r   r   r   r8   r>   r?   s   @r-   r   r     s     $!#!$+"#7
7
 7
 	7

 7
 7
 7
 7
 7
 
7
r YY
 
 YYB B YY 		    HC Hc H 8<$$',* ||*  eCcN34*  	* 
 *  *  !%*  
tELL!5tELL7I)I#JJ	K* \ ./$#	3S	>*  	  8$ 8
r.   r   c                 >    t        t        | |fdt        d      i|S )Nfeature_cfgT)flatten_sequential)r   r   r   )variant
pretrainedkwargss      r-   _create_inception_v4r     s1     D1	
  r.   zinception_v4.tf_in1kztimm/r   )r   +  r   )r   r   g      ?bicubiczfeatures.0.convr   z
apache-2.0)	hf_hub_idr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierlicensec                     t        d| fi |S )Ninception_v4)r   )r   r   s     r-   r  r    s    
EfEEr.   r   )'__doc__	functoolsr   typingr   r   r   r   r   r1   torch.nnr%   	timm.datar	   r
   timm.layersr   r   _builderr   	_featuresr   	_registryr   r   __all__r=   r   rA   rP   rV   rf   rq   rx   r}   r   r   default_cfgsr  r   r.   r-   <module>r     s     5 5   E 6 * + </bii &bii :bii &! !H 6$ $N @- -`U")) Up  %=vI'0F'}	& 	 F Fr.   