
    I gT@                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Zd dlmc mZ d dlmZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ e j:                  j=                  e      Z e j:                  jC                  e       d    Z"ej:                  jG                  e"       d dl$m%Z% d dl&  G d d      Z'd	 Z(dd
Z)d Z*y)    N)Image)BytesIO)version)InSPyReNet_SwinB)*c                       e Zd ZddZddZy)RemoverNc           	         t         j                  j                  dt         j                  j	                  t         j                  j                  d                  }t         j                  j                  |d      }t        j                  |d       t         j                  j                  t         j                  j                  |d            sVt        j                  t         j                  j                  t        d      t         j                  j                  |d             t        t         j                  j                  |d            |   | _        ||| _        nd| _        t        j                   j#                         rd	| _        nht%        j&                  t        j(                        t%        j&                  d
      k\  r/t        j*                  j,                  j#                         rd| _        d}||}	| j                  j.                  }
t         j                  j                  t         j                  j                  |	|
            sd}n| j                  j0                  t2        j1                  t5        t         j                  j                  |	|
      d      j7                               j9                         k7  r| j                  j0                  d}|r#d| j                  j:                  v r`t=        j>                  | j                  j:                  t         j                  j                  |	|
      d| j                  j@                         nd| j                  j:                  v rItC        j>                  | j                  j:                  t         j                  j                  |	|
             nJtE        d      t         j                  jG                  t         j                  j	                  |            \  }	}
tI        d+dddd| j                  | _%        | jJ                  jM                          | jJ                  jO                  t        jP                  t         j                  j                  |	|
      dd      d       | jJ                  jS                  | j                        | _%        |r| j                  j.                  jU                  ddjW                  | j                              }
	 t        jX                  jQ                  t         j                  j                  |	|
      | j                        }| `%|| _%        |dk7  rtc        jd                  d       d}d}d}|dk(  rFtg        | j                  j^                        }ti        jj                  | j                  j^                   }nE|dk(  r2d|vrtc        jd                  d       tm        d !      }to        d !      }ntq        d"|       ts        jt                  |tw               ty        g d#g d$%      t{               g      | _>        ti        jt                  |ti        j~                  g d#g d$%      t        j                         g      | _B        dddd&| _C        d'jW                  || j                  |rd(nd)      }t        d*jW                  |             y#  t        jX                  j[                  | jJ                  t        j\                  ddg| j                  j^                   jS                  | j                        d      }| `%|| _%        t        jX                  ja                  | jJ                  t         j                  j                  |	|
             Y @xY w),a  
        Args:
            mode   (str): Choose among below options
                                   base -> slow & large gpu memory required, high quality results
                                   fast -> resize input into small size for fast computation
                                   base-nightly -> nightly release for base mode
            jit    (bool): use TorchScript for fast computation
            device (str, optional): specifying device for computation. find available GPU resource if not specified.
            ckpt   (str, optional): specifying model checkpoint. find downloaded checkpoint or try download if not specified.
            fast   (bool, optional, DEPRECATED): replaced by mode argument. use fast mode if True.
         TRANSPARENT_BACKGROUND_FILE_PATH~z.transparent-backgroundTexist_okzconfig.yamlNcpuzcuda:0z1.13zmps:0Frbzdrive.google.com)fuzzyproxyz
