
    bi                         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
j                  e      Zd Z G d de      Zy)    N)
CLIPConfigCLIPVisionModelPreTrainedModel   )loggingc                     t         j                  j                  |       }t         j                  j                  |      }t        j                  ||j                               S )N)nn
functional	normalizetorchmmt)image_embedstext_embedsnormalized_image_embedsnormalized_text_embedss       n/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/diffusers/pipelines/stable_diffusion/safety_checker.pycosine_distancer      sH     mm55lC]]44[A88+-C-E-E-GHH    c                        e Zd ZeZdZdgZdef fdZ ej                         d        Z
 ej                         dej                  dej                  fd       Z xZS )StableDiffusionSafetyChecker
clip_inputCLIPEncoderLayerconfigc                 r   t         |   |       t        |j                        | _        t        j                  |j                  j                  |j                  d      | _	        t        j                  t        j                  d|j                        d      | _        t        j                  t        j                  d|j                        d      | _        t        j                  t        j                  d      d      | _        t        j                  t        j                  d      d      | _        y )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__s     r   r    z%StableDiffusionSafetyChecker.__init__&   s     +F,@,@A!#6+?+?+K+KVMbMbin!o ll5::b&:O:O+P`ef#%<<

1f>S>S0Tdi#j &(ll5::b>QV&W#+-<<

1UZ+[(r   c                 T   | j                  |      d   }| j                  |      }t        || j                        j	                         j                         j                         }t        || j                        j	                         j                         j                         }g }|j                  d   }t        |      D ]  }	i g i g d}
d}t        t        |d               D ]i  }||	   |   }| j                  |   j                         }t        ||z
  |z   d      |
d   |<   |
d   |   dkD  sL|
d   j                  ||
d   |   h       d}k t        t        |d               D ]_  }||	   |   }| j                  |   j                         }t        ||z
  |z   d      |
d	   |<   |
d	   |   dkD  sL|
d
   j                  |       a |j                  |
        |D cg c]  }t        |d
         dkD   }}t!        |      D ]v  \  }}|s	t#        j$                  |      st#        j$                  |d         rt#        j&                  ||         ||<   Rt)        j*                  ||   j                        ||<   x t-        |      rt.        j1                  d       ||fS c c}w )N   r   )special_scoresspecial_careconcept_scoresbad_concepts        r   r1   r2   {Gz?r3   r4   zPotential 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rangelenr,   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reshas_nsfw_conceptsidxhas_nsfw_concepts                      r   forwardz$StableDiffusionSafetyChecker.forward2   s   ))*5a8--m< +<9Q9QRVVX^^`ffh"<1D1DEIIKQQSYY[!''*
z" 	&A,.VXjlmJ J$S)9!)<%=> &.q1+>$($D$D[$Q$V$V$X!<A+PaBadnBnpq<r
+,[9./<q@~.55{JO_D`alDm6no!%J&  %S!%56 C&qk+6$($?$?$L$Q$Q$S!<A+PaBadnBnpq<r
+,[9./<q@~.55kBC MM*%-	&0 FLLcS^!459LL%./@%A 	>!C!??6*eoofQi.H"'"2"26#;"?F3K"$((6#;+<+<"=F3K	>  !NNB
 ((( Ms   #J%rH   c                    | j                  |      d   }| j                  |      }t        || j                        }t        || j                        }d}|| j
                  z
  |z   }t        j                  |dkD  d      }	|	dz  }
|
j                  d      j                  d|j                  d         }
|| j                  z
  |
z   }t        j                  |dkD  d      }d||<   ||fS )Nr0   r5   r   )dimr6   )r"   r&   r   r*   r)   r,   r   rE   	unsqueezeexpandr:   r+   )r-   r   rH   rI   r   rJ   rK   rP   r1   r2   special_adjustmentr3   rU   s                r   forward_onnxz)StableDiffusionSafetyChecker.forward_onnxf   s    ))*5a8--m<*<9Q9QR"<1D1DE 
)D,L,LLzYyy!!3;)D0/99!<CCBWXHYZ"T%@%@@DVV!IInq&8a@$' !(((r   )__name__
__module____qualname__r   config_classmain_input_name_no_split_modulesr    r   no_gradrX   Tensorr_   __classcell__)r.   s   @r   r   r       ss    L"O+,
\z 
\ U]]_1) 1)f U]]_)u|| )U\\ ) )r   r   )r9   rC   r   torch.nnr	   transformersr   r   r   utilsr   
get_loggerr`   rF   r   r    r   r   <module>rn      sA       E E  
		H	%I^)? ^)r   