o
    + i                     @  s   d dl mZ d dlZd dlZd dlmZmZmZ d dlZ	d dl
mZ d dlZd dlmZ d dlmZ erTd dlmZ d dlmZ d dlmZ d	d
lmZ ed Zed 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e#d  Z$dS )    )annotationsN)TYPE_CHECKINGAnyLiteral)Image)_check_exists_and_download)Dataset)	DTypeLike)
_Transform   )_ImageDataType)cv2piltrainvalidtestz=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trainvalr   val)r   r   r   c                   @  s~   e Zd ZU dZded< ded< ded< ded	< d
ed< ded< 					d#d$ddZdd Zd%ddZd&dd Zd'd!d"Z	dS )(VOC2012a
  
    Implementation of `VOC2012 <http://host.robots.ox.ac.uk/pascal/VOC/voc2012/>`_ dataset.

    Args:
        data_file (str|None, 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|None, 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|None, 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(120)
            >>> 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) # type: ignore
            ...     # <class 'paddle.Tensor'> [3, 281, 500]
            ...     print(type(label), label.shape)
            ...     # <class 'numpy.ndarray'> (281, 500)
    
str | None	data_file_DatasetModemode_Transform[Any, Any] | None	transform_ImageBackendbackendstrflagr	   dtypeNr   Tdownloadbool_ImageBackend | NonereturnNonec                 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 )Nr   z3mode should be 'train', 'valid' or 'test', but got )r   r   z4Expected 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
ValueErrorr   MODE_FLAG_MAPr   r   r   VOC_URLVOC_MD5	CACHE_DIRr   
_load_annoZget_default_dtyper   )selfr   r   r   r    r    r.   j/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/vision/datasets/voc2012.py__init__   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_annoidxint'tuple[_ImageDataType, npt.NDArray[Any]]c                 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;   r4   r9   r1   readr   r3   ioBytesIOr   nparrayr   Zastyper   )r-   rC   r   Z
label_filer:   rB   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 rL   )r4   closerN   r.   r.   r/   __del__   s   zVOC2012.__del__)Nr   NTN)r   r   r   r   r   r   r    r!   r   r"   r#   r$   )rC   rD   r#   rE   )r#   rD   )r#   r$   )
__name__
__module____qualname____doc____annotations__r0   r,   rK   rO   rQ   r.   r.   r.   r/   r   6   s$   
 C'

r   )r   znpt.NDArray[Any])%
__future__r   rG   r2   typingr   r   r   numpyrI   ZPILr   r&   Zpaddle.dataset.commonr   Z	paddle.ior   Znumpy.typingZnptZpaddle._typingr	   Z#paddle.vision.transforms.transformsr
   imager   r   r   __all__r)   r*   r7   r=   r?   r+   r(   tupler   r.   r.   r.   r/   <module>   s2   