github.comzPlease use valid URL@   )depth
pretrained	threshold)map_locationweights_only)strictz.pthz_{}.pt)r         staticzUResizing method for TorchScript mode only supports static resize. Fallback to static.dynamicbasezwDynamic resizing only supports base and base-nightly mode. It will cause severe performance degradation with fast mode.i   )LzUnsupported resizing method )g
ףp=
?gv/?gCl?)gZd;O?gy&1?g?)meanstd)imgnameshapez"Mode={}, Device={}, Torchscript={}enableddisabledzSettings -> {} )Eosenvirongetpathabspath
expanduserjoinmakedirsisfileshutilcopyrepopathload_configmetadevicetorchcudais_availabler   parse__version__backendsmps	ckpt_namemd5hashlibopenread	hexdigesturlgdowndownload
http_proxywgetNotImplementedErrorsplitr   modelevalload_state_dictloadtoreplaceformatjittracerand	base_sizesavewarningswarnstatic_resizeAResizedynamic_resizedynamic_resize_aAttributeError
transformsComposetonumpy	normalizetotensor	transform	NormalizeAP
ToTensorV2cv2_transform
backgroundprint)selfmoderR   r6   ckptresizecfg_pathhome_dirrF   ckpt_dirr>   traced_model	resize_tf	resize_fndescs                  F/var/www/html/transparent-background/transparent_background/Remover.py__init__zRemover.__init__   sD    ::>>"DbggooVXV]V]VhVhilVmFno77<<*CD
Ht,ww~~bggll8]CDKKX}=rww||HVc?deX} EFtL	 DKDKzz&&(&e//0GMM&4IINN&&335%<H		++I77>>"'',,x"CD		;;h	:DAFFH)+
 99==,#H%6NN499=="'',,x2S[_gkgpgpg{g{|!TYY]]2MM$))--h	1RS-.DEE"$''--0E"FHi%^B5D^TXT]T]^




""JJrww||Hi8u[_` 	# 	
 ZZ]]4;;/
		++334IN$yy~~GGLL95DKK  .   J)
 !uv!		X%dii&9&9:I$))"5"56Iy T!  X  Y&.I(40I #?x!HII#++	4:OP
	
 YY!6<QR
 #'tD3::$++CyZ
 	%%d+,_N$yyJJJJq!:dii&9&9:==dkkJ  /  
 J)
		tzz277<<)+LMs   5A[ C^c                 8   t        |t        j                        r'd}|j                  dd }| j	                  |      d   }n%d}|j
                  ddd   }| j                  |      }|j                  d      }|j                  | j                        }t        j                         5  | j                  |      }ddd       t        j                  |d	d
      }|j                  j!                         }|j#                         j%                         }|+|t'        |      kD  j)                  t        j*                        }|rd|z
  }t        j,                  |      }|j/                  d      r*|dd j1                  d      D 	cg c]  }	t3        |	       }}	|dk(  r=t        j4                  |gdz  d      dz  j)                  t        j6                        }n|dk(  r|O	 ddlm}
  |
|dz  |      }dt        jF                  |dd      z  dz   }|j)                  t        j6                        }tH        j1                  |      \  }}}|dz  j)                  t        j6                        }tH        jK                  ||||g      }n|dk(  rit        j4                  t        jL                  |      gdz  d      g dz  }||dt        jN                  f   z  |d|dt        jN                  f   z
  z  z   }n|dk(  rit        j4                  t        jL                  |      gdz  d      g dz  }||dt        jN                  f   z  |d|dt        jN                  f   z
  z  z   }n*tQ        |      dk(  rrtS        |       t        j4                  t        jL                  |      gdz  d      |z  }||dt        jN                  f   z  |d|dt        jN                  f   z
  z  z   }n|dk(  rK||dt        jN                  f   z  tH        jU                  |d d!      d|dt        jN                  f   z
  z  z   }nZ|d"k(  rt        j4                  t        jL                  |      gdz  d      g dz  |z   dz  }||dt        jN                  f   z  |d|dt        jN                  f   z
  z  z   }tH        jW                  |dkD  dz  j)                  t        j6                        d#d$      }g d||dk7  <   n|jY                         j[                  t\              r~| j^                  d%   |k7  rtH        ja                  tH        jc                  |      tH        jd                        }tH        jg                  ||j                  dd ddd         }|| j^                  d&<   |j                  dd ddd   | j^                  d'<   || j^                  d%<   n| j^                  d'   |j                  dd ddd   k7  retH        jg                  | j^                  d&   |j                  dd ddd         | j^                  d&<   |j                  dd ddd   | j^                  d'<   ||dt        jN                  f   z  | j^                  d&   d|dt        jN                  f   z
  z  z   }|r|j)                  t        j6                        S ti        jj                  |j)                  t        j6                              S # 1 sw Y   &xY wc c}	w # t<        $ r! 	 ddlm }
 n# t<        $ r	 ddl!m"}
 Y nw xY wY 2w xY w)(a  
        Args:
            img (PIL.Image or np.ndarray): input image as PIL.Image or np.ndarray type
            type (str): output type option as below.
                        'rgba' will generate RGBA output regarding saliency score as an alpha map. 
                        'green' will change the background with green screen.
                        'white' will change the background with white color.
                        '[255, 0, 0]' will change the background with color code [255, 0, 0]. 
                        'blur' will blur the background.
                        'overlay' will cover the salient object with translucent green color, and highlight the edges.
                        Another image file (e.g., 'samples/backgroud.png') will be used as a background, and the object will be overlapped on it.
            threshold (float or str, optional): produce hard prediction w.r.t specified threshold value (0.0 ~ 1.0)
        Returns:
            PIL.Image: output image

        TN   )imagerz   Fr   bilinear)rl   align_cornersr   [,mapr   )axis   rgba)estimate_foreground_ml_cupy)estimate_foreground_ml_pyopencl)estimate_foreground_mlg     o@g        g      ?g      ?green)x   r      .white)r   r   r   blur)r   r      overlay2   d   r#   r"   r$   )6
isinstancenpndarrayr$   rh   sizerd   	unsqueezerO   r6   r7   no_gradrK   Finterpolatedatar   numpysqueezefloatastypefloat64array
startswithrJ   intstackuint80pymatting.foreground.estimate_foreground_ml_cupyr   ImportError4pymatting.foreground.estimate_foreground_ml_pyopenclr   	pymattingr   clipcv2merge	ones_likenewaxislenrj   GaussianBlurCannylowerendswithIMG_EXTSri   cvtColorimreadCOLOR_BGR2RGBrn   r   	fromarray)rk   r"   typer   reverseis_numpyr$   xpredir   rgbbgborderbackground_imgs                    rv   processzRemover.process   s   $ c2::&HIIbqME"""-g6AHHHTrTNEs#AKKNDD]]_ 	!::a=D	! }}T5zNyy}}zz|##% 5++33BJJ?Dt8Dhhsm??3$(2J$4$4S$9:qCF:D:5=88TFQJR036>>rxxHCV^ E G -S5[$?BGGCR0036jj*iinGAq!3J&&rxx0D))Q1dO,CW_2<<-.2<NBS"**_--a$sBJJ:O6O0PPCW_2<<-.2<NBS"**_--a$sBJJ:O6O0PPCY!^$K2<<-.2<tCBS"**_--a$sBJJ:O6O0PPCV^S"**_--0@0@fb0QDbjj))1 C Y",,t,-1;oMPSSB tCO,,sa$sBJJ:O6O/PPCYYs 2::288Db#NF.C!ZZ\""8,v&$.!$cjj.>@Q@Q!R!$NCIIbqM$B$<O!P)7&+.99Ra=2+>(*.')SYYr]4R4-@@),DOOE4JCIIVXWXMZ^\^Z^L_)`&+.99Ra=2+>(S"**_--0FDbjj))1 C ::bhh''??3::bhh#788i	! 	! ; # EE S& EDEEsH   '[[* [/ ['/	\9\ ?\ \\\\\)r   FNNr   )r   NF)__name__
__module____qualname__rw   r   r'       rv   r	   r	      s    {-zr9r   r	   c                     t               }| j                  |d       t        j                  |j	                               j                  d      }|S )NJPEG)rQ   zutf-8)r   rV   base64	b64encodegetvaluedecode)rz   buffered
base64_imgs      rv   	to_base64r     sC    yH	JJxJ'!!("3"3"56==gFJr   c           	         t        j                  d       t        |||||      }|j                         du rHd }d}t        j
                  j                  d      	 dd l}|j                  ddd	
      }nt        d      t        j                  j                  |      rqt        j                  j                  t        j                         |j                  t        j                         d         }t#        t        j$                  |            }nZt        j                  j'                  |      r!t        j                         }t#        |g      }nt)        dj+                  |            | dk(  r|dk(  rt-        d      ||}|t        j.                  |d        t1        |dz         |      }t3        j2                  t5        |      |dk(  rt5        |      dkD  rdnddd      }|dk(  r0t5        |      dkD  r"t3        j2                  t5        |      ddd      nd }||J d|_        d|j8                  z  }d }|D ]  \  }}t        j                  j;                  |      \  }}|dd  }|	|	n|}|j=                  dj+                  |             | j?                         jA                  tB              rSdj+                  |t        j                  j;                  t        j                  j                  |       d         d         }ndj+                  ||       }|
