U
    h#                     @   s  d dl mZ d dlmZ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mZmZ ddlmZ dddddgZG dd deZG dd dejZedddZG dd deZG dd deZ ee!ee" edddZ#e
 edej$fdej%fdd d!d d ej%d"ee e"ee! ee" ee eed#d$dZ&e
 ede j$fdej%fdd d!d d ej%d"ee  e"ee! ee" ee eed#d%dZ'd S )&    )partial)AnyOptional)nn   )SemanticSegmentation   )register_modelWeightsWeightsEnum)_VOC_CATEGORIES)_ovewrite_value_paramhandle_legacy_interfaceIntermediateLayerGetter)ResNet	resnet101ResNet101_Weightsresnet50ResNet50_Weights   )_SimpleSegmentationModelFCNFCN_ResNet50_WeightsFCN_ResNet101_Weightsfcn_resnet50fcn_resnet101c                   @   s   e Zd ZdZdS )r   a  
    Implements FCN model from
    `"Fully Convolutional Networks for Semantic Segmentation"
    <https://arxiv.org/abs/1411.4038>`_.

    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    U/var/www/html/venv/lib/python3.8/site-packages/torchvision/models/segmentation/fcn.pyr      s   c                       s&   e Zd Zeedd fddZ  ZS )FCNHeadN)in_channelschannelsreturnc              	      sP   |d }t j||ddddt |t  t dt ||dg}t j|  d S )N   r   r   F)paddingZbiasg?)r   ZConv2dZBatchNorm2dZReLUZDropoutsuper__init__)selfr#   r$   Zinter_channelsZlayers	__class__r    r!   r)   %   s    zFCNHead.__init__)r   r   r   intr)   __classcell__r    r    r+   r!   r"   $   s   r"   )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.
    )
categoriesZmin_sizeZ_docsc                
   @   s@   e Zd Zedeeddedddddd	id
dddZeZdS )r   zBhttps://download.pytorch.org/models/fcn_resnet50_coco-1167a1af.pth  Zresize_sizeijzPhttps://github.com/pytorch/vision/tree/main/references/segmentation#fcn_resnet50COCO-val2017-VOC-labelsg     @N@gV@ZmiouZ	pixel_accgmc@g?5^I`@Z
num_paramsZrecipeZ_metricsZ_ops
_file_sizeurlZ
transformsmetaN	r   r   r   r
   r   r   _COMMON_METACOCO_WITH_VOC_LABELS_V1DEFAULTr    r    r    r!   r   <   s    
c                
   @   s@   e Zd Zedeeddedddddd	id
dddZeZdS )r   zChttps://download.pytorch.org/models/fcn_resnet101_coco-7ecb50ca.pthr0   r1   ij<zWhttps://github.com/pytorch/vision/tree/main/references/segmentation#deeplabv3_resnet101r2   gO@gV@r3   gV-m@gni@r4   r6   Nr9   r    r    r    r!   r   Q   s    
)backbonenum_classesauxr%   c                 C   sH   ddi}|rd|d< t | |d} |r.td|nd }td|}t| ||S )NZlayer4outr?   Zlayer3)return_layersi   i   )r   r"   r   )r=   r>   r?   rA   Zaux_classifier
classifierr    r    r!   _fcn_resnetf   s    
rC   Z
pretrainedZpretrained_backbone)weightsweights_backboneNT)rD   progressr>   aux_lossrE   )rD   rF   r>   rG   rE   kwargsr%   c                 K   s   t | } t|}| dk	rDd}td|t| jd }td|d}n|dkrPd}t|dddgd}t|||}| dk	r|| j	|dd	 |S )
a\  Fully-Convolutional Network model with a ResNet-50 backbone from the `Fully Convolutional
    Networks for Semantic Segmentation <https://arxiv.org/abs/1411.4038>`_ paper.

    .. betastatus:: segmentation module

    Args:
        weights (:class:`~torchvision.models.segmentation.FCN_ResNet50_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.segmentation.FCN_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: parameters passed to the ``torchvision.models.segmentation.fcn.FCN``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/segmentation/fcn.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.segmentation.FCN_ResNet50_Weights
        :members:
    Nr>   r/   rG   T   FrD   Zreplace_stride_with_dilationrF   Z
check_hash)
r   verifyr   r   lenr8   r   rC   load_state_dictget_state_dictrD   rF   r>   rG   rE   rH   r=   modelr    r    r!   r   u   s    (

c                 K   s   t | } t|}| dk	rDd}td|t| jd }td|d}n|dkrPd}t|dddgd}t|||}| dk	r|| j	|dd	 |S )
aa  Fully-Convolutional Network model with a ResNet-101 backbone from the `Fully Convolutional
    Networks for Semantic Segmentation <https://arxiv.org/abs/1411.4038>`_ paper.

    .. betastatus:: segmentation module

    Args:
        weights (:class:`~torchvision.models.segmentation.FCN_ResNet101_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.segmentation.FCN_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: parameters passed to the ``torchvision.models.segmentation.fcn.FCN``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/segmentation/fcn.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.segmentation.FCN_ResNet101_Weights
        :members:
    Nr>   r/   rG   TrI   FrJ   rK   )
r   rL   r   r   rM   r8   r   rC   rN   rO   rP   r    r    r!   r      s    (

)(	functoolsr   typingr   r   Ztorchr   Ztransforms._presetsr   Z_apir	   r
   r   _metar   Z_utilsr   r   r   Zresnetr   r   r   r   r   r   __all__r   Z
Sequentialr"   r:   r   r   r-   boolrC   r;   ZIMAGENET1K_V1r   r   r    r    r    r!   <module>   sx   
6