o
    GÆÏi¯  ã                   @   sZ   d dl Z d dlmZ d dlmZmZmZ ddlmZ e 	e
¡Zdd„ ZG dd„ deƒZdS )	é    N)Ú
CLIPConfigÚCLIPVisionModelÚPreTrainedModelé   )Úloggingc                 C   s(   t j | ¡}t j |¡}t || ¡ ¡S )N)ÚnnÚ
functionalÚ	normalizeÚtorchÚmmÚt)Úimage_embedsÚtext_embedsÚnormalized_image_embedsÚnormalized_text_embeds© r   úl/home/ubuntu/.local/lib/python3.10/site-packages/diffusers/pipelines/stable_diffusion_safe/safety_checker.pyÚcosine_distance   s   r   c                       sZ   e Zd ZeZdgZdef‡ fdd„Ze ¡ dd„ ƒZ	e ¡ dej
dej
fd	d
„ƒZ‡  ZS )Ú SafeStableDiffusionSafetyCheckerÚCLIPEncoderLayerÚconfigc                    s”   t ƒ  |¡ t|jƒ| _tj|jj|jdd| _	tj
t d|j¡dd| _tj
t d|j¡dd| _tj
t d¡dd| _tj
t d¡dd| _d S )NF)Úbiasé   )Úrequires_gradr   )ÚsuperÚ__init__r   Úvision_configÚvision_modelr   ÚLinearÚhidden_sizeÚprojection_dimÚvisual_projectionÚ	Parameterr
   ÚonesÚconcept_embedsÚspecial_care_embedsÚconcept_embeds_weightsÚspecial_care_embeds_weights)Úselfr   ©Ú	__class__r   r   r   $   s   z)SafeStableDiffusionSafetyChecker.__init__c                 C   sv  |   |¡d }|  |¡}t|| jƒ ¡  ¡  ¡ }t|| jƒ ¡  ¡  ¡ }g }|jd }t	|ƒD ]€}	i g i g dœ}
d}t	t
|d ƒƒD ]3}||	 | }| j|  ¡ }t|| | dƒ|
d |< |
d | dkru|
d  ||
d | h¡ d}qBt	t
|d ƒƒD ]+}||	 | }| j|  ¡ }t|| | dƒ|
d	 |< |
d	 | dkr©|
d
  |¡ q~| |
¡ q/dd„ |D ƒ}||fS )Né   r   )Úspecial_scoresÚspecial_careÚconcept_scoresÚbad_conceptsç        r   r,   r-   ç{®Gáz„?r.   r/   c                 S   s   g | ]
}t |d  ƒdk‘qS )r/   r   )Úlen)Ú.0Úresr   r   r   Ú
<listcomp>S   s    z<SafeStableDiffusionSafetyChecker.forward.<locals>.<listcomp>)r   r!   r   r%   ÚcpuÚfloatÚnumpyr$   ÚshapeÚranger2   r'   ÚitemÚroundÚappendr&   )r(   Ú
clip_inputÚimagesÚpooled_outputr   Úspecial_cos_distÚcos_distÚresultÚ
batch_sizeÚiÚ
result_imgÚ
adjustmentÚconcept_idxÚconcept_cosÚconcept_thresholdÚhas_nsfw_conceptsr   r   r   Úforward0   s6   

€€z(SafeStableDiffusionSafetyChecker.forwardr>   r?   c                 C   sœ   |   |¡d }|  |¡}t|| jƒ}t|| jƒ}d}|| j | }tj|dkdd}	|	d }
|
 d¡ 	d|j
d ¡}
|| j |
 }tj|dkdd}||fS )Nr+   r0   r   )Údimr1   éÿÿÿÿ)r   r!   r   r%   r$   r'   r
   ÚanyÚ	unsqueezeÚexpandr9   r&   )r(   r>   r?   r@   r   rA   rB   rG   r,   r-   Úspecial_adjustmentr.   rK   r   r   r   Úforward_onnxW   s   
z-SafeStableDiffusionSafetyChecker.forward_onnx)Ú__name__Ú
__module__Ú__qualname__r   Úconfig_classÚ_no_split_modulesr   r
   Úno_gradrL   ÚTensorrS   Ú__classcell__r   r   r)   r   r      s    
& r   )r
   Útorch.nnr   Útransformersr   r   r   Úutilsr   Ú
get_loggerrT   Úloggerr   r   r   r   r   r   Ú<module>   s   
