Browse Source

added a function for a generic retry operation

Dimitri Korsch 4 years ago
parent
commit
d47196b46e
3 changed files with 20 additions and 16 deletions
  1. 2 2
      cvdatasets/dataset/image/image_wrapper.py
  2. 14 0
      cvdatasets/utils/__init__.py
  3. 4 14
      cvdatasets/utils/image.py

+ 2 - 2
cvdatasets/dataset/image/image_wrapper.py

@@ -49,7 +49,7 @@ class ImageWrapper(object):
 		if self._im_array is None:
 
 			if isinstance(self._im, Image.Image):
-				_im = self._im.convert(self.mode)
+				_im = utils.retry_operation(5, self._im.convert, self.mode)
 				self._im_array = utils.asarray(_im)
 
 			elif isinstance(self._im, np.ndarray):
@@ -69,7 +69,7 @@ class ImageWrapper(object):
 	@property
 	def im(self):
 		if isinstance(self._im, Image.Image) and self._im.mode != self.mode:
-			self._im = self._im.convert(self.mode)
+			self._im = utils.retry_operation(5, self._im.convert, self.mode)
 		return self._im
 
 	@im.setter

+ 14 - 0
cvdatasets/utils/__init__.py

@@ -62,6 +62,20 @@ class _MetaInfo(object):
 			setattr(self, name, value)
 		self.structure = []
 
+def retry_operation(n_retries, func, *args, **kwargs):
+
+	if n_retries <= 0:
+		return func(*args, **kwargs)
+
+	error = None
+	for i in range(n_retries):
+		try:
+			return func(*args, **kwargs)
+		except Exception as e:
+			error = e
+
+	raise RuntimeError(f"Operation {func.__name__} failed after {n_retries} n_retries! ({error})")
+
 
 from cvdatasets.utils.dataset import new_iterator
 from cvdatasets.utils.image import asarray

+ 4 - 14
cvdatasets/utils/image.py

@@ -3,21 +3,11 @@ import numpy as np
 from os.path import isfile
 from PIL import Image
 
-def read_image(im_path, n_retries=5):
-	_read = lambda: Image.open(im_path, mode="r")
-	if n_retries <= 0:
-		assert isfile(im_path), "Image \"{}\" does not exist!".format(im_path)
-		return _read()
-
-	else:
-		error = None
-		for i in range(n_retries):
-			try:
-				return _read()
-			except Exception as e:
-				error = e
+from cvdatasets.utils import retry_operation
 
-		raise RuntimeError("Reading image \"{}\" failed after {} n_retries! ({})".format(im_path, n_retries, error))
+def read_image(im_path, n_retries=5):
+	assert isfile(im_path), "Image \"{}\" does not exist!".format(im_path)
+	return retry_operation(n_retries, Image.open, im_path, mode="r")
 
 
 def asarray(im, dtype=np.uint8):