o
    øáj»J  ã                   @   s¤  d dl Z d dlmZ d dlZd dlZd dlmZ eeƒ 	¡ j
Zed Zed Zed Zed Zed Zed	 Zed
 Zed Zed Zed Zed Zed Zed Zed Zed Zed Zed Zed Zed ZdZdZ dZ!e j" #dd¡dkZ$e j" #dd¡dkZ%dZ&dZ'dZ(d Z)e rd!nd"Z*d#Z+dZ,d$Z-d%Z.dZ/d&Z0d'Z1d(Z2d)Z3d*d+„ Z4eeefd,d-„Z5d.d/„ Z6d0d1„ Z7d2d3„ Z8d4d5„ Z9d6d7„ Z:d8d9„ Z;d:d;„ Z<dVd<d=„Z=d>d?„ Z>e ?e¡ @d@¡ZAe ?e¡ @dA¡ZBe4eBeAjCƒZDe EeD¡ZBeB Fe¡ e5eAeDƒ e r.e7eDƒZGe8eDeGƒZHe=eAeDeGƒZIe EeH¡ZJe EeG¡ Fe¡ e EeH¡ Fe¡ eI Fe¡ e5eIeGeeeƒ neDZGeDZHeAZIeBZJe!rfe<eIeGƒ\ZKZLeK Fe¡ e EeL¡ Fe¡ e5eKeLeeeƒ eKZIeLZGejMeLejNdBZHe EeH¡ZJe$rle%s¥e>eIeJƒ\ZOZPeO Fe¡ eI Fe¡ e5eIeGeeeƒ eQdCeƒ eQdDeƒ eQdEeƒ eQdFeƒ eQdGeƒ eQdHeƒ eR‚d dlSZSd dIlTmUZU eSjV W¡ r·dJndKZXeJZYe>eIeYƒ\ZZZJeUj[dLeXdJkrÍeSj\neSj]dMZ^e^ _eX¡Z^e^ `¡  dNZadOZbe^eaebeZeJeZjceZjde*dPdQdR	jed  Zfe gefeZeJ¡Zfef Fe¡ ef heAjCejijj¡Zke gekeIeY¡Zke re:ekeIeHƒZkek Fe¡ e5ekeGeeeƒ eQdCeƒ eQdDeƒ eQdSeƒ eQdTeƒ eQdUeƒ eQdEeƒ eQdFeƒ eQdGeƒ eQdHeƒ dS )Wé    N)ÚPath)ÚImagez	input.pngzmask.pngz
result.pngzresult_original_size.pngzmask_binary.pngzextracted_cloth_rgba.pngzextracted_cloth_white.pngzextracted_cloth_crop.pngzcompleted_cloth_mask.pngzmissing_cloth_mask.pngzcompletion_base.pngzcompleted_cloth_rgba.pngzcompleted_cloth_white.pngzcompleted_cloth_crop.pngzfront_cloth_mask.pngzfront_cloth.pngzfront_cloth_rgba.pngzfront_cloth_white.pngzfront_cloth_crop.pngFTÚRUN_INPAINTÚ1Ú0ÚUSE_DIFFUSION_REFINEMENTi   g{®GázÔ?é   é   g      Ð?g333333ë?é"   é+   é   g¤p=
×£ð?g
×£p=
×?éR   g{®Gáz´?c                 C   sL   | j |kr|  |tjj¡} t |  d¡¡}|dk}tr| }| 	tj
¡d S )NÚLé   éÿ   )ÚsizeÚresizer   Ú
ResamplingÚNEARESTÚnpÚarrayÚconvertÚINVERT_MASKÚastypeÚuint8)Úmaskr   Úmask_npÚmask_bin© r   ú htdocs/inpainting/test/test11.pyÚnormalize_mask7   s   
r    c                 C   sþ   t  | ¡}| t j¡}t  ||g¡}t |¡}| |¡ t j|t jdd }	t  	|d dk||	¡}
t |
 t j¡¡ |¡ t  	|dk¡\}}|j
dksP|j
dkrVtdƒ d S t| ¡ ƒt| ¡ ƒt| ¡ ƒd t| ¡ ƒd f}| |¡ |¡ td|ƒ d S )	N©Údtyper   ©.Nr   r   u!   ë§ˆìŠ¤í¬ ì˜ì—­ì´ ì—†ìŠµë‹ˆë‹¤.é   u   ë§ˆìŠ¤í¬ bbox:)r   r   r   r   Údstackr   Ú	fromarrayÚsaveÚ	ones_likeÚwherer   ÚprintÚintÚminÚmaxÚcrop)Úimager   Úrgba_outputÚwhite_outputÚcrop_outputÚimage_npÚalpha_npÚrgba_npÚextracted_rgbaÚwhite_bgÚextracted_whiteÚysÚxsÚbboxr   r   r   Úsave_extracted_imagesD   s&   




