U
    ­Ê¹jV/  ã                   @   s   d dl Z d dlmZmZmZmZmZ d dlZd dlZd dlm	Z	m
Z
 ddlmZ ddlmZ ejje
e
dœdd	„ƒZejje
ed
œdd„ƒZde
eeeeee
f  eeeef  ee
eeee
f  f dœdd„ZG dd„ de	jƒZe
ee ee e
dœdd„Ze
ee ee e
dœdd„ZdS )é    N)ÚAnyÚDictÚListÚOptionalÚTuple)ÚnnÚTensoré   )Ú	ImageList)Úpaste_masks_in_image©ÚimageÚreturnc                 C   s   ddl m} | | ¡dd … S )Nr   )Ú	operatorséþÿÿÿ)Z
torch.onnxr   Zshape_as_tensor)r   r   © r   úe/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchvision/models/detection/transform.pyÚ_get_shape_onnx   s    r   )Úvr   c                 C   s   | S )Nr   )r   r   r   r   Ú_fake_cast_onnx   s    r   )r   Úself_min_sizeÚself_max_sizeÚtargetÚ
fixed_sizer   c                 C   sx  t  ¡ rt| ƒ}nt | jdd … ¡}d }d }d }|d k	rL|d |d g}n tj ¡ s^t  ¡ rÆt |¡j	tj
d�}	t |¡j	tj
d�}
t|ƒ}t|ƒ}t ||	 ||
 ¡}t  ¡ r¼t|ƒ}qè| ¡ }n"t|ƒ}	t|ƒ}
t||	 ||
 ƒ}d}tjjj| d  ||d|dd�d } |d k�r | |fS d	|k�rp|d	 }tjjj|d d …d f  ¡ |||d
�d d …df  ¡ }||d	< | |fS )Nr   r	   r   )ÚdtypeTZbilinearF)ÚsizeÚscale_factorÚmodeÚrecompute_scale_factorZalign_cornersÚmasks)r   r   r   )ÚtorchvisionÚ_is_tracingr   ÚtorchÚtensorÚshapeÚjitZis_scriptingÚminÚtoÚfloat32ÚmaxÚfloatr   Úitemr   Ú
functionalZinterpolateÚbyte)r   r   r   r   r   Zim_shaper   r   r   Úmin_sizeÚmax_sizeZself_min_size_fZself_max_size_fÚscaleÚmaskr   r   r   Ú_resize_image_and_masks   sZ    


úù	

   ÿ
þ
r2   c                
       s†  e Zd ZdZd!eeee ee eeeeef  e	dœ‡ fdd„Z
d"ee eeeeef   eeeeeeef   f dœdd	„Zeed
œdd„Zee edœdd„Zd#eeeeef  eeeeeef  f dœdd„Zejjd$ee eedœdd„ƒZeee  ee dœdd„Zd%ee eedœdd„Zeeeef  eeeef  eeeef  eeeef  dœdd„Zedœdd „Z‡  ZS )&ÚGeneralizedRCNNTransformah  
    Performs input / target transformation before feeding the data to a GeneralizedRCNN
    model.

    The transformations it performs are:
        - input normalization (mean subtraction and std division)
        - input / target resizing to match min_size / max_size

    It returns a ImageList for the inputs, and a List[Dict[Tensor]] for the targets
    é    N)r.   r/   Ú
