o
    Vh                     @   sd   d dl Z d dlmZ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Union)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deeejf dede	e
 de	e
 def
 fddZdefddZdedeeef fddZdefddZdddZ  ZS ) PCAMa  `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 (str or ``pathlib.Path``): 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.

             .. warning::

                To download the dataset `gdown <https://github.com/wkentaro/gdown>`_ is required.
    )z&camelyonpatch_level_2_split_train_x.h5z!1Ka0XfEMiwgCYPdTI-vv6eUElOBnKFKQ2 1571f514728f59376b705fc836ff4b63)z&camelyonpatch_level_2_split_train_y.h5z!1269yhu3pZDP8UYFQs-NYs3FPwuK-nGSG 35c2d7259d906cfc8143347bb8e05be7)imagestargets)z%camelyonpatch_level_2_split_test_x.h5!1qV65ZqZvWzuIVthK8eVDhIwrbnsJdbg_ d8c2d60d490dbd479f8199bdfa0cf6ec)z%camelyonpatch_level_2_split_test_y.h5!17BHrSrwWKjYsOgTMmoqrIjDy6Fa2o_gP 60a7035772fbdb7f34eb86d4420cf66a)z&camelyonpatch_level_2_split_valid_x.h5z!1hgshYGWK8V-eGRy8LToWJJgDU_rXWVJ3 d5b63470df7cfa627aeec8b9dc0c066e)z&camelyonpatch_level_2_split_valid_y.h5z!1bH8ZRbhSVAhScTS0p9-ZzGnX91cHT3uO 2b85f58b927af9964a4c15b8f7e8f179traintestvalr   NFrootsplit	transformtarget_transformdownloadc                    s|   z	dd l }|| _ W n ty   tdw t|dd| _t j|||d t| j	d | _
|r4|   |  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   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__ M/var/www/vscode/kcb/lib/python3.10/site-packages/torchvision/datasets/pcam.pyr'   I   s    
zPCAM.__init__returnc                 C   sX   | j | j d d }| j| j| }|d jd W  d    S 1 s%w   Y  d S )Nr   r   x)_FILESr%   r"   Filer*   shape)r-   images_fileimages_datar0   r0   r1   __len__e   s   $zPCAM.__len__idxc                 C   s   | j | j d d }| j| j| }t|d | d}W d    n1 s*w   Y  | j | j d d }| j| j| }t|d |dddf }W d    n1 sYw   Y  | j	rf| 	|}| j
rn| 
|}||fS )Nr   r   r3   RGBr   y)r4   r%   r"   r5   r*   r   	fromarrayconvertintr   r   )r-   r:   r7   r8   imagetargets_filetargets_datatargetr0   r0   r1   __getitem__j   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).0h5_filer-   r0   r1   	<genexpr>}   s    z%PCAM._check_exists.<locals>.<genexpr>)r4   r%   all)r-   r7   rA   r0   rI   r1   r,   z   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,   r4   r%   valuesr
   strr*   r	   )r-   	file_namefile_idrM   archive_namer0   r0   r1   r+      s   zPCAM._download)r   NNF)r2   N)__name__
__module____qualname____doc__r4   r   rO   r(   r)   r   r   boolr'   r?   r9   r   r   rD   r,   r+   __classcell__r0   r0   r.   r1   r   
   s>    *r   )r(   typingr   r   r   r   r   PILr   utilsr	   r
   r   visionr   r   r0   r0   r0   r1   <module>   s    