o
    Û·i&  ã                   @   sf   d dl Zd dlZd dlmZ d dlmZmZmZ ddl	m
Z
mZ e e¡Zdd„ ZG dd„ deƒZdS )	é    N)Ú
CLIPConfigÚCLIPVisionModelÚPreTrainedModelé   )Úis_transformers_versionÚ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   úi/home/ubuntu/vllm_env/lib/python3.10/site-packages/diffusers/pipelines/stable_diffusion/safety_checker.pyÚcosine_distance   s   r   c                       s^   e Zd ZeZd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 )ÚStableDiffusionSafetyCheckerÚ
clip_inputÚ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| _tddƒrS|  ¡  d S d S )NF)Úbiasé   )Úrequires_gradr   ú>z4.57.3)Ú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_weightsr   Ú	post_init)Úselfr   ©Ú	__class__r   r   r   &   s   
ÿz%StableDiffusionSafetyChecker.__init__c                 C   sÞ  |   |¡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 ƒ}t|ƒD ]&\}}|rát |¡sÍt |d ¡r×t || ¡||< q»t || j¡||< q»t|ƒrët d¡ ||fS )Né   r   )Úspecial_scoresÚspecial_careÚconcept_scoresÚbad_conceptsç        r   r0   r1   ç{®Gáz„?r2   r3   c                 S   s   g | ]
}t |d  ƒdk‘qS )r3   r   )Úlen)Ú.0Úresr   r   r   Ú
<listcomp>X   s    z8StableDiffusionSafetyChecker.forward.<locals>.<listcomp>z‘Potential NSFW content was detected in one or more images. A black image will be returned instead. Try again with a different prompt and/or seed.)r    r$   r   r(   ÚcpuÚfloatÚnumpyr'   ÚshapeÚranger6   r*   ÚitemÚroundÚappendr)   Ú	enumerater   Ú	is_tensorÚ
zeros_likeÚnpÚzerosÚanyÚloggerÚwarning)r,   r   ÚimagesÚpooled_outputr   Úspecial_cos_distÚcos_distÚresultÚ
batch_sizeÚiÚ
result_imgÚ
adjustmentÚconcept_idxÚconcept_cosÚconcept_thresholdÚhas_nsfw_conceptsÚidxÚhas_nsfw_conceptr   r   r   Úforward5   sJ   

€€€ÿz$StableDiffusionSafetyChecker.forwardrJ   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}d||< ||fS )Nr/   r4   r   )Údimr5   éÿÿÿÿ)r    r$   r   r(   r'   r*   r   rG   Ú	unsqueezeÚexpandr=   r)   )r,   r   rJ   rK   r   rL   rM   rR   r0   r1   Úspecial_adjustmentr2   rV   r   r   r   Úforward_onnxi   s   
z)StableDiffusionSafetyChecker.forward_onnx)Ú__name__Ú
__module__Ú__qualname__r   Úconfig_classÚmain_input_nameÚ_no_split_modulesr   r   Úno_gradrY   ÚTensorr_   Ú__classcell__r   r   r-   r   r       s    
3 r   )r<   rE   r   Útorch.nnr   Útransformersr   r   r   Úutilsr   r   Ú
get_loggerr`   rH   r   r   r   r   r   r   Ú<module>   s   
