o
    Qe4%                     @   s   d dl mZ d dlZd dlZd dlZd dlmZ d dlm	Z
 d dlZd dlmZ d dlmZ g ZdZed Zd	Zed
 ZdZdddddZG dd deZG dd deZdS )    )print_functionN)Image)cPickle)Dataset)_check_exists_and_downloadz$https://dataset.bj.bcebos.com/cifar/zcifar-10-python.tar.gzZ c58f30108f718f92721af3b95e74349azcifar-100-python.tar.gzZ eb9058c3a382ffc7106e4002c42a8d85Z
data_batchZ
test_batchtraintest)Ztrain10Ztest10Ztrain100Ztest100c                   @   sD   e Zd ZdZ					dddZdd Zd	d
 Zdd Zdd ZdS )Cifar10az	  
    Implementation of `Cifar-10 <https://www.cs.toronto.edu/~kriz/cifar.html>`_
    dataset, which has 10 categories.

    Args:
        data_file (str, optional): Path to data file, can be set None if
            :attr:`download` is True. Default None, default data path: ~/.cache/paddle/dataset/cifar
        mode (str, optional): Either train or test mode. Default 'train'.
        transform (Callable, optional): transform to perform on image, None for no transform. Default: None.
        download (bool, optional): download dataset automatically if :attr:`data_file` is None. Default True.
        backend (str, optional): Specifies which type of image to be returned:
            PIL.Image or numpy.ndarray. Should be one of {'pil', 'cv2'}.
            If this option is not set, will get backend from :ref:`paddle.vision.get_image_backend <api_vision_image_get_image_backend>`,
            default backend is 'pil'. Default: None.

    Returns:
        :ref:`api_paddle_io_Dataset`. An instance of Cifar10 dataset.

    Examples:

        .. code-block:: python

            import itertools
            import paddle.vision.transforms as T
            from paddle.vision.datasets import Cifar10


            cifar10 = Cifar10()
            print(len(cifar10))
            # 50000

            for i in range(5):  # only show first 5 images
                img, label = cifar10[i]
                # do something with img and label
                print(type(img), img.size, label)
                # <class 'PIL.Image.Image'> (32, 32) 6


            transform = T.Compose(
                [
                    T.Resize(64),
                    T.ToTensor(),
                    T.Normalize(
                        mean=[0.5, 0.5, 0.5],
                        std=[0.5, 0.5, 0.5],
                        to_rgb=True,
                    ),
                ]
            )

            cifar10_test = Cifar10(
                mode="test",
                transform=transform,  # apply transform to every image
                backend="cv2",  # use OpenCV as image transform backend
            )
            print(len(cifar10_test))
            # 10000

            for img, label in itertools.islice(iter(cifar10_test), 5):  # only show first 5 images
                # do something with img and label
                print(type(img), img.shape, label)
                # <class 'paddle.Tensor'> [3, 64, 64] 3
    Nr   Tc                 C   s   |  dv sJ d||  | _|d u rtj }|dvr&td||| _|   || _	| j	d u rF|s;J dt
|| j| jd|| _	|| _|   t | _d S )N)r   r   z4mode.lower() should be 'train' or 'test', but got {})pilZcv2z6Expected backend are one of ['pil', 'cv2'], but got {}z>data_file is not set and downloading automatically is disabledZcifar)lowerformatmodepaddleZvisionZget_image_backend
ValueErrorbackend_init_url_md5_flag	data_filer   data_urldata_md5	transform
_load_dataZget_default_dtypedtypeselfr   r   r   downloadr    r   LD:\Projects\ConvertPro\env\Lib\site-packages\paddle/vision/datasets/cifar.py__init__l   s4   


zCifar10.__init__c                 C       t | _t| _t| jd  | _d S )N10)CIFAR10_URLr   CIFAR10_MD5r   MODE_FLAG_MAPr   flagr   r   r   r   r         zCifar10._init_url_md5_flagc           	   
      s   g  _ tj jddX} fdd|D }tt|}|D ]=}tj||dd}|t	
d }|t	
d|t	
d	d }|d usFJ t	j||D ]\}} j ||f qMqW d    d S 1 sfw   Y  d S )
Nr)r   c                 3   s"    | ]} j |jv r|jV  qd S N)r#   name).0Z	each_itemr$   r   r   	<genexpr>   s    z%Cifar10._load_data.<locals>.<genexpr>bytes)encodingdatalabelsZfine_labels)r-   tarfileopenr   sortedlistpickleloadextractfilesixbgetmoveszipappend)	r   fnamesr(   batchr-   r.   samplelabelr   r$   r   r      s$   
"zCifar10._load_datac                 C   s   | j | \}}t|g d}|g d}| jdkr#t|d}| jd ur-| |}| jdkr<|t	|dfS || j
t	|dfS )N)       rB   )      r   r
   Zuint8Zint64)r-   npZreshapeZ	transposer   r   Z	fromarrayZastyper   arrayr   )r   idximager@   r   r   r   __getitem__   s   



zCifar10.__getitem__c                 C   s
   t | jS r'   )lenr-   r$   r   r   r   __len__   s   
zCifar10.__len__Nr   NTN)	__name__
__module____qualname____doc__r   r   r   rI   rK   r   r   r   r   r	   +   s    B
*r	   c                       s4   e Zd ZdZ					d	 fdd	Zdd Z  ZS )
Cifar100a	  
    Implementation of `Cifar-100 <https://www.cs.toronto.edu/~kriz/cifar.html>`_
    dataset, which has 100 categories.

    Args:
        data_file (str, optional): path to data file, can be set None if
            :attr:`download` is True. Default: None, default data path: ~/.cache/paddle/dataset/cifar
        mode (str, optional): Either train or test mode. Default 'train'.
        transform (Callable, optional): transform to perform on image, None for no transform. Default: None.
        download (bool, optional): download dataset automatically if :attr:`data_file` is None. Default True.
        backend (str, optional): Specifies which type of image to be returned:
            PIL.Image or numpy.ndarray. Should be one of {'pil', 'cv2'}.
            If this option is not set, will get backend from :ref:`paddle.vision.get_image_backend <api_vision_image_get_image_backend>`,
            default backend is 'pil'. Default: None.

    Returns:
        :ref:`api_paddle_io_Dataset`. An instance of Cifar100 dataset.

    Examples:

        .. code-block:: python

            import itertools
            import paddle.vision.transforms as T
            from paddle.vision.datasets import Cifar100


            cifar100 = Cifar100()
            print(len(cifar100))
            # 50000

            for i in range(5):  # only show first 5 images
                img, label = cifar100[i]
                # do something with img and label
                print(type(img), img.size, label)
                # <class 'PIL.Image.Image'> (32, 32) 19


            transform = T.Compose(
                [
                    T.Resize(64),
                    T.ToTensor(),
                    T.Normalize(
                        mean=[0.5, 0.5, 0.5],
                        std=[0.5, 0.5, 0.5],
                        to_rgb=True,
                    ),
                ]
            )

            cifar100_test = Cifar100(
                mode="test",
                transform=transform,  # apply transform to every image
                backend="cv2",  # use OpenCV as image transform backend
            )
            print(len(cifar100_test))
            # 10000

            for img, label in itertools.islice(iter(cifar100_test), 5):  # only show first 5 images
                # do something with img and label
                print(type(img), img.shape, label)
                # <class 'paddle.Tensor'> [3, 64, 64] 49
    Nr   Tc                    s   t t| ||||| d S r'   )superrQ   r   r   	__class__r   r   r     s   

zCifar100.__init__c                 C   r   )N100)CIFAR100_URLr   CIFAR100_MD5r   r"   r   r#   r$   r   r   r   r     r%   zCifar100._init_url_md5_flagrL   )rM   rN   rO   rP   r   r   __classcell__r   r   rS   r   rQ      s    BrQ   )
__future__r   r/   numpyrE   r6   ZPILr   Z	six.movesr   r3   r   Z	paddle.ior   Zpaddle.dataset.commonr   __all__Z
URL_PREFIXr    r!   rV   rW   r"   r	   rQ   r   r   r   r   <module>   s.    