"vscode:/vscode.git/clone" did not exist on "580e374eaea056388151125705002e806247c183"
Commit eecea2eb authored by Sam Tsai's avatar Sam Tsai Committed by Facebook GitHub Bot
Browse files

Add random gaussian blur augmentation

Summary:
Pull Request resolved: https://github.com/facebookresearch/d2go/pull/393

Add gaussian blur augmentation.

Reviewed By: tglik

Differential Revision: D40404772

fbshipit-source-id: d04774cc8aa9dff00f2b85e9c7feb1b8709edc9e
parent 2f6b9de8
#!/usr/bin/env python3
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
import random
from typing import Dict, List, Tuple
import cv2
import detectron2.data.transforms.augmentation as aug
import numpy as np
......@@ -185,3 +187,67 @@ def RandomMotionBlurOp(cfg: CfgNode, arg_str: str, is_train: bool) -> List[Trans
kwargs = _json_load(arg_str) if arg_str is not None else {}
assert isinstance(kwargs, dict)
return [RandomMotionBlur(**kwargs)]
class GaussianBlurTransform(Transform):
def __init__(
self,
k: int = 3,
sigma_range: Tuple[float, float] = (0.3, 0.3),
):
"""
Args:
will apply the specified blur to the image
"""
super().__init__()
self._set_attributes(locals())
def apply_image(self, img: np.ndarray) -> np.ndarray:
sigma = random.uniform(*self.sigma_range)
img_out = cv2.GaussianBlur(img, (self.k, self.k), sigma)
return img_out
def apply_segmentation(self, segmentation: np.ndarray) -> np.ndarray:
return segmentation
def apply_coords(self, coords: np.ndarray) -> np.ndarray:
return coords
class RandomGaussianBlur(aug.Augmentation):
"""
Apply random motion blur.
"""
def __init__(
self,
prob: float = 0.5,
k: int = 3,
sigma_range: Tuple[float, float] = (0.3, 0.3),
):
"""
Args:
prob (float): probability of applying transform
k (int): kernel size
sigma_range (tuple): min, max of sigma gaussian filter used
"""
super().__init__()
# Turn all locals into member variables.
self._init(locals())
def get_transform(self, img: np.ndarray) -> Transform:
do = self._rand_range() < self.prob
if do:
return GaussianBlurTransform(self.k, self.sigma_range)
else:
return NoOpTransform()
# example repr: "RandomGaussianBlurOp::{'prob': 0.5, 'k': 5, 'sigma': [0.1, 2]}"
@TRANSFORM_OP_REGISTRY.register()
def RandomGaussianBlurOp(cfg: CfgNode, arg_str: str, is_train: bool) -> List[Transform]:
assert is_train
kwargs = _json_load(arg_str) if arg_str is not None else {}
assert isinstance(kwargs, dict)
return [RandomGaussianBlur(**kwargs)]
#!/usr/bin/env python3
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
import unittest
import numpy as np
from d2go.data.transforms.build import build_transform_gen
from d2go.runner import Detectron2GoRunner
from detectron2.data.transforms import apply_augmentations
class TestDataTransformsBlur(unittest.TestCase):
def test_gaussian_blur_transforms(self):
default_cfg = Detectron2GoRunner().get_default_cfg()
img = np.zeros((80, 60, 3)).astype(np.uint8)
img[40, 30, :] = 255
default_cfg.D2GO_DATA.AUG_OPS.TRAIN = [
'RandomGaussianBlurOp::{"prob": 1.0, "k": 3, "sigma_range": [0.5, 0.5]}'
]
tfm = build_transform_gen(default_cfg, is_train=True)
trans_img, _ = apply_augmentations(tfm, img)
self.assertEqual(img.shape, trans_img.shape)
self.assertEqual(img.dtype, trans_img.dtype)
self.assertEqual(trans_img[39, 29, 0], 3)
self.assertEqual(trans_img[40, 29, 0], 21)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment