3 NbD@sdZddljZddlZddlmZddlmZeZdgZ ddiZ dd Z d d Z Gd d d ej ZGdddej ZdddZdS)z} This MobileNetV2 implementation is modified from the following repository: https://github.com/tonylins/pytorch-mobilenet-v2 N)load_url)SynchronizedBatchNorm2d mobilenetv2zNhttp://sceneparsing.csail.mit.edu/model/pretrained_resnet/mobilenet_v2.pth.tarc Cs,tjtj||d|dddt|tjddS)NrF)biasT)inplace)nn SequentialConv2d BatchNorm2dReLU6)inpoupstrider8/home/ec2-user/SageMaker/lama/models/ade20k/mobilenet.pyconv_bnsrc Cs,tjtj||dddddt|tjddS)NrrF)rT)r)r r r r r )rrrrr conv_1x1_bnsrcs$eZdZfddZddZZS)InvertedResidualcstt|j||_|d ks tt||}|jdko<||k|_|dkrtjtj ||d|d|ddt |tj ddtj ||ddddd t ||_ nntjtj ||ddddd t |tj ddtj ||d|d|ddt |tj ddtj ||ddddd t ||_ dS) NrrF)groupsrT)rr)r)rr) superr__init__rAssertionErrorrounduse_res_connectr r r r r conv)selfrrr expand_ratioZ hidden_dim) __class__rrr's*     zInvertedResidual.__init__cCs"|jr||j|S|j|SdS)N)rr)rxrrrforwardHszInvertedResidual.forward)__name__ __module__ __qualname__rr" __classcell__rr)r rr&s !rcs.eZdZd fdd ZddZdd ZZS) MobileNetV2?c shtt|jt}d}d}ddddgddddgddddgdd d dgdd ddgdd ddgdd ddgg}|ddksttt||}|dkrt||n||_td|dg|_xp|D]h\}} } } t| |} xNt | D]B} | dkr|jj ||| | |dn|jj ||| d|d| }qWqW|jj t ||jt j |j|_t j t jdt j|j||_|jdS)N irrr@`i@rg?)rg?)rr'rrrint last_channelrfeaturesrangeappendrr r DropoutLinear classifier_initialize_weights)rn_class input_sizeZ width_multblockZ input_channelr4Zinterverted_residual_settingtcnsZoutput_channeli)r rrrPs8         zMobileNetV2.__init__cCs(|j|}|jdjd}|j|}|S)Nrr)r5meanr:)rr!rrrr"{s  zMobileNetV2.forwardcCsx|jD]}t|tjrf|jd|jd|j}|jjjdt j d||j dk r|j jj q t|t r|jjjd|j jj q t|tjr |jjd}|jjjdd|j jj q WdS)Nrrg@g{Gz?)modules isinstancer r kernel_size out_channelsweightdatanormal_mathsqrtrzero_r fill_r9size)rmrArrrr;s     zMobileNetV2._initialize_weights)r(r)r*)r#r$r%rr"r;r&rr)r rr'Os+r'FcKs0tfddi|}|r,|jttddd|S)z|Constructs a MobileNet_V2 model. Args: pretrained (bool): If True, returns a model pre-trained on ImageNet r<irF)strict)r'load_state_dictr model_urls) pretrainedkwargsmodelrrrrs)F)__doc__torch.nnr rLutilsrZ segm_lib.nnrr __all__rTrrModulerr'rrrrrs   )B