o
    0j0                     @   s   d dl mZmZ d dlZd dlmZ d dlm  mZ d dl	m
Z
 ddlmZmZ ddlmZ ddlmZmZ d	d
lm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eZdS )    )AnyListN)Constant   )add_inference_operations	benchmark   )ACT2FN)BatchNormHFStateDictMixinPretrainedModel   )HGNetV2Configc                       s&   e Zd Zd fdd	Zdd Z  ZS )HGNetV2LearnableAffineBlock      ?        c                    s>   t    | jdgt|dd| _| jdgt|dd| _d S )Nr   )value)shapeZdefault_initializer)super__init__Zcreate_parameterr   scalebias)selfZscale_valueZ
bias_value	__class__ /var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddlex/inference/models/image_classification/modeling/hgnetv2.pyr       s   
z$HGNetV2LearnableAffineBlock.__init__c                 C   s   | j | | j S N)r   r   r   hidden_stater   r   r   forward+   s   z#HGNetV2LearnableAffineBlock.forward)r   r   __name__
__module____qualname__r   r   __classcell__r   r   r   r   r      s    r   c                       s.   e Zd Z				d fdd	Zdd Z  ZS )	HGNetV2ConvLayerr   reluFc              	      st   t    tj||||||d d dd| _t|| _|d ur$t| nt | _	|r3|r3t
 | _d S t | _d S )Nr      F)kernel_sizestridegroupspaddingZ	bias_attr)r   r   nnZConv2DconvolutionZBatchNorm2Dnormalizationr	   Identity
activationr   lab)r   in_channelsout_channelsr(   r)   r*   r0   use_learnable_affine_blockr   r   r   r   0   s    


	zHGNetV2ConvLayer.__init__c                 C   s,   |  |}| |}| |}| |}|S r   )r-   r.   r0   r1   )r   inputr   r   r   r   r   M   s
   



zHGNetV2ConvLayer.forward)r   r   r&   Fr    r   r   r   r   r%   /   s    r%   c                       s(   e Zd Z	d fdd	Zdd Z  ZS )HGNetV2ConvLayerLightFc                    s6   t    t||dd |d| _t|||||d| _d S )Nr   )r(   r0   r4   )r(   r*   r4   )r   r   r%   conv1conv2)r   r2   r3   r(   r4   r   r   r   r   V   s   
zHGNetV2ConvLayerLight.__init__c                 C   s   |  |}| |}|S r   )r7   r8   r   r   r   r   r   i   s   

zHGNetV2ConvLayerLight.forward)Fr    r   r   r   r   r6   U   s    r6   c                       $   e Zd Z fddZdd Z  ZS )HGNetV2Embeddingsc                    s  t    t|jd |jd d|jd |j|jd| _t|jd |jd d d|jd |j|jd| _t|jd d |jd d|jd |j|jd| _	t|jd d |jd d|jd |j|jd| _
t|jd |jd d|jd |j|jd| _tjdddd| _|j| _d S )	Nr   r   r   )r(   r)   r0   r4   r'   r   T)r(   r)   Z	ceil_mode)r   r   r%   Zstem_channelsZstem_stridesZ
hidden_actr4   stem1stem2astem2bstem3stem4r,   Z	MaxPool2DpoolZnum_channelsr   configr   r   r   r   p   sV   
zHGNetV2Embeddings.__init__c                 C   sr   |  |}t|g d}| |}t|g d}| |}| |}tj||gdd}| |}| 	|}|S )N)r   r   r   r   r   Zaxis)
r;   Fpadr<   r=   r@   paddleconcatr>   r?   )r   pixel_valuesZ	embeddingZemb_stem_2aZ
pooled_embr   r   r   r      s   





zHGNetV2Embeddings.forwardr    r   r   r   r   r:   o   s    -r:   c                       s0   e Zd Z					d fdd	Zdd Z  ZS )	HGNetV2BasicLayerr   Fr   c
                    s   t    || _t | _t|D ]$}
|
dkr|n|}|r&t||||	d}n	t||||	dd}| j	| q|||  }t||d dd|	d}t|d |dd|	d}t
||| _|rdtj|d| _d S t | _d S )Nr   )r2   r3   r(   r4   r   )r2   r3   r(   r4   r)   r'   )r(   r)   r4   )p)r   r   residualr,   	LayerListlayersranger6   r%   appendZ
SequentialaggregationZDropoutr/   	drop_path)r   r2   Zmiddle_channelsr3   Z	layer_numr(   rK   light_blockrQ   r4   iZtemp_in_channelsblockZtotal_channelsZaggregation_squeeze_convZaggregation_excitation_convr   r   r   r      sP   

$zHGNetV2BasicLayer.__init__c                 C   sX   |}|g}| j D ]}||}|| qtj|dd}| |}| jr*| || }|S )Nr   rC   )rM   rO   rF   rG   rP   rK   rQ   )r   r   identityoutputlayerr   r   r   r      s   

