[docs]
def patch_albumentations_for_311():
"""
Backport https://github.com/albumentations-team/albumentations/pull/1426
"""
import sys
from packaging.version import parse as Version
if sys.version_info[0:2] >= (3, 11):
import albumentations
import random
from typing import Dict, Any
import numpy as np
import cv2
albumentations_version = Version(albumentations.__version__)
if albumentations_version <= Version('1.0.0'):
from albumentations.augmentations.transforms import Blur, MotionBlur
def _patched_blur_get_params(self) -> Dict[str, Any]:
# return {"ksize": int(random.choice(np.arange(self.blur_limit[0], self.blur_limit[1] + 1, 2)))}
return {"ksize": int(random.choice(list(range(self.blur_limit[0], self.blur_limit[1] + 1, 2))))}
def _patched_motion_blur_get_params(self) -> Dict[str, Any]:
ksize = random.choice(list(range(self.blur_limit[0], self.blur_limit[1] + 1, 2)))
if ksize <= 2:
raise ValueError("ksize must be > 2. Got: {}".format(ksize))
kernel = np.zeros((ksize, ksize), dtype=np.uint8)
xs, xe = random.randint(0, ksize - 1), random.randint(0, ksize - 1)
if xs == xe:
ys, ye = random.sample(range(ksize), 2)
else:
ys, ye = random.randint(0, ksize - 1), random.randint(0, ksize - 1)
cv2.line(kernel, (xs, ys), (xe, ye), 1, thickness=1)
# Normalize kernel
kernel = kernel.astype(np.float32) / np.sum(kernel)
return {"kernel": kernel}
Blur.get_params = _patched_blur_get_params
MotionBlur.get_params = _patched_motion_blur_get_params
elif albumentations_version <= Version('1.3.0'):
from albumentations.augmentations.blur.transforms import Blur, MotionBlur
def _patched_blur_get_params(self) -> Dict[str, Any]:
# return {"ksize": int(random.choice(np.arange(self.blur_limit[0], self.blur_limit[1] + 1, 2)))}
return {"ksize": int(random.choice(list(range(self.blur_limit[0], self.blur_limit[1] + 1, 2))))}
def _patched_motion_blur_get_params(self) -> Dict[str, Any]:
import numpy as np
import cv2
ksize = random.choice(list(range(self.blur_limit[0], self.blur_limit[1] + 1, 2)))
if ksize <= 2:
raise ValueError("ksize must be > 2. Got: {}".format(ksize))
kernel = np.zeros((ksize, ksize), dtype=np.uint8)
x1, x2 = random.randint(0, ksize - 1), random.randint(0, ksize - 1)
if x1 == x2:
y1, y2 = random.sample(range(ksize), 2)
else:
y1, y2 = random.randint(0, ksize - 1), random.randint(0, ksize - 1)
def make_odd_val(v1, v2):
len_v = abs(v1 - v2) + 1
if len_v % 2 != 1:
if v2 > v1:
v2 -= 1
else:
v1 -= 1
return v1, v2
if not self.allow_shifted:
x1, x2 = make_odd_val(x1, x2)
y1, y2 = make_odd_val(y1, y2)
xc = (x1 + x2) / 2
yc = (y1 + y2) / 2
center = ksize / 2 - 0.5
dx = xc - center
dy = yc - center
x1, x2 = [int(i - dx) for i in [x1, x2]]
y1, y2 = [int(i - dy) for i in [y1, y2]]
cv2.line(kernel, (x1, y1), (x2, y2), 1, thickness=1)
# Normalize kernel
return {"kernel": kernel.astype(np.float32) / np.sum(kernel)}
Blur.get_params = _patched_blur_get_params
MotionBlur.get_params = _patched_motion_blur_get_params