o
    Vh:                     @   s  d dl mZ d dlmZmZmZ d dlZd dlmZ d dlm	Z
 ddlmZ dd	lmZmZmZ dd
lmZ ddlmZmZmZ ddlmZmZmZ ddlmZmZmZmZm Z  ddlm!Z! ddl"m#Z# g dZ$G dd de!Z%G dd dej&Z'G dd dej&Z(G dd dej&Z)G dd dej*Z+dede,dee- de%fd d!Z.ed"d#d$Z/G d%d& d&eZ0G d'd( d(eZ1G d)d* d*eZ2dede,dee- de%fd+d,Z3e ed-e0j4fd.e j5fd/dd0dde j5d1d2ee0 d3e-dee, d4ee- d5ee  d6ede%fd7d8Z6e ed-e1j4fd.ej5fd/dd0ddej5d1d2ee1 d3e-dee, d4ee- d5ee d6ede%fd9d:Z7e ed-e2j4fd.ej5fd/dd0ddej5d1d2ee2 d3e-dee, d4ee- d5ee d6ede%fd;d<Z8dS )=    )partial)AnyOptionalSequenceN)nn)
functional   )SemanticSegmentation   )register_modelWeightsWeightsEnum)_VOC_CATEGORIES)_ovewrite_value_paramhandle_legacy_interfaceIntermediateLayerGetter)mobilenet_v3_largeMobileNet_V3_Large_WeightsMobileNetV3)ResNet	resnet101ResNet101_Weightsresnet50ResNet50_Weights   )_SimpleSegmentationModel)FCNHead)	DeepLabV3DeepLabV3_ResNet50_WeightsDeepLabV3_ResNet101_Weights$DeepLabV3_MobileNet_V3_Large_Weightsdeeplabv3_mobilenet_v3_largedeeplabv3_resnet50deeplabv3_resnet101c                   @   s   e Zd ZdZdS )r   a  
    Implements DeepLabV3 model from
    `"Rethinking Atrous Convolution for Semantic Image Segmentation"
    <https://arxiv.org/abs/1706.05587>`_.

    Args:
        backbone (nn.Module): the network used to compute the features for the model.
            The backbone should return an OrderedDict[Tensor], with the key being
            "out" for the last feature map used, and "aux" if an auxiliary classifier
            is used.
        classifier (nn.Module): module that takes the "out" element returned from
            the backbone and returns a dense prediction.
        aux_classifier (nn.Module, optional): auxiliary classifier used during training
    N)__name__
__module____qualname____doc__ r(   r(   ]/var/www/vscode/kcb/lib/python3.10/site-packages/torchvision/models/segmentation/deeplabv3.pyr      s    r   c                	       s4   e Zd Zd	dededee ddf fddZ  ZS )
DeepLabHead      $   in_channelsnum_classesatrous_ratesreturnNc                    sB   t  t||tjddddddtdt td|d d S )N   r   r   F)paddingbias)super__init__ASPPr   Conv2dBatchNorm2dReLU)selfr/   r0   r1   	__class__r(   r)   r7   1   s   zDeepLabHead.__init__)r+   )r$   r%   r&   intr   r7   __classcell__r(   r(   r=   r)   r*   0   s    ,r*   c                       s.   e Zd Zdedededdf fddZ  ZS )ASPPConvr/   out_channelsdilationr2   Nc                    s6   t j||d||ddt |t  g}t j|  d S )Nr   F)r4   rC   r5   )r   r9   r:   r;   r6   r7   )r<   r/   rB   rC   modulesr=   r(   r)   r7   <   s
   zASPPConv.__init__)r$   r%   r&   r?   r7   r@   r(   r(   r=   r)   rA   ;   s    &rA   c                       s@   e Zd Zdededdf fddZdejdejfdd	Z  ZS )
