a
    hA                     @   s^   d Z ddlZddlmZ ddlmZmZ ddlZddlmZ ddl	m
Z
 G dd	 d	ejZdS )
z,
Implements the Generalized R-CNN framework
    N)OrderedDict)OptionalUnion)nn   )_log_api_usage_oncec                	       s   e Zd ZdZejejejejdd fddZejj	e
eejf ee
eejf  ee
eejf ee
eejf  f dddZdeej eee
eejf   ee
eejf ee
eejf  f d	d
dZ  ZS )GeneralizedRCNNad  
    Main class for Generalized R-CNN.

    Args:
        backbone (nn.Module):
        rpn (nn.Module):
        roi_heads (nn.Module): takes the features + the proposals from the RPN and computes
            detections / masks from it.
        transform (nn.Module): performs the data transformation from the inputs to feed into
            the model
    N)backbonerpn	roi_heads	transformreturnc                    s4   t    t|  || _|| _|| _|| _d| _d S )NF)super__init__r   r   r	   r
   r   _has_warned)selfr	   r
   r   r   	__class__ [/var/www/auris/lib/python3.9/site-packages/torchvision/models/detection/generalized_rcnn.pyr      s    
zGeneralizedRCNN.__init__)losses
detectionsr   c                 C   s   | j r
|S |S )N)training)r   r   r   r   r   r   eager_outputs,   s    zGeneralizedRCNN.eager_outputs)imagestargetsr   c              	   C   s2  | j r|du rtdd nf|D ]`}|d }t|tjrhtt|jdkoV|jd dkd|j d	 q tdd
t| d	 q g }|D ]L}|jdd }tt|dkd|jdd   ||d |d f q| 	||\}}|dur|t
|D ]\}}|d }|ddddf |ddddf k}	|	 rt|	jddd d }
||
  }tdd| d| d	 q| |j}t|tjrtd|fg}| |||\}}| |||j|\}}| j	||j|}i }|| || tj r"| jstd d| _||fS | ||S dS )a  
        Args:
            images (list[Tensor]): images to be processed
            targets (list[dict[str, tensor]]): ground-truth boxes present in the image (optional)

        Returns:
            result (list[BoxList] or dict[Tensor]): the output from the model.
                During training, it returns a dict[Tensor] which contains the losses.
                During testing, it returns list[BoxList] contains additional fields
                like `scores`, `labels` and `mask` (for Mask R-CNN models).

        NFz0targets should not be none when in training modeboxes      z:Expected target boxes to be a tensor of shape [N, 4], got .z0Expected target boxes to be of type Tensor, got zJexpecting the last two dimensions of the Tensor to be H and W instead got r      )ZdimzLAll bounding boxes should have positive height and width. Found invalid box z for target at index 0z=RCNN always returns a (Losses, Detections) tuple in scriptingT)r   torchZ_assert
isinstanceTensorlenshapetypeappendr   	enumerateanywheretolistr	   Ztensorsr   r
   r   Zimage_sizespostprocessupdatejitZis_scriptingr   warningswarnr   )r   r   r   targetr   Zoriginal_image_sizesimgvalZ
target_idxZdegenerate_boxesZbb_idxZdegen_bbfeaturesZ	proposalsZproposal_lossesr   Zdetector_lossesr   r   r   r   forward5   sn    

(


zGeneralizedRCNN.forward)N)__name__
__module____qualname____doc__r   Moduler   r$   r1   Zunuseddictstrr&   listr   r   r   tupler8   __classcell__r   r   r   r   r      s"   " "r   )r<   r2   collectionsr   typingr   r   r$   r   utilsr   r=   r   r   r   r   r   <module>   s   