|
import warnings |
|
from typing import Optional |
|
|
|
import mmengine.fileio as fileio |
|
import numpy as np |
|
import cv2 |
|
|
|
import mmcv |
|
from mmcv.transforms.base import BaseTransform |
|
from mmpretrain.registry import TRANSFORMS |
|
|
|
from mmcv.image.io import _jpegflag, imread_flags |
|
from mmengine.utils import is_str |
|
|
|
|
|
@TRANSFORMS.register_module() |
|
class LoadImageFromFileFungi(BaseTransform): |
|
"""Load an image from file. |
|
|
|
Required Keys: |
|
|
|
- img_path |
|
|
|
Modified Keys: |
|
|
|
- img |
|
- img_shape |
|
- ori_shape |
|
|
|
Args: |
|
to_float32 (bool): Whether to convert the loaded image to a float32 |
|
numpy array. If set to False, the loaded image is an uint8 array. |
|
Defaults to False. |
|
color_type (str): The flag argument for :func:`mmcv.imfrombytes`. |
|
Defaults to 'color'. |
|
imdecode_backend (str): The image decoding backend type. The backend |
|
argument for :func:`mmcv.imfrombytes`. |
|
See :func:`mmcv.imfrombytes` for details. |
|
Defaults to 'cv2'. |
|
file_client_args (dict, optional): Arguments to instantiate a |
|
FileClient. See :class:`mmengine.fileio.FileClient` for details. |
|
Defaults to None. It will be deprecated in future. Please use |
|
``backend_args`` instead. |
|
Deprecated in version 2.0.0rc4. |
|
ignore_empty (bool): Whether to allow loading empty image or file path |
|
not existent. Defaults to False. |
|
backend_args (dict, optional): Instantiates the corresponding file |
|
backend. It may contain `backend` key to specify the file |
|
backend. If it contains, the file backend corresponding to this |
|
value will be used and initialized with the remaining values, |
|
otherwise the corresponding file backend will be selected |
|
based on the prefix of the file path. Defaults to None. |
|
New in version 2.0.0rc4. |
|
""" |
|
|
|
def __init__(self, |
|
to_float32: bool = False, |
|
color_type: str = 'color', |
|
imdecode_backend: str = 'cv2', |
|
file_client_args: Optional[dict] = None, |
|
ignore_empty: bool = False, |
|
*, |
|
backend_args: Optional[dict] = None) -> None: |
|
print('Using LoadImageFromFile from mmpretrain_custom') |
|
self.ignore_empty = ignore_empty |
|
self.to_float32 = to_float32 |
|
self.color_type = color_type |
|
self.imdecode_backend = imdecode_backend |
|
|
|
self.file_client_args: Optional[dict] = None |
|
self.backend_args: Optional[dict] = None |
|
if file_client_args is not None: |
|
warnings.warn( |
|
'"file_client_args" will be deprecated in future. ' |
|
'Please use "backend_args" instead', DeprecationWarning) |
|
if backend_args is not None: |
|
raise ValueError( |
|
'"file_client_args" and "backend_args" cannot be set ' |
|
'at the same time.') |
|
|
|
self.file_client_args = file_client_args.copy() |
|
if backend_args is not None: |
|
self.backend_args = backend_args.copy() |
|
|
|
def transform(self, results: dict) -> Optional[dict]: |
|
"""Functions to load image. |
|
|
|
Args: |
|
results (dict): Result dict from |
|
:class:`mmengine.dataset.BaseDataset`. |
|
|
|
Returns: |
|
dict: The dict contains loaded image and meta information. |
|
""" |
|
|
|
filename = results['img_path'] |
|
try: |
|
if self.file_client_args is not None: |
|
file_client = fileio.FileClient.infer_client( |
|
self.file_client_args, filename) |
|
img_bytes = file_client.get(filename) |
|
else: |
|
img_bytes = fileio.get( |
|
filename, backend_args=self.backend_args) |
|
img = mmcv.imfrombytes( |
|
img_bytes, flag=self.color_type, backend=self.imdecode_backend) |
|
if img is None: |
|
flag = self.color_type |
|
flag = imread_flags[flag] if is_str(flag) else flag |
|
img = cv2.imread(filename, flag) |
|
assert img is not None, filename |
|
except Exception as e: |
|
if self.ignore_empty: |
|
if img is None: |
|
flag = self.color_type |
|
flag = imread_flags[flag] if is_str(flag) else flag |
|
img = cv2.imread(filename, flag) |
|
assert img is not None, filename |
|
return img |
|
else: |
|
raise e |
|
|
|
|
|
assert img is not None, f'failed to load image: {filename}' |
|
if self.to_float32: |
|
img = img.astype(np.float32) |
|
|
|
results['img'] = img |
|
results['img_shape'] = img.shape[:2] |
|
results['ori_shape'] = img.shape[:2] |
|
return results |
|
|
|
def __repr__(self): |
|
repr_str = (f'{self.__class__.__name__}(' |
|
f'ignore_empty={self.ignore_empty}, ' |
|
f'to_float32={self.to_float32}, ' |
|
f"color_type='{self.color_type}', " |
|
f"imdecode_backend='{self.imdecode_backend}', ") |
|
|
|
if self.file_client_args is not None: |
|
repr_str += f'file_client_args={self.file_client_args})' |
|
else: |
|
repr_str += f'backend_args={self.backend_args})' |
|
|
|
return repr_str |
|
|