o
    Qeú  ã                   @   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Zd dl	m
Z
 d dlmZ g ZdZdZdZd	Zd
ZdZddddœZG dd„ de
ƒZdS )é    )Úprint_functionN)ÚImage)ÚDataset)Ú_check_exists_and_downloadz=https://dataset.bj.bcebos.com/voc/VOCtrainval_11-May-2012.tarZ 6cd6e144f989b92b3379bac3b3de84fdz/VOCdevkit/VOC2012/ImageSets/Segmentation/{}.txtz#VOCdevkit/VOC2012/JPEGImages/{}.jpgz*VOCdevkit/VOC2012/SegmentationClass/{}.pngZvoc2012ZtrainvalÚtrainÚval)r   ÚtestÚvalidc                   @   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 )ÚVOC2012a 
  
    Implementation of `VOC2012 <http://host.robots.ox.ac.uk/pascal/VOC/voc2012/>`_ dataset.

    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/voc2012.
        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 VOC2012 dataset.

    Examples:

        .. code-block:: python

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


            voc2012 = VOC2012()
            print(len(voc2012))
            # 2913

            for i in range(5):  # only show first 5 images
                img, label = voc2012[i]
                # do something with img and label
                print(type(img), img.size)
                # <class 'PIL.JpegImagePlugin.JpegImageFile'> (500, 281)
                print(type(label), label.size)
                # <class 'PIL.PngImagePlugin.PngImageFile'> (500, 281)


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

            voc2012_test = VOC2012(
                mode="test",
                transform=transform,  # apply transform to every image
                backend="cv2",  # use OpenCV as image transform backend
            )
            print(len(voc2012_test))
            # 1464

            for img, label in itertools.islice(iter(voc2012_test), 5):  # only show first 5 images
                # do something with img and label
                print(type(img), img.shape)
                # <class 'paddle.Tensor'> [3, 281, 500]
                print(type(label), label.shape)
                # <class 'numpy.ndarray'> (281, 500)
    Nr   Tc                 C   s    |  ¡ dv sJ d |¡ƒ‚|d u rtj ¡ }|dvr!td |¡ƒ‚|| _t|  ¡  | _|| _	| j	d u rB|s9J dƒ‚t
|ttt|ƒ| _	|| _|  ¡  t ¡ | _d S )N)r   r	   r   z5mode should be 'train', 'valid' or 'test', but got {})ZpilÚcv2z6Expected backend are one of ['pil', 'cv2'], but got {}z>data_file is not set and downloading automatically is disabled)ÚlowerÚformatÚpaddleZvisionZget_image_backendÚ
ValueErrorÚbackendÚMODE_FLAG_MAPÚflagÚ	data_filer   ÚVOC_URLÚVOC_MD5Ú	CACHE_DIRÚ	transformÚ
_load_annoZget_default_dtypeÚdtype)Úselfr   Úmoder   Údownloadr   © r   úND:\Projects\ConvertPro\env\Lib\site-packages\paddle/vision/datasets/voc2012.pyÚ__init__k   s.   ÿ
ÿÿ
þzVOC2012.__init__c                 C   s¨   i | _ t | j¡| _| j ¡ D ]}|| j |j< qt | j	¡}| j 
| j | ¡}g | _g | _|D ]"}| ¡ }t | d¡¡}t | d¡¡}| j |¡ | j |¡ q/d S )Nzutf-8)Úname2memÚtarfileÚopenr   Údata_tarÚ
getmembersÚnameÚSET_FILEr   r   ÚextractfileÚdataÚlabelsÚstripÚ	DATA_FILEÚdecodeÚ
LABEL_FILEÚappend)r   ZeleZset_fileZsetsÚliner(   Úlabelr   r   r   r   ‹   s   ûzVOC2012._load_annoc                 C   s¼   | j | }| j| }| j | j| ¡ ¡ }| j | j| ¡ ¡ }t t 	|¡¡}t t 	|¡¡}| j
dkr?t |¡}t |¡}| jd urI|  |¡}| j
dkrZ| | j¡| | j¡fS ||fS )Nr   )r(   r)   r#   r'   r    Úreadr   r"   ÚioÚBytesIOr   ÚnpÚarrayr   Zastyper   )r   Úidxr   Z
label_filer(   r0   r   r   r   Ú__getitem__ž   s   







zVOC2012.__getitem__c                 C   s
   t | jƒS ©N)Úlenr(   ©r   r   r   r   Ú__len__³   s   
zVOC2012.__len__c                 C   s   | j r
| j  ¡  d S d S r8   )r#   Úcloser:   r   r   r   Ú__del__¶   s   ÿzVOC2012.__del__)Nr   NTN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r7   r;   r=   r   r   r   r   r
   (   s    C
û r
   )Ú
__future__r   r2   r!   Únumpyr4   ZPILr   r   Z	paddle.ior   Zpaddle.dataset.commonr   Ú__all__r   r   r&   r+   r-   r   r   r
   r   r   r   r   Ú<module>   s"   