
    Yh"                        d dl Z d dlmZ d dlmc mZ ddgZej        ej        ej	        fdZ
ej        ej        ej	        f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ddZ G d dej                  Z G d dej                  ZddZddZdS )    NMobileNetV3mobilenetv3c           
      r    t          j         || |d|dd           ||           |d                    S )N      FbiasTinplacenn
Sequential)inpoupstride
conv_layer
norm_layer
nlin_layers         u/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/easyocr/DBNet/backbones/mobilenetv3.pyconv_bnr   
   sK    =
3Q666
3
4         c           
      r    t          j         || |dddd           ||           |d                    S )Nr   r   Fr   Tr
   r   )r   r   r   r   r   s        r   conv_1x1_bnr      sK    =
3Q15111
3
4     r   c                   &     e Zd Zd fd	Zd Z xZS )HswishTc                 d    t          t          |                                            || _        d S N)superr   __init__r   selfr   	__class__s     r   r   zHswish.__init__   s*    fd$$&&&r   c                 J    |t          j        |dz   | j                  z  dz  S Ng      @r
   g      @Frelu6r   r!   xs     r   forwardzHswish.forward   s'    171r64<88882==r   T__name__
__module____qualname__r   r*   __classcell__r"   s   @r   r   r      sL             > > > > > > >r   r   c                   &     e Zd Zd fd	Zd Z xZS )HsigmoidTc                 d    t          t          |                                            || _        d S r   )r   r3   r   r   r    s     r   r   zHsigmoid.__init__$   s*    h&&(((r   c                 D    t          j        |dz   | j                  dz  S r$   r%   r(   s     r   r*   zHsigmoid.forward(   s"    wq2vt|444r99r   r+   r,   r1   s   @r   r3   r3   #   sL             : : : : : : :r   r3   c                   &     e Zd Zd fd	Zd Z xZS )SEModule   c           	      ^   t          t          |                                            t          j        d          | _        t          j        t          j        |||z  d          t          j        d          t          j        ||z  |d          t                                | _
        d S )Nr   Fr   Tr
   )r   r7   r   r   AdaptiveAvgPool2davg_poolr   LinearReLUr3   fc)r!   channel	reductionr"   s      r   r   zSEModule.__init__-   s    h&&(((,Q//-Igw)3%@@@GD!!!Ig*G%@@@JJ	
 
r   c                    |                                 \  }}}}|                     |                              ||          }|                     |                              ||dd          }||                    |          z  S )Nr   )sizer;   viewr>   	expand_as)r!   r)   bc_ys         r   r*   zSEModule.forward8   sn    VVXX
1aMM!!!!Q''GGAJJOOAq!Q''1;;q>>!!r   )r8   r,   r1   s   @r   r7   r7   ,   sL        	
 	
 	
 	
 	
 	
" " " " " " "r   r7   c                   $     e Zd Z fdZd Z xZS )Identityc                 V    t          t          |                                            d S r   )r   rJ   r   )r!   r?   r"   s     r   r   zIdentity.__init__@   s%    h&&(((((r   c                     |S r    r(   s     r   r*   zIdentity.forwardC   s    r   r,   r1   s   @r   rJ   rJ   ?   sG        ) ) ) ) )      r   rJ      c                 `    dd l }t          |                    | dz  |z            |z            S )Nr         ?)numpyintceil)r)   divisible_bynps      r   make_divisiblerV   G   s6    rwwq2v,--<===r   c                   &     e Zd Zd fd	Zd Z xZS )MobileBottleneckFREc                 P   t          t          |                                            |dv sJ |dv sJ |dz
  dz  }|dk    o||k    | _        t          j        }	t          j        }
|dk    rt          j        }n|dk    rt          }nt          |rt          }nt          }t	          j         |	||dddd	           |
|           |d
           |	||||||d           |
|           ||           |d
           |	||dddd	           |
|          	  	        | _        d S )N)r      )r      r   r[   rY   HSr   Fr   Tr
   )groupsr	   )r   rX   r   use_res_connectr   Conv2dBatchNorm2dr=   r   NotImplementedErrorr7   rJ   r   conv)r!   r   r   kernelr   expsenlpaddingr   r   r   SELayerr"   s                r   r   zMobileBottleneck.__init__M   sb   %%..000A:!#%{9sczY
^
::JJ4ZZJJ%% 	GGGMJsCAqu555JsOOJt$$$JsC5QQQJsOOGCLLJt$$$JsCAqu555JsOO
 
			r   c                 j    | j         r||                     |          z   S |                     |          S r   )r_   rc   r(   s     r   r*   zMobileBottleneck.forwardp   s2     	 tyy||##99Q<<r   )FrY   r,   r1   s   @r   rX   rX   L   sM        !
 !
 !
 !
 !
 !
F             r   rX   c                   ,     e Zd Zd	 fd	Zd Zd Z xZS )
r        皙?smallrP   c                    t          t          |                                            d}d}|dk    r0g dg dg dg dg dg dg d	g d
g dg dg dg dg dg dg dg}n1|dk    r$g dg dg dg dg dg dg dg dg dg dg dg}nt          |dz  dk    sJ |dk    rt	          ||z            n|}t          j        t          d|dt                    g          | _	        g | _
        |D ]\\  }	}
}}}}t	          ||z            }t	          |
|z            }| j	                            t          |||	||||                     |}]|dk    rt	          d |z            }| j	                            t          ||t                               | j	                            t          j        d!                     | j	                            t          j        ||d!d!d                     | j	                            t          d"#                     n|dk    rt	          d$|z            }| j	                            t          ||t                               | j	                            t          j        d!                     | j	                            t          j        ||d!d!d                     | j	                            t          d"#                     nt          t          j        t          j        |%          t          j        ||                    | _
        |                                  d S )&N   i   large)r   rq   rq   FrY   r   )r   @      FrY   r[   )r   H   rt   FrY   r   )r\   ru   (   TrY   r[   )r\   x   rv   TrY   r   )r      P   Fr]   r[   )r      ry   Fr]   r   )r      ry   Fr]   r   )r   i  p   Tr]   r   )r     r|   Tr]   r   )r\   r}      Tr]   r[   )r\     r~   Tr]   r   ro   )r   rq   rq   TrY   r[   )r   ru   rt   FrY   r[   )r   X   rt   FrY   r   )r\   `   rv   Tr]   r[   )r\   rx   rv   Tr]   r   )r\   rw   0   Tr]   r   )r\      r   Tr]   r   )r\   i   r   Tr]   r[   )r\   @  r   Tr]   r       r   rP   r   r[   )r   r   r   Tr
   r   )p)r   r   r   rb   rV   r   
