o
    ¨ájs>  ã                
   @   s"  d dl Z d dlZd dlZd dlmZ d dlmZ dZdZ	dZ
dZdZd	Zd
ZdZej ¡ r/dndZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dd„ Z%dd„ Z&d d!„ Z'd"d#„ Z(d$d%„ Z)d&d'„ Z*d(d)„ Z+d*d+„ Z,d,d-„ Z-d.d/„ Z.e /e¡ 0d0¡Z1e1 2d1¡Z1e /e	¡ 0d2¡Z3e3 2d1¡Z3er«e'e1e3ƒ\Z1Z3Z4e5d3e4 d4›d5ƒ erÅe(e1e3ƒ\Z1Z3Z6e5d6e6d  d7›d8e6d9 d7›ƒ e 7e3¡Z8erÚe+e1j9ƒZ:e ;e:¡ <e¡ neráe*e8ƒZ:n	e!rèe)e8ƒZ:ne8Z:e =eefej>¡Z?e j@e:e?d9d:ZAe  BeAeefd ¡ZAe ;eA¡ZCeC <e¡ e 7e1¡ZDejEe8gd d;d<ZFe GeD¡d= ZHe IeFd>keDeH¡ZJe ;eJ Kej>¡¡ZLeL <e
¡ erJe-eDe8e:ƒZMeM <e¡ neLZMejNd?edkrWejOnejPd@ZQeQ Re¡ZQdAZSdBZTejUedC Ve¡ZWeQeSeTeMeCeeeeWdDjXd  ZYer…e.eYe:ƒZYeY <e¡ e5dEeƒ dS )Fé    N)ÚImage)ÚStableDiffusionInpaintPipelinez	image.jpgzmask.pngzextracted_cloth.pngzproduct_cloth.pngzinpaint_mask.pngzinpaint_base.pngzproduct_shape_mask.pngzbrand_removal_mask.pngÚcudaÚcpué   é   é-   g       @gš™™™™™é?é*   Tg      6@FgÃõ(\ÂÕ?g)\Âõ(Ì?g{®GázÄ?ç{®Gáz´?gš™™™™™É?c                 C   s&  | dk}t  |jdd¡d }|jdk rdS t|d ƒ}t|d ƒ}t|| dƒ}g }g }t||d ƒD ]-}|| | }	|	dk sD|	d	krEq4t  || ¡d }
|
jd
k rTq4| |¡ | t  |
¡¡ q4t	|ƒdk rjdS t  
t j|t jdt j|t jdd¡\}}tt  t  |¡¡ƒ}tt  |t t¡ƒS )uY   ë§ˆìŠ¤í¬ì˜ ì„¸ë¡œ ì¤‘ì‹¬ì„ ì„ ê¸°ì¤€ìœ¼ë¡œ ì˜·ì´ ê¸°ìš¸ì–´ì§„ ê°ë„ë¥¼ ì¶”ì •í•œë‹¤.é   é   ©Úaxisr   é   ç        éÿÿÿÿr
   gq=
×£pí?r   ©Údtype)ÚnpÚwhereÚanyÚsizeÚintÚmaxÚrangeÚappendÚmedianÚlenÚpolyfitÚasarrayÚfloat32ÚfloatÚdegreesÚarctanÚclipÚMAX_STRAIGHTEN_ANGLE)Úmask_npÚmask_binÚrowsÚy_minÚy_maxÚgarment_heightÚysÚcentersÚyÚrel_yÚxsÚslopeÚ_Úangle© r4   ú)htdocs/inpainting/StableDiffusion/test.pyÚestimate_cloth_angle-   s.   


*r6   c                 C   s\   t  | ¡}t  |¡}tj|||tjtjdd}tj|||tjtjdd}t |¡t |¡fS )N)éÿ   r7   r7   )ÚflagsÚ
borderModeÚborderValuer   )	r   ÚarrayÚcv2Ú
warpAffineÚINTER_CUBICÚBORDER_CONSTANTÚINTER_NEARESTr   Ú	fromarray)ÚimageÚmaskÚmatrixr   Úimage_npr&   Úwarped_imageÚwarped_maskr4   r4   r5   Úwarp_image_and_maskN   s&   