ASPPPoolingr/   rB   r2   Nc              	      s4   t  tdtj||dddt|t  d S )Nr   Fr5   )r6   r7   r   AdaptiveAvgPool2dr9   r:   r;   )r<   r/   rB   r=   r(   r)   r7   F   s   zASPPPooling.__init__xc                 C   s2   |j dd  }| D ]}||}q	tj||dddS )NbilinearF)sizemodealign_corners)shapeFinterpolate)r<   rH   rK   modr(   r(   r)   forwardN   s   
zASPPPooling.forward)	r$   r%   r&   r?   r7   torchTensorrR   r@   r(   r(   r=   r)   rE   E   s    rE   c                	       sJ   e Zd Zddedee deddf fddZd	ejdejfd
dZ  Z	S )r8   r3   r/   r1   rB   r2   Nc              
      s   t    g }|ttj||dddt|t  t|}|D ]}|t	||| q#|t
|| t|| _ttjt| j| |dddt|t td| _d S )Nr   FrF   g      ?)r6   r7   appendr   
Sequentialr9   r:   r;   tuplerA   rE   
ModuleListconvslenDropoutproject)r<   r/   r1   rB   rD   ratesrater=   r(   r)   r7   V   s    
$
zASPP.__init__rH   c                 C   s6   g }| j D ]	}||| qtj|dd}| |S )Nr   )dim)rY   rU   rS   catr\   )r<   rH   _resconvresr(   r(   r)   rR   l   s
   

zASPP.forward)r3   )
r$   r%   r&   r?   r   r7   rS   rT   rR   r@   r(   r(   r=   r)   r8   U   s    $r8   backboner0   auxr2   c                 C   sH   ddi}|r
d|d< t | |d} |rtd|nd }td|}t| ||S )Nlayer4outre   layer3return_layersi   i   )r   r   r*   r   )rd   r0   re   rj   aux_classifier
classifierr(   r(   r)   _deeplabv3_resnett   s   
rm   )r   r   z
        These weights were trained on a subset of COCO, using only the 20 categories that are present in the Pascal VOC
        dataset.
    )
categoriesmin_size_docsc                
   @   D   e Zd Zedeeddi edddddd	id
dddZeZdS )r   zHhttps://download.pytorch.org/models/deeplabv3_resnet50_coco-cd0a2569.pth  resize_sizeijzVhttps://github.com/pytorch/vision/tree/main/references/segmentation#deeplabv3_resnet50COCO-val2017-VOC-labelsgP@皙W@miou	pixel_accgvWf@gGzd@
num_paramsrecipe_metrics_ops
_file_sizeurl
transformsmetaN	r$   r%   r&   r   r   r	   _COMMON_METACOCO_WITH_VOC_LABELS_V1DEFAULTr(   r(   r(   r)   r      &    
r   c                
   @   rq   )r   zIhttps://download.pytorch.org/models/deeplabv3_resnet101_coco-586e9e4e.pthrr   rs   ijzQhttps://github.com/pytorch/vision/tree/main/references/segmentation#fcn_resnet101ru   gP@rv   rw   gS+p@gm&m@rz   r   Nr   r(   r(   r(   r)   r      r   r   c                
   @   rq   )r    zMhttps://download.pytorch.org/models/deeplabv3_mobilenet_v3_large-fc3c493d.pthrr   rs   iPK z`https://github.com/pytorch/vision/tree/main/references/segmentation#deeplabv3_mobilenet_v3_largeru   gfffff&N@gV@rw   gCl$@gJ+&E@rz   r   Nr   r(   r(   r(   r)   r       r   r    c                 C   s   | j } dgdd t| D  t| d g }|d }| | j}|d }| | j}t|di}|r6d|t|< t| |d	} |rCt||nd }	t||}
