a
    d@:                     @   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+ee,ee- e%dddZ.edd d!Z/G d"d# d#eZ0G d$d% d%eZ1G d&d' d'eZ2ee,ee- e%dd(d)Z3e ed*e0j4fd+e j5fd,dd-dde j5d.ee0 e-ee, ee- ee  ee%d/d0d1Z6e ed*e1j4fd+ej5fd,dd-ddej5d.ee1 e-ee, ee- ee ee%d/d2d3Z7e ed*e2j4fd+ej5fd,dd-ddej5d.ee2 e-ee, ee- ee ee%d/d4d5Z8dS )6    )partial)AnyListOptionalN)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(   r/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torchvision/models/segmentation/deeplabv3.pyr      s   r   c                       s&   e Zd Zeedd fddZ  ZS )DeepLabHeadN)in_channelsnum_classesreturnc                    sF   t  t|g d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+   r,   	__class__r(   r)   r5   1   s    zDeepLabHead.__init__r$   r%   r&   intr5   __classcell__r(   r(   r;   r)   r*   0   s   r*   c                       s(   e Zd Zeeedd fddZ  ZS )ASPPConvN)r+   out_channelsdilationr-   c                    s6   t j||d||ddt |t  g}t j|  d S )Nr   F)r2   rB   r3   )r   r7   r8   r9   r4   r5   )r:   r+   rA   rB   modulesr;   r(   r)   r5   <   s
    zASPPConv.__init__r=   r(   r(   r;   r)   r@   ;   s   r@   c                       s:   e Zd Zeedd fddZejejdddZ  ZS )ASPPPoolingN)r+   rA   r-   c              	      s4   t  tdtj||dddt|t  d S )Nr   Fr3   )r4   r5   r   ZAdaptiveAvgPool2dr7   r8   r9   )r:   r+   rA   r;   r(   r)   r5   F   s    zASPPPooling.__init__xr-   c                 C   s2   |j dd  }| D ]}||}qtj||dddS )NZbilinearF)sizemodeZalign_corners)shapeFZinterpolate)r:   rG   rI   modr(   r(   r)   forwardN   s    
zASPPPooling.forward)	r$   r%   r&   r>   r5   torchTensorrN   r?   r(   r(   r;   r)   rD   E   s   rD   c                       sB   e Zd Zd	eee edd fddZejejdddZ  Z	S )
r6   r1   N)r+   atrous_ratesrA   r-   c              
      s   t    g }|ttj||dddt|t  t|}|D ]}|t	||| qF|t
|| t|| _ttjt| j| |dddt|t td| _d S )Nr   FrE   g      ?)r4   r5   appendr   
Sequentialr7   r8   r9   tupler@   rD   Z
ModuleListconvslenZDropoutproject)r:   r+   rQ   rA   rC   ZratesZrater;   r(   r)   r5   V   s     
$zASPP.__init__rF   c                 C   s6   g }| j D ]}||| q
tj|dd}| |S )Nr   )Zdim)rU   rR   rO   catrW   )r:   rG   Z_resconvresr(   r(   r)   rN   l   s
    
zASPP.forward)r1   )
r$   r%   r&   r>   r   r5   rO   rP   rN   r?   r(   r(   r;   r)   r6   U   s   r6   )backboner,   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,   r\   r_   aux_classifier
classifierr(   r(   r)   _deeplabv3_resnett   s    
rb   )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                
   @   sD   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  Zresize_sizeijzVhttps://github.com/pytorch/vision/tree/main/references/segmentation#deeplabv3_resnet50COCO-val2017-VOC-labelsgP@皙W@ZmiouZ	pixel_accgvWf@gGzd@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$   
r   c                
   @   sD   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   zIhttps://download.pytorch.org/models/deeplabv3_resnet101_coco-586e9e4e.pthrd   re   ijzQhttps://github.com/pytorch/vision/tree/main/references/segmentation#fcn_resnet101rf   gP@rg   rh   gS+p@gm&m@ri   rk   Nrn   r(   r(   r(   r)   r      s$   
r   c                
   @   sD   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    zMhttps://download.pytorch.org/models/deeplabv3_mobilenet_v3_large-fc3c493d.pthrd   re   iPK z`https://github.com/pytorch/vision/tree/main/references/segmentation#deeplabv3_mobilenet_v3_largerf   gfffff&N@gV@rh   gCl$@gJ+&E@ri   rk   Nrn   r(   r(   r(   r)   r       s$   
r    c                 C   s   | j } dgdd t| D  t| d g }|d }| | j}|d }| | j}t|di}|rld|t|< t| |d	} |rt||nd }	t||}
t| |
|	S )
Nr   c                 S   s    g | ]\}}t |d dr|qS )Z_is_cnF)getattr).0ibr(   r(   r)   
<listcomp>       z*_deeplabv3_mobilenetv3.<locals>.<listcomp>r   r]   r\   r^   )	features	enumeraterV   rA   strr   r   r*   r   )r[   r,   r\   Zstage_indicesZout_posZout_inplanesZaux_posZaux_inplanesr_   r`   ra   r(   r(   r)   _deeplabv3_mobilenetv3   s    &


r}   Z
pretrainedZpretrained_backbone)weightsweights_backboneT)r~   progressr,   aux_lossr   )r~   r   r,   r   r   kwargsr-   c                 K   s   t | } t|}| durDd}td|t| jd }td|d}n|du rPd}t|g dd}t|||}| dur|| j	|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:
    Nr,   rc   r   T   FTTr~   Zreplace_stride_with_dilationr   )
r   verifyr   r   rV   rm   r   rb   load_state_dictget_state_dictr~   r   r,   r   r   r   r[   modelr(   r(   r)   r"      s    %

r"   c                 K   s   t | } t|}| durDd}td|t| jd }td|d}n|du rPd}t|g dd}t|||}| dur|| j	|d	 |S )
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:
    Nr,   rc   r   Tr   r   r   r   )
r   r   r   r   rV   rm   r   rb   r   r   r   r(   r(   r)   r#     s    %

r#   c                 K   s   t | } t|}| durDd}td|t| jd }td|d}n|du rPd}t|dd}t|||}| dur|| j	|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:
    Nr,   rc   r   Tr   )r~   Zdilatedr   )
r    r   r   r   rV   rm   r   r}   r   r   r   r(   r(   r)   r!   S  s    #

r!   )9	functoolsr   typingr   r   r   rO   r   Ztorch.nnr   rL   Ztransforms._presetsr	   Z_apir   r   r   Z_metar   _utilsr   r   r   Zmobilenetv3r   r   r   Zresnetr   r   r   r   r   r   Zfcnr   __all__r   rS   r*   r@   rD   Moduler6   r>   boolrb   ro   r   r   r    r}   rp   ZIMAGENET1K_V1r"   r#   r!   r(   r(   r(   r)   <module>   s   
 
33