zHGNetV2BasicLayer.forward)r   FFr   Fr    r   r   r   r   rI      s    8rI   c                       s&   e Zd Zd fdd	Zdd Z  ZS )HGNetV2Stager   c                    s   t    |j| }|j| }|j| }|j| }|j| }|j| }	|j| }
|j	| }|j
}|j| }|	rCt||d||d d| _nt | _g }t|D ]}|t|dkrY|n|||||dk||
||d	 qNt|| _d S )Nr   )r(   r)   r*   r0   r   )rK   r(   rR   rQ   r4   )r   r   stage_in_channelsZstage_mid_channelsstage_out_channelsZstage_num_blocksZstage_numb_of_layersZstage_downsampleZstage_light_blockZstage_kernel_sizer4   Zstage_downsample_stridesr%   
downsampler,   r/   rN   rO   rI   rL   blocks)r   rB   stage_indexrQ   r2   Zmid_channelsr3   Z
num_blocksZ
num_layersr[   rR   r(   r4   r)   Zblocks_listrS   r   r   r   r      sJ   











	zHGNetV2Stage.__init__c                 C   s"   |  |}| jD ]}||}q|S r   )r[   r\   )r   r   rT   r   r   r   r     s   


zHGNetV2Stage.forward)r   r    r   r   r   r   rX      s    *rX   c                       r9   )HGNetV2Encoderc                    s>   t    t | _tt|jD ]}| jt	|| qd S r   )
r   r   r,   rL   stagesrN   lenrY   rO   rX   )r   rB   r]   r   r   r   r   #  s
   

zHGNetV2Encoder.__init__c                 C   s,   |g}| j D ]}||}|| q||fS r   )r_   rO   )r   r   hidden_statesZstager   r   r   r   )  s
   
zHGNetV2Encoder.forwardr    r   r   r   r   r^   "      r^   c                       r9   )HGNetV2Backbonec                    s.   t    t|| _t|| _t|j| _d S r   )	r   r   r:   embedderr^   encoderlistrZ   r3   rA   r   r   r   r   2  s   


zHGNetV2Backbone.__init__c                 C   s$   |  |}| |\}}|dd  S )Nr   )rd   re   )r   rH   embedding_output_ra   r   r   r   r   8  s   
zHGNetV2Backbone.forwardr    r   r   r   r   rc   1  rb   rc   c                       sN   e Zd ZeZ fddZed ejddde	de	fddZ
d	d
 Z  ZS )HGNetV2ForImageClassificationc                    s   t  | |j| _t|| _t|| _td| _	t
 | _|jdkr.t|jd |jnt | _t| j	| jg| _tjdd| _d S )N)r   r   r   rC   )r   r   Z
num_labelsr:   rd   r^   re   r,   ZAdaptiveAvgPool2DZavg_poolZFlattenflattenZLinearZhidden_sizesr/   fcrL   
classifierZSoftmaxout_actrA   r   r   r   r   A  s   



z&HGNetV2ForImageClassification.__init__Zhgnetv2_forward)namexreturnc                 C   s\   t |d }| |}| |\}}| jD ]}||}q| |}| |}|  gS )Nr   )	rF   Z	to_tensorrd   re   rm   rl   rn   cpunumpy)r   rp   rg   Zlast_hidden_staterh   rW   Zlogitsresultr   r   r   r   R  s   




z%HGNetV2ForImageClassification.forwardc                 C   sJ   dg}g }|    D ]\}}|D ]}||v r!|dr!|| qq|S )Nrl   weight)Zget_hf_state_dictitemsendswithrO   )r   Zt_layerskeyskeyrh   Zt_layerr   r   r   get_transpose_weight_keys]  s   
z7HGNetV2ForImageClassification.get_transpose_weight_keys)r!   r"   r#   r   Zconfig_classr   r   r   Ztimeit_with_optionsr   r   rz   r$   r   r   r   r   ri   >  s    

ri   )typingr   r   rF   Z	paddle.nnr,   Zpaddle.nn.functionalZ
functionalrD   Zpaddle.nn.initializerr   Zutils.benchmarkr   r   Zcommon.transformers.activationsr	   Z common.transformers.transformersr
   r   Z_config_hgnetv2r   ZLayerr   r%   r6   r:   rI   rX   r^   rc   ri   r   r   r   r   <module>   s$   &;F2