U
    ¯Ê¹jD+  ã                   @   sL  d Z ddl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mZ d	gZG d
d„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd	„ d	ejƒZd+edœdd„Zedd d!d"d#d$d%eed&d'd(œ
iƒZed,d)d*„ƒZdS )-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)
é    )ÚpartialN)ÚIMAGENET_INCEPTION_MEANÚIMAGENET_INCEPTION_STD)Úcreate_classifierÚConvNormActé   )Úbuild_model_with_cfg)Úregister_modelÚgenerate_default_cfgsÚInceptionV4c                       s(   e Zd Zef‡ fdd„	Zdd„ Z‡  ZS )ÚMixed3ac                    s4   t t| ƒ ¡  tjddd�| _|ddddd�| _d S )Né   é   ©Ústrideé@   é`   ©Úkernel_sizer   )Úsuperr   Ú__init__ÚnnÚ	MaxPool2dÚmaxpoolÚconv©ÚselfÚ
conv_block©Ú	__class__© úW/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/inception_v4.pyr      s    zMixed3a.__init__c                 C   s(   |   |¡}|  |¡}t ||fd¡}|S ©Nr   )r   r   ÚtorchÚcat©r   ÚxÚx0Úx1Úoutr    r    r!   Úforward   s    

zMixed3a.forward©Ú__name__Ú
__module__Ú__qualname__r   r   r*   Ú__classcell__r    r    r   r!   r      s   r   c                       s(   e Zd Zef‡ fdd„	Zdd„ Z‡  ZS )ÚMixed4ac                    s~   t t| ƒ ¡  t |ddddd�|dddd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 S )Né    r   r   r   r   r   ©r   é   ©r   r   ©r   r   Úpadding©r3   r   ©r   r   )r   r   )r   r0   r   r   Ú
SequentialÚbranch0Úbranch1r   r   r    r!   r       s    þüzMixed4a.__init__c                 C   s(   |   |¡}|  |¡}t ||fd¡}|S r"   )r:   r;   r#   r$   r%   r    r    r!   r*   /   s    

zMixed4a.forwardr+   r    r    r   r!   r0      s   r0   c                       s(   e Zd Zef‡ fdd„	Zdd„ Z‡  ZS )ÚMixed5ac                    s4   t t| ƒ ¡  |ddddd�| _tjddd�| _d S )NéÀ   r   r   r   r   )r   r<   r   r   r   r   r   r   r   r    r!   r   7   s    zMixed5a.__init__c                 C   s(   |   |¡}|  |¡}t ||fd¡}|S r"   )r   r   r#   r$   r%   r    r    r!   r*   <   s    

zMixed5a.forwardr+   r    r    r   r!   r<   6   s   r<   c                       s(   e Zd Zef‡ fdd„	Zdd„ Z‡  ZS )Ú
InceptionAc                    s¬   t t| ƒ ¡  |ddddd�| _t |ddddd�|dddddd�¡| _t |ddddd�|dddddd�|dddddd�¡| _t tjddddd	�|ddddd�¡| _	d S )
Né€  r   r   r   r   r   r5   F©r   r6   Zcount_include_pad)
r   r>   r   r:   r   r9   r;   Úbranch2Ú	AvgPool2dÚbranch3r   r   r    r!   r   D   s    þýþzInceptionA.__init__c                 C   s@   |   |¡}|  |¡}|  |¡}|  |¡}t ||||fd¡}|S r"   ©r:   r;   rA   rC   r#   r$   ©r   r&   r'   r(   Úx2Úx3r)   r    r    r!   r*   X   s    



zInceptionA.forwardr+   r    r    r   r!   r>   C   s   r>   c                       s(   e Zd Zef‡ fdd„	Zdd„ Z‡  ZS )Ú
ReductionAc              
      sj   t t| ƒ ¡  |ddddd�| _t |ddddd�|dddddd�|dd	ddd�¡| _tjddd
�| _d S )Nr?   r   r   r   r=   r   éà   r5   é   r   )	r   rH   r   r:   r   r9   r;   r   rA   r   r   r    r!   r   b   s    ýzReductionA.__init__c                 C   s4   |   |¡}|  |¡}|  |¡}t |||fd¡}|S r"   ©r:   r;   rA   r#   r$   ©r   r&   r'   r(   rF   r)   r    r    r!   r*   n   s
    


zReductionA.forwardr+   r    r    r   r!   rH   a   s   rH   c                       s(   e Zd Zef‡ fdd„	Zdd„ Z‡  ZS )Ú
InceptionBc                    sÜ   t t| ƒ ¡  |ddddd�| _t |ddddd�|dddddd	�|dd
ddd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	�¡| _t tjddddd�|ddddd�¡| _	d S )Né   r?   r   r   r=   rI   r2   r4   r5   rJ   r7   r8   r   Fr@   é€   )
r   rM   r   r:   r   r9   r;   rA   rB   rC   r   r   r    r!   r   w   s$    ýûþzInceptionB.__init__c                 C   s@   |   |¡}|  |¡}|  |¡}|  |¡}t ||||fd¡}|S r"   rD   rE   r    r    r!   r*   Ž   s    



zInceptionB.forwardr+   r    r    r   r!   rM   v   s   rM   c                       s(   e Zd Zef‡ fdd„	Zdd„ Z‡  ZS )Ú
ReductionBc                    sŽ   t t| ƒ ¡  t |ddddd�|ddddd�¡| _t |ddddd�|ddddd	d
�|dddddd
�|ddddd�¡| _tjddd�| _d S )NrN   r=   r   r   r   r   rJ   r2   r4   r5   i@  r7   r8   r   )	r   rP   r   r   r9   r:   r;   r   rA   r   r   r    r!   r   ˜   s    þüzReductionB.__init__c                 C   s4   |   |¡}|  |¡}|  |¡}t |||fd¡}|S r"   rK   rL   r    r    r!   r*   ©   s
    


zReductionB.forwardr+   r    r    r   r!   rP   —   s   rP   c                       s(   e Zd Zef‡ fdd„	Zdd„ Z‡  ZS )Ú
InceptionCc              	      sè   t 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ddd�| _
|ddd	dd
d�| _t tjddddd�|ddddd�¡| _d S )Né   rJ   r   r   r?   )r   r   )r   r   r5   )r   r   )r   r   iÀ  i   r   Fr@   )r   rQ   r   r:   Ú	branch1_0Ú
branch1_1aÚ
branch1_1bÚ	branch2_0Ú	branch2_1Ú	branch2_2Ú
branch2_3aÚ
branch2_3br   r9   rB   rC   r   r   r    r!   r   ²   s    þzInceptionC.__init__c                 C   sœ   |   |¡}|  |¡}|  |¡}|  |¡}t ||fd¡}|  |¡}|  |¡}|  |¡}	|  	|	¡}
|  
|	¡}t |
|fd¡}|  |¡}t ||||fd¡}|S r"   )r:   rS   rT   rU   r#   r$   rV   rW   rX   rY   rZ   rC   )r   r&   r'   Zx1_0Zx1_1aZx1_1br(   Zx2_0Zx2_1Zx2_2Zx2_3aZx2_3brF   rG   r)   r    r    r!   r*   Æ   s    









zInceptionC.forwardr+   r    r    r   r!   rQ   ±   s   rQ   c                       s|   e Zd Zd‡ fd	d
„	Zejjddd„ƒZejjddd„ƒZejjdd„ ƒZ	ddd„Z
dd„ Zd edœdd„Zdd„ Z‡  ZS )!r   éè  r   é    ç        ÚavgÚbatchnorm2dçü©ñÒMbP?Úreluc	           
   	      sd  t t| ƒ ¡  |dkst‚|| _d| _ttd||t|d�tdd�d�‰ ˆ |ddd	d
�ˆ ddddd
�ˆ dddddd�t	ˆ ƒt
ˆ ƒtˆ ƒg}	|	‡ fdd„tdƒD ƒ7 }	|	tˆ ƒg7 }	|	‡ fdd„tdƒD ƒ7 }	|	tˆ ƒg7 }	|	‡ fdd„tdƒD ƒ7 }	tj|	Ž | _tdd	dd�tdddd�tdddd�tdddd�tdddd�g| _t| j| j||d�\| _| _| _d S ) Nr\   rR   r   )ÚepsT)Zinplace)r6   Ú
norm_layerÚ	act_layerZnorm_kwargsZ
act_kwargsr   r   r   r   r   r5   c                    s   g | ]}t ˆ ƒ‘qS r    )r>   ©Ú.0Ú_©r   r    r!   Ú
<listcomp>ü   s     z(InceptionV4.__init__.<locals>.<listcomp>é   c                    s   g | ]}t ˆ ƒ‘qS r    )rM   re   rh   r    r!   ri   þ   s     r3   c                    s   g | ]}t ˆ ƒ‘qS r    )rQ   re   rh   r    r!   ri      s     z
features.2)Znum_chsZ	reductionÚmoduler1   z
features.3r?   é   z
features.9rN   é   zfeatures.17zfeatures.21)Ú	pool_typeÚ	drop_rate)r   r   r   ÚAssertionErrorÚnum_classesÚnum_featuresr   r   Údictr   r0   r<   ÚrangerH   rP   r   r9   ÚfeaturesZfeature_infor   Úglobal_poolÚ	head_dropÚlast_linear)
r   rq   Zin_chansZoutput_stridero   rv   rc   Znorm_epsrd   ru   r   rh   r!   r   Ü   sJ    ú
úû   ÿzInceptionV4.__init__Fc                 C   s   t ddd�S )Nz^features\.[012]\.z^features\.(\d+))ÚstemÚblocks)rs   )r   Zcoarser    r    r!   Úgroup_matcher  s    þzInceptionV4.group_matcherTc                 C   s   |rt dƒ‚d S )Nz$gradient checkpointing not supported)rp   )r   Úenabler    r    r!   Úset_grad_checkpointing  s    z"InceptionV4.set_grad_checkpointingc                 C   s   | j S ©N)rx   )r   r    r    r!   Úget_classifier  s    zInceptionV4.get_classifierc                 C   s$   || _ t| j| j |d�\| _| _d S )N)rn   )rq   r   rr   rv   rx   )r   rq   rv   r    r    r!   Úreset_classifier  s      ÿzInceptionV4.reset_classifierc                 C   s
   |   |¡S r~   )ru   ©r   r&   r    r    r!   Úforward_features   s    zInceptionV4.forward_features)Ú
pre_logitsc                 C   s&   |   |¡}|  |¡}|r|S |  |¡S r~   )rv   rw   rx   )r   r&   rƒ   r    r    r!   Úforward_head#  s    

zInceptionV4.forward_headc                 C   s   |   |¡}|  |¡}|S r~   )r‚   r„   r�   r    r    r!   r*   (  s    

zInceptionV4.forward)r[   r   r\   r]   r^   r_   r`   ra   )F)T)r^   )F)r,   r-   r.   r   r#   ZjitÚignorer{   r}   r   r€   r‚   Úboolr„   r*   r/   r    r    r   r!   r   Û   s&           ÷0

F)Úreturnc                 K   s   t t| |fdtdd�i|—ŽS )NZfeature_cfgT)Zflatten_sequential)r   r   rs   )ÚvariantÚ
pretrainedÚkwargsr    r    r!   Ú_create_inception_v4.  s    ýüûr‹   zinception_v4.tf_in1kztimm/r[   )r   é+  rŒ   )rl   rl   g      ì?Zbicubiczfeatures.0.convrx   )
Z	hf_hub_idrq   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationZmeanZstdZ
first_convÚ
classifierc                 K   s   t d| f|ŽS )NÚinception_v4)r‹   )r‰   rŠ   r    r    r!   r�   C  s    r�   )F)F)Ú__doc__Ú	functoolsr   r#   Ztorch.nnr   Z	timm.datar   r   Ztimm.layersr   r   Z_builderr   Ú	_registryr	   r
   Ú__all__ÚModuler   r0   r<   r>   rH   rM   rP   rQ   r   r‹   Zdefault_cfgsr�   r    r    r    r!   Ú<module>   sD   !*S
     ûÿ