o
    #j                     @   s   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 )    N)Image)_check_exists_and_download)Datasetz=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_paddle_vision_get_image_backend>`,
            default backend is 'pil'. Default: None.

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

    Examples:

        .. code-block:: python

            >>> # doctest: +TIMEOUT(75)
            >>> 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   z3mode should be 'train', 'valid' or 'test', but got )Zpilcv2z4Expected backend are one of ['pil', 'cv2'], but got z>data_file is not set and downloading automatically is disabled)lower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   _/var/www/html/Deteccion_Ine/venv/lib/python3.10/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_FILEformatr   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'   r/   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 r7   )r!   closer9   r   r   r   __del__   s   zVOC2012.__del__)Nr   NTN)	__name__
__module____qualname____doc__r   r   r6   r:   r<   r   r   r   r   r	   '   s    E
'r	   )r1   r   numpyr3   ZPILr   r   Zpaddle.dataset.commonr   Z	paddle.ior   __all__r   r   r$   r*   r,   r   r   r	   r   r   r   r   <module>   s    