o
    *j]'                     @   sD  d dl Z d dlZd dlmZ d dlmZ d dlmZ d dl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 ddlmZ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				d ddZ G dd de
jjZ!dS )!    N)OrderedDict)reduce)mul)Image)models   )convert_weightsload_pretrainedc                       s2   e Zd ZdZd fdd	ZdejfddZ  ZS )	
Bottleneck   r   c                    s  t    tj||ddd| _t|| _tj||dddd| _t|| _|dkr/t	|nt
 | _tj||| j ddd| _t|| j | _tjdd| _d | _|| _|dksb||tj krttdt	|fd	tj||| j dddd
fdt|| j fg| _d S d S )Nr   F)bias   )paddingr   T)Zinplacez-10)strider   1)super__init__nnConv2dconv1ZBatchNorm2dbn1conv2bn2Z	AvgPool2dZIdentityavgpool	expansionconv3bn3ZReLUrelu
downsampler   r
   
Sequentialr   )selfZinplanesZplanesr   	__class__ r/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/image_probing_model/backbone.pyr      s6   

zBottleneck.__init__xc                 C   st   |}|  | | |}|  | | |}| |}| | |}| jd ur/| |}||7 }|  |}|S N)	r   r   r   r   r   r   r   r   r   )r!   r&   identityoutr$   r$   r%   forward9   s   



zBottleneck.forward)r   )	__name__
__module____qualname__r   r   torchTensorr*   __classcell__r$   r$   r"   r%   r
      s    "r
   c                	       s:   e Zd Z	d
dedededef fddZdd	 Z  ZS )AttentionPool2dNspacial_dim	embed_dim	num_heads
output_dimc                    st   t    tt|d d ||d  | _t||| _t||| _	t||| _
t||p2|| _|| _d S )N   r   g      ?)r   r   r   	Parameterr.   randnpositional_embeddingLineark_projq_projv_projc_projr4   )r!   r2   r3   r4   r5   r"   r$   r%   r   K   s   