image_meanÚ	image_stdÚsize_divisibler   Úkwargsc                    sT   t ƒ  ¡  t|ttfƒs|f}|| _|| _|| _|| _|| _	|| _
| dd¡| _d S )NÚ_skip_resizeF)ÚsuperÚ__init__Ú
isinstanceÚlistÚtupler.   r/   r5   r6   r7   r   Úpopr9   )Úselfr.   r/   r5   r6   r7   r   r8   ©Ú	__class__r   r   r;   `   s    

z!GeneralizedRCNNTransform.__init__)ÚimagesÚtargetsr   c                 C   sB  dd„ |D ƒ}|d k	rPg }|D ],}i }|  ¡ D ]\}}|||< q.| |¡ q|}tt|ƒƒD ]v}|| }	|d k	rx|| nd }
|	 ¡ dkr˜td|	j› �ƒ‚|  |	¡}	|  |	|
¡\}	}
|	||< |d k	r\|
d k	r\|
||< q\dd„ |D ƒ}| j	|| j
d�}g }|D ]4}t t|ƒdkd|› �¡ | |d	 |d
 f¡ qút||ƒ}||fS )Nc                 S   s   g | ]}|‘qS r   r   ©Ú.0Úimgr   r   r   Ú
<listcomp>x   s     z4GeneralizedRCNNTransform.forward.<locals>.<listcomp>é   zFimages is expected to be a list of 3d tensors of shape [C, H, W], got c                 S   s   g | ]}|j d d… ‘qS )r   N©r$   rE   r   r   r   rH   ‘   s     )r7   é   zMInput tensors expected to have in the last two elements H and W, instead got r   r	   )ÚitemsÚappendÚrangeÚlenÚdimÚ
ValueErrorr$   Ú	normalizeÚresizeÚbatch_imagesr7   r"   Z_assertr
   )r@   rC   rD   Ztargets_copyÚtÚdataÚkr   Úir   Ztarget_indexZimage_sizesZimage_sizes_listZ
image_sizeÚ
image_listr   r   r   Úforwardu   s<    



þ
z GeneralizedRCNNTransform.forwardr   c                 C   st   |  ¡ std|j› d�ƒ‚|j|j }}tj| j||d�}tj| j||d�}||d d …d d f  |d d …d d f  S )NzOExpected input images to be of floating type (in range [0, 1]), but found type z instead©r   Údevice)Zis_floating_pointÚ	TypeErrorr   r\   r"   Z	as_tensorr5   r6   )r@   r   r   r\   ZmeanZstdr   r   r   rR   ž   s    ÿz"GeneralizedRCNNTransform.normalize)rW   r   c                 C   s*   t t d¡ dtt|ƒƒ¡ ¡ ƒ}|| S )z”
        Implements `random.choice` via torch ops, so it can be compiled with
        TorchScript and we use PyTorch's RNG (not native RNG)
        r	   g        )Úintr"   ÚemptyZuniform_r*   rO   r+   )r@   rW   Úindexr   r   r   Útorch_choice©   s    "z%GeneralizedRCNNTransform.torch_choice)r   r   r   c                 C   sÊ   |j dd … \}}| jr4| jr&||fS |  | j¡}n
| jd }t||| j|| jƒ\}}|d krf||fS |d }t|||f|j dd … ƒ}||d< d|krÂ|d }t	|||f|j dd … ƒ}||d< ||fS )Nr   éÿÿÿÿÚboxesÚ	keypoints)
r$   Útrainingr9   ra   r.   r2   r/   r   Úresize_boxesÚresize_keypoints)r@   r   r   ÚhÚwr   Zbboxrd   r   r   r   rS   ±   s"    
zGeneralizedRCNNTransform.resize)rC   r7   r   c           
         s  g }t |d  ¡ ƒD ]<‰ t t ‡ fdd„|D ƒ¡ tj¡¡ tj¡}| |¡ q|}t 	|d  tj¡| ¡|  tj¡|d< t 	|d  tj¡| ¡|  tj¡|d< t
|ƒ}g }|D ]P}dd„ t|t
|jƒƒD ƒ}tjj |d|d d|d d|d f¡}	| |	¡ qºt |¡S )Nr   c                    s   g | ]}|j ˆ  ‘qS r   rJ   rE   ©rX   r   r   rH   Ò   s     z?GeneralizedRCNNTransform._onnx_batch_images.<locals>.<listcomp>r	   rK   c                 S   s   g | ]\}}|| ‘qS r   r   )rF   Ús1Ús2r   r   r   rH   Þ   s     )rN   rP   r"   r)   Ústackr'   r(   Zint64rM   Úceilr>   Úzipr$   r   r,   Úpad)
r@   rC   r7   r/   Z
max_size_iÚstrideZpadded_imgsrG   ÚpaddingZ
padded_imgr   rj   r   Ú_onnx_batch_imagesÎ   s    .**(z+GeneralizedRCNNTransform._onnx_batch_images)Úthe_listr   c                 C   sB   |d }|dd … D ](}t |ƒD ]\}}t|| |ƒ||< q q|S )Nr   r	   )Ú	enumerater)   )r@   rt   ZmaxesZsublistr`   r+   r   r   r   Úmax_by_axisä   s
    z$GeneralizedRCNNTransform.max_by_axisc           	      C   sî   t  ¡ r|  ||¡S |  dd„ |D ƒ¡}t|ƒ}t|ƒ}tt t|d ƒ| ¡| ƒ|d< tt t|d ƒ| ¡| ƒ|d< t	|ƒg| }|d  
