3 NbK@sddlZddljZddljjZddlZddlmZm Z ddZ dddZ Gdd d ej Z Gd d d ej ZGd d d ej ZdddZdS)N) IMAGENET_STD IMAGENET_MEANcCs|S)N)real_imgpred_imgmaskrrR/home/ec2-user/SageMaker/lama/saicinpainting/training/losses/distance_weighting.pydummy_distance_weighter sr cCs\tjtjtj|tj|ddj}tj||ddjd ||}||j}|S)Nr)dim)torchstackmeshgridarangefloatexpsum) kernel_size width_factorcoordsdiffrrrget_gauss_kernel s   & rcs&eZdZdfdd ZddZZS)BlurMaskr csBtjtjdd||dddd|_|jjjjt||ddS)Nr r replicateF)padding padding_modebias)r) super__init__nnConv2dfilterweightdatacopy_r)selfrr) __class__rrr s zBlurMask.__init__c Cs&tj|j||}|SQRXdS)N)r no_gradr#)r'rrrresultrrrforwards zBlurMask.forward)rr )__name__ __module__ __qualname__r r+ __classcell__rr)r(rrsrcs&eZdZdfdd ZddZZS)EmulatedEDTMaskrr cstjtjdd||dddd|_|jjjjtj dd||tj dtjdd||dddd|_ |j jjjt ||ddS)Nr r rF)rrr)dtype)r) rr r!r" dilate_filterr$r%r&r onesr blur_filterr)r'Zdilate_kernel_sizeZblur_kernel_sizer)r(rrr #s   "zEmulatedEDTMask.__init__c CsDtj2d|}|j|dkj}|jd||}|SQRXdS)Nr )r r)r2rr4)r'rrrZ known_maskZdilated_known_maskr*rrrr++s  zEmulatedEDTMask.forward)rrr )r,r-r.r r+r/rr)r(rr0"sr0cs&eZdZd fdd ZddZZS) PropagatePerceptualSimr c stjtjjddj}g}x|jD] }d|_q(Wd}xl|jD]`} | j j dkrXqDqD| j j dkr||j t j ddddqD|j | | j j d kr|d 7}||krDPqDWt j||_||_||_|dk|_|jrt jd d ||ddd |_|jjjjd dS) NT) pretrainedFr Sequential MaxPool2dr )rstriderReLUr )rr)rr torchvisionmodelsvgg19features parameters requires_gradmodulesr(r,appendr! AvgPool2dr: max_iters temperaturedo_eroder" erode_maskr$r%fill_) r'levelrGrHZerode_mask_sizevggZvgg_avg_poolingweightsZ cur_level_imodule)r(rrr 4s.        zPropagatePerceptualSim.__init__cCsLtj8|tj|tj|}|j|}tj|ddddddf|dddddd fjdjddd |j }tj|ddddddddf|ddddddddfjdjddd |j }t j ||j ddddd}|j r|j|dkj}d|}xt|jD]} t j|ddddddf|dd d } t j|ddddddf|dd d } t j|ddddddddf|dd d } t j|ddddddddf|dd d } tj| | | | gdd jdj}tj||}q*Wt j ||j dddd }tj|d|}|SQRXdS)Nr r T)keepdimbilinearF)sizemode align_cornersrr)rS)r )rRrSrUrU)rrr r)rrrr rU)r rrr)rr rrrV)r r)rtorrArpowrrHF interpolateshaperIrJrrangerGpadrmaxvaluesmin)r'rrrZ real_featsZ vertical_simZhorizontal_simZ mask_scaledZ cur_knownessiter_iZnew_top_knownessZnew_bottom_knownessZnew_left_knownessZnew_right_knownessZ new_knownessr*rrrr+Rs.  H T **00zPropagatePerceptualSim.forward)r r6r7r8)r,r-r.r r+r/rr)r(rr53sr5nonecKsT|dkr tS|dkrtf|S|dkr0tf|S|dkrBtf|Std|dS)NrbblurZedtZppsz$Unknown mask distance weighter kind )r rr0r5 ValueError)kindkwargsrrrmake_mask_distance_weighterus   rg)r )rb)r torch.nnr!torch.nn.functional functionalrYr>Z)saicinpainting.training.losses.perceptualrrr rModulerr0r5rgrrrrs    B