t| |
|	S )
Nr   c                 S   s    g | ]\}}t |d dr|qS )_is_cnF)getattr).0ibr(   r(   r)   
<listcomp>   s     z*_deeplabv3_mobilenetv3.<locals>.<listcomp>r   rg   re   ri   )	features	enumeraterZ   rB   strr   r   r*   r   )rd   r0   re   stage_indicesout_posout_inplanesaux_posaux_inplanesrj   rk   rl   r(   r(   r)   _deeplabv3_mobilenetv3   s   &


r   
pretrainedpretrained_backbone)weightsweights_backboneT)r   progressr0   aux_lossr   r   r   r   r   kwargsc                 K      t | } t|}| dur"d}td|t| jd }td|d}n|du r(d}t|g dd}t|||}| durD|| j	|dd	 |S )
ad  Constructs a DeepLabV3 model with a ResNet-50 backbone.

    .. betastatus:: segmentation module

    Reference: `Rethinking Atrous Convolution for Semantic Image Segmentation <https://arxiv.org/abs/1706.05587>`__.

    Args:
        weights (:class:`~torchvision.models.segmentation.DeepLabV3_ResNet50_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.segmentation.DeepLabV3_ResNet50_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        num_classes (int, optional): number of output classes of the model (including the background)
        aux_loss (bool, optional): If True, it uses an auxiliary loss
        weights_backbone (:class:`~torchvision.models.ResNet50_Weights`, optional): The pretrained weights for the
            backbone
        **kwargs: unused

    .. autoclass:: torchvision.models.segmentation.DeepLabV3_ResNet50_Weights
        :members:
    Nr0   rn   r   T   FTTr   replace_stride_with_dilationr   
check_hash)
r   verifyr   r   rZ   r   r   rm   load_state_dictget_state_dictr   r   r0   r   r   r   rd   modelr(   r(   r)   r"         
%
r"   c                 K   r   )
ai  Constructs a DeepLabV3 model with a ResNet-101 backbone.

    .. betastatus:: segmentation module

    Reference: `Rethinking Atrous Convolution for Semantic Image Segmentation <https://arxiv.org/abs/1706.05587>`__.

    Args:
        weights (:class:`~torchvision.models.segmentation.DeepLabV3_ResNet101_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.segmentation.DeepLabV3_ResNet101_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        num_classes (int, optional): number of output classes of the model (including the background)
        aux_loss (bool, optional): If True, it uses an auxiliary loss
        weights_backbone (:class:`~torchvision.models.ResNet101_Weights`, optional): The pretrained weights for the
            backbone
        **kwargs: unused

    .. autoclass:: torchvision.models.segmentation.DeepLabV3_ResNet101_Weights
        :members:
    Nr0   rn   r   Tr   r   r   r   )
r   r   r   r   rZ   r   r   rm   r   r   r   r(   r(   r)   r#     r   r#   c                 K   s   t | } t|}| dur"d}td|t| jd }td|d}n|du r(d}t|dd}t|||}| durB|| j	|dd |S )	ak  Constructs a DeepLabV3 model with a MobileNetV3-Large backbone.

    Reference: `Rethinking Atrous Convolution for Semantic Image Segmentation <https://arxiv.org/abs/1706.05587>`__.

    Args:
        weights (:class:`~torchvision.models.segmentation.DeepLabV3_MobileNet_V3_Large_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.segmentation.DeepLabV3_MobileNet_V3_Large_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        num_classes (int, optional): number of output classes of the model (including the background)
        aux_loss (bool, optional): If True, it uses an auxiliary loss
        weights_backbone (:class:`~torchvision.models.MobileNet_V3_Large_Weights`, optional): The pretrained weights
            for the backbone
        **kwargs: unused

    .. autoclass:: torchvision.models.segmentation.DeepLabV3_MobileNet_V3_Large_Weights
        :members:
    Nr0   rn   r   Tr   )r   dilatedr   )
r    r   r   r   rZ   r   r   r   r   r   r   r(   r(   r)   r!   S  s   
#
r!   )9	functoolsr   typingr   r   r   rS   r   torch.nnr   rO   transforms._presetsr	   _apir   r   r   _metar   _utilsr   r   r   mobilenetv3r   r   r   resnetr   r   r   r   r   r   fcnr   __all__r   rV   r*   rA   rE   Moduler8   r?   boolrm   r   r   r   r    r   r   IMAGENET1K_V1r"   r#   r!   r(   r(   r(   r)   <module>   s    



33