U
    (d                     @   sn   d Z ddlZddlmZ ddlmZmZmZmZm	Z	 ddl
Z
ddl
mZ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)TupleListDictOptionalUnion)nnTensor   )_log_api_usage_oncec                       sP   e Zd ZdZejejejejdd fddZejj	dd Z
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__ Q/tmp/pip-unpacked-wheel-vx7f76es/torchvision/models/detection/generalized_rcnn.pyr      s    
zGeneralizedRCNN.__init__c                 C   s   | j r
|S |S )N)training)r   losses
detectionsr   r   r   eager_outputs&   s    zGeneralizedRCNN.eager_outputsc              	   C   s2  | j r|dk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k	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
isinstancer	   lenshapetypeappendr   	enumerateanywheretolistr   Ztensorsr   r   r   Zimage_sizespostprocessupdatejitZis_scriptingr   warningswarnr   )r   Zimagestargets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   forward.   s\    

(


zGeneralizedRCNN.forward)N)__name__
__module____qualname____doc__r   Moduler   r&   r2   Zunusedr   r:   __classcell__r   r   r   r   r      s
   "

r   )r>   r3   collectionsr   typingr   r   r   r   r   r&   r   r	   utilsr   r?   r   r   r   r   r   <module>   s   