úú	rH   c                 C   sr   t  |¡}t|ƒ}t|ƒdk r| ||fS | j\}}|d |d f}t || d¡}t| ||||fƒ\} }| ||fS )Nç      à?é   ç      ð?)r   r;   r6   Úabsr   r<   ÚgetRotationMatrix2DrH   )rB   rC   r&   r3   ÚwidthÚheightÚcenterrD   r4   r4   r5   Ústraighten_clothf   s   



rQ   c                 C   sÒ   t  |¡}t  |dk¡\}}|jdks|jdkr| |dfS | j\}}t| ¡ ƒt| ¡ ƒ d }t| ¡ ƒt| ¡ ƒ d }|d | }	|d | }
t  dd|	gdd|
gg¡}t| ||||fƒ\} }| ||	|
ffS )Nr   r   )r   r   rJ   r   )	r   r;   r   r   r!   Úminr   r    rH   )rB   rC   r&   r,   r0   rN   rO   Úcloth_center_xÚcloth_center_yÚtxÚtyrD   r4   r4   r5   Úcenter_cloth_on_canvass   s   


rW   c                 C   s&  t  | dk¡\}}|jdks|jdkr| S | j\}}t| ¡ ƒ}t| ¡ ƒ}t| ¡ ƒ}t| ¡ ƒ}t|| dƒ}	t|| dƒ}
ttd|	t ƒƒ}ttd|
t ƒƒ}ttd|
t	 ƒƒ}td|| ƒ}t|d || ƒ}td|| ƒ}t|d || ƒ}t j
| t jd}d|||d …||d …f< |S )	uy   ì†Œë§¤ì™€ ì˜· ì‹¤ë£¨ì—£ì„ ì •ìžì„¸ë¡œ ë‹¤ì‹œ ê·¸ë¦´ ìˆ˜ ìžˆë„ë¡ ì˜ë¥˜ ì£¼ë³€ ë°•ìŠ¤ê¹Œì§€ ë§ˆìŠ¤í¬ì— í¬í•¨í•œë‹¤.r   r   r   é   é   é$   r   r7   )r   r   r   Úshaper   rR   r   ÚPOSTURE_MASK_PADDING_XÚPOSTURE_MASK_PADDING_TOPÚPOSTURE_MASK_PADDING_BOTTOMÚ
zeros_likeÚuint8)r&   r,   r0   rO   rN   Úx_minÚx_maxr)   r*   Úcloth_widthÚcloth_heightÚpad_xÚpad_topÚ
pad_bottomÚx1Úx2Úy1Úy2Úredraw_maskr4   r4   r5   Úcreate_posture_redraw_mask„   s(   
rm   c              
      sÈ  | dk}t  |¡\}}|jdks|jdkr| S | j\}}t| ¡ ƒ}t| ¡ ƒ}t|| dƒ}tt  |¡ƒ‰ |t|d ƒ }	|t|d ƒ }
