o
    ॵiJ                     @   s  d dl Z d dlZd dlZd dlmZ d dlm  mZ	 d dl
mZ dddZdd Zddd	ZG d
d deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdS )     N)ImageTc                    st  t j| g|R  }| }|\ }}t||g|d< ddg}d|v ry|d }tj||gtjd}	|t  g }
t|
ddd|	}
|
j	dd	}
|
d d d
d d f |
d d dd d f  j
d
d}|
dd|d< ||d< |d d|v r|d }|jd }tj||gtjd}	tj fddt|jd
 d D dd}|| }
t|
|dd|	}
|
j	dd	}
|
|d|d< |d d|v r|d d d   | | f |d< |d |r6d|v sd|v r6d|v r|d ddd}
tj|
d d d
d d f |
d d dd d f kd
d}n
|d d
d
}|D ]}|| |  ||< q(||fS )Nsizelabelsareaboxesdtype   r   min   dim   polygonsc                        g | ]}t j gt jd qS r   torchtensorfloat32.0_ij a/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/preprocessors/ofa/utils/transforms.py
<listcomp>)       zcrop.<locals>.<listcomp>masks)Fcropcopyr   r   	as_tensorr   r   reshapeclampprodappendshapecatrangeallflattenanytolist)imagetargetregiondeletecropped_imagehwfieldsr   max_sizecropped_boxesr   r   num_polygonsstart_coordkeepfieldr   r   r   r$      sX   4


*

,r$   c                 C   s   t | }| j\}}| }d|v r4|d }|d d g df tg d t|d|dg }||d< d|v rZ|d }|jd }||ddtddg t|dg }||d< d	|v rg|d	 d|d	< ||fS )
Nr   )r
   r   r      )r	   r   r	   r   r   r   r	   r
   r   r"   )	r#   hflipr   r%   r   r&   r+   r'   flip)r2   r3   flipped_imager8   r7   r   r   r<   r   r   r   rA   I   s.   


rA   c                    s<  ddd d fdd	}|| j ||}tj| |tjd}|d u r"|S tdd t|j | j D }|\| }d|v rO|d }|t	g }||d< d	|v ru|d	 }	tj
fd
dt|	jd d D dd}
|	|
 }||d	< d|v r|d }|  }||d< |\}}t||g|d< d|v rJ ||fS )Nc                 S   s   | \}}||kr||ks||kr*||kr*|d ur&t |}t||}t||}||fS ||k r9|}t || | }n
|}t || | }|d urUt |}t||}t||}||fS N)intr   )
image_sizer   r:   r8   r7   owohr   r   r   get_size_with_aspect_ratioc   s"    



z*resize.<locals>.get_size_with_aspect_ratioc                    s(   t |ttfr|d d d S  | ||S )Nr	   )
isinstancelisttuple)rF   r   r:   )rI   r   r   get_size{   s   zresize.<locals>.get_sizeinterpolationc                 s   s$    | ]\}}t |t | V  qd S rD   )float)r   ss_origr   r   r   	<genexpr>   s
    
zresize.<locals>.<genexpr>r   r   c                    s   g | ]	}t  gqS r   )r   r   r   )ratio_heightratio_widthr   r   r       s    zresize.<locals>.<listcomp>r   r
   r   r   r   r   r"   FrD   )r   r#   resizer   BICUBICrL   zipr%   r   r&   r,   r-   r+   r   )r2   r3   r   r:   rM   rescaled_imageratiosr   scaled_boxesr   scaled_ratioscaled_polygonsr   scaled_arear7   r8   r   )rI   rT   rU   r   rV   `   sF   

rV   c                   @      e Zd Zdd Zdd ZdS )
CenterCropc                 C   
   || _ d S rD   r   selfr   r   r   r   __init__      
zCenterCrop.__init__c           	      C   sP   |j \}}| j \}}tt|| d }tt|| d }t||||||fS )N       @)r   rE   roundr$   )	rd   imgr3   image_widthimage_heightcrop_height
crop_widthcrop_top	crop_leftr   r   r   __call__   s   


