
    
3j6#                         S SK r S SKrS SKrS SKrS SK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   " S S5      r " S	 S
5      rS SKr " S S5      r\\/rg)    N)model_management)Image   )
NullWriterlog)get_model_path	np2tensor
pil2tensor	tensor2npc                   p    \ rS rSrSrSS jr\S 5       r\S 5       r\S 5       r	Sr
S	rS
rSrSrSS jrSrg)MTB_LoadFaceEnhanceModel   z;Loads a GFPGan or RestoreFormer model for face enhancement.Nc                     g N selfs    H/home/wildlama/comfy/ComfyUI/custom_nodes/comfy_mtb/nodes/faceenhance.py__init__!MTB_LoadFaceEnhanceModel.__init__           c                     [        S5      nUR                  5       (       a  US 4$ [        S5      nUR                  5       (       a  X4$ S$ )Nface_restoreupscale_models)NN)r   exists)clsfrums      r   get_models_root(MTB_LoadFaceEnhanceModel.get_models_root   sC    N+99;;:,-99;;x8L8r   c                    U R                  5       u  pUc3  Uc0  [        U S5      (       d  [        R                  " S5        SU l        / $ UR                  5       (       d|  UR                  5       (       ae  UR                  5        Vs/ s HI  nUR                  R                  S5      (       d  M%  SUR                  ;   d  SUR                  ;   d  MG  UPMK     sn$ / $ UR                  5        Vs/ s HI  nUR                  R                  S5      (       d  M%  SUR                  ;   d  SUR                  ;   d  MG  UPMK     sn$ s  snf s  snf )N_warnedz"Face restoration models not found.Tz.pthGFPGANRestoreFormer)	r    hasattrr   warningr#   r   iterdirnameendswith)r   fr_models_pathum_models_pathxs       r   
get_models#MTB_LoadFaceEnhanceModel.get_models    s'   ),)<)<)>&!n&<3	**@A"I$$&& $$&& ,3355vvv.  "QVV+!&&/H 5  I $++-
-vvv&  QVV#!&&'@ -
 	

s$   $D?-D?D?,$EE6Ec                     U R                  5        Vs/ s H  oR                  PM     snSS04SSS04S.SSSS 040S.$ s  snf )	NdefaultNoneINT   )
model_nameupscalebg_upsamplerUPSCALE_MODELrequiredoptional)r.   r)   )r   r-   s     r   INPUT_TYPES$MTB_LoadFaceEnhanceModel.INPUT_TYPES@   sd    
 &)^^%56%5VV%56' "Iq>2 (/It;L)MN	
 		
 7s   ?FACEENHANCE_MODEL)model
load_modelmtb/facetoolsTc                    SSK Jn  SU;  nU R                  5       u  pgUb;  [        R                  " SUR
                   S35        UR
                  n[        U5      n[        5       [        l	        U" UR                  5       (       a  UOUU-  R                  5       UU(       a  SOSSUS9n[        R                  [        l	        U4$ )	Nr   )GFPGANerr%   zUpscale value overridden to z from bg_upsamplercleanr   )
model_pathr6   archchannel_multiplierr7   )gfpganrD   r    r   r'   scaleBGUpscaleWrapperr   sysstdoutr   as_posix
__stdout__)	r   r5   r6   r7   rD   basicfr_rootum_rootr@   s	            r   rA   #MTB_LoadFaceEnhanceModel.load_modelS   s    #z1//1#KK.|/A/A.BBTU #((G+L9L\
#NN,,'ZGhj   %

 ^^
xr   r   returnN)r   N)__name__
__module____qualname____firstlineno____doc__r   classmethodr    r.   r<   RETURN_TYPESRETURN_NAMESFUNCTIONCATEGORY
DEPRECATEDrA   __static_attributes__r   r   r   r   r      sf    E 9 9 
 
> 

 

 *LLHHJr   r   c                   D    \ rS rSrSS jrSS\R
                  4S jjrSrg)	rK   r   Nc                     Xl         g r   upscale_model)r   rf   s     r   r   BGUpscaleWrapper.__init__s   s    *r   imgc           
        ^  [         R                  " 5       nT R                  R                  U5        SnSn[	        U5      nUR                  SS5      R                  U5      nUR                  S   [        R                  R                  UR                  S   UR                  S   UUUS9-  n[        R                  " S	U 35        [        R                  R                  U5      n[        R                  R                  UU 4S
 jUUUT R                  R                  US9n	T R                  R                  5         [         R"                  " U	R                  SS5      SSS9n	[%        U	5      S   4$ )N      r      r   )tile_xtile_yoverlapzSteps: c                 &   > TR                  U 5      $ r   re   )ar   s    r   <lambda>*BGUpscaleWrapper.enhance.<locals>.<lambda>   s    d((+r   )ro   rp   rq   upscale_amountpbarg      ?)minmax)r   get_torch_devicerf   tor	   movedimshapecomfyutilsget_tiled_scale_stepsr   debugProgressBartiled_scalerJ   cputorchclampr   )