ModuleListr   r   features
classifierappendrX   r   r:   r`   r   Dropoutr<   _initialize_weights)r!   n_class
input_sizedropoutmode
width_multinput_channellast_channelmobile_settingkre   rF   rf   rg   soutput_channelexp_channel	last_convr"   s                     r   r   zMobileNetV3.__init__x   s   k4  ))+++7?? .--------------------------------------------!NN$ W__ .--------------------------------NN &% B!####DNQTDTDT~lZ&?@@@Zfwq-v'V'V'V&WXX %3 	+ 	+ AsAr2q+A
N;;N(z)9::KM  !1-QRTUWbdfhj!k!klll*MM 7??&sZ'788IM  ]IRX!Y!Y!YZZZM  !5a!8!8999M  9lAq!!L!LMMMM  !5!5!56666W__&sZ'788IM  ]IRX!Y!Y!YZZZM  !5a!8!8999M  9lAq!!L!LMMMM  !5!5!56666%% -J!!!IlG,,
 

 	  """""r   c                     d\  }}}}t          d          D ];} | j        |         |          }|dk    r|}!|dk    r|}*|dk    r|}3|dk    r|}<||||fS )zbx = self.features(x)
        x = x.mean(3).mean(2)
        x = self.classifier(x)
        return x)NNNN   r         rq   )ranger   )r!   r)   x2x3x4x5stages          r   r*   zMobileNetV3.forward   s    
 0BB2YY 		 		E$e$Q''Azz!""2r2~r   c                    |                                  D ]=}t          |t          j                  rRt          j                            |j        d           |j        $t          j                            |j                   ot          |t          j	                  rIt          j        
                    |j                   t          j                            |j                   t          |t          j                  rQt          j                            |j        dd           |j        $t          j                            |j                   ?d S )Nfan_out)r   r   g{Gz?)modules
isinstancer   r`   initkaiming_normal_weightr	   zeros_ra   ones_r<   normal_)r!   ms     r   r   zMobileNetV3._initialize_weights   s    	+ 	+A!RY'' 
+''y'AAA6%GNN16***Ar~.. +ah'''qv&&&&Ary)) +!T2226%GNN16***	+ 	+r   )rl   rm   rn   ro   rP   )r-   r.   r/   r   r*   r   r0   r1   s   @r   r   r   w   sb        R# R# R# R# R# R#h  $+ + + + + + +r   Fc                 |    t          dddi|}| r+t          j        d          }|                    |d           |S )Nr   rr   zmobilenetv3_large.pth.tarTstrictrM   r   torchloadload_state_dict
pretrainedkwargsmodel
state_dicts       r   mobilenet_v3_larger      sP    //W///E 7Z ;<<
j666Lr   c                 |    t          dddi|}| r+t          j        d          }|                    |d           |S )Nr   ro   zmobilenetv3_small_67.4.pth.tarTr   rM   r   r   s       r   mobilenet_v3_smallr      sP    //W///E 7Z @AA
j666Lr   )rN   )F)r   torch.nnr   torch.nn.functional
functionalr&   __all__r`   ra   r=   r   r   Moduler   r3   r7   rJ   rV   rX   r   r   r   rM   r   r   <module>r      s                   -
( *,r~Z\Za     &(Y2>VXV]    > > > > >RY > > >: : : : :ry : : :" " " " "ry " " "&    ry   > > > >
(  (  (  (  ( ry (  (  ( Vt+ t+ t+ t+ t+") t+ t+ t+n        r   