zCenterCrop.__call__N__name__
__module____qualname__re   rp   r   r   r   r   r`          r`   c                   @   r_   )ObjectCenterCropc                 C   ra   rD   rb   rc   r   r   r   re      rf   zObjectCenterCrop.__init__c                 C   s   |j \}}| j \}}t|d d d }t|d d d }t|d d d }	t|d d d }
||	 d }||
 d }t||d  t|| |d  d d}t||d  t|| |d  d d}t||||||fddS )Nr   r   r   r
   r@   F)r5   )r   rP   maxr   r$   )rd   ri   r3   rj   rk   rl   rm   x0y0x1y1center_xcenter_yro   rn   r   r   r   rp      s2   



zObjectCenterCrop.__call__Nrq   r   r   r   r   rv      ru   rv   c                   @   s   e Zd ZdddZdd ZdS )RandomHorizontalFlip      ?c                 C   ra   rD   )p)rd   r   r   r   r   re      rf   zRandomHorizontalFlip.__init__c                 C   s    t   | jk rt||S ||fS rD   )randomr   rA   rd   ri   r3   r   r   r   rp      s   
zRandomHorizontalFlip.__call__N)r   rq   r   r   r   r   r~      s    
r~   c                   @   s    e Zd ZdddZdddZdS )	RandomResizeNFc                 C   s(   t |ttfs	J || _|| _|| _d S rD   )rJ   rK   rL   sizesr:   equal)rd   r   r:   r   r   r   r   re      s   
zRandomResize.__init__c                 C   s0   t | j}| jrt||||S t|||| jS rD   )r   choicer   r   rV   r:   )rd   ri   r3   r   r   r   r   rp      s   zRandomResize.__call__)NFrD   rq   r   r   r   r   r      s    
r   c                   @   s   e Zd Zdd ZdS )ToTensorc                 C   s   t ||fS rD   )r#   	to_tensorr   r   r   r   rp      s   zToTensor.__call__N)rr   rs   rt   rp   r   r   r   r   r      s    r   c                   @   s    e Zd ZdddZdddZdS )		Normalize   c                 C   s   || _ || _|| _d S rD   )meanstdmax_image_size)rd   r   r   r   r   r   r   re      s   
zNormalize.__init__Nc                    s   t j|| j| jd}|d u r|d fS | }|d d |d d  d|v r4|d }|| j }||d< d|v rZ|d }tj fddt|j	d d	 D dd
}|| }||d< ||fS )N)r   r   r   r   r   r   r   c                    r   r   r   r   r7   r8   r   r   r    	  r!   z&Normalize.__call__.<locals>.<listcomp>r
   r   )
r#   	normalizer   r   r%   r   r   r,   r-   r+   )rd   r2   r3   r   r   scaler   r   r   rp      s&   
zNormalize.__call__)r   rD   rq   r   r   r   r   r      s    
r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )Composec                 C   ra   rD   
transforms)rd   r   r   r   r   re     rf   zCompose.__init__c                 C   s"   | j D ]	}|||\}}q||fS rD   r   )rd   r2   r3   tr   r   r   rp     s   
zCompose.__call__c                 C   s:   | j jd }| jD ]}|d7 }|d|7 }q	|d7 }|S )N(
z    {0}z
))	__class__rr   r   format)rd   format_stringr   r   r   r   __repr__  s   
zCompose.__repr__N)rr   rs   rt   re   rp   r   r   r   r   r   r     s    r   c                   @   <   e Zd ZdZdddZdd Zd	d
 Zdd ZdddZdS )LargeScaleJitterB
        implementation of large scale jitter from copy_paste
    r   333333?rg   c                 C   s   t |g| _|| _|| _d S rD   r   r   desired_sizeaug_scale_minaug_scale_maxrd   output_sizer   r   r   r   r   re   )  s   
