
    
3j              	          S SK r S SKJr  S SKJr  S SKrS SKrS SKJ	r	  SSK
Jr  SSKJrJr  SSKJrJrJrJr  \" \5      r " S S	5      r " S
 S5      r " S S5      r SS\R0                  4S jjr SS\	R                  \\	R                     -  S\	R                  \\	R                     -  S\\   S-  S\	R                  4S jjr\\\/rg)    N)Path)Image   )ModelNotFound)
NullWritermklog)download_antelopev2get_model_path
pil2tensor
tensor2pilc                   J    \ rS rSrSr/ r\S 5       rSrSr	Sr
SrS\4S	 jrS
rg)MTB_LoadFaceAnalysisModel   zLoads a face analysis modelc                     SS/ SQSS0400$ )Nrequiredfaceswap_model)
antelopev2	buffalo_l	buffalo_m
buffalo_scdefaultr    clss    E/home/wildlama/comfy/ComfyUI/custom_nodes/comfy_mtb/nodes/faceswap.pyINPUT_TYPES%MTB_LoadFaceAnalysisModel.INPUT_TYPES   s)      J,#
 	
    )FACE_ANALYSIS_MODEL
load_modelmtb/facetoolsTr   c                     SS K nUS:X  a
  [        5         UR                  R                  U[	        S5      R                  5       S9nU4$ )Nr   r   insightface)nameroot)r#   r	   appFaceAnalysisr
   as_posix)selfr   r#   face_analysers       r   r    $MTB_LoadFaceAnalysisModel.load_model)   sK    \)!#44.779 5 
 r   r   N)__name__
__module____qualname____firstlineno____doc__modelsclassmethodr   RETURN_TYPESFUNCTIONCATEGORY
DEPRECATEDstrr    __static_attributes__r   r   r   r   r      s>    %F
 
 ,LHHJ
  
 r   r   c                   d    \ rS rSrSr\S\\   4S j5       r\	S 5       r
SrSrSrS	rS
\4S jrSrg)MTB_LoadFaceSwapModel6   zLoads a faceswap modelreturnc                      [        S5      n U R                  5       (       a4  U R                  5       nU Vs/ s H  o"R                  S;   d  M  UPM     sn$ / $ s  snf )Nr#   )z.onnxz.pth)r
   existsiterdirsuffix)models_pathr1   xs      r   
get_models MTB_LoadFaceSwapModel.get_models9   sS    $]3 ((*F%Gv!5F)FAvGG	 Hs   AAc                 p    SSU R                  5        Vs/ s H  oR                  PM     snSS0400$ s  snf )Nr   r   r   None)rC   r$   )r   rB   s     r   r   !MTB_LoadFaceSwapModel.INPUT_TYPESA   sH      %(^^%56%5VV%56'#
 	
 7s   3)FACESWAP_MODELr    r!   Tr   c                    SS K nSSKJn  [        SU5      nU(       a  UR	                  5       (       d  [        U SU S35      e[        R                  SU 35        U" UUR                  UUR                  5       S95      4$ )Nr   )	INSwapperr#   z ()zLoading model )path_or_bytes	providers)
onnxruntimeinsightface.model_zoo.inswapperrJ   r
   r>   r   loginfoInferenceSessionget_available_providers)r)   r   rN   rJ   
model_paths        r   r     MTB_LoadFaceSwapModel.load_modelQ   s    =#M>B
!2!2!4!4>"2"ZL BCC>*./,,",)AAC - 
 	
r   r   N)r,   r-   r.   r/   r0   staticmethodlistr   rC   r2   r   r3   r4   r5   r6   r7   r    r8   r   r   r   r:   r:   6   sX     T
   
 
 'LHHJ
 
r   r:   c                       \ rS rSrSrSrSrSS jr\S 5       r	Sr
SrSrS	r SS
\R                  S\R                  S\4S jjrSrg)MTB_FaceSwapf   z.Face swap using deepinsight/insightface modelsNc                     g Nr   )r)   s    r   __init__MTB_FaceSwap.__init__l   s    r   c                 <    SSSSS04SSS04SSS04S.S	S
SS040S.$ )NIMAGESTRINGr   0r   rF   rH   )image	referencefaces_indexfaceanalysis_modelr   preserve_alphaBOOLEANT)r   optionalr   r   s    r   r   MTB_FaceSwap.INPUT_TYPESo   s[     $' (9c*:;)'' $4i5H"I	 !9y$.?"@
 	
r   r`   swapr!   Trd   re   rf   c                 T  ^^^^^ UUUUU4S jnUR                  S5      n[        R                  SU S35        TR                  S5      S:w  a  [        S5      eUS:X  a  U" U5      nU4$ [	        U5       V	s/ s H  o" X   5      PM     n
n	[
        R                  " U
SS9nU4$ s  sn	f )Nc                 @  > [         R                  " 5         [        U 5      S   n [        T
5      S   nS nT	(       a2  U R                  S:X  a"  U R	                  S5      nU R                  S5      n TR                  S5      R                  S5       Vs1 s H%  nUR                  5       (       d  M  [        U5      iM'     nn[        5       [        l        [        TXTU5      n[        R                  [        l        U(       a  UR                  U5        [!        U5      $ s  snf )Nr   RGBAARGB,)model_management)throw_exception_if_processing_interruptedr   mode
getchannelconvertstripsplit	isnumericintr   sysstdout	swap_face
__stdout__putalphar   )imgrefalpha_channelrB   face_idsswappedrg   rf   r   rh   re   s         r   do_swap"MTB_FaceSwap.swap.<locals>.do_swap   s    FFHS/!$CY'*C M#((f"4 #s 3kk%( %**3/55c::A;;= A:  
 $CJ"CnhG CJ  /g&&s   D-Dr   z&Running insightface swap (batch size: rK      z&Reference image must have batch size 1)dim)sizerP   rQ   
ValueErrorrangetorchcat)r)   rd   re   rf   rg   r   rh   r   batch_countiimage_batchs     `````    r   rl   MTB_FaceSwap.swap   s    	' 	'0 jjm9+aHI>>!!EFF!ENE x 7<K6HI6H758,6HKIIIkq1Ex Js   8B%r   )r<   N)F)r,   r-   r.   r/   r0   modelrT   r]   r2   r   r3   r4   r5   r6   r   Tensorr7   rl   r8   r   r   r   rY   rY   f   sq    8EJ 
 