ür<   c                 C   sf   | dk  tj¡}tj|dd\}}}}|dkr| S dtt |dd …tjf ¡ƒ }||k  tj¡d S )Nr   é   )Úconnectivityr$   r   )r   r   r   Úcv2ÚconnectedComponentsWithStatsr+   ÚargmaxÚCC_STAT_AREA)r   r   Ú
num_labelsÚlabelsÚstatsÚ_Úlargest_labelr   r   r   Úkeep_largest_componente   s    rH   c                 C   s¶  t | ƒ}tj|tjt dtj¡dd}t |dk¡\}}|jdks&|jdkr(|S |j	\}}t
| ¡ ƒ}t
| ¡ ƒ}t|| dƒ}t
t |¡ƒ}	|t
|t ƒ }
t |¡}||
|d … ||
|d …< t |dk¡\}}|jdk rr|S t ||g¡ tj¡}t |¡}t |¡}t ||d¡ t ||f¡\}}||
k||k@ ||	k@ }t |dk|@ d|¡ tj¡}g }t||
t
|d ƒ ƒ}t|
|d ƒD ]}t || dk¡d }|jd	krá| t
| ¡ ƒ¡ qÆ|rít
t |d
¡ƒ}nt
| ¡ ƒ}t
|	||	 d  ƒ}t|
|d ƒD ]G}t || dk¡d }|jdk rq||
 t||
 dƒ }t
td| | ||  ƒƒ}t|d tt
| ¡ ƒ|ƒƒ}d|||	|d …f< qtj|tjt dtj¡ddS )N)é   rI   r$   ©Ú
iterationsr   r   é   r   ç
×£p=
Ç?é   éZ   g
×£p=
ç?r=   ç      ð?©é   rR   )rH   r?   ÚmorphologyExÚMORPH_CLOSEr   Úonesr   r)   r   Úshaper+   r,   r-   ÚmedianÚCOMPLETE_LOWER_START_RATIOÚ
zeros_likeÚcolumn_stackr   Úint32Ú
convexHullÚfillConvexPolyÚindicesÚrangeÚappendÚ
percentileÚround)r   Ú
clean_maskr9   r:   ÚheightÚwidthÚy_minÚy_maxÚgarment_heightÚcenter_xÚy_startÚ
lower_maskÚlower_ysÚlower_xsÚpointsÚhullÚ	hull_maskÚyyÚxxÚright_lower_regionÚcompleted_maskÚupper_right_edgesÚupper_band_endÚyÚrow_xsÚupper_rightÚlower_rightÚtÚtarget_rightr   r   r   Úcreate_completed_cloth_masko   s€   ü




ÿþÿ
ýü
€ür}   c                 C   sx   t  |dk| dk@ dd¡ t j¡}| ¡ s|S tj|t  ttft j¡dd}t  |dk|d¡ t j¡}t 	|t
t
fd¡S )Nr   r   r   r$   rJ   )r   r)   r   r   Úanyr?   ÚdilaterU   ÚMISSING_MASK_DILATE_KERNELÚGaussianBlurÚMISSING_MASK_BLUR_KERNEL)Úvisible_mask_npÚcompleted_mask_npÚmissing_maskr   r   r   Úcreate_missing_mask»   s    ýüýr†   c                 C   s.  |dk|dk@ }t j| tj¡d t ttftj¡dddk}||dk@ }|  ¡ }t j|dk tj¡d t t	t	ftj¡dddk}t 
|jdd¡d D ]}t 
|| ¡d }	t 
|| ¡d }
|
jdkrqt 
|| dk¡d }
|
jdkrwqMt 
t |	¡dk¡d d }t |	|¡D ]P}|jdkr“q‹|
|
|d t k  }|jdkr¤|
}||j d … }|||f }|jd |jk rÐt j| d|jd d¡|jdft jdd }|d |j… | ||f< q‹qMt  | tj¡d ttfd¡}d||< | tj¡d	 d
 }| tj¡d|  |  tj¡|  }t |dd¡ tj¡S )Nr   r   r$   rJ   )Úaxisr   rL   ©Úinterpolationg     ào@r#   rP   )r?   r   r   r   r   rU   ÚTEXTURE_REPAIR_DILATE_KERNELÚcopyÚerodeÚTEXTURE_SAFE_ERODE_KERNELr)   r~   r   ÚdiffÚsplitÚTEXTURE_SOURCE_EDGE_MARGINrV   r   ÚreshapeÚINTER_LINEARr   ÚTEXTURE_REPAIR_BLUR_KERNELÚfloat32Úclip)Úbase_npr3   rƒ   r„   Úhard_missingÚrepair_maskÚoriginal_base_npÚvisible_saferw   Ú