g }t|	|
d ƒD ]C}t  || ¡d }|jdk r`qOt  t  	|¡dk¡d d }t  
||¡}t|‡ fdd„d	}|jd
kr’| t|d ƒt|d ƒf¡ qO|r®tt  dd„ |D ƒ¡ƒ}tt  dd„ |D ƒ¡ƒ}ntt  |d¡ƒ}tt  |d¡ƒ}t|| dƒ}tt  |t dd¡ƒ}ttd|t ƒƒ}|t|d ƒ }t|d |t|d ƒ ƒ}t  |dd¡ t j¡}t jtd|| ƒ|gt|d || ƒ|gt|d || ƒ|gtd|t|d ƒ ƒ|ggt jd}t jtd|| ƒ|gt|d || ƒ|gt|d |t|d ƒ ƒ|gtd|| ƒ|ggt jd}t |||gd¡ |S )uc   ë²Œì–´ì§„ ì†Œë§¤ë¥¼ ì§€ìš°ê³  ëª¸í†µ ì˜† ì•„ëž˜ ë°©í–¥ ì†Œë§¤ë¥¼ ìƒˆë¡œ ê·¸ë¦´ ê³µê°„ì„ ë§Œë“ ë‹¤.r   r   r   rI   g…ëQ¸…ë?é   c                    sB   | d ˆ   kr| d krdS  t t| d ˆ  ƒt| d ˆ  ƒƒS )Nr   r   )rR   rL   )Úrun©Úcenter_xr4   r5   Ú<lambda>¹   s   B z3create_attention_pose_redraw_mask.<locals>.<lambda>)ÚkeyrX   r   c                 S   ó   g | ]}|d  ‘qS )r   r4   ©Ú.0Úboundsr4   r4   r5   Ú
<listcomp>¿   ó    z5create_attention_pose_redraw_mask.<locals>.<listcomp>c                 S   rt   )r   r4   ru   r4   r4   r5   rx   À   ry   é#   éA   é"   é:   r   ç
×£p=
Ç?g\Âõ(\ï?r7   gö(\Âõè?r   )r   r   r   r[   r   rR   r   r   r   ÚdiffÚsplitr   Ú
percentiler$   ÚATTENTION_SLEEVE_WIDTH_RATIOÚATTENTION_SLEEVE_OVERLAP_RATIOÚastyper`   r;   Úint32r<   ÚfillPoly)r&   r'   r,   r0   rO   rN   r)   r*   r+   Úlower_y1Úlower_y2Útorso_boundsr.   Úrow_xsÚsplit_atÚrunsÚcentral_runÚtorso_x1Útorso_x2Útorso_widthÚsleeve_widthÚoverlapÚ	sleeve_y1Ú	sleeve_y2rl   Úleft_sleeveÚright_sleever4   rp   r5   Ú!create_attention_pose_redraw_mask    sl   


þ
€üûüûr—   c              
      sš   | \}}|d ‰ |d ‰‡ ‡fdd„}t j||ft jd}|g d¢ƒ}t ||gd¡ t |t|d ƒt|d ƒft|d	 ƒt|d
 ƒfddddd¡ |S )uX   ì°¸ê³  ì´ë¯¸ì§€ì²˜ëŸ¼ ìžì—°ìŠ¤ëŸ¬ìš´ ìƒí’ˆì»· ìŠ¤ì›¨íŠ¸ì…”ì¸  ì‹¤ë£¨ì—£ì„ ë§Œë“ ë‹¤.g      €@c                    s    t j‡ ‡fdd„| D ƒt jdS )Nc                    s0   g | ]\}}t t|ˆ  ƒƒt t|ˆ ƒƒg‘qS r4   )r   Úround)rv   Úxr.   ©Úscale_xÚscale_yr4   r5   rx   è   s   0 zBcreate_product_sweatshirt_mask.<locals>.points.<locals>.<listcomp>r   )r   r;   r…   )Úcoordsrš   r4   r5   Úpointsæ   s   þz.create_product_sweatshirt_mask.<locals>.pointsr   ))éÍ   él   )éì   éy   )i  r¢   )i3  r    )ib  é€   )éŒ  é    )iº  é2  )iä  éÈ  )i°  éÜ  )i€  r¤   )i\  é¸  )é¤   r©   )r£   r¤   )éP   r¨   )é   r§   )éF   r¦   )ét   r¥   )éž   r£   r7   rI   g\Âõ(\Ï?gáz®Gáº?gÛù~j¼t£?r   ih  r   )r   Úzerosr`   r<   r†   Úellipser   )r   rN   rO   rž   r&   Úsweatshirt_outliner4   rš   r5   Úcreate_product_sweatshirt_maskà   s$   ør³   c                 C   sR   | |dk }|j dkrtjg d¢tjdS tj|dd}t |dd¡}| tj¡S )Nr   r   )é¼   é¾   éÀ   r   r   é¬   éÖ   )r   r   r;   r`   r   r$   r„   )rE   r&   Úcloth_pixelsÚcolorr4   r4   r5   Úestimate_cloth_color  s   
