a
    PSic.                     @   s   d dl mZmZmZmZ d dlZd dlmZmZ dee eedddZ	ee eddd	Z
eeee f d
ddZdejeee  eee ee f dddZeedddZeedddZejejeejejf dddZdS )    )ListOptionalTupleUnionN)nnTensor)tensorsdimreturnc                 C   s    t | dkr| d S t| |S )zg
    Efficient version of torch.cat that avoids a copy if there is only a single element in a list
       r   )lentorchcat)r   r	    r   R/var/www/html/django/DPS/env/lib/python3.9/site-packages/torchvision/ops/_utils.py_cat   s    r   )boxesr
   c              	   C   sp   t dd | D dd}g }t| D ]*\}}|t|d d d df | q"t |dd}tj||gdd}|S )Nc                 S   s   g | ]}|qS r   r   ).0br   r   r   
<listcomp>       z/convert_boxes_to_roi_format.<locals>.<listcomp>r   r	   r   )r   	enumerateappendr   	full_liker   )r   Zconcat_boxestempir   idsroisr   r   r   convert_boxes_to_roi_format   s    $r   )r   c                 C   sd   t | ttfr0| D ]}t|ddkd qn0t | tjrTt| ddkd ntdd d S )Nr      zNThe shape of the tensor in the boxes list is not correct as List[Tensor[L, 4]]   z5The boxes tensor shape is not correct as Tensor[K, 5]Fz>boxes is expected to be a Tensor[L, 5] or a List[Tensor[K, 4]])
isinstancelisttupler   _assertsizer   )r   _tensorr   r   r   check_roi_boxes_shape   s    r(   )modelnorm_classesr
   c                 C   s   |s$t jjjt jt jt jjjt jg}|D ] }t	|t j
s(td| dq(t|}g }g }|  D ]l}t| d r|dd |jddD  qbt||r|dd | D  qb|dd | D  qb||fS )	NzClass z  is not a subclass of nn.Module.c                 s   s   | ]}|j r|V  qd S Nrequires_gradr   pr   r   r   	<genexpr>@   r   z-split_normalization_params.<locals>.<genexpr>F)recursec                 s   s   | ]}|j r|V  qd S r+   r,   r.   r   r   r   r0   B   r   c                 s   s   | ]}|j r|V  qd S r+   r,   r.   r   r   r   r0   D   r   )r   modules	batchnorm
_BatchNorm	LayerNorm	GroupNorminstancenorm_InstanceNormLocalResponseNorm
issubclassModule
ValueErrorr$   nextchildrenextend
parametersr"   )r)   r*   tclassesZnorm_paramsZother_paramsmoduler   r   r   split_normalization_params)   s(    
rD   )rA   r
   c                 C   sH   |   r&| jtjtjfv r| S |  S | jtjtjfv r<| S |  S d S r+   )	is_floating_pointdtyper   float32float64floatint32int64intrA   r   r   r   _upcastH   s    rN   c                 C   s   | j tjtjfvr|  S | S r+   )rF   r   rG   rH   rI   rM   r   r   r   _upcast_non_floatP   s    rO   )boxes1boxes2r
   c                 C   s   | j dd\}}}}|j dd\}}}}	t||}
t||}t||}t||	}t|}||k||
k@ }|| |
|  || ||   ||< || ||  || |	|   | }||fS )Nr   )unbindr   maxmin
zeros_like)rP   rQ   x1y1x2y2Zx1gZy1gZx2gZy2gZxkis1Zykis1Zxkis2Zykis2ZintsctkmaskZunionkr   r   r   _loss_inter_unionW   s    
$$r\   )r   )N)typingr   r   r   r   r   r   r   rL   r   r   r(   r;   typerD   rN   rO   r\   r   r   r   r   <module>   s    
 