missing_xsÚ
visible_xsÚsplit_atÚrunÚ	source_xsÚsource_pixelsÚblend_alphaÚalphaÚ
blended_npr   r   r   Úcopy_row_texture_into_missingÎ   sh   ýüýü



ýüïý$r¤   c                 C   s€  t s| S t |dkdd¡ tj¡}| ¡ s| S tj|t dtj¡dd}t |dk¡\}}t	dt
| ¡ ƒd ƒ}t|jd t
| 	¡ ƒd ƒ}t	dt
| ¡ ƒd ƒ}t|jd t
| 	¡ ƒd ƒ}	||ksg|	|kri| S t t | ¡tj¡}
t t |¡tj¡}|
||	…||…f }|||	…||…f }|| d	 ||	 d	 f}zt ||||tj¡}W n tjyµ   |  Y S w t t |tj¡¡S )
Né
   r   r   )é	   r¦   r$   rJ   r=   r¦   é   )ÚSEAMLESS_BLEND_PATCHr   r)   r   r   r~   r?   r   rU   r-   r+   r,   rV   ÚcvtColorr   ÚCOLOR_RGB2BGRÚseamlessCloneÚMIXED_CLONEÚerrorr   r&   ÚCOLOR_BGR2RGB)Ú
result_imgÚbase_imgÚblend_mask_npÚ
clone_maskr9   r:   Úx1Úx2Úy1Úy2Ú
source_bgrÚdest_bgrÚ
source_roiÚmask_roiÚcenterÚblended_bgrr   r   r   Úseamless_blend_patch  s<   ûÿr½   c                 C   sP   t |ƒ}|d dkr|d7 }|dk r| S t |  tj¡ dd¡d|fd¡ d¡S )Nr§   r   r$   rL   éÿÿÿÿ)r+   r?   r   r   r   r”   r‘   )ÚvaluesÚkernel_sizer   r   r   Úsmooth_vector+  s   ýürÁ   c           &   	   C   sÚ  |dk}t  |¡\}}|jdks|jdkr| |fS t  | ¡}|j\}}t| ¡ ƒ}t| ¡ ƒ}	t|	| dƒ}
t j|t j	t j
d}t j|t j	t j
d}t j|t j	t j
d}t||	d ƒD ]-}t  || ¡d }|jdk rlq[t| ¡ ƒ||< t| ¡ ƒ||< || ||  d ||< q[|| d }tt  |¡ƒ}td|t ƒ}t  t  |¡ ||k@ ¡d }|jdk rµ| |fS t| ¡ ƒ}t| ¡ ƒ}	t|	| dƒ}
ttt  || ¡ƒƒ}t  |¡}t  || || ¡}t  |||| ¡}tdtt|
d ƒƒƒ}t||ƒ}|t|
t ƒ }|||k }|jr<tt  || t¡ƒ}|D ]"}td	td
|| t|
d d	ƒ ƒƒ}d	| ||  ||  ||< qt j|t jdd }t j|t jd}|D ]w}t  || ¡d }|jdk rcqPt| ¡ ƒ}t| ¡ ƒ} tttd|| t ƒƒƒ}!td||! ƒ}"t|d ||! ƒ}#|#|" d }$|$dkr™qP|||d …|| d …f }%tj|%|$dftjdd |||"|#d …f< d|||"|#d …f< qPtj |tj!t  "dt j¡dd}t  |d dk|d¡ #t j¡}t$ %|¡|fS )Nr   r   r$   r!   r§   g       @r¦   gš™™™™™¹?rP   g        rM   r   rˆ   rQ   rJ   r#   )&r   r)   r   r   rV   r+   r,   r-   ÚfullÚnanr”   r_   ÚfloatÚnanmaxÚFRONT_MIN_ROW_WIDTH_RATIOÚisnanrb   Ú	nanmedianÚarangeÚmaximumÚinterprÁ   ÚFRONT_BODY_VERTICAL_RATIOra   Ú FRONT_BODY_HALF_WIDTH_PERCENTILEr(   r   rY   ÚFRONT_WIDTH_SCALEr?   r   r’   rS   rT   rU   r   r   r&   )&r/   r   r   r9   r:   r3   rd   re   rf   rg   rh   ÚleftsÚrightsÚcentersrw   rx   Ú
row_widthsÚmax_row_widthÚmin_row_widthÚ
valid_rowsÚtarget_centerÚrow_indicesÚhalf_widthsÚsmooth_kernelÚ
body_startÚ	body_rowsÚ	body_halfÚblendÚfront_npÚfront_mask_nprŸ   Ú	source_x1Ú	source_x2Útarget_halfÚ	target_x1Ú	target_x2Útarget_widthÚsource_stripr   r   r   Úcreate_front_view9  s˜   




