o
    V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 g d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 dede!dee" defddZ#e
 edej$fd ej%fd!d"d#d"d"ej%d$d%ee d&e"dee! d'ee" d(ee d)edefd*d+Z&e
 ede j$fd ej%fd!d"d#d"d"ej%d$d%ee  d&e"dee! d'ee" d(ee d)edef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    W/var/www/vscode/kcb/lib/python3.10/site-packages/torchvision/models/segmentation/fcn.pyr      s    r   c                       s*   e Zd Zdededdf fddZ  ZS )FCNHeadin_channelschannelsreturnNc              	      sP   |d }t j||ddddt |t  t dt ||dg}t j|  d S )N   r   r   F)paddingbiasg?)r   Conv2dBatchNorm2dReLUDropoutsuper__init__)selfr#   r$   inter_channelslayers	__class__r    r!   r.   %   s   zFCNHead.__init__)r   r   r   intr.   __classcell__r    r    r2   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.
    )
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   zBhttps://download.pytorch.org/models/fcn_resnet50_coco-1167a1af.pth  resize_sizeijzPhttps://github.com/pytorch/vision/tree/main/references/segmentation#fcn_resnet50COCO-val2017-VOC-labelsg     @N@gV@miou	pixel_accgmc@g?5^I`@
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                
   @   r9   )r   zChttps://download.pytorch.org/models/fcn_resnet101_coco-7ecb50ca.pthr:   r;   ij<zWhttps://github.com/pytorch/vision/tree/main/references/segmentation#deeplabv3_resnet101r=   gO@gV@r>   gV-m@gni@rA   rG   NrK   r    r    r    r!   r   Q   rO   r   backbonenum_classesauxr%   c                 C   sH   ddi}|r
d|d< t | |d} |rtd|nd }td|}t| ||S )Nlayer4outrR   layer3)return_layersi   i   )r   r"   r   )rP   rQ   rR   rV   aux_classifier
classifierr    r    r!   _fcn_resnetf   s   
rY   
pretrainedpretrained_backbone)weightsweights_backboneNT)r\   progressrQ   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 )
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:
    NrQ   r6   r_   T   FTTr\   replace_stride_with_dilationr^   
check_hash)
r   verifyr   r   lenrJ   r   rY   load_state_dictget_state_dictr\   r^   rQ   r_   r]   r`   rP   modelr    r    r!   r   u      
(
r   c                 K   ra   )
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:
    NrQ   r6   r_   Trb   rc   rd   rf   )
r   rh   r   r   ri   rJ   r   rY   rj   rk   rl   r    r    r!   r      rn   r   )(	functoolsr   typingr   r   torchr   transforms._presetsr   _apir	   r
   r   _metar   _utilsr   r   r   resnetr   r   r   r   r   r   __all__r   
Sequentialr"   rL   r   r   r4   boolrY   rM   IMAGENET1K_V1r   r   r    r    r    r!   <module>   s    

6