r|dz  }|dk(  r|tD        jG                  t        j                  j                  || d|       tE        jH                  d |jJ                  |jL                        }|jO                  tD        jP                  d       |jS                          |jU                          tW        |jX                  j[                  tD        j\                              |_        ||j_                          |*|J d|_        d|j8                  z  }|j_                          |dk(  r|||ja                          d }|jc                  || ||
      }|d k(  rd| dk(  r*|j?                         d!k7  rt        jd                  d"       d!}|jg                  t        j                  j                  || d|              n|dk(  rI|G|ji                  tD        jk                  tm        jn                  |      tD        jp                               n|dk(  r5|js                  tm        jn                  |             |ju                          nKtD        jw                  d#tD        jk                  tm        jn                  |      tD        jp                               |j_                          |;|xj6                  z  c_        |j_                          | dk(  rtm        jn                  |      jy                  tl        jz                        } | d d d d d d$fxx   | d d d d dd f   d%z  z  cc<   t}        j~                  | d d d d d d$f   jy                  tl        j                              }t        |j                  d&      j                  d'            |_D        t        |j                  d&      j                  d'            |_D        |j_                          |j_                          ||d(   s n t        d)j+                  t        j                  j                  |                   y #  d }Y xY w)*Nignore)rl   rR   r6   rm   rn   TWebcampyvirtualcamr   i       )widthheightfpszQpyvirtualcam not found. Install with "pip install transparent-background[webcam]"r{   z File or directory {} is invalid.r   Videoz-type 'rgba' cannot be applied to video input.r   Loaderr   Fz,{desc:<15}{percentage:3.0f}%|{bar:50}{r_bar})totalpositionleave
bar_formatzTotal:)r   ru   r   r   z{}z{}_{}_reverse.mp4vr   )r   r   r   r   pngzMOutput format for rgba mode only supports png format. Fallback to png output.ztransparent-backgroundr   r   )r   i,  RGBabortz
Done. Results are saved in {})GrW   filterwarningsr	   	isnumeric	importlibutil	find_specr   Camerar   r(   r+   isdirr.   getcwdrJ   sep
get_formatlistdirr0   FileNotFoundErrorrQ   r^   r/   rL   tqdmr   valuer   splitextset_descriptionr   r   r   r   VideoWriterVideoWriter_fourccr   r   setVIDEOWRITER_PROP_QUALITYrefreshresetr   capr*   CAP_PROP_FRAME_COUNTupdatereleaser   rX   rV   writer   r   r   r   sendsleep_until_next_frameimshowr   r   r   r   r   r   rn   convert
src_base64rj   r,   )!out_typerl   r6   rm   sourcedestrR   r   rn   save_formatr   flet_progress	flet_pagepreviewpreview_outoptionsremoversave_dir_formatr   vcamloaderframe_progresssample_progress	flet_stepwriterr"   r#   filenameextoutnameoutos!                                    rv   entry_pointr    s
   H%4Sd6RGT!>>##N3?##**Sb*I stt	v	77<<		V\\"&&-A"-EFRZZ/0		99;fX&   B I I& QRR6g0LMM
