a fd @sddlZddlZddlZddlZddlZddlmZddlmZddl m Z ddl Z ddl m Z mZmZddlmZddlmZmZdQeeejejejejejeeeejeejfd d d ZdRejejejeeejdddZejejjejdddZddl mZm Z ddl!m"Z"ddZ#ddZ$ddZ%dSddZ&ddZ'dTd!d"Z(dUd$d%Z)d&d'Z*d(d)Z+d*d+Z,dVd-d.Z-ejd/d0d1Z.dWe ejeed3d4d5Z/e0d6d7d8Z1eje e0d9d:d;Z2dd?Z4d@dAZ5dBdCZ6e7dDkrddlZddl8mmZddEl9m:Z:ddFlmZm;Z;ddlZejjdGdHdIZ?e=s^e@e=ddKlAmBZBeBdLD]TZCeCj>ZDeCj>EdMrrej>Fe=ej>GeDZHeDIdNdOIdMdPZJesz%prepare_eval_data..c s"g|]}tjd||dqS)rq-1.jpgrsrtrwr-r.rysztest_pairs.txtr.jpg rrrzrnzDressCode-1024)lowerrupperrdressesr)Z013581Z051685Z000190Z050072Z020829Z053742c s0g|](}tjd|||dqS)rqz_1.jpgrsruirxidspartr-r.rysc s0g|](}tjd|||dqS)rqz_0.jpgrsrrr-r.rysz7DressCode dataset does not support non-pair evaluation.roz FARFETCH-1024)zi/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/women/Tops/Blouses/13732751/13732751-2.jpgzi/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/women/Tops/Hoodies/14661627/14661627-4.jpgzs/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/women/Tops/Vests & Tank Tops/16532697/16532697-4.jpgz8Images/men/Pants/Loose Fit Pants/14750720/14750720-6.jpgzh/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/women/Tops/Shirts/10889688/10889688-3.jpgz/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/women/Shorts/Leather & Faux Leather Shorts/20143338/20143338-1.jpgzl/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/women/Jackets/Blazers/15541224/15541224-2.jpgzr/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/men/Polo Shirts/Polo Shirts/17652415/17652415-0.jpg)zi/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/women/Tops/Blouses/13732751/13732751-0.jpgzi/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/women/Tops/Hoodies/14661627/14661627-2.jpgzs/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/women/Tops/Vests & Tank Tops/16532697/16532697-1.jpgz8Images/men/Pants/Loose Fit Pants/14750720/14750720-5.jpgzh/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/women/Tops/Shirts/10889688/10889688-1.jpgz/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/women/Shorts/Leather & Faux Leather Shorts/20143338/20143338-2.jpgzl/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/women/Jackets/Blazers/15541224/15541224-0.jpgzr/home/chongzheng/Projects/hivton/Datasets/FARFETCH-1024/Images/men/Polo Shirts/Polo Shirts/17652415/17652415-4.jpgcsg|]}tj|qSr-rsrurWrwr-r.ryscsg|]}tj|qSr-rsrrwr-r.ryszUnknown dataset name: cSs,g|]$\}}tjtj|||dqS))folderclothperson)rVrWbasenamedirname)ru cloth_image person_imager-r-r.ry s )formatrVrWrXlistdiropen readlinesreplacestripsplitappendrangelenr(zip) Z dataset_root dataset_nameis_pairkeyscloth_image_pathsperson_image_pathsflineslinerrsamplesr-rr.prepare_eval_datasx     (        rcCs^t|t|t|}}}tj|dd}|d}|||d|}t|tjS)Nr5axiso@r)nparray expand_dimsr fromarrayastypeuint8)resultr mask_imagermaskresult_r-r-r.repaint_results "r@c Csd|d|d}}t||ddd}tjgdgdgdgtjddddd|jd|ddd}tjgdgd gd gtjddddd|jd|ddd}t |}t |} t j |d d d }t j ||dd}t j ||dd} t |d| d} |dur,| |} t| dd} t j| |d|dd} | | |} | S)u 计算输入批量图像的Sobel梯度. batch_image: 输入的批量图像张量,大小为 [batch, channels, height, width] r5r)r0rr)rr5r;)r0rr0rrr)rr5r)rrrrreflectmoder)paddingNg?g@) kernel_sizestrider)sizemaxrrjrfviewrrrk zeros_likeFpadconv2dsqrtpowclamp avg_pool2d) Z batch_imagerscalewh pool_kernelZkernel_xZkernel_yZgrad_xZgrad_yZgrad_magnituder-r-r.sobel"s@""    rmeanc Cs|t||d}|r2tdtj||dd}nF||d}||}|dkrZ|}n|dkrl|}n |dkrx|}|S)u 计算x,y的逐元素平方误差,其中x和y是图像张量. 然后利用 x 的 sobel 结果作为权重,计算加权平方误差. x: Tensor, shape [batch, channels, height, width] y: Tensor, shape [batch, channels, height, width] )rzError: NaN Sobel Gradientr) reductionr5sumnone) risnananyprintrmse_lossrrr) rQy referencerrZ ref_sobellossZ squared_errorZweighted_squared_errorr-r-r.sobel_aug_squared_errorPs    rcCst|tjr0|jdkr |d}|jtjd}nt|tjjt j frJ|g}t|t rt|dtjjrdd|D}t j |dd}n2t|t rt|dt j rt j dd|Ddd}| dddd }t|jtjdd d }|S) Nrrr;cSs(g|] }t|ddddfqS)RGBNrrconvertrr-r-r.rytz!prepare_image..rcSsg|]}|dddfqSNr-rr-r-r.rywrrr5g_@r ) isinstancerTensorndim unsqueezerrfPILrrndarraylist concatenate transpose from_numpy)r8r-r-r. prepare_imageis   rcCsDt|tjr|jdkr(|dd}nF|jdkrL|jddkrL|d}n"|jdkrn|jddkrn|d}d||dk<d||dk<nt|tjjtj fr|g}t|t rt|dtjjrtj dd|Ddd}| tj d }n6t|t rt|dtj rtj d d|Ddd}d||dk<d||dk<t|}|S) Nr5rrrrcSs*g|]"}t|dddddfqS)LNrrumr-r-r.ryrz&prepare_mask_image..rrcSsg|]}|ddddfqSrr-rr-r-r.ryr)rrrrrshaperrrrrrrrfr)rr-r-r.prepare_mask_image}s,        rcCsT|jdkr|d}|dd}|jddkrBdd|D}nd d|D}|S) zD Convert a numpy image or a batch of images to a PIL image. r)N.rr0rcSsg|]}tj|ddqS)rr)rrsqueezerur8r-r-r.ryrz numpy_to_pil..cSsg|]}t|qSr-)rrrr-r-r.ryr)rroundrr)images pil_imagesr-r-r. numpy_to_pils rlogocsdfddttjdDddD|dkrgdddDfd dttDfd dttDfS) Nrpcs(g|] }|drtjd|qS)r|r8)endswithrVrWrXru_)root test_namer-r.rys z)load_eval_image_pairs..r8cSsg|]}|ddqS)r8r)r)ruZperson_image_pathr-r-r.rysr)X7Ii6iF0iciHiiiYrrrriVi i> i1)i,ip-iB0iX3i 7i1i-cSsg|]}|ddqS)05dz_00.jpgr-rr-r-r.ryrcs(g|] }tj|vr|qSr-rVrWrr)r filter_pairsr-r.ryscs(g|] }tj|vr|qSr-rr)rrr-r.rys)rVrrWrXsortrr)rrr-)rrrrrr.load_eval_image_pairss$     r)rjcCs|dksJd|jtjks(Jd|dkr@|dksHJd|}|d}|ddd}| t j }t |}|S) z/ Converts a torch tensor to PIL Image. rz%Input tensor should be 3-dimensional.zInput tensor should be float32.rrz'Input tensor should be in range [0, 1].rr5)rr<rrfminrcpupermutenumpyrrrrr)rjr8r-r-r.tensor_to_images   rr)rdividercolsc Csdd|D}dd|D}|t|}|||d7}tt||}t||}||t||d7}td||fd}d} d} t|D]P\} } || | | f| | jd|7} | d|dkrd} | | jd|7} q|S)z3 Concatenates images horizontally and with cSsg|]}|jdqS)rrrr-r-r.ryrz!concat_images..cSsg|]}|jdqS)rr rr-r-r.ryrrrrr) rmathceilrrnew enumeratepaster) rr r widthsheights total_widthrowsZ total_heightZ concat_imagex_offsety_offsetrr8r-r-r. concat_imagess"  r) prompt_filecCs^|durVtj|rVt|d&}|}dd|D}WdqZ1sJ0Yng}|S)Nr{cSsg|] }|qSr-)r)ruZ sample_promptr-r-r.ryrz$read_prompt_file..)rVrWisfilerr)rZsample_prompt_fileZsample_promptsr-r-r.read_prompt_files  .r)tensorspathscCsFt|t|ksJdt||D]\}}tj||dq"dS)Nz/Length of tensors and paths should be the same!)latent)rrrsavez_compressedrr)rrrjrWr-r-r.save_tensors_to_npz#srcCs0tjrtjnd}|dur"gS|jddgS)zn returns either a context list that includes one that will disable zero.Init or an empty context list NF)enable) acceleratestateis_initializedrdeepspeed_pluginzero3_init_context_manager)r$r-r-r.,deepspeed_zero_init_disabled_context_manager)s r&cCsPz0ddl}t|j}|tdkr,tdWdStyJtdYn0dS)Nrz0.0.16zxFormers 0.0.16 cannot be used for training in some GPUs. If you observe problems during training, please update xFormers to at least 0.0.17. See https://huggingface.co/docs/diffusers/main/en/optimization/xformers for more details.Tz>xformers is not available. Make sure it is installed correctly)xformersrparse __version__r ImportErrorr()r'Zxformers_versionr-r-r.is_xformers_available8s  r+cCs|j\}}|\}}||||kr4|}|||}n|}|||}|||d||d||d||df}||tj}|S)Nr5)rcropresizerLANCZOS)r8rrrtarget_wtarget_hnew_wnew_hr-r-r.resize_and_cropKs  *r3c Cs|j\}}|\}}||||kr4|}|||}n|}|||}|||ftj}td|d}||||d||df|S)Nr)rrrr5)rr-rr.rr) r8rrrr/r0r2r1rr-r-r.resize_and_padding]s   r4__main__) transforms)r ImageFilter)rc Cst|d}|j\}}|d|d}}|||f}t|d||f}t|dd}t|dd} t || dd} | } t | dtj} | j||ftjd } | tj} dd lm} | | } t|d||f}tj|| d d } | S) Nrrrcudar )rr)resample)grayscale_to_heatmapr)alpha)rrrrr-r6ToTensorrrrrrrrrrrNEARESTfilterr7SMOOTH data.utilsr;blend) image_path mask_pathr8rrZl_wZl_hrZimage_ptZmask_ptZsobel_ptZ sobel_imager;r-r-r.vis_sobel_weightvs"   rEz./sobel_vis-2.0)scan_files_in_dirzJ/home/chongzheng/Projects/try-on-project/Datasets/VITONHD-1024/test/ImagesrzrqZ AgnosticMaskz _mask-1.png)r )Tr0)T)Nr)Nr)r)rr)LrVr rrrrraccelerate.stater packagingrr!typingrrrtorch.nnrr diffusersr r rr>r/boolintr7nnModulerDrErFaccelerate.utilsrGrbrirlrrrrrrrrrrstrrrr&r+r3r4__name__Ztorch.nn.functional torchvisionr6r7rE save_folderrWexistsmakedirsrArFrrCrrXr result_pathrrDsaver-r-r-r.s      <   m . % 9