U
    ­Ê¹jû  ã                   @   s`   d dl Z d dlmZmZmZmZ d dlmZ ddlm	Z	m
Z
mZ ddlmZ G dd„ deƒZdS )	é    N)ÚAnyÚCallableÚOptionalÚTuple)ÚImageé   )Ú_decompressÚdownload_file_from_google_driveÚverify_str_arg)ÚVisionDatasetc                       s˜   e Zd ZdZdddœdddœdddœd	œZdeeee ee edœ‡ fdd„Z	e
dœdd„Ze
eeef dœdd„Zedœdd„Zddœdd„Z‡  ZS )ÚPCAMa2  `PCAM Dataset   <https://github.com/basveeling/pcam>`_.

    The PatchCamelyon dataset is a binary classification dataset with 327,680
    color images (96px x 96px), extracted from histopathologic scans of lymph node
    sections. Each image is annotated with a binary label indicating presence of
    metastatic tissue.

    This dataset requires the ``h5py`` package which you can install with ``pip install h5py``.

    Args:
         root (string): Root directory of the dataset.
         split (string, optional): The dataset split, supports ``"train"`` (default), ``"test"`` or ``"val"``.
         transform (callable, optional): A function/transform that  takes in a PIL image and returns a transformed
             version. E.g, ``transforms.RandomCrop``.
         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 into ``root/pcam``. If
             dataset is already downloaded, it is not downloaded again.
    )z&camelyonpatch_level_2_split_train_x.h5z!1Ka0XfEMiwgCYPdTI-vv6eUElOBnKFKQ2Z 1571f514728f59376b705fc836ff4b63)z&camelyonpatch_level_2_split_train_y.h5z!1269yhu3pZDP8UYFQs-NYs3FPwuK-nGSGZ 35c2d7259d906cfc8143347bb8e05be7)ÚimagesÚtargets)z%camelyonpatch_level_2_split_test_x.h5Z!1qV65ZqZvWzuIVthK8eVDhIwrbnsJdbg_Z d8c2d60d490dbd479f8199bdfa0cf6ec)z%camelyonpatch_level_2_split_test_y.h5Z!17BHrSrwWKjYsOgTMmoqrIjDy6Fa2o_gPZ 60a7035772fbdb7f34eb86d4420cf66a)z&camelyonpatch_level_2_split_valid_x.h5z!1hgshYGWK8V-eGRy8LToWJJgDU_rXWVJ3Z d5b63470df7cfa627aeec8b9dc0c066e)z&camelyonpatch_level_2_split_valid_y.h5z!1bH8ZRbhSVAhScTS0p9-ZzGnX91cHT3uOZ 2b85f58b927af9964a4c15b8f7e8f179©ÚtrainÚtestÚvalr   NF)ÚrootÚsplitÚ	transformÚtarget_transformÚdownloadc                    s‚   zdd l }|| _ W n tk
r.   tdƒ‚Y nX t|ddƒ| _tƒ j|||d� t | j	¡d | _
|rn|  ¡  |  ¡ s~tdƒ‚d S )Nr   zYh5py is not found. This dataset needs to have h5py installed: please run pip install h5pyr   r   )r   r   Zpcamz;Dataset not found. You can use download=True to download it)Úh5pyÚImportErrorÚRuntimeErrorr
   Ú_splitÚsuperÚ__init__ÚpathlibÚPathr   Ú_base_folderÚ	_downloadÚ_check_exists)Úselfr   r   r   r   r   r   ©Ú	__class__© úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchvision/datasets/pcam.pyr   E   s    
ÿ
zPCAM.__init__)Úreturnc              
   C   sL   | j | j d d }| j | j| ¡�}|d jd W  5 Q R £ S Q R X d S )Nr   r   Úx)Ú_FILESr   r   ÚFiler    Úshape)r#   Úimages_fileÚimages_datar&   r&   r'   Ú__len__a   s    zPCAM.__len__)Úidxr(   c              	   C   s¼   | j | j d d }| j | j| ¡�}t |d | ¡ d¡}W 5 Q R X | j | j d d }| j | j| ¡�}t|d |dddf ƒ}W 5 Q R X | j	r¤|  	|¡}| j
r´|  
|¡}||fS )Nr   r   r)   ÚRGBr   Úy)r*   r   r   r+   r    r   Z	fromarrayÚconvertÚintr   r   )r#   r0   r-   r.   ÚimageÚtargets_fileZtargets_dataÚtargetr&   r&   r'   Ú__getitem__f   s    ""

zPCAM.__getitem__c                    sB   ˆ j ˆ j d d }ˆ j ˆ j d d }t‡ fdd„||fD ƒƒS )Nr   r   r   c                 3   s   | ]}ˆ j  |¡ ¡ V  qd S )N)r    ÚjoinpathÚexists)Ú.0Zh5_file©r#   r&   r'   Ú	<genexpr>y   s     z%PCAM._check_exists.<locals>.<genexpr>)r*   r   Úall)r#   r-   r6   r&   r<   r'   r"   v   s    zPCAM._check_existsc                 C   s\   |   ¡ rd S | j| j  ¡ D ]:\}}}|d }t|t| jƒ||d� tt| j| ƒƒ qd S )Nz.gz)ÚfilenameÚmd5)r"   r*   r   Úvaluesr	   Ústrr    r   )r#   Ú	file_nameZfile_idr@   Úarchive_namer&   r&   r'   r!   {   s    zPCAM._download)r   NNF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   rB   r   r   Úboolr   r4   r/   r   r   r8   r"   r!   Ú__classcell__r&   r&   r$   r'   r   
   s4   úúúç*    úúr   )r   Útypingr   r   r   r   ZPILr   Úutilsr   r	   r
   Zvisionr   r   r&   r&   r&   r'   Ú<module>   s
   