zLargeScaleJitter.__init__c                 C      || }|\}}|  }||d< d|v r'|d }|t||||g }||d< d|v r9|d }	|	||  }
|
|d< d|v r?J |S Nr   r   r   r"   r%   r   r&   rd   scaled_sizerF   r3   image_scalerT   rU   r   r[   r   r^   r"   r   r   r   rescale_target.  "   
zLargeScaleJitter.rescale_targetc                 C     |\}}}}ddg}|  }t||g|d< d|v rp|d }tj||gtjd}	|t||||g }
t|
ddd|	}
|
jdd	}
|
d d d
d d f |
d d dd d f  jd
d}|
dd|d< ||d< |	d d|v r|d d d ||| ||| f |d< |	d d|v sd|v rd|v r|d ddd}
tj
|
d d d
d d f |
d d dd d f kd
d}n
|d d
d
}|D ]}|| |  ||< q|S Nr   r   r   r   r   r	   r
   r   r   r   r   r   r"   r%   r   r   r&   r   r   r'   r(   r)   r*   r.   r/   r0   r1   rd   r4   r3   r   r   r7   r8   r9   r   r:   r;   r   r>   r?   r   r   r   crop_targetI  B   
*
,zLargeScaleJitter.crop_targetc                 C   <   |  }d|v rtjj|d d|d d|d f|d< |S Nr"   r   r   r%   r   nn
functionalpadrd   paddingr3   r   r   r   
pad_targetq     zLargeScaleJitter.pad_targetNc                 C   s&  |j }t|d d d }td| j| j  | j }|| j  }t||d  ||d  }||  	 }t
j|| tjd}|d urN| |||}|dkr|| j }|td  	 }	|	d  |	d  | jd  | jd  f}
t
j|g|
R  }|d ur| |
|}||fS J )Nr	   r   r   rN   r
   )r   r   r   randr   r   r   rh   maximumrE   r#   rV   r1   r   rW   r   flooritemr$   r   r   r   )rd   r2   r3   rF   random_scaler   r   scaled_image
max_offsetoffsetr4   output_imager   r   r   r   rp   x  s8   


	zLargeScaleJitter.__call__r   r   rg   rD   	rr   rs   rt   __doc__re   r   r   r   rp   r   r   r   r   r   $      
(r   c                   @   r   )OriginLargeScaleJitterr   r   r   rg   c                 C   s   t || _|| _|| _d S rD   r   r   r   r   r   re     s   
zOriginLargeScaleJitter.__init__c                 C   r   r   r   r   r   r   r   r     r   z%OriginLargeScaleJitter.rescale_targetc                 C   r   r   r   r   r   r   r   r     r   z"OriginLargeScaleJitter.crop_targetc                 C   r   r   r   r   r   r   r   r     r   z!OriginLargeScaleJitter.pad_targetNc                 C   sx  |j }t|d d d }| j| t|   }td| j| j	  | j	 }|| j  }t
||d  ||d  }||   }t|| }|d urX| |||}|dkr|| }	|	td   }
|
d  |
d  |d  |d  f}tj|g|R  }|d ur| ||}||fS || }t|dd|d  |d  g}|d ur| ||}||fS )Nr	   r   r   r
   )r   r   r   r   rw   rh   rE   r   r   r   minimumr#   rV   r1   r   r   r   r$   r   r   r   )rd   r2   r3   rF   out_desired_sizer   r   r   r   r   r   r4   r   r   r   r   r   rp     sJ   

zOriginLargeScaleJitter.__call__r   rD   r   r   r   r   r   r     r   r   c                   @   s.   e Zd ZdZ					d	ddZd
ddZdS )RandomDistortionz;
    Distort image w.r.t hue, saturation and exposure.
    r   r   c                 C   s   || _ t||||| _d S rD   )probTColorJittertfm)rd   
brightnesscontrast
saturationhuer   r   r   r   re      s   zRandomDistortion.__init__Nc                 C   s&   t j | jk r| ||fS ||fS rD   )npr   r   r   r   r   r   r   rp   )  s   zRandomDistortion.__call__)r   r   r   r   r   rD   )rr   rs   rt   r   re   rp   r   r   r   r   r     s    
	r   )TrD   )r   numpyr   r   torchvision.transformsr   r   !torchvision.transforms.functionalr   r#   PILr   r$   rA   rV   objectr`   rv   r~   r   r   r   r   r   r   r   r   r   r   r   <module>   s&   
:
I{|