Ht,%T'H$%f-FYY&k')c&kAoAA	N w3v;? 			f+E		
    $$$,,,	F K	T((.#!"g(4k#&&t{{4'89>>$$X.nn  x!8!<=a@G
 nnXx8Gz!Gg&.__X'!C5'9:&&/

	F JJs33S9""$  "#&vzz~~c6N6N'O#PN *&&(( ,,,&'# 4 44	$$&g#+! FoocIwoWg6!ciikU&:mnHHRWW\\(wiq,>?@F$6LLbhhsmS5F5FGH 		"((3-(++-

,cll288C=#J[J[.\ 	$9,  "6!HHSM((4!Q(!Q)s 23ooa1bqbk&8&8&BC!*3::j+A+I+I%+P!QG%.szz*/E/M/Me/T%UK"NN 77#3WKZ 

+
2
2277??83L
MN}s   ] ]	c                     t               } t        | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                         y )N)
parse_argsr  r   rl   r6   rm   r  r  rR   r   rn   rQ   r   )argss    rv   consoler     s{    <D		499dkk499dkk499VZV^V^`d`n`nptp{p{  ~B  ~I  ~I  KO  KW  KW  Xr   )NFNNNNN)+r(   sysr   rH   rE   r7   r1   r   rW   r   r   r   torch.nn.functionalnn
functionalr   torchvision.transformsr_   albumentationsrZ   albumentations.pytorchpytorchrf   PILr   ior   	packagingr   r+   r,   __file__filepathrJ   r3   append!transparent_background.InSPyReNetr   transparent_background.utilsr	   r   r  r   r'   r   rv   <module>r1     s    	 
            +  #   77??8$77=="1%   > *p9 p9dJOXXr   