r»   c                 C   sR  t j| t jdd }t| |ƒ}|j\}}t  ||f¡\}}|t|d dƒ }	|t|d dƒ }
t  |
d d dd¡}dt  |	d	 d
 d  ¡ dt  |	d d d  ¡  dt  |	d d d  ¡  | }dt  	|	d ¡ }t j
 t¡}| dd||df¡}|d |d  | }t  | t j¡| dd¡ t j¡}||dk ||dk< t |¡S )Nr   r7   r   r~   g×£p=
×ã?r   rK   g      Àg…ëQ¸…Û?gyé&1¬œ?rJ   g      @g\Âõ(\ß?gìQ¸…ë¡?g       Àg=
×£p=â?g¸…ëQ¸ž?g      $ÀrI   gš™™™™™@).Nr   r   )r   Ú	ones_liker`   r»   r[   Úindicesr   r$   ÚexprL   ÚrandomÚdefault_rngÚGENERATOR_SEEDÚnormalr„   r    r   rA   )rE   Úsource_mask_npÚtarget_mask_npÚbase_npÚcloth_colorrO   rN   ÚyyÚxxÚx_normÚy_normÚvertical_fadeÚfold_shadowsÚside_shadingÚrngÚ
knit_noiseÚtextureÚ
product_npr4   r4   r5   Úcreate_product_inpaint_base  s*   

ÿþü"
rÒ   c           !      C   s  t  | ¡}|j\}}t|d ƒ}t|d ƒ}t|d ƒ}t|d ƒ}|||…||…f }	|||…||…f dk}
|	jdksA|
 ¡ sC| S tj|
 t j	¡d t  
dt j	¡d	d
dk}t |	tj¡}t |	tj¡}||
 }tt  |¡ƒ}|t  | t j¡| ¡dk|d dkt  | t j¡| ¡dk@ B @  t j	¡d }t |tjt  
dt j	¡¡}tj|dd\}}}}t  |¡}td	|ƒD ]n}t||tjf ƒ}t||tjf ƒ}t||tjf ƒ}t||tjf ƒ}t||tjf ƒ}|t|d	ƒ }d|  koúdkn  od|  kodkn  od|  kodkn  }|dk }|r)|r)d|||k< q»| ¡ sAt t j||ft j	d¡  t!¡ | S tj"|t  
dt j	¡d	d
}t #|dd¡}t j||ft j	d}||||…||…f< t  $|dk|d¡ t j	¡}t |¡  t!¡ t %||dtj&¡} t | ¡S )ue   ì™¼ìª½ ì•„ëž˜ ëª¸íŒì— ìƒì„±ë˜ëŠ” ìž‘ì€ ìƒí‘œ/íŒ¨ì¹˜ë§Œ ê°ì§€í•´ ì£¼ë³€ ì›ë‹¨ìœ¼ë¡œ ë©”ìš´ë‹¤.g333333Ó?gÍÌÌÌÌÌÜ?gHáz®Gá?gR¸…ëQè?r   r   r7   )é   rÓ   r   ©Ú
iterationsr|   ).r   rY   )rJ   rJ   rn   )Úconnectivityi„  r   é>   r	   g      @r   )é   rØ   )r   r   r   )'r   r;   r[   r   r   r   r<   Úeroder„   r`   ÚonesÚcvtColorÚCOLOR_RGB2GRAYÚCOLOR_RGB2HSVr!   r   rL   r    ÚmorphologyExÚ
MORPH_OPENÚconnectedComponentsWithStatsr_   r   ÚCC_STAT_AREAÚCC_STAT_LEFTÚCC_STAT_TOPÚCC_STAT_WIDTHÚCC_STAT_HEIGHTr   r   rA   r°   ÚsaveÚOUTPUT_BRAND_MASKÚdilateÚGaussianBlurr   ÚinpaintÚINPAINT_TELEA)!Ú
result_imgÚgarment_mask_npÚ	result_nprO   rN   rh   ri   rj   rk   ÚroiÚroi_garmentÚsafe_garmentÚgrayÚhsvÚgarment_grayÚlocal_medianÚ	candidateÚ
num_labelsÚlabelsÚstatsr2   Úremoval_roiÚlabelÚareaÚcomp_xÚcomp_yÚcomp_wÚcomp_hÚaspectÚis_logo_sizedÚis_not_long_seamÚremoval_maskÚ
cleaned_npr4   r4   r5   Ú!remove_lower_left_brand_artifacts+  sl   

