o
    0i!                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZ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mZmZ ddlmZ edg d	ZG d
d deZdS )    N)
namedtuple)Path)AnyCallableListOptionalTupleUnion   )check_integritydownload_file_from_google_driveextract_archiveverify_str_arg)VisionDatasetCSV)headerindexdatac                       s   e Zd ZdZdZg dZ					d deeef d	ed
ee	e ef de
e de
e deddf fddZ	d!dede
e defddZdefddZd"ddZdedeeef fddZdefddZdefddZ  ZS )#CelebAa  `Large-scale CelebFaces Attributes (CelebA) Dataset <http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html>`_ Dataset.

    Args:
        root (str or ``pathlib.Path``): Root directory where images are downloaded to.
        split (string): One of {'train', 'valid', 'test', 'all'}.
            Accordingly dataset is selected.
        target_type (string or list, optional): Type of target to use, ``attr``, ``identity``, ``bbox``,
            or ``landmarks``. Can also be a list to output a tuple with all specified target types.
            The targets represent:

                - ``attr`` (Tensor shape=(40,) dtype=int): binary (0, 1) labels for attributes
                - ``identity`` (int): label for each person (data points with the same identity are the same person)
                - ``bbox`` (Tensor shape=(4,) dtype=int): bounding box (x, y, width, height)
                - ``landmarks`` (Tensor shape=(10,) dtype=int): landmark points (lefteye_x, lefteye_y, righteye_x,
                  righteye_y, nose_x, nose_y, leftmouth_x, leftmouth_y, rightmouth_x, rightmouth_y)

            Defaults to ``attr``. If empty, ``None`` will be returned as target.

        transform (callable, optional): A function/transform that takes in a PIL image
            and returns a transformed version. E.g, ``transforms.PILToTensor``
        target_transform (callable, optional): A function/transform that takes in the
            target and transforms it.
        download (bool, optional): If true, downloads the dataset from the internet and
            puts it in root directory. If dataset is already downloaded, it is not
            downloaded again.

            .. warning::

                To download the dataset `gdown <https://github.com/wkentaro/gdown>`_ is required.
    celeba))0B7EVK8r0v71pZjFTYXZWM3FlRnM 00d2c5bc6d35e252742224ab0c1e8fcbimg_align_celeba.zip)0B7EVK8r0v71pblRyaVFSWGxPY0U 75e246fa4810816ffd6ee81facbd244clist_attr_celeba.txt)z!1_ee_0u7vcNLOfNLegJRHmolfH5ICW-XS 32bd1bd63d3c78cd57e08160ec5ed1e2identity_CelebA.txt)0B7EVK8r0v71pbThiMVRxWXZ4dU0 00566efa6fedff7a56946cd1c10f1c16list_bbox_celeba.txt)0B7EVK8r0v71pd0FJY3Blby1HUTQ cc24ecafdb5b50baae59b03474781f8clist_landmarks_align_celeba.txt)0B7EVK8r0v71pY0NSMzRuSXJEVkk d32c9cbf5e040fd4025c592c306e6668list_eval_partition.txttrainattrNFrootsplittarget_type	transformtarget_transformdownloadreturnc                    sn  t  j|||d || _t|tr|| _n|g| _| js%| jd ur%td|r+|   | 	 s3tddddd d}|t
| dd }| d	 | d
}	| jddd}
| jddd}| jddd}|d u rktd n j|k }|td kr} j| _n fddtt|D | _|	j| | _|
j| | _|j| | _|j| | _tj| jd ddd| _|j| _d S )N)r,   r-   z6target_transform is specified but target_type is emptyzHDataset not found or corrupted. You can use download=True to download itr   r
      )r'   validtestallr*   r&   r   r    )r   r#   r   c                    s   g | ]} j | qS  )r   .0isplitsr4   Y/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torchvision/datasets/celeba.py
<listcomp>l   s    z#CelebA.__init__.<locals>.<listcomp>floor)rounding_mode)super__init__r*   
isinstancelistr+   r-   RuntimeErrorr.   _check_integrityr   lower	_load_csvslicer   squeezer   filenametorchnonzeroidentitybboxlandmarks_alignr(   divr   
attr_names)selfr)   r*   r+   r,   r-   r.   	split_mapsplit_rK   rL   rM   r(   mask	__class__r8   r:   r?   A   s@   	



 zCelebA.__init__rH   r   c                 C   s   t tj| j| j|}ttj|ddd}W d    n1 s!w   Y  |d ur7|| }||d d  }ng }dd |D }dd |D }dd |D }t	||t
|S )	N T)	delimiterskipinitialspacer
   c                 S   s   g | ]}|d  qS )r   r4   r6   rowr4   r4   r:   r;      s    z$CelebA._load_csv.<locals>.<listcomp>c                 S   s   g | ]}|d d qS )r
   Nr4   rY   r4   r4   r:   r;      s    c                 S   s   g | ]	}t tt|qS r4   )rA   mapintr5   r4   r4   r:   r;      s    )openospathjoinr)   base_folderrA   csvreaderr   rI   tensor)rP   rH   r   csv_filer   headersindicesdata_intr4   r4   r:   rE   u   s   zCelebA._load_csvc                 C   sj   | j D ]#\}}}tj| j| j|}tj|\}}|dvr&t||s& dS qtjtj| j| jdS )N)z.zipz.7zFimg_align_celeba)		file_listr^   r_   r`   r)   ra   splitextr   isdir)rP   _md5rH   fpathextr4   r4   r:   rC      s   zCelebA._check_integrityc                 C   s^   |   r
td d S | jD ]\}}}t|tj| j| j|| qt	tj| j| jd d S )Nz%Files already downloaded and verifiedr   )
rC   printrj   r   r^   r_   r`   r)   ra   r   )rP   file_idrn   rH   r4   r4   r:   r.      s   zCelebA.downloadr   c              	   C   s"  t jtj| j| jd| j| }g }| j	D ]K}|dkr*|
| j|d d f  q|dkr9|
| j|df  q|dkrJ|
| j|d d f  q|dkr[|
| j|d d f  qtd| d| jd urm| |}|rt|d	kryt|n|d }| jd ur| |}||fS d }||fS )
Nri   r(   rK   r   rL   	landmarkszTarget type "z" is not recognized.r
   )PILImager]   r^   r_   r`   r)   ra   rH   r+   appendr(   rK   rL   rM   
ValueErrorr,   lentupler-   )rP   r   Xtargettr4   r4   r:   __getitem__   s*   $




zCelebA.__getitem__c                 C   s
   t | jS N)rx   r(   )rP   r4   r4   r:   __len__   s   
zCelebA.__len__c                 C   s    ddg}d |jdi | jS )NzTarget type: {target_type}zSplit: {split}
r4   )r`   format__dict__)rP   linesr4   r4   r:   
extra_repr   s   zCelebA.extra_repr)r'   r(   NNFr~   )r/   N)__name__
__module____qualname____doc__ra   rj   r	   strr   r   r   r   boolr?   r\   r   rE   rC   r.   r   r   r}   r   r   __classcell__r4   r4   rT   r:   r      sJ    
7


r   )rb   r^   collectionsr   pathlibr   typingr   r   r   r   r   r	   rt   rI   utilsr   r   r   r   visionr   r   r   r4   r4   r4   r:   <module>   s     