|d¡}t|jd ƒD ]@}|| }||d |jd …d |jd …d |jd …f  |¡ q¨|S )Nc                 S   s   g | ]}t |jƒ‘qS r   )r=   r$   rE   r   r   r   rH   ñ   s     z9GeneralizedRCNNTransform.batch_images.<locals>.<listcomp>r	   rK   r   )r    r!   rs   rv   r*   r=   r^   Úmathrn   rO   Znew_fullrN   r$   Zcopy_)	r@   rC   r7   r/   rq   Zbatch_shapeZbatched_imgsrX   rG   r   r   r   rT   ë   s    ""6z%GeneralizedRCNNTransform.batch_images)ÚresultÚimage_shapesÚoriginal_image_sizesr   c                 C   sž   | j r
|S tt|||ƒƒD ]~\}\}}}|d }t|||ƒ}||| d< d|krp|d }	t|	||ƒ}	|	|| d< d|kr|d }
t|
||ƒ}
|
|| d< q|S )Nrc   r   rd   )re   ru   ro   rf   r   rg   )r@   rx   ry   rz   rX   ÚpredZim_sZo_im_src   r   rd   r   r   r   Úpostprocessÿ   s    z$GeneralizedRCNNTransform.postprocess)r   c                 C   sZ   | j j› d�}d}||› d| j› d| j› d�7 }||› d| j› d| j› d�7 }|d	7 }|S )
Nú(z
    zNormalize(mean=z, std=ú)zResize(min_size=z, max_size=z, mode='bilinear')z
))rB   Ú__name__r5   r6   r.   r/   )r@   Úformat_stringÚ_indentr   r   r   Ú__repr__  s    z!GeneralizedRCNNTransform.__repr__)r4   N)N)N)r4   )r4   )r   Ú
__module__Ú__qualname__Ú__doc__r^   r   r*   r   r   r   r;   r   r   Ústrr
   rZ   rR   ra   rS   r"   r%   Úunusedrs   rv   rT   r|   r‚   Ú__classcell__r   r   rA   r   r3   T   sH     ùø ÿ þ) ýüûr3   )rd   Úoriginal_sizeÚnew_sizer   c           	         s²   ‡ fdd„t ||ƒD ƒ}|\}}ˆ  ¡ }tj ¡ rŽ|d d …d d …df | }|d d …d d …df | }tj|||d d …d d …df fdd�}n |d  |9  < |d  |9  < |S )	Nc                    s8   g | ]0\}}t j|t jˆ jd �t j|t jˆ jd � ‘qS ©r[   ©r"   r#   r(   r\   ©rF   ÚsZs_orig©rd   r   r   rH     s   þÿz$resize_keypoints.<locals>.<listcomp>r   r	   rK   ©rP   ).r   ).r	   )ro   Úcloner"   Z_CZ_get_tracing_staterm   )	rd   r‰   rŠ   ÚratiosZratio_hZratio_wZresized_dataZresized_data_0Zresized_data_1r   r�   r   rg     s    
ý
(rg   )rc   r‰   rŠ   r   c           
         sh   ‡ fdd„t ||ƒD ƒ}|\}}ˆ  d¡\}}}}	|| }|| }|| }|	| }	tj||||	fdd�S )Nc                    s8   g | ]0\}}t j|t jˆ jd �t j|t jˆ jd � ‘qS r‹   rŒ   r�   ©rc   r   r   rH   1  s   þÿz resize_boxes.<locals>.<listcomp>r	   r�   )ro   Zunbindr"   rm   )
rc   r‰   rŠ   r’   Zratio_heightZratio_widthZxminZyminZxmaxZymaxr   r“   r   rf   0  s    
ýrf   )NN)rw   Útypingr   r   r   r   r   r"   r    r   r   rY   r
   Z	roi_headsr   r%   r‡   r   r*   r   r^   r†   r2   ÚModuler3   rg   rf   r   r   r   r   Ú<module>   s0   	  ûú; K