From 1abb489cdc250af52800a2101f6251755829a549 Mon Sep 17 00:00:00 2001 From: someshsingh22 Date: Tue, 24 Aug 2021 17:58:53 +0530 Subject: [PATCH 1/5] Initial Tests --- code_soup/common/__init__.py | 1 + code_soup/common/perturbations.py | 12 ++++ code_soup/common/vision/perturbations.py | 39 ++++++++++++ .../test_vision/test_perturbations.py | 60 +++++++++++++++++++ 4 files changed, 112 insertions(+) create mode 100644 code_soup/common/perturbations.py create mode 100644 code_soup/common/vision/perturbations.py create mode 100644 tests/test_common/test_vision/test_perturbations.py diff --git a/code_soup/common/__init__.py b/code_soup/common/__init__.py index e69de29..452a833 100644 --- a/code_soup/common/__init__.py +++ b/code_soup/common/__init__.py @@ -0,0 +1 @@ +from code_soup.common.vision.perturbations import VisualPerturbation diff --git a/code_soup/common/perturbations.py b/code_soup/common/perturbations.py new file mode 100644 index 0000000..cc4a7fa --- /dev/null +++ b/code_soup/common/perturbations.py @@ -0,0 +1,12 @@ +from abc import ABC, abstractmethod + + +class Perturbation(ABC): + """ + Docstring for Abstract Class Perturbation + """ + + @abstractmethod + @classmethod + def __init__(self): + pass diff --git a/code_soup/common/vision/perturbations.py b/code_soup/common/vision/perturbations.py new file mode 100644 index 0000000..35b53df --- /dev/null +++ b/code_soup/common/vision/perturbations.py @@ -0,0 +1,39 @@ +from abc import abstractmethod +from typing import Union + +import numpy as np +import torch + +from code_soup.common.perturbations import Perturbation + + +class VisualPerturbation(Perturbation): + """ + Docstring for VisualPerturbations + """ + + def __init__( + self, + original: Union[np.ndarray, torch.Tensor], + perturbed: Union[np.ndarray, torch.Tensor], + ): + """ + Docstring + #Automatically cast to Tensor using the torch.from_numpy() in the __init__ using if + """ + raise NotImplementedError + + def calculate_LPNorm(self, p: Union[int, str]): + raise NotImplementedError + + def calculate_PSNR(self): + raise NotImplementedError + + def calculate_RMSE(self): + raise NotImplementedError + + def calculate_SAM(self): + raise NotImplementedError + + def calculate_SRE(self): + raise NotImplementedError diff --git a/tests/test_common/test_vision/test_perturbations.py b/tests/test_common/test_vision/test_perturbations.py new file mode 100644 index 0000000..294b8b5 --- /dev/null +++ b/tests/test_common/test_vision/test_perturbations.py @@ -0,0 +1,60 @@ +import random +import unittest + +import numpy as np +import torch +from torchvision.datasets.fakedata import FakeData +from torchvision.transforms import ToTensor + +from code_soup.common import VisualPerturbation + + +class TestVisualPerturbation(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + torch.manual_seed(42) + np.random.seed(42) + random.seed(42) + df = FakeData(size=2, image_size=(3, 64, 64)) + a, b = tuple(df) + a, b = ToTensor()(a[0]).unsqueeze_(0), ToTensor()(b[0]).unsqueeze_(0) + cls.obj_tensor = VisualPerturbation(original=a, perturbed=b) + cls.obj_numpy = VisualPerturbation(original=a.numpy(), perturbed=b.numpy()) + + def test_LPNorm(self): + self.assertAlmostEqual( + TestVisualPerturbation.obj_tensor.calculate_LPNorm(p=1), 4143.0249, places=3 + ) + self.assertAlmostEqual( + TestVisualPerturbation.obj_numpy.calculate_LPNorm(p="fro"), + 45.6525, + places=3, + ) + + def test_PSNR(self): + self.assertAlmostEqual( + TestVisualPerturbation.obj_tensor.calculate_PSNR(), + 33.773994480876496, + places=3, + ) + + def test_RMSE(self): + self.assertAlmostEqual( + TestVisualPerturbation.obj_tensor.calculate_RMSE(), + 0.018409499898552895, + places=3, + ) + + def test_SAM(self): + self.assertAlmostEqual( + TestVisualPerturbation.obj_tensor.calculate_SAM(), + 89.34839413786915, + places=3, + ) + + def test_SRE(self): + self.assertAlmostEqual( + TestVisualPerturbation.obj_tensor.calculate_SRE(), + 41.36633261587073, + places=3, + ) From 48e548e1bdc91c88ad198e8161542890fe919128 Mon Sep 17 00:00:00 2001 From: someshsingh22 Date: Tue, 24 Aug 2021 18:12:17 +0530 Subject: [PATCH 2/5] Added Vision Perturbation Skeleton --- code_soup/common/__init__.py | 1 - code_soup/common/{perturbations.py => perturbation.py} | 2 +- code_soup/common/vision/perturbations.py | 2 +- tests/test_common/test_vision/test_perturbations.py | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) rename code_soup/common/{perturbations.py => perturbation.py} (100%) diff --git a/code_soup/common/__init__.py b/code_soup/common/__init__.py index 452a833..e69de29 100644 --- a/code_soup/common/__init__.py +++ b/code_soup/common/__init__.py @@ -1 +0,0 @@ -from code_soup.common.vision.perturbations import VisualPerturbation diff --git a/code_soup/common/perturbations.py b/code_soup/common/perturbation.py similarity index 100% rename from code_soup/common/perturbations.py rename to code_soup/common/perturbation.py index cc4a7fa..b2e023d 100644 --- a/code_soup/common/perturbations.py +++ b/code_soup/common/perturbation.py @@ -6,7 +6,7 @@ class Perturbation(ABC): Docstring for Abstract Class Perturbation """ - @abstractmethod @classmethod + @abstractmethod def __init__(self): pass diff --git a/code_soup/common/vision/perturbations.py b/code_soup/common/vision/perturbations.py index 35b53df..c68bc3c 100644 --- a/code_soup/common/vision/perturbations.py +++ b/code_soup/common/vision/perturbations.py @@ -4,7 +4,7 @@ import numpy as np import torch -from code_soup.common.perturbations import Perturbation +from code_soup.common.perturbation import Perturbation class VisualPerturbation(Perturbation): diff --git a/tests/test_common/test_vision/test_perturbations.py b/tests/test_common/test_vision/test_perturbations.py index 294b8b5..eb71992 100644 --- a/tests/test_common/test_vision/test_perturbations.py +++ b/tests/test_common/test_vision/test_perturbations.py @@ -6,7 +6,7 @@ from torchvision.datasets.fakedata import FakeData from torchvision.transforms import ToTensor -from code_soup.common import VisualPerturbation +from code_soup.common.vision.perturbations import VisualPerturbation class TestVisualPerturbation(unittest.TestCase): From c38b8d1709163cbe604bdb4d904e4173511f74a3 Mon Sep 17 00:00:00 2001 From: someshsingh22 Date: Mon, 30 Aug 2021 17:54:21 +0530 Subject: [PATCH 3/5] Removed Pretrained Datasets and Models --- code_soup/common/vision/datasets/dataset.py | 81 ------------------- code_soup/common/vision/models/__init__.py | 36 --------- .../test_common/test_vision/test_datasets.py | 37 --------- 3 files changed, 154 deletions(-) delete mode 100644 code_soup/common/vision/datasets/dataset.py delete mode 100644 tests/test_common/test_vision/test_datasets.py diff --git a/code_soup/common/vision/datasets/dataset.py b/code_soup/common/vision/datasets/dataset.py deleted file mode 100644 index 0214777..0000000 --- a/code_soup/common/vision/datasets/dataset.py +++ /dev/null @@ -1,81 +0,0 @@ -from abc import ABC, abstractmethod -from typing import Any, Tuple - -import torch -import torchvision - - -class VisionDataset(ABC): - @classmethod - @abstractmethod - def __init__(self, dataset: callable, transform: callable, root: str, train: bool): - """ - Parameters - ---------- - dataset : torchvision.datasets - - A dataset from torchvision.datasets - transform : torchvision.transforms - - A transform to be applied on the dataset - root : str - - The path where downloads are stored - train: bool - - If the split is training or testing - """ - pass - - @abstractmethod - def __len__(self) -> int: - """ - Returns - ------- - length : int - - Length of the dataset - """ - pass - - @abstractmethod - def __getitem__(self, idx: int) -> Tuple[Any, Any]: - """ - Returns - ------- - element : torch.Tensor - - A element from the dataset - """ - pass - - -class ImageClassificationDataset(torch.utils.data.Dataset, VisionDataset): - """ - Image Classification Dataset Class, Inherits from VisionDataset Abstract class and Torch Dataset - Parameters - ---------- - dataset : torchvision.datasets - - A dataset from torchvision.datasets - transform : torchvision.transforms - - A transform to be applied on the dataset - root : str - - The path where downloads are stored - train: bool - - If the split is training or testing - """ - - def __init__(self, dataset, transform, root="./input/data", train=True): - self.data = dataset(root=root, train=train, download=True, transform=transform) - - def __len__(self) -> int: - """ - Returns - ------- - length : int - - Length of the dataset - """ - return len(self.data) - - def __getitem__(self, idx: int) -> Tuple[Any, Any]: - """ - Returns - ------- - element : torch.Tensor - - A element from the dataset - """ - return self.data.__getitem__(idx) diff --git a/code_soup/common/vision/models/__init__.py b/code_soup/common/vision/models/__init__.py index 9a345b3..1f61422 100644 --- a/code_soup/common/vision/models/__init__.py +++ b/code_soup/common/vision/models/__init__.py @@ -1,38 +1,2 @@ -from torchvision.models import ( - alexnet, - densenet121, - densenet161, - densenet169, - densenet201, - googlenet, - inception_v3, - mnasnet0_5, - mnasnet0_75, - mnasnet1_0, - mnasnet1_3, - mobilenet_v2, - mobilenet_v3_large, - mobilenet_v3_small, - resnet18, - resnet34, - resnet50, - resnet101, - resnet152, - resnext50_32x4d, - resnext101_32x8d, - shufflenet_v2_x0_5, - shufflenet_v2_x1_0, - shufflenet_v2_x1_5, - shufflenet_v2_x2_0, - squeezenet1_0, - squeezenet1_1, - vgg11, - vgg13, - vgg16, - vgg19, - wide_resnet50_2, - wide_resnet101_2, -) - from code_soup.common.vision.models.allconvnet import AllConvNet from code_soup.common.vision.models.nin import NIN diff --git a/tests/test_common/test_vision/test_datasets.py b/tests/test_common/test_vision/test_datasets.py deleted file mode 100644 index 219c479..0000000 --- a/tests/test_common/test_vision/test_datasets.py +++ /dev/null @@ -1,37 +0,0 @@ -import unittest - -import torchvision -from parameterized import parameterized_class -from torch.utils.data import DataLoader -from torchvision import transforms - -from code_soup.common.vision.datasets import ImageClassificationDataset - - -@parameterized_class( - ("dataset_class", "expected_size", "expected_label"), - [ - (torchvision.datasets.MNIST, (16, 1, 28, 28), 5), - (torchvision.datasets.CIFAR10, (12, 3, 32, 32), 6), - ], -) -class TestVisionDataset(unittest.TestCase): - """Vision Dataset Parameterized TestCase - - Args: ("dataset_class", "expected_size", "expected_label") - """ - - def setUp(self): - self.TestDataset = ImageClassificationDataset( - self.dataset_class, transform=transforms.Compose([transforms.ToTensor()]) - ) - self.TestDatasetLoader = DataLoader( - self.TestDataset, batch_size=self.expected_size[0], shuffle=False - ) - self.samples = next(iter(self.TestDatasetLoader)) - - def test_image_tensor_dimensions(self): - self.assertTupleEqual(self.samples[0].size(), self.expected_size) - - def test_image_label_correctness(self): - self.assertEqual(self.samples[1][0], self.expected_label) From cf2679ae365363d35a57181f1bfd891c3249597c Mon Sep 17 00:00:00 2001 From: someshsingh22 Date: Mon, 30 Aug 2021 17:54:59 +0530 Subject: [PATCH 4/5] Removed Utils from CH5 --- code_soup/ch5/utlis/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 code_soup/ch5/utlis/__init__.py diff --git a/code_soup/ch5/utlis/__init__.py b/code_soup/ch5/utlis/__init__.py deleted file mode 100644 index e69de29..0000000 From 3aae6454526470a7a8c106a364ecd14679b39c2c Mon Sep 17 00:00:00 2001 From: someshsingh22 Date: Mon, 30 Aug 2021 18:03:24 +0530 Subject: [PATCH 5/5] Removed dataset import --- code_soup/common/vision/datasets/__init__.py | 1 - code_soup/common/vision/models/__init__.py | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code_soup/common/vision/datasets/__init__.py b/code_soup/common/vision/datasets/__init__.py index 04716a7..e69de29 100644 --- a/code_soup/common/vision/datasets/__init__.py +++ b/code_soup/common/vision/datasets/__init__.py @@ -1 +0,0 @@ -from code_soup.common.vision.datasets.dataset import ImageClassificationDataset diff --git a/code_soup/common/vision/models/__init__.py b/code_soup/common/vision/models/__init__.py index 1f61422..b52bba4 100644 --- a/code_soup/common/vision/models/__init__.py +++ b/code_soup/common/vision/models/__init__.py @@ -1,2 +1,3 @@ from code_soup.common.vision.models.allconvnet import AllConvNet from code_soup.common.vision.models.nin import NIN +from code_soup.common.vision.models.simple_cnn_classifier import SimpleCnnClassifier