o
    p’×i  ã                   @   sb   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
 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   úq/home/ubuntu/SoloSpeech/.venv/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| _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%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   r-   r.   ç{®Gáz„?r/   r0   c                 S   s   g | ]
}t |d  ƒdk‘qS )r0   r   )Úlen)Ú.0Úresr   r   r   Ú
<listcomp>U   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Úranger3   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   Úforward2   sJ   

€€€ÿz$StableDiffusionSafetyChecker.forwardrG   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,   r1   r   )Údimr2   éÿÿÿÿ)r   r"   r   r&   r%   r(   r
   rD   Ú	unsqueezeÚexpandr:   r'   )r)   r   rG   rH   r   rI   rJ   rO   r-   r.   Úspecial_adjustmentr/   rS   r   r   r   Úforward_onnxf   s   
z)StableDiffusionSafetyChecker.forward_onnx)Ú__name__Ú
__module__Ú__qualname__r   Úconfig_classÚmain_input_nameÚ_no_split_modulesr   r
   Úno_gradrV   ÚTensorr\   Ú__classcell__r   r   r*   r   r       s    
3 r   )r9   rB   r
   Útorch.nnr   Útransformersr   r   r   Úutilsr   Ú
get_loggerr]   rE   r   r   r   r   r   r   Ú<module>   s   