r   rh   outscaledevicetilerq   imgtstepsrw   ss
   `         r   enhanceBGUpscaleWrapper.enhancev   s@   !224f%~||B#&&v.

1 A AJJqMJJqM !B !
 
 			GE7#${{&&u-KK##+--33 $ 
 	 KK		"b)qc:!Q!!r   re   rT   )r   )rV   rW   rX   rY   r   r   r   ra   r   r   r   rK   rK   r   s    +""5;; "" ""r   rK   c                       \ rS rSrSrSS jrSrSrSrS	r	\
S
 5       r SS\R                  S\S\R                  4S jjr     SS\R                  S\S\\R                     4S jjrS rS rSrg)MTB_RestoreFace   zUses GFPGan to restore facesrU   Nc                     g r   r   r   s    r   r   MTB_RestoreFace.__init__   r   r   IMAGErestorerB   Tc                 F    SSSSS04SSS04SSS04SSS04S	.S
SSS040S.$ )Nr   r>   BOOLEANr1   FFLOAT      ?T)imager@   alignedonly_center_faceweightsave_tmp_stepspreserve_alphar9   r   )r   s    r   r<   MTB_RestoreFace.INPUT_TYPES   sc     $/%	5'9:%.E0B$C"Y$45#,y$.?"@
 !9y$.?"@
 	
r   r   r   c                 ^   [        U5      S   nUR                  S   UR                  S   p[        R                  " [        R
                  " U5      [        R                  5      nS nU(       a/  UR                  S5      S:X  a  US S 2S S 2S4   nUS S 2S S 2S S24   n[        5       [        l
        UR                  UUUSUS9u  pn[        R                  [        l
        [        R                  " SU S	35        U(       a  U R                  XX5        S nUb  [        R                  " U[        R                   5      n["        R$                  " U5      nUbO  ["        R$                  " U5      R'                  UR                  ["        R(                  5      nUR+                  U5        [-        U5      $ )
Nr   r4   rl      rn   T)has_alignedr   
paste_backr   z,Weight value has no effect for now. (value: ))r   r}   cv2cvtColornparrayCOLOR_RGB2BGRsizer   rL   rM   r   rO   r   r'   save_intermediate_imagesCOLOR_BGR2RGBr   	fromarrayresizeLANCZOSputalphar
   )r   r   r@   r   r   r   r   r   pimagewidthheight
source_imgalpha_channelcropped_facesrestored_facesrestored_imgoutputalpha_resizeds                     r   
do_restoreMTB_RestoreFace.do_restore   se    5!!$Qav\\"((6"2C4E4EF
uzz"~2"1a7OMAq"1"H%F\
6;mm- 7D 7
3| ^^
B6(!LM))v #<<c6G6GHL__\2F( % > E EKK! . &!!r   c                     [        UR                  S5      5       Vs/ s H  nU R                  X   UUUUUU5      PM     n	n[        R                  " U	SS94$ s  snf )Nr   )dim)ranger   r   r   cat)
r   r   r@   r   r   r   r   r   iouts
             r   r   MTB_RestoreFace.restore   sp    ( 5::a=)
 * OO  * 	 
 		#1%''
s   #Ac                     [         R                  " U SUS 3[         R                  5      u  nnnnnU SUS S3n[        R                  R                  X85      $ )N_0305z_.png)folder_pathsget_save_image_pathtemp_directoryospathjoin)	r   stepidxfull_output_folderfilenamecounter
_subfolder_filename_prefixfiles	            r   get_step_image_path#MTB_RestoreFace.get_step_image_path  si     ,,fAc"X''
	

 1WRL.ww||.55r   c                 h   [        [        XSS95       H  u  nu  pgUS-   nU R                  SU5      n	[        R                  " X5        U R                  SU5      n	[        R                  " X5        U R                  SU5      n	[
        R                  " Xg4SS9n
[        R                  " X5        M     g )NF)strictr4   r   cropped_faces_restoredcropped_faces_compare)axis)	enumeratezipr   r   imwriter   concatenate)r   r   r   r   r   r   cropped_facerestored_faceface_idr   cmp_imgs              r   r   (MTB_RestoreFace.save_intermediate_images  s     3<e<3
.C., AgG++OWEDKK+++,DgNDKK,++,CWMD nnl%BKGKK&3
r   r   rT   )F)FFr   TF)rV   rW   rX   rY   rZ   r   r\   r^   r_   r`   r[   r<   r   Tensorboolr   tupler   r   r   ra   r   r   r   r   r      s    & LHHJ
 
4  %1"||1" 1" 
1"n $(||( ( 
u||	(26'r   r   )r   r~   comfy.utilsr   r   numpyr   r   r   PILr   r   r   r   r   r	   r
   r   r   rK   rL   r   	__nodes__r   r   r   <module>r      s`    	   
    "  ! D D_ _D&" &"R J' J'Z 67	r   