U
    „âhÚ  ã                
   @   s„  d dl Z d dl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
 d dlmZ d dlmZ d dlZd dlZd dlZd dlZd dlmZ d	d
lmZmZ d	dlmZ z<ej ¡ rÀe d¡Zn"ejj ¡ rØe d¡Zn
e d¡ZW n< ek
r  Z  ze!de › ƒ e d¡ZW 5 dZ [ X Y nX G dd„ dej"j#ƒZ$dd„ Z%dd„ Z&dd„ Z'd$dd„Z(dd „ Z)e *¡ ej+ej, e$d!œd"d#„ƒZ-dS )%é    N)ÚImage)Úestimate_alpha_cf)Úestimate_foreground_ml)Ústack_images)Úbinary_erosion)ÚVideoFileClip)ÚHasheré   )ÚdetectÚu2net)Úgithubzcuda:0ÚmpsÚcpuz(Using CPU.  Setting Cuda or MPS failed: c                       s,   e Zd Z‡ fdd„Zejdœdd„Z‡  ZS )ÚNetc                    sŽ  t t| ƒ ¡  tƒ }tjdddftjdddftjdddfdœ| }|d	kr–t d
d¡}tj 	dtj
 tj
 dd|d ¡¡¡}tj
 |¡s”t ||¡ nº|dkrêt d
d¡}tj 	dtj
 tj
 dd|d ¡¡¡}tj
 |¡sèt ||¡ nf|dkrBt d
d¡}tj 	dtj
 tj
 dd|d ¡¡¡}tj
 |¡sPt ||¡ ntdtjd | tj|t t¡d¡ |jttjdd | ¡  || _d S )NZ e4f636406ca4e2af789941e7f139ee2ez!1rbSTGKAE-MTxBYHd-51l2hMOQPT_7EPyZ
U2NET_PATHZ 09fb4e49b7f785c9f855baf94916840aZ!1ao1ovG1Qtx4b7EoskHXmi2E9rp5CHLcZZ 347c3d51b01528e5c6c071e3cff1cb55z!1-Yg0cxgrNhHP-016FPdp902BR-kSsA4P)Úu2netpr   Úu2net_human_segr   é   r	   ZU2NETP_PATHú~z.u2netz.pthr   r   z/Choose between u2net, u2net_human_seg or u2netp)Úfile)Zmap_locationT)ÚdeviceÚdtypeÚnon_blocking)Úsuperr   Ú__init__r   r   ZU2NETPZU2NETÚosÚenvironÚgetÚpathÚ
expanduserÚjoinÚexistsr   Zdownload_files_from_githubÚprintÚsysÚstderrZload_state_dictÚtorchÚloadr   ÚDEVICEÚtoÚfloat32ÚevalÚnet)ÚselfÚ
model_nameZhasherÚmodelr*   r   ©Ú	__class__© úF/var/www/html/venv/lib/python3.8/site-packages/backgroundremover/bg.pyr       sz    ýýý÷óþ
ÿ ÿþ
ÿ ÿ
þ
ÿ ÿzNet.__init__)Úblock_inputc                 C   sÌ   |  dddd¡}|jdd … }tjjj|ddd}|d d	 d
 }|  |¡d d d …dd…f }t |¡}t |¡}|| ||  d }tjjj||dd}|d d …df }|j	tj
t d¡dd ¡ }|S )Nr   r   r	   é   )é@  r4   Zbilinear)Úmodeéÿ   g
×£p=
ß?gZd;ßOÍ?r   T)r   r   r   )ZpermuteÚshaper$   ÚnnZ
functionalZinterpolater*   ÚmaxÚminr'   Úuint8r   Údetach)r+   r2   Ú
image_dataZoriginal_shapeÚoutÚmaÚmir0   r0   r1   Úforwardb   s    

zNet.forward)Ú__name__Ú
__module__Ú__qualname__r   r$   ZTensorrA   Ú__classcell__r0   r0   r.   r1   r      s   Br   c                 C   s  | j }|  ||ftj¡ | | j tj¡}t | ¡} t |¡}||k}||k }d }	|dkrltj||ftjd}	t	||	d}t	||	dd}tj
|jtjdd}
d|
|< d|
|< | d	 }|
d	 }t||ƒ}t||ƒ}t||ƒ}t |d dd¡ tj¡}t |¡}| |tj¡}|S )
Nr   ©r   )Ú	structurer	   )rG   Zborder_valueé€   )r   Z
fill_valuer6   g     ào@)ÚsizeZ	thumbnailr   ÚLANCZOSÚresizeÚnpZasarrayZonesZint64r   Úfullr7   r;   r   r   r   ZclipZastypeÚ	fromarray)ÚimgÚmaskZforeground_thresholdZbackground_thresholdZerode_structure_sizeZ	base_sizerI   Zis_foregroundZis_backgroundrG   ZtrimapZimg_normalizedZtrimap_normalizedÚalphaÚ
foregroundÚcutoutr0   r0   r1   Úalpha_matting_cutoutq   s0    





rT   c                 C   s.   t  d| jd¡}t  | || | jt j¡¡}|S )NZRGBAr   )r   ÚnewrI   Z	compositerK   rJ   )rO   rP   ÚemptyrS   r0   r0   r1   Únaive_cutout¤   s    rW   c                 C   s8   | dkrt jddS | dkr(t jddS t jddS d S )Nr   ©r,   r   r   )r
   Z
load_modelrX   r0   r0   r1   Ú	get_modelª   s
    rY   r   Féð   é
   éè  c              
   C   sÈ   t |ƒ}t| tjƒr&t | ¡ d¡}nLzt t 	| ¡¡ d¡}W n0 t
k
rp }	 ztd|	› ƒ‚W 5 d }	~	X Y nX t |t |¡¡ d¡}
|r¢t||
||||ƒ}n
t||
ƒ}t 	¡ }| |d¡ | ¡ S )NÚRGBz#Invalid image input to `remove()`: ÚLZPNG)rY   Ú
isinstancerL   Zndarrayr   rN   ÚconvertÚopenÚioÚBytesIOÚ	ExceptionÚ
ValueErrorr
   ZpredictÚarrayrT   rW   ÚsaveÚ	getbuffer)Údatar,   Zalpha_mattingZ"alpha_matting_foreground_thresholdZ"alpha_matting_background_thresholdZ"alpha_matting_erode_structure_sizeZalpha_matting_base_sizer-   rO   ÚerP   rS   Zbior0   r0   r1   Úremove³   s*    	 ú	
rk   c                 C   s   t | ƒjddjddS )Nr4   )Úheightr;   rF   )r   ZresizedÚiter_frames)r   r0   r0   r1   rm   Ú   s    rm   ©r=   r*   c                 C   s(   t  | ¡} tj| tjtd} || ƒ ¡ S )N)r   r   )rL   Ústackr$   Z	as_tensorr(   r&   Únumpyrn   r0   r0   r1   Úremove_manyÞ   s    
rq   )r   FrZ   r[   r[   r\   ).rb   r   ÚtypingZPILr   Z!pymatting.alpha.estimate_alpha_cfr   Z+pymatting.foreground.estimate_foreground_mlr   Zpymatting.util.utilr   Zscipy.ndimage.morphologyr   Zmoviepyr   rp   rL   r$   Ztorch.nn.functionalZhsh.library.hashr   r   r
   Ú r   ÚcudaZis_availabler   r&   Úbackendsr   rd   rj   r!   r8   ÚModuler   rT   rW   rY   rk   rm   Zno_gradÚListrf   rq   r0   r0   r0   r1   Ú<module>   sL   
R3      ù
'