ý
" 
ýüürç   c                 C   s\   t  | ¡}t j|t jdd }t  |d dk||¡}|d ur%t||||ƒ}t | t j¡¡S )Nr!   r   r#   r   )	r   r   r(   r   r)   r¤   r   r&   r   )r/   rƒ   r„   r3   r7   r–   r   r   r   Úcreate_completion_base–  s   
rè   c           	      C   s’   | j \}}t||ƒ}t| }tdtt|| d ƒƒd ƒ}tdtt|| d ƒƒd ƒ}||f}|| j kr9| |fS |  |tjj¡| |tjj	¡fS )Nr=   )
r   r-   ÚINPAINT_LONG_SIDEr+   rb   r   r   r   ÚLANCZOSr   )	r/   r   re   rd   Ú	long_sideÚscaleÚ	new_widthÚ
new_heightr   r   r   r   Úresize_for_inpaint   s   


þrï   ÚRGBr   r!   u   ì™„ë£Œ:u   ì›ë³¸ í¬ê¸° ê²°ê³¼:u   ì™„ì„± ë§ˆìŠ¤í¬:u   ë³µì›í•  ì˜ì—­ ë§ˆìŠ¤í¬:u   ì •ë©´í™” ê²°ê³¼:u   ì™„ì„± RGBA:)ÚStableDiffusionInpaintPipelineÚcudaÚcpuz$runwayml/stable-diffusion-inpainting)Útorch_dtypez·
complete only the missing occluded part of the black and white striped t-shirt,
continue the horizontal stripes,
same fabric texture and natural folds,
same lighting,
photorealistic
zŠ
deformed, distorted, bad anatomy,
extra limbs, blurry, low quality,
cartoon, painting, unrealistic,
skin, arm, hand, fingers, logo, text
g      @é(   )	ÚpromptÚnegative_promptr/   Ú
mask_imagere   rd   ÚstrengthÚguidance_scaleÚnum_inference_stepsu   RGBA ì¶”ì¶œ:u   í° ë°°ê²½ ì¶”ì¶œ:u   crop ì¶”ì¶œ:)N)lÚosÚpathlibr   r?   Únumpyr   ÚPILr   Ú__file__ÚresolveÚparentÚBASE_DIRÚ
IMAGE_PATHÚ	MASK_PATHÚOUTPUT_PATHÚOUTPUT_ORIGINAL_SIZE_PATHÚMASK_BINARY_OUTPUTÚEXTRACT_RGBA_OUTPUTÚEXTRACT_WHITE_OUTPUTÚEXTRACT_CROP_OUTPUTÚCOMPLETED_MASK_OUTPUTÚMISSING_MASK_OUTPUTÚCOMPLETION_BASE_OUTPUTÚCOMPLETED_RGBA_OUTPUTÚCOMPLETED_WHITE_OUTPUTÚCOMPLETED_CROP_OUTPUTÚFRONT_MASK_OUTPUTÚFRONT_OUTPUTÚFRONT_RGBA_OUTPUTÚFRONT_WHITE_OUTPUTÚFRONT_CROP_OUTPUTr   ÚCOMPLETE_OCCLUDED_CLOTHÚFRONT_VIEW_NORMALIZEÚenvironÚgetr   r   ré   rX   r€   r‚   ÚINPAINT_STRENGTHr   r   rŠ   r“   r¨   rÎ   rÌ   rÍ   rÆ   r    r<   rH   r}   r†   r¤   r½   rÁ   rç   rè   rï   Úopenr   r/   r   r   r   r&   r'   r„   Úmissing_mask_npÚinpaint_baseÚinpaint_maskÚfront_imagerß   rY   r   Úpreview_imagerF   r*   Ú
SystemExitÚtorchÚ	diffusersrñ   rò   Úis_availableÚDEVICEÚinpaint_mask_original_sizeÚinpaint_imageÚfrom_pretrainedÚfloat16r”   ÚpipeÚtoÚenable_attention_slicingrö   r÷   re   rd   ÚimagesÚresultÚ	compositer   r   rê   Úresult_original_sizer   r   r   r   Ú<module>   sJ   
û!
L7&
]






û
û


û





þ

÷
ö

û







