From 8eb10ac43bf4382d69625d8cef8a3e8cb23d0318 Mon Sep 17 00:00:00 2001 From: lcadalzo <39925313+lcadalzo@users.noreply.github.com> Date: Wed, 14 Jul 2021 08:07:28 -0400 Subject: [PATCH] 0.13.4 (#1124) * updating scenario configs for eval 3 (#1123) * handling merge conflict * bump version 0.13.3 --> 0.13.4 * log that random patch location is being used Co-authored-by: Yusong Tan * small updates for Eval 3 (#1126) * small updates for Eval 3 * updated kwargs and moved assert -> valueerror * lint Co-authored-by: David Slater Co-authored-by: Yusong Tan Co-authored-by: yusong-tan <59029053+yusong-tan@users.noreply.github.com> Co-authored-by: David Slater --- armory/__init__.py | 2 +- armory/art_experimental/attacks/pgd_patch.py | 52 ++++--- .../art_experimental/attacks/robust_dpatch.py | 31 ++++ .../attacks/video_frame_border.py | 42 +++++ .../defences/video_compression_normalized.py | 44 ++++++ armory/utils/triggers/peace.png | Bin 0 -> 25740 bytes scenario_configs/apricot_frcnn.json | 2 +- scenario_configs/apricot_frcnn_defended.json | 2 +- scenario_configs/cifar10_baseline.json | 2 +- .../cifar10_defended_example.json | 2 +- .../dapricot_frcnn_masked_pgd.json | 2 +- scenario_configs/gtsrb_scenario_baseline.json | 2 +- .../gtsrb_scenario_baseline_pytorch.json | 2 +- scenario_configs/gtsrb_scenario_clbd.json | 2 +- .../gtsrb_scenario_clbd_bullethole.json | 2 +- .../gtsrb_scenario_clbd_defended.json | 2 +- scenario_configs/gtsrb_scenario_poison.json | 2 +- ...ibrispeech_asr_imperceptible_defended.json | 92 +++++++++++ ...ispeech_asr_imperceptible_undefended.json} | 26 ++-- ...librispeech_asr_kenansville_defended.json} | 4 +- ...brispeech_asr_kenansville_undefended.json} | 4 +- .../librispeech_asr_pgd_defended.json | 86 +++++++++++ ...ch_asr_pgd_multipath_channel_defended.json | 91 +++++++++++ ...asr_pgd_multipath_channel_undefended.json} | 30 ++-- ...on => librispeech_asr_pgd_undefended.json} | 26 ++-- ...on => librispeech_asr_snr_undefended.json} | 2 +- .../librispeech_baseline_sincnet.json | 2 +- .../librispeech_baseline_sincnet_snr_pgd.json | 2 +- ...librispeech_baseline_sincnet_targeted.json | 2 +- scenario_configs/mnist_baseline.json | 2 +- scenario_configs/resisc10_poison_dlbd.json | 2 +- .../resisc45_baseline_densenet121.json | 2 +- ...resisc45_baseline_densenet121_cascade.json | 2 +- ...esisc45_baseline_densenet121_finetune.json | 2 +- .../resisc45_baseline_densenet121_patch.json | 2 +- ...esisc45_baseline_densenet121_targeted.json | 2 +- .../so2sat_eo_masked_pgd_defended.json | 146 ++++++++++++++++++ .../so2sat_eo_masked_pgd_undefended.json | 100 ++++++++++++ ...on => so2sat_sar_masked_pgd_defended.json} | 102 ++++++------ ... => so2sat_sar_masked_pgd_undefended.json} | 46 +++--- .../ucf101_baseline_finetune.json | 2 +- .../ucf101_baseline_pretrained_targeted.json | 2 +- .../ucf101_pretrained_flicker_defended.json | 77 +++++++++ ...ucf101_pretrained_flicker_undefended.json} | 42 ++--- ...1_pretrained_frame_saliency_defended.json} | 8 +- ...pretrained_frame_saliency_undefended.json} | 8 +- ...ucf101_pretrained_masked_pgd_defended.json | 83 ++++++++++ ...101_pretrained_masked_pgd_undefended.json} | 8 +- ...n => xview_frcnn_masked_pgd_defended.json} | 18 +-- ...=> xview_frcnn_masked_pgd_undefended.json} | 12 +- .../xview_frcnn_robust_dpatch_defended.json | 76 +++++++++ .../xview_frcnn_robust_dpatch_undefended.json | 63 ++++++++ scenario_configs/xview_frcnn_targeted.json | 2 +- .../broken/invalid_dataset_framework.json | 2 +- tests/scenarios/broken/invalid_module.json | 2 +- tests/scenarios/broken/missing_scenario.json | 2 +- .../pytorch/image_classification.json | 2 +- .../image_classification_pretrained.json | 2 +- tests/scenarios/tf1/image_classification.json | 2 +- .../tf1/image_classification_pretrained.json | 2 +- .../tf1/image_classification_tfgraph.json | 2 +- 61 files changed, 1148 insertions(+), 237 deletions(-) create mode 100755 armory/art_experimental/attacks/robust_dpatch.py create mode 100644 armory/art_experimental/attacks/video_frame_border.py create mode 100755 armory/utils/triggers/peace.png create mode 100755 scenario_configs/librispeech_asr_imperceptible_defended.json rename scenario_configs/{asr_deepspeech_baseline.json => librispeech_asr_imperceptible_undefended.json} (71%) mode change 100644 => 100755 rename scenario_configs/{asr_deepspeech_defended_baseline_kenansville.json => librispeech_asr_kenansville_defended.json} (95%) mode change 100644 => 100755 rename scenario_configs/{asr_deepspeech_baseline_kenansville.json => librispeech_asr_kenansville_undefended.json} (94%) mode change 100644 => 100755 create mode 100755 scenario_configs/librispeech_asr_pgd_defended.json create mode 100755 scenario_configs/librispeech_asr_pgd_multipath_channel_defended.json rename scenario_configs/{asr_deepspeech_baseline_fgsm_channel.json => librispeech_asr_pgd_multipath_channel_undefended.json} (76%) mode change 100644 => 100755 rename scenario_configs/{asr_deepspeech_baseline_fgsm.json => librispeech_asr_pgd_undefended.json} (77%) mode change 100644 => 100755 rename scenario_configs/{asr_deepspeech_snr.json => librispeech_asr_snr_undefended.json} (97%) mode change 100644 => 100755 create mode 100755 scenario_configs/so2sat_eo_masked_pgd_defended.json create mode 100755 scenario_configs/so2sat_eo_masked_pgd_undefended.json rename scenario_configs/{so2sat_defended_baseline.json => so2sat_sar_masked_pgd_defended.json} (66%) mode change 100644 => 100755 rename scenario_configs/{so2sat_baseline.json => so2sat_sar_masked_pgd_undefended.json} (75%) mode change 100644 => 100755 create mode 100755 scenario_configs/ucf101_pretrained_flicker_defended.json rename scenario_configs/{ucf101_baseline_pretrained_frame_saliency.json => ucf101_pretrained_flicker_undefended.json} (56%) mode change 100644 => 100755 rename scenario_configs/{ucf101_defended_baseline_pretrained.json => ucf101_pretrained_frame_saliency_defended.json} (92%) mode change 100644 => 100755 rename scenario_configs/{ucf101_baseline_pretrained.json => ucf101_pretrained_frame_saliency_undefended.json} (91%) mode change 100644 => 100755 create mode 100755 scenario_configs/ucf101_pretrained_masked_pgd_defended.json rename scenario_configs/{ucf101_baseline_pretrained_pgd_patch.json => ucf101_pretrained_masked_pgd_undefended.json} (91%) mode change 100644 => 100755 rename scenario_configs/{xview_frcnn_defended.json => xview_frcnn_masked_pgd_defended.json} (82%) mode change 100644 => 100755 rename scenario_configs/{xview_frcnn.json => xview_frcnn_masked_pgd_undefended.json} (87%) mode change 100644 => 100755 create mode 100755 scenario_configs/xview_frcnn_robust_dpatch_defended.json create mode 100755 scenario_configs/xview_frcnn_robust_dpatch_undefended.json diff --git a/armory/__init__.py b/armory/__init__.py index 1ff9a1a26..45069c839 100644 --- a/armory/__init__.py +++ b/armory/__init__.py @@ -8,7 +8,7 @@ # Semantic Version -__version__ = "0.13.3" +__version__ = "0.13.4" # Submodule imports diff --git a/armory/art_experimental/attacks/pgd_patch.py b/armory/art_experimental/attacks/pgd_patch.py index 5fd0c9355..7d47bcf2b 100644 --- a/armory/art_experimental/attacks/pgd_patch.py +++ b/armory/art_experimental/attacks/pgd_patch.py @@ -1,7 +1,12 @@ +import logging + from art.attacks.evasion import ProjectedGradientDescent import numpy as np +logger = logging.getLogger(__name__) + + class PGDPatch(ProjectedGradientDescent): """ Apply Masked PGD to image and video inputs, @@ -15,15 +20,29 @@ def __init__(self, estimator, **kwargs): def generate(self, x, y=None, **generate_kwargs): video_input = generate_kwargs.get("video_input", False) + if "patch_ratio" in generate_kwargs: + patch_ratio = generate_kwargs["patch_ratio"] + patch_height = int(x.shape[-3] * patch_ratio ** 0.5) + patch_width = int(x.shape[-2] * patch_ratio ** 0.5) + elif "patch_height" in generate_kwargs and "patch_width" in generate_kwargs: + patch_height = generate_kwargs["patch_height"] + patch_width = generate_kwargs["patch_width"] + else: + raise ValueError( + "generate_kwargs did not define 'patch_ratio', or it did not define 'patch_height' and 'patch_width" + ) + if "ymin" in generate_kwargs: ymin = generate_kwargs["ymin"] else: - raise ValueError("generate_kwargs did not define 'ymin'") + logger.info("Selecting random value for patch ymin coordinate.") + ymin = np.random.randint(int(x.shape[-3] - patch_height)) if "xmin" in generate_kwargs: xmin = generate_kwargs["xmin"] else: - raise ValueError("generate_kwargs did not define 'xmin'") + logger.info("Selecting random value for patch xmin coordinate.") + xmin = np.random.randint(int(x.shape[-2] - patch_width)) assert x.ndim in [ 4, @@ -36,27 +55,12 @@ def generate(self, x, y=None, **generate_kwargs): channels = np.where(channels_mask)[0] mask = np.zeros(shape=x.shape[1:], dtype=np.float32) - if "patch_ratio" in generate_kwargs: - patch_ratio = generate_kwargs["patch_ratio"] - ymax = ymin + int(x.shape[-3] * patch_ratio ** 0.5) - xmax = xmin + int(x.shape[-2] * patch_ratio ** 0.5) - if video_input: - mask[:, ymin:ymax, xmin:xmax, channels] = 1.0 - else: - mask[ymin:ymax, xmin:xmax, channels] = 1.0 - elif "patch_height" in generate_kwargs and "patch_width" in generate_kwargs: - patch_height = generate_kwargs["patch_height"] - patch_width = generate_kwargs["patch_width"] - if video_input: - mask[ - :, ymin : ymin + patch_height, xmin : xmin + patch_width, channels - ] = 1.0 - else: - mask[ - ymin : ymin + patch_height, xmin : xmin + patch_width, channels - ] = 1.0 + + if video_input: + mask[ + :, ymin : ymin + patch_height, xmin : xmin + patch_width, channels + ] = 1.0 else: - raise ValueError( - "generate_kwargs did not define 'patch_ratio', or it did not define 'patch_height' and 'patch_width'" - ) + mask[ymin : ymin + patch_height, xmin : xmin + patch_width, channels] = 1.0 + return super().generate(x, y=y, mask=mask) diff --git a/armory/art_experimental/attacks/robust_dpatch.py b/armory/art_experimental/attacks/robust_dpatch.py new file mode 100755 index 000000000..aec73301a --- /dev/null +++ b/armory/art_experimental/attacks/robust_dpatch.py @@ -0,0 +1,31 @@ +import logging + +from art.attacks.evasion import RobustDPatch +import numpy as np + + +logger = logging.getLogger(__name__) + + +class RobustDPatch(RobustDPatch): + """ + Generate and apply patch + """ + + def __init__(self, estimator, **kwargs): + # allows for random patch location + if "patch_location" not in kwargs: + self.random_location = True + else: + self.random_location = False + super().__init__(estimator=estimator, **kwargs) + + def generate(self, x, y=None, **generate_kwargs): + if self.random_location: + logger.info("Selecting random coordinates for patch_location.") + self.patch_location = ( + np.random.randint(int(x.shape[-3] - self.patch_shape[0])), + np.random.randint(int(x.shape[-2] - self.patch_shape[1])), + ) + super().generate(x, y=y, **generate_kwargs) + return super().apply_patch(x) diff --git a/armory/art_experimental/attacks/video_frame_border.py b/armory/art_experimental/attacks/video_frame_border.py new file mode 100644 index 000000000..59d1d189a --- /dev/null +++ b/armory/art_experimental/attacks/video_frame_border.py @@ -0,0 +1,42 @@ +from art.attacks.evasion import ProjectedGradientDescent +import numpy as np + + +class FrameBorderPatch(ProjectedGradientDescent): + """ + Apply Masked PGD to video inputs, where only the + video frame is allowed to be perturbed. + Each video is assumed to have shape (NFHWC). + """ + + def __init__(self, estimator, **kwargs): + super().__init__(estimator=estimator, **kwargs) + + def generate(self, x, y=None, patch_ratio=None, **kwargs): + if patch_ratio is None: + raise ValueError("generate_kwargs did not define 'patch_ratio'") + if x.ndim != 5: + raise ValueError("This attack is designed for videos (5-dim)") + width = x.shape[3] + height = x.shape[2] + + t1 = ( + 2 * (width + height) + + (4 * (width + height) ** 2 - 16 * (patch_ratio * width * height)) ** 0.5 + ) / 8 + t2 = ( + 2 * (width + height) + - (4 * (width + height) ** 2 - 16 * (patch_ratio * width * height)) ** 0.5 + ) / 8 + thickness = int(min(t1, t2)) + + if (width - 2 * thickness) * (height - 2 * thickness) < ( + 1 - patch_ratio + ) * width * height: + raise ValueError("patch_ratio does not match height and width") + + mask = np.ones(shape=x.shape[1:], dtype=np.float32) + + mask[:, thickness : height - thickness, thickness : width - thickness, :] = 0.0 + + return super().generate(x, y=y, mask=mask, **kwargs) diff --git a/armory/art_experimental/defences/video_compression_normalized.py b/armory/art_experimental/defences/video_compression_normalized.py index c58653025..b9014c7c4 100644 --- a/armory/art_experimental/defences/video_compression_normalized.py +++ b/armory/art_experimental/defences/video_compression_normalized.py @@ -1,4 +1,5 @@ from art.defences.preprocessor import VideoCompression +from art.defences.preprocessor import VideoCompressionPyTorch import numpy as np @@ -38,3 +39,46 @@ def __call__(self, x, y=None): x /= scale x = x.astype(self.dtype) return x, y + + +class VideoCompressionNormalizedPytorch(VideoCompressionPyTorch): + """ + Convert x from [0,1] to [0, 255] and back, if necessary + """ + + def __init__( + self, + video_format, + constant_rate_factor=28, + channels_first=False, + apply_fit=False, + apply_predict=True, + verbose=False, + dtype=np.float32, + ): + super().__init__( + video_format=video_format, + constant_rate_factor=constant_rate_factor, + channels_first=channels_first, + apply_fit=apply_fit, + apply_predict=apply_predict, + verbose=verbose, + ) + self.dtype = dtype + + def forward(self, x, y=None): + """ + Apply video compression to sample `x`. + + :param x: Sample to compress of shape NCFHW or NFHWC. `x` values are expected to be in the data range [0, 255]. + :param y: Labels of the sample `x`. This function does not affect them in any way. + :return: Compressed sample. + """ + scale = 1 + if x.min() >= 0 and x.max() <= 1.0: + scale = 255 + + x = x * scale + x_compressed = self._compression_pytorch_numpy.apply(x) + x_compressed = x_compressed / scale + return x_compressed, y diff --git a/armory/utils/triggers/peace.png b/armory/utils/triggers/peace.png new file mode 100755 index 0000000000000000000000000000000000000000..807691dee971648025c905828894ac5172225e7a GIT binary patch literal 25740 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 FV1gh7+7kc( literal 0 HcmV?d00001 diff --git a/scenario_configs/apricot_frcnn.json b/scenario_configs/apricot_frcnn.json index 295d2ce71..1bff579de 100644 --- a/scenario_configs/apricot_frcnn.json +++ b/scenario_configs/apricot_frcnn.json @@ -44,7 +44,7 @@ "name": "ObjectDetectionTask" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/apricot_frcnn_defended.json b/scenario_configs/apricot_frcnn_defended.json index ab067bdca..d2986ce89 100644 --- a/scenario_configs/apricot_frcnn_defended.json +++ b/scenario_configs/apricot_frcnn_defended.json @@ -57,7 +57,7 @@ "name": "ObjectDetectionTask" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/cifar10_baseline.json b/scenario_configs/cifar10_baseline.json index 02ebafa0b..97e0acbda 100644 --- a/scenario_configs/cifar10_baseline.json +++ b/scenario_configs/cifar10_baseline.json @@ -49,7 +49,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/cifar10_defended_example.json b/scenario_configs/cifar10_defended_example.json index 91b00b62a..cd69d161e 100644 --- a/scenario_configs/cifar10_defended_example.json +++ b/scenario_configs/cifar10_defended_example.json @@ -57,7 +57,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/dapricot_frcnn_masked_pgd.json b/scenario_configs/dapricot_frcnn_masked_pgd.json index f381e6ce4..1d5a7daa8 100644 --- a/scenario_configs/dapricot_frcnn_masked_pgd.json +++ b/scenario_configs/dapricot_frcnn_masked_pgd.json @@ -53,7 +53,7 @@ "name": "ObjectDetectionTask" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": "colour-science/colour", "gpus": "all", "output_dir": null, diff --git a/scenario_configs/gtsrb_scenario_baseline.json b/scenario_configs/gtsrb_scenario_baseline.json index 909001648..0e4086722 100644 --- a/scenario_configs/gtsrb_scenario_baseline.json +++ b/scenario_configs/gtsrb_scenario_baseline.json @@ -58,7 +58,7 @@ "name": "GTSRB" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/gtsrb_scenario_baseline_pytorch.json b/scenario_configs/gtsrb_scenario_baseline_pytorch.json index a68c76a58..4a42a0e7b 100644 --- a/scenario_configs/gtsrb_scenario_baseline_pytorch.json +++ b/scenario_configs/gtsrb_scenario_baseline_pytorch.json @@ -58,7 +58,7 @@ "name": "GTSRB" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/gtsrb_scenario_clbd.json b/scenario_configs/gtsrb_scenario_clbd.json index b43d9c9e4..40c00208b 100644 --- a/scenario_configs/gtsrb_scenario_clbd.json +++ b/scenario_configs/gtsrb_scenario_clbd.json @@ -58,7 +58,7 @@ "name": "GTSRB_CLBD" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/gtsrb_scenario_clbd_bullethole.json b/scenario_configs/gtsrb_scenario_clbd_bullethole.json index 75d005761..41c5a0dc6 100644 --- a/scenario_configs/gtsrb_scenario_clbd_bullethole.json +++ b/scenario_configs/gtsrb_scenario_clbd_bullethole.json @@ -64,7 +64,7 @@ "name": "GTSRB_CLBD" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/gtsrb_scenario_clbd_defended.json b/scenario_configs/gtsrb_scenario_clbd_defended.json index a90a614d4..cdae6e80e 100644 --- a/scenario_configs/gtsrb_scenario_clbd_defended.json +++ b/scenario_configs/gtsrb_scenario_clbd_defended.json @@ -69,7 +69,7 @@ "name": "GTSRB_CLBD" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/gtsrb_scenario_poison.json b/scenario_configs/gtsrb_scenario_poison.json index 62e215042..1f6bd27c4 100644 --- a/scenario_configs/gtsrb_scenario_poison.json +++ b/scenario_configs/gtsrb_scenario_poison.json @@ -48,7 +48,7 @@ "name": "GTSRB" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "use_gpu": false diff --git a/scenario_configs/librispeech_asr_imperceptible_defended.json b/scenario_configs/librispeech_asr_imperceptible_defended.json new file mode 100755 index 000000000..060a273b7 --- /dev/null +++ b/scenario_configs/librispeech_asr_imperceptible_defended.json @@ -0,0 +1,92 @@ +{ + "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", + "adhoc": { + "skip_adversarial": false + }, + "attack": { + "knowledge": "white", + "kwargs": { + "decrease_factor_alpha": 0.5, + "decrease_factor_eps": 0.5, + "eps": 0.0075, + "global_max_length": 562480, + "increase_factor_alpha": 2.0, + "initial_rescale": 1.0, + "learning_rate_1": 0.0001, + "learning_rate_2": 1e-07, + "max_iter_1": 400, + "max_iter_2": 100, + "num_iter_decrease_alpha": 50 + }, + "module": "art.attacks.evasion.imperceptible_asr.imperceptible_asr_pytorch", + "name": "ImperceptibleASRPyTorch", + "targeted": true, + "targeted_labels": { + "scheme": "matched length", + "transcripts": [ + "REALLY SHORT TEST STRING", + "THE TEST STRING HAS A LENGTH EQUAL TO THE MEDIAN OF THE CLEAN TEST TRANSCRIPT LENGTHS", + "THIS IS AN EXCEEDINGLY LONG TEST STRING BUT NOT REALLY AS THE LONGEST STRING HAS OVER FIVE HUNDRED CHARACTERS IN ITS TRANSCRIPT AND INCLUDES A LIST OF PEOPLE AND SPEAKS OF A SENATOR FROM NEW JERSEY" + ] + }, + "use_label": false + }, + "dataset": { + "batch_size": 1, + "eval_split": "test_clean", + "framework": "numpy", + "module": "armory.data.datasets", + "name": "librispeech", + "train_split": "train_clean100" + }, + "defense": { + "kwargs": { + "apply_fit": false, + "apply_predict": true, + "channels_first": false, + "sample_rate": 16000, + "verbose": false + }, + "module": "art.defences.preprocessor", + "name": "Mp3Compression", + "type": "Preprocessor" + }, + "metric": { + "means": false, + "perturbation": "snr_db", + "record_metric_per_sample": true, + "task": [ + "word_error_rate" + ] + }, + "model": { + "fit": false, + "fit_kwargs": { + "nb_epochs": 20000 + }, + "model_kwargs": {}, + "module": "armory.baseline_models.pytorch.deep_speech", + "name": "get_art_model", + "predict_kwargs": { + "transcription_output": true + }, + "weights_file": null, + "wrapper_kwargs": { + "pretrained_model": "librispeech" + } + }, + "scenario": { + "kwargs": {}, + "module": "armory.scenarios.audio_asr", + "name": "AutomaticSpeechRecognition" + }, + "sysconfig": { + "docker_image": "twosixarmory/pytorch-deepspeech:0.13.4", + "external_github_repo": "hkakitani/deepspeech.pytorch", + "gpus": "all", + "local_repo_path": null, + "output_dir": null, + "output_filename": null, + "use_gpu": false + } +} diff --git a/scenario_configs/asr_deepspeech_baseline.json b/scenario_configs/librispeech_asr_imperceptible_undefended.json old mode 100644 new mode 100755 similarity index 71% rename from scenario_configs/asr_deepspeech_baseline.json rename to scenario_configs/librispeech_asr_imperceptible_undefended.json index fb9de1653..1ce6808a2 --- a/scenario_configs/asr_deepspeech_baseline.json +++ b/scenario_configs/librispeech_asr_imperceptible_undefended.json @@ -7,10 +7,11 @@ "knowledge": "white", "kwargs": { "decrease_factor_alpha": 0.5, + "decrease_factor_eps": 0.5, "eps": 0.0075, "global_max_length": 562480, "increase_factor_alpha": 2.0, - "initial_rescale": 0.5, + "initial_rescale": 1.0, "learning_rate_1": 0.0001, "learning_rate_2": 1e-07, "max_iter_1": 400, @@ -21,15 +22,12 @@ "name": "ImperceptibleASRPyTorch", "targeted": true, "targeted_labels": { - "kwargs": { - "transcripts": [ - "REALLY SHORT TEST STRING", - "THE TEST STRING HAS A LENGTH EQUAL TO THE MEDIAN OF THE CLEAN TEST TRANSCRIPT LENGTHS", - "THIS IS AN EXCEEDINGLY LONG TEST STRING BUT NOT REALLY AS THE LONGEST STRING HAS OVER FIVE HUNDRED CHARACTERS IN ITS TRANSCRIPT AND INCLUDES A LIST OF PEOPLE AND SPEASKS OF A SENATOR FROM NEW JERSEY" - ] - }, - "module": "armory.utils.labels", - "name": "MatchedTranscriptLengthTargeter" + "scheme": "matched length", + "transcripts": [ + "REALLY SHORT TEST STRING", + "THE TEST STRING HAS A LENGTH EQUAL TO THE MEDIAN OF THE CLEAN TEST TRANSCRIPT LENGTHS", + "THIS IS AN EXCEEDINGLY LONG TEST STRING BUT NOT REALLY AS THE LONGEST STRING HAS OVER FIVE HUNDRED CHARACTERS IN ITS TRANSCRIPT AND INCLUDES A LIST OF PEOPLE AND SPEAKS OF A SENATOR FROM NEW JERSEY" + ] }, "use_label": false }, @@ -44,7 +42,7 @@ "defense": null, "metric": { "means": false, - "perturbation": "linf", + "perturbation": "snr_db", "record_metric_per_sample": true, "task": [ "word_error_rate" @@ -63,10 +61,6 @@ }, "weights_file": null, "wrapper_kwargs": { - "clip_values": [ - -1, - 1 - ], "pretrained_model": "librispeech" } }, @@ -76,7 +70,7 @@ "name": "AutomaticSpeechRecognition" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch-deepspeech:0.13.3", + "docker_image": "twosixarmory/pytorch-deepspeech:0.13.4", "external_github_repo": "hkakitani/deepspeech.pytorch", "gpus": "all", "local_repo_path": null, diff --git a/scenario_configs/asr_deepspeech_defended_baseline_kenansville.json b/scenario_configs/librispeech_asr_kenansville_defended.json old mode 100644 new mode 100755 similarity index 95% rename from scenario_configs/asr_deepspeech_defended_baseline_kenansville.json rename to scenario_configs/librispeech_asr_kenansville_defended.json index debae834e..34db6ca38 --- a/scenario_configs/asr_deepspeech_defended_baseline_kenansville.json +++ b/scenario_configs/librispeech_asr_kenansville_defended.json @@ -7,7 +7,7 @@ "knowledge": "white", "kwargs": { "partial_attack": false, - "snr_db": 30, + "snr_db": 20, "targeted": false }, "module": "armory.art_experimental.attacks.kenansville_dft", @@ -64,7 +64,7 @@ "name": "AutomaticSpeechRecognition" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch-deepspeech:0.13.3", + "docker_image": "twosixarmory/pytorch-deepspeech:0.13.4", "external_github_repo": "hkakitani/deepspeech.pytorch", "gpus": "all", "local_repo_path": null, diff --git a/scenario_configs/asr_deepspeech_baseline_kenansville.json b/scenario_configs/librispeech_asr_kenansville_undefended.json old mode 100644 new mode 100755 similarity index 94% rename from scenario_configs/asr_deepspeech_baseline_kenansville.json rename to scenario_configs/librispeech_asr_kenansville_undefended.json index b5b3e7040..6798f9df6 --- a/scenario_configs/asr_deepspeech_baseline_kenansville.json +++ b/scenario_configs/librispeech_asr_kenansville_undefended.json @@ -7,7 +7,7 @@ "knowledge": "white", "kwargs": { "partial_attack": false, - "snr_db": 30, + "snr_db": 20, "targeted": false }, "module": "armory.art_experimental.attacks.kenansville_dft", @@ -53,7 +53,7 @@ "name": "AutomaticSpeechRecognition" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch-deepspeech:0.13.3", + "docker_image": "twosixarmory/pytorch-deepspeech:0.13.4", "external_github_repo": "hkakitani/deepspeech.pytorch", "gpus": "all", "local_repo_path": null, diff --git a/scenario_configs/librispeech_asr_pgd_defended.json b/scenario_configs/librispeech_asr_pgd_defended.json new file mode 100755 index 000000000..9084ea172 --- /dev/null +++ b/scenario_configs/librispeech_asr_pgd_defended.json @@ -0,0 +1,86 @@ +{ + "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", + "adhoc": { + "skip_adversarial": false + }, + "attack": { + "knowledge": "white", + "kwargs": { + "batch_size": 1, + "eps": 1.5, + "eps_step": 0.05, + "max_iter": 100, + "norm": 2, + "num_random_init": 0, + "random_eps": false, + "targeted": false, + "verbose": false + }, + "module": "art.attacks.evasion", + "name": "ProjectedGradientDescent", + "targeted": false, + "use_label": false + }, + "dataset": { + "batch_size": 1, + "eval_split": "test_clean", + "framework": "numpy", + "module": "armory.data.datasets", + "name": "librispeech", + "train_split": "train_clean100" + }, + "defense": { + "kwargs": { + "apply_fit": false, + "apply_predict": true, + "channels_first": false, + "sample_rate": 16000, + "verbose": false + }, + "module": "art.defences.preprocessor", + "name": "Mp3Compression", + "type": "Preprocessor" + }, + "metric": { + "means": false, + "perturbation": "snr_db", + "record_metric_per_sample": true, + "task": [ + "word_error_rate" + ] + }, + "model": { + "fit": false, + "fit_kwargs": { + "nb_epochs": 20000 + }, + "model_kwargs": {}, + "module": "armory.baseline_models.pytorch.deep_speech", + "name": "get_art_model", + "predict_kwargs": { + "transcription_output": true + }, + "weights_file": null, + "wrapper_kwargs": { + "clip_values": [ + -1, + 1 + ], + "pretrained_model": "librispeech" + } + }, + "scenario": { + "kwargs": {}, + "module": "armory.scenarios.audio_asr", + "name": "AutomaticSpeechRecognition" + }, + "sysconfig": { + "docker_image": "twosixarmory/pytorch-deepspeech:0.13.4", + "external_github_repo": "hkakitani/deepspeech.pytorch", + "gpus": "all", + "local_repo_path": null, + "output_dir": null, + "output_filename": null, + "use_gpu": false + } +} diff --git a/scenario_configs/librispeech_asr_pgd_multipath_channel_defended.json b/scenario_configs/librispeech_asr_pgd_multipath_channel_defended.json new file mode 100755 index 000000000..2a1da8b6f --- /dev/null +++ b/scenario_configs/librispeech_asr_pgd_multipath_channel_defended.json @@ -0,0 +1,91 @@ +{ + "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", + "adhoc": { + "audio_channel": { + "attenuation": 0.5, + "delay": 300, + "pytorch": true + }, + "skip_adversarial": false + }, + "attack": { + "knowledge": "white", + "kwargs": { + "batch_size": 1, + "eps": 1.5, + "eps_step": 0.05, + "max_iter": 100, + "norm": 2, + "num_random_init": 0, + "random_eps": false, + "targeted": false, + "verbose": false + }, + "module": "art.attacks.evasion", + "name": "ProjectedGradientDescent", + "targeted": false, + "use_label": false + }, + "dataset": { + "batch_size": 1, + "eval_split": "test_clean", + "framework": "numpy", + "module": "armory.data.datasets", + "name": "librispeech", + "train_split": "train_clean100" + }, + "defense": { + "kwargs": { + "apply_fit": false, + "apply_predict": true, + "channels_first": false, + "sample_rate": 16000, + "verbose": false + }, + "module": "art.defences.preprocessor", + "name": "Mp3Compression", + "type": "Preprocessor" + }, + "metric": { + "means": false, + "perturbation": "snr_db", + "record_metric_per_sample": true, + "task": [ + "word_error_rate" + ] + }, + "model": { + "fit": false, + "fit_kwargs": { + "nb_epochs": 20000 + }, + "model_kwargs": {}, + "module": "armory.baseline_models.pytorch.deep_speech", + "name": "get_art_model", + "predict_kwargs": { + "transcription_output": true + }, + "weights_file": null, + "wrapper_kwargs": { + "clip_values": [ + -1, + 1 + ], + "pretrained_model": "librispeech" + } + }, + "scenario": { + "kwargs": {}, + "module": "armory.scenarios.audio_asr", + "name": "AutomaticSpeechRecognition" + }, + "sysconfig": { + "docker_image": "twosixarmory/pytorch-deepspeech:0.13.4", + "external_github_repo": "hkakitani/deepspeech.pytorch", + "gpus": "all", + "local_repo_path": null, + "output_dir": null, + "output_filename": null, + "use_gpu": false + } +} diff --git a/scenario_configs/asr_deepspeech_baseline_fgsm_channel.json b/scenario_configs/librispeech_asr_pgd_multipath_channel_undefended.json old mode 100644 new mode 100755 similarity index 76% rename from scenario_configs/asr_deepspeech_baseline_fgsm_channel.json rename to scenario_configs/librispeech_asr_pgd_multipath_channel_undefended.json index 570fab510..a2720ade1 --- a/scenario_configs/asr_deepspeech_baseline_fgsm_channel.json +++ b/scenario_configs/librispeech_asr_pgd_multipath_channel_undefended.json @@ -2,8 +2,8 @@ "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", "adhoc": { "audio_channel": { - "attenuation": 0.3, - "delay": 1600, + "attenuation": 0.5, + "delay": 300, "pytorch": true }, "skip_adversarial": false @@ -12,22 +12,18 @@ "knowledge": "white", "kwargs": { "batch_size": 1, - "eps": 0.2, - "eps_step": 0.1, - "minimal": false, + "eps": 1.5, + "eps_step": 0.05, + "max_iter": 100, + "norm": 2, "num_random_init": 0, - "targeted": true + "random_eps": false, + "targeted": false, + "verbose": false }, "module": "art.attacks.evasion", - "name": "FastGradientMethod", - "targeted": true, - "targeted_labels": { - "kwargs": { - "value": "TEST STRING" - }, - "module": "armory.utils.labels", - "name": "FixedStringTargeter" - }, + "name": "ProjectedGradientDescent", + "targeted": false, "use_label": false }, "dataset": { @@ -41,7 +37,7 @@ "defense": null, "metric": { "means": false, - "perturbation": "linf", + "perturbation": "snr_db", "record_metric_per_sample": true, "task": [ "word_error_rate" @@ -73,7 +69,7 @@ "name": "AutomaticSpeechRecognition" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch-deepspeech:0.13.3", + "docker_image": "twosixarmory/pytorch-deepspeech:0.13.4", "external_github_repo": "hkakitani/deepspeech.pytorch", "gpus": "all", "local_repo_path": null, diff --git a/scenario_configs/asr_deepspeech_baseline_fgsm.json b/scenario_configs/librispeech_asr_pgd_undefended.json old mode 100644 new mode 100755 similarity index 77% rename from scenario_configs/asr_deepspeech_baseline_fgsm.json rename to scenario_configs/librispeech_asr_pgd_undefended.json index 0dcef58eb..920072620 --- a/scenario_configs/asr_deepspeech_baseline_fgsm.json +++ b/scenario_configs/librispeech_asr_pgd_undefended.json @@ -7,22 +7,18 @@ "knowledge": "white", "kwargs": { "batch_size": 1, - "eps": 0.2, - "eps_step": 0.1, - "minimal": false, + "eps": 1.5, + "eps_step": 0.05, + "max_iter": 100, + "norm": 2, "num_random_init": 0, - "targeted": true + "random_eps": false, + "targeted": false, + "verbose": false }, "module": "art.attacks.evasion", - "name": "FastGradientMethod", - "targeted": true, - "targeted_labels": { - "kwargs": { - "value": "TEST STRING" - }, - "module": "armory.utils.labels", - "name": "FixedStringTargeter" - }, + "name": "ProjectedGradientDescent", + "targeted": false, "use_label": false }, "dataset": { @@ -36,7 +32,7 @@ "defense": null, "metric": { "means": false, - "perturbation": "linf", + "perturbation": "snr_db", "record_metric_per_sample": true, "task": [ "word_error_rate" @@ -68,7 +64,7 @@ "name": "AutomaticSpeechRecognition" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch-deepspeech:0.13.3", + "docker_image": "twosixarmory/pytorch-deepspeech:0.13.4", "external_github_repo": "hkakitani/deepspeech.pytorch", "gpus": "all", "local_repo_path": null, diff --git a/scenario_configs/asr_deepspeech_snr.json b/scenario_configs/librispeech_asr_snr_undefended.json old mode 100644 new mode 100755 similarity index 97% rename from scenario_configs/asr_deepspeech_snr.json rename to scenario_configs/librispeech_asr_snr_undefended.json index 33445538b..2b629a0ce --- a/scenario_configs/asr_deepspeech_snr.json +++ b/scenario_configs/librispeech_asr_snr_undefended.json @@ -69,7 +69,7 @@ "name": "AutomaticSpeechRecognition" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch-deepspeech:0.13.3", + "docker_image": "twosixarmory/pytorch-deepspeech:0.13.4", "external_github_repo": "hkakitani/deepspeech.pytorch", "gpus": "all", "local_repo_path": null, diff --git a/scenario_configs/librispeech_baseline_sincnet.json b/scenario_configs/librispeech_baseline_sincnet.json index 246aa3453..27fa6d912 100644 --- a/scenario_configs/librispeech_baseline_sincnet.json +++ b/scenario_configs/librispeech_baseline_sincnet.json @@ -55,7 +55,7 @@ "name": "AudioClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": "hkakitani/SincNet", "gpus": "all", "output_dir": null, diff --git a/scenario_configs/librispeech_baseline_sincnet_snr_pgd.json b/scenario_configs/librispeech_baseline_sincnet_snr_pgd.json index 59ec80a20..4d091f4c8 100644 --- a/scenario_configs/librispeech_baseline_sincnet_snr_pgd.json +++ b/scenario_configs/librispeech_baseline_sincnet_snr_pgd.json @@ -59,7 +59,7 @@ "name": "AudioClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": "hkakitani/SincNet", "gpus": "all", "output_dir": null, diff --git a/scenario_configs/librispeech_baseline_sincnet_targeted.json b/scenario_configs/librispeech_baseline_sincnet_targeted.json index 5fe4fd0d4..de8416739 100644 --- a/scenario_configs/librispeech_baseline_sincnet_targeted.json +++ b/scenario_configs/librispeech_baseline_sincnet_targeted.json @@ -62,7 +62,7 @@ "name": "AudioClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": "hkakitani/SincNet", "gpus": "all", "output_dir": null, diff --git a/scenario_configs/mnist_baseline.json b/scenario_configs/mnist_baseline.json index c74ea7367..150f03705 100644 --- a/scenario_configs/mnist_baseline.json +++ b/scenario_configs/mnist_baseline.json @@ -47,7 +47,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/resisc10_poison_dlbd.json b/scenario_configs/resisc10_poison_dlbd.json index 2e462b36a..2bc8034e8 100644 --- a/scenario_configs/resisc10_poison_dlbd.json +++ b/scenario_configs/resisc10_poison_dlbd.json @@ -114,7 +114,7 @@ "name": "RESISC10" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/resisc45_baseline_densenet121.json b/scenario_configs/resisc45_baseline_densenet121.json index c5e160b58..b8767afcc 100644 --- a/scenario_configs/resisc45_baseline_densenet121.json +++ b/scenario_configs/resisc45_baseline_densenet121.json @@ -45,7 +45,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/resisc45_baseline_densenet121_cascade.json b/scenario_configs/resisc45_baseline_densenet121_cascade.json index e8569f765..b55ef4608 100644 --- a/scenario_configs/resisc45_baseline_densenet121_cascade.json +++ b/scenario_configs/resisc45_baseline_densenet121_cascade.json @@ -70,7 +70,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/resisc45_baseline_densenet121_finetune.json b/scenario_configs/resisc45_baseline_densenet121_finetune.json index de722f383..0d7865cb0 100644 --- a/scenario_configs/resisc45_baseline_densenet121_finetune.json +++ b/scenario_configs/resisc45_baseline_densenet121_finetune.json @@ -45,7 +45,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/resisc45_baseline_densenet121_patch.json b/scenario_configs/resisc45_baseline_densenet121_patch.json index 4f700df3d..66e69c122 100644 --- a/scenario_configs/resisc45_baseline_densenet121_patch.json +++ b/scenario_configs/resisc45_baseline_densenet121_patch.json @@ -58,7 +58,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/resisc45_baseline_densenet121_targeted.json b/scenario_configs/resisc45_baseline_densenet121_targeted.json index 20eb84f60..d0396f2d4 100644 --- a/scenario_configs/resisc45_baseline_densenet121_targeted.json +++ b/scenario_configs/resisc45_baseline_densenet121_targeted.json @@ -52,7 +52,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/so2sat_eo_masked_pgd_defended.json b/scenario_configs/so2sat_eo_masked_pgd_defended.json new file mode 100755 index 000000000..f160df3a9 --- /dev/null +++ b/scenario_configs/so2sat_eo_masked_pgd_defended.json @@ -0,0 +1,146 @@ +{ + "_description": "Baseline so2sat classification", + "adhoc": null, + "attack": { + "generate_kwargs": { + "patch_ratio": 0.05 + }, + "knowledge": "white", + "kwargs": { + "batch_size": 1, + "eps": 1.0, + "eps_step": 0.01, + "max_iter": 300, + "num_random_init": 0, + "random_eps": false, + "targeted": false, + "verbose": false + }, + "module": "armory.art_experimental.attacks.pgd_patch", + "name": "PGDPatch", + "use_label": true + }, + "dataset": { + "batch_size": 8, + "eval_split": "validation", + "framework": "numpy", + "module": "armory.data.datasets", + "name": "so2sat" + }, + "defense": { + "kwargs": { + "apply_fit": false, + "apply_predict": true, + "channels_first": false, + "clip_values": [ + 0.0, + 1.0 + ], + "mins": [ + -0.22, + -0.26, + -0.73, + -0.75, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "quality": 95, + "ranges": [ + 0.46, + 0.48, + 1.52, + 1.11, + 0.7, + 0.7, + 0.7, + 0.61, + 0.7, + 0.7, + 0.7, + 0.7, + 0.62, + 0.54 + ] + }, + "module": "armory.art_experimental.defences.jpeg_compression_multichannel_image", + "name": "JpegCompressionMultiChannelImage", + "type": "Preprocessor" + }, + "metric": { + "means": true, + "perturbation": "l0", + "record_metric_per_sample": false, + "task": [ + "categorical_accuracy" + ] + }, + "model": { + "fit": false, + "fit_kwargs": { + "nb_epochs": 20 + }, + "model_kwargs": {}, + "module": "armory.baseline_models.keras.so2sat", + "name": "get_art_model", + "weights_file": "multimodal_baseline_weights.h5", + "wrapper_kwargs": { + "clip_values": [ + [ + -0.22, + -0.26, + -0.73, + -0.75, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0.24, + 0.22, + 0.79, + 0.36, + 0.7, + 0.7, + 0.7, + 0.61, + 0.7, + 0.7, + 0.7, + 0.7, + 0.62, + 0.54 + ] + ] + } + }, + "scenario": { + "kwargs": { + "attack_modality": "eo" + }, + "module": "armory.scenarios.multimodal_so2sat_scenario", + "name": "So2SatClassification" + }, + "sysconfig": { + "docker_image": "twosixarmory/tf1:0.13.4", + "external_github_repo": null, + "gpus": "all", + "output_dir": null, + "output_filename": null, + "use_gpu": false + } +} diff --git a/scenario_configs/so2sat_eo_masked_pgd_undefended.json b/scenario_configs/so2sat_eo_masked_pgd_undefended.json new file mode 100755 index 000000000..c78e7dcbc --- /dev/null +++ b/scenario_configs/so2sat_eo_masked_pgd_undefended.json @@ -0,0 +1,100 @@ +{ + "_description": "Baseline so2sat classification", + "adhoc": null, + "attack": { + "generate_kwargs": { + "patch_ratio": 0.05 + }, + "knowledge": "white", + "kwargs": { + "batch_size": 1, + "eps": 1.0, + "eps_step": 0.01, + "max_iter": 300, + "num_random_init": 0, + "random_eps": false, + "targeted": false, + "verbose": false + }, + "module": "armory.art_experimental.attacks.pgd_patch", + "name": "PGDPatch", + "use_label": true + }, + "dataset": { + "batch_size": 8, + "eval_split": "validation", + "framework": "numpy", + "module": "armory.data.datasets", + "name": "so2sat" + }, + "defense": null, + "metric": { + "means": true, + "perturbation": "l0", + "record_metric_per_sample": false, + "task": [ + "categorical_accuracy" + ] + }, + "model": { + "fit": false, + "fit_kwargs": { + "nb_epochs": 20 + }, + "model_kwargs": {}, + "module": "armory.baseline_models.keras.so2sat", + "name": "get_art_model", + "weights_file": "multimodal_baseline_weights.h5", + "wrapper_kwargs": { + "clip_values": [ + [ + -0.22, + -0.26, + -0.73, + -0.75, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0.24, + 0.22, + 0.79, + 0.36, + 0.7, + 0.7, + 0.7, + 0.61, + 0.7, + 0.7, + 0.7, + 0.7, + 0.62, + 0.54 + ] + ] + } + }, + "scenario": { + "kwargs": { + "attack_modality": "eo" + }, + "module": "armory.scenarios.multimodal_so2sat_scenario", + "name": "So2SatClassification" + }, + "sysconfig": { + "docker_image": "twosixarmory/tf1:0.13.4", + "external_github_repo": null, + "gpus": "all", + "output_dir": null, + "output_filename": null, + "use_gpu": false + } +} diff --git a/scenario_configs/so2sat_defended_baseline.json b/scenario_configs/so2sat_sar_masked_pgd_defended.json old mode 100644 new mode 100755 similarity index 66% rename from scenario_configs/so2sat_defended_baseline.json rename to scenario_configs/so2sat_sar_masked_pgd_defended.json index 37718578d..6f8136e65 --- a/scenario_configs/so2sat_defended_baseline.json +++ b/scenario_configs/so2sat_sar_masked_pgd_defended.json @@ -3,16 +3,14 @@ "adhoc": null, "attack": { "generate_kwargs": { - "patch_ratio": 0.05, - "xmin": 0, - "ymin": 0 + "patch_ratio": 0.05 }, "knowledge": "white", "kwargs": { "batch_size": 1, "eps": 2.0, - "eps_step": 0.03, - "max_iter": 100, + "eps_step": 0.01, + "max_iter": 300, "num_random_init": 0, "random_eps": false, "targeted": false, @@ -39,37 +37,37 @@ 1.0 ], "mins": [ - -1.0, - -1.0, - -1.0, - -1.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 + -0.22, + -0.26, + -0.73, + -0.75, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ], "quality": 95, "ranges": [ - 2.0, - 2.0, - 2.0, - 2.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0 + 0.46, + 0.48, + 1.52, + 1.11, + 0.7, + 0.7, + 0.7, + 0.61, + 0.7, + 0.7, + 0.7, + 0.7, + 0.62, + 0.54 ] }, "module": "armory.art_experimental.defences.jpeg_compression_multichannel_image", @@ -96,10 +94,10 @@ "wrapper_kwargs": { "clip_values": [ [ - -1, - -1, - -1, - -1, + -0.22, + -0.26, + -0.73, + -0.75, 0, 0, 0, @@ -112,20 +110,20 @@ 0 ], [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 + 0.24, + 0.22, + 0.79, + 0.36, + 0.7, + 0.7, + 0.7, + 0.61, + 0.7, + 0.7, + 0.7, + 0.7, + 0.62, + 0.54 ] ] } @@ -138,7 +136,7 @@ "name": "So2SatClassification" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/so2sat_baseline.json b/scenario_configs/so2sat_sar_masked_pgd_undefended.json old mode 100644 new mode 100755 similarity index 75% rename from scenario_configs/so2sat_baseline.json rename to scenario_configs/so2sat_sar_masked_pgd_undefended.json index ffcafe554..06fc86d1a --- a/scenario_configs/so2sat_baseline.json +++ b/scenario_configs/so2sat_sar_masked_pgd_undefended.json @@ -3,16 +3,14 @@ "adhoc": null, "attack": { "generate_kwargs": { - "patch_ratio": 0.05, - "xmin": 0, - "ymin": 0 + "patch_ratio": 0.05 }, "knowledge": "white", "kwargs": { "batch_size": 1, "eps": 2.0, - "eps_step": 0.03, - "max_iter": 100, + "eps_step": 0.01, + "max_iter": 300, "num_random_init": 0, "random_eps": false, "targeted": false, @@ -50,10 +48,10 @@ "wrapper_kwargs": { "clip_values": [ [ - -1, - -1, - -1, - -1, + -0.22, + -0.26, + -0.73, + -0.75, 0, 0, 0, @@ -66,20 +64,20 @@ 0 ], [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 + 0.24, + 0.22, + 0.79, + 0.36, + 0.7, + 0.7, + 0.7, + 0.61, + 0.7, + 0.7, + 0.7, + 0.7, + 0.62, + 0.54 ] ] } @@ -92,7 +90,7 @@ "name": "So2SatClassification" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/ucf101_baseline_finetune.json b/scenario_configs/ucf101_baseline_finetune.json index c36a7f50f..c85260b65 100644 --- a/scenario_configs/ucf101_baseline_finetune.json +++ b/scenario_configs/ucf101_baseline_finetune.json @@ -52,7 +52,7 @@ "name": "Ucf101" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": "yusong-tan/MARS", "gpus": "all", "output_dir": null, diff --git a/scenario_configs/ucf101_baseline_pretrained_targeted.json b/scenario_configs/ucf101_baseline_pretrained_targeted.json index ca90a0b85..2270cd409 100644 --- a/scenario_configs/ucf101_baseline_pretrained_targeted.json +++ b/scenario_configs/ucf101_baseline_pretrained_targeted.json @@ -58,7 +58,7 @@ "name": "Ucf101" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": "yusong-tan/MARS", "gpus": "all", "output_dir": null, diff --git a/scenario_configs/ucf101_pretrained_flicker_defended.json b/scenario_configs/ucf101_pretrained_flicker_defended.json new file mode 100755 index 000000000..6a11e1dea --- /dev/null +++ b/scenario_configs/ucf101_pretrained_flicker_defended.json @@ -0,0 +1,77 @@ +{ + "_description": "UCF101 video classification from pretrained, contributed by MITRE Corporation", + "adhoc": null, + "attack": { + "knowledge": "white", + "kwargs": { + "beta_0": 1.0, + "beta_1": 0.5, + "beta_2": 0.5, + "eps_step": 0.02, + "loss_margin": 0.05, + "max_iter": 100, + "start_frame_index": 0, + "targeted": false + }, + "module": "art.attacks.evasion.over_the_air_flickering.over_the_air_flickering_pytorch", + "name": "OverTheAirFlickeringPyTorch", + "use_label": true + }, + "dataset": { + "batch_size": 1, + "framework": "numpy", + "module": "armory.data.datasets", + "name": "ucf101" + }, + "defense": { + "kwargs": { + "apply_fit": false, + "apply_predict": true, + "channels_first": false, + "constant_rate_factor": 28, + "verbose": false, + "video_format": "avi" + }, + "module": "armory.art_experimental.defences.video_compression_normalized", + "name": "VideoCompressionNormalized", + "type": "Preprocessor" + }, + "metric": { + "means": true, + "perturbation": [ + "l0" + ], + "record_metric_per_sample": false, + "task": [ + "categorical_accuracy", + "top_5_categorical_accuracy" + ] + }, + "model": { + "fit": false, + "fit_kwargs": { + "nb_epochs": 10 + }, + "model_kwargs": { + "max_frames": 512, + "model_status": "ucf101_trained" + }, + "module": "armory.baseline_models.pytorch.ucf101_mars", + "name": "get_art_model", + "weights_file": "mars_ucf101_v1.pth", + "wrapper_kwargs": {} + }, + "scenario": { + "kwargs": {}, + "module": "armory.scenarios.video_ucf101_scenario", + "name": "Ucf101" + }, + "sysconfig": { + "docker_image": "twosixarmory/pytorch:0.13.4", + "external_github_repo": "yusong-tan/MARS", + "gpus": "all", + "output_dir": null, + "output_filename": null, + "use_gpu": false + } +} diff --git a/scenario_configs/ucf101_baseline_pretrained_frame_saliency.json b/scenario_configs/ucf101_pretrained_flicker_undefended.json old mode 100644 new mode 100755 similarity index 56% rename from scenario_configs/ucf101_baseline_pretrained_frame_saliency.json rename to scenario_configs/ucf101_pretrained_flicker_undefended.json index 356907a6f..c6118b6d4 --- a/scenario_configs/ucf101_baseline_pretrained_frame_saliency.json +++ b/scenario_configs/ucf101_pretrained_flicker_undefended.json @@ -1,26 +1,21 @@ { - "_description": "Resisc45 image classification, contributed by MITRE Corporation", + "_description": "UCF101 video classification from pretrained, contributed by MITRE Corporation", "adhoc": null, "attack": { "knowledge": "white", "kwargs": { - "inner_config": { - "kwargs": { - "batch_size": 1, - "eps": 0.2, - "eps_step": 0.1, - "minimal": false, - "num_random_init": 0, - "targeted": false - }, - "module": "art.attacks.evasion", - "name": "FastGradientMethod" - }, - "method": "iterative_saliency" + "beta_0": 1.0, + "beta_1": 0.5, + "beta_2": 0.5, + "eps_step": 0.02, + "loss_margin": 0.05, + "max_iter": 100, + "start_frame_index": 0, + "targeted": false }, - "module": "armory.art_experimental.attacks.frame", - "name": "get_frame_saliency", - "use_label": false + "module": "art.attacks.evasion.over_the_air_flickering.over_the_air_flickering_pytorch", + "name": "OverTheAirFlickeringPyTorch", + "use_label": true }, "dataset": { "batch_size": 1, @@ -31,15 +26,20 @@ "defense": null, "metric": { "means": true, - "perturbation": "linf", + "perturbation": [ + "l0" + ], "record_metric_per_sample": false, "task": [ - "categorical_accuracy" + "categorical_accuracy", + "top_5_categorical_accuracy" ] }, "model": { "fit": false, - "fit_kwargs": {}, + "fit_kwargs": { + "nb_epochs": 10 + }, "model_kwargs": { "max_frames": 512, "model_status": "ucf101_trained" @@ -55,7 +55,7 @@ "name": "Ucf101" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": "yusong-tan/MARS", "gpus": "all", "output_dir": null, diff --git a/scenario_configs/ucf101_defended_baseline_pretrained.json b/scenario_configs/ucf101_pretrained_frame_saliency_defended.json old mode 100644 new mode 100755 similarity index 92% rename from scenario_configs/ucf101_defended_baseline_pretrained.json rename to scenario_configs/ucf101_pretrained_frame_saliency_defended.json index ab216fb94..f18a4d45b --- a/scenario_configs/ucf101_defended_baseline_pretrained.json +++ b/scenario_configs/ucf101_pretrained_frame_saliency_defended.json @@ -10,8 +10,8 @@ "kwargs": { "batch_size": 1, "eps": 0.015, - "eps_step": 0.005, - "max_iter": 10, + "eps_step": 0.001, + "max_iter": 100, "targeted": false, "verbose": false }, @@ -50,7 +50,7 @@ "l0", "linf" ], - "record_metric_per_sample": true, + "record_metric_per_sample": false, "task": [ "categorical_accuracy", "top_5_categorical_accuracy" @@ -76,7 +76,7 @@ "name": "Ucf101" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": "yusong-tan/MARS", "gpus": "all", "output_dir": null, diff --git a/scenario_configs/ucf101_baseline_pretrained.json b/scenario_configs/ucf101_pretrained_frame_saliency_undefended.json old mode 100644 new mode 100755 similarity index 91% rename from scenario_configs/ucf101_baseline_pretrained.json rename to scenario_configs/ucf101_pretrained_frame_saliency_undefended.json index af517651c..abff3e465 --- a/scenario_configs/ucf101_baseline_pretrained.json +++ b/scenario_configs/ucf101_pretrained_frame_saliency_undefended.json @@ -10,8 +10,8 @@ "kwargs": { "batch_size": 1, "eps": 0.015, - "eps_step": 0.005, - "max_iter": 10, + "eps_step": 0.001, + "max_iter": 100, "targeted": false, "verbose": false }, @@ -38,7 +38,7 @@ "l0", "linf" ], - "record_metric_per_sample": true, + "record_metric_per_sample": false, "task": [ "categorical_accuracy", "top_5_categorical_accuracy" @@ -64,7 +64,7 @@ "name": "Ucf101" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": "yusong-tan/MARS", "gpus": "all", "output_dir": null, diff --git a/scenario_configs/ucf101_pretrained_masked_pgd_defended.json b/scenario_configs/ucf101_pretrained_masked_pgd_defended.json new file mode 100755 index 000000000..9921cac8e --- /dev/null +++ b/scenario_configs/ucf101_pretrained_masked_pgd_defended.json @@ -0,0 +1,83 @@ +{ + "_description": "UCF101 video classification from pretrained, contributed by MITRE Corporation", + "adhoc": null, + "attack": { + "generate_kwargs": { + "patch_ratio": 0.1, + "video_input": true, + "xmin": 0, + "ymin": 0 + }, + "knowledge": "white", + "kwargs": { + "batch_size": 1, + "eps": 1.0, + "eps_step": 0.02, + "max_iter": 100, + "num_random_init": 0, + "random_eps": false, + "targeted": false, + "verbose": false + }, + "module": "armory.art_experimental.attacks.pgd_patch", + "name": "PGDPatch", + "use_label": true + }, + "dataset": { + "batch_size": 1, + "framework": "numpy", + "module": "armory.data.datasets", + "name": "ucf101" + }, + "defense": { + "kwargs": { + "apply_fit": false, + "apply_predict": true, + "channels_first": false, + "constant_rate_factor": 28, + "verbose": false, + "video_format": "avi" + }, + "module": "armory.art_experimental.defences.video_compression_normalized", + "name": "VideoCompressionNormalized", + "type": "Preprocessor" + }, + "metric": { + "means": true, + "perturbation": [ + "l0" + ], + "record_metric_per_sample": false, + "task": [ + "categorical_accuracy", + "top_5_categorical_accuracy" + ] + }, + "model": { + "fit": false, + "fit_kwargs": { + "nb_epochs": 10 + }, + "model_kwargs": { + "max_frames": 512, + "model_status": "ucf101_trained" + }, + "module": "armory.baseline_models.pytorch.ucf101_mars", + "name": "get_art_model", + "weights_file": "mars_ucf101_v1.pth", + "wrapper_kwargs": {} + }, + "scenario": { + "kwargs": {}, + "module": "armory.scenarios.video_ucf101_scenario", + "name": "Ucf101" + }, + "sysconfig": { + "docker_image": "twosixarmory/pytorch:0.13.4", + "external_github_repo": "yusong-tan/MARS", + "gpus": "all", + "output_dir": null, + "output_filename": null, + "use_gpu": false + } +} diff --git a/scenario_configs/ucf101_baseline_pretrained_pgd_patch.json b/scenario_configs/ucf101_pretrained_masked_pgd_undefended.json old mode 100644 new mode 100755 similarity index 91% rename from scenario_configs/ucf101_baseline_pretrained_pgd_patch.json rename to scenario_configs/ucf101_pretrained_masked_pgd_undefended.json index 8efda7990..b1a122caa --- a/scenario_configs/ucf101_baseline_pretrained_pgd_patch.json +++ b/scenario_configs/ucf101_pretrained_masked_pgd_undefended.json @@ -35,7 +35,7 @@ "perturbation": [ "l0" ], - "record_metric_per_sample": true, + "record_metric_per_sample": false, "task": [ "categorical_accuracy", "top_5_categorical_accuracy" @@ -53,9 +53,7 @@ "module": "armory.baseline_models.pytorch.ucf101_mars", "name": "get_art_model", "weights_file": "mars_ucf101_v1.pth", - "wrapper_kwargs": { - "channels_first": false - } + "wrapper_kwargs": {} }, "scenario": { "kwargs": {}, @@ -63,7 +61,7 @@ "name": "Ucf101" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": "yusong-tan/MARS", "gpus": "all", "output_dir": null, diff --git a/scenario_configs/xview_frcnn_defended.json b/scenario_configs/xview_frcnn_masked_pgd_defended.json old mode 100644 new mode 100755 similarity index 82% rename from scenario_configs/xview_frcnn_defended.json rename to scenario_configs/xview_frcnn_masked_pgd_defended.json index 606b9b136..ddd2c9927 --- a/scenario_configs/xview_frcnn_defended.json +++ b/scenario_configs/xview_frcnn_masked_pgd_defended.json @@ -4,24 +4,22 @@ "attack": { "generate_kwargs": { "patch_height": 50, - "patch_width": 50, - "xmin": 0, - "ymin": 0 + "patch_width": 50 }, "knowledge": "white", "kwargs": { "batch_size": 1, "eps": 1.0, - "eps_step": 0.01, - "max_iter": 200, + "eps_step": 0.004, + "max_iter": 500, "num_random_init": 0, "random_eps": false, "targeted": false, - "verbose": true + "verbose": false }, "module": "armory.art_experimental.attacks.pgd_patch", "name": "PGDPatch", - "use_label": false + "use_label": true }, "dataset": { "batch_size": 1, @@ -39,8 +37,8 @@ ], "quality": 50 }, - "module": "armory.art_experimental.defences.jpeg_compression_normalized", - "name": "JpegCompressionNormalized", + "module": "art.defences.preprocessor", + "name": "JpegCompression", "type": "Preprocessor" }, "metric": { @@ -66,7 +64,7 @@ "name": "ObjectDetectionTask" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/xview_frcnn.json b/scenario_configs/xview_frcnn_masked_pgd_undefended.json old mode 100644 new mode 100755 similarity index 87% rename from scenario_configs/xview_frcnn.json rename to scenario_configs/xview_frcnn_masked_pgd_undefended.json index e32ca4122..297dff322 --- a/scenario_configs/xview_frcnn.json +++ b/scenario_configs/xview_frcnn_masked_pgd_undefended.json @@ -4,20 +4,18 @@ "attack": { "generate_kwargs": { "patch_height": 50, - "patch_width": 50, - "xmin": 0, - "ymin": 0 + "patch_width": 50 }, "knowledge": "white", "kwargs": { "batch_size": 1, "eps": 1.0, - "eps_step": 0.01, - "max_iter": 200, + "eps_step": 0.004, + "max_iter": 500, "num_random_init": 0, "random_eps": false, "targeted": false, - "verbose": true + "verbose": false }, "module": "armory.art_experimental.attacks.pgd_patch", "name": "PGDPatch", @@ -53,7 +51,7 @@ "name": "ObjectDetectionTask" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/scenario_configs/xview_frcnn_robust_dpatch_defended.json b/scenario_configs/xview_frcnn_robust_dpatch_defended.json new file mode 100755 index 000000000..ab39f741d --- /dev/null +++ b/scenario_configs/xview_frcnn_robust_dpatch_defended.json @@ -0,0 +1,76 @@ +{ + "_description": "XView object detection, contributed by MITRE Corporation", + "adhoc": null, + "attack": { + "knowledge": "white", + "kwargs": { + "batch_size": 1, + "brightness_range": [ + 0.8, + 1.0 + ], + "learning_rate": 0.01, + "max_iter": 200, + "patch_shape": [ + 50, + 50, + 3 + ], + "sample_size": 10, + "verbose": false + }, + "module": "armory.art_experimental.attacks.robust_dpatch", + "name": "RobustDPatch", + "use_label": false + }, + "dataset": { + "batch_size": 1, + "framework": "numpy", + "module": "armory.data.datasets", + "name": "xview" + }, + "defense": { + "kwargs": { + "apply_fit": false, + "apply_predict": true, + "clip_values": [ + 0.0, + 1.0 + ], + "quality": 50 + }, + "module": "art.defences.preprocessor", + "name": "JpegCompression", + "type": "Preprocessor" + }, + "metric": { + "means": true, + "perturbation": "l0", + "record_metric_per_sample": false, + "task": [ + "object_detection_AP_per_class" + ] + }, + "model": { + "fit": false, + "fit_kwargs": {}, + "model_kwargs": {}, + "module": "armory.baseline_models.pytorch.xview_frcnn", + "name": "get_art_model", + "weights_file": "xview_model_state_dict_epoch_99_loss_0p67", + "wrapper_kwargs": {} + }, + "scenario": { + "kwargs": {}, + "module": "armory.scenarios.object_detection", + "name": "ObjectDetectionTask" + }, + "sysconfig": { + "docker_image": "twosixarmory/pytorch:0.13.4", + "external_github_repo": null, + "gpus": "all", + "output_dir": null, + "output_filename": null, + "use_gpu": false + } +} diff --git a/scenario_configs/xview_frcnn_robust_dpatch_undefended.json b/scenario_configs/xview_frcnn_robust_dpatch_undefended.json new file mode 100755 index 000000000..cfac763e3 --- /dev/null +++ b/scenario_configs/xview_frcnn_robust_dpatch_undefended.json @@ -0,0 +1,63 @@ +{ + "_description": "XView object detection, contributed by MITRE Corporation", + "adhoc": null, + "attack": { + "knowledge": "white", + "kwargs": { + "batch_size": 1, + "brightness_range": [ + 0.8, + 1.0 + ], + "learning_rate": 0.01, + "max_iter": 200, + "patch_shape": [ + 50, + 50, + 3 + ], + "sample_size": 10, + "verbose": false + }, + "module": "armory.art_experimental.attacks.robust_dpatch", + "name": "RobustDPatch", + "use_label": false + }, + "dataset": { + "batch_size": 1, + "framework": "numpy", + "module": "armory.data.datasets", + "name": "xview" + }, + "defense": null, + "metric": { + "means": true, + "perturbation": "l0", + "record_metric_per_sample": false, + "task": [ + "object_detection_AP_per_class" + ] + }, + "model": { + "fit": false, + "fit_kwargs": {}, + "model_kwargs": {}, + "module": "armory.baseline_models.pytorch.xview_frcnn", + "name": "get_art_model", + "weights_file": "xview_model_state_dict_epoch_99_loss_0p67", + "wrapper_kwargs": {} + }, + "scenario": { + "kwargs": {}, + "module": "armory.scenarios.object_detection", + "name": "ObjectDetectionTask" + }, + "sysconfig": { + "docker_image": "twosixarmory/pytorch:0.13.4", + "external_github_repo": null, + "gpus": "all", + "output_dir": null, + "output_filename": null, + "use_gpu": false + } +} diff --git a/scenario_configs/xview_frcnn_targeted.json b/scenario_configs/xview_frcnn_targeted.json index 8aacc5ac3..ea1b91a3f 100644 --- a/scenario_configs/xview_frcnn_targeted.json +++ b/scenario_configs/xview_frcnn_targeted.json @@ -60,7 +60,7 @@ "name": "ObjectDetectionTask" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/tests/scenarios/broken/invalid_dataset_framework.json b/tests/scenarios/broken/invalid_dataset_framework.json index a40855dc3..8d2ba578e 100644 --- a/tests/scenarios/broken/invalid_dataset_framework.json +++ b/tests/scenarios/broken/invalid_dataset_framework.json @@ -46,7 +46,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/tests/scenarios/broken/invalid_module.json b/tests/scenarios/broken/invalid_module.json index 903cec48b..d9d968418 100644 --- a/tests/scenarios/broken/invalid_module.json +++ b/tests/scenarios/broken/invalid_module.json @@ -39,7 +39,7 @@ "name": "fgm_attack" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "", "output_dir": null, diff --git a/tests/scenarios/broken/missing_scenario.json b/tests/scenarios/broken/missing_scenario.json index d3f7c57f6..72413876d 100644 --- a/tests/scenarios/broken/missing_scenario.json +++ b/tests/scenarios/broken/missing_scenario.json @@ -40,7 +40,7 @@ "wrapper_kwargs": {} }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/tests/scenarios/pytorch/image_classification.json b/tests/scenarios/pytorch/image_classification.json index 8d895887b..c93b1cf9a 100644 --- a/tests/scenarios/pytorch/image_classification.json +++ b/tests/scenarios/pytorch/image_classification.json @@ -46,7 +46,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/tests/scenarios/pytorch/image_classification_pretrained.json b/tests/scenarios/pytorch/image_classification_pretrained.json index 835940779..144280e13 100644 --- a/tests/scenarios/pytorch/image_classification_pretrained.json +++ b/tests/scenarios/pytorch/image_classification_pretrained.json @@ -44,7 +44,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/pytorch:0.13.3", + "docker_image": "twosixarmory/pytorch:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/tests/scenarios/tf1/image_classification.json b/tests/scenarios/tf1/image_classification.json index 380922fcf..de84cb0a0 100644 --- a/tests/scenarios/tf1/image_classification.json +++ b/tests/scenarios/tf1/image_classification.json @@ -46,7 +46,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/tests/scenarios/tf1/image_classification_pretrained.json b/tests/scenarios/tf1/image_classification_pretrained.json index 9136fca91..e9432cd95 100644 --- a/tests/scenarios/tf1/image_classification_pretrained.json +++ b/tests/scenarios/tf1/image_classification_pretrained.json @@ -44,7 +44,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null, diff --git a/tests/scenarios/tf1/image_classification_tfgraph.json b/tests/scenarios/tf1/image_classification_tfgraph.json index 95a5aa6a4..67eaa87ac 100644 --- a/tests/scenarios/tf1/image_classification_tfgraph.json +++ b/tests/scenarios/tf1/image_classification_tfgraph.json @@ -46,7 +46,7 @@ "name": "ImageClassificationTask" }, "sysconfig": { - "docker_image": "twosixarmory/tf1:0.13.3", + "docker_image": "twosixarmory/tf1:0.13.4", "external_github_repo": null, "gpus": "all", "output_dir": null,