o ) iD@sddlmZddlmZddlmZddlZddlmZddl mm Z ddl m Z ddlmZmZddlmZmZddlmZgd ZGd d d ejZGd d d ejZGdddejZGdddejZGdddejZeZZ Z!dS)) annotations)Sequence)OptionalN)pad) ConvolutionUpSample)ConvPool)ensure_tuple_rep)BasicUnetPlusPlusBasicunetPlusPlusbasicunetplusplusBasicUNetPlusPlusKernelModifiedc@seZdZdZddZdS) MCDropout3du>MC Dropout:无论 model.train()/eval() 都启用随机失活cCstj||jd|jdS)NT)ptraininginplace)F dropout3drr)selfxro/home/dell461/cl/sdc2/last_ska_mid/HISourceFinder-master-l/src/monai/networks/nets/basic_unetplusplus_origin.pyforward&szMCDropout3d.forwardN)__name__ __module__ __qualname____doc__rrrrrr#s rcs,eZdZdZ    ddfdd ZZS)TwoConvztwo convolutions.r!r!r#r!r#r#r# spatial_dimsintin_chnsout_chnsact str | tuplenormbiasbooldropout float | tuple kernel_sizeOptional[tuple]paddingstridec sZtt||||||||| d } t||||||||| d } |d| |d| dS) Args: spatial_dims: number of spatial dimensions. in_chns: number of input channels. out_chns: number of output channels. act: activation type and arguments. norm: feature normalization type and arguments. bias: whether to have a bias term in convolution blocks. dropout: dropout ratio. Defaults to no dropout. )r)r+r.r,r0r2conv_0conv_1N)super__init__r add_module) rr%r'r(r)r+r,r.r0r2r3r5r6 __class__rrr8-s2   zTwoConv.__init__)rr r"r$)r%r&r'r&r(r&r)r*r+r*r,r-r.r/r0r1r2r1r3r1rrrrr8 __classcell__rrr:rr*s rcs*eZdZdZ   ddfdd ZZS)Downz-maxpooling downsampling and two convolutions.rr r"r%r&r'r(r)r*r+r,r-r.r/r0r1r2c sRttd|fdd} t||||||||| d } |d| |d| dS)r4MAXrAr#r0r0r2 max_poolingconvsN)r7r8r rr9) rr%r'r(r)r+r,r.r0r2rDrEr:rrr8ds  z Down.__init__)rr r")r%r&r'r&r(r&r)r*r+r*r,r-r.r/r0r1r2r1r<rrr:rr>as  r>cs@eZdZdZ         d)d*fd!d" Zd+d'd(ZZS),UpCatzHupsampling, concatenation with the encoder feature map, two convolutionsrdeconvdefaultlinearTr r"r%r&r'cat_chnsr(r)r*r+r,r-r.r/upsamplestrpre_convnn.Module | str | None interp_mode align_corners bool | Nonehalvesis_padr0r1r2c svt| dkr| dur|}n| r|dn|}t|||d| | | | |d |_t||||||||||d |_||_dS)a6 Args: spatial_dims: number of spatial dimensions. in_chns: number of input channels to be upsampled. cat_chns: number of channels from the encoder. out_chns: number of output channels. act: activation type and arguments. norm: feature normalization type and arguments. bias: whether to have a bias term in convolution blocks. dropout: dropout ratio. Defaults to no dropout. upsample: upsampling mode, available options are ``"deconv"``, ``"pixelshuffle"``, ``"nontrainable"``. pre_conv: a conv block applied before upsampling. Only used in the "nontrainable" or "pixelshuffle" mode. interp_mode: {``"nearest"``, ``"linear"``, ``"bilinear"``, ``"bicubic"``, ``"trilinear"``} Only used in the "nontrainable" mode. align_corners: set the align_corners parameter for upsample. Defaults to True. Only used in the "nontrainable" mode. halves: whether to halve the number of channels during upsampling. This parameter does not work on ``nontrainable`` mode if ``pre_conv`` is `None`. is_pad: whether to pad upsampling features to fit features from encoder. Defaults to True. nontrainableNrAr@)moderMrOrPr0rC)r7r8rrKrrErS)rr%r'rJr(r)r+r,r.rKrMrOrPrRrSr0r2up_chnsr:rrr8s6 *  zUpCat.__init__r torch.Tensorx_eOptional[torch.Tensor]cCs||}|durXtj|tjrX|jrJt|jd}dg|d}t|D]}|j| d|j| dkr@d||dd<q&tj j ||d}| tj ||gdd}|S| |}|S)z Args: x: features to be upsampled. x_e: optional features from the encoder, if None, this branch is not in use. NrArr# replicatedim)rKtorchjit isinstanceTensorrSlenshaperangenn functionalrrEcat)rrrXx_0 dimensionsspirrrrs    z UpCat.forward) rrGrHrITTTr r") r%r&r'r&rJr&r(r&r)r*r+r*r,r-r.r/rKrLrMrNrOrLrPrQrRr-rSr-r0r1r2r1)rrWrXrY)rrrrr8rr=rrr:rrFs GrFc sReZdZddddddddd fd d difdd d d f d&fd d! Zd'd$d%ZZS)(BasicUNetPlusPlusr!r#rA) rl@rlF LeakyReLUg?T)negative_sloperinstanceaffinerrGr%r& in_channels out_channelsfeatures Sequence[int]deep_supervisionr-r)r*r+r,r.r/rKrL dropout_pfloatc sBt||_| |_t|d} td| dt||| d|||| dd|_t|| d| d|||| dd|_ t|| d| d|||| dd|_ t|| d| d |||| dd|_ t|| d | d |||| dd|_ t || d| d| d|||| | d dd |_t || d| d| d|||| | d dd |_t || d | d| d|||| | d dd |_t || d | d | d |||| | d dd |_t || d| dd| d|||| | d dd |_t || d| dd| d|||| | d dd |_t || d | dd| d|||| | d dd |_t || d| dd | d|||| | d dd |_t || d| dd | d|||| | d dd |_t || d| dd | d |||| | d dd |_|jrb|jdkrbt|jnt|_td|f| d|dd|_td|f| d|dd|_td|f| d|dd|_td|f| d |dd|_ dS)a A UNet++ implementation with 1D/2D/3D supports. Based on: Zhou et al. "UNet++: A Nested U-Net Architecture for Medical Image Segmentation". 4th Deep Learning in Medical Image Analysis (DLMIA) Workshop, DOI: https://doi.org/10.48550/arXiv.1807.10165 Args: spatial_dims: number of spatial dimensions. Defaults to 3 for spatial 3D inputs. in_channels: number of input channels. Defaults to 1. out_channels: number of output channels. Defaults to 2. features: six integers as numbers of features. Defaults to ``(32, 32, 64, 128, 256, 32)``, - the first five values correspond to the five-level encoder feature sizes. - the last value corresponds to the feature size after the last upsampling. deep_supervision: whether to prune the network at inference time. Defaults to False. If true, returns a list, whose elements correspond to outputs at different nodes. act: activation type and arguments. Defaults to LeakyReLU. norm: feature normalization type and arguments. Defaults to instance norm. bias: whether to have a bias term in convolution blocks. Defaults to True. According to `Performance Tuning Guide `_, if a conv layer is directly followed by a batch norm layer, bias should be False. dropout: dropout ratio. Defaults to no dropout. upsample: upsampling mode, available options are ``"deconv"``, ``"pixelshuffle"``, ``"nontrainable"``. Examples:: # for spatial 2D >>> net = BasicUNetPlusPlus(spatial_dims=2, features=(64, 128, 256, 512, 1024, 128)) # for spatial 2D, with deep supervision enabled >>> net = BasicUNetPlusPlus(spatial_dims=2, features=(64, 128, 256, 512, 1024, 128), deep_supervision=True) # for spatial 2D, with group norm >>> net = BasicUNetPlusPlus(spatial_dims=2, features=(64, 128, 256, 512, 1024, 128), norm=("group", {"num_groups": 4})) # for spatial 3D >>> net = BasicUNetPlusPlus(spatial_dims=3, features=(32, 32, 64, 128, 256, 32)) See Also - :py:class:`monai.networks.nets.BasicUNet` - :py:class:`monai.networks.nets.DynUNet` - :py:class:`monai.networks.nets.UNet` zBasicUNetPlusPlus features: .r)r!r!rBr#rAr!F)rRr0convN)!r7r8rxryr printrconv_0_0r>conv_1_0conv_2_0conv_3_0conv_4_0rF upcat_0_1 upcat_1_1 upcat_2_1 upcat_3_1 upcat_0_2 upcat_1_2 upcat_2_2 upcat_0_3 upcat_1_3 upcat_0_4rrdIdentitymc_dropout_outrfinal_conv_0_1final_conv_0_2final_conv_0_3final_conv_0_4) rr%rtrurvrxr)r+r,r.rKryfear:rrr8s A                             zBasicUNetPlusPlus.__init__rrWcCs$||}||}|||}||}|||}||tj||gdd}||}| ||} | | tj||gdd} | | tj|||gdd} | |} | | |} || tj|| gdd}||tj||| gdd}||tj|||| gdd}||}||}|g}|S)a Args: x: input should have spatially N dimensions ``(Batch, in_channels, dim_0[, dim_1, ..., dim_N-1])``, N is defined by `dimensions`. It is recommended to have ``dim_n % 16 == 0`` to ensure all maxpooling inputs have even edge lengths. Returns: A torch Tensor of "raw" predictions in shape ``(Batch, out_channels, dim_0[, dim_1, ..., dim_N-1])``. r#r[)rrrrrrr]rfrrrrrrrrrrr)rrx_0_0x_1_0x_0_1x_2_0x_1_1x_0_2x_3_0x_2_1x_1_2x_0_3x_4_0x_3_1x_2_2x_1_3x_0_4 output_0_4outputrrrrs&          zBasicUNetPlusPlus.forward)r%r&rtr&rur&rvrwrxr-r)r*r+r*r,r-r.r/rKrLryrz)rrW)rrrr8rr=rrr:rrks   rk)" __future__rcollections.abcrtypingrr]torch.nnrdtorch.nn.functionalrernumpyrmonai.networks.blocksrrmonai.networks.layers.factoriesrr monai.utilsr __all__ Dropout3dr Sequentialrr>ModulerFrkr r r rrrrs&     7,eB