zAttentionPool2d.__init__c              	   C   s4  | |jd |jd |jd |jd  ddd}tj|jddd|gdd}|| jd d d d d f |j }t	j
di d|d	|d
|d|jd d| jd| jjd| jjd| jjdd dt| jj| jj| jjgdd dd ddddd| jjd| jjddd| jdd\}}|d S )Nr   r   r6   r   T)dimZkeepdimr?   querykeyvalueZembed_dim_to_checkr4   Zq_proj_weightZk_proj_weightZv_proj_weightZin_proj_weightZin_proj_biasZbias_kZbias_vZadd_zero_attnFZ	dropout_pZout_proj_weightZout_proj_biasZuse_separate_proj_weighttrainingneed_weightsr$   )reshapeshapepermuter.   catmeanr9   todtypeFZmulti_head_attention_forwardr4   r<   weightr;   r=   r   r>   rE   )r!   r&   _r$   r$   r%   r*   Y   sb   
$

	
zAttentionPool2d.forwardr'   )r+   r,   r-   intr   r*   r0   r$   r$   r"   r%   r1   I   s    r1   c                       s(   e Zd ZdZdejf fddZ  ZS )	LayerNormz*Subclass torch's LayerNorm to handle fp16.r&   c                    s$   |j }t |tj}||S r'   )rM   r   r*   typer.   Zfloat32)r!   r&   	orig_typeretr"   r$   r%   r*   z   s   
zLayerNorm.forward)r+   r,   r-   __doc__r.   r/   r*   r0   r$   r$   r"   r%   rR   w   s    rR   c                   @   s   e Zd ZdejfddZdS )	QuickGELUr&   c                 C   s   |t d|  S )NgZd;?)r.   Zsigmoidr!   r&   r$   r$   r%   r*      s   zQuickGELU.forwardN)r+   r,   r-   r.   r/   r*   r$   r$   r$   r%   rW      s    rW   c                       sP   e Zd Z	ddededejf fddZdejfdd	Zdejfd
dZ  Z	S )ResidualAttentionBlockNd_modeln_head	attn_maskc              
      sr   t    t||| _t|| _ttdt	||d fdt
 fdt	|d |fg| _t|| _|| _d S )NZc_fcr   Zgelur>   )r   r   r   ZMultiheadAttentionattnrR   ln_1r    r   r:   rW   mlpln_2r\   )r!   rZ   r[   r\   r"   r$   r%   r      s   



zResidualAttentionBlock.__init__r&   c                 C   s>   | j d ur| j j|j|jdnd | _ | j|||d| j dd S )NrM   deviceF)rF   r\   r   )r\   rL   rM   rb   r]   rX   r$   r$   r%   	attention   s   
z ResidualAttentionBlock.attentionc                 C   s   i }|  |}|ddd|d|< | |}|ddd|d|< || }| | |}|ddd|d|< || }||fS )Nr   r   r6   zlayer_{}_pre_attnzlayer_{}_attnzlayer_{}_mlp)r^   rI   formatrc   r_   r`   )r!   r&   idxfeaturesZx_normr]   r_   r$   r$   r%   r*      s   

zResidualAttentionBlock.forwardr'   )
r+   r,   r-   rQ   r.   r/   r   rc   r*   r0   r$   r$   r"   r%   rY      s    rY   c                	       sD   e Zd Z	ddedededejf fddZdejfd	d
Z  ZS )TransformerNwidthlayersheadsr\   c                    sJ   t    || _|| _t | _t|D ]}t|||}| j	| qd S r'   )
r   r   rh   ri   r   Z
ModuleList	resblocksrangerY   append)r!   rh   ri   rj   r\   iblockr"   r$   r%   r      s   

zTransformer.__init__r&   c                 C   s8   i }t | jD ]\}}|||\}}|| q||fS r'   )	enumeraterk   update)r!   r&   rf   re   ro   Zblock_featsr$   r$   r%   r*      s
   zTransformer.forwardr'   )	r+   r,   r-   rQ   r.   r/   r   r*   r0   r$   r$   r"   r%   rg      s    rg   c                       sH   e Zd Zdedededededef fddZdd
ejfddZ  ZS )VisualTransformerinput_resolution
patch_sizerh   ri   rj   r5   c                    s   t    t|||||| || _|| _tjd|||dd| _|d }t|t	
| | _t|t	
|| d d | | _t|| _t|||| _t|| _t|t	
|| | _d S )Nr   F)Zin_channelsZout_channelsZkernel_sizer   r   g      r6   r   )r   r   printrs   r5   r   r   r   r7   r.   r8   class_embeddingr9   rR   ln_prerg   transformerln_postproj)r!   rs   rt   rh   ri   rj   r5   scaler"   r$   r%   r      s(   




zVisualTransformer.__init__Tr&   c                 C   s   |  |}||jd |jd d}|ddd}tj|jd d|jd |j|jd}tj| j	
|j| |gdd}|| j
|j }| |}|ddd}| |\}}|ddd}| |d d dd d f }|rt||d< |S | jd ur~|| j }|S )Nr   r   rD   r6   ra   r@   Z
pre_logits)r   rG   rH   rI   r.   zerosrM   rb   rJ   rv   rL   r9   rw   rx   ry   rz   )r!   r&   Z
return_allr|   rf   r$   r$   r%   r*      s*   
 


zVisualTransformer.forward)T)	r+   r,   r-   rQ   r   r.   r/   r*   r0   r$   r$   r"   r%   rr      s    rr   c                       $   e Zd Z fddZdd Z  ZS )CLIPNetc                    s   t t|   |dkrtddddddd| _d S |dv r)tdd	ddddd| _d S |d
v r:tddddd	dd| _d S td| )NZCLIP_ViTB32       i      i   )rs   rt   rh   ri   rj   r5   )ZCLIP_ViTB16ZCLIP_ViTB16_FP16   )ZCLIP_ViTL14ZCLIP_ViTL14_FP16   i      z Unsupported arch_name for CLIP, )r   r~   r   rr   clipKeyError)r!   	arch_name
pretrainedkwargsr"   r$   r%   r      s:   	zCLIPNet.__init__c                 C   s   |  |}|S r'   )r   )r!   Z
input_dataoutputr$   r$   r%   r*     s   
zCLIPNet.forwardr+   r,   r-   r   r*   r0   r$   r$   r"   r%   r~      s    !r~   	CLIP_RN50F c                 K   s>   t d| d d|}|r| drt|j t|j|| |S )N)r   r   ZFP16r$   )r~   endswithr   r   r	   )r   Zuse_pretrainZ	load_fromZ
state_dictr   modelr$   r$   r%   CLIP   s   

r   c                       r}   )ProbingModelc                    s"   t t|   tj||| _d S r'   )r   r   r   r.   r   r:   linear)r!   Z	feat_sizeZnum_classesr"   r$   r%   r   /  s   zProbingModel.__init__c                 C   s
   |  |S r'   )r   rX   r$   r$   r%   r*   3  s   
zProbingModel.forwardr   r$   r$   r"   r%   r   -  s    r   )r   Fr   N)"mathsyscollectionsr   	functoolsr   operatorr   numpynpr.   Ztorch.nnr   Ztorch.nn.functionalZ
functionalrN   ZPILr   Ztorchvisionr   utilsr   r	   Moduler
   r1   rR   rW   rY   rg   rr   r~   r   r   r$   r$   r$   r%   <module>   s4   5.	%6(