ýü$ÿþ
ú
P€
 
r  ÚRGB)é   r  ÚLu   ì •ìžì„¸ íšŒì „ ë³´ì •: z.2fu   ë„u   ì¤‘ì•™ ì •ë ¬ ë³´ì •: x=z.1fz, y=r   rÔ   r   r   r7   r   z$runwayml/stable-diffusion-inpainting)Útorch_dtypeap  
ecommerce photo of a plain unbranded light gray crewneck sweatshirt,
empty garment, no hanger, no mannequin, no visible label,
front view, centered,
dropped shoulders, sleeves gently angled downward,
ribbed collar, ribbed cuffs, ribbed bottom hem,
heather gray cotton fleece texture, subtle vertical wrinkles,
pure white background, soft studio lighting, sharp focus
zç
hanger,
hook,
rack,
mannequin,
human,
person,
face,
hands,
skin,
arms,
model,
side view,
folded,
flat lay,
distorted,
warped,
extra sleeves,
cropped,
logo,
label,
tag,
neck label,
text,
brand patch,
black patch,
low quality,
blur
)Údevice)ÚpromptÚnegative_promptrB   Ú
mask_imageÚnum_inference_stepsÚguidance_scaleÚstrengthÚ	generatoru   ì™„ë£Œ:)Zr<   ÚtorchÚnumpyr   ÚPILr   Ú	diffusersr   Ú
IMAGE_PATHÚCLOTH_MASK_PATHÚOUTPUT_EXTRACTEDÚOUTPUT_RESULTÚOUTPUT_INPAINT_MASKÚOUTPUT_INPAINT_BASEÚOUTPUT_PRODUCT_MASKrç   r   Úis_availableÚDEVICEÚMASK_DILATE_KERNELÚMASK_BLUR_KERNELÚNUM_INFERENCE_STEPSÚGUIDANCE_SCALEÚINPAINT_STRENGTHrÁ   ÚSTRAIGHTEN_CLOTHÚCENTER_CLOTHr%   ÚPRODUCT_SILHOUETTEÚREMOVE_LOWER_LEFT_BRANDÚATTENTION_POSEr‚   rƒ   ÚPOSTURE_REDRAW_MASKr\   r]   r^   r6   rH   rQ   rW   rm   r—   r³   r»   rÒ   r  ÚopenÚconvertrB   ÚresizerC   Ústraightened_angleÚprintÚcloth_offsetr;   r&   r   Úinpaint_mask_nprA   ræ   rÚ   r`   Úkernelrè   Úexpanded_maskré   Úexpanded_mask_imgrE   ÚstackÚmask_3chr¼   Úwhite_bgr   Ú
cloth_onlyr„   Úcloth_only_imgÚinpaint_base_imgÚfrom_pretrainedÚfloat16r    ÚpipeÚtor  r  Ú	GeneratorÚmanual_seedr  ÚimagesÚresultr4   r4   r4   r5   Ú<module>   sÈ    !@'
H

 







þ

ø	÷