" LHHJ .||. <<. 	. .r   rY   img_datac                 &   U R                  SUS9  U R                  U5      n[        U5      S:X  aC  US   S:  a:  US   S:  a1  [        R	                  S5        US   S-  US   S-  4n[        U UUUS9$  [        US S	9U   $ ! [         a     g f = f)
Nr   )ctx_iddet_sizei@  r   z+No face ed, trying again with smaller imager   )
face_indexr   c                      U R                   S   $ )Nr   )bbox)rB   s    r   <lambda>!get_face_single.<locals>.<lambda>   s    !&&)r   )key)preparegetlenrP   debugget_face_singlesorted
IndexError)r*   r   r   r   facedet_size_halfs         r   r   r      s     X6X&D
4yA~(1++c0A		?@!!)8A;!+;<!"	
 	
d 34Z@@ s   5B 
BB
source_img
target_imgrf   r<   c                    SS K nUc  S1n[        R                  SU 35        UnUGb&  UR                  [        R
                  " U5      UR                  5      nUR                  [        R
                  " U5      UR                  5      n[        XSS9n	U	b  Un
U Hh  n[        XUS9nUb@  [        5       [        l
        UR                  XU	5      n
[        R                  [        l
        MP  [        R                  SU 35        Mj     [        R                  " UR                  XR                   5      5      nU$ [        R                  S5         U$ [        R#                  S5        U$ )Nr   zSwapping faces: )r   zNo target face found for zNo source face foundzNo face swap model provided)cv2rP   r   cvtColornparrayCOLOR_RGB2BGRr   r   r|   r}   r   r   warningr   	fromarrayCOLOR_BGR2RGBerror)r*   r   r   face_swapper_modelrf   r   result_imagecv_source_imgcv_target_imgsource_faceresultface_numtarget_faces                r   r~   r~      sC    cII ./L%RXXj%93;L;LMRXXj%93;L;LM%Q
 ""F'-!X *!+CJ/33[F "%CJKK";H: FG ( !??V%6%67L  KK./  			/0r   )r   )  r   r\   )r|   pathlibr   comfy.model_managementrs   numpyr   r   PILr   errorsr   rP   r   r   utilsr	   r
   r   r   r,   r   r:   rY   ndarrayr   rW   setr{   r~   	__nodes__r   r   r   <module>r      s      1    " # O O Ho   D,
 ,
`N Nl AKZZ6 $(+d5;;//+ d5;;//+
 SD+ [[+b 02KL	r   