o
    }oi#)                  	   @   s   d dl Z d dlZd dlZd dlmZmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ z
d dlmZ dZW n eefyE   dZY nw 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ZG dd dZG dd deZdddZdS )    N)ImageImageFilterImageOps)Dataset)SharedEpoch)ImageNetPolicy)ImageFolderTFc                 C   s8   | dv rt jS | dv rt jS | dv rt jS td|  )N)bf16z
bf16-mixed)   16z16-mixed)    32z32-truezCannot recognize precision )torchbfloat16float16float32
ValueError)	precision r   e/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/vision/data/megatron/vit_dataset.py_to_torch_data_type"   s   r   c                   @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )RandomSeedDataset  c                 C   s   || _ || _t | _d S N)	base_seeddatasetr   epoch)selfr   seedr   r   r   __init__.   s   zRandomSeedDataset.__init__c                 C   s
   t | jS r   )lenr   )r   r   r   r   __len__3      
zRandomSeedDataset.__len__c                 C   s   | j | d S r   )r   	set_value)r   r   r   r   r   	set_epoch6   s   zRandomSeedDataset.set_epochc                 C   sB   || j  | j d  }t| t| tj| | j| S )Ni   )	r   r   	get_valuer   manual_seedrandomr   npr   )r   idxr   r   r   r   __getitem__9   s
   


zRandomSeedDataset.__getitem__N)r   )__name__
__module____qualname__r   r!   r$   r*   r   r   r   r   r   -   s
    
r   c                   @   s"   e Zd ZdZd
ddZdd Zd	S )GaussianBlurz/
    Apply Gaussian Blur to the PIL image.
          ?皙?       @c                 C   s   || _ || _|| _d S r   )prob
radius_min
radius_max)r   pr3   r4   r   r   r   r   F   s   
zGaussianBlur.__init__c                 C   s4   t   | jk}|s|S |tjt | j| jdS )N)radius)r'   r2   filterr   r.   uniformr3   r4   )r   imgdo_itr   r   r   __call__K   s   zGaussianBlur.__call__N)r/   r0   r1   r+   r,   r-   __doc__r   r;   r   r   r   r   r.   A   s    
r.   c                   @   s    e Zd ZdZdd Zdd ZdS )Solarizationz.
    Apply Solarization to the PIL image.
    c                 C   s
   || _ d S r   r5   )r   r5   r   r   r   r   X   r"   zSolarization.__init__c                 C   s   t   | jk rt|S |S r   )r'   r5   r   solarize)r   r9   r   r   r   r;   [   s   
zSolarization.__call__Nr<   r   r   r   r   r>   S   s    r>   c                   @      e Zd ZdddZdd ZdS )ClassificationTransformTc                 C   s   t |j| _tsJ d|r3tt|t tddddt	 t
 tddt| jg| _d S tt|t|t
 tddt| jg| _d S )Nz1Torchvision imports failed but they are required.皙?r0   g
ףp=
?gv/?gCl?gZd;O?gy&1?g?)r   r   	data_typeTORCHVISION_AVAILABLETComposeRandomResizedCropRandomHorizontalFlipColorJitterr   ToTensor	NormalizeConvertImageDtype	transformResize
CenterCropr   	model_cfg
image_sizetrainr   r   r   r   c   s*   





z ClassificationTransform.__init__c                 C   s   |  |}|S r   )rP   )r   inputoutputr   r   r   r;   }   s   
z ClassificationTransform.__call__NTr+   r,   r-   r   r;   r   r   r   r   rB   b   s    
rB   c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
InpaintingTransformTc              
   C   s   |j | _ |j| _|| _|j| _t| j |d | j  |d | j  | _|| _t|j	| _
| jrPtt| jt tddddt t t| j
g| _d S ttj| jddt| jt t| j
g| _d S )Nr      rC   r0      )interpolation)mask_factor	mask_typerU   	patch_dim
patch_sizeint	mask_sizerV   r   r   rF   rH   rI   rJ   rK   rL   r   rM   rO   rP   rQ   rR   rS   r   r   r   r      s0   (





zInpaintingTransform.__init__c                 C   s  ddgddgddgddgg}|d |d ksJ |d | }t j|d |d ft jd}|dkrt d|d}t d|d}	t|D ]A}
t dt|d}t j||| d  d|d d}t j|	|| d  d|d d}	|| }|	| }d|||| ||| f< qB|S |dksJ d}tt|D ])}tt|D ] }	||k r|d7 }|| }|	| }d|||| ||| f< qq|S )	Nr   r\   )dtyper'   r   )minmaxrow)r   zerosfloatrandintranger    clampreversed)r   rU   rd   r`   rb   action_listimg_size_patchmaskxyirx_offsety_offsetcountr   r   r   gen_mask   s6     zInpaintingTransform.gen_maskc                 C   s6   |  |}| | j| j| j| j}|jdd}||fS )Nr   )dim)rP   rz   rU   rd   r`   rb   	unsqueeze)r   rW   trans_inputrr   r   r   r   r;      s   
zInpaintingTransform.__call__NrY   )r+   r,   r-   r   rz   r;   r   r   r   r   r[      s    
r[   c                   @   rA   )DinoTransformTc              
   C   s(  t |j| _ttjddtjtjdddddgddtjddg}|jdv r;tt	 t
d	d
t| jg}ntt	 t
d	d
g}d}ttj||dftjd|td|g| _ttj||dftjd|tdtd|g| _|j| _ttj|jd|ftjd|tdd|g| _d S )Nr/   r?   rC   g?r0   )
brightnesscontrast
saturationhueg?)r
   r	   rD   rE   r\   )scaler^   g      ?g?)r   r   rF   rH   rI   rK   RandomApplyrL   RandomGrayscalerM   rN   rO   rJ   r   BICUBICr.   global_transform1r>   global_transform2dino_local_crops_numberlocal_crops_numberdino_local_img_sizelocal_transform)r   rT   rU   rV   flip_and_color_jitter	normalizescale_constr   r   r   r      sR   




	

zDinoTransform.__init__c                 C   sH   g }| | | | | | t| jD ]
}| | | q|S r   )appendr   r   rm   r   r   )r   imagecrops_r   r   r   r;      s   zDinoTransform.__call__NrY   rZ   r   r   r   r   r~      s    
6r~      c           	      C   s   | j dkrt| |}t| |dd}n0| j dkr&t| |dd}t| |dd}n| j dkr:t| |dd}t| |dd}ntd| jt|dkrL|d	 n|d }t||| j	| j
d
}t|}|d }t||d}t|}||fS )NclassifyF)rV   inpaintdinoTz){} vit pretraining type is not supported.r]   r   )rootrP   classes_fractiondata_per_class_fractionr\   )r   rP   )vision_pretraining_typerB   r[   r~   	Exceptionformatvit_pretraining_typer    r   r   r   r   )	rT   	data_pathrU   train_transformval_transformtrain_data_path
train_dataval_data_pathval_datar   r   r   build_train_valid_datasets  s,   



r   )r   )r'   numpyr(   r   PILr   r   r   torch.utils.datar   5nemo.collections.multimodal.data.common.data_samplersr   1nemo.collections.vision.data.megatron.autoaugmentr   2nemo.collections.vision.data.megatron.image_folderr   torchvision.transforms
transformsrH   rG   ImportErrorModuleNotFoundErrorr   r   objectr.   r>   rB   r[   r~   r   r   r   r   r   <module>   s,    E@