3 NbY@sjdZddlZddlZddlZddljZddljjZ ddl m Z ddl m Z ddlmZddlmZdZejjejjeZejjed Zejjed Zee ed ejed ZGd ddZGdddZd#ddZGdddej Z!Gdddej Z"Gdddej Z#Gdddej Z$Gdddej Z%Gdddej Z&Gdd d ej Z'Gd!d"d"ej Z(dS)$zJModified from https://github.com/CSAILVision/semantic-segmentation-pytorchN)loadmat) BatchNorm2d)resnet) mobilenetz color150.matzobject150_info.csvcolors)rclassesc@seZdZdddZddZdS)NormalizeTensorFcCs||_||_||_dS)auNormalize a tensor image with mean and standard deviation. .. note:: This transform acts out of place by default, i.e., it does not mutates the input tensor. See :class:`~torchvision.transforms.Normalize` for more details. Args: tensor (Tensor): Tensor image of size (C, H, W) to be normalized. mean (sequence): Sequence of means for each channel. std (sequence): Sequence of standard deviations for each channel. inplace(bool,optional): Bool to make this operation inplace. Returns: Tensor: Normalized Tensor image. N)meanstdinplace)selfr r r r3/home/ec2-user/SageMaker/lama/models/ade20k/base.py__init__szNormalizeTensor.__init__cCsp|js|j}|j}tj|j||jd}tj|j||jd}|j|dddddfj |dddddf|S)N)dtypedevice) r clonertorch as_tensorr rr sub_div_)rtensorrr r rrr__call__,s0zNormalizeTensor.__call__N)F)__name__ __module__ __qualname__rrrrrrr s r c@sXeZdZeddZedddZeddedd d fd d Zed d ZeddZ dS) ModelBuildercCsV|jj}|jddkr(tjj|jjn*|jddkrR|jjjd|j jjddS)NConvr BatchNormg?g-C6?r!) __class__rfindnninitkaiming_normal_weightdatafill_bias)m classnamerrr weights_init:s zModelBuilder.weights_initresnet50dilatedcCst|dkrdnd}|j}|dkrBtjd|d}t|dd}n|d krdtjd |d}t|}nv|d krtjd |d}t|dd}nP|d krtjd |d}t|dd}n*|d krtjd |d}t|}ntd t|dkr t d|j t j |ddddd|S)NrTFmobilenetv2dilatedZ mobilenetv2) pretrained) dilate_scaleZresnet18Zresnet18dilatedr.Zresnet50zArchitecture undefined!zLoading weights for net_encodercSs|S)Nr)storagelocrrr^sz,ModelBuilder.build_encoder..) map_location)strict) lenlowerr__dict__MobileNetV2DilatedrResnet ResnetDilated Exceptionprintload_state_dictrload)archfc_dimweightsr2Zorig_mobilenetZ net_encoder orig_resnetrrr build_encoderCs.  zModelBuilder.build_encoder ppm_deepsupFcCs|j}|dkr"t||||d}n"|dkr.)r8F)r9) r; PPMDeepsup C1DeepSupr@applyrr-r:rArBrrC)rDrErJrFrKrLZ net_decoderrrr build_decoderas(    zModelBuilder.build_decodercOs2tjj|dd|d|d}tj|||d|dS)Nade20kzade20k--z/decoder_epoch_20.pthT)rDrErFrKrL)ospathjoinrrQ) weights_path arch_encoder arch_decoderrErLartskwargsrUrrr get_decoder|szModelBuilder.get_decodercOs8|r$tjj|dd|d|d}nd}tj|||dS)NrRzade20k-rSz/encoder_epoch_20.pthr0)rDrErF)rTrUrVrrH)rWrXrYrEZ segmentationrZr[rUrrr get_encoders zModelBuilder.get_encoderN)r.r/r0) rrr staticmethodr-rH NUM_CLASSrQr\r]rrrrr8s   rc Cs,tjtj||d|dddt|tjddS)NrF) kernel_sizestridepaddingr*T)r )r$ SequentialConv2drReLU)Z in_planesZ out_planesrbrrrconv3x3_bn_relusrgc sbeZdZdfdd Zd d Zed d Zdd dZddZe ddZ dddZ ddZ Z S)SegmentationModulerr.FNr`Tc  stj||_||_||_|jdkr4d|_d|_n(|jdkrLd|_d|_ntd|jt|j|j|j||jd} t j t j j rd nd |_ |dkrt jf| n||_|dkrt jf| n||_||_td d d gdddgd|_||_| |_d| kodknst| |_dS)Nr.rIir1rMi@zNo such arch_encoder=)rXrYrErLrWcudacpug ףp= ?gv/?gCl?gZd;O?gy&1?g?)r r rr`)superrrWrLrXrYrENotImplementedErrordictrrri is_availablerr]encoderr\decoderuse_default_normalizationr default_normalizationencodereturn_feature_mapsAssertionErrorreturn_feature_maps_level)rrW num_classesrXrLZnet_encZnet_decrsrqrtrvZreturn_feature_maps_onlyr[Zmodel_builder_kwargs)r"rrrs4      zSegmentationModule.__init__cCs*|jdks|jdkr td|j|S)Nrrz2Tensor should be 0..1 before using normalize_input)minmax ValueErrorrr)rrrrrnormalize_inputsz"SegmentationModule.normalize_inputcCsdd|jS)N)rv)rrrrfeature_maps_channelssz(SegmentationModule.feature_maps_channelscCs>|dkrtd|j|dd}|j||d}|jr:||fS|S)Nz1Please pass segSize param. By default: (300, 300)T)rt)segSize)rlrorprt)rimg_datarfmapspredrrrforwardszSegmentationModule.forwardcCs dd}||tj|j|jS)NcSs|d|kjdjS)N.r).Nr!)anyfloat)ar1ar2rrrisinsz;SegmentationModule.multi_mask_from_multiclass..isin)r LongTensortor)rrr rrrrmulti_mask_from_multiclasssz-SegmentationModule.multi_mask_from_multiclasscCsDd}x:|D]2}|dkr(|dd|f}q ||dd|f7}q W|S)Nr)scoresr rescrrr multi_mask_from_multiclass_probss  z3SegmentationModule.multi_mask_from_multiclass_probsrc CsV|dkr|jd d}|jd|jdf}tj|jrF|j|}tjdt|d|dj|j}tjd|j |d|dj|j}g}x|D]}|d krt j |j |d}n|j }|j r|j||d\} } n|j||d} |j| || t|}|j r|t j | |j|dt|}qWtj|dd\} } |j rD|S| |fSQRXdS) aSEntry-point for segmentation. Use this methods instead of forward Arguments: tensor {torch.Tensor} -- BCHW Keyword Arguments: imgSizes {tuple or list} -- imgSizes for segmentation input. default: (300, 450) original implementation: (300, 375, 450, 525, 600) Nr}r`rr)size)r)dimr!)shaperno_gradrqr{zerosr_rrr~F interpolaterrtrappendr:rvry) rrZimgSizesrrfeaturesresultZimg_sizerZ pred_currentr_rrrrpredicts0    "  $zSegmentationModule.predictcCs tjj|jj}|ddddddddf|ddddddddf|ddddddddfkB|ddddddddf<|ddddddddf|ddddddddf|ddddddddfkB|ddddddddf<|ddddddddf|ddddddddf|ddddddddfkB|ddddddddf<|ddddddddf|ddddddddf|ddddddddfkB|dddddd ddf<|jS) Nrr!r!r!r!r!r!r!r!)rri ByteTensorrzero_halfr)rtedgerrr get_edgess||||zSegmentationModule.get_edges) rr.FNNNFFr`T)Nr!r!)rN)rrrrr{propertyr~rrr^rrr __classcell__rr)r"rrhs$#    .rhcs2eZdZeddd dffdd Zd d d ZZS)rNiFrr}r`c stj||_||_g|_xD|D]<}|jjtjtj|tj |ddddt dtj ddq"Wtj |j|_t |d|dd|_tjtj |t|ddd ddd t dtj ddtjd tj d|dd |_tj |d|ddd |_tjd |_dS)NirF)rar*T)r r}r`)rarcr*g?)rar)rkrrKrLppmrr$rdAdaptiveAvgPool2drerrf ModuleListrg cbr_deepsupr: Dropout2d conv_lastconv_last_deepsupdropout_deepsup)rrJrErK pool_scalesrLscale)r"rrr#s*     zPPMDeepsup.__init__Nc Cs|d }|j}|g}x8|jD].}|jtjj|||d|dfdddqWtj|d}|jrf|S|j |}|j rtjj||ddd}tjj |dd}|S|d }|j |} |j | } |j| } tjj|dd}tjj| dd} || fSdS) Nrr}r`bilinearF)mode align_corners)rrr)rr!r)rrrr$ functionalrrcatrLrrKsoftmaxrrr log_softmax) rconv_outrconv5 input_sizeppm_out pool_scalexconv4rrrrr@s0       zPPMDeepsup.forward)rr}r`r)N)rrrr_rrrrr)r"rrN"srNcs&eZdZfddZdddZZS)r>cstt|j|j|_|j|_|j|_|j|_|j|_|j|_|j |_ |j |_ |j |_ |j |_ |j |_ |j|_|j|_|j|_dS)N)rkr>rconv1bn1relu1conv2bn2relu2conv3bn3relu3maxpoollayer1layer2layer3layer4)rrG)r"rrrdszResnet.__init__FcCsg}|j|j|j|}|j|j|j|}|j|j|j|}|j |}|j |}|j ||j |}|j ||j |}|j ||j|}|j ||r|S|gS)N)rrrrrrrrrrrrrrr)rrrtrrrrrws      zResnet.forward)F)rrrrrrrr)r"rr>cs r>cs0eZdZd fdd ZddZd ddZZS) r?r3cstjddlm}|dkrL|jj||jdd|jj||jddn|dkrj|jj||jdd|j|_|j |_ |j |_ |j |_ |j |_ |j |_ |j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_dS)Nr)partialr3r})dilater)rkr functoolsrrrP_nostride_dilaterrrrrrrrrrrrr)rrGr4r)r"rrrs0  zResnetDilated.__init__cCsx|jj}|jddkrt|jdkrVd|_|jdkrt|d|df|_|d|df|_n|jd krt||f|_||f|_dS) Nrrr}r`r!)r}r})rr)r`r`)r`r`)r"rr#rbradilationrc)rr+rr,rrrrs    zResnetDilated._nostride_dilateFcCsg}|j|j|j|}|j|j|j|}|j|j|j|}|j |}|j |}|j ||j |}|j ||j |}|j ||j|}|j ||r|S|gS)N)rrrrrrrrrrrrrrr)rrrtrrrrrs          zResnetDilated.forward)r3)F)rrrrrrrrr)r"rr?sr?cs0eZdZd fdd ZddZd ddZZS) r=r3cstt|jddlm}|jdd |_t|j|_ddddg|_|dkrx8t |jd |jd D]}|j|j ||j dd qdWxvt |jd|jD]}|j|j ||j dd qWn@|d krx4t |jd|jD]}|j|j ||j dd qWdS)Nr)rrr}rr3)rrr!rr!r!r!) rkr=rrrrr: total_idxdown_idxrangerPr)rZorig_netr4ri)r"rrrs       zMobileNetV2Dilated.__init__cCsx|jj}|jddkrt|jdkrVd|_|jdkrt|d|df|_|d|df|_n|jd krt||f|_||f|_dS) Nrrr}r`r!)r}r})rr)r`r`)r`r`)r"rr#rbrarrc)rr+rr,rrrrs    z#MobileNetV2Dilated._nostride_dilateFcCs\|rLg}x4t|jD]&}|j||}||jkr|j|qW|j||S|j|gSdS)N)rrrrr)rrrtrrrrrrs  zMobileNetV2Dilated.forward)r3)F)rrrrrrrrr)r"rr=sr=cs(eZdZd fdd Zd ddZZS) rOrFcsvtt|j||_||_t||dd|_t|d|dd|_tj |d|ddd|_ tj |d|ddd|_ dS)Nrrr}r) rkrOrrKrLrgcbrrr$rerr)rrJrErKrL)r"rrrszC1DeepSup.__init__NcCs|d}|j|}|jr|S|j|}|jrTtjj||ddd}tjj|dd}|S|d}|j|}|j |}tjj |dd}tjj |dd}||fSdS) NrrF)rrr)rr}r!r) rrLrrKr$rrrrrr)rrrrrrrrrrrs     zC1DeepSup.forward)rrFF)N)rrrrrrrr)r"rrOs rOcs(eZdZd fdd Zd ddZZS) C1rFcsBtt|j||_t||dd|_tj|d|ddd|_dS)Nrrr) rkrrrKrgrr$rer)rrJrErK)r"rrr-sz C1.__init__NcCs\|d}|j|}|j|}|jrHtjj||ddd}tjj|dd}ntjj|dd}|S)NrrF)rrr)rr!)rrrKr$rrrr)rrrrrrrrr6s  z C1.forward)rrF)N)rrrrrrrr)r"rr,s rcs(eZdZdfdd Zdd d ZZS)PPMrFrr}r`rc stt|j||_g|_xD|D]<}|jjtjtj|tj |ddddt dtj ddq Wtj |j|_tjtj |t |ddddddt dtj ddtjd tj d|dd |_dS) NirF)rar*T)r r`)rarcr*g?)ra)rkrrrKrrr$rdrrerrfrr:rr)rrJrErKrr)r"rrrGs"    z PPM.__init__NcCs|d }|j}|g}x8|jD].}|jtjj|||d|dfdddqWtj|d}|j|}|j rtjj||ddd}tjj |dd}ntjj |dd}|S) Nrr}r`rF)rr)rrr)rr!) rrrr$rrrrrrKrr)rrrrrrrrrrrr_s     z PPM.forwardrr}r`r)rrFr)N)rrrrrrrr)r"rrFsr)r))__doc__rTpandaspdrtorch.nnr$torch.nn.functionalrrZscipy.iorZtorch.nn.modulesrr0rrr_rUdirnameabspath__file__ base_pathrVZ colors_pathZ classes_pathrmZread_csv segm_optionsr rrgModulerhrNr>r?r=rOrrrrrrs6       S A&B8)