diff --git a/docs/dataset_licensing.md b/docs/dataset_licensing.md deleted file mode 100644 index 904f3f183..000000000 --- a/docs/dataset_licensing.md +++ /dev/null @@ -1,158 +0,0 @@ -## Dataset Licensing - -Armory datasets are either licensed or available in accordance to the fair use -exception to copyright infringement. The passthrough license is the same as the original -license for nonadapted datasets. Adapted datasets ("derivative works") are licensed under -the Creative Commons 4.0 International ShareAlike license and are Copyright Two Six Labs, 2020. - -## Original Licenses - -| Dataset | Original license | -|:-:|:-:| -| MNIST | [Creative Commons Attribution-Share Alike 3.0](http://www.pymvpa.org/datadb/mnist.html) | -| CIFAR-10 | [MIT](https://peltarion.com/knowledge-center/documentation/terms/dataset-licenses/cifar-10)| -| Digit | [Creative Commons Attribution-ShareAlike 4.0 International](https://github.com/Jakobovski/free-spoken-digit-dataset) | -| Librispeech | [Creative Commons 4.0](http://www.openslr.org/12/) | -| GTSRB | [CC0 Public Domain](https://www.kaggle.com/meowmeowmeowmeowmeow/gtsrb-german-traffic-sign)| -| Imagenette | [Apache 2.0](https://github.com/fastai/imagenette/blob/master/LICENSE) | -| UCF101 | Fair use exception | -| RESISC45 | Fair use exception | (http://xviewdataset.org/) -| xView | [Creative Commons Attribution-Noncommercial-ShareAlike 4.0 International](https://arxiv.org/pdf/1802.07856) | -| so2sat | [Creative Commons 4.0](https://mediatum.ub.tum.de/1454690) | -| APRICOT | [Apache License Version 2.0](https://apricot.mitre.org/) | -| DAPRICOT | Creative Commons 4.0 | -| CARLA | MIT | -| Speech Commands | [Creative Commons BY 4.0](https://ai.googleblog.com/2017/08/launching-speech-commands-dataset.html) - -## Attributions - -Note: attribution material can be removed upon request to the extent reasonably -practicable. Please direct inquiries to . - -### MNIST -|Attribution | | -|------------------------------|--------------| -| Creator/author name | Yann LeCun and Corinna Cortes | -| Copyright notice | Copyright © 1998 by Yann LeCun and Corinna Cortes | -| Public license notice | http://www.pymvpa.org/datadb/mnist.html | -| Disclaimer notice | UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. | -| Dataset link | http://yann.lecun.com/exdb/mnist/ | -| Modification | (Slight) Representation of images as binary tensors | -| Citation | LeCun, Yann, Corinna Cortes, and Christopher JC Burges. "The MNIST database of handwritten digits, 1998." URL http://yann.lecun.com/exdb/mnist 10, no. 34 (1998): 14. | - -### CIFAR-10 -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Alex Krizhevsky, Vinod Nair, and Geoffrey Hinton | -| Copyright notice | Copyright © 2013 by Valay Shah | -| Public license notice | https://peltarion.com/knowledge-center/documentation/terms/dataset-licenses/cifar-10 | -| License text (including disclaimer)| Copyright (c) 2013 Valay Shah. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The foregoing copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.| -| Dataset link | https://www.cs.toronto.edu/~kriz/cifar.html | -| Citation | Krizhevsky, Alex. "Learning Multiple Layers of Features from Tiny Images." URL https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf, (2009). | -| Modification | (Slight) Representation of images as binary tensors | - -### Free Spoken Digit Dataset (FSDD) -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Zohar Jackson, César Souza, Jason Flaks, Yuxin Pan, Hereman Nicolas, and Adhish Thite| -| Copyright notice | Copyright © 2018 by Zohar Jackson, César Souza, Jason Flaks, Yuxin Pan, Hereman Nicolas, and Adhish Thite | -| Public license notice | https://github.com/Jakobovski/free-spoken-digit-dataset | -| Disclaimer notice | a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. | -| Dataset link | https://github.com/Jakobovski/free-spoken-digit-dataset | -| Citation | Jackson, Zohar, César Souza, Jason Flaks, Yuxin Pan, Hereman Nicolas, and Adhish Thite. "Jakobovski/free-spoken-digit-dataset: v1.0.8 (Version v1.0.8)." Zenodo (2018). URL http://doi.org/10.5281/zenodo.134240 | -| Modification | (Slight) Representation of audio wav file as one-dimensional binary tensors | - -### Librispeech -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Vassil Panayotov, Guoguo Chen, Daniel Povey and Sanjeev Khudanpur | -| Copyright notice | Copyright © 2014 by Vassil Panayotov | -| Public license notice | http://www.openslr.org/12/ | -| Disclaimer notice | a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. | -| Dataset link | http://www.openslr.org/12/ | -| Citation | Panayotov, Vassil, Guoguo Chen, Daniel Povey, and Sanjeev Khudanpur. "Librispeech: an ASR corpus based on public domain audio books." In 2015 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), pp. 5206-5210. IEEE, 2015. | -| Modification | (Derivative work) Creation of adversarial dataset that modifies the original audio with small perturbations that are crafted to fool machine learning models. | - -### GTSRB -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Johannes Stallkamp, Marc Schlipsing, Jan Salmen, and Christian Igel | -| Copyright notice | N/A (public domain) | -| Public license notice | https://www.kaggle.com/meowmeowmeowmeowmeow/gtsrb-german-traffic-sign | -| Disclaimer notice | Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. | -| Dataset link | http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset | -| Citation | Stallkamp, Johannes, Marc Schlipsing, Jan Salmen, and Christian Igel. "Man vs. computer: Benchmarking machine learning algorithms for traffic sign recognition." Neural Networks, URL http://www.sciencedirect.com/science/article/pii/S0893608012000457, (2012)| -| Modification | (Derivative work) Creation of adversarial dataset that modifies the original images with small perturbations that are crafted to fool machine learning models. | - -### Imagenette -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Jeremy Howard | -| Copyright notice | Copyright © 2019 by Jeremy Howard | -| Public license notice | https://github.com/fastai/imagenette | -| Disclaimer notice | Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. | -| Dataset link | https://github.com/fastai/imagenette | -| Modification | (Slight) Representation of images as binary tensors | - -### xView -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Defense Innovation Unit Experimental (DIUx) and the National Geospatial-Intelligence Agency (NGA) | -| Copyright notice | None found | -| Public license notice | http://xviewdataset.org/terms.html | -| Disclaimer notice | Disclaimer of Warranties and Limitation of Liability. a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. | -| Dataset link | http://xviewdataset.org/#dataset | -| Modification | (Slight) Representation of images as binary tensors | - -### so2sat -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Xiaoxiang Zhu, Jingliang Hu, Chunping Qiu, Yilei Shi, Jian Kang, Lichao Mou, Hossein Bagheri, Matthias Haeberle, Yuansheng Hua, Rong Huang, Lloyd Hughes, Hao Li, Yao Sun, Guichen Zhang, Shiyao Han, Michael Schmitt, and Yuanyuan Wang | -| Copyright notice | None found | -| Public license notice | https://mediatum.ub.tum.de/1454690 | -| Disclaimer notice | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. | -| Dataset link | https://mediatum.ub.tum.de/1454690 | -| Modification | (Slight) Representation of images as binary tensors | - -### APRICOT -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | A. Braunegg, Amartya Chakraborty, Michael Krumdick, Nicole Lape, Sara Leary, Keith Manville, Elizabeth Merkhofer, Laura Strickhart, and Matthew Walmer | -| Copyright notice | Copyright 2020 APRICOT - MITRE Corporation | -| Public license notice | https://apricot.mitre.org/ | -| Disclaimer notice | Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. | -| Dataset link | https://apricot.mitre.org/ | -| Modification | (Slight) Representation of images as binary tensors | - -## Fair use notes for RESISC-45 and UCF101 -* Two Six Labs does not charge users for access to the Armory repository, -nor the datasets therein, nor does it derive a profit directly from use of the -datasets. -* Two Six Labs is not merely republishing the original datasets. The -datasets have undergone transformative changes, specifically they have been -repackaged to be integrated with Tensorflow Datasets. This repackaging -includes, but is not limited to, processing images from compressed formats into -binary tensors as well as decoding audio and video files. Further, Two Six Labs -has published derived adversarial datasets that modify the original images/videos with -small perturbations that are crafted to fool machine learning models for both -the RESISC-45 and UCF101 datasets. -* Two Six Labs uses these datasets within Armory, however there are -other additional datasets present, as well as multiple other features present -in Armory beyond providing datasets. -* Two Six Labs attempted to contact the authors of RESISC-45, but received no -response. -* UCF101 direct download functionality has been used by other machine learning -frameworks, such as TensorFlow: https://www.tensorflow.org/datasets/catalog/ucf101 -* Two Six Labs provides public benefit through the public distribution -of the Armory framework to evaluate machine learning models. This material is -based upon work supported by the Defense Advanced Research Projects Agency -(DARPA) under Contract No. HR001120C0114. Any opinions, findings and -conclusions or recommendations expressed in this material are those of the -author(s) and do not necessarily reflect the views of the Defense Advanced -Research Projects Agency (DARPA). - -### Citations for RESISC45 and UCF101 - -Cheng, Gong, Junwei Han, and Xiaoqiang Lu. "Remote sensing image scene classification: Benchmark and state of the art." Proceedings of the IEEE 105, no. 10 (2017): 1865-1883. - -Soomro, Khurram, Amir Roshan Zamir, and Mubarak Shah. "UCF101: A dataset of 101 human actions classes from videos in the wild." arXiv preprint arXiv:1212.0402 (2012). diff --git a/docs/original/CONTRIBUTING.md b/docs/original/CONTRIBUTING.md deleted file mode 100644 index e88c3e752..000000000 --- a/docs/original/CONTRIBUTING.md +++ /dev/null @@ -1,91 +0,0 @@ -Contributing to Armory -====================== -Contributions to Armory are welcomed and highly encouraged! Armory contains a complex suite of tools that both configure the execution -environment and compose a set of objects (from an `experiment` file) to be executed in said environment. - -Primarily, Armory has two main modes of operation: - - Native (also known as `--no-docker`) mode - This uses a pre-set python environment to execute the configuration file. - - Docker - This uses docker to compose and launch docker images, and executes the armory experiments - within the container. - -For more details, including how to set up your development environment for either mode of operation see: [Setting up Development Environment](#Setting-up-the-Development-Environment) - -Armory Development follows the [GitHub Standard Fork & Pull Request Workflow](https://gist.github.com/Chaser324/ce0505fbed06b947d962). - -Armory uses GitHub Actions to test contributions, for more details see [Armory CI](/.github/ci_test.yml). Generally it will be most -useful to set up the [Armory pre-commit hooks](/tools/pre-commit.sh). For more information see the [Armory Style Guide](/docs/style.md). - -## Setting up the Development Environment -Armory follows the [GitHub Standard Fork & Pull Request Workflow](https://gist.github.com/Chaser324/ce0505fbed06b947d962) and therefore, to -get started with contributing to armory, you will first need to head over to [https://github.com/twosixlabs/armory](https://github.com/twosixlabs/armory) -and fork the repo. Once forked, clone that fork to your computer and cd into the forked repo location (herein refered to as `YOUR_ARMORY_REPO`). - -From here, you will need to setup your python virtual environment and, depending on your use case, other applications such as Docker. The following -section will describe the details here in a bit more detail. - -### Native Operation Mode -Armory can run natively within a python virtual environment on a `host` machine. To get setup you will need to -create a [virtual environment](https://docs.python.org/3/library/venv.html). Once created and activated, you will need -to install some additional requirements. Typically, it is useful to use the `-e` flag with the `armory` pip so that it -will point to your local directory, therefore utilizing code edits without requiring follow-on installs. To accomplish -this run: -```bash -cd YOUR_ARMORY_REPO -pip install -e .[developer] -``` -Now that you have the environment setup, kickoff the baseline tests to make sure its all good: -```bash -pytest -s tests/test_host -``` -depending on you `$PATH`, pytest might refer to a pytest outside your virtualenv, which can cause issues. As -an alternative you can use (make sure your virtualenv is active): -```bash -python -m pytest -s tests/test_host -``` - -If this is successful you are off to the races! If you would like to run armory in `--no-docker` mode, see: -[Armory No Docker Setup](/docs/no_docker_mode.md). - -### Docker Operation Mode -Armory can utilize [docker](https://www.docker.com/) to launch containers for execution of armory experiments. -For information on how to install docker on your machine see: [Docker Installation](https://docs.docker.com/get-docker/). - -Once docker is installed, armory downloads and launches containers based on the `__version__` string found in `armory.__init__`. - -Note: only release versions of armory will be published to [Dockerhub](https://hub.docker.com/), therefore, -development branch images much be built locally using: -```bash -cd YOUR_ARMORY_REPO -bash docker/build.sh dev -``` - -## Style Guide -Armory enforces code / file styling using [Flake8](https://flake8.pycqa.org/), [black](https://github.com/psf/black), -[yamllint](https://yamllint.readthedocs.io/en/stable/), etc. For more information about -how we configure these tools, see [Armory Style Guide](/docs/style.md). - -## Pull Requests - -We gladly welcome [pull requests]( -https://help.github.com/articles/about-pull-requests/). - -If you've never done a pull request before we recommend you read -[this guide](http://blog.davidecoppola.com/2016/11/howto-contribute-to-open-source-project-on-github/) -to get you started. - -Before making any changes, we recommend opening an issue (if it -doesn't already exist) and discussing your proposed changes. This will -let us give you advice on the proposed changes. If the changes are -minor, then feel free to make them without discussion. - -## Test Cases -When adding new features please add test cases to ensure their correctness. We use -pytest as our test runner. - -For running `pytest`, users should follow `.github/workflows/ci_test.yml`. -This has tests for docker and native modes as well as formatting. - -## Documentation -When adding new functionality or modifying existing functionality, please update documentation. -Docs are all markdown (`.md`) files located in [docs](/docs/) directory or its subdirectories. -If doc files are added or removed, please also update the [markdown yaml](/mkdocs.yml) diff --git a/docs/original/adversarial_datasets.md b/docs/original/adversarial_datasets.md deleted file mode 100644 index 88a4d848c..000000000 --- a/docs/original/adversarial_datasets.md +++ /dev/null @@ -1,143 +0,0 @@ -# Adversarial Datasets - -The `armory.data.adversarial_datasets` module implements functionality to return adversarial datasets of -various data modalities. By default, this is a NumPy `ArmoryDataGenerator` which -implements the methods needed by the ART framework. - -There are two kinds of adversarial datasets in Armory: *preloaded* as well as *green-screen*. Preloaded datasets contain -examples with universal adversarial perturbations. For preloaded adversarial datasets, `get_batch()` returns -a tuple of `((data_clean, data_adversarial), label_clean)` for a specified batch size in numpy format, -where `data_clean` and `label_clean` represent a clean example and its true label, and `data_adversarial` -represents the corresponding adversarially attacked example. The lone exception is the APRICOT dataset, which is preloaded -but returns a tuple of `(data_adversarial, label_adversarial)` as the images don't have benign counterparts. - -The green-screen adversarial datasets in Armory are DAPRICOT and CARLA. Each image in these datasets contains a -green-screen, for which adversarial patches generated during an attack are inserted onto. For these datasets -`get_batch()` returns a tuple of `(data_adversarial, (objects_label, green_screen_label))`. - - - -Currently, datasets are loaded using TensorFlow Datasets from cached tfrecord files. -If the files are not already present locally in your `dataset_dir` directory, Armory will download them -from Two Six's public S3 dataset repository. - - - -### Green-screen Image and Video Datasets -| `name` | `split` | Description | Source Split | x_shape | x_type | y_shape | Size | -|:----------------------------------:|:--------------------------------------------:|:-----------------------------------------:|:------------:|:-----------------------------------:|:------:|:-------:|:-----------------------------------:| -| "dapricot_dev_adversarial" | ["small", medium", "large", "adversarial"] * | Physical Adversarial Attacks on Object Detection| dev | (nb, 3, 1008, 756, 3) | uint8 | 2-tuple | 81 examples (3 images per example) | -| "dapricot_test_adversarial" | ["small", medium", "large", "adversarial"] * | Physical Adversarial Attacks on Object Detection| test | (nb, 3, 1008, 756, 3) | uint8 | 2-tuple | 324 examples (3 images per example) | -| "carla_obj_det_dev" | ["dev"] | [CARLA Simulator Object Detection](https://carla.org) | dev | (nb=1, 960, 1280, 3 or 6) | uint8 | 2-tuple | 31 images | -| "carla_obj_det_test" | ["test"] | [CARLA Simulator Object Detection](https://carla.org) | test | (nb=1, 960, 1280, 3 or 6) | uint8 | 2-tuple | 30 images | -| "carla_over_obj_det_dev" | ["dev"] | [CARLA Simulator Object Detection](https://carla.org) | dev | (nb=1, 960, 1280, 3 or 6) | uint8 | 2-tuple | 20 images | -| "carla_over_obj_det_test" | ["test"] | [CARLA Simulator Object Detection](https://carla.org) | test | (nb=1, 960, 1280, 3 or 6) |uint8 | 2-tuple | 15 images | -| "carla_video_tracking_dev" | ["dev"] | [CARLA Simulator Video Tracking](https://carla.org) | dev | (nb=1, num_frames, 960, 1280, 3) | uint8 | 2-tuple | 20 videos | -| "carla_video_tracking_test" | ["test"] | [CARLA Simulator Video Tracking](https://carla.org) | test | (nb=1, num_frames, 960, 1280, 3) | uint8 | 2-tuple | 20 videos | -| "carla_multi_object_tracking_dev" | ["dev"] | [CARLA Simulator Multi-object Video Tracking](https://carla.org) | dev | (nb=1, num_frames, 960, 1280, 3) | uint8 | 2-tuple | 20 videos | -| "carla_multi_object_tracking_test" | ["test"] | [CARLA Simulator Multi-object Video Tracking](https://carla.org) | test | (nb=1, num_frames, 960, 1280, 3) | uint8 | 2-tuple | 10 videos | - -\* the "small" split, for example, is the subset of images containing small patch green-screens. Using the "adversarial" split returns the entire dataset. - -##### CARLA Multi-Object Tracking -The ground truth annotation for CARLA multi-object tracking is a 2D NDArray where each row represents a detection with format: ` `. By nature of this dataset, there may be multiple objects present at each timestep; therefore, each object is assigned an ID so that all annotations corresponding to a given object can be identified. -- `timestep`: The timestep indicates which frame this annotation belongs to; indexing begins at 1. -- `object id`: An id referring to the unique object in the frame that this annotation describes. -- `bbox top left x`: The top left x coordinate of the bounding box of this object. -- `bbox top left y`: The top left y coordinate of the bounding box of this object. -- `bbox width`: The width of the bounding box of this object in pixels. -- `bbox height`: The height of the bounding box of this object in pixels. -- `confidence score`: 1 for ground truth objects; models may output values between 0 and 1 to describe the confidence of their predictions. -- `class id`: The class label of this object. -- `visibility`: 1 for all annotations in this dataset. An object that is not visible will not have an annotation for that timestep. - - -##### D-APRICOT -The D-APRICOT dataset does NOT contain labels/bounding boxes for COCO objects, which may occasionally appear in the -background (e.g. car). Each image contains one green screen intended for patch insertion. The green screen shapes vary -between diamond, rectangle, and octagon. A dataset example consists of three images, each of a different camera - angle of the same scene and green screen. The intended threat model is a targeted attack where the inserted patch -is meant to induce the model to predict a specific class at the location of the patch. - - -##### CARLA Object Detection -The carla_obj_det_dev and carla_obj_det_test datasets contain rgb and depth modalities. The modality defaults to `"rgb"` and must be one of `["rgb", "depth", "both"]`. -When using the dataset function imported from [armory.data.adversarial_datasets](../armory/data/adversarial_datasets.py), this value is passed via the `modality` kwarg. When running an Armory scenario, the value is specified in the dataset_config as such: -```json - "dataset": { - "batch_size": 1, - "modality": "rgb", -} -``` -When `modality` is set to `"both"`, the input will be of shape `(nb=1, num_frames, 960, 1280, 6)` where `x[..., :3]` are -the rgb channels and `x[..., 3:]` the depth channels. The depth information is encoded on a log scale in grayscale format (all three depth channels are the same). - -The carla_over_obj_det_dev dataset has the same properties as the above mentioned datasets but is collected utilizing overhead perspectives. In addition, the depth channels are encoded with an [RGB encoding](https://carla.readthedocs.io/en/latest/ref_sensors/#depth-camera). This depth format can be converted to linear grayscale or log grayscale (e.g. for human viewing) using the utility functions in [carla_obj_det_utils.py](../armory/art_experimental/attacks/carla_obj_det_utils.py) - -### Usage of Preloaded Adversarial Datasets -To use a preloaded adversarial dataset for evaluation, set `attack_config["type"]` to `"preloaded"` and specify -the desired values for the `name` and `adversarial_key` keywords in the `attack` module of a scenario configuration. -Valid values for each keyword are given in the table below. - -Example attack module for image classification scenario: -```json -"attack": { - "knowledge": "white", - "kwargs": { - "adversarial_key": "adversarial_univpatch", - "batch_size": 1, - "description": "'adversarial_key' can be 'adversarial_univperturbation' or 'adversarial_univpatch'" - }, - "module": "armory.data.adversarial_datasets", - "name": "resisc45_adversarial_224x224", - "type": "preloaded" -} -``` - -### Preloaded Image Datasets -| `name` | `adversarial_key` | Description | Attack | Source Split | x_shape | x_type | y_shape | y_type | Size | -|:------------------------------:|:------------------------------:|:-----------------------------------------:|:----------------------------------:|:------------:|:----------------:|:------:|:-------:|:------:|:--------------:| -| "imagenet_adversarial" | "adversarial" | ILSVRC12 adversarial image dataset for ResNet50 | Targeted, universal perturbation | test | (nb, 224, 224, 3) |uint8 | (N,) | int64 | 1000 images | -| "resisc45_adversarial_224x224" | "adversarial_univpatch" | REmote Sensing Image Scene Classification | Targeted, universal patch | test | (nb, 224, 224, 3) | uint8 | (N,) | int64 | 5 images/class | -| "resisc45_adversarial_224x224" | "adversarial_univperturbation" | REmote Sensing Image Scene Classification | Untargeted, universal perturbation | test | (nb, 224, 224, 3) | uint8 | (N,) | int64 | 5 images/class | -| "apricot_dev_adversarial" | ["adversarial", frcnn", "ssd", "retinanet"] | [Physical Adversarial Attacks on Object Detection](https://arxiv.org/abs/1912.08166)| Targeted, universal patch | dev | (nb, variable_height, variable_width, 3) | uint8 | n/a | dict | 138 images | -| "apricot_test_adversarial" | ["adversarial", frcnn", "ssd", "retinanet"] | [Physical Adversarial Attacks on Object Detection](https://arxiv.org/abs/1912.08166)| Targeted, universal patch | test | (nb, variable_height, variable_width, 3) | uint8 | n/a | dict | 873 images | - -##### APRICOT -Note: the APRICOT dataset contains splits for ["frcnn", "ssd", "retinanet"] rather than adversarial keys. See example below. -The APRICOT dataset contains labels and bounding boxes for both COCO objects and physical adversarial patches. -The label used to signify the patch is the `ADV_PATCH_MAGIC_NUMBER_LABEL_ID` defined in -[armory/data/adversarial_datasets.py](../armory/data/adversarial_datasets.py). Each image contains one adversarial -patch and a varying number of COCO objects (in some cases zero). COCO object class labels are one-indexed (start from 1) -in Armory <= 0.13.1 and zero-indexed in Armory > 0.13.1. - -```json -"attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "split": "frcnn" - }, - "module": "armory.data.adversarial_datasets", - "name": "apricot_dev_adversarial", - "type": "preloaded", -``` - - -### Preloaded Audio Datasets -| `name` | `adversarial_key` | Description | Attack | Source Split | x_shape | x_type | y_shape | y_type | sampling_rate | Size | -|:-------------------------:|:-----------------:|:--------------------------------------------------:|:----------------------------------:|:------------:|:---------:|:------:|:-------:|:------:|:-------------:|:--------------:| -| "librispeech_adversarial" | "adversarial_perturbation | Librispeech dev dataset for speaker identification | Targeted, universal perturbation | test | (N, variable_length) | int64 | (N,) | int64 | 16 kHz | ~5 sec/speaker | -| "librispeech_adversarial" | "adversarial_univperturbation" | Librispeech dev dataset for speaker identification | Untargeted, universal perturbation | test | (N, variable_length) | int64 | (N,) | int64 | 16 kHz | ~5 sec/speaker | - -### Preloaded Video Datasets -| `name` | `adversarial_key` | Description | Attack | Source Split | x_shape | x_type | y_shape | y_type | Size | -|:----------------------------:|:--------------------------:|:--------------------------:|:----------------------------------:|:------------:|:---------------------------------:|:------:|:-------:|:------:|:--------------:| -| "ucf101_adversarial_112x112" | "adversarial_patch" | UCF 101 Action Recognition | Untargeted, universal perturbation | test | (N, variable_frames, 112, 112, 3) | uint8 | (N,) | int64 | 5 videos/class | -| "ucf101_adversarial_112x112" | "adversarial_perturbation" | UCF 101 Action Recognition | Untargeted, universal perturbation | test | (N, variable_frames, 112, 112, 3) | uint8 | (N,) | int64 | 5 videos/class | - -### Preloaded Poison Datasets -| `name` | `split_type` | Description | Attack | Source Split | x_shape | x_type | y_shape | y_type | Size | -|:------------------------------:|:------------------------------:|:-----------------------------------------:|:----------------------------------:|:------------:|:----------------:|:------:|:-------:|:------:|:--------------:| -| "gtsrb_poison" | poison | German Traffic Sign Poison Dataset | Data poisoning | train | (N, 48, 48, 3) | float32 | (N,) | int64 | 2220 images | -| "gtsrb_poison" | poison_test | German Traffic Sign Poison Dataset | Data poisoning | test | (N, 48, 48, 3) | float32 | (N,) | int64 | 750 images | diff --git a/docs/original/assets/charmory.png b/docs/original/assets/charmory.png deleted file mode 100644 index 7e5f8feba..000000000 Binary files a/docs/original/assets/charmory.png and /dev/null differ diff --git a/docs/original/assets/logo.png b/docs/original/assets/logo.png deleted file mode 100644 index 5ffeb901b..000000000 Binary files a/docs/original/assets/logo.png and /dev/null differ diff --git a/docs/original/baseline_models.md b/docs/original/baseline_models.md deleted file mode 100644 index 4fde37b87..000000000 --- a/docs/original/baseline_models.md +++ /dev/null @@ -1,62 +0,0 @@ -# Baseline Models -Armory has several baseline models available for use in evaluations. All of these -models return an ART wrapped classifier for use with ART attacks and defenses. - - -### Pretrained Weights -Pretrained weights can be loaded in to the baseline models or custom models. This is -achieved by specifying the name in the `weights_file` field of a model's config. - -When the model is loaded it will first try to load the file from the armory -`saved_model_dir`. This enables you to place your own custom weights in that directory -for loading. If the weights file is not found it'll then try to download the file from -our S3 bucket. Files that are available in the armory S3 bucket are listed in the table -below. - -If the `weights_file` is not found locally or in the S3 bucket an error will be -returned. - - -### Keras -The model files can be found in [armory/baseline_models/keras](../armory/baseline_models/keras). - -| Model | S3 weight_files | -|:----------: | :-----------: | -| Cifar10 CNN | | -| Densenet121 CNN | `densenet121_resisc45_v1.h5` , `densenet121_imagenet_v1.h5` | -| Inception_ResNet_v2 CNN | `inceptionresnetv2_imagenet_v1.h5` | -| Micronnet CNN | | -| MNIST CNN | `undefended_mnist_5epochs.h5` | -| ResNet50 CNN | `resnet50_imagenet_v1.h5` | -| so2sat CNN | `multimodal_baseline_weights.h5` | - - -### PyTorch -The model files can be found in [armory/baseline_models/pytorch](../armory/baseline_models/pytorch) - -| Model | S3 weight_files | -|:----------: |:---------------------------------------------:| -| Cifar10 CNN | | -| DeepSpeech 2 | | -| Sincnet CNN | `sincnet_librispeech_v1.pth` | -| MARS | `mars_ucf101_v1.pth` , `mars_kinetics_v1.pth` | -| ResNet50 CNN | `resnet50_imagenet_v1.pth` | -| MNIST CNN | `undefended_mnist_5epochs.pth` | -| xView Faster-RCNN | `xview_model_state_dict_epoch_99_loss_0p67` | -| CARLA Faster-RCNN (rgb)| `carla_rgb_weights_eval5.pt` | -| CARLA Faster-RCNN (depth)| `carla_depth_weights_eval5.pt` | -| CARLA Faster-RCNN (multimodal)| `carla_multimodal_naive_weights.pt` | -| CARLA GoTurn| `pytorch_goturn.pth.tar` | - -### TensorFlow 1 -The model file can be found in [armory/baseline_models/tf_graph](../armory/baseline_models/tf_graph). -The weights for this model are downloaded from the link listed below. - -| Model | TF Weights URL | -|:----------: | :-----------: | -| MSCOCO Faster-RCNN | http://download.tensorflow.org/models/object_detection/faster_rcnn_resnet50_coco_2018_01_28.tar.gz | - - -### Preprocessing Functions -Preprocessing functions have been moved inside each model's forward pass. This is to allow each -model to receive as input the canonicalized form of a dataset. \ No newline at end of file diff --git a/docs/original/baseline_results/apricot_results.md b/docs/original/baseline_results/apricot_results.md deleted file mode 100644 index 412e817a9..000000000 --- a/docs/original/baseline_results/apricot_results.md +++ /dev/null @@ -1,12 +0,0 @@ -# APRICOT Object Detection Baseline Evaluation (Updated December 2020) - -* **Baseline Model Performance: (results obtained using Armory v0.13)** - * Baseline MSCOCO Objects mAP: 8.76% (all test examples) - * Baseline Targeted Patch mAP: 5.70% (all test examples) -* **Baseline Defense Performance: (results obtained using Armory v0.13)** -Baseline defense is art_experimental.defences.jpeg_compression_normalized(clip_values=(0.0, 1.0), quality=10, -channel_index=3, apply_fit=False, apply_predict=True).\ -Baseline defense performance is evaluated for a transfer attack. - * Baseline MSCOCO Objects mAP: 7.83% (all test examples) - * Baseline Targeted Patch mAP: 4.59% (all test examples) - diff --git a/docs/original/baseline_results/carla_mot_results.md b/docs/original/baseline_results/carla_mot_results.md deleted file mode 100644 index 2cc5bf849..000000000 --- a/docs/original/baseline_results/carla_mot_results.md +++ /dev/null @@ -1,17 +0,0 @@ -# CARLA MOT Baseline Evaluations - -This is the baseline evaluation for the multi-object tracking scenario. For single-object tracking, see [carla_video_tracking_results.md](../baseline_results/carla_video_tracking_results.md). - -For [dev data](https://github.com/twosixlabs/armory/blob/master/armory/data/adversarial/carla_mot_dev.py), results obtained using Armory v0.16.1. - - -| Data | Defended | Attack | Attack Parameters | Benign DetA / AssA / HOTA | Adversarial DetA / AssA / HOTA | Test Size | -|------|----------|-------------------|--------------------------------|---------------------------|--------------------------------|-----------| -| Dev | no | Adversarial Patch | step_size=0.02, max_iter=100 | 0.49 / 0.62 / 0.55 | 0.14 / 0.57 / 0.29 | 20 | -| Dev | no | Robust DPatch | step_size=0.002, max_iter=1000 | 0.49 / 0.62 / 0.55 | 0.37 / 0.60 / 0.47 | 20 | -| Dev | yes | Robust DPatch | step_size=0.002, max_iter=1000 | 0.34 / 0.52 / 0.42 | 0.24 / 0.50 / 0.34 | 20 | - -Defended results not available for Adversarial Patch attack because JPEG Compression defense is not implemented in PyTorch and so is not fully differentiable. -Note that Robust DPatch is considerably slower than Adversarial Patch. - -Find reference baseline configurations [here](https://github.com/twosixlabs/armory/tree/master/scenario_configs/eval6/carla_mot) \ No newline at end of file diff --git a/docs/original/baseline_results/carla_od_results.md b/docs/original/baseline_results/carla_od_results.md deleted file mode 100644 index f43070e70..000000000 --- a/docs/original/baseline_results/carla_od_results.md +++ /dev/null @@ -1,57 +0,0 @@ -# CARLA Object Detection Baseline Evaluations - -## CARLA Street Level OD Dataset -(For [dev data](https://github.com/twosixlabs/armory/blob/v0.15.2/armory/data/adversarial/carla_obj_det_dev.py), results are obtained using Armory v0.15.2; for [test data](https://github.com/twosixlabs/armory/blob/v0.15.4/armory/data/adversarial/carla_obj_det_test.py), results are obtained using Armory v0.15.4)** - -Single Modality (RGB) Object Detection - -| Data | Attack | Attack Parameters | Benign mAP | Benign Disappearance Rate | Benign Hallucination per Image | Benign Misclassification Rate | Benign True Positive Rate | Adversarial mAP | Adversarial Disappearance Rate | Adversarial Hallucination per Image | Adversarial Misclassification Rate | Adversarial True Positive Rate | Test Size | -|------|-------------------|------------------------------------|-------------|-----------------------------|----------------------------------|---------------------------------|-----------------------------|------------------|----------------------------------|--------------------------------------|-------------------------------------|---------------------------------|-----------| -| Dev | Robust DPatch | learning_rate=0.002, max_iter=2000 | 0.76/0.72 | 0.19/0.22 | 3.97/3.48 | 0.06/0.06 | 0.75/0.71 | 0.68/0.66 | 0.27/0.28 | 4.48/3.65 | 0.06/0.07 | 0.67/0.65 | 31 | -| Dev | Adversarial Patch | learning_rate=0.003, max_iter=1000 | 0.76/0.72 | 0.19/0.22 | 3.97/3.48 | 0.06/0.06 | 0.75/0.71 | 0.54/* | 0.32/* | 22.16/* | 0.05/* | 0.62/* | 31 | -| Test | Robust DPatch | learning_rate=0.002, max_iter=2000 | 0.79/0.74 | 0.16/0.25 | 4.10/3.50 | 0.03/0.01 | 0.82/0.75 | 0.72/0.64 | 0.32/0.39 | 4.80/4.0 | 0.03/0.01 | 0.65/0.60 | 20 | -| Test | Adversarial Patch | learning_rate=0.003, max_iter=1000 | 0.79/0.74 | 0.16/0.25 | 4.10/3.50 | 0.03/0.01 | 0.82/0.75 | 0.38/* | 0.40/* | 42.55/* | 0.03/* | 0.57/* | 20 | - -Multimodality (RGB+depth) Object Detection - -| Data | Attack | Attack Parameters | Benign mAP | Benign Disappearance Rate | Benign Hallucination per Image | Benign Misclassification Rate | Benign True Positive Rate | Adversarial mAP | Adversarial Disappearance Rate | Adversarial Hallucination per Image | Adversarial Misclassification Rate | Adversarial True Positive Rate | Test Size | -|------|-------------------|--------------------------------------------------------------------------------------|-------------|-----------------------------|----------------------------------|---------------------------------|-----------------------------|------------------|----------------------------------|--------------------------------------|-------------------------------------|---------------------------------|-----------| -| Dev | Robust DPatch | depth_delta_meters=3, learning_rate=0.002, learning_rate_depth=0.0001, max_iter=2000 | 0.87/0.86 | 0.06/0.04 | 1.23/2.55 | 0.05/0.05 | 0.88/0.91 | 0.76/0.83 | 0.10/0.06 | 5.68/4.87 | 0.05/0.05 | 0.84/0.89 | 31 | -| Dev | Adversarial Patch | depth_delta_meters=3, learning_rate=0.003, learning_rate_depth=0.0001, max_iter=1000 | 0.87/0.86 | 0.06/0.04 | 1.23/2.55 | 0.05/0.05 | 0.88/0.91 | 0.66/0.76 | 0.11/0.10 | 10.74/7.13 | 0.06/0.05 | 0.83/0.85 | 31 | -| Test | Robust DPatch | depth_delta_meters=3, learning_rate=0.002, learning_rate_depth=0.0001, max_iter=2000 | 0.90/0.89 | 0.03/0.04 | 1.0/1.45 | 0.03/0.02 | 0.94/0.94 | 0.81/0.89 | 0.13/0.06 | 4.75/2.05 | 0.03/0.02 | 0.83/0.91 | 20 | -| Test | Adversarial Patch | depth_delta_meters=3, learning_rate=0.003, learning_rate_depth=0.0001, max_iter=1000 | 0.90/0.89 | 0.03/0.04 | 1.0/1.45 | 0.03/0.02 | 0.94/0.94 | 0.50/0.57 | 0.21/0.14 | 22.55/13.70 | 0.04/0.03 | 0.75/0.83 | 20 | - -a/b in the tables refer to undefended/defended performance results, respectively. - -\* Defended results not available for Adversarial Patch attack against single modality because JPEG Compression defense is not implemented in PyTorch and so is not fully differentiable - -Find reference baseline configurations [here](https://github.com/twosixlabs/armory/tree/v0.15.4/scenario_configs/eval5/carla_object_detection) - - -## CARLA Overhead OD Dataset - -Dev data results obtained using Armory 0.16.0, Test data results obtained using Armory 0.16.1 - -Single Modality (RGB) Object Detection - -| Data | Defended | Attack | Attack Parameters | Benign mAP | Benign Disappearance Rate | Benign Hallucination per Image | Benign Misclassification Rate | Benign True Positive Rate | Adversarial mAP | Adversarial Disappearance Rate | Adversarial Hallucination per Image | Adversarial Misclassification Rate | Adversarial True Positive Rate | Test Size | -|------|----------|-------------------|------------------------------------|-------------|-----------------------------|----------------------------------|---------------------------------|-----------------------------|------------------|----------------------------------|--------------------------------------|-------------------------------------|---------------------------------|-----------| -| Dev | no | Adversarial Patch | learning_rate=0.003, max_iter=1000 | 0.64 | 0.36 | 1.9 | 0.02 | 0.62 | 0.16 | 0.64 | 31.0 | 0.009 | 0.35 | 20 | -| Dev | no | Robust DPatch | learning_rate=0.002, max_iter=2000 | 0.64 | 0.36 | 1.9 | 0.02 | 0.62 | 0.42 | 0.43 | 12.0 | 0.009 | 0.56 | 20 | -| Dev | yes | Robust DPatch | learning_rate=0.002, max_iter=2000 | 0.51 | 0.44 | 3.1 | 0.02 | 0.54 | 0.41 | 0.52 | 9.8 | 0.01 | 0.47 | 20 | -| Test | no | Adversarial Patch | learning_rate=0.003, max_iter=1000 | 0.60 | 0.42 | 3.6 | 0.03 | 0.55 | 0.04 | 0.81 | 54.1 | 0.0 | 0.19 | 15 | - -Multimodality (RGB+depth) Object Detection - -| Data | Defended | Attack | Attack Parameters | Benign mAP | Benign Disappearance Rate | Benign Hallucination per Image | Benign Misclassification Rate | Benign True Positive Rate | Adversarial mAP | Adversarial Disappearance Rate | Adversarial Hallucination per Image | Adversarial Misclassification Rate | Adversarial True Positive Rate | Test Size | -|------|----------|-------------------|-----------------------------------------------------------------------------------------|-------------|-----------------------------|----------------------------------|---------------------------------|-----------------------------|------------------|----------------------------------|--------------------------------------|-------------------------------------|---------------------------------|-----------| -| Dev | no | Adversarial Patch | depth_delta_meters=0.03, learning_rate=0.003, learning_rate_depth=0.0001, max_iter=1000 | 0.63 | 0.38 | 0.7 | 0.02 | 0.61 | 0.39 | 0.53 | 5.0 | 0.02 | 0.45 | 20 | -| Dev | yes | Adversarial Patch | depth_delta_meters=0.03, learning_rate=0.003, learning_rate_depth=0.0001, max_iter=1000 | 0.67 | 0.34 | 0.9 | 0.02 | 0.64 | 0.56 | 0.48 | 1.1 | 0.02 | 0.50 | 20 | -| Dev | no | Robust DPatch | depth_delta_meters=0.03, learning_rate=0.002, learning_rate_depth=0.0001, max_iter=2000 | 0.63 | 0.38 | 0.7 | 0.02 | 0.61 | 0.54 | 0.42 | 0.65 | 0.02 | 0.56 | 20 | -| Dev | yes | Robust DPatch | depth_delta_meters=0.03, learning_rate=0.002, learning_rate_depth=0.0001, max_iter=2000 | 0.67 | 0.34 | 0.9 | 0.02 | 0.64 | 0.65 | 0.38 | 0.9 | 0.02 | 0.60 | 20 | -| Test | no | Adversarial Patch | depth_delta_meters=0.03, learning_rate=0.003, learning_rate_depth=0.0001, max_iter=1000 | 0.58 | 0.39 | 0.8 | 0.03 | 0.58 | 0.19 | 0.72 | 15.8 | 0.01 | 0.23 | 15 | - - -Defended results not available for Adversarial Patch attack against single modality because JPEG Compression defense is not implemented in PyTorch and so is not fully differentiable - -Find reference baseline configurations [here](https://github.com/twosixlabs/armory/tree/master/scenario_configs/eval6/carla_overhead_object_detection) \ No newline at end of file diff --git a/docs/original/baseline_results/carla_video_tracking_results.md b/docs/original/baseline_results/carla_video_tracking_results.md deleted file mode 100644 index 792f46926..000000000 --- a/docs/original/baseline_results/carla_video_tracking_results.md +++ /dev/null @@ -1,15 +0,0 @@ -# CARLA Video Tracking Baseline Evaluation - -This is the baseline evaluation for the single-object tracking scenario. For multi-object tracking, see [carla_mot_results.md](../baseline_results/carla_mot_results.md). - -For [dev data](https://github.com/twosixlabs/armory/blob/v0.15.2/armory/data/adversarial/carla_video_tracking_dev.py), results obtained using Armory v0.15.2. -For [test data](https://github.com/twosixlabs/armory/blob/v0.15.4/armory/data/adversarial/carla_video_tracking_test.py), results obtained using Armory v0.15.4. - -| Data | Attack Parameters | Benign Mean IoU | Benign Mean Success Rate | Adversarial Mean IoU | Adversarial Mean Success Rate | Test Size | -|------|------------------------------|-----------------|--------------------------|----------------------|-------------------------------|-----------| -| Dev | step_size=0.02, max_iter=100 | 0.55/0.57 | 0.57/0.60 | 0.14/0.19 | 0.15/0.20 | 20 | -| Test | step_size=0.02, max_iter=100 | 0.52/0.45 | 0.54/0.47 | 0.15/0.17 | 0.16/0.18 | 20 | - -a/b in the tables refer to undefended/defended performance results, respectively. - -Find reference baseline configurations [here](https://github.com/twosixlabs/armory/tree/v0.15.4/scenario_configs/eval5/carla_video_tracking) \ No newline at end of file diff --git a/docs/original/baseline_results/cifar10_dlbd_results.md b/docs/original/baseline_results/cifar10_dlbd_results.md deleted file mode 100644 index a03111677..000000000 --- a/docs/original/baseline_results/cifar10_dlbd_results.md +++ /dev/null @@ -1,468 +0,0 @@ -# Cifar10 Dirty-label Backdoor Baseline Evaluation - -## Copyright Trigger - -### Undefended - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.826 | 0.820 | 0.825 | 0.824 | 0.003 | -| 01 | 0.814 | 0.831 | 0.816 | 0.820 | 0.008 | -| 05 | 0.814 | 0.799 | 0.822 | 0.812 | 0.010 | -| 10 | 0.789 | 0.789 | 0.803 | 0.794 | 0.007 | -| 20 | 0.772 | 0.758 | 0.770 | 0.767 | 0.006 | -| 30 | 0.759 | 0.720 | 0.759 | 0.746 | 0.018 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.764 | 0.771 | 0.765 | 0.767 | 0.003 | -| 01 | 0.764 | 0.763 | 0.758 | 0.762 | 0.002 | -| 05 | 0.762 | 0.768 | 0.766 | 0.765 | 0.002 | -| 10 | 0.762 | 0.764 | 0.767 | 0.764 | 0.002 | -| 20 | 0.760 | 0.758 | 0.757 | 0.758 | 0.001 | -| 30 | 0.761 | 0.688 | 0.763 | 0.737 | 0.035 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.285 | 0.173 | 0.226 | 0.228 | 0.046 | -| 05 | 0.615 | 0.641 | 0.615 | 0.624 | 0.012 | -| 10 | 0.781 | 0.783 | 0.767 | 0.777 | 0.007 | -| 20 | 0.852 | 0.866 | 0.879 | 0.866 | 0.011 | -| 30 | 0.896 | 0.854 | 0.887 | 0.879 | 0.018 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.725 | 0.727 | 0.720 | 0.724 | 0.003 | -| 05 | 0.701 | 0.706 | 0.704 | 0.704 | 0.002 | -| 10 | 0.693 | 0.695 | 0.697 | 0.695 | 0.001 | -| 20 | 0.689 | 0.687 | 0.685 | 0.687 | 0.002 | -| 30 | 0.689 | 0.620 | 0.691 | 0.666 | 0.033 | - - - -### Random Filter - - -**Accuracy on Benign Test Data Source Class** - -|Poison Ratio|Run 1|Run 2|Run 3|Mean |Std | -|------------|-----|-----|-----|------------|--------------| -|0% |0.788|0.81 |0.814|0.804 |0.01143095213 | -|1% |0.777|0.773|0.795|0.7816666667|0.00956846673 | -|5% |0.726|0.78 |0.764|0.7566666667|0.02264705034 | -|10% |0.773|0.756|0.772|0.767 |0.007788880964| -|20% |0.743|0.762|0.752|0.7523333333|0.007760297818| -|30% |0.73 |0.73 |0.726|0.7286666667|0.001885618083| - - -**Accuracy on Benign Test Data All Classes** - -|Poison Ratio|Run 1|Run 2|Run 3|Mean |Std | -|------------|-----|-----|-----|------------|--------------| -|0% |0.734|0.741|0.741|0.7386666667|0.003299831646| -|1% |0.732|0.724|0.738|0.7313333333|0.005734883511| -|5% |0.716|0.722|0.738|0.7253333333|0.009285592185| -|10% |0.735|0.722|0.73 |0.729 |0.005354126135| -|20% |0.725|0.723|0.735|0.7276666667|0.005249338583| -|30% |0.729|0.727|0.73 |0.7286666667|0.001247219129| - - -**Attack Success Rate** - -|Poison Ratio|Run 1|Run 2|Run 3|Mean |Std | -|------------|-----|-----|-----|------------|--------------| -|0% | - | - | - | - | - | -|1% |0.215|0.235|0.264|0.238 |0.02011632836 | -|5% |0.639|0.579|0.651|0.623 |0.0314960315 | -|10% |0.733|0.686|0.721|0.7133333333|0.01993879524 | -|20% |0.865|0.837|0.839|0.847 |0.01275408431 | -|30% |0.877|0.892|0.875|0.8813333333|0.007586537784| - - -**Accuracy on Poisoned Test Data All Classes** - -|Poison Ratio|Run 1|Run 2|Run 3|Mean |Std | -|------------|-----|-----|-----|------------|--------------| -|0% | - | - | - | - | - | -|1% |0.698|0.688|0.694|0.6933333333|0.004109609335| -|5% |0.659|0.665|0.679|0.6676666667|0.00837987006 | -|10% |0.668|0.66 |0.666|0.6646666667|0.003399346342| -|20% |0.656|0.653|0.665|0.658 |0.005099019514| -|30% |0.66 |0.657|0.661|0.6593333333|0.001699673171| - - -### Perfect Filter - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.824 | 0.816 | 0.811 | 0.817 | 0.005 | -| 01 | 0.833 | 0.820 | 0.834 | 0.829 | 0.006 | -| 05 | 0.716 | 0.712 | 0.729 | 0.719 | 0.007 | -| 10 | 0.812 | 0.801 | 0.811 | 0.808 | 0.005 | -| 20 | 0.789 | 0.810 | 0.788 | 0.796 | 0.010 | -| 30 | 0.802 | 0.755 | 0.768 | 0.775 | 0.020 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.774 | 0.765 | 0.772 | 0.770 | 0.004 | -| 01 | 0.770 | 0.764 | 0.771 | 0.768 | 0.003 | -| 05 | 0.760 | 0.764 | 0.766 | 0.763 | 0.002 | -| 10 | 0.767 | 0.766 | 0.769 | 0.767 | 0.001 | -| 20 | 0.770 | 0.767 | 0.764 | 0.767 | 0.002 | -| 30 | 0.766 | 0.760 | 0.763 | 0.763 | 0.002 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.049 | 0.042 | 0.062 | 0.051 | 0.008 | -| 05 | 0.091 | 0.085 | 0.106 | 0.094 | 0.009 | -| 10 | 0.068 | 0.089 | 0.087 | 0.081 | 0.009 | -| 20 | 0.069 | 0.073 | 0.060 | 0.067 | 0.005 | -| 30 | 0.067 | 0.099 | 0.077 | 0.081 | 0.013 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.745 | 0.741 | 0.747 | 0.744 | 0.002 | -| 05 | 0.728 | 0.741 | 0.737 | 0.735 | 0.005 | -| 10 | 0.737 | 0.740 | 0.743 | 0.740 | 0.002 | -| 20 | 0.746 | 0.739 | 0.736 | 0.740 | 0.005 | -| 30 | 0.737 | 0.732 | 0.735 | 0.735 | 0.002 | - - - -### Activation Clustering - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.801 | 0.760 | 0.671 | 0.744 | 0.054 | -| 01 | 0.817 | 0.770 | 0.772 | 0.786 | 0.022 | -| 05 | 0.785 | 0.778 | 0.755 | 0.773 | 0.013 | -| 10 | 0.735 | 0.565 | 0.753 | 0.684 | 0.085 | -| 20 | 0.741 | 0.734 | 0.688 | 0.721 | 0.024 | -| 30 | 0.684 | 0.673 | 0.667 | 0.675 | 0.007 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.724 | 0.719 | 0.706 | 0.716 | 0.007 | -| 01 | 0.720 | 0.728 | 0.718 | 0.722 | 0.004 | -| 05 | 0.707 | 0.720 | 0.697 | 0.708 | 0.009 | -| 10 | 0.712 | 0.670 | 0.709 | 0.697 | 0.019 | -| 20 | 0.724 | 0.730 | 0.726 | 0.727 | 0.003 | -| 30 | 0.720 | 0.707 | 0.705 | 0.711 | 0.007 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.255 | 0.228 | 0.263 | 0.249 | 0.015 | -| 05 | 0.523 | 0.439 | 0.463 | 0.475 | 0.035 | -| 10 | 0.665 | 0.739 | 0.679 | 0.694 | 0.032 | -| 20 | 0.692 | 0.838 | 0.822 | 0.784 | 0.065 | -| 30 | 0.916 | 0.888 | 0.887 | 0.897 | 0.013 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.684 | 0.694 | 0.678 | 0.685 | 0.006 | -| 05 | 0.652 | 0.670 | 0.644 | 0.655 | 0.011 | -| 10 | 0.654 | 0.619 | 0.651 | 0.641 | 0.016 | -| 20 | 0.666 | 0.663 | 0.662 | 0.664 | 0.002 | -| 30 | 0.654 | 0.642 | 0.641 | 0.646 | 0.006 | - - - -### Spectral Signatures - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.784 | 0.782 | 0.755 | 0.774 | 0.013 | -| 01 | 0.770 | 0.771 | 0.776 | 0.772 | 0.003 | -| 05 | 0.739 | 0.748 | 0.767 | 0.751 | 0.012 | -| 10 | 0.727 | 0.726 | 0.745 | 0.733 | 0.009 | -| 20 | 0.736 | 0.715 | 0.731 | 0.727 | 0.009 | -| 30 | 0.669 | 0.646 | 0.677 | 0.664 | 0.013 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.655 | 0.696 | 0.696 | 0.682 | 0.019 | -| 01 | 0.667 | 0.628 | 0.637 | 0.644 | 0.017 | -| 05 | 0.699 | 0.694 | 0.647 | 0.680 | 0.023 | -| 10 | 0.692 | 0.688 | 0.695 | 0.692 | 0.003 | -| 20 | 0.694 | 0.687 | 0.643 | 0.674 | 0.023 | -| 30 | 0.677 | 0.686 | 0.693 | 0.686 | 0.007 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.219 | 0.222 | 0.235 | 0.225 | 0.007 | -| 05 | 0.531 | 0.498 | 0.323 | 0.451 | 0.091 | -| 10 | 0.535 | 0.722 | 0.560 | 0.606 | 0.083 | -| 20 | 0.682 | 0.715 | 0.665 | 0.687 | 0.021 | -| 30 | 0.791 | 0.831 | 0.863 | 0.828 | 0.029 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.635 | 0.597 | 0.599 | 0.610 | 0.018 | -| 05 | 0.646 | 0.642 | 0.611 | 0.633 | 0.016 | -| 10 | 0.640 | 0.626 | 0.641 | 0.636 | 0.007 | -| 20 | 0.636 | 0.627 | 0.585 | 0.616 | 0.023 | -| 30 | 0.617 | 0.628 | 0.629 | 0.625 | 0.006 | - - - - - - - - - -## Watermark Trigger - -### Undefended - -**Accuracy on Benign Test Data Source Class** - -|Poison Ratio|Run 1|Run 2|Run 3|Mean |Std | -|------------|-----|-----|-----|------------|--------------| -|0% |0.822|0.84 |0.831|0.831 |0.007348469228| -|1% |0.817|0.832|0.822|0.8236666667|0.006236095645| -|5% |0.82 |0.752|0.82 |0.7973333333|0.03205550741 | -|10% |0.796|0.801|0.799|0.7986666667|0.002054804668| -|20% |0.794|0.789|0.783|0.7886666667|0.004496912521| -|30% |0.77 |0.774|0.784|0.776 |0.005887840578| - -**Accuracy on Benign Test Data All Classes** - -|Poison Ratio|Run 1|Run 2|Run 3|Mean |Std | -|------------|-----|-----|-----|------------|--------------| -|0% |0.772|0.772|0.764|0.7693333333|0.003771236166| -|1% |0.761|0.766|0.764|0.7636666667|0.002054804668| -|5% |0.765|0.74 |0.768|0.7576666667|0.01255211359 | -|10% |0.763|0.761|0.762|0.762 |0.0008164965809| -|20% |0.769|0.766|0.762|0.7656666667|0.002867441756| -|30% |0.764|0.762|0.769|0.765 |0.002943920289| - - -**Attack Success Rate** - -|Poison Ratio|Run 1|Run 2|Run 3|Mean |Std | -|------------|-----|-----|-----|------------|--------------| -|0% |- |- |- |- |- | -|1% |0.298|0.454|0.268|0.34 |0.08153526844 | -|5% |0.802|0.757|0.734|0.7643333333|0.02824102611 | -|10% |0.87 |0.89 |0.846|0.8686666667|0.01798765008 | -|20% |0.93 |0.941|0.946|0.939 |0.006683312552| -|30% |0.93 |0.952|0.96 |0.9473333333|0.01268419839 | - - -**Accuracy on Poisoned Test Data All Classes** - -|Poison Ratio|Run 1|Run 2|Run 3|Mean |Std | -|------------|-----|-----|-----|------------|--------------| -|0% |- |- |- |- |- | -|1% |0.731|0.72 |0.735|0.7286666667|0.006342099197| -|5% |0.692|0.678|0.703|0.691 |0.01023067284 | -|10% |0.691|0.686|0.691|0.6893333333|0.002357022604| -|20% |0.693|0.691|0.686|0.69 |0.002943920289| -|30% |0.69 |0.687|0.693|0.69 |0.002449489743| - - - -### Random Filter - -**Accuracy on Benign Test Data Source Class** - -|Poison Ratio|Run 1|Run 2|Run 3|Mean |Std | -|------------|-----|-----|-----|------------|--------------| -|0% |0.792|0.799|0.799|0.7966666667|0.003299831646| -|1% |0.785|0.781|0.772|0.7793333333|0.005436502143| -|5% |0.795|0.774|0.78 |0.783 |0.008831760866| -|10% |0.755|0.765|0.765|0.7616666667|0.004714045208| -|20% |0.754|0.741|0.739|0.7446666667|0.006649979114| -|30% |0.78 |0.707|0.715|0.734 |0.03269046752 | - - -**Accuracy on Benign Test Data All Classes** - -|Poison Ratio|Run 1|Run 2|Run 3|Mean |Std | -|------------|-----|-----|-----|------------|--------------| -|0% |0.731|0.738|0.733|0.734 |0.002943920289| -|1% |0.733|0.72 |0.731|0.728 |0.005715476066| -|5% |0.742|0.725|0.733|0.7333333333|0.006944222219| -|10% |0.728|0.728|0.735|0.7303333333|0.003299831646| -|20% |0.735|0.729|0.737|0.7336666667|0.003399346342| -|30% |0.727|0.716|0.731|0.7246666667|0.006342099197| - - -**Attack Success Rate** - -|Poison Ratio|Run 1|Run 2|Run 3|Mean |Std | -|------------|-----|-----|-----|------------|--------------| -|0% |0 |0 |0 |0 |0 | -|1% |0.268|0.247|0.259|0.258 |0.008602325267| -|5% |0.747|0.696|0.667|0.7033333333|0.03306895153 | -|10% |0.794|0.834|0.809|0.8123333333|0.01649915823 | -|20% |0.918|0.897|0.906|0.907 |0.008602325267| -|30% |0.935|0.95 |0.947|0.944 |0.006480740698| - - -**Accuracy on Poisoned Test Data All Classes** - -|Poison Ratio|Run 1|Run 2|Run 3|Mean |Std | -|------------|-----|-----|-----|------------|--------------| -|0% |0 |0 |0 |0 |0 | -|1% |0.708|0.692|0.702|0.7006666667|0.006599663291| -|5% |0.677|0.663|0.676|0.672 |0.006377042157| -|10% |0.665|0.659|0.669|0.6643333333|0.004109609335| -|20% |0.663|0.659|0.667|0.663 |0.003265986324| -|30% |0.652|0.647|0.662|0.6536666667|0.006236095645| - - -### Perfect Filter - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.817 | 0.822 | 0.827 | 0.822 | 0.004 | -| 01 | 0.825 | 0.830 | 0.809 | 0.821 | 0.009 | -| 05 | 0.818 | 0.817 | 0.802 | 0.812 | 0.007 | -| 10 | 0.795 | 0.800 | 0.801 | 0.799 | 0.003 | -| 20 | 0.787 | 0.792 | 0.788 | 0.789 | 0.002 | -| 30 | 0.761 | 0.761 | 0.775 | 0.766 | 0.007 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.771 | 0.765 | 0.775 | 0.771 | 0.004 | -| 01 | 0.768 | 0.764 | 0.764 | 0.765 | 0.002 | -| 05 | 0.767 | 0.767 | 0.766 | 0.767 | 0.000 | -| 10 | 0.769 | 0.759 | 0.766 | 0.765 | 0.004 | -| 20 | 0.765 | 0.763 | 0.761 | 0.763 | 0.002 | -| 30 | 0.763 | 0.758 | 0.762 | 0.761 | 0.002 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.020 | 0.039 | 0.039 | 0.033 | 0.009 | -| 05 | 0.029 | 0.024 | 0.022 | 0.025 | 0.003 | -| 10 | 0.016 | 0.025 | 0.036 | 0.026 | 0.008 | -| 20 | 0.038 | 0.023 | 0.030 | 0.030 | 0.006 | -| 30 | 0.023 | 0.027 | 0.030 | 0.027 | 0.003 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.764 | 0.757 | 0.761 | 0.761 | 0.003 | -| 05 | 0.763 | 0.760 | 0.764 | 0.763 | 0.002 | -| 10 | 0.769 | 0.756 | 0.762 | 0.762 | 0.005 | -| 20 | 0.759 | 0.755 | 0.758 | 0.757 | 0.002 | -| 30 | 0.760 | 0.755 | 0.760 | 0.758 | 0.002 | - - - -### Activation Clustering - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.806 | 0.815 | 0.786 | 0.802 | 0.012 | -| 01 | 0.773 | 0.789 | 0.768 | 0.777 | 0.009 | -| 05 | 0.504 | 0.658 | 0.608 | 0.590 | 0.064 | -| 10 | 0.734 | 0.726 | 0.700 | 0.720 | 0.015 | -| 20 | 0.680 | 0.664 | 0.656 | 0.667 | 0.010 | -| 30 | 0.932 | 0.652 | 0.697 | 0.760 | 0.123 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.732 | 0.756 | 0.703 | 0.731 | 0.022 | -| 01 | 0.722 | 0.722 | 0.720 | 0.721 | 0.001 | -| 05 | 0.691 | 0.721 | 0.712 | 0.708 | 0.012 | -| 10 | 0.724 | 0.720 | 0.709 | 0.718 | 0.007 | -| 20 | 0.708 | 0.707 | 0.698 | 0.704 | 0.005 | -| 30 | 0.097 | 0.722 | 0.730 | 0.516 | 0.296 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.282 | 0.186 | 0.167 | 0.212 | 0.050 | -| 05 | 0.966 | 0.985 | 0.984 | 0.978 | 0.009 | -| 10 | 0.673 | 0.852 | 0.284 | 0.603 | 0.237 | -| 20 | 0.741 | 0.678 | 0.947 | 0.789 | 0.115 | -| 30 | 0.000 | 0.962 | 0.947 | 0.636 | 0.450 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.696 | 0.701 | 0.701 | 0.699 | 0.002 | -| 05 | 0.641 | 0.655 | 0.652 | 0.649 | 0.006 | -| 10 | 0.670 | 0.655 | 0.688 | 0.671 | 0.014 | -| 20 | 0.653 | 0.659 | 0.634 | 0.649 | 0.011 | -| 30 | 0.100 | 0.657 | 0.663 | 0.473 | 0.264 | - - - -### Spectral Signatures - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.757 | 0.786 | 0.763 | 0.769 | 0.012 | -| 01 | 0.779 | 0.770 | 0.776 | 0.775 | 0.004 | -| 05 | 0.757 | 0.115 | 0.753 | 0.542 | 0.302 | -| 10 | 0.751 | 0.700 | 0.754 | 0.735 | 0.025 | -| 20 | 0.746 | 0.706 | 0.735 | 0.729 | 0.017 | -| 30 | 0.613 | 0.655 | 0.649 | 0.639 | 0.019 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | 0.702 | 0.703 | 0.705 | 0.703 | 0.001 | -| 01 | 0.692 | 0.689 | 0.689 | 0.690 | 0.001 | -| 05 | 0.701 | 0.090 | 0.687 | 0.492 | 0.285 | -| 10 | 0.694 | 0.688 | 0.634 | 0.672 | 0.027 | -| 20 | 0.681 | 0.692 | 0.688 | 0.687 | 0.004 | -| 30 | 0.689 | 0.695 | 0.685 | 0.689 | 0.004 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.105 | 0.141 | 0.117 | 0.121 | 0.015 | -| 05 | 0.129 | 0.000 | 0.180 | 0.103 | 0.076 | -| 10 | 0.356 | 0.786 | 0.601 | 0.581 | 0.176 | -| 20 | 0.905 | 0.697 | 0.890 | 0.831 | 0.095 | -| 30 | 0.814 | 0.848 | 0.140 | 0.601 | 0.326 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 00 | - |- |- |- |- | -| 01 | 0.678 | 0.674 | 0.677 | 0.676 | 0.002 | -| 05 | 0.690 | 0.085 | 0.675 | 0.483 | 0.282 | -| 10 | 0.662 | 0.628 | 0.584 | 0.624 | 0.032 | -| 20 | 0.612 | 0.640 | 0.619 | 0.624 | 0.012 | -| 30 | 0.635 | 0.635 | 0.679 | 0.650 | 0.021 | diff --git a/docs/original/baseline_results/cifar10_sleeper_agent_results.md b/docs/original/baseline_results/cifar10_sleeper_agent_results.md deleted file mode 100644 index 25c5ac7a6..000000000 --- a/docs/original/baseline_results/cifar10_sleeper_agent_results.md +++ /dev/null @@ -1,73 +0,0 @@ -# Cifar10 Sleeper Agent Baseline Evaluation - -Results obtained using Armory 0.16.4 - -### Undefended - -Mean of 3 runs - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.735 | 0.740 | - | - | -| 01 | 0.739 | 0.770 | 0.726 | 0.038 | -| 05 | 0.738 | 0.771 | 0.722 | 0.135 | -| 10 | 0.739 | 0.788 | 0.715 | 0.212 | -| 20 | 0.743 | 0.780 | 0.698 | 0.524 | -| 30 | 0.731 | 0.794 | 0.670 | 0.753 | - - -### Random Filter - -Mean of 3 runs - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.690 | 0.761 | - | - | -| 01 | 0.703 | 0.791 | 0.700 | 0.029 | -| 05 | 0.713 | 0.777 | 0.696 | 0.176 | -| 10 | 0.711 | 0.810 | 0.700 | 0.079 | -| 20 | 0.705 | 0.745 | 0.676 | 0.296 | -| 30 | 0.708 | 0.745 | 0.678 | 0.346 | - - -### Perfect Filter - -Mean of 3 runs - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.749 | 0.800 | - | - | -| 01 | 0.727 | 0.694 | 0.715 | 0.045 | -| 05 | 0.741 | 0.749 | 0.729 | 0.018 | -| 10 | 0.741 | 0.767 | 0.731 | 0.028 | -| 20 | 0.731 | 0.778 | 0.725 | 0.009 | -| 30 | 0.741 | 0.807 | 0.736 | 0.013 | - - -### Activation Clustering - -Mean of 3 runs - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.650 | 0.659 | - | - | -| 01 | 0.646 | 0.661 | 0.642 | 0.031 | -| 05 | 0.652 | 0.647 | 0.647 | 0.053 | -| 10 | 0.664 | 0.776 | 0.658 | 0.029 | -| 20 | 0.662 | 0.696 | 0.640 | 0.188 | -| 30 | 0.666 | 0.668 | 0.630 | 0.462 | - - -### Spectral Signatures - -Mean of 3 runs - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.684 | 0.738 | - | - | -| 01 | 0.675 | 0.768 | 0.671 | 0.044 | -| 05 | 0.668 | 0.660 | 0.656 | 0.098 | -| 10 | 0.676 | 0.694 | 0.664 | 0.131 | -| 20 | 0.661 | 0.709 | 0.632 | 0.356 | -| 30 | 0.656 | 0.729 | 0.625 | 0.387 | - diff --git a/docs/original/baseline_results/cifar10_witches_brew_results.md b/docs/original/baseline_results/cifar10_witches_brew_results.md deleted file mode 100644 index 13dd2985f..000000000 --- a/docs/original/baseline_results/cifar10_witches_brew_results.md +++ /dev/null @@ -1,146 +0,0 @@ -# Cifar10 Witches' Brew Baseline Evaluation - -Results obtained using Armory 0.15.X (July 2022) - -Note: the baseline CIFAR resnet was updated in Armory 0.16.1. - -## Undefended - -**Accuracy on Non-trigger Images** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|--------------| -|0% |0.746446|0.747848|0.748448|0.7475806667|0.0008388886829| -|10% |0.743744|0.743544|0.739139|0.7421423333|0.002125246391| -|20% |0.735035|0.731532|0.74004|0.7355356667|0.003491371873| -|30% |0.750651|0.741842|0.736537|0.74301 |0.740463 | - -**Accuracy on Trigger Images** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0.7 |0.7 |0.8 |0.7333333333|0.04714045208| -|10% |0.2 |0.3 |0.4 |0.3 |0.08164965809| -|20% |0.1 |0.1 |0.1 |0.1 |0 | -|30% |0.3 |0.4 |0.3 |0.3333333333|0.04714045208| - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0 |0 |0 |0 |0 | -|10% |0.7 |0.5 |0.6 |0.6 |0.08164965809| -|20% |0.7 |0.8 |0.6 |0.7 |0.08164965809| -|30% |0.7 |0.6 |0.4 |0.5666666667|0.1247219129 | - - -## Perfect Filter - -**Accuracy on Non-trigger Images** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0.743944|0.738238|0.733934|0.7387053333|0.004099904498| -|10% |0.741041|0.741842|0.739339|0.7407406667|0.001043680134| -|20% |0.732232|0.733534|0.729229|0.731665 |0.001802659702| -|30% |0.727928|0.720921|0.726527|0.7251253333|0.003027431731| - -**Accuracy on Trigger Images** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0.5 |0.5 |0.5 |0.5 |0 | -|10% |0.7 |0.6 |0.5 |0.6 |0.08164965809| -|20% |0.6 |0.6 |0.6 |0.6 |0 | -|30% |0.5 |0.6 |0.5 |0.5333333333|0.04714045208| - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0 |0 |0.1 |0.03333333333|0.04714045208| -|10% |0.1 |0 |0 |0.03333333333|0.04714045208| -|20% |0 |0 |0 |0 |0 | -|30% |0 |0 |0 |0 |0 | - - -## Random Filter - -**Accuracy on Non-trigger Images** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0.728128|0.728128|0.708609|0.722523 |0.009201344841| -|10% |0.715716|0.714214|0.716717|0.715549 |0.001028646036| -|20% |0.702503|0.717417|0.700901|0.7069403333|0.007436935271| -|30% |0.703203|0.688488|0.696597|0.696096 |0.006017810067| - -**Accuracy on Trigger Images** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0.6 |0.6 |0.6 |0.6 |0 | -|10% |0.1 |0.2 |0.2 |0.1666666667|0.04714045208| -|20% |0 |0.1 |0 |0.03333333333|0.04714045208| -|30% |0.1 |0.1 |0.1 |0.1 |0 | - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0.1 |0.1 |0.1 |0.1 |0 | -|10% |0.9 |0.7 |0.6 |0.7333333333|0.1247219129 | -|20% |0.8 |0.5 |0.8 |0.7 |0.1414213562 | -|30% |0.7 |0.7 |0.9 |0.7666666667|0.09428090416| - - - -## Activation Clustering - -**Accuracy on Non-trigger Images** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0.664665|0.658559|0.657257|0.6601603333|0.003229325764| -|10% |0.65966|0.660561|0.651451|0.657224 |0.004098666206| -|20% |0.667067|0.64004|0.643544|0.650217 |0.01200031608| -|30% |0.637037|0.630731|0.645846|0.6378713333|0.006198811194| - -**Accuracy on Trigger Images** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0.3 |0.4 |0.3 |0.3333333333|0.04714045208| -|10% |0.4 |0.2 |0.4 |0.3333333333|0.09428090416| -|20% |0.3 |0.1 |0 |0.1333333333|0.1247219129 | -|30% |0.1 |0.2 |0.2 |0.1666666667|0.04714045208| - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0.1 |0 |0 |0.03333333333|0.04714045208| -|10% |0.6 |0.3 |0.5 |0.4666666667|0.1247219129 | -|20% |0.6 |0.7 |0.6 |0.6333333333|0.04714045208| -|30% |0.8 |0.8 |0.5 |0.7 |0.1414213562 | - - - -## Spectral Signatures - -**Accuracy on Non-trigger Images** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0.687487|0.683483|0.67958|0.6835166667|0.003228107013| -|10% |0.664765|0.667067|0.667568|0.6664666667|0.001220519653| -|20% |0.673373|0.655656|0.664064|0.6643643333|0.007236051978| -|30% |0.63994|0.657257|0.664064|0.6537536667|0.01015535499| - -**Accuracy on Trigger Images** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0.7 |0.6 |0.6 |0.6333333333|0.04714045208| -|10% |0.2 |0.2 |0.2 |0.2 |0 | -|20% |0 |0.1 |0.1 |0.06666666667|0.04714045208| -|30% |0 |0 |0.1 |0.03333333333|0.04714045208| - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0% |0 |0.1 |0 |0.03333333333|0.04714045208| -|10% |0.7 |0.5 |0.8 |0.6666666667|0.1247219129 | -|20% |0.6 |0.6 |0.6 |0.6 |0 | -|30% |0.6 |0.8 |0.3 |0.5666666667|0.2054804668 | - - - - - diff --git a/docs/original/baseline_results/dapricot_results.md b/docs/original/baseline_results/dapricot_results.md deleted file mode 100644 index ed1fbd233..000000000 --- a/docs/original/baseline_results/dapricot_results.md +++ /dev/null @@ -1,16 +0,0 @@ -# Dapricot Baseline Evaluation - -Results obtained using Armory v0.13.3 and [dev test data](https://github.com/twosixlabs/armory/blob/8eb10ac43bf4382d69625d8cef8a3e8cb23d0318/armory/data/adversarial/dapricot_test.py) - -| Attack | Patch Size | Target Success (Undefended) | Target mAP (Undefended) | Target Success (Defended) | Target mAP (Defended) | Test Size | -|---------------|------------|-----------------------------|-------------------------|---------------------------|-----------------------|-----------| -| Masked PGD | all | 0.99 | 0.91 | 0.99 | 0.91 | 100 | -| Masked PGD | small | 0.97 | 0.91 | 0.97 | 0.91 | 100 | -| Masked PGD | medium | 1.00 | 1.00 | 1.00 | 0.91 | 100 | -| Masked PGD | large | 1.00 | 1.00 | 1.00 | 0.91 | 100 | -| Robust DPatch | all | 0.56 | 0.64 | 0.61 | 0.64 | 100 | -| Robust DPatch | small | 0.51 | 0.64 | 0.60 | 0.64 | 100 | -| Robust DPatch | medium | 0.61 | 0.64 | 0.65 | 0.73 | 100 | -| Robust DPatch | large | 0.55 | 0.64 | 0.63 | 0.73 | 100 | - -Find reference baseline configurations [here](https://github.com/twosixlabs/armory/tree/8eb10ac43bf4382d69625d8cef8a3e8cb23d0318/scenario_configs) \ No newline at end of file diff --git a/docs/original/baseline_results/gtsrb_clbd_results.md b/docs/original/baseline_results/gtsrb_clbd_results.md deleted file mode 100644 index 2ed257e3f..000000000 --- a/docs/original/baseline_results/gtsrb_clbd_results.md +++ /dev/null @@ -1,296 +0,0 @@ -# GTSRB Clean-label Backdoor Baseline Evaluation - -Results obtained using Armory ~0.14.X (March 2022) - -## Bullet Hole Trigger - -## Undefended - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.967 | 0.961 | 0.963 | 0.963 | 0.002 | -| 20 | 0.971 | 0.965 | 0.975 | 0.970 | 0.004 | -| 50 | 0.967 | 0.964 | 0.961 | 0.964 | 0.002 | -| 80 | 0.967 | 0.971 | 0.958 | 0.965 | 0.005 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.928 | 0.930 | 0.925 | 0.928 | 0.002 | -| 20 | 0.930 | 0.926 | 0.932 | 0.929 | 0.002 | -| 50 | 0.925 | 0.927 | 0.928 | 0.927 | 0.001 | -| 80 | 0.927 | 0.925 | 0.924 | 0.925 | 0.001 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.194 | 0.222 | 0.257 | 0.225 | 0.026 | -| 50 | 0.237 | 0.237 | 0.233 | 0.236 | 0.002 | -| 80 | 0.267 | 0.276 | 0.261 | 0.268 | 0.006 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.920 | 0.914 | 0.917 | 0.917 | 0.002 | -| 50 | 0.913 | 0.915 | 0.916 | 0.914 | 0.001 | -| 80 | 0.913 | 0.909 | 0.910 | 0.911 | 0.001 | - - -### Random Filter - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.961 | 0.950 | 0.947 | 0.953 | 0.006 | -| 20 | 0.968 | 0.961 | 0.967 | 0.965 | 0.003 | -| 50 | 0.969 | 0.971 | 0.971 | 0.970 | 0.001 | -| 80 | 0.981 | 0.954 | 0.972 | 0.969 | 0.011 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.925 | 0.923 | 0.923 | 0.924 | 0.001 | -| 20 | 0.925 | 0.924 | 0.924 | 0.924 | 0.000 | -| 50 | 0.926 | 0.929 | 0.925 | 0.927 | 0.002 | -| 80 | 0.928 | 0.924 | 0.929 | 0.927 | 0.002 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.236 | 0.207 | 0.237 | 0.227 | 0.014 | -| 50 | 0.253 | 0.250 | 0.239 | 0.247 | 0.006 | -| 80 | 0.246 | 0.279 | 0.275 | 0.267 | 0.015 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.912 | 0.913 | 0.911 | 0.912 | 0.001 | -| 50 | 0.912 | 0.916 | 0.912 | 0.913 | 0.002 | -| 80 | 0.914 | 0.910 | 0.914 | 0.913 | 0.002 | - - - -### Activation Clustering - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.915 | 0.886 | 0.842 | 0.881 | 0.030 | -| 20 | 0.906 | 0.897 | 0.912 | 0.905 | 0.006 | -| 50 | 0.894 | 0.849 | 0.861 | 0.868 | 0.019 | -| 80 | 0.904 | 0.910 | 0.907 | 0.907 | 0.002 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.871 | 0.866 | 0.861 | 0.866 | 0.004 | -| 20 | 0.873 | 0.879 | 0.874 | 0.875 | 0.003 | -| 50 | 0.854 | 0.858 | 0.865 | 0.859 | 0.004 | -| 80 | 0.866 | 0.861 | 0.854 | 0.860 | 0.005 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.197 | 0.292 | 0.256 | 0.248 | 0.039 | -| 50 | 0.303 | 0.265 | 0.282 | 0.283 | 0.015 | -| 80 | 0.250 | 0.260 | 0.272 | 0.261 | 0.009 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.866 | 0.867 | 0.862 | 0.865 | 0.002 | -| 50 | 0.841 | 0.849 | 0.855 | 0.848 | 0.005 | -| 80 | 0.854 | 0.849 | 0.842 | 0.848 | 0.005 | - - -### Perfect Filter - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.965 | 0.963 | 0.963 | 0.963 | 0.001 | -| 20 | 0.968 | 0.964 | 0.958 | 0.963 | 0.004 | -| 50 | 0.963 | 0.969 | 0.961 | 0.964 | 0.004 | -| 80 | 0.971 | 0.971 | 0.969 | 0.970 | 0.001 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.928 | 0.929 | 0.925 | 0.928 | 0.002 | -| 20 | 0.927 | 0.929 | 0.926 | 0.927 | 0.001 | -| 50 | 0.926 | 0.929 | 0.927 | 0.927 | 0.001 | -| 80 | 0.929 | 0.929 | 0.927 | 0.928 | 0.001 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.126 | 0.097 | 0.133 | 0.119 | 0.016 | -| 50 | 0.092 | 0.082 | 0.147 | 0.107 | 0.029 | -| 80 | 0.126 | 0.118 | 0.100 | 0.115 | 0.011 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.920 | 0.923 | 0.918 | 0.920 | 0.002 | -| 50 | 0.919 | 0.921 | 0.919 | 0.920 | 0.001 | -| 80 | 0.922 | 0.919 | 0.920 | 0.920 | 0.001 | - - - -## Peace Sign Trigger - -### Undefended - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.968 | 0.964 | 0.972 | 0.968 | 0.003 | -| 20 | 0.971 | 0.964 | 0.975 | 0.970 | 0.005 | -| 50 | 0.964 | 0.956 | 0.969 | 0.963 | 0.006 | -| 80 | 0.964 | 0.972 | 0.965 | 0.967 | 0.004 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.930 | 0.927 | 0.926 | 0.928 | 0.002 | -| 20 | 0.932 | 0.934 | 0.932 | 0.933 | 0.001 | -| 50 | 0.926 | 0.926 | 0.929 | 0.927 | 0.002 | -| 80 | 0.929 | 0.928 | 0.928 | 0.928 | 0.000 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.676 | 0.560 | 0.597 | 0.611 | 0.049 | -| 50 | 0.547 | 0.533 | 0.660 | 0.580 | 0.057 | -| 80 | 0.643 | 0.649 | 0.679 | 0.657 | 0.016 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.893 | 0.900 | 0.898 | 0.897 | 0.003 | -| 50 | 0.895 | 0.896 | 0.892 | 0.895 | 0.002 | -| 80 | 0.893 | 0.891 | 0.888 | 0.891 | 0.002 | - - -### Random Filter - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.964 | 0.958 | 0.956 | 0.959 | 0.003 | -| 20 | 0.960 | 0.963 | 0.965 | 0.963 | 0.002 | -| 50 | 0.957 | 0.958 | 0.967 | 0.961 | 0.004 | -| 80 | 0.969 | 0.961 | 0.965 | 0.965 | 0.003 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.919 | 0.924 | 0.924 | 0.922 | 0.002 | -| 20 | 0.924 | 0.926 | 0.924 | 0.925 | 0.001 | -| 50 | 0.924 | 0.926 | 0.922 | 0.924 | 0.002 | -| 80 | 0.927 | 0.922 | 0.924 | 0.924 | 0.002 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.637 | 0.653 | 0.624 | 0.638 | 0.012 | -| 50 | 0.611 | 0.581 | 0.656 | 0.616 | 0.031 | -| 80 | 0.622 | 0.646 | 0.710 | 0.659 | 0.037 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.885 | 0.887 | 0.887 | 0.886 | 0.001 | -| 50 | 0.890 | 0.894 | 0.885 | 0.889 | 0.004 | -| 80 | 0.891 | 0.885 | 0.885 | 0.887 | 0.003 | - - -### Activation Clustering - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.907 | 0.929 | 0.914 | 0.917 | 0.009 | -| 20 | 0.858 | 0.897 | 0.889 | 0.881 | 0.017 | -| 50 | 0.914 | 0.910 | 0.929 | 0.918 | 0.008 | -| 80 | 0.858 | 0.926 | 0.892 | 0.892 | 0.028 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.861 | 0.871 | 0.872 | 0.868 | 0.005 | -| 20 | 0.865 | 0.852 | 0.870 | 0.862 | 0.008 | -| 50 | 0.871 | 0.865 | 0.871 | 0.869 | 0.003 | -| 80 | 0.856 | 0.861 | 0.860 | 0.859 | 0.002 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.579 | 0.685 | 0.621 | 0.628 | 0.043 | -| 50 | 0.660 | 0.607 | 0.675 | 0.647 | 0.029 | -| 80 | 0.671 | 0.722 | 0.700 | 0.698 | 0.021 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.838 | 0.816 | 0.838 | 0.831 | 0.011 | -| 50 | 0.838 | 0.833 | 0.835 | 0.836 | 0.002 | -| 80 | 0.823 | 0.823 | 0.825 | 0.824 | 0.001 | - - - -### Perfect Filter - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.965 | 0.965 | 0.965 | 0.965 | 0.000 | -| 20 | 0.958 | 0.960 | 0.958 | 0.959 | 0.001 | -| 50 | 0.974 | 0.972 | 0.963 | 0.969 | 0.005 | -| 80 | 0.965 | 0.963 | 0.972 | 0.967 | 0.004 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | 0.929 | 0.928 | 0.929 | 0.929 | 0.000 | -| 20 | 0.926 | 0.925 | 0.929 | 0.927 | 0.002 | -| 50 | 0.926 | 0.926 | 0.928 | 0.927 | 0.001 | -| 80 | 0.926 | 0.927 | 0.927 | 0.927 | 0.000 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.222 | 0.214 | 0.151 | 0.196 | 0.032 | -| 50 | 0.047 | 0.064 | 0.057 | 0.056 | 0.007 | -| 80 | 0.253 | 0.272 | 0.118 | 0.214 | 0.069 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 | run3 | mean | std | -|--------------|------|------|------|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.895 | 0.899 | 0.903 | 0.899 | 0.003 | -| 50 | 0.902 | 0.905 | 0.910 | 0.905 | 0.003 | -| 80 | 0.900 | 0.899 | 0.903 | 0.901 | 0.001 | - - - - - - - diff --git a/docs/original/baseline_results/gtsrb_dlbd_results.md b/docs/original/baseline_results/gtsrb_dlbd_results.md deleted file mode 100644 index 40963fe47..000000000 --- a/docs/original/baseline_results/gtsrb_dlbd_results.md +++ /dev/null @@ -1,348 +0,0 @@ -# GTSRB Dirty-label Backdoor Baseline Evaluation - -## Bullet Hole Trigger - -### Undefended - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.000|0.000|0.000|0.000 |0.000 | -|0.01 |0.287|0.288|0.261|0.279 |0.012 | -|0.05 |0.557|0.685|0.465|0.569 |0.090 | -|0.1 |0.839|0.821|0.801|0.820 |0.016 | -|0.2 |0.914|0.889|0.926|0.910 |0.015 | -|0.3 |0.928|0.951|0.940|0.940 |0.009 | - -**Accuracy on Poisoned Test Data All Classes** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |- |- |- |- |- | -|0.01 |0.922|0.922|0.926|0.9233333333|0.002309401077| -|0.05 |0.909|0.906|0.895|0.9033333333|0.007371114796| -|0.1 |0.894|0.894|0.899|0.8956666667|0.002886751346| -|0.2 |0.89 |0.895|0.89 |0.8916666667|0.002886751346| -|0.3 |0.889|0.888|0.887|0.888 |0.001 | - -**Accuracy on Benign Test Data Source Class** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.983|0.975|0.922|0.960 |0.03315116891| -|0.01 |0.972|0.968|0.974|0.971 |0.003055050463| -|0.05 |0.971|0.963|0.949|0.961 |0.01113552873| -|0.1 |0.961|0.958|0.979|0.966 |0.01135781669| -|0.2 |0.965|0.958|0.949|0.957 |0.008020806277| -|0.3 |0.963|0.963|0.946|0.957 |0.009814954576| - - - -### Random Filter - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.000|0.000|0.000|0.000 |0 | -|0.01 |0.103|0.268|0.031|0.134 |0.1215030864 | -|0.05 |0.314|0.724|0.667|0.568 |0.2220953249 | -|0.1 |0.844|0.607|0.783|0.745 |0.1230623148 | -|0.2 |0.892|0.9 |0.607|0.800 |0.166902167 | -|0.3 |0.957|0.953|0.897|0.936 |0.03354598833| - -**Accuracy on Poisoned Test Data All Classes** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |- |- |- |- |- | -|0.01 |0.904|0.918|0.863|0.895 |0.02858321186| -|0.05 |0.847|0.899|0.906|0.884 |0.03223352292| -|0.1 |0.893|0.888|0.9 |0.894 |0.006027713773| -|0.2 |0.888|0.883|0.845|0.872 |0.02351595203| -|0.3 |0.889|0.889|0.878|0.885 |0.006350852961| - -**Accuracy on Benign Test Data Source Class** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.964|0.982|0.964|0.970 |0.008 | -|0.01 |0.944|0.971|0.925|0.947 |0.019 | -|0.05 |0.879|0.968|0.974|0.940 |0.043 | -|0.1 |0.972|0.94 |0.963|0.958 |0.013 | -|0.2 |0.964|0.954|0.814|0.911 |0.068 | -|0.3 |0.958|0.96 |0.936|0.951 |0.011 | - - - -### Activation Clustering - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.000|0.000|0.000|0.000 |0 | -|0.01 |0.267|0.322|0.278|0.289 |0.02910326442| -|0.05 |0.718|0.668|0.686|0.691 |0.02532455988| -|0.1 |0.835|0.856|0.756|0.816 |0.05272886622| -|0.2 |0.919|0.668|0.925|0.837 |0.1466776511 | -|0.3 |0.919|0.918|0.653|0.830 |0.1532873119 | - -**Accuracy on Poisoned Test Data All Classes** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |- |- |- |- |- | -|0.01 |0.912|0.914|0.911|0.912 |0.001527525232| -|0.05 |0.887|0.892|0.896|0.892 |0.004509249753| -|0.1 |0.889|0.892|0.88 |0.887 |0.006244997998| -|0.2 |0.873|0.846|0.88 |0.866 |0.01795364401| -|0.3 |0.875|0.888|0.825|0.863 |0.03326158946| - -**Accuracy on Benign Test Data Source Class** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.974|0.976|0.868|0.939 |0.050 | -|0.01 |0.929|0.978|0.969|0.959 |0.021 | -|0.05 |0.965|0.94 |0.958|0.954 |0.011 | -|0.1 |0.953|0.963|0.931|0.949 |0.013 | -|0.2 |0.96 |0.858|0.958|0.925 |0.048 | -|0.3 |0.969|0.956|0.749|0.891 |0.101 | - - - -### Perfect Filter - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.000|0.000|0.000|0.000 |0 | -|0.01 |0.025|0.185|0.1 |0.103 |0.08005206639| -|0.05 |0.146|0.026|0.111|0.094 |0.06171169527| -|0.1 |0.138|0.082|0.057|0.092 |0.0414769012 | -|0.2 |0.135|0.124|0.146|0.135 |0.011 | -|0.3 |0.16 |0.165|0.081|0.135 |0.04712041313| - -**Accuracy on Poisoned Test Data All Classes** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |- |- |- |- |- | -|0.01 |0.873|0.93 |0.934|0.912 |0.03412232896| -|0.05 |0.926|0.876|0.934|0.912 |0.03143246729| -|0.1 |0.938|0.917|0.918|0.924 |0.0118462371 | -|0.2 |0.935|0.928|0.933|0.932 |0.003605551275| -|0.3 |0.931|0.931|0.938|0.933 |0.004041451884| - -**Accuracy on Benign Test Data Source Class** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.979|0.974|0.982|0.978 |0.003 | -|0.01 |0.919|0.981|0.975|0.958 |0.028 | -|0.05 |0.976|0.892|0.972|0.947 |0.039 | -|0.1 |0.976|0.956|0.961|0.964 |0.008 | -|0.2 |0.978|0.972|0.981|0.977 |0.004 | -|0.3 |0.969|0.974|0.979|0.974 |0.004 | - - - -### Spectral Signatures - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 | | | |0.000 | | -|0.01 | | | |0.268 | | -|0.05 | | | |0.562 | | -|0.1 | | | |0.819 | | -|0.2 | | | |0.823 | | -|0.3 | | | |0.915 | | - -**Accuracy on Poisoned Test Data All Classes** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 | | | |- | | -|0.01 | | | |0.9261810504| | -|0.05 | | | |0.9002639219| | -|0.1 | | | |0.8919503827| | -|0.2 | | | |0.8726576933| | -|0.3 | | | |0.8911850092| | - -**Accuracy on Benign Test Data Source Class** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 | | | |0.970 | | -|0.01 | | | |0.965 | | -|0.05 | | | |0.960 | | -|0.1 | | | |0.959 | | -|0.2 | | | |0.920 | | -|0.3 | | | |0.944 | | - - - - - - - - -## Peace Sign Trigger - -### Undefended - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.000|0.000|0.000|0.000 |0.000 | -|0.01 |0.590|0.772|0.868|0.743 |0.115 | -|0.05 |0.950|0.978|0.932|0.953 |0.019 | -|0.1 |0.981|0.986|0.982|0.983 |0.002 | -|0.2 |0.930|0.992|0.979|0.967 |0.027 | -|0.3 |0.999|0.996|0.999|0.998 |0.001 | - -**Accuracy on Poisoned Test Data All Classes** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |- |- |- |- |- | -|0.01 |0.901|0.897|0.89 |0.896 |0.005567764363| -|0.05 |0.89 |0.891|0.893|0.8913333333|0.001527525232| -|0.1 |0.886|0.885|0.888|0.8863333333|0.001527525232| -|0.2 |0.861|0.887|0.87 |0.8726666667|0.01320353488| -|0.3 |0.887|0.887|0.885|0.8863333333|0.001154700538| - -**Accuracy on Benign Test Data Source Class** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.975|0.942|0.965|0.961 |0.01692138686| -|0.01 |0.972|0.981|0.969|0.974 |0.006244997998| -|0.05 |0.979|0.974|0.983|0.979 |0.004509249753| -|0.1 |0.978|0.969|0.982|0.976 |0.006658328118| -|0.2 |0.924|0.969|0.951|0.948 |0.02264950331| -|0.3 |0.967|0.971|0.971|0.970 |0.002309401077| - - - -### Random Filter - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.000|0.000|0.000|0.000 |0.000 | -|0.01 |0.689|0.746|0.569|0.668 |0.074 | -|0.05 |0.951|0.956|0.351|0.753 |0.284 | -|0.1 |0.985|0.967|0.985|0.979 |0.008 | -|0.2 |0.872|0.354|0.988|0.738 |0.276 | -|0.3 |1 |0.997|0.996|0.998 |0.002 | - -**Accuracy on Poisoned Test Data All Classes** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |- |- |- |- |- | -|0.01 |0.903|0.897|0.886|0.895 |0.008621678104| -|0.05 |0.889|0.89 |0.87 |0.883 |0.01126942767| -|0.1 |0.884|0.888|0.89 |0.887 |0.003055050463| -|0.2 |0.82 |0.858|0.889|0.856 |0.03455912808| -|0.3 |0.844|0.885|0.885|0.871 |0.02367136104| - -**Accuracy on Benign Test Data Source Class** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.929|0.965|0.912|0.935 |0.02706165799| -|0.01 |0.975|0.975|0.949|0.966 |0.015011107 | -|0.05 |0.982|0.968|0.925|0.958 |0.02970409624| -|0.1 |0.965|0.967|0.978|0.970 |0.007 | -|0.2 |0.828|0.824|0.982|0.878 |0.09008884504| -|0.3 |0.9 |0.968|0.975|0.948 |0.04142865353| - - - -### Activation Clustering - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.000|0.000|0.000|0.000 |0.000 | -|0.01 |0.644|0.483|0.364|0.497 |0.115 | -|0.05 |0.938|0.947|0.772|0.886 |0.080 | -|0.1 |0.974|0.979|0.978|0.977 |0.002 | -|0.2 |0.979|0.988|0.989|0.985 |0.004 | -|0.3 |1 |0.996|0.969|0.988 |0.014 | - -**Accuracy on Poisoned Test Data All Classes** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |- |- |- |- |- | -|0.01 |0.893|0.866|0.781|0.847 |0.05844940832| -|0.05 |0.876|0.882|0.864|0.874 |0.00916515139| -|0.1 |0.88 |0.882|0.874|0.879 |0.004163331999| -|0.2 |0.878|0.879|0.877|0.878 |0.001 | -|0.3 |0.873|0.882|0.848|0.868 |0.01761628035| - -**Accuracy on Benign Test Data Source Class** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.971|0.969|0.964|0.968 |0.003 | -|0.01 |0.975|0.94 |0.968|0.961 |0.015 | -|0.05 |0.974|0.965|0.933|0.957 |0.018 | -|0.1 |0.965|0.969|0.938|0.957 |0.014 | -|0.2 |0.969|0.968|0.978|0.972 |0.004 | -|0.3 |0.904|0.963|0.899|0.922 |0.029 | - - - -### Perfect Filter - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.000|0.000|0.000|0.000 |0.000 | -|0.01 |0.032|0.221|0.158|0.137 |0.079 | -|0.05 |0.076|0.019|0.039|0.045 |0.024 | -|0.1 |0.024|0.157|0.036|0.072 |0.060 | -|0.2 |0.35 |0.138|0.196|0.228 |0.089 | -|0.3 |0.189|0.074|0.097|0.120 |0.050 | - -**Accuracy on Poisoned Test Data All Classes** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |- |- |- |- |- | -|0.01 |0.921|0.91 |0.911|0.914 |0.00608276253| -|0.05 |0.848|0.881|0.925|0.885 |0.03863073043| -|0.1 |0.906|0.854|0.922|0.894 |0.03555277767| -|0.2 |0.914|0.917|0.909|0.913 |0.004041451884| -|0.3 |0.91 |0.92 |0.911|0.914 |0.005507570547| - -**Accuracy on Benign Test Data Source Class** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 |0.979|0.986|0.981|0.982 |0.003 | -|0.01 |0.981|0.982|0.974|0.979 |0.004 | -|0.05 |0.881|0.907|0.972|0.920 |0.038 | -|0.1 |0.979|0.904|0.967|0.950 |0.033 | -|0.2 |0.968|0.981|0.971|0.973 |0.006 | -|0.3 |0.971|0.972|0.958|0.967 |0.006 | - - - -### Spectral Signatures - -**Attack Success Rate** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 | | | |0.000 | | -|0.01 | | | |0.270 | | -|0.05 | | | |0.774 | | -|0.1 | | | |0.756 | | -|0.2 | | | |0.983 | | -|0.3 | | | |0.992 | | - -**Accuracy on Poisoned Test Data All Classes** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 | | | |- | | -|0.01 | | | |0.8585114806| | -|0.05 | | | |0.8861177092| | -|0.1 | | | |0.8614410135| | -|0.2 | | | |0.8864080232| | -|0.3 | | | |0.8678807073| | - -**Accuracy on Benign Test Data Source Class** -|Poison Ratio |Run 1|Run 2|Run 3|Mean |Std | -|-------------------|-----|-----|-----|------------|-------------| -|0 | | | |0.972 | | -|0.01 | | | |0.921 | | -|0.05 | | | |0.949 | | -|0.1 | | | |0.913 | | -|0.2 | | | |0.966 | | -|0.3 | | | |0.944 | | diff --git a/docs/original/baseline_results/gtsrb_witches_brew_results.md b/docs/original/baseline_results/gtsrb_witches_brew_results.md deleted file mode 100644 index a4b83d85e..000000000 --- a/docs/original/baseline_results/gtsrb_witches_brew_results.md +++ /dev/null @@ -1,3 +0,0 @@ -# GTSRB Witches' Brew Baseline Evaluation - -Coming soon \ No newline at end of file diff --git a/docs/original/baseline_results/librispeech_asr_results.md b/docs/original/baseline_results/librispeech_asr_results.md deleted file mode 100644 index bf830f08e..000000000 --- a/docs/original/baseline_results/librispeech_asr_results.md +++ /dev/null @@ -1,49 +0,0 @@ -# Audio ASR Baseline Evaluation: - - -## Deep Speech 2 - -Table 1 (Results obtained using Armory v0.13.3) - -| Attack | Targeted | Budget | Benign WER (Undefended) | Adversarial WER (Undefended) | Benign WER (Defended) | Adversarial WER (Defended) | Test Size | -|--------------------------|----------|----------------|-------------------------|------------------------------|-----------------------|----------------------------|-----------| -| Imperceptible ASR | yes | max_iter_1=100 | 0.10 | 0.63 | 0.13 | N/A* | 320 | -| Imperceptible ASR | yes | max_iter_1=200 | 0.10 | 0.20 | 0.13 | N/A | 320 | -| Imperceptible ASR | yes | max_iter_1=400 | 0.10 | 0.11 | 0.13 | N/A | 320 | -| Kenansville | no | snr=20dB | 0.10 | 0.27 | 0.13 | 0.36 | 1000 | -| Kenansville | no | snr=30dB | 0.10 | 0.11 | 0.13 | 0.17 | 1000 | -| Kenansville | no | snr=40dB | 0.10 | 0.10 | 0.13 | 0.13 | 1000 | -| PGD (single channel) | no | snr=20dB | 0.10 | 0.46 | 0.13 | 0.53 | 100 | -| PGD (single channel) | no | snr=30dB | 0.10 | 0.46 | 0.13 | 0.50 | 100 | -| PGD (single channel) | no | snr=40dB | 0.10 | 0.33 | 0.13 | 0.36 | 100 | -| PGD (single channel)* | yes | snr=20dB | 0.11 | 1.03 | 0.15 | 1.01 | 100 | -| PGD (single channel)* | yes | snr=30dB | 0.11 | 1.02 | 0.15 | 0.99 | 100 | -| PGD (single channel)* | yes | snr=40dB | 0.11 | 0.88 | 0.15 | 0.84 | 100 | -| PGD (multiple channels) | no | snr=20dB | 0.13 | 0.96 | N/A | N/A | 100 | -| PGD (multiple channels) | no | snr=30dB | 0.13 | 0.59 | N/A | N/A | 100 | -| PGD (multiple channels) | no | snr=40dB | 0.13 | 0.38 | N/A | N/A | 100 | -| PGD (multiple channels)* | yes | snr=20dB | 0.13 | 0.99 | N/A | N/A | 100 | -| PGD (multiple channels)* | yes | snr=30dB | 0.13 | 0.92 | N/A | N/A | 100 | -| PGD (multiple channels)* | yes | snr=40dB | 0.13 | 0.75 | N/A | N/A | 100 | - -* \*Targeted attack, where a random target phrase of similar length as the ground truth, was applied but WER wrt the ground truth was calculated - -Find reference baseline configurations [here](https://github.com/twosixlabs/armory/tree/8eb10ac43bf4382d69625d8cef8a3e8cb23d0318/scenario_configs) -* Missing defended baseline is due to current incompatibility of the attack and defense. - -Table 2 (Results are obtained using Armory v0.15.2) - -| Attack | Targeted | Budget | Attack Parameters | Entailment/Contradiction/Neutral Rates (Benign Undefended) | Number of Entailment/Contradiction/Neutral Rates (Adversarial Undefended) | Entailment/Contradiction/Neutral Rates (Benign Defended) | Entailment/Contradiction/Neutral Rates (Adversarial Defended) | Test Size | -|:------:|:--------:|:--------:|:---------------------------:|:----------------------------------------------------------:|:-------------------------------------------------------------------------:|:--------------------------------------------------------:|:-------------------------------------------------------------:|:---------:| -| PGD* | yes | snr=20dB | eps_step=0.05, max_iter=500 | 0.95/0.05/0.00 | 0.01/0.98/0.01 | 0.93/0.07/0.00 | 0.02/0.96/0.02 | 100 | -| PGD* | yes | snr=30dB | eps_step=0.03, max_iter=500 | 0.95/0.05/0.00 | 0.04/0.95/0.01 | 0.93/0.07/0.00 | 0.19/0.79/0.02 | 100 | -| PGD* | yes | snr=40dB | eps_step=0.01, max_iter=500 | 0.95/0.05/0.00 | 0.43/0.53/0.04 | 0.93/0.07/0.00 | 0.66/0.34/0.00 | 100 | - -* \*Targeted attack, where contradictory target phrases are generated from ground truth phrases by changing a few key words (e.g., target phrase: `he is a bad person`; ground truth phrase: `he is a good person`) - -Find reference baseline configurations [here](https://github.com/twosixlabs/armory/tree/master/scenario_configs/eval5/asr_librispeech) - - -## HuBERT - -Coming soon \ No newline at end of file diff --git a/docs/original/baseline_results/librispeech_audio_classification_results.md b/docs/original/baseline_results/librispeech_audio_classification_results.md deleted file mode 100644 index 008bd6f19..000000000 --- a/docs/original/baseline_results/librispeech_audio_classification_results.md +++ /dev/null @@ -1,3 +0,0 @@ -# LibriSpeech Audio Classification Baseline Evaluation - -Coming soon \ No newline at end of file diff --git a/docs/original/baseline_results/resisc45_results.md b/docs/original/baseline_results/resisc45_results.md deleted file mode 100644 index c826b11e5..000000000 --- a/docs/original/baseline_results/resisc45_results.md +++ /dev/null @@ -1,14 +0,0 @@ -# RESISC-45 Image Classification Baseline Evaluation - -* **Baseline Model Performance: (results obtained using Armory < v0.10)** - * Baseline Clean Top-1 Accuracy: 93% - * Baseline Attacked (Universal Perturbation) Top-1 Accuracy: 6% - * Baseline Attacked (Universal Patch) Top-1 Accuracy: 23% -* **Baseline Defense Performance: (results obtained using Armory < v0.10)** -Baseline defense is art_experimental.defences.JpegCompressionNormalized(clip_values=(0.0, 1.0), quality=50, channel_index=3, apply_fit=False, -apply_predict=True, means=[0.36386173189316956, 0.38118692953271804, 0.33867067558870334], stds=[0.20350874, 0.18531173, 0.18472934]) - see -resisc45_baseline_densenet121_adversarial.json for example usage. -Baseline defense performance is evaluated for a grey-box attack: adversarial examples generated on undefended baseline model evaluated on defended model. - * Baseline Clean Top-1 Accuracy: 92% - * Baseline Attacked (Universal Perturbation) Top-1 Accuracy: 40% - * Baseline Attacked (Universal Patch) Top-1 Accuracy: 21% \ No newline at end of file diff --git a/docs/original/baseline_results/resisc_clbd_results.md b/docs/original/baseline_results/resisc_clbd_results.md deleted file mode 100644 index 4cd8d27af..000000000 --- a/docs/original/baseline_results/resisc_clbd_results.md +++ /dev/null @@ -1,147 +0,0 @@ -# RESISC-10 Clean-label Backdoor Baseline Evaluation - -## Letter A Trigger - -### Undefended - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | 0.350 | 0.400 | 0.460 | 0.403 | 0.045 | -| 20 | 0.330 | 0.350 | 0.400 | 0.360 | 0.029 | -| 50 | 0.310 | 0.190 | 0.450 | 0.317 | 0.106 | -| 80 | 0.440 | 0.460 | 0.340 | 0.413 | 0.052 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | 0.428 | 0.467 | 0.454 | 0.450 | 0.016 | -| 20 | 0.464 | 0.431 | 0.447 | 0.447 | 0.013 | -| 50 | 0.388 | 0.390 | 0.468 | 0.415 | 0.037 | -| 80 | 0.452 | 0.444 | 0.379 | 0.425 | 0.033 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.210 | 0.330 | 0.330 | 0.290 | 0.057 | -| 50 | 0.490 | 0.620 | 0.730 | 0.613 | 0.098 | -| 80 | 0.660 | 0.760 | 0.810 | 0.743 | 0.062 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.465 | 0.431 | 0.440 | 0.445 | 0.014 | -| 50 | 0.375 | 0.388 | 0.434 | 0.399 | 0.025 | -| 80 | 0.421 | 0.417 | 0.356 | 0.398 | 0.030 | - - -### Random Filter - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | 0.300 | 0.330 | 0.280 | 0.303 | 0.021 | -| 20 | 0.350 | 0.360 | 0.390 | 0.367 | 0.017 | -| 50 | 0.300 | 0.480 | 0.240 | 0.340 | 0.102 | -| 80 | 0.560 | 0.400 | 0.400 | 0.453 | 0.075 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | 0.459 | 0.412 | 0.378 | 0.416 | 0.033 | -| 20 | 0.482 | 0.401 | 0.352 | 0.412 | 0.054 | -| 50 | 0.429 | 0.399 | 0.393 | 0.407 | 0.016 | -| 80 | 0.430 | 0.449 | 0.480 | 0.453 | 0.021 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.270 | 0.220 | 0.150 | 0.213 | 0.049 | -| 50 | 0.430 | 0.640 | 0.600 | 0.557 | 0.091 | -| 80 | 0.730 | 0.690 | 0.810 | 0.743 | 0.050 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.481 | 0.398 | 0.351 | 0.410 | 0.054 | -| 50 | 0.426 | 0.367 | 0.374 | 0.389 | 0.026 | -| 80 | 0.390 | 0.422 | 0.452 | 0.421 | 0.025 | - - - -### Activation Clustering - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | 0.270 | 0.310 | 0.320 | 0.300 | 0.022 | -| 20 | 0.050 | 0.380 | 0.320 | 0.250 | 0.144 | -| 50 | 0.250 | 0.240 | 0.310 | 0.267 | 0.031 | -| 80 | 0.120 | 0.360 | 0.390 | 0.290 | 0.121 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | 0.338 | 0.336 | 0.414 | 0.363 | 0.036 | -| 20 | 0.328 | 0.345 | 0.350 | 0.341 | 0.009 | -| 50 | 0.360 | 0.300 | 0.339 | 0.333 | 0.025 | -| 80 | 0.315 | 0.343 | 0.396 | 0.351 | 0.034 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.400 | 0.170 | 0.210 | 0.260 | 0.100 | -| 50 | 0.640 | 0.310 | 0.280 | 0.410 | 0.163 | -| 80 | 0.800 | 0.600 | 0.200 | 0.533 | 0.249 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.333 | 0.348 | 0.355 | 0.345 | 0.009 | -| 50 | 0.351 | 0.293 | 0.347 | 0.330 | 0.026 | -| 80 | 0.310 | 0.326 | 0.390 | 0.342 | 0.035 | - - -### Perfect Filter - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | 0.300 | 0.510 | 0.180 | 0.330 | 0.136 | -| 20 | 0.340 | 0.410 | 0.510 | 0.420 | 0.070 | -| 50 | 0.440 | 0.520 | 0.420 | 0.460 | 0.043 | -| 80 | 0.400 | 0.500 | 0.380 | 0.427 | 0.052 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | 0.403 | 0.490 | 0.343 | 0.412 | 0.060 | -| 20 | 0.406 | 0.427 | 0.437 | 0.423 | 0.013 | -| 50 | 0.497 | 0.474 | 0.428 | 0.466 | 0.029 | -| 80 | 0.448 | 0.428 | 0.418 | 0.431 | 0.012 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.050 | 0.130 | 0.050 | 0.077 | 0.038 | -| 50 | 0.110 | 0.060 | 0.080 | 0.083 | 0.021 | -| 80 | 0.080 | 0.060 | 0.050 | 0.063 | 0.012 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 |run3 | mean | std | -|--------------|------|------|-----|------|-----| -| 0 | - |- |- |- |- | -| 20 | 0.405 | 0.421 | 0.432 | 0.419 | 0.011 | -| 50 | 0.497 | 0.477 | 0.421 | 0.465 | 0.032 | -| 80 | 0.451 | 0.426 | 0.421 | 0.433 | 0.013 | - - - - diff --git a/docs/original/baseline_results/resisc_dlbd_results.md b/docs/original/baseline_results/resisc_dlbd_results.md deleted file mode 100644 index 13dbdd353..000000000 --- a/docs/original/baseline_results/resisc_dlbd_results.md +++ /dev/null @@ -1,165 +0,0 @@ -# RESISC-10 Dirty-label Backdoor Baseline Evaluation - -## Letter A Trigger - -### Undefended - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.680 | 0.610 | 0.645 | 0.035 | -| 05 | 0.680 | 0.640 | 0.660 | 0.020 | -| 10 | 0.550 | 0.630 | 0.590 | 0.040 | -| 20 | 0.550 | 0.590 | 0.570 | 0.020 | -| 30 | 0.520 | 0.700 | 0.610 | 0.090 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.813 | 0.763 | 0.788 | 0.025 | -| 05 | 0.793 | 0.772 | 0.782 | 0.011 | -| 10 | 0.779 | 0.769 | 0.774 | 0.005 | -| 20 | 0.761 | 0.779 | 0.770 | 0.009 | -| 30 | 0.750 | 0.781 | 0.766 | 0.016 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.170 | 0.150 | 0.160 | 0.010 | -| 05 | 0.120 | 0.220 | 0.170 | 0.050 | -| 10 | 0.230 | 0.360 | 0.295 | 0.065 | -| 20 | 0.340 | 0.610 | 0.475 | 0.135 | -| 30 | 0.790 | 0.680 | 0.735 | 0.055 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.810 | 0.759 | 0.784 | 0.026 | -| 05 | 0.790 | 0.766 | 0.778 | 0.012 | -| 10 | 0.776 | 0.756 | 0.766 | 0.010 | -| 20 | 0.752 | 0.745 | 0.748 | 0.004 | -| 30 | 0.707 | 0.728 | 0.718 | 0.011 | - - - -### Random Filter - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.610 | 0.680 | 0.645 | 0.035 | -| 05 | 0.580 | 0.620 | 0.600 | 0.020 | -| 10 | 0.630 | 0.670 | 0.650 | 0.020 | -| 20 | 0.560 | 0.620 | 0.590 | 0.030 | -| 30 | 0.510 | 0.420 | 0.465 | 0.045 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.744 | 0.797 | 0.770 | 0.027 | -| 05 | 0.756 | 0.761 | 0.758 | 0.003 | -| 10 | 0.789 | 0.785 | 0.787 | 0.002 | -| 20 | 0.781 | 0.762 | 0.772 | 0.010 | -| 30 | 0.749 | 0.746 | 0.748 | 0.002 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.180 | 0.130 | 0.155 | 0.025 | -| 05 | 0.260 | 0.200 | 0.230 | 0.030 | -| 10 | 0.220 | 0.540 | 0.380 | 0.160 | -| 20 | 0.700 | 0.350 | 0.525 | 0.175 | -| 30 | 0.800 | 0.720 | 0.760 | 0.040 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.743 | 0.797 | 0.770 | 0.027 | -| 05 | 0.750 | 0.759 | 0.754 | 0.005 | -| 10 | 0.783 | 0.746 | 0.764 | 0.019 | -| 20 | 0.738 | 0.745 | 0.742 | 0.004 | -| 30 | 0.704 | 0.715 | 0.710 | 0.006 | - - - -### Activation Clustering - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.530 | 0.530 | 0.530 | 0.000 | -| 05 | 0.560 | 0.570 | 0.565 | 0.005 | -| 10 | 0.580 | 0.290 | 0.435 | 0.145 | -| 20 | 0.510 | 0.660 | 0.585 | 0.075 | -| 30 | 0.520 | 0.400 | 0.460 | 0.060 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.681 | 0.722 | 0.702 | 0.020 | -| 05 | 0.677 | 0.705 | 0.691 | 0.014 | -| 10 | 0.710 | 0.565 | 0.637 | 0.073 | -| 20 | 0.735 | 0.673 | 0.704 | 0.031 | -| 30 | 0.670 | 0.687 | 0.679 | 0.009 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.150 | 0.210 | 0.180 | 0.030 | -| 05 | 0.100 | 0.180 | 0.140 | 0.040 | -| 10 | 0.190 | 0.520 | 0.355 | 0.165 | -| 20 | 0.320 | 0.100 | 0.210 | 0.110 | -| 30 | 0.220 | 0.450 | 0.335 | 0.115 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.681 | 0.720 | 0.701 | 0.019 | -| 05 | 0.677 | 0.705 | 0.691 | 0.014 | -| 10 | 0.707 | 0.563 | 0.635 | 0.072 | -| 20 | 0.723 | 0.669 | 0.696 | 0.027 | -| 30 | 0.667 | 0.677 | 0.672 | 0.005 | - - - -### Perfect Filter - -**Accuracy on Benign Test Data Source Class** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.660 | 0.710 | 0.685 | 0.025 | -| 05 | 0.630 | 0.670 | 0.650 | 0.020 | -| 10 | 0.600 | 0.610 | 0.605 | 0.005 | -| 20 | 0.640 | 0.650 | 0.645 | 0.005 | -| 30 | 0.630 | 0.540 | 0.585 | 0.045 | - -**Accuracy on Benign Test Data All Classes** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.798 | 0.756 | 0.777 | 0.021 | -| 05 | 0.756 | 0.792 | 0.774 | 0.018 | -| 10 | 0.779 | 0.792 | 0.786 | 0.007 | -| 20 | 0.772 | 0.793 | 0.782 | 0.011 | -| 30 | 0.794 | 0.770 | 0.782 | 0.012 | - -**Attack Success Rate** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.130 | 0.100 | 0.115 | 0.015 | -| 05 | 0.200 | 0.070 | 0.135 | 0.065 | -| 10 | 0.220 | 0.150 | 0.185 | 0.035 | -| 20 | 0.210 | 0.140 | 0.175 | 0.035 | -| 30 | 0.120 | 0.200 | 0.160 | 0.040 | - -**Accuracy on Poisoned Test Data All Classes** -| Poison Ratio | run1 | run2 | mean | std | -|--------------|------|------|------|-----| -| 01 | 0.798 | 0.754 | 0.776 | 0.022 | -| 05 | 0.755 | 0.789 | 0.772 | 0.017 | -| 10 | 0.778 | 0.792 | 0.785 | 0.007 | -| 20 | 0.770 | 0.791 | 0.780 | 0.011 | -| 30 | 0.793 | 0.769 | 0.781 | 0.012 | - - - - diff --git a/docs/original/baseline_results/so2sat_results.md b/docs/original/baseline_results/so2sat_results.md deleted file mode 100644 index 001b5a079..000000000 --- a/docs/original/baseline_results/so2sat_results.md +++ /dev/null @@ -1,14 +0,0 @@ -# So2Sat Multimodal Image Classification Baseline Evaluation - -Results obtained using Armory v0.13.3 - -| Attacked Modality | Patch Ratio | Benign Accuracy (Undefended) | Adversarial Accuracy (Undefended) | Benign Accuracy (Defended) | Adversarial Accuracy (Defended) | Test Size | -|-------------------|-------------|------------------------------|-----------------------------------|----------------------------|---------------------------------|-----------| -| EO | 0.05 | 0.583 | 0.00 | 0.556 | 0.00 | 1000 | -| EO | 0.10 | 0.583 | 0.00 | 0.556 | 0.00 | 1000 | -| EO | 0.15 | 0.583 | 0.00 | 0.556 | 0.00 | 1000 | -| SAR | 0.05 | 0.583 | 0.00 | 0.556 | 0.00 | 1000 | -| SAR | 0.10 | 0.583 | 0.00 | 0.556 | 0.00 | 1000 | -| SAR | 0.15 | 0.583 | 0.00 | 0.556 | 0.00 | 1000 | - -Find reference baseline configurations [here](https://github.com/twosixlabs/armory/tree/8eb10ac43bf4382d69625d8cef8a3e8cb23d0318/scenario_configs) diff --git a/docs/original/baseline_results/speech_commands_poison_results.md b/docs/original/baseline_results/speech_commands_poison_results.md deleted file mode 100644 index 277b1a6a0..000000000 --- a/docs/original/baseline_results/speech_commands_poison_results.md +++ /dev/null @@ -1,280 +0,0 @@ -# Speech Commands Dirty-label Backdoor Baseline Evaluation - -**All tables are the mean of 3 runs.** Results obtained with Armory 0.16.1 December 2022. - -Source class: 11 - -Target class: 2 - -Note: Because the source class has about 54K examples compared to the 1-3K in the other classes, -we evaluate with lower poison percentages compared to other poison evaluations on more balanced datasets. After 0 poison, the lowest fraction of poison we test is 0.1%. - -## Whistle Trigger - -### Undefended - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.928 | 0.989 | - | - | -| 0.1 | 0.942 | 0.989 | 0.873 | 0.839 | -| 0.5 | 0.935 | 0.989 | 0.858 | 0.937 | -| 01 | 0.941 | 0.981 | 0.861 | 0.975 | -| 05 | 0.938 | 0.982 | 0.857 | 0.988 | -| 10 | 0.937 | 0.979 | 0.855 | 0.996 | -| 20 | 0.940 | 0.975 | 0.859 | 0.993 | -| 30 | 0.937 | 0.980 | 0.856 | 0.995 | - - -### Random Filter - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.925 | 0.984 | - | - | -| 0.1 | 0.928 | 0.983 | 0.867 | 0.755 | -| 0.5 | 0.928 | 0.980 | 0.852 | 0.931 | -| 01 | 0.931 | 0.977 | 0.853 | 0.955 | -| 05 | 0.937 | 0.980 | 0.856 | 0.986 | -| 10 | 0.928 | 0.971 | 0.848 | 0.993 | -| 20 | 0.934 | 0.978 | 0.853 | 0.994 | -| 30 | 0.923 | 0.988 | 0.841 | 0.994 | - - -### Perfect Filter - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.936 | 0.977 | - | - | -| 0.1 | 0.938 | 0.986 | 0.938 | 0.003 | -| 0.5 | 0.933 | 0.979 | 0.933 | 0.001 | -| 01 | 0.944 | 0.986 | 0.944 | 0.003 | -| 05 | 0.945 | 0.984 | 0.945 | 0.002 | -| 10 | 0.944 | 0.984 | 0.943 | 0.006 | -| 20 | 0.937 | 0.980 | 0.937 | 0.001 | -| 30 | 0.937 | 0.976 | 0.937 | 0.008 | - - -### Activation Clustering - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.931 | 0.971 | - | - | -| 0.1 | 0.936 | 0.971 | 0.874 | 0.766 | -| 0.5 | 0.936 | 0.986 | 0.857 | 0.960 | -| 01 | 0.934 | 0.972 | 0.854 | 0.982 | -| 05 | 0.939 | 0.986 | 0.858 | 0.987 | -| 10 | 0.942 | 0.986 | 0.860 | 0.992 | -| 20 | 0.937 | 0.988 | 0.855 | 0.995 | -| 30 | 0.949 | 0.980 | 0.868 | 0.994 | - - -### Spectral Signatures - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.925 | 0.990 | - | - | -| 0.1 | 0.931 | 0.967 | 0.931 | 0.012 | -| 0.5 | 0.938 | 0.980 | 0.913 | 0.310 | -| 01 | 0.844 | 0.982 | 0.815 | 0.328 | -| 05 | 0.933 | 0.979 | 0.898 | 0.417 | -| 10 | 0.913 | 0.977 | 0.906 | 0.087 | -| 20 | 0.934 | 0.982 | 0.865 | 0.850 | -| 30 | 0.925 | 0.982 | 0.871 | 0.662 | - - - -## Clapping Trigger - -### Undefended - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.937 | 0.983 | - | - | -| 0.1 | 0.942 | 0.984 | 0.868 | 0.905 | -| 0.5 | 0.937 | 0.989 | 0.857 | 0.973 | -| 01 | 0.922 | 0.982 | 0.842 | 0.983 | -| 05 | 0.943 | 0.989 | 0.860 | 0.995 | -| 10 | 0.932 | 0.977 | 0.851 | 0.997 | -| 20 | 0.944 | 0.983 | 0.862 | 0.999 | -| 30 | 0.942 | 0.983 | 0.860 | 0.999 | - - -### Random Filter - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.936 | 0.983 | - | - | -| 0.1 | 0.932 | 0.982 | 0.871 | 0.745 | -| 0.5 | 0.929 | 0.989 | 0.849 | 0.970 | -| 01 | 0.919 | 0.980 | 0.840 | 0.963 | -| 05 | 0.921 | 0.981 | 0.839 | 0.995 | -| 10 | 0.948 | 0.985 | 0.866 | 0.992 | -| 20 | 0.940 | 0.974 | 0.859 | 0.996 | -| 30 | 0.934 | 0.985 | 0.852 | 0.998 | - - -### Perfect Filter - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.932 | 0.985 | - | - | -| 0.1 | 0.936 | 0.961 | 0.936 | 0.011 | -| 0.5 | 0.940 | 0.980 | 0.939 | 0.002 | -| 01 | 0.937 | 0.971 | 0.936 | 0.008 | -| 05 | 0.933 | 0.982 | 0.933 | 0.006 | -| 10 | 0.941 | 0.981 | 0.941 | 0.001 | -| 20 | 0.937 | 0.975 | 0.937 | 0.004 | -| 30 | 0.937 | 0.981 | 0.937 | 0.002 | - - -### Activation Clustering - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.934 | 0.979 | - | - | -| 0.1 | 0.889 | 0.922 | 0.819 | 0.900 | -| 0.5 | 0.941 | 0.985 | 0.863 | 0.952 | -| 01 | 0.933 | 0.988 | 0.852 | 0.984 | -| 05 | 0.932 | 0.983 | 0.851 | 0.991 | -| 10 | 0.940 | 0.987 | 0.858 | 0.998 | -| 20 | 0.938 | 0.983 | 0.856 | 0.998 | -| 30 | 0.936 | 0.984 | 0.854 | 0.999 | - - -### Spectral Signatures - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.928 | 0.963 | - | - | -| 0.1 | 0.929 | 0.975 | 0.888 | 0.499 | -| 0.5 | 0.924 | 0.975 | 0.901 | 0.291 | -| 01 | 0.904 | 0.962 | 0.877 | 0.354 | -| 05 | 0.940 | 0.983 | 0.939 | 0.011 | -| 10 | 0.921 | 0.967 | 0.872 | 0.597 | -| 20 | 0.936 | 0.981 | 0.908 | 0.339 | -| 30 | 0.929 | 0.952 | 0.906 | 0.313 | - - - -## Dog Clicker Trigger - -### Undefended - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.939 | 0.985 | - | - | -| 0.1 | 0.923 | 0.989 | 0.887 | 0.440 | -| 0.5 | 0.930 | 0.983 | 0.856 | 0.905 | -| 01 | 0.941 | 0.985 | 0.862 | 0.955 | -| 05 | 0.940 | 0.989 | 0.859 | 0.983 | -| 10 | 0.950 | 0.981 | 0.869 | 0.995 | - - -### Random Filter - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.932 | 0.973 | - | - | -| 0.1 | 0.931 | 0.980 | 0.900 | 0.382 | -| 0.5 | 0.931 | 0.980 | 0.858 | 0.885 | -| 01 | 0.909 | 0.972 | 0.833 | 0.933 | -| 05 | 0.930 | 0.984 | 0.850 | 0.979 | -| 10 | 0.941 | 0.974 | 0.876 | 0.812 | - - -### Perfect Filter - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.918 | 0.993 | - | - | -| 0.1 | 0.931 | 0.979 | 0.931 | 0.001 | -| 0.5 | 0.946 | 0.976 | 0.946 | 0.006 | -| 01 | 0.934 | 0.983 | 0.934 | 0.001 | -| 05 | 0.944 | 0.979 | 0.944 | 0.002 | -| 10 | 0.936 | 0.980 | 0.936 | 0.005 | - - -### Activation Clustering - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.942 | 0.975 | - | - | -| 0.1 | 0.893 | 0.989 | 0.858 | 0.415 | -| 0.5 | 0.929 | 0.985 | 0.857 | 0.884 | -| 01 | 0.939 | 0.982 | 0.863 | 0.928 | -| 05 | 0.931 | 0.979 | 0.850 | 0.984 | -| 10 | 0.936 | 0.960 | 0.857 | 0.994 | - - -### Spectral Signatures - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.923 | 0.980 | - | - | -| 0.1 | 0.926 | 0.983 | 0.921 | 0.059 | -| 0.5 | 0.906 | 0.984 | 0.870 | 0.433 | -| 01 | 0.934 | 0.976 | 0.884 | 0.623 | -| 05 | 0.901 | 0.980 | 0.901 | 0.004 | -| 10 | 0.927 | 0.976 | 0.897 | 0.372 | - - - -## Car Horn Trigger - -### Undefended - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.910 | 0.916 | - | - | -| 001 | 0.932 | 0.988 | 0.870 | 0.749 | -| 005 | 0.937 | 0.987 | 0.859 | 0.947 | -| 01 | 0.935 | 0.984 | 0.857 | 0.953 | -| 05 | 0.940 | 0.985 | 0.860 | 0.975 | -| 10 | 0.933 | 0.989 | 0.851 | 0.985 | - - -### Random Filter - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.922 | 0.984 | - | - | -| 001 | 0.928 | 0.981 | 0.878 | 0.618 | -| 005 | 0.922 | 0.960 | 0.847 | 0.932 | -| 01 | 0.945 | 0.973 | 0.867 | 0.958 | -| 05 | 0.929 | 0.987 | 0.849 | 0.967 | -| 10 | 0.933 | 0.984 | 0.854 | 0.973 | - - -### Perfect Filter - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.948 | 0.987 | - | - | -| 001 | 0.940 | 0.985 | 0.939 | 0.008 | -| 005 | 0.940 | 0.971 | 0.940 | 0.001 | -| 01 | 0.936 | 0.981 | 0.936 | 0.005 | -| 05 | 0.913 | 0.986 | 0.913 | 0.001 | -| 10 | 0.940 | 0.970 | 0.940 | 0.003 | - - -### Activation Clustering - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.929 | 0.984 | - | - | -| 001 | 0.928 | 0.986 | 0.865 | 0.765 | -| 005 | 0.921 | 0.984 | 0.846 | 0.914 | -| 01 | 0.942 | 0.984 | 0.865 | 0.948 | -| 05 | 0.925 | 0.970 | 0.846 | 0.988 | -| 10 | 0.932 | 0.982 | 0.851 | 0.985 | - - -### Spectral Signatures - -| Poison Percentage | Benign all classes | Benign source class | Adv. all classes | Attack success rate | -| ------- | ------- | ------- | ------- | ------- | -| 00 | 0.935 | 0.988 | - | - | -| 001 | 0.930 | 0.971 | 0.903 | 0.322 | -| 005 | 0.928 | 0.981 | 0.913 | 0.181 | -| 01 | 0.928 | 0.980 | 0.917 | 0.141 | -| 05 | 0.933 | 0.983 | 0.893 | 0.484 | -| 10 | 0.935 | 0.976 | 0.933 | 0.026 | diff --git a/docs/original/baseline_results/ucf101_results.md b/docs/original/baseline_results/ucf101_results.md deleted file mode 100644 index 0b8934eca..000000000 --- a/docs/original/baseline_results/ucf101_results.md +++ /dev/null @@ -1,23 +0,0 @@ -# UCF101 Video Classification Baseline Evaluation - -Results obtained using Armory v0.13.3. - -| Attack | Budget | Benign Top1/Top5 Accuracy (Undefended) | Adversarial Top1/Top5 Accuracy (Undefended) | Benign Top1/Top5 Accuracy (Defended) | Adversarial Top1/Top5 Accuracy (Defended) | Test Size | -|:-----------------------------------:|:--------------------------------:|:--------------------------------------:|:-------------------------------------------:|:------------------------------------:|:-----------------------------------------:|:---------:| -| Flicker (low perceptibility) | beta_0=4.0 beta_1=0.1 beta_2=0.9 | 0.92/1.00 | 0.51/1.00 | 0.92/1.00 | 0.44/1.00 | 100 | -| Flicker (medium perceptibility) | beta_0=2.0 beta_1=0.1 beta_2=0.9 | 0.92/1.00 | 0.39/1.00 | 0.92/1.00 | 0.40/0.97 | 100 | -| Flicker (high perceptibility) | beta_0=1.0 beta_1=0.1 beta_2=0.9 | 0.92/1.00 | 0.37/1.00 | 0.92/1.00 | 0.38/0.98 | 100 | -| Frame Border | patch ratio=0.10 | 0.92/1.00 | 0.00/0.25 | 0.93/1.00 | 0.03/0.36 | 100 | -| Frame Border | patch ratio=0.15 | 0.92/1.00 | 0.00/0.19 | 0.93/1.00 | 0.01/0.29 | 100 | -| Frame Border | patch ratio=0.20 | 0.92/1.00 | 0.00/0.19 | 0.93/1.00 | 0.00/0.25 | 100 | -| Masked PGD | patch ratio=0.10 | 0.92/1.00 | 0.02/0.61 | 0.93/1.00 | 0.01/0.66 | 100 | -| Masked PGD | patch ratio=0.15 | 0.92/1.00 | 0.00/0.42 | 0.93/1.00 | 0.00/0.36 | 100 | -| Masked PGD | patch_ratio=0.20 | 0.92/1.00 | 0.00/0.28 | 0.93/1.00 | 0.00/0.31 | 100 | -| Frame Saliency (iterative_saliency) | eps=0.004 | 0.92/1.00 | 0.00/0.96 | 0.92/1.00 | 0.81/1.00 | 100 | -| Frame Saliency (iterative_saliency) | eps=0.008 | 0.92/1.00 | 0.00/0.96 | 0.92/1.00 | 0.47/1.00 | 100 | -| Frame Saliency (iterative_saliency) | eps=0.015 | 0.92/1.00 | 0.00/0.96 | 0.92/1.00 | 0.23/0.99 | 100 | -| Frame Saliency (one_shot) | eps=0.004 | 0.92/1.00 | 0.00/0.26 | 0.93/1.00 | 0.79/0.97 | 100 | -| Frame Saliency (one_shot) | eps=0.008 | 0.92/1.00 | 0.00/0.22 | 0.93/1.00 | 0.46/0.89 | 100 | -| Frame Saliency (one_shot) | eps=0.015 | 0.92/1.00 | 0.00/0.20 | 0.93/1.00 | 0.21/0.74 | 100 | - -Find reference baseline configurations [here](https://github.com/twosixlabs/armory/tree/8eb10ac43bf4382d69625d8cef8a3e8cb23d0318/scenario_configs) diff --git a/docs/original/baseline_results/xview_results.md b/docs/original/baseline_results/xview_results.md deleted file mode 100644 index 4cc221b30..000000000 --- a/docs/original/baseline_results/xview_results.md +++ /dev/null @@ -1,14 +0,0 @@ -# xView Object Detection Baseline Evaluation (Updated July 2021) - -results obtained using Armory v0.13.3 - -| Attack | Patch Size | Benign mAP (Undefended) | Adversarial mAP (Undefended) | Benign mAP (Defended) | Adversarial mAP (Defended) | Test Size | -|:-------------:|:----------:|:-----------------------:|:----------------------------:|:---------------------:|:--------------------------:|:---------:| -| Masked PGD | 50x50 | 0.284 | 0.142 | 0.232 | 0.139 | 100 | -| Masked PGD | 75x75 | 0.284 | 0.071 | 0.232 | 0.094 | 100 | -| Masked PGD | 100x100 | 0.284 | 0.076 | 0.232 | 0.092 | 100 | -| Robust DPatch | 50x50 | 0.284 | 0.193 | 0.232 | 0.184 | 100 | -| Robust DPatch | 75x75 | 0.284 | 0.184 | 0.232 | 0.146 | 100 | -| Robust DPatch | 100x100 | 0.284 | 0.173 | 0.232 | 0.165 | 100 | - -Find reference baseline configurations [here](https://github.com/twosixlabs/armory/tree/8eb10ac43bf4382d69625d8cef8a3e8cb23d0318/scenario_configs) diff --git a/docs/original/command_line.md b/docs/original/command_line.md deleted file mode 100644 index a8650ef3f..000000000 --- a/docs/original/command_line.md +++ /dev/null @@ -1,131 +0,0 @@ -# Command Line Usage - -## Root -* `armory --root [...]` -Applies to `run`, `launch`, and `exec` commands. - -This will run the docker container as root instead of the host user. -NOTE: this is incompatible with `--no-docker` mode. -NOTE: `--jupyter` only runs as root currently, and will ignore this argument. - -### Example Usage - -To run a single scenario as root: -``` -armory run official_scenario_configs/cifar10_baseline.json --root -``` - -To accept a config file from standard in: -``` -more official_scenario_configs/cifar10_baseline.json | armory run - -``` - -To execute the `id` command in the container: -``` -$ python -m armory exec pytorch --root -- id -2020-07-15 15:02:20 aleph-5.local armory.docker.management[35987] INFO ARMORY Instance c1045b0ed3 created. -2020-07-15 15:02:20 aleph-5.local armory.eval.evaluator[35987] INFO Running bash command: id -uid=0(root) gid=0(root) groups=0(root) -... -``` - -## GPUs -* `armory --gpus=X [...]` -* `armory --use-gpu [...]` -Applies to `run`, `launch`, and `exec` commands. - -This will specify whether to run GPUs and which ones to run. -If the `--gpus` flag is used, it will set `--use-gpu` to True. -The argument `X` for `--gpus` can be a single number, "all", -or a comma-separated list of numbers without spaces for multiple GPUs. - -The `--use-gpu` flag will simply enable gpus. -If a config is being run, the gpus used will be pulled from the config. -If a config is not being run or that field is not in the config, it will default to all. - -NOTE: when running a config, these will overwrite the fields inside the config. - -### Example Usage - -Examples: -``` -armory run scenario_configs/mnist_baseline.json --use-gpu -armory launch tf2 --gpus=1,4 --interactive -armory exec pytorch --gpus=0 -- nvidia-smi -``` - -## Check Runs, Number of Example Batches, Indexing, and Class Filtering -* `armory run --check [...]` -* `armory run --num-eval-batches=X [...]` -* `armory run --index=a,b,c [...]` -* `armory run --classes=x,y,z [...]` -Applies to `run` command. - -The `--check` flag will make every dataset return a single batch, -which is useful to quickly check whether the entire scenario correctly runs. -It will also ensure that the number of training epochs and certain attack parameters are set to 1. - -The `--num-eval-batches` argument will truncate the number of batches used in -both benign and adversarial test sets. -It is primarily designed for attack development iteration, where it is typically unhelpful -to run more than 10-100 examples. - -The `--index` argument will only use samples from the comma-separated, non-negative list of numbers provided. -Any duplicate numbers will be removed and the list will be sorted. -If indices beyond the size of the dataset are provided, an error will result at runtime. -Cannot be used with the `--num-eval-batches` argument. -Currently, batch size must be set to 1. - -The `--classes` argument will only use samples from the comma-separated, non-negative list of numbers provided. -Any duplicate numbers will be removed and the list will be sorted. -If indices beyond the size of the dataset are provided, an error will result at runtime. -Can be used with `--index` argument. In that case, indexing will be done after class filtering. - -NOTE: `--check` will take precedence over the `--num-eval-batches` argument. - -### Example Usage - -``` -armory run scenario_configs/mnist_baseline.json --check -armory run scenario_configs/mnist_baseline.json --num-eval-batches=5 -``` - -## Model Validation -The `--validate-config` flag will run a series of tests on the model in the selected configuration file. These tests will alert the user to configuration errors (e.g. clip values that do not broadcast correctly to the input), as well as circumstances that may limit the evaluation (e.g. a model without gradients won't work with white box attacks without modification). - -### Example Usage -``` -armory run scenario_configs/so2sat_baseline.json --validate-config -``` - -## Skipping Benign Evaluation / Attack Generation -The `--skip-benign` and `--skip-attack` flags allow the user to skip, respectively, evaluating on benign samples and generating/evaluating attack samples. - -### Example Usage -``` -armory run scenario_configs/mnist_baseline.json --skip-benign -armory run scenario_configs/mnist_baseline.json --skip-attack -``` - -## Skipping Attack of Misclassified Samples -When `--skip-misclassified` is enabled, for benign examples that yield a misclassification, Armory will simply reuse the -benign sample rather than running an attack. Note: the following criteria must be met when `--skip-misclassified` is enabled: - -1. The scenario must be a classification task (i.e. *not* object detection, ASR) with the 'categorical_accuracy' metric enabled in the config file. -2. Batch size must be set to 1 -3. The `--skip-benign` and `--skip-attack` flags cannot also be enabled - -### Example Usage -``` -armory run scenario_configs/mnist_baseline.json --skip-misclassified -``` - -## command line arguments and sysconfig - -For convenience, command line control arguments can be specified in the "sysconfig" -block of an evaluation configuration. Adding control to the configuration is -described in [Configuration Files][conf]. Command line arguments will override -sysconfig specifications. - - - [conf]: configuration_files.md#sysconfig-and-command-line-arguments diff --git a/docs/original/configuration_files.md b/docs/original/configuration_files.md deleted file mode 100644 index 48940b595..000000000 --- a/docs/original/configuration_files.md +++ /dev/null @@ -1,235 +0,0 @@ -# Configuration Files - -All configuration files are verified against the jsonschema definition at run time: -[armory/utils/config_schema.json](https://github.com/twosixlabs/armory/blob/master/armory/utils/config_schema.json) - -## Schema -``` -`_description`: [String] Any description that describes the scenario evaluation -`adhoc`: [Object or null] - { - Custom parameters that you can access within a scenario - } -`attack`: [Object or null] - { - knowledge: [String] `white` or `black` knowledge - kwargs: [Object] Keyword arguments to pass to attack instatiation - module: [String] Python module to load attack from - name: [String] Name of the attack class to be instatiated - use_label: [Bool] Default: False. Whether attack should use the true label when - attacking the model. Without this, it is not possible to drive the accuracy - down to 0% when the model has misclassifications. - type: [Optional String]: in <`preloaded`|`patch`|`sweep`>. - } -`dataset`: [Object] - { - batch_size [Int]: Number of samples to include in each batch - module: [String] Python module to load dataset from - name: [String] Name of the dataset function - framework: [String] Framework to return Tensors in. <`tf`|`pytorch`|`numpy`>. `numpy` by default. - train_split: [Optional String] Training split in dataset. Typically defaults to `train`. Can use fancy slicing via [TFDS slicing API](https://www.tensorflow.org/datasets/splits#slicing_api) - eval_split: [Optional String] Eval split in dataset. Typically defaults to `test`. Can use fancy slicing via [TFDS slicing API](https://www.tensorflow.org/datasets/splits#slicing_api) - class_ids: [Optional Int or List[Int]] Class ID's to filter the dataset to. Can use a numeric list like [1, 5, 7] or a single integer. - index: [Optional String or Object] Index into the post-sorted (and post-filtered if class_ids is enabled) eval dataset. Can use a numeric list like [1, 5, 7] or a simple slice as a string, like "[3:6]" or ":100". - } -`defense`: [Object or null] - { - kwargs: [Object] Keyword arguments to pass to defense instatiation - module: [String] Python module to load defense from - name: [String] Name of the defense class to be utilized - type: [String] Type of defense which flags how it should be used. One of - } -`metric`: [Object or null] - { - means: [Bool] Boolean to caculate means for each task in logging / output - perturbation: [String] Perturbation metric to calculate for adversarial examples - record_metric_per_sample: [Bool] Boolean to record metric for every sample in save in output - task: [List[String]] List of task metrics to record (e.g. categorical_accuracy) - profiler_type: [Optional String or null] Type of computational resource profiling desired for scenario profiling. One of or null - } -`model`: [Object] - { - fit: [Bool] Boolean to train the model or not - fit_kwargs: [Object] Keyword arguments to pass to `fit_generator` or `fit` - module: [String] Python module to load model from - name: [String] Name of the function to return ART classifier - model_kwargs: [Object] Keyword arguments to load model function - weights_file: [String or null] Name of pretrained weights file. Will be downloaded from S3 if available - wrapper_kwargs: [Object] Keyword arguments to ART wrapper function - } -`scenario`: [Object] - { - kwargs: [Object] Keyword arguments to pass to Scenario instatiation - module: [String] Python module to load scenario from - name: [String] Name of the scenario class to be ran - export_batches: [Optional Int or Bool] Number of batches of data to export - } -`sysconfig` [Object] - { - docker_image: [String or null] Docker image name and tag to run scenario in - external_github_repo: [String or null or Object] External github repository(s) to download and place on PYTHONPATH within container - external_github_repo_pythonpath: [String or null or Object] Relative path(s) in the repo directory to add to PYTHONPATH within container - gpus: [String]: Which GPUs should the docker container have access to. "all" or comma sperated list (e.g. "1,3") - local_repo_path: [String or null or Object] Local github repository path(s) to place on PYTHONPATH within container - output_dir: [Optional String]: Add an optional output directory prefix to the default output directory name. - output_filename: [Optional String]: Optionally change the output filename prefix (from default of scenario name) - use_gpu: [Boolean]: Boolean to run container as nvidia-docker with GPU access - } -`user_init`: [Object or null] - { - module: [String] Python module to import before scenario loading but after scenario initialization - name: [String or null] Name of the function to call after module import (optional) - kwargs: [Object or null] Keyword arguments to provide for function call (optional) - } -``` - - -### Example Configuration File: -``` -{ - "_description": "Baseline cifar10 image classification", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 0.031, - "eps_step": 0.007, - "max_iter": 20, - "num_random_init": 1, - "random_eps": false, - "targeted": false, - "verbose": false - }, - "module": "art.attacks.evasion", - "name": "ProjectedGradientDescent", - "use_label": true - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": true, - "fit_kwargs": { - "nb_epochs": 20 - }, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.cifar", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.image_classification", - "name": "ImageClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} -``` - -### attack config "type" field -The supported values for the `"type"` field in attack configs are as follows: -<`preloaded`|`patch`|`sweep`>. If none of the cases below apply, the field -does not need to be included. - -1. `"preloaded"`: This value is specified when using an adversarial dataset (e.g. APRICOT) where no -perturbations should be applied to the inputs. - -2. `"patch"`: Some ART attacks such as `"AdversarialPatch"` or `"RobustDPatch"` have a `generate()` method -which returns a patch rather than the input with patch. When using such an attack in an Armory scenario, -setting `attack_config["type"]` to `"patch"` will enable an Armory wrapper class with an updated -`generate()` which applies the patch to the input. - -2. `"sweep"`: To enable "sweep" attacks, see the instructions in [sweep_attacks.md](sweep_attacks.md). - -### Use with Custom Docker Image - -To run with a custom Docker image, replace the `["sys_config"]["docker_image"]` field -to your custom docker image name ``. - -### Specifying kwargs for metric functions -Some metric functions in [armory/utils/metrics.py](../armory/utils/metrics.py) receive kwargs, e.g. -`iou_threshold` in the case of `object_detection_AP_per_class()`. To modify the kwarg, specify -`"task_kwargs"` in the `"metric"` portion of the config file as such: - -```json -"metric": { - "task": [ - "object_detection_AP_per_class", - "object_detection_true_positive_rate" - ], - "task_kwargs": [{"iou_threshold": 0.3}, {}] -} -``` -Note that the length of `"task_kwargs"` should be equal to that of `"task"`, as `task_kwargs[i]` corresponds -to `task[i]`. - -### Exporting Data -Please see [exporting_data.md](exporting_data.md). - -### Additional configuration settings for poisoning scenario - -Some settings specific to the poisoning scenario are not applicable to the other -scenarios and are thus found in "adhoc" subfield of the configuration file. - -For a poison filtering defense, Armory supports using a model for filtering that -differs from the model used at training time. The model used at training time should -still be stored in the field "model" as described in the config schema. However, if a -different model is used for the filtering defense, it should be entered in the "ad-hoc" -field of the configuration file under the subfield "defense_model," with the number of -epochs of training under the subfield "defense_model_train_epochs." A concrete example -of a configuration with this field is available in the armory-example -[repo](https://github.com/twosixlabs/armory-example/tree/master/example_scenario_configs). - -### sysconfig and command line arguments - -Parameters specified in the "sysconfig" block will be treated as if they were passed -as arguments to `armory` for example a configuration block like -```json -{ - "sysconfig": { - "num_eval_batches": 5, - "skip_benign": true - } -} -``` -will cause armory to act as if you had run it as -``` -armory run scenario.json --num-eval-batches 5 --skip-benign -``` -However, arguments actually specified on the command line will take precedence, -so if you execute, using the same configuration file -``` -armory run scenario.json --num-eval-batches 100 -``` -Then the command line will override the sysconfig and 100 batches (not 5) will -be run. In this example, `--skip-benign` will also be true because it is -in the sysconfig block. - -No matter whether these attributes are specified on the command line, in sysconfig, -or both, the output file will record the attributes as executed, so you have a -record of how the evaluation ultimately ran. - -The [full specification of command line arguments][cmdline] is available. - - [cmdline]: command_line.md diff --git a/docs/original/contributing/self-review.md b/docs/original/contributing/self-review.md deleted file mode 100644 index 8bbff6de3..000000000 --- a/docs/original/contributing/self-review.md +++ /dev/null @@ -1,11 +0,0 @@ -### Self review - -You should always review your own PR first. - -For content changes, make sure that you: - -- [ ] Confirm that the changes meet the user experience and goals outlined in the content design plan (if there is one). -- [ ] Compare your pull request's source changes to staging to confirm that the output matches the source and that everything is rendering as expected. This helps spot issues like typos, content that doesn't follow the style guide, or content that isn't rendering due to versioning problems. Remember that lists and tables can be tricky. -- [ ] Review the content for technical accuracy. -- [ ] Copy-edit the changes for grammar, spelling, and adherence to the [style guide](/docs/style.md). -- [ ] If there are any failing checks in your PR, troubleshoot them until they're all passing. diff --git a/docs/original/dataset_licensing.md b/docs/original/dataset_licensing.md deleted file mode 100644 index 904f3f183..000000000 --- a/docs/original/dataset_licensing.md +++ /dev/null @@ -1,158 +0,0 @@ -## Dataset Licensing - -Armory datasets are either licensed or available in accordance to the fair use -exception to copyright infringement. The passthrough license is the same as the original -license for nonadapted datasets. Adapted datasets ("derivative works") are licensed under -the Creative Commons 4.0 International ShareAlike license and are Copyright Two Six Labs, 2020. - -## Original Licenses - -| Dataset | Original license | -|:-:|:-:| -| MNIST | [Creative Commons Attribution-Share Alike 3.0](http://www.pymvpa.org/datadb/mnist.html) | -| CIFAR-10 | [MIT](https://peltarion.com/knowledge-center/documentation/terms/dataset-licenses/cifar-10)| -| Digit | [Creative Commons Attribution-ShareAlike 4.0 International](https://github.com/Jakobovski/free-spoken-digit-dataset) | -| Librispeech | [Creative Commons 4.0](http://www.openslr.org/12/) | -| GTSRB | [CC0 Public Domain](https://www.kaggle.com/meowmeowmeowmeowmeow/gtsrb-german-traffic-sign)| -| Imagenette | [Apache 2.0](https://github.com/fastai/imagenette/blob/master/LICENSE) | -| UCF101 | Fair use exception | -| RESISC45 | Fair use exception | (http://xviewdataset.org/) -| xView | [Creative Commons Attribution-Noncommercial-ShareAlike 4.0 International](https://arxiv.org/pdf/1802.07856) | -| so2sat | [Creative Commons 4.0](https://mediatum.ub.tum.de/1454690) | -| APRICOT | [Apache License Version 2.0](https://apricot.mitre.org/) | -| DAPRICOT | Creative Commons 4.0 | -| CARLA | MIT | -| Speech Commands | [Creative Commons BY 4.0](https://ai.googleblog.com/2017/08/launching-speech-commands-dataset.html) - -## Attributions - -Note: attribution material can be removed upon request to the extent reasonably -practicable. Please direct inquiries to . - -### MNIST -|Attribution | | -|------------------------------|--------------| -| Creator/author name | Yann LeCun and Corinna Cortes | -| Copyright notice | Copyright © 1998 by Yann LeCun and Corinna Cortes | -| Public license notice | http://www.pymvpa.org/datadb/mnist.html | -| Disclaimer notice | UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. | -| Dataset link | http://yann.lecun.com/exdb/mnist/ | -| Modification | (Slight) Representation of images as binary tensors | -| Citation | LeCun, Yann, Corinna Cortes, and Christopher JC Burges. "The MNIST database of handwritten digits, 1998." URL http://yann.lecun.com/exdb/mnist 10, no. 34 (1998): 14. | - -### CIFAR-10 -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Alex Krizhevsky, Vinod Nair, and Geoffrey Hinton | -| Copyright notice | Copyright © 2013 by Valay Shah | -| Public license notice | https://peltarion.com/knowledge-center/documentation/terms/dataset-licenses/cifar-10 | -| License text (including disclaimer)| Copyright (c) 2013 Valay Shah. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The foregoing copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.| -| Dataset link | https://www.cs.toronto.edu/~kriz/cifar.html | -| Citation | Krizhevsky, Alex. "Learning Multiple Layers of Features from Tiny Images." URL https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf, (2009). | -| Modification | (Slight) Representation of images as binary tensors | - -### Free Spoken Digit Dataset (FSDD) -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Zohar Jackson, César Souza, Jason Flaks, Yuxin Pan, Hereman Nicolas, and Adhish Thite| -| Copyright notice | Copyright © 2018 by Zohar Jackson, César Souza, Jason Flaks, Yuxin Pan, Hereman Nicolas, and Adhish Thite | -| Public license notice | https://github.com/Jakobovski/free-spoken-digit-dataset | -| Disclaimer notice | a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. | -| Dataset link | https://github.com/Jakobovski/free-spoken-digit-dataset | -| Citation | Jackson, Zohar, César Souza, Jason Flaks, Yuxin Pan, Hereman Nicolas, and Adhish Thite. "Jakobovski/free-spoken-digit-dataset: v1.0.8 (Version v1.0.8)." Zenodo (2018). URL http://doi.org/10.5281/zenodo.134240 | -| Modification | (Slight) Representation of audio wav file as one-dimensional binary tensors | - -### Librispeech -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Vassil Panayotov, Guoguo Chen, Daniel Povey and Sanjeev Khudanpur | -| Copyright notice | Copyright © 2014 by Vassil Panayotov | -| Public license notice | http://www.openslr.org/12/ | -| Disclaimer notice | a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. | -| Dataset link | http://www.openslr.org/12/ | -| Citation | Panayotov, Vassil, Guoguo Chen, Daniel Povey, and Sanjeev Khudanpur. "Librispeech: an ASR corpus based on public domain audio books." In 2015 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), pp. 5206-5210. IEEE, 2015. | -| Modification | (Derivative work) Creation of adversarial dataset that modifies the original audio with small perturbations that are crafted to fool machine learning models. | - -### GTSRB -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Johannes Stallkamp, Marc Schlipsing, Jan Salmen, and Christian Igel | -| Copyright notice | N/A (public domain) | -| Public license notice | https://www.kaggle.com/meowmeowmeowmeowmeow/gtsrb-german-traffic-sign | -| Disclaimer notice | Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. | -| Dataset link | http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset | -| Citation | Stallkamp, Johannes, Marc Schlipsing, Jan Salmen, and Christian Igel. "Man vs. computer: Benchmarking machine learning algorithms for traffic sign recognition." Neural Networks, URL http://www.sciencedirect.com/science/article/pii/S0893608012000457, (2012)| -| Modification | (Derivative work) Creation of adversarial dataset that modifies the original images with small perturbations that are crafted to fool machine learning models. | - -### Imagenette -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Jeremy Howard | -| Copyright notice | Copyright © 2019 by Jeremy Howard | -| Public license notice | https://github.com/fastai/imagenette | -| Disclaimer notice | Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. | -| Dataset link | https://github.com/fastai/imagenette | -| Modification | (Slight) Representation of images as binary tensors | - -### xView -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Defense Innovation Unit Experimental (DIUx) and the National Geospatial-Intelligence Agency (NGA) | -| Copyright notice | None found | -| Public license notice | http://xviewdataset.org/terms.html | -| Disclaimer notice | Disclaimer of Warranties and Limitation of Liability. a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. | -| Dataset link | http://xviewdataset.org/#dataset | -| Modification | (Slight) Representation of images as binary tensors | - -### so2sat -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | Xiaoxiang Zhu, Jingliang Hu, Chunping Qiu, Yilei Shi, Jian Kang, Lichao Mou, Hossein Bagheri, Matthias Haeberle, Yuansheng Hua, Rong Huang, Lloyd Hughes, Hao Li, Yao Sun, Guichen Zhang, Shiyao Han, Michael Schmitt, and Yuanyuan Wang | -| Copyright notice | None found | -| Public license notice | https://mediatum.ub.tum.de/1454690 | -| Disclaimer notice | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. | -| Dataset link | https://mediatum.ub.tum.de/1454690 | -| Modification | (Slight) Representation of images as binary tensors | - -### APRICOT -|Attribution | | -|------------------------------|--------------| -| Creator/attribution parties | A. Braunegg, Amartya Chakraborty, Michael Krumdick, Nicole Lape, Sara Leary, Keith Manville, Elizabeth Merkhofer, Laura Strickhart, and Matthew Walmer | -| Copyright notice | Copyright 2020 APRICOT - MITRE Corporation | -| Public license notice | https://apricot.mitre.org/ | -| Disclaimer notice | Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. | -| Dataset link | https://apricot.mitre.org/ | -| Modification | (Slight) Representation of images as binary tensors | - -## Fair use notes for RESISC-45 and UCF101 -* Two Six Labs does not charge users for access to the Armory repository, -nor the datasets therein, nor does it derive a profit directly from use of the -datasets. -* Two Six Labs is not merely republishing the original datasets. The -datasets have undergone transformative changes, specifically they have been -repackaged to be integrated with Tensorflow Datasets. This repackaging -includes, but is not limited to, processing images from compressed formats into -binary tensors as well as decoding audio and video files. Further, Two Six Labs -has published derived adversarial datasets that modify the original images/videos with -small perturbations that are crafted to fool machine learning models for both -the RESISC-45 and UCF101 datasets. -* Two Six Labs uses these datasets within Armory, however there are -other additional datasets present, as well as multiple other features present -in Armory beyond providing datasets. -* Two Six Labs attempted to contact the authors of RESISC-45, but received no -response. -* UCF101 direct download functionality has been used by other machine learning -frameworks, such as TensorFlow: https://www.tensorflow.org/datasets/catalog/ucf101 -* Two Six Labs provides public benefit through the public distribution -of the Armory framework to evaluate machine learning models. This material is -based upon work supported by the Defense Advanced Research Projects Agency -(DARPA) under Contract No. HR001120C0114. Any opinions, findings and -conclusions or recommendations expressed in this material are those of the -author(s) and do not necessarily reflect the views of the Defense Advanced -Research Projects Agency (DARPA). - -### Citations for RESISC45 and UCF101 - -Cheng, Gong, Junwei Han, and Xiaoqiang Lu. "Remote sensing image scene classification: Benchmark and state of the art." Proceedings of the IEEE 105, no. 10 (2017): 1865-1883. - -Soomro, Khurram, Amir Roshan Zamir, and Mubarak Shah. "UCF101: A dataset of 101 human actions classes from videos in the wild." arXiv preprint arXiv:1212.0402 (2012). diff --git a/docs/original/datasets.md b/docs/original/datasets.md deleted file mode 100644 index 681147a2a..000000000 --- a/docs/original/datasets.md +++ /dev/null @@ -1,117 +0,0 @@ -# Datasets - -The `armory.data.datasets` module implements functionality to return datasets of -various data modalities. By default, this is a NumPy `ArmoryDataGenerator` which -implements the methods needed by the ART framework. Specifically `get_batch` will -return a tuple of `(data, labels)` for a specified batch size in numpy format. - -We have experimental support for returning `tf.data.Dataset` and -`torch.utils.data.Dataset`. These can be specified with the `framework` argument to -the dataset function. Options are ``. - -Currently, datasets are loaded using TensorFlow Datasets from cached tfrecord files. -These tfrecord files will be pulled from S3 if not available on your -`dataset_dir` directory. - -### Image Datasets - -| Dataset | Description | x_shape | x_dtype | y_shape | y_dtype | splits | -|:----------: |:-----------: |:-------: |:--------: |:--------: |:-------: |:------: | -| [cifar10](https://www.cs.toronto.edu/~kriz/cifar.html) | CIFAR 10 classes image dataset | (N, 32, 32, 3) | float32 | (N,) | int64 | train, test | -| [german_traffic_sign](http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset) | German traffic sign dataset | (N, variable_height, variable_width, 3) | float32 | (N,) | int64 | train, test | -| [imagenette](https://github.com/fastai/imagenette) | Smaller subset of 10 classes from Imagenet | (N, variable_height, variable_width, 3) | uint8 | (N,) | int64 | train, validation | -| [mnist](http://yann.lecun.com/exdb/mnist/) | MNIST hand written digit image dataset | (N, 28, 28, 1) | float32 | (N,) | int64 | train, test | -| [resisc45](https://arxiv.org/abs/1703.00121) | REmote Sensing Image Scene Classification | (N, 256, 256, 3) | float32 | (N,) | int64 | train, validation, test | -| [Coco2017](https://arxiv.org/abs/1405.0312) | Common Objects in Context | (N, variable_height, variable_width, 3) | float32 | n/a | List[dict] | train, validation, test | -| [xView](https://arxiv.org/pdf/1802.07856) | Objects in Context in Overhead Imagery | (N, variable_height, variable_width, 3) | float32 | n/a | List[dict] | train, test | - -NOTE: the Coco2017 dataset's class labels are 0-indexed (start from 0). -
- -### Multimodal Image Datasets -| Dataset | Description | x_shape | x_dtype | y_shape | y_dtype | splits | -|:----------: |:-----------: |:----------------------:|:--------: |:--------: |:-------: |:-----------------:| -| [so2sat](https://mediatum.ub.tum.de/1454690) | Co-registered synthetic aperture radar and multispectral optical images | (N, 32, 32, 14) | float32 | (N,) | int64 | train, validation | -| [carla_obj_det_train](https://carla.org/) | CARLA Simulator Object Detection | (N, 960, 1280, 3 or 6) | float32 | n/a | List[dict] | train, val | -| [carla_over_obj_det_train](https://carla.org/) | CARLA Simulator Object Detection | (N, 960, 1280, 3 or 6) | float32 | n/a | List[dict] | train, val | -
- -##### CARLA Object Detection -The carla_obj_det_train dataset contains rgb and depth modalities. The modality defaults to rgb and must be one of `["rgb", "depth", "both"]`. -When using the dataset function imported from [armory.data.datasets](../armory/data/datasets.py), this value is passed via the `modality` kwarg. When running an Armory scenario, the value -is specified in the dataset_config as such: -```json - "dataset": { - "batch_size": 1, - "modality": "rgb", -} -``` -When `modality` is set to `"both"`, the input will be of shape `(nb=1, 960, 1280, 6)` where `x[..., :3]` are -the rgb channels and `x[..., 3:]` the depth channels. - -The carla_over_obj_det_train dataset has the same properties as the above mentioned dataset but is collected utilizing overhead perspectives. - - -### Audio Datasets -| Dataset | Description | x_shape | x_dtype | y_shape | y_dtype | sampling_rate | splits | -|:----------: |:-----------: |:-------: |:--------: |:--------: |:-------: |:-------: |:------: | -| [digit](https://github.com/Jakobovski/free-spoken-digit-dataset) | Audio dataset of spoken digits | (N, variable_length) | int64 | (N,) | int64 | 8 kHz | train, test | -| [librispeech](http://www.openslr.org/12/) | Librispeech dataset for automatic speech recognition | (N, variable_length) | float32 | (N,) | bytes | 16 kHz | dev_clean, dev_other, test_clean, train_clean100 | -| [librispeech-full](http://www.openslr.org/12/) | Full Librispeech dataset for automatic speech recognition | (N, variable_length) | float32 | (N,) | bytes | 16 kHz | dev_clean, dev_other, test_clean, train_clean100, train_clean360, train_other500 | -| [librispeech_dev_clean](http://www.openslr.org/12/) | Librispeech dev dataset for speaker identification | (N, variable_length) | float32 | (N,) | int64 | 16 kHz | train, validation, test | -| [librispeech_dev_clean_asr](http://www.openslr.org/12) | Librispeech dev dataset for automatic speech recognition | (N, variable_length) | float32 | (N,) | bytes | 16 kHz | train, validation, test | -| [speech_commands](https://www.tensorflow.org/datasets/catalog/speech_commands) | Speech commands dataset for audio poisoning | (N, variable_length) | float32 | (N,) | int64 | 16 kHz | train, validation, test | - -NOTE: because the Librispeech dataset is over 300 GB with all splits, the ```librispeech_full``` dataset has -all splits, whereas the ```librispeech``` dataset does not have the train_clean360 or train_other500 splits. -
- -### Video Datasets -| Dataset | Description | x_shape | x_dtype | y_shape | y_dtype | splits | -|:----------: |:-----------: |:-------: |:--------: |:--------: |:-------: |:------: | -| [ucf101](https://www.crcv.ucf.edu/data/UCF101.php) | UCF 101 Action Recognition | (N, variable_frames, None, None, 3) | float32 | (N,) | int64 | train, test | -| [ucf101_clean](https://www.crcv.ucf.edu/data/UCF101.php) | UCF 101 Action Recognition | (N, variable_frames, None, None, 3) | float32 | (N,) | int64 | train, test | - -NOTE: The dimension of UCF101 videos is `(N, variable_frames, 240, 320, 3)` for the entire training set and all of the test set except for 4 examples. -For those, the dimensions are `(N, variable_frames, 226, 400, 3)`. If not shuffled, these correspond to (0-indexed) examples 333, 694, 1343, and 3218. -NOTE: The only difference between `ucf101` and `ucf101_clean` is that the latter uses the ffmpeg flag `-q:v 2`, which results in fewer video compression errors.These are stored as separate datasets, however. - -
- - -### Preprocessing - -Armory applies preprocessing to convert each dataset to canonical form (e.g. normalize the range of values, set the data type). -The poisoning scenario loads its own custom preprocessing, however the GTSRB data is also available in its canonical form. -Any additional preprocessing that is desired should occur as part of the model under evaluation. - -Canonical preprocessing is not yet supported when `framework` is `tf` or `pytorch`. - -### Splits - -Datasets that are imported directly from TFDS have splits that are defined according to the -Tensorflow Datasets [library](https://www.tensorflow.org/datasets/catalog/overview). The -`german-traffic-sign` dataset split follows the description of the original source of the -[dataset](http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset). The `digits` - dataset split follows the description of the original source of the - [dataset](https://github.com/Jakobovski/free-spoken-digit-dataset#usage). The following - table describes datasets with custom splits in Armory. -| Dataset | Split | Description | Split logic details | -|:---------------------:|:----------:|:--------------------------------------:|:------------------------------------------------------:| -| resisc_45 | train | First 5/7 of dataset | See armory/data/resisc45/resisc45_dataset_partition.py | -| | validation | Next 1/7 of dataset | | -| | test | Final 1/7 of dataset | | -| librispeech_dev_clean | train | 1371 recordings from dev_clean dataset | Assign discrete clips so at least 50% of audio time | -| | validation | 692 recordings from dev_clean dataset | is in train, at least 25% is in validation, | -| | test | 640 recordings from dev_clean dataset | and the remainder are in test | - - -
- - -### Adversarial Datasets -See [adversarial_datasets.md](adversarial_datasets.md) for descriptions of Armory's adversarial datasets. - -### Dataset Licensing -See [dataset_licensing.md](dataset_licensing.md) for details related to the licensing of datasets. - diff --git a/docs/original/developers/callchain.md b/docs/original/developers/callchain.md deleted file mode 100644 index 2503ca657..000000000 --- a/docs/original/developers/callchain.md +++ /dev/null @@ -1,26 +0,0 @@ -# bootstrap process creation and command line arguments - -This traces how command options percolate through armory instantiation - -`armory.__main__.py` is the entry point for armory run. It has an `if __name__` block on -line 322 which calls main(). main() looks at only the first argument given (e.g. armory -**run**) and uses `run` as a lookup into a dispatch table COMMANDS which maps "run" -> -function `run`. run at line 284 does a bunch of argparse on the residual arguments, -loads the experiment config, constructs an Evaluator and then calls its run method. - -`armory.eval.evaluator.Evaluator __init__` modifies the in-core experiment, sets up a -docker_client and other miscellany. the Evaluator.run method does some more prep and -then calls Evaluator.run_config which conses up a python command line with a base64 -encoded experiment and then calls Evaluator.run_command which calls -armory.docker.management.exec_cmd which runs that encoded command inside a container. - -That encoded command is `python -m armory.scenarios.main` which passes control via python -built-in hidden runpy.py which is currently complaining about import order in a way that -scares me: -> RuntimeWarning: 'armory.scenarios.main' found in sys.modules after import of -package 'armory.scenarios', but prior to execution of 'armory.scenarios.main'; this may -result in unpredictable behavior - -In armory.scenarios.main in the `if __name__` block, first we have an independent -duplicate (and out of sync) argument processor which then calls main.run_config which -calls scenario.evaluate which finally runs application code. diff --git a/docs/original/developers/config-object.md b/docs/original/developers/config-object.md deleted file mode 100644 index e8cf418b4..000000000 --- a/docs/original/developers/config-object.md +++ /dev/null @@ -1,90 +0,0 @@ -# an Armory Configuration object - -As of armory 0.14.x application configuration is built up from various sources -and bits of it are sprinkled through the armory application. This results in -application state distributed hodge-podge through the app. Because the app -configuration is built piece-wise by multiple modules, proper unit test rigging -is difficult or impossible without hoisting the whole system up first. - -This note outlines a configuration object to contain and render all application -configuration state. The state object is unrelated to armory "configurations", -represented by JSON blobs. The old configurations are now to be called "experiments" -because it is more descriptive. - -## the ConfigurationTin class - -There will be one object that contains all configuration data. For lack of -a better name at the moment, I'm calling it a ConfigurationTin. - - @dataclass - class ConfigurationTin: - mode: str - flag: ArmoryFlags - credential: ArmoryCredentials - path: ArmoryPaths - -Typical use is like - - from armory.configuration import tin - - tin = ConfigurationTin(…) - - if tin.mode == 'docker': - docker_mount(tin.path.output_dir) - ... - armory.eval.run(tin, experiment) - -But a test should be able to construct a ConfigurationTin from scratch like - - def test_with_overrides(): - my_tin = ConfigurationTin(overrides of some kind) - armory.eval.run(my_tin, experiment) - -## immutability declined - -Python dataclasses can be marked as `frozen` but I'm not doing that to start. The armory -code currently modifies configuration all throughout which is a bad thing. When -converting to ConfigurationTin, we will know where all mutation happens because we will -have written it. - -By getting the configuration modification well constructed, and having obvious -means of reading it, I expect the developer temptation to alter the tin will be -greatly reduced, and if it sneaks in, it will be much more obvious in review. -As the python maxim goes "we're all adults here" - -## merging ConfigurationTins - -We want the hierarchical override of configuration items drawn from: - - 1. armory defaults - 2. overrides in the experiment file (aka config.json) - 2. overrides from environment variables - 4. override with command line arguments - -As an example num-eval-batches is an experiment parameter that a user wants to -modify. - -This mechanism does (not yet) address the hierarchical construction of configuration -which we think we want. If we used a json-like "bag of properties" as a `Dict[str, Any]` -we could use `dict.update` to trivially implement overrides. This desire does contain -a presupposition that we'd have a dictionary of modifiers to merge in. In actuality, -we'd have to construct that set of modifiers first, so why not use the -dataclass constructors for that? - -There could be a method that handles this example - - args = argparse.parse() - override: ArmoryFlags = tin.flag.copy() - override.flag.skip_attack = args.skip_attack - tin.meld(flag=override) - -But I don't know that buys us anything over: - - tin.flag.skip_attack = args.skip_attack - - -## stuff that I read on the matter - -https://dxiaochuan.medium.com/summary-of-python-config-626f2d5f6041 which -mentions https://github.com/apache/airflow/blob/175a1604638016b0a663711cc584496c2fdcd828/airflow/configuration.py#L233 -as an exemplar diff --git a/docs/original/developers/overall-plan.md b/docs/original/developers/overall-plan.md deleted file mode 100644 index b61fd45b0..000000000 --- a/docs/original/developers/overall-plan.md +++ /dev/null @@ -1,107 +0,0 @@ -# the big honking duo feature - -We developing larger-scale changes in the work-branch called `shenshaw26/duo`. -The goal is to migrate features into twosixlabs/armory as they are tested and -GARD developers are updated. Keeping it is a separate branch which keeps closely -_tracked to_ develop using frequent merges so that merges _into_ develop -can be done opportunistically. - -Although the overarching design is being worked on, this outlines some of the -major directions for discussion and review. Most sections of this note will -grow over the development effort to become their own design documents - -# the launcher - -A large part of what armory does is hoist up an execution environment and -populate it with data and model imports. - -There is a natural cleave point in `Evaluator._run_config` where all execution -is delegated to a new `python -m armory.scenarios.main` which should have all -setup pushed to the upstream side of that point and all compute engine -activities must be pushed below the cleave. Once this has been done, the -launcher code can then be pulled off into pure-python launcher which requires -no ML framework libraries (tf, torch) or other platform (e.g. docker) present -to install - -Formalizing this cleave point and the structures passed across will dramatically -help test rig construction since they can be versionable dependency injectors -instead of state sprinkled throughout the file system, environment variables, and -command arguments. - -## argument processing - -There are two disjoint invocations of argparse in `__main__.py` and `scenarios/main.py`. -The latter is actually an RPC deserialize step, with a corresponding re-serialize -step nearby. - -# the Experiment object - -The activities of armory focus around the evaluation of a block of engine -parameters call the Experiment. The former versions talk (confusingly) about -the armory "config file" which is distinct from the `~/.armory/config` file which -can be serialized to/from JSON. There is now an Experiment which can be serialized -to YAML as a `.aexp` file. - -# the Configuration Tin - -The Experiment object represents an evaluation job description, the `ConfigurationTin` -tin represents the execution environment for an experiment. It is called a tin -because `config` and its lexically close synonyms have been tainted by the old -Experiment. So armory's first task is to create the tin from the various sources. -Once the tin is populated, the resources it requires can be acquired and experiment -is evaluated in that context. - -As with the Experiment we're moving from amorphous bags of JSON properties to -well structured Python classes. A clear example is: - - class ArmoryCredentials - github_token: str - s3_id: str - s3_secret: str - -# toward the Armory library - -There is a substantial part of this Armory rework devoted to changing the model of -armory operation from a framework to a Python library. Clean definition of internal -interfaces has been peeking out through the sections above. The Launcher becomes -a smaller, well-defined means of reading Experiment parameters and Configuration -flags and passing them to Evaluate leading to pseudo-code like: - - environment = get_configuration(tin-path) - experiment = read_experiment(path) - results = evaluate(environment, experiment) - -The first advantage is that armory evaluations are now composable and programmable -with standard Python. The open design question is how this obvious calling sequence -can be extended so that there are useful interactions that an evaluator could have -with the evaluation engine. But, even if we find no additional mechanisms, clearer -segmentation of the code into initialization and evaluation will make it more -comprehensible and maintainable. - -# testability - -Segregating the platform dependent and independent parts increases testability. -We have already been making some extant tests platform-independent, and -having pure functions like `evaluate(experiment, context)` only speeds this. - -This means, in addition to better testing, that developer tests become feasible -without building out new containers and all the time and complexity needed -to run them. A developer can run - - pytest -m quick - -to get a rapid check that no breaking changes were made. It is also easier -to write tests when you don't have to wait 30+ minutes for the CI system to -fire up so much infrastructure. - - -## things to think about more - -1. Should experiments contain platform/sysconfig parameters. For example, should - `sysconfig.mode=docker` belong in the experiment? Put another way, should any system - parameter (e.g. --gpus) be configurable at by default, experiment, environment or - command argument regardless of their natural locus. -2. Find an easy way for Launcher to pass the evaluation request to a container - running elsewhere. This actually gets us some pretty big benefit if it can be - done simply. Need to run 9 different naive variant tests? Send it to a cluster - and get your results in 1/9th the time. diff --git a/docs/original/docker.md b/docs/original/docker.md deleted file mode 100644 index e1813fe20..000000000 --- a/docs/original/docker.md +++ /dev/null @@ -1,309 +0,0 @@ -# Docker -Armory is intended to be a lightweight python package which standardizes all evaluations -inside a docker container. - - -## Images -There are two docker images that are currently published to dockerhub for every release of -the armory framework: - -1. `twosixarmory/armory:` -2. `twosixarmory/pytorch-deepspeech:` - -NOTE: as of Armory version 0.15.0, we no longer support or publish a `tf1` image. -If `tf1` functionality is needed, please use the `tf2` image and use `tf1` compatibility mode. - -We additionally publish a base image, `twosixarmory/base:latest`, from which the three main images are derived. -This is updated less frequently, and each release does not necessarily have a corresponding new base. - -When using `armory launch` or `armory exec` the framework specific arguments will -utilize one of these three primary images. - -When running `armory run ` the image launched will be whatever is -specified in the `docker_image` field. This enables users to extend our images -and run evaluations on an image that has all additional requirements for their defense. - -### Custom Images - -If you wish to utilize custom images for armory, these can be directly specified by -either the `"docker_image"` field of the [config file](configuration_files.md) -of `armory run ` or in the CLI of the `launch` and `exec` commands, -as in `run launch `. - -Note: since Armory executes commands on detached containers, the `CMD` of the Docker image -will be *ignored* and replaced with `tail -f /dev/null` to ensure that the container does not -exit while those commands are being executed. - -### Interactive Use - -As detailed [here](index.md), it is possible to run the armory docker container in an -interactive mode using the `--interactive` CLI argument on `launch` or `run` commands. -We recommend this for debugging purposes, primarily. - -When run, armory will output instructions for attaching to the container, similar to the following: -``` -*** In a new terminal, run the following to attach to the container: - docker exec -it -u 1001:1001 c10db6c70a bash -*** To gracefully shut down container, press: Ctrl-C -``` -Note that `c10db6c70a` in this example is the container ID, which will change each time the -command is run. The `1001:1001` represents a mapping of users into the container, and will change -between systems and users. As stated, pressing `Ctrl-C` in that bash terminal will shut -down the container. To attach to the container, run the given command in a different bash terminal. - -This will bring you into the docker container, and bring up a bash prompt there: -``` -$ docker exec -it -u 1001:1001 c10db6c70a bash -groups: cannot find name for group ID 1001 -I have no name!@c10db6c70a81:/workspace$ -``` -The groups error and the user name `I have no name!` may show up, depending on the host system, and -can be safely ignored. This is only due to host user not having a corresponding group ID inside -the container. - -Once inside the container, you should be able to run or import armory as required: -``` -I have no name!@c10db6c70a81:/workspace$ armory version -0.13.0 -I have no name!@c10db6c70a81:/workspace$ python -Python 3.7.6 (default, Jan 8 2020, 19:59:22) -[GCC 7.3.0] :: Anaconda, Inc. on linux -Type "help", "copyright", "credits" or "license" for more information. ->>> import armory ->>> -``` - -Please see [running_armory_scenarios_interactively.ipynb](../notebooks/running_armory_scenarios_interactively.ipynb) for a tutorial on running Armory interactively. - -Note: We do not recommend using `--interactive` mode for installing custom requirements. You may -run into permissions issues, as everything is installed as root, but the armory user is not run -as root, to prevent potential security issues. Instead, we recommend creating a custom Docker image, -as described above. - -## Building Images from Source -When using a released version of armory, docker images will be pulled as needed when -evaluations are ran. However if there are issues downloading the images (e.g. proxy) -they can be built from the release branch of the repo: -``` -git checkout -b r0.16.0 -bash docker/build-base.sh -python docker/build.py [--no-pull] -``` - -If possible, we recommend downloading the base image instead of building, which can be done by removing the `--no-pull` argument from `build.py`. - - -## Docker Volume Mounts -When launching an ARMORY instance several host directories will be mounted within the -docker container. Note, the host directory path for datasets, saved_models, and -outputs are configurable. To modify those directories simply run `armory configure`. -The defaults are shown below: - - -| Host Path | Docker Path | -|:----------: | :-----------: | -| os.getcwd() | /workspace | -| ~/.armory/datasets | /armory/datasets | -| ~/.armory/saved_models | /armory/saved_models | -| ~/.armory/outputs | /armory/outputs | - - -When using these paths in code, armory provides a programatic way to access these -directories. - -### PyTorch model persistent storage - -If you are using the Armory PyTorch container, published models from PyTorch Hub -will often need to be retieved from a remote source. To avoid re-download of -that data on each container run, these will be stored in the -`/armory/saved_models/pytorch` container directory which is normally mapped to -`~/.armory/saved_models` on the host as shown in the table above. - - -#### Utilizing the paths -``` -from armory import paths -runtime_paths= paths.runtime_paths() -runtime_paths.dataset_dir -runtime_paths.saved_model_dir -``` - - -## Using GPUs with Docker -Armory uses the nvidia runtime to use GPUs inside of Docker containers. - -### Config GPU usage - -This can be specified in JSON config files with "sysconfig" as follows: -``` - ... - "sysconfig": { - ... - "gpus": "7", - "use_gpu": true - } - ... -``` -The `use_gpu` flag takes a boolean true/false value, and specifies whether to use the gpu or default to cpu. -The `gpus` flag is optional, and is ignored if `use_gpu` is false. If `use_gpu` is true, it defaults to using all GPUs. - If present, the value should be a `,`-separated list of numbers specifying the GPU index in `nvidia-smi`. - For instance, `"gpus": "2,4,7"` would enable three GPUs with indexes 2, 4, and 7. - Setting the field to be `all` will enable use of all available gpus, i.e. `"gpus": "all"` will enable all GPUs. - -### Command line GPU usage - -When using the `armory` commands `run`, `launch`, or `exec`, you can specify or override the above -`use_gpu` and `gpus` fields in the config with the following command line arguments: -1) `--use_gpu` -This will enable gpu usage (it is False by default). -Using the `--gpus` argument will override this field and set it to True. - -2) `--gpus` -This will enable the specified GPUs, similar to the docker `--gpus` argument. -The argument of this must be one of the following: - a) `--gpus all` - use all GPUs - b) `--gpus #` - use the GPU with the specified number. Example: `--gpus 2` - c) `--gpus #,#,...,#` - use the GPUs from the comma-separated list. Example: `--gpus 1,3` -If `--gpus` is not specified, it will default to the config file if present for `run`, -and will default to `all` if not present in `run` or when using `launch` and `exec`. - -Examples: -``` -armory run scenario_configs/mnist_baseline.json --use-gpu -armory launch tf2 --gpus=1,4 --interactive -armory exec pytorch --gpus=0 -- nvidia-smi -``` - -### CUDA - -Armory docker images currently use CUDA 11.6 as the base image ( see [Dockerfile-Base](../docker/Dockerfile-base)) -and the TensorFlow versions we support require CUDA 10+. Previous versions of CUDA (e.g. CUDA<11.6) are not actively tested -by armory developers or CI tools. However, if previous versions of CUDA are needed, the following instructions should -provide a decent starting point. - -To use CUDA 10.2, you will need to rebuild the base image and the derived images with the following changes: -in [docker/Dockerfile-base](../docker/Dockerfile-base) change: -```bash -FROM nvidia/cuda:11.6.1-cudnn8-runtime-ubuntu20.04 -``` -to -```bash -FROM nvidia/cuda:10.2-cudnn8-runtime-ubuntu18.04 -``` -and then change `cudatoolkit=11.6 \` to `cudatoolkit=10.2 \`. - -Again, this is not actively tested, so it may require further modification of library dependencies to -work appropriately. Also, while PyTorch does support CUDA 9, we do not provide support in armory due to -TFDS dependencies and we do not recommend using versions less than the standard 11.6. - -## Docker Setup -Depending on the evaluation, you may need to increase the default memory allocation for -docker containers on your system. - -Linux does not limit memory allocation, but on Mac and Windows this defaults to 2 GB -which is likely insufficient. See the docker documentation to change this: -* [Mac](https://docs.docker.com/docker-for-mac/) -* [Windows](https://docs.docker.com/docker-for-windows/) - - -## Docker Image Maintenance -Since there are new docker images for every release of ARMORY, you may want to clean up -your docker image cache as you increase versions. - -To display the set of current images on your machine, you can run: -``` -docker images -``` -To delete images, see the docs for [docker rmi](https://docs.docker.com/engine/reference/commandline/rmi/). - - -### Docker Container Maintenance -In order to see the set of containers that are running, run: -``` -docker ps -``` -ARMORY will attempt to gracefully shut down all containers it launches; -however, certain errors may prevent shutdown and leave running containers. -To shut down these containers, please see the docs for -[docker stop](https://docs.docker.com/engine/reference/commandline/stop/) -and [docker kill](https://docs.docker.com/engine/reference/commandline/kill/). - -## Running without docker - -Armory has partial support for users wishing to run without docker. Currently, the -`armory run` command can be run without Docker in Linux environments. To run without -docker, either set the `docker_image` field to be null in the scenario -configuration json file, or call `armory run` with the --no-docker option. - -Armory can also download and use datasets without docker. To use the download command, -simply add the `--no-docker` option, which will skip downloading the images and -run it in host mode: -``` -armory download --no-docker -``` - -After datasets have been downloaded, they can be used outside of docker by setting -the pathing mode to host in python: -```python -from armory import paths -paths.set_mode("host") -from armory.data import datasets -ds = datasets.mnist() -x, y = next(ds) -``` - -### Environment setup -NOTE: The listing of libraries needed for Armory when run on host is available at -`pyproject.toml`. You will need to manually install the requirements in -that file that match your framework (TF2, PyTorch). - -# publishing a new base - -As of armory v0.15, there is a base docker image which is pushed to dockerhub -occasionally. The container description is in [Dockerfile-base](docker/Dockerfile-base) -and there is a tiny [build-base.sh](docker/build-base.sh) helper script. - -We do not currently have any verification tests for this build. -**TODO**: add validation tests and make this a CI deployment job, perhaps. - - -## docker credentials - -In the GARD Keeper Password manager is the password for twosixarmory on dockerhub. -Run - - docker login --username twosixarmory - -and give it the password when prompted. It should respond `Login Succeeded` - -## push the new image - -This step is "push to production": it changes the latest image on our official -repository, so has the potential to break all container builds by any armory -user anywhere. - -If you do discover a breaking change, the only fix is to push a new image, since -[dockerhub does not allow reversion](https://stackoverflow.com/questions/55475080/how-can-i-revert-my-last-push-on-hub-docker-com) - -There is a `--dry-run` option which allows you to see what commands would be run. -It's a good idea to run that first: - - bash docker/build-base.sh --dry-run --push - -When satisfied that you want that run: - - bash docker/build-base.sh --push - -Will tag the image properly and push it to dockerhub. There will be two -new tags created at https://hub.docker.com/r/twosixarmory/base - - twosixarmory/base:latest - twosixarmory/base:VERSION - -both with the same digest. - -You might want to end with - - docker logout - -to avoid accidental `docker push` commands from using the shared account. diff --git a/docs/original/docker/.dockerignore b/docs/original/docker/.dockerignore deleted file mode 100644 index c47d00e8a..000000000 --- a/docs/original/docker/.dockerignore +++ /dev/null @@ -1,39 +0,0 @@ -# ignore .conda, etc. -.* - -# Allowing .git -!.git/ - -# Ensure all git files are present. Otherwise, armory will be "dirty" inside container, which will change the version -!.dockerignore -!.flake8 -!.github/ -!.gitignore -!.yamllint - -# ignore large directories -datasets/ - -# ignore temp directories -outputs/ -dist/ -tmp/ - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ -venv* - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.pyc -*.py[cod] -*$py.class - -# mypy -.mypy_cache/ diff --git a/docs/original/docker/Dockerfile-armory b/docs/original/docker/Dockerfile-armory deleted file mode 100644 index 5b12f26e5..000000000 --- a/docs/original/docker/Dockerfile-armory +++ /dev/null @@ -1,136 +0,0 @@ -########################################################################################## -# -# ARMORY Baseline Docker Image -# -# This File contains the baseline image for Armory docker images. All framework -# based images should inhereit from this image using: -# FROM twosixlabs/armory-baseline AS armory-baseline -# -########################################################################################## - -FROM nvidia/cuda:11.6.2-cudnn8-runtime-ubuntu20.04 - -# pip Configuration - https://pip.pypa.io/en/stable/user_guide/#config-file -ARG PIP_DISABLE_PIP_VERSION_CHECK=1 -ARG PIP_NO_CACHE_DIR=1 - -# Temporary fix for broken nvidia package checksum -# RUN rm -f /etc/apt/sources.list.d/nvidia-ml.list - -# Basic Apt-get Bits -RUN apt-get -y -qq update && \ - DEBIAN_FRONTEND=noninteractive \ - apt-get install -y \ - wget \ - vim \ - build-essential \ - git \ - curl \ - libgl1-mesa-glx \ -# libglib2.0-0 \ - && rm -rf /var/lib/apt/lists/* -# libgl1-mesa-glx is needed for cv2 (opencv-python) - -# Install Conda -RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && \ - /bin/bash ~/miniconda.sh -b -p /opt/conda && \ - rm ~/miniconda.sh && \ - /opt/conda/bin/conda clean -tipsy && \ - ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh -# ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \ -# echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \ -# echo "conda activate base" >> ~/.bashrc && \ -# echo 'alias ll="ls -al"' >> ~/.bashrc - -ENV PATH=/opt/conda/bin:$PATH - -# TensorFlow requirement -ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/conda/lib/ - -# NOTE: using mamba because conda fails when trying to solve for environment -RUN conda install -c conda-forge -n base mamba \ - && conda clean --all - - -WORKDIR /armory-repo - -COPY environment.yml /armory-repo/ -# NOTE: This COPY command is filtered using the `.dockerignore` file -# in the root of the repo. -COPY ./ /armory-repo - - -RUN mamba env update -f environment.yml -n base --prune \ - && mamba clean --all - -#RUN /opt/conda/bin/conda env update -f environment.yml --prune \ -# && /opt/conda/bin/conda clean --all -# NOTE: with conda version 5, will need to set channel priority to flexible (as strict will become default) - -# NOTE: Armory requirements and ART requirements are installed here to make patch updates fast and small -RUN echo "Installing TensorFlow and ART/Armory requirements via pip" -RUN /opt/conda/bin/pip install --no-cache-dir \ - tensorflow-datasets==4.6 \ - tensorflow==2.10 \ - tensorboardx \ - boto3 \ - opencv-python \ - ffmpeg-python \ - pytest \ - loguru \ - docker \ - jsonschema \ - requests \ - pydub \ - transformers \ - six \ - setuptools \ - tqdm -# transformers is used for the Entailment metric only -# pydub required for ART mp3 defense - - -## Deepspeech Requirements -RUN pip install git+https://github.com/romesco/hydra-lightning/\#subdirectory=hydra-configs-pytorch-lightning - -RUN echo "Updating pip" && \ - pip install --upgrade pip && \ - echo "Building Armory from local source" && \ - pip install --no-compile --editable '.[developer]' && \ - echo "Configuring Armory..." && \ - armory configure --use-default && \ - echo "Cleaning up..." && \ - rm -rf /armory-repo/.git - -RUN pip install \ - git+https://github.com/ifzhang/ByteTrack.git \ - thop \ - lap \ - Cython && \ - # Requires cython for install, so will fail if run in the same pip install as cython - pip install cython-bbox - - -WORKDIR /workspace - - -# ------------------------------------------------------------------ -# DEVELOPER NOTES: -# ------------------------------------------------------------------ -# TODO: determine if this environment setup is needed -# $ ENV LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/usr/local/cuda/lib64" - -# NOTE: -# - pytorch-lightning >= 1.5.0 will break Deep Speech 2 -# - torchmetrics >= 0.8.0 will break pytorch-lightning 1.4 -# - hydra-lightning installs omegaconf -# - google-cloud-storage needed for checkpoint.py import -# - only sox python bindings are installed; underlying sox binaries not needed - -# NOTE: Listed dependencies of PyTorch Deep Speech 2, but do not appear -# to be used for inference (only for training), they are not installed: -# - torchelastic -# - wget -# - flask -# - fairscale -# ------------------------------------------------------------------ \ No newline at end of file diff --git a/docs/original/docker/README.md b/docs/original/docker/README.md deleted file mode 100644 index f03934ba4..000000000 --- a/docs/original/docker/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# Docker -Armory is intended to be a lightweight python package which standardizes all evaluations -inside a docker container. - -## Updates - - As of Armory version 0.16.0 the `docker/build.sh` script has been deprecated. - - Standardized python build script: `python docker/build.py --help` - - As of Armory version 0.15.0, we no longer support or publish a `tf1` image. - - If `tf1` functionality is needed, please use the `tf2` image and use `tf1` compatibility mode. - - -### Custom Images -If you wish to utilize custom images for armory, these can be directly specified by -either the `"docker_image"` field of the [config file](configuration_files.md) -of `armory run ` or in the CLI of the `launch` and `exec` commands, -as in `run launch `. - -Note: since Armory executes commands on detached containers, the `CMD` of the Docker image -will be *ignored* and replaced with `tail -f /dev/null` to ensure that the container does not -exit while those commands are being executed. - - -## Building Images from Source -When using a released version of armory, docker images will be pulled as needed when -evaluations are ran. However if there are issues downloading the images (e.g. proxy) -they can be built from the release branch of the repo: -``` -git checkout -b r0.16.0 -bash docker/build-base.sh -python docker/build.py [--no-pull] -``` - -If possible, we recommend downloading the base image instead of building, which can be done by removing the `--no-pull` argument from `build.py`. - - -## Docker Volume Mounts -Host directory path for datasets, saved_models, and outputs are configurable. To modify those directories simply run `armory configure`. -The defaults are shown below: - - -| Host Path | Docker Path | -|:----------: | :-----------: | -| os.getcwd() | /workspace | -| ~/.armory/datasets | /armory/datasets | -| ~/.armory/saved_models | /armory/saved_models | -| ~/.armory/outputs | /armory/outputs | - - -When using these paths in code, armory provides a programatic way to access these -directories. - - -## Using GPUs with Docker -Armory uses the nvidia runtime to use GPUs inside of Docker containers. - -### CUDA -Armory docker images currently use CUDA 11.6 as the base image ( see [Dockerfile-Base](../docker/Dockerfile-base)) -and the TensorFlow versions we support require CUDA 10+. Previous versions of CUDA (e.g. CUDA<11.6) are not actively tested -by armory developers or CI tools. However, if previous versions of CUDA are needed, the following instructions should -provide a decent starting point. - -To use CUDA 10.2, you will need to rebuild the base image and the derived images with the following changes: -in [docker/Dockerfile-base](../docker/Dockerfile-base) change: -```bash -FROM nvidia/cuda:11.6.1-cudnn8-runtime-ubuntu20.04 -``` -to -```bash -FROM nvidia/cuda:10.2-cudnn8-runtime-ubuntu18.04 -``` -and then change `cudatoolkit=11.6 \` to `cudatoolkit=10.2 \`. - -Again, this is not actively tested, so it may require further modification of library dependencies to -work appropriately. Also, while PyTorch does support CUDA 9, we do not provide support in armory due to -TFDS dependencies and we do not recommend using versions less than the standard 11.6. - - -## Docker Setup -Depending on the evaluation, you may need to increase the default memory allocation for -docker containers on your system. - -Linux does not limit memory allocation, but on Mac and Windows this defaults to 2 GB -which is likely insufficient. See the docker documentation to change this: -* [Mac](https://docs.docker.com/docker-for-mac/) -* [Windows](https://docs.docker.com/docker-for-windows/) - -### Environment setup -NOTE: The listing of libraries needed for Armory when run on host is available at -`pyproject.toml`. You will need to manually install the requirements in -that file that match your framework (TF1, TF2, PyTorch). diff --git a/docs/original/docker/build-base.sh b/docs/original/docker/build-base.sh deleted file mode 100644 index db832a631..000000000 --- a/docs/original/docker/build-base.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env bash -set -e - -usage() { echo "usage: $0 [--dry-run] [--push]" 1>&2; exit 1; } - -dryrun="${ARMORY_DRYRUN:-}" -push="${ARMORY_PUSH:-}" - -while [ "${1:-}" != "" ]; do - case "$1" in - -n|--dry-run) - echo "dry-run requested. not building or pushing to docker hub" - dryrun="echo" ;; - --push) - push=true ;; - *) - usage ;; - esac - shift -done - -echo "Building the base image locally" -$dryrun docker build --force-rm --file ./docker/Dockerfile-armory -t twosixarmory/armory:latest --progress=auto . - -if [[ -z "$push" ]]; then - echo "" - echo "If building the framework images locally, use the '--no-pull' argument. E.g.:" - echo " python docker/build.py all --no-pull" - exit 0 -fi - -tag=$(python -m armory --version) -echo tagging twosixarmory/base:latest as $tag for dockerhub tracking -$dryrun docker tag twosixarmory/base:latest twosixarmory/base:$tag - -echo "" -echo "If you have not run 'docker login', with the proper credentials, these pushes will fail" -echo "see docs/docker.md for instructions" -echo "" - -# the second push should result in no new upload, it just tag the new image as -# latest -$dryrun docker push twosixarmory/armory:$tag -$dryrun docker push twosixarmory/armory:latest diff --git a/docs/original/faqs.md b/docs/original/faqs.md deleted file mode 100644 index 3811314fb..000000000 --- a/docs/original/faqs.md +++ /dev/null @@ -1,67 +0,0 @@ -# Frequently Asked Questions - -### What do the armory version strings mean? - -As of Armory 0.16 we are using a newer mechanism for versioning which is -intended to help armory developers and some users better record the precise -code commit used in a build. - -In the normal case, as a regular armory user, - - pip install armory-testbed - armory --version - -will yield an undecorated version number like `0.16.0`. This version also -gets recorded in armory output files, so if you are running a clean release version, -you won't see anything different. - -If you modify the armory source and then rebuild it, the version will contain a -git commit id. For example, my most recent build when I modified my local source -was - - 0.16.0.builda7492e4 - -This shows that the build was made on a 0.16.0 base with the most recent commit -being `456abc`. This is useful for developers who want to know exactly what code -produced this build. It also allows recreation of a prior version if needed by - - git checkout a7492e4 - pip install -e . - -#### Why do Datasets return NumPy Arrays? -Currently, the ART toolbox only accepts NumPy arrays as inputs to attacks, defenses -and model fitting. It is understood that this is an inefficient way to utilize data -since it requires a conversion from FrameworkTensor -> ndarray -> FrameworkTensor. - -Framework specific attacks / defenses are on the roadmap for ART and when available we -will switch to having PyTorch or TensorFlow data generators. - - -#### How/where do I perform dataset preprocessing when running a scenario? -As of Armory 0.12, dataset preprocessing should be performed inside the model. The functions -to retrieve datasets in [armory/data/datasets.py](../armory/data/datasets.py) do each accept -a `preprocessing_fn` kwarg that can used when loading datasets outside the context of a scenario. -However, this kwarg is by default set to the canonical preprocessing function for each dataset and -is not configurable when running Armory scenarios. - - -#### Why are datasets loaded with non-configurable "canonical" preprocessing during Armory scenarios? -Standardizing the dataset format simplifies the measuring of perturbation distance and -allows for easier comparison across different defenses and attacks. - - -#### Accessing underlying wrapped model -There are many times when creating a scenario you may want to access the underlying -framework model that has been wrapped as an ART classifier. In the future we'll have -a convenience method to access the models through an ART api, but in the short term they -can be accessed as follows: - -KerasWrapper: -``` -underlying_model = wrapped_classifier._model -``` - -PyTorchWrapper: -``` -underlying_model = wrapped_classifier._model._model -``` diff --git a/docs/original/getting_started.md b/docs/original/getting_started.md deleted file mode 100644 index 02a643170..000000000 --- a/docs/original/getting_started.md +++ /dev/null @@ -1,124 +0,0 @@ -# Getting Started - -## Installation -Armory can be installed from PyPi: -``` -pip install armory-testbed[framework-flavor] -``` - -Where `framework-flavor` is one of `tensorflow`, `pytorch` or `deepspeech` -as described below in [the armory flavors](#the-armory-flavors). - -When a user runs a given configuration file, the necessary docker image, datasets and -model weights will be pulled as needed. We do have convenience functions to download -all images, datasets and model weights for a scenario set release. This can take a -while, so you may want to run it overnight: -``` -git clone https://github.com/twosixlabs/armory-example.git -cd armory-example -# First set of examples: -armory download scenario_download_configs/scenarios-set1.json -# Second set of scenarios: -armory download scenario_download_configs/scenarios-set2.json -``` -If you are not using Docker, then add `--no-docker`: -``` -armory download scenario_download_configs/scenarios-set*.json --no-docker -``` - -If you want to download with a specific image, use: -``` -armory download --docker-image scenario_download_configs/scenarios-set*.json -``` - -## Baseline models -The armory package contains several framework specific baseline models that can be used -during evaluation. Please see our documentation on baseline models for more information -about what is available and what pretrained weights can be pulled from S3: - -[Baseline Model Docs](baseline_models.md) - -## Running an evaluation -Evaluations are typically run through the use of configuration files. See the -[config file documentation](/docs/configuration_files.md) for information regarding the -schema and what the fields refer to. - -To run a configuration: -``` -git clone https://github.com/twosixlabs/armory-example.git -cd armory-example -armory run official_scenario_configs/cifar10_baseline.json -``` - -## External Repos -You may want to include code from an external repository that is outside of your -current working directory project. This is fully supported by Armory and more -information can be found in the [external repo documentation](/docs/external_repos.md). - -## the armory flavors - -Armory supports multiple frameworks: - - - tensorflow - - pytorch - - deepspeech - -In releases prior to 0.16, there was a complex set of `*-requirements.txt` files -that were needed to provision the python environment for the various frameworks. -As of Armory 0.16, these have all been consolidated into the standard -`pyproject.toml` at the repository root. - -We now use the optional-dependencies feature of pyproject which requires -the selection of a flavor to be specified at install time. For example: - - pip install armory-testbed - -installs no framework libraries so will fail to run any framework dependent code. Future -armory releases may use this flavorless base. To install the tensorflow flavor: - - pip install armory-testbed[tensorflow] - -which installs the libraries needed for tensorflow evaluations. Similarly, - - pip install armory-testbed[pytorch] - -or - - pip install armory-testbed[deepspeech] - -depending on the framework you want to use. We don't recommend trying to -install multiple frameworks at the same time as this may lead to dependency -conflicts. So - - pip install armory-testbed[tensorflow,pytorch] - -is unsupported and may not even install. - -## additional flavors - -You can freely add `jupyterlab` to the flavor list to as needed, for example - - pip install armory-testbed[tensorflow,jupyterlab] - -People developing armory will likely want to add the `developer` flavor to their -set: - - pip install armory-testbed[deepspeech,developer,jupyterlab] - -Developers who are creating new Armory datasets will need - - pip install armory-testbed[datasets-builder] - -## editable installs - -As before, the `--editable` flag can be used to install in editable mode -which is often useful for development. - -The `.` installation target is also supported, but even that requires -a flavor specification. That is, where you might have previously run - - pip install --editable . - -you now need to specify a flavor: - - pip install --editable .[pytorch] diff --git a/docs/original/index.md b/docs/original/index.md deleted file mode 100644 index 13e9933f8..000000000 --- a/docs/original/index.md +++ /dev/null @@ -1,98 +0,0 @@ -# Welcome to Armory Testbed - -## Overview - -ARMORY is a test bed for running scalable evaluations of adversarial defenses. -Configuration files are used to launch local or cloud instances of the ARMORY docker -containers. Models, datasets, and evaluation scripts can be pulled from external -repositories or from the baselines within this project. - -Our evaluations are created so that attacks and defenses may be -interchanged. To do this we standardize all attacks and defenses as subclasses of -their respective implementations in IBM's [adversarial-robustness-toolbox](https://github.com/IBM/adversarial-robustness-toolbox) - - -## Usage - -There are three ways to interact with the armory container system. - -1) `armory run` - -* `armory run `. -This will run a [configuration file](configuration_files.md) end to end. Stdout -and stderror logs will be displayed to the user, and the container will be removed -gracefully upon completion. Results from the evaluation can be found in your output -directory. - -* `armory run --interactive`. -This will launch the framework-specific container specified in the -configuration file, copy the configuration file into the container, and provide -the commands to attach to the container in a separate terminal and run the -configuration file end to end while attached to the container. Similar to -non-interactive mode, results from the evaluation can be found in the output -directory. To later close the interactive container simply run CTRL+C from the -terminal where this command was ran. Please see [running_armory_scenarios_interactively.ipynb](../notebooks/running_armory_scenarios_interactively.ipynb) for a tutorial on running Armory interactively. - -2) `armory launch` - -* `armory launch --interactive`. -This will launch a framework specific container, with appropriate mounted volumes, for -the user to attach to for debugging purposes. A command to attach to the container will -be returned from this call, and it can be ran in a separate terminal. To later close -the interactive container simply run CTRL+C from the terminal where this command was -ran. - -* `armory launch --jupyter`. -Similar to the interactive launch, this will spin up a container for a specific -framework, but will instead return the web address of a jupyter lab server where -debugging can be performed. To close the jupyter server simply run CTRL+C from the -terminal where this command was ran. - -3) `armory exec` - -* `armory exec -- `. -This will run a specific command within a framework specific container. A notable use -case for this would be to run test cases using pytest. After completion of the command -the container will be removed. - -To use custom docker images with `launch` or `exec`, replace `` with its -full name: ``. For use with `run`, you will need to modify the -[configuration file](configuration_files.md). - -Note: Since ARMORY launches Docker containers, the python package must be ran on -system host (i.e. not inside of a docker container). - -For more information, see [command line usage](command_line.md). - -### Example usage: -``` -pip install armory-testbed -armory configure -git clone https://github.com/twosixlabs/armory-example.git -cd armory-example -armory run official_scenario_configs/cifar10_baseline.json -``` - -### What is available in the container: -All containers have a pre-installed armory package installed so that baseline models, -datasets, and scenarios can be utilized. - -Additionally, volumes (such as your current working directory) will be mounted from -your system host so that you can modify code to be ran, and retrieve outputs. -For more information on these mounts, please see our [Docker documentation](docker.md#docker-volume-mounts) - -## Scenarios -Armory provides several baseline threat-model scenarios for various data modalities. -When running an armory configuration file, the robustness of a defense will be -evaluated against that given scenario. For more information please see our -[Scenario Documentation](scenarios.md). - -## Dataset licensing -See [dataset_licensing.md](dataset_licensing.md) for details related to the licensing of datasets. - -## Acknowledgment -This material is based upon work supported by the Defense Advanced Research Projects -Agency (DARPA) under Contract No. HR001120C0114. Any opinions, findings and -conclusions or recommendations expressed in this material are those of the author(s) -and do not necessarily reflect the views of the Defense Advanced Research Projects -Agency (DARPA). diff --git a/docs/original/instrumentation_examples.md b/docs/original/instrumentation_examples.md deleted file mode 100644 index 5488920c6..000000000 --- a/docs/original/instrumentation_examples.md +++ /dev/null @@ -1,181 +0,0 @@ -# Armory Instrumentation Examples: Measuring Experiment Artifacts Using Probes and Meters -For an introduction to `Probe`s and `Meter`s, please refer to [Measurement Overview](./metrics.md#instrumentation). We assume the user is capturing artifacts from the model or attack and wishes to use `Probe`s and `Meter`s to monitor certain variables within the code. - -Recall the steps for a minimal working example (in [Measurement Overview](./metrics.md#instrumentation)): -1. Create `Probe` via `get_probe(name)` -2. Place `Probe` actions -3. Create `Meter` with processing functions that take input from created `Probe` -4. Connect `Meter` to `Hub` via `get_hub().connect_meter(meter)` - -The examples will show how each of these steps are accomplished. - -## Example 1: Measuring a Model Layer's Output -### User Story -I am interested in the layer output from the second `relu` activation of a `forward` method located in `armory/baseline_models/pytorch/cifar.py`. -### `Probe` Example Code -The code below is an example of how to accomplish steps 1 and 2 (note the lines of code with `# added` comments at the end) for a model code that the user is modifying. -```python -""" -CNN model for 32x32x3 image classification -""" -... - -from armory.instrument import get_probe # added -probe = get_probe("my_model") # added - -class Net(nn.Module): - ... - - def forward(self, x: torch.Tensor) -> torch.Tensor: - x = x.permute(0, 3, 1, 2) # from NHWC to NCHW - x = self.conv1(x) - x = F.relu(x) - x = F.max_pool2d(x, 2) - x = self.conv2(x) - x = F.relu(x) - x_out = x.detach().cpu().numpy() # added - probe.update(layer_output=x_out) # added - x = F.max_pool2d(x, 2) - x = torch.flatten(x, 1) - x = self.fc1(x) - x = F.relu(x) - x = self.fc2(x) - output = F.log_softmax(x, dim=1) - return output - -... -``` - -#### Step 1 -After importing `get_probe`, `probe = get_probe("my_model")` creates a `Probe` object with the name `"my_model"`, which is what the user can refer to later to apply processing functions through a `Meter` object. - -#### Step 2 -`x_out = x.detach().cpu().numpy()` is taking the layer output of interest (second `relu` activation output) and converting the tensor to `numpy` array on the CPU, which will be passed to `probe`. An updated value of `x_out` is stored in `layer_output` via `probe.update(layer_output=x_out)`. Like the `Probe` name `"my_model"`, `layer_output` can be referenced by the user later to apply additional processing functions through a `Meter` object. - -### `Meter` Example Code -Now that a `Probe` instance has been created, we need to create a `Meter` object to accept any updated values from `Probe` and apply further processing that the user desires. We can create the `Meter` in a function added to a local Python script we'll name `user_init_script.py`. In [Config Setup](#config-setup) shortly below, we'll show how to ensure this code is run during scenario initialization. -```python -from armory.instrument import get_hub, Meter - -def set_up_meter(): - meter = Meter( - "my_arbitrary_meter_name", lambda x: x, "my_model.layer_output" - ) - get_hub().connect_meter(meter) -``` -#### Step 3 -In this particular example, the `Meter` accepts 3 inputs: a meter name, a metric/function for processing, and a argument name to pass the metric/function. -- The meter name (`"my_arbitrary_meter_name"`) can be arbitrary within this context -- For the scope of this document, we only consider simple `Meter`s with the identity function as a metric i.e. `Meter` will record variables monitored by `Probe` as-is (thus `lambda x: x`) -- The argument passed to the metric/function follows a `.`-separated format (`"my_model.layer_output"`), which needs to be consistent with `Probe` setup earlier: - - `my_model` matches input in `probe = get_probe("my_model")` - - `layer_output` matches variable name in `probe.update(layer_output=x_out)` - -#### Step 4 -For the scope of this document, we don't dwell on what `armory` is doing with `get_hub().connect_meter(meter)` other than to mention this step is necessary for establishing the connection between `meter` created in `armory/user_init_script.py` and `probe` created in the modified version of `armory/baseline_models/pytorch/cifar.py`. - -### Config Setup -Last but not least, the config file passed to `armory run` needs to be updated for these changes to take effect, which is accomplished by adding the `"user_init"` block (please refer to [User Initialization](./scenarios.md#user-initialization) for more details): -```json -... - "user_init": { - "module": "user_init_script", - "name": "set_up_meter" - }, -... -``` -This will prompt armory to run `set_up_meter` in `user_init_script.py` before anything else is loaded for the scenario. - -## Example 2: Measuring Attack Artifact -### User Story -I defined a custom attack with `CARLADapricotPatch` in `armory/custom_attack.py`, and I am interested in the patch after ***every iteration***, which is generated by `CARLADapricotPatch._augment_images_with_patch` and returned as an output. -### `Probe` Example Code -```python -from armory.art_experimental.attacks.carla_obj_det_patch import CARLADapricotPatch -from armory.instrument import get_probe -probe = get_probe("my_attack") - -class CustomAttack(CARLADapricotPatch): - def _augment_images_with_patch(self, **kwargs): - return_value = super()._augment_images_with_patch(**kwargs) - x_patch, patch_target, transformations = return_value - probe.update(attack_output=x_patch) - - return return_value -``` -#### Step 1 -This step is the same as before, except `Probe` name is set to`"my_attack"`, which is what the user can refer to later to apply processing functions through a `Meter` object. - -#### Step 2 -The only difference between `CustomAttack` and `CARLADapricotPatch` is that `_augment_images_with_patch` has been redefined to call on `CARLADapricotPatch._augment_images_with_patch` and then have `probe` update the value for `x_patch` that results from that call. An updated value of `x_patch` is stored in `attack_output` via `probe.update(attack_output=x_patch)`. Like the `Probe` name `"my_attack"`, `attack_output` can be referenced by the user later to apply additional processing functions through a `Meter` object. - -### `Meter` Example Code -As in [Example 1](#meter-example-code), we need to create a `Meter` object to accept any updated values from `Probe` and apply further processing that the user desires. We can create the `Meter` in a function added to a local Python script `user_init_script.py`. In [Config Setup](#config-setup-1) shortly below, we'll show how to ensure this code is run during scenario initialization. -```python -from armory.instrument import get_hub, Meter - -def set_up_meter(): - meter = Meter( - "my_arbitrary_meter_name", lambda x: x, "my_attack.attack_output" - ) - get_hub().connect_meter(meter) -``` -#### Step 3 -As before, the `Meter` accepts 3 inputs: a meter name, a metric/function for processing, and a argument name to pass the metric/function. -- The meter name (`"my_arbitrary_meter_name"`) can be arbitrary within this context -- Again, `Meter` will record variables monitored by `Probe` as-is (thus `lambda x: x`) -- The argument passed to the metric/function follows a `.`-separated format (`"my_attack.attack_output"`), which needs to be consistent with `Probe` setup earlier: - - `my_attack` matches input in `probe = get_probe("my_attack")` - - `attack_output` matches variable name in `probe.update(attack_output=x_patch)` - -#### Step 4 -Again, `get_hub().connect_meter(meter)` is necessary for establishing the connection between `meter` created in `armory/user_init_script.py` and `probe` created in `armory/custom_attack.py`. - -### Config Setup -Last but not least, the config file passed to `armory run` needs to be updated for these changes to take effect, which is accomplished by adding the `"user_init"` block (please refer to [User Initialization](./scenarios.md#user-initialization) for more details): -```json -... - "user_init": { - "module": "user_init_script", - "name": "set_up_meter" - }, -... -``` -This will prompt armory to run `set_up_meter` in `user_init_script.py` before anything else is loaded for the scenario. - -## Saving Results -By default, outputs from `Meter`s will be saved to the output `json` file after `armory run`. Whether this suffices for the user depends on what the user is trying to measure. - -Users who have tried the examples in this document, however, may run into some of the following warning logs: -> 2022-12-16 19:34:36 30s WARNING armory.instrument.instrument:_write:856 record (name=my_arbitrary_meter_name, batch=0, result=...) size > max_record_size 1048576. Dropping. - -Outputs are saved to a `json` file because of a default `ResultWriter` class tied to the `Meter` class, which has a `max_record_size` limit for each record. Any record that exceeds `max_record_size` will not save to the `json` file. That the outputs exceed a size limit also suggests that a `json` file may not be the best file type to save to. To work around these behaviors, we can define a new `Writer` subclass (`ResultWriter` is also a `Writer` subclass) to work with our examples that does not have a size limit and will save to another filetype, such as a `png` file, since we are saving data for an image. Below is an updated `user_init_script.py` for Example 2 with a new `ImageWriter` class, which uses the `export` method of `ObjectDetectionExporter` to save an image, and a `set_up_meter_writer` function that will be executed with the `user_init` block: -```python -from armory.instrument import get_hub, Meter, Writer -from armory.instrument.export import ObjectDetectionExporter - -class ImageWriter(Writer): - def __init__(self, output_dir): - super().__init__() - self.output_dir = output_dir - self.iter_step = 0 - self.current_batch_index = 0 - self.exporter = ObjectDetectionExporter(self.output_dir) - - def _write(self, name, batch, result): - if batch != self.current_batch_index: - self.current_batch_index = batch # we are on a new batch - self.iter_step = 0 # restart iter_step count - basename = f"{name}_batch_{batch}_iter_{self.iter_step}" - # assume single image per batch: result[0] - self.exporter.export(x = result[0], basename = basename) - self.iter_step += 1 # increment iter_step - -def set_up_meter_writer(): - meter = Meter( - "my_attack_identity", lambda x: x, "my_attack.attack_output" - ) - writer = ImageWriter(output_dir = get_hub().export_dir) - meter.add_writer(writer) - get_hub().connect_meter(meter, use_default_writers=False) -``` \ No newline at end of file diff --git a/docs/original/integrate_tensorflow_datasets.md b/docs/original/integrate_tensorflow_datasets.md deleted file mode 100644 index 1d692f040..000000000 --- a/docs/original/integrate_tensorflow_datasets.md +++ /dev/null @@ -1,18 +0,0 @@ -# Instructions to Integrate TFDS Datasets - -1. Get the name, version number of the Tensorflow Dataset, and optionally the config: "name[/config]:version_number", where the brackets denote optional text. -2. Set the environmental variables ARMORY_PRIVATE_S3_ID and ARMORY_PRIVATE_S3_KEY to the appropriate keys with write access to the Armory S3 bucket. -3. From a locally cloned version of armory, on a new branch, run: -``` -python -m armory exec pytorch -- python -m armory.data.integrate_tfds name[/config]:version -``` -where the brackets denote optional text. - -The script will download and process the TFDS dataset, generate TF Records files, create a tarball, and upload the tarball to S3. It also will create a S3 checksum file in ```armory/data/cached_s3_checksums/{name}.txt``` - -4. Run ```git status``` to confirm the S3 checksum file was generated and to see the path of the template file. -5. Manually put the template code from ```TEMPLATE_{name}.txt``` in ```armory/data/datasets.py```. Create a context object that contains metadata and a preprocessing function that does appropriate integrity checks/input normalizing. See for example the [canonical fixed-size image preprocessing function](https://github.com/twosixlabs/armory/blob/deb7a469bf4a7497d14fdd87eba6417b5e44589f/armory/data/datasets.py#L617-L631) which checks the shapes of an image, and renormalizes it to be in the appropriate range defined by the context object (typically 0.0-1.0) with a standard type. See the documentation on dataset [preprocessing](https://armory.readthedocs.io/en/latest/datasets/#preprocessing) for more details. -6. [Optional] Add the dataset to the [SUPPORTED_DATASETS](https://github.com/twosixlabs/armory/blob/deb7a469bf4a7497d14fdd87eba6417b5e44589f/armory/data/datasets.py#L1498-L1511) dictionary by adding a key with the dataset's name and value of the dataset function from the template code. -7. [Optional] Create a continuous integration test for the dataset in ```tests/test_docker/test_dataset.py```, possibly using ```pytest.skip```. -8. Commit the changes to the branch on your fork of the Armory repo. -9. Open a PR to integrate the dataset. diff --git a/docs/original/library/README.md b/docs/original/library/README.md deleted file mode 100644 index 6cca959b7..000000000 --- a/docs/original/library/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Armory as a Library - -## strategy for decomposition - -1. Define the Experiment class which 1:1 maps from config.yaml -2. Pare down the function of Scenario as in #Scenario below -3. Flesh out the Experiment block class (e.g. Attack) with code pulled out of - Scenario - -## Experiment - -Experiment = json.load(config.json) - -This operation allows us to keep the concept of a config file, but becomes an -argument to Loader/Engine/etc. - - class Experiment: - load_from_file(path) - __init__(**kwargs) - -See [experiment.py](docs/experiment.py) for a sample implementation of the -various blocks of class Experiment. - -## Scenario - -Should be the bit of current armory.Scenario which is not related to loading -models, attacks, datasets, etc. This means that we need to method-by-method -figure out what is actually the Scenario and move everything else out of that -God object. diff --git a/docs/original/library/experiment.py b/docs/original/library/experiment.py deleted file mode 100644 index d6d5406fe..000000000 --- a/docs/original/library/experiment.py +++ /dev/null @@ -1,106 +0,0 @@ -# flake8: noqa -# psuedocode from the tiga days showing the intent of the Experiment class - -from importlib import import_module -import json -import os - -import yaml - -from armory.logs import log -from armory.utils import parse_overrides - - -class Attack: - name: str - module: str - knowledge: str - kwargs: dict - type: str = None - - -class Dataset: - name: str - module: str - framework: str - batch_size: int - - -class Defense: - name: str - type: str - module: str - kwargs: dict - - -class Metric: - means: bool - perturbation: str - record_metric_per_sample: bool - task: list - - -class Model: - name: str - module: str - weights_file: str = None - wrapper_kwargs: dict - model_kwargs: dict - fit_kwargs: dict - fit: bool - - -class Scenario: - function_name: str - module_name: str - kwargs: dict - - -class SystemConfiguration: - docker_image: str = None - gpus: str = None - external_github_repo: str = None - output_dir: str = None - output_filename: str = None - use_gpu: bool = False - - -class MetaData: - name: str - author: str - description: str - - -class Poison: - pass - - -class Experiment: - _meta: MetaData - poison: Poison = None - attack: Attack = None - dataset: Dataset - defense: Defense = None - metric: Metric = None - model: Model - scenario: Scenario - # sysconfig: SystemConfiguration = None - - # def save(self, filename): - # with open(filename, "w") as f: - # f.write(self.json()) - - -class Experiment(object): - """Execution Class to `run` armory experiments""" - - def __init__(self, experiment_, environment_): - log.info(f"Constructing Experiment using : \n{experiment_}") - self.exp_pars = experiment_ - self.env_pars = environment_ - log.info(f"Importing Scenario Module: {self.exp_pars.scenario.module_name}") - self.scenario_module = import_module(self.exp_pars.scenario.module_name) - log.info(f"Loading Scenario Function: {self.exp_pars.scenario.function_name}") - self.scenario_fn = getattr( - self.scenario_module, self.exp_pars.scenario.function_name - ) diff --git a/docs/original/logging.md b/docs/original/logging.md deleted file mode 100644 index b497fef6f..000000000 --- a/docs/original/logging.md +++ /dev/null @@ -1,128 +0,0 @@ -# logging facilities and options in armory - -Because the primary communication between armory and the user happens by way of logs, -the system and configuration options are broad, with reasonable defaults so that it does -the right thing to start. - -## the armory logging api - -In order to use the armory logger, all you need to do is import it: - - from armory.logs import log - -The `log` object is the primary interface to the module and supports the following -standard functions: - - log.debug - log.info - log.warning - log.error - log.critical - -The armory logger also adds two new levels - - log.trace - even more verbose than debug - log.success - report that something completed ok - -All these functions take one string argument - - log.success(f'uploaded {file} to {server}') - -There are two additional log levels without a standard function: - - `"PROGRESS"` - for determining whether to log progress for downloads/uploads - `"METRIC"` - for logging metric results - -The explicit ordering of these log levels are: -``` -TRACE = 5 -DEBUG = 10 -PROGRESS = 15 -INFO = 20 -METRIC = 24 -SUCCESS = 25 -WARNING = 30 -ERROR = 40 -CRITICAL = 50 -``` - -The armory logger upon import is pre-initialized and requires no configuration. So as a -user of the library, that's all you need to know. - -## logger destinations - -The armory.logs system always logs to the console, this is initialized at import -time. The module also writes to two files called - - colored-log.txt - armory-log.txt - -where the first is a direct duplicate of the console, and the second is identical -but without ansi color escapes for easier parsing. These files want to be -placed in the armory `output_dir` in the same timestamped directory that holds -the output file. However, that directory name isn't known until at armory start -time so the log files are created in the configured `output_dir` at the start. - -When armory knows the name of that timestamped directory it calls - - armory.logs.make_logfiles(timestamp_directory) - -TODO: The output directory needs to be created earlier in the armory initialization -so that the logfile can start near the top of run. - -## logging level specification - -As with the standard `logging` module, armory log messages are conditionally emitted -based on their level. Messages sent by armory will be logged at the INFO level -by default. - -But armory.logs also handles messages sent by libraries that we call such as: art, -tensorflow, boto, etc. The armory.logs module has a filter that is applied before -emitting messages and is configured as a dictionary mapping the originating module name -to level such as: - - default_message_filters = { - "": "TRACE" - "armory": "INFO", - "art": "INFO", - "docker": "INFO", - "botocore": "WARNING", - "s3transfer": "INFO", - "urllib3": "INFO", - "absl": False, - "h5py": False, - "avro": False, - } - -which is how the logger is configured at the start. The `""` module is special, and -covers all cases which aren't otherwise specified. So we start with printing all -messages at TRACE and higher (which means all). For messages from armory, art, and -docker, INFO is fine. The botocore and s3transfer modules are crazy chatty so we raise -the threshold for them. I don't know that I've ever heard mention of debug tracing in -absl, h5py, or avro so I've disabled any messages from them. - -I'm not sure these are good defaults, so I am hoping the other armory devs will -give opinions. - -## armory --log-level option - -The command - - armory run --log-level armory:debug --log-level art:debug ... - -overrides the default log-levels for armory and art. Because argparse allows -unique option substrings to be used, this command can be written more briefly -as - - armory run --log debug --log art:debug ... - -as a convenience omitting the `module:` part of the level assumes `armory:`. -The `--debug` option become a deprecated alias for `--log-level armory:debug`. - -The module names are done with a simple text match, so if you see too many messages -like - - 2022-02-24 15:31:19 4s INFO art.estimators.classification.pytorch:get_layers:986 ... - -you can adjust that down with `--log art.estimators:warning` or the hyper-specific -`--log art.estimators.classification:warning`. diff --git a/docs/original/metrics.md b/docs/original/metrics.md deleted file mode 100644 index c17f7882a..000000000 --- a/docs/original/metrics.md +++ /dev/null @@ -1,685 +0,0 @@ -# Measurement Overview - -Armory contains a number of functions to use as metrics as well as flexible measurement instrumentation. - -For measuring and logging standard perturbation (e.g., `Lp` norms) and task metrics (e.g., `categorical_accuracy`) for model inputs and outputs, standard config usage will likely suffice. -See the Metrics section for more information on available metrics. -For custom metrics and measuring intermediate values (e.g., outputs after a certain preprocessing layer), see the Instrumentation section below. - -## Scenario Config Usage - -In scenario configs, described in more detail in [Configuration File](docs/configuration_files.md), standard metrics can be added for measuring tasks and adversarial perturbations. -When running a scenario, these metrics are measured and output in json format in the results file. - -Desired metrics and flags are placed under the key `"metric"` dictionary in the config: -``` -"metric": { - "max_record_size": Integer or null, - "means": [Bool], - "perturbation": List[String] or String or null, - "profiler_type": null or "basic" or "deterministic", - "record_metric_per_sample": [Bool], - "task": List[String] or String or null, - "task_kwargs": List[dict] (Optional) -} -``` -The `perturbation` and `task` fields can be null, a single string, or a list of strings. -The perturbation metrics measure the difference between the benign and adversarial inputs `x`. -The task metrics measure the task performance on the predicted value w.r.t the true value `y`, for both benign and adversarial inputs. -If task metrics take keyword arguments, such as `"iou_threshold"`, these can be (optionally) added a list of kwarg dicts. -The `task_kwargs` list must be the same length as `task`, and metrics without kwargs should have `{}` as a placeholder. -These metrics are called on batches of inputs, but are sample-wise metrics, and so their results are concatenated to form a list over samples. - -When `means` is true, the average value for the given metric is also recorded. -When `record_metric_per_sample` is true, all of the per-sample metrics are recorded. -If neither is true, a `ValueError` is raised, as nothing is recorded. -The `max_record_size` field, if not `null`, will drop individual records sent to the ResultsWriter that are greater than the given value. - To use the default of `2**20` bytes (per record, not per full results output), do not include this field in the config. - -The `profiler_type` field, when not `null`, enables the logging of computational metrics. -If `"basic"`, it logs CPU time for model inference and attacking. -If `"deterministic"`, which runs *very* slowly, also provides verbose CPU statistics at the function call level, like so: -``` - 837 function calls (723 primitive calls) in 0.063 seconds - - Ordered by: cumulative time - - ncalls tottime percall cumtime percall filename:lineno(function) - 1 0.000 0.000 0.063 0.063 /opt/conda/lib/python3.8/site-packages/art/attacks/evasion/fast_gradient.py:207(generate) - 1 0.000 0.000 0.054 0.054 /opt/conda/lib/python3.8/site-packages/art/attacks/evasion/fast_gradient.py:477(_compute) - 1 0.000 0.000 0.053 0.053 /opt/conda/lib/python3.8/site-packages/art/attacks/evasion/fast_gradient.py:383(_compute_perturbation) - 1 0.000 0.000 0.052 0.052 /opt/conda/lib/python3.8/site-packages/art/estimators/classification/keras.py:422(loss_gradient) - 1 0.000 0.000 0.052 0.052 /opt/conda/lib/python3.8/site-packages/keras/backend.py:4238(__call__) - 1 0.000 0.000 0.042 0.042 /opt/conda/lib/python3.8/site-packages/keras/backend.py:4170(_make_callable) - 1 0.000 0.000 0.042 0.042 /opt/conda/lib/python3.8/site-packages/tensorflow/python/client/session.py:1502(_make_callable_from_options) - ... -``` -Profiler information can be found in the results json under `["results"]["compute"]`. -The functionality for these profilers can be found in `armory/metrics/compute.py`. - -### Targeted vs. Untargeted Attacks - -For targeted attacks, each metric will be reported twice for adversarial data: once relative to the ground truth labels and once relative to the target labels. For untargeted attacks, each metric is only reported relative to the ground truth labels. Performance relative to ground truth measures the effectiveness of the defense, indicating the ability of the model to make correct predictions despite the perturbed input. Performance relative to target labels measures the effectiveness of the attack, indicating the ability of the attacker to force the model to make predictions that are not only incorrect, but that align with the attackers chosen output. - -## Metrics - -The `armory.metrics` module contains functionality to measure a variety of metrics: -- `armory.metrics.perturbation` metrics measure adversarial perturbations such as `lp` distance -- `armory.metrics.task` metrics measure task performance such as categorical accuracy -- `armory.metrics.statistical` metrics measure statistical quantities such as KL divergence -- `armory.metrics.poisoning` module contains helper functions to measure fairness statistics relevant to poisoning and filtering scenarios - -We have implemented the metrics in numpy, instead of using framework-specific metrics, to prevent expanding the required set of dependencies. -Please see the relevant submodules in [armory/metrics](../armory/metrics/) for more detailed descriptions. - -### Perturbation Metrics - -Perturbation metrics compare a benign and adversarially perturbed input and return a distance. -Typically, these functions follow the form of `func(x, x_adv)`, where `x` is the benign input and `x_adv` is the perturbed input. - -The set of perturbation metrics provided by armory can also be via batch-wise and element-wise namespaces as follows: -```python -from armory.metrics import perturbation -print(peturbation.batch) -# ['image_circle_patch_diameter', 'l0', 'l1', 'l2', 'linf', 'max_image_circle_patch_diameter', 'max_l0', 'max_l1', 'max_l2', 'max_linf', 'mean_image_circle_patch_diameter', 'mean_l0', 'mean_l1', 'mean_l2', 'mean_linf', 'snr', 'snr_db', 'snr_spectrogram', 'snr_spectrogram_db'] -print(perturbation.element) -# ['image_circle_patch_diameter', 'l0', 'l1', 'l2', 'linf', 'max_image_circle_patch_diameter', 'max_l0', 'max_l1', 'max_l2', 'max_linf', 'mean_image_circle_patch_diameter', 'mean_l0', 'mean_l1', 'mean_l2', 'mean_linf', 'snr', 'snr_db', 'snr_spectrogram', 'snr_spectrogram_db'] -``` -Currently, all perturbation metrics have element-wise and batch-wise versions, though the config assumes that the batch version is intended. -For instance: -```python -perturbation.batch.l1([0, 0, 0], [1, 1, 1]) -# array([1., 1., 1.]) -perturbation.element.l1([0, 0, 0], [1, 1, 1]) -# 3.0 -``` -Metric outputs are numpy arrays or scalars. - -| Name | Namespace | Description | -|-------|-------|-------| -| `linf` | `perturbation.batch.linf` | L-infinity norm | -| `l2` | `perturbation.batch.l2` | L2 norm | -| `l1` | `perturbation.batch.l1` | L1 norm | -| `l0` | `perturbation.batch.l0` | L0 "norm" | -| `snr` | `perturbation.batch.snr` | Signal-to-noise ratio | -| `snr_db` | `perturbation.batch.snr_db` | Signal-to-noise ratio (decibels) | -| `snr_spectrogram` | `perturbation.batch.snr_spectrogram` | Signal-to-noise ratio of spectrogram | -| `snr_spectrogram_db` | `perturbation.batch.snr_spectrogram_db` | Signal-to-noise ratio of spectrogram (decibels) | -| `image_circle_patch_diameter` | `perturbation.batch.image_circle_patch_diameter` | Diameter of smallest circular patch | -| `mean_l(0\|1\|2\|inf)` | `perturbation.batch.mean_l(0\|1\|2\|inf)` | Lp norm averaged over all frames of video | -| `max_l(0\|1\|2\|inf)` | `perturbation.batch.max_l(0\|1\|2\|inf)` | Max of Lp norm over all frames of video | -| `(mean\|max)_image_circle_patch_diameter` | `perturbation.batch.(mean\|max)` | Average or max circle over all frames of video | - -
- -### Task Metrics - -The `metrics.task` module contains metrics for measurement of task performance. -Generally, these functions follow the form of `func(y, y_pred)`, where `y` is the ground truth and `y_pred` is the prediction. -This is true for all of the batchwise and elementwise functions (which behave similarly to the `perturbation` module). -However, not all batchwise functions have elementwise counterparts (e.g., `per_class_accuracy`). - -Those metrics in the `population` namespace take `y_list` and `y_pred_list`, which are indicative of the entire dataset. -They can be called on a subset of the population, but for a correct overall result, it requires the entire set of predictions. - -Some metrics such as total word error rate and mean average precision are effectively aggregations of batchwise metrics, and are in the `aggregate` namespace. -Total word error rate, for instance, requires independently summing the numerators and denominators of the sample word error rates, instead of directly averaging them. -These metrics typically take a list or array of results as their single argument. - -The `apricot`, `carla`, and `dapricot` metrics are effectively the `object_detection` metrics with parameters adapted to those respective scenarios. - -As mentioned, these functions generally compare `y_pred` against `y`, that is, the metric compares a benign or adversarial prediction to the ground truth. It is also possible to use these metrics to compare adversarial predictions against benign predictions. This is not enabled in off-the-shelf Armory code, but can be easily implemented through one small code modification, by simply adding ```self.metrics_logger.add_tasks_wrt_benign_predictions()``` to the ```load_metrics()``` function of the scenario. For example, if you create a new scenario inheriting ```scenario.py```, you can implement ```load_metrics()``` this way: -``` -def load_metrics(self): - super().load_metrics() - self.metrics_logger.add_tasks_wrt_benign_predictions() -``` - -| Name | Namespace | Description | -|-------|-------|-------| -| `categorical_accuracy` | `task.batch.categorical_accuracy` | Categorical Accuracy | -| `top_5_categorical_accuracy` | `task.batch.top_5_categorical_accuracy` | Top-5 Categorical Accuracy | -| `per_class_accuracy` | `task.batch.per_class_accuracy` | Categorical accuracy per class, as a list per class| -| `per_class_mean_accuracy` | `task.batch.per_class_mean_accuracy` | Mean categorical accuray per class | -| `word_error_rate` | `task.batch.word_error_rate` | Word error rate | -| `total_wer` | `task.batch.aggregate.total_wer` | Total word error rate | -| `entailment` | `task.batch.entailment` | Entailment language metric (contradiction, neural, entailment) | -| `total_entailment` | `task.aggregate.total_entailment` | Total entailment | -| `tpr_fpr` | `task.population.tpr_fpr` | Return a dictionary containing TP, FP, TN, FN, TPR, FPR, TNR, FNR, and F1 Score (assuming binary inputs) | -| `video_tracking_mean_iou` | `task.batch.video_tracking_mean_iou` | Mean IOU between ground-truth and predicted boxes, averaged over all frames for a video | -| `video_tracking_mean_success_rate` | `task.batch.video_tracking_mean_success_rate` | Mean success rate averaged over all multiple IOU thresholds and all frames | -| `object_detection_AP_per_class` | `task.population.object_detection_AP_per_class` | Object Detection average precision per class | -| `object_detection_disappearance_rate` | `task.batch.object_detection_disappearance_rate` | Object Detection Disappearance Rate | -| `object_detection_hallucinations_per_image` | `task.batch.object_detection_hallucinations_per_image` | Object Detection Hallucinations Per Image | -| `object_detection_mAP` | `task.population.object_detection_mAP` | Object Detection mean average precision | -| `object_detection_misclassification_rate` | `task.batch.object_detection_misclassification_rate` | Object Detection Misclassification Rate | -| `object_detection_true_positive_rate` | `task.batch.object_detection_true_positive_rate` | Object Detection True Positive Rate | -| `apricot_patch_targeted_AP_per_class` | `task.population.apricot_patch_targeted_AP_per_class` | OD metric applied to apricot scenario | -| `carla_od_AP_per_class` | `task.population.carla_od_AP_per_class` | OD metric applied to carla scenario | -| `carla_od_disappearance_rate` | `task.batch.carla_od_disappearance_rate` | OD metric applied to carla scenario | -| `carla_od_hallucinations_per_image` | `task.batch.carla_od_hallucinations_per_image` | OD metric applied to carla scenario | -| `carla_od_misclassification_rate` | `task.batch.carla_od_misclassification_rate` | OD metric applied to carla scenario | -| `carla_od_true_positive_rate` | `task.batch.carla_od_true_positive_rate` | OD metric applied to carla scenario | -| `dapricot_patch_target_success` | `task.population.dapricot_patch_target_success` | OD metric applied to dapricot scenario | -| `dapricot_patch_targeted_AP_per_class` | `task.population.dapricot_patch_targeted_AP_per_class` | OD metric applied to dapricot scenario | -| `abstains` | `task.batch.abstains` | Takes a batch matrix of inputs and returns 1 for each row that are all 0 (abstention) | -| `identity_unzip` | `task.batch.identity_unzip` | Utility function for mapping from batches to list of samples | -| `identity_zip` | `task.aggregate.identity_zip` | Utility function for mapping from list of samples to single batch | - - -
- -### Statistical Metrics - -The statistical module provide metrics for measurement of statistical and information theoretic quantities. -It also contains helper functions to set up data structures (e.g., contingency tables) for computation with these metrics. - -| Name | Namespace | Description | -|-------|-------|-------| -| `chi2_p_value` | `metrics.statistical.registered.chi2_p_value` | Chi Squared Value | -| `fisher_p_value` | `metrics.statistical.registered.fisher_p_value` | Fisher P-Value | -| `spd` | `metrics.statistical.registered.spd` | Statistical Parity Difference | -| `filter_perplexity_fps_benign` | `metrics.statistical.registered.filter_perplexity_fps_benign` | Perplexity of Filtered Distribution | -| `perplexity` | `metrics.statistical.registered.perplexity` | P-to-Q Perplexity | -| `kl_div` | `metrics.statistical.registered.kl_div` | KL Divergence | -| `cross_entropy` | `metrics.statistical.registered.cross_entropy` | Distributional Cross Entropy | -| `class_bias` | `metrics.statistical.registered.class_bias` | Class Bias | -| `majority_mask` | `metrics.statistical.registered.majority_mask` | Binary mask indicating whether a sample is in the majority of the distribution | -| `class_majority_mask` | `metrics.statistical.registered.class_majority_mask` | Majority mask with majority membership considered on a per-class basis | - -
- -### Poisoning Metrics - -The poisoning scenarios can be configured to measure fairness across classes. -This code is in `armory.metrics.poisoning`, but doesn't constitute typical metric definitions. -Instead, it uses metrics from `statistical` (`chi2_p_value` and `spd`) to measure fairness. -In particular, it uses clustering from the activations of an explanatory model to determine samples that are in the "majority" or "minority" of the distribution, via `class_majority_mask` in `statistical`. -The statistical metrics are then used to compare the fairness across these subpopulations. - -This module mostly contains code to load explanatory models, generate activations, and route the correct data as inputs to the statistical metrics. -For more information, see [poisoning](poisoning.md). -
- -### Custom Metrics - -In order to include custom metrics in configs, there are a few different steps. -NOTE: only perturbation and task metrics are loadable directly from the config at this time. - -In order for your metric to get loaded, it must be retrievable via the following function: -``` -metrics.get(name) -``` -where `name` is the `str` name of your function. Suppose your metric is defined in `my_project/metrics.py` as `hot_dog_ness`. - -Using the custom metric requires providing the full `.`-separated path to the metric function in the config, e.g., `"my_project.metrics.hot_dog_ness"`. -In this case, `metrics.get("my_project.metrics.hot_dog_ness")` will try to import `hot_dog_ness` from `my_project.metrics`. Note the following caveats: -- This case will only work as intended if `hot_dog_ness` is a batchwise function that outputs a list (or array) of results, one per element in the batch -- By default, armory will try to calculate a mean from the output of the custom metric -- Should the name of the custom metric collide with any existing functions supported by armory, armory will throw an error notifying the user of the collision as well as request a name change for the custom metric - -*Optional* An alternative is to use one of the existing decorators in `task` or `perturbation` to register your metric. This is useful for applying a custom metric as a non-batchwise operation and suppressing the mean calculation for outputs with specific formats. -These decorators, their associated namespaces, and the intended APIs of the metric functions they decorate, are: -- `metrics.perturbation.elementwise` - `metrics.perturbation.element` - takes a single pair of `x_i` and `x_adv_i` and returns a single perturbation distance for that element. -- `metrics.perturbation.batchwise` - `metrics.perturbation.batch` - takes a batch of `x` and `x_adv` and returns a list of results, one per data element. -- `metrics.task.elementwise` - `metrics.task.element` - takes a single pair of `y_i` and `y_pred_i` and returns a single result for that element. -- `metrics.task.batchwise` - `metrics.task.batch` - takes a batch of `y` and `y_pred` and returns a list of results, one per data element. -- `metrics.task.populationwise` - `metrics.task.population` - takes lists of `y` and `y_pred` across the entire dataset and computes a single set of metrics, such as mAP. -- `metrics.task.aggregator` - `metrics.task.aggregate` - takes a list of results from a batchwise metric and performs a non-trivial aggregation, such as for calculating total word error rate. - -For instance, if you were adding an accuracy metric for task results, you could do: -``` -from armory import metrics -@metrics.task.elementwise -def my_accuracy_metric(y_i, y_pred_i): - return y_i == np.argmax(y_pred_i) -``` - -Armory performs all built-in metric operations as batches, not as individual elements, so using the `elementwise` decorators will also produce a batchwise version of it that loops through the individual elements and provides a batchwise result. -NOTE: when armory uses `get`, it will get the batchwise version of a metric. - -Once annotated, these will also be `.`-addressable using their respective namespaces. -In the above example, you can get at `my_accuracy_metric` via the `metrics.task.element` namespace: -```python -metrics.task.element.my_accuracy_metric -assert metrics.task.element.my_accuracy_metric is my_accuracy_metric -``` -You can also get the batchwise version of it via: -```python -batchwise_my_accuracy_metric = metrics.task.batch.my_accuracy_metric -``` - -All non-elementwise metrics are registered in the `supported` namespace, which can be looked at via `metrics.supported` or `metrics.common.supported`. - -If the function is decorated with a `populationwise` decorator, then all of the results will be stored in a list until the end of the scenario, then passed to the metric for processing. -We do not support populationwise for perturbation metrics as this would require storing a potentially very large set of input and perturbed input data. - -Another useful decorator currently only supported in `task` is the `aggregator`, which can take intermediate results from a batchwise metric and aggregate them together non-trivially. - -For instance, if have a metric (like word error rate) that returns two values that form a fraction, and you want the aggregate measure to not be the mean over fractions, but the fraction of the sums of the numerator and denominator, that could look like the following: -```python -@metrics.task.elementwise -def fraction(y_i, y_pred_i) -> (int, int): - ... - return numerator / denominator - -@metrics.task.aggregator -# NOTE: the input will be a list (or numpy array) of each element-wise result from the underlying function -def fraction_aggregator(list_of_fraction_tuples) -> (int, int): - total_numerator, total_denominator = 0, 0 - for numerator, denominator in list_of_fraction_tuples: - total_numerator += numerator - total_denominator += denominator - return total_numerator, total_denominator -``` - -In order for the aggregator to be automatically used in armory scenarios, it needs to be registered: -``` -metrics.task.map_to_aggregator("fraction", "fraction_aggregator") -``` -The `map_to_aggregator` maps the `str` name of the batchwise function (`fraction` is here implictly via the elementwise decorator making a batchwise version) to the `str` name of the aggregator function. - -To test, you should be able to do: -``` -aggregator_name = metrics.task.get_aggregator_name("fraction") -assert aggregator_name is not None -aggregator = metrics.get(aggregator_name) -assert aggregator is fraction_aggregator -``` -This sequence of operations is essentially what armory does to resolve the aggregator. - -If an aggregator is not linked to a metric, then it will default to either no aggregator (if `means` is `false` in the config) or to `np.mean` (if `means` is `true` in the config). -If `np.mean` fails, no aggregation result will be recorded, but a warning will be logged. - -#### Log-Based Reporting - -In addition to being output to results json files, results are also logged to the screen at the `"METRIC"` log level, which is between `"PROGRESS"` and `"INFO"`; see [logging](logging.md). -By default, metric results are formatted as follows: `f"{np.mean(result):.3}"`. -If this results in an error (e.g., due to result not being a number or array of numbers), then it defaults to `f"{result}"`. - -In order to provide custom formatting for results logged to screen, you will need to implement and register a formatter for your function. -Following the `fraction` example above, you can do the following: -```python -@metrics.result_formatter("fraction") -def fraction_formatter(result) -> str: - numerator, denominator = result - return f"{numerator} / {denominator}" -``` -The arg provided to the `result_formatter` decorator is the name of the metric you would like to associate with this formatter, which should return a `str`. -If you would like to associate additional metrics with this formatter (e.g., to use it for the aggregation function as well), you can call it directly as follows: -```python -metrics.result_formatter("fraction_aggregator")(fraction_formatter) -``` - -#### Class-based Metrics - -The previous description assumes that the metric is a callable function. -It is sometimes necessary or helpful for a metric to be contained in a class. -When loading, if the target returned by `metrics.get` is a class, it will attempt to instantiate the class (without args or kwargs), and use the instantiated callable object as the metric function. -Otherwise, it should operate just like a simple function metric. - -## Instrumentation - -The `armory.instrument` module implements functionality to flexibly capture values for measurement. - -The primary mechanisms are largely based off of the logging paradigm of loggers and handlers, though with significant differences on the handling side. - -- Probe - object to capture data and publish them for measurement. -- Meter - object to measure a single metric with given captured data and output records -- Writer - object to take meter output records and send them standard outputs (files, loggers, results dictionaries, etc.) -- Hub - object to route captured probe data to meter inputs and route meter outputs to writers -- There is typically only a single hub, where there can be numerous of the other types of objects. - -### Quick Start - -In order to capture and measure values, you need a Probe and a Meter connected to the hub, at a minimum: -```python -from armory.instrument import get_probe, Meter, get_hub, PrintWriter -hub = get_hub() # get global measurement hub -probe = get_probe("probe_name") # get probe connected to global hub -meter = Meter("my_meter", lambda a,b: a+b, "probe_name.a", "probe_name.b") # construct meter that measures the sum of a and b -hub.connect_meter(meter) # connect meter to global hub - -# optionally, add a writer -writer = PrintWriter() -hub.connect_writer(writer, default=True) # default sets all meters to use this writer - -# Now, measure -probe.update(a=2, b=5) # should also print to screen if PrintWriter is connected -probe.update(a=3) -probe.update(b=8) # now it should print again -results = meter.results() -assert results == [7, 11] -``` - -Since these all use a global Hub object, it doesn't matter which python files they are instantatied in. -Probe should be instantiated in the file or class you are trying to measure. -Meters and writers can be instantiated in your initial setup (please refer to [User Initialization](./scenarios.md#user-initialization) for more details about using the `user_init` block), and can be connected before probes are constructed. - -#### Direct Recording - -To capture one-off values or values that do not require metric measurement, you can push a record to the hub directly using its `record` method: -``` -hub = get_hub() -name = "my_record" -result = 17 -hub.record(name, result) -``` -This will push a record to all default writers (including the `ResultsWriter` in standard scenarios) with that information. -To send it to an additional writer or writers, you can supply them with the `writers` kwargs, which can take a single writer or an iterable of writers. -To not send it to the default writers, set the `use_default_writers` kwarg to `False`. -For instance: -``` -my_writer = PrintWriter() -hub.record(name, result, writers=my_writer, use_default_writers=False) -``` -If `writers` is empty or None and `use_default_writers` is False, no record will be sent and a warning will be logged. - -### Probes - -To get a new Probe (connected to the default Hub): -```python -# Module imports section -from armory.instrument import get_probe -probe = get_probe(name) -``` -The arg `name` can be any `str` that is a valid python identifier, or can be blank, which defaults to the empty string `""`. -Similarly to `logging.getLogger`, this provides a namespace to place variables, and inputs like `__name__` can also be used. -Calls to `get_probe` using the same name will return the same Probe object. -The recommended approach is to set a probe at the top of the file of interest and use it for all captures in that file. - -To capture values in-line, use `update`: -```python -# ... -# In the code -probe.update(name=value) -``` - -This will publish the given value(s) to the given name(s) (also called probe variables) in the probe namespace of the connected Hub. -To be more concrete: -```python -probe = get_probe("my.probe_name") -probe.update(arbitrary_variable_name=15) -``` -will push the value 15 to `"my.probe_name.arbitrary_variable_name"`. -These names will be used when instantiating `Meter` objects. - -However, this will fall on the floor (`del`, effectively) unless a meter is constructed and connected to the Hub to record values via `connect_meter`. -See the Quick Start section above or the Meters section below for more details. -This is analogous to having a `logging.Logger` without an appropriate `logging.Handler`. - -Multiple variables can be updated simultaneously with a single function call (utilizing all kwargs given): -```python -probe.update(a=x, b=y, c=z) -``` - -Sometimes it is helpful to perform preprocessing on the variables before publishing. -For instance, if the variable `y` was a pytorch tensor, it might be helpful to map to numpy via `y.detach().cpu().numpy()`. -However, it would be a waste of computation of nothing was set up to measure that value. -Therefore, probes leverage `args` to perform preprocessing on the input only when meters are connected. -For instance, -```python -probe.update(lambda x: x.detach().cpu().numpy(), my_var=y) -``` -Or, less succinctly, -```python -probe.update(lambda x: x.detach(), lambda x: x.cpu(), lambda x: x.numpy(), my_var=y) -``` -More generally, -```python -probe.update(func1, func2, func3, my_var=y) -``` -will publish the value `func3(func2(func1(y)))`. - -#### Interactive Testing - -An easy way to test probe outputs is to set the probe to a `MockSink` interface. -This can be done as follows: -```python -from armory.instrument import get_probe, MockSink -probe = get_probe("my_name") -probe.set_sink(MockSink()) -probe.update(variable_name=17) -# update probe variable my_name.variable_name to 17 -``` -This will print all probe updates to the screen. - -### Default Scenario Probe Values - -The standard scenarios provide probe updates for the following variables: -- `i` - the current batch -- `x` - current batch of inputs -- `y` - current batch of ground truth labels -- `y_pred` - prediction of model on `x` -- `x_adv` - inputs perturbed by the current attack -- `y_pred_adv` - prediction of model on `x_adv` -- `y_target` (conditional) - target labels for attack, if attack is targeted - -The standard probe used in scenarios is named `"scenario"`, so to access these, prepend the variable with `"scenario."`. -For example, the variable `x` set in the scenario can be referenced as `"scenario.x"`. - -### Meter - -A Meter is used to measure values output by probes. -It is essentially a wrapper around the functions of `armory.utils.metrics`, though it can employ any callable object. -You will need to construct a meter, connect it to a hub, and (optionally) add a writer. - -#### Meter Construction - -To instantiate a Meter: -```python -from armory.instrument import Meter -meter = Meter( - name, - metric, - *metric_arg_names, - metric_kwargs=None, - auto_measure=True, - final=None, - final_name=None, - final_kwargs=None, - record_final_only=False, -) -""" -A meter measures a function over specified input probe_variables for each update - If final is not None, it also measures a function over those measurements - Records are pushed to Writers for output - -name - str name of meter, used when writing records -metric - callable function -metric_arg_names - str names of probe_variables corresponding to args passed into the metric function - Meter(..., "model.x_post[benign]", "model.x_adv_post", ...) - Follows the pattern of `probe_name.probe_variable[stage]` (stage is optional) -metric_kwargs - kwargs for the metric function that are constant across measurements - -auto_measure - whether to measure when all of the variables have ben set - if False, 'measure()' must be called externally - -final - metric function that takes in the list of results as input (e.g., np.mean) -final_name - if final is not None, this is the name associated with the record - if not specified, it defaults to f'{final}_{name}' -final_kwargs - kwargs for the final function that are constant across measurements -record_final_only - if True, do not record the standard metric, only final - if record_final_only is True and final is None, no records are emitted -""" -``` - -For example, if you have a metric `diff`, -```python -def diff(a, b): - return a - b -``` -and you want to use it to measure the difference between `w` and `z` output from Probe `"my_probe"`, then you could do: -```python -meter = Meter( - "my_meter_name", - diff, - "my_probe.w", - "my_probe.z", -) -``` -This will effectively call `diff(value["my_probe.w"], value["my_probe.z"])` once for each time both of those values are set. - -If you wanted to take the average of diff over all the samples and only record that value, you would need to set final. -```python -meter = Meter( - "name not recorded because record_final_only is True", - diff, - "my_probe.w", - "my_probe.z", - final=np.mean, - final_name="mean_meter", # actual recorded name - final_kwargs=None, - record_final_only=True, -) -``` - -A more succinct way of doing this, which also handles the case when only batches of `w` and `z` are supplied to the meter, is to use `GlobalMeter`: -```python -meter = GlobalMeter( - "mean_meter", # actual recorded name - np.mean, - "my_probe.w", - "my_probe.z", - final_kwargs=None, -) -The `GlobalMeter` assumes that inputs are batches, so if multiple batches are passed, they will be concatenated along the first axis. -Note that if multiple batches are passed, all variables from a specific batch must be passed to the meter before moving to the next batch, in order to avoid dropping. - -The `metric_kwargs` and `final_kwargs` are a set of kwargs that are passed to each call of the corresponding function, but are assumed to be constant. -For example, this could be the `p` parameter in a generic `l_p` norm: -```python -def lp(x, x_adv, p=2): - return np.linalg.norm(x-x_adv, ord=p, axis=1) - -meter = Meter( - "lp_perturbation", - lp, - "scenario.x", - "scenario.x_adv", - metric_kwargs={"p": 4}, -) -``` - -#### Connecting Meter to Hub and Receiving Probe Updates - -A constructed meter needs to be connected to a hub to receive `probe_variable` updates: -```python -from armory.instrument import get_hub -hub = get_hub() # use global hub -hub.connect_meter(meter) -``` - -Updates are propagated to meters via the hub based on a simple filtering process. -If a probe named `probe_name` is updating a value `my_value` to 42, the call looks like this: -```python -get_probe("probe_name").update(my_value=42) -``` -The hub then looks for a corresponding name from the lists of `metric_arg_names` from connected meters. -If the name is found, then the hub will call `set` on each of those meters, updating that argument value: -```python -meter.set("probe_name.my_value", 42, batch) -``` -The `batch` arg is mainly used to track which iteration the meter is on, and is set automatically in scenarios. - -Once all of the args have been set for a meter, it will call `self.measure()` if `auto_measure=True` (the default). -If `auto_measure=False`, then the user will need to explicitly call `meter.measure()` - -NOTE: if `meter_arg_names` are misspelled, the meter will not measure anything. -This will log a warning if nothing has been called when meter.finalize() is called (typically via `hub.close()`), such as: -```python -Meter 'my_meter_name' was never measured. The following args were never set: ['probe_name.my_value'] -``` - -#### Retrieving Results and Records - -After measurement, the results are saved in a local list on the Meter and send records to any connected writers. -Similarly, after finalize is called, the final metric (if it is not `None`) will be applied to the results and saved in a local list, with a record sent to connected writers. - -To retrieve a list of the values measured thus far, call `meter.results()`. -To retrieve the value computed by the final metric, call `meter.final_result()`. -If `measure` and `finalize` have not been called, respectively, then these will instead return `[]` and `None`. - -Records are sent as 3-tuples to connected writers: -```python -(name, batch, result) -``` -where `name` is the name given to the Meter, batch is the number set by the hub, and result is the result from calling the metric. -Final records are also 3-tuples: -```python -(final_name, None, final_result) -``` -Note that the results stored by the meter are not the record tuples, but simply the raw results. - -#### Connecting Writers - -Armory scenarios will set up a default `ResultsWriter` that will take all connected meter records and write them to the output results json. -If additional outputs are desired, other Writer objects can be instantiated and connected to meters via the hub. - -For instance, attaching a simple writer that prints all records to stdout: -```python -hub.connect_writer(PrintWriter(), default=True) -``` - -However, this can be quite verbose, so if you just want to add it to a particular meter, you can do this: -```python -hub.connect_meter(meter) # meter must be connected before connecting a writer to it -hub.connect_writer(PrintWriter(), meters=[meter]) -``` - -The are a number of different standard Writer objects: -- `Writer` - base class other writers are derived from -- `NullWriter` - writer that does nothing (writes to null) -- `LogWriter` - writer that writes to armory log in the given log level. Example: `LogWriter("WARNING")` -- `FileWriter` - writer that writes each record as a json-encoded line in the target file. Example: `FileWriter("records.txt")` -- `ResultsWriter` - writer that collates the records and outputs them as a dictionary. Used by scenarios as default. - -To create a new Writer, simply subclass Writer and override the `_write` method (and optionally the `_close` method). - -#### Stages and Update Filters - -Conditional code may want to take advantage of being able to measure only at certain points in time or compare different stages of a scenario. - -The `Hub` class contains context information that can be leveraged to filter out probe updates. -These are set by the `hub.set_context` method, and are automatically set by scenarios. -Currently, context contains the keys `batch` (number) and `stage`, which are respectively set to `int` and `str` values. -Future updates may extend the use of context information for more advanced filtering or measurement. - -The batch number is incremented once per batch, is typically set to -1 prior to the first batch, and is primarily used internally by Meters to synchronize their measurements across stages. -The stage is intented primarily for filtering, starts with an empty string for a value, and is updated with logical parts of the scenario. -The primarily used scenario contexts (at present) for evasion attacks are: -- "next" - data iteration (get `x`, `y`, `i`, etc.) -- "benign" - model prediction on `x` -- "attack" - attack to generate `x_adv` from `x` -- "adversarial" - model prediction on `x_adv` -- "finished" - indicates that all benign and adversarial batches have been evaluated -Scenario contexts for poisoning scenarios are varied - see the scenarios for specifics. - -We do not recommend directly setting context while running a scenario, or it will interfere with the standard meters. -However, these will likely need to be set when running a custom scenario and overriding standard methods like `next`, `run_benign`, and `run_attack`. - -Probe updates can be filtered by meters by using a single bracketed string in the args list. -For instance, `"probe_name.probe_variable[adversarial]"` will only measure the value from `"probe_name.probe_variable"` when `stage = "adversarial"`. - -This can be helpful when you want to measure something internal to a model but only during certain stages. -For instance, if you have a two stage model that applies preprocessing followed by estimation, and you want to measure the value after preprocessing: -```python -probe = get_probe("my_model") - -def forward(self, x): - x_proc = preprocessing(x) - probe.update(x_after_preprocess=x_proc) - y_pred = estimation(x_proc) - return y_pred -``` -You may want to compare the "linf" distance of `x_proc` in the benign case to `x_proc` for the corresponding adversarial case. -However, the model does not know the present context (whether it is being attacked or in otherwise), so measuring `"my_model.x_after_preprocess"` will get all of the forward passes caused by PGD. -In contrast, the following will directly measure the desired values: -```python -meter = Meter( - "linf of x_proc benign vs adversarial", - metrics.linf, - "my_model.x_after_preprocess[benign]", - "my_model.x_after_preprocess[adversarial]", -) -``` diff --git a/docs/original/no_docker_mode.md b/docs/original/no_docker_mode.md deleted file mode 100644 index e99308fea..000000000 --- a/docs/original/no_docker_mode.md +++ /dev/null @@ -1,100 +0,0 @@ -Armory No-Docker Mode -======================= -In order to run armory in `--no-docker` mode, you will need a properly -setup environment. Generally folks have used conda in the past, however this -document only requires a python (>=3.7) environment to get going. - -First you will need to clone the armory repo (or if you plan to be a developer, -see [Contributing to Armory](./contributing.md) to clone a fork of the repo). -For the following, the repo directory will be referred to as `[armory-repo]`. - -Virtual environment setup for conda is fairly straight forward: -```bash -wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh -/bin/bash ~/miniconda.sh -b -p /opt/conda -conda install -c conda-forge -n base mamba \ -mamba env update -f environment.yml -n base --prune -mamba clean --all -``` - -Alternatively, if your system already has the necessary libraries installed, a virtual -environment can be created with the following commands: -```bash -cd [armory-repo] -python38 -m venv venv38 -source venv38/bin/activate -``` - -Check out the [Dockerfiles](../docker) for more information on environment setup. - -Once this is complete, and you have ensured you are in the `[armory-repo]` directory, -you can setup the environment with the following: -```bash -pip install --upgrade pip==22.0.3 -pip install -e .[engine,datasets,math,pytorch,deepspeech,tensorflow] -``` - -If you are using the `deepspeech` scenarios, you will also need to -install the `hydra-lightning` configs with: - - pip install git+https://github.com/romesco/hydra-lightning/#subdirectory=hydra-configs-pytorch-lightning - -as described [in that package's README](https://github.com/romesco/hydra-lightning#readme). -This is necessary because there is no proper release of that package (nor does one -appear likely). - -Once this completes, you should run `armory configure` (If you haven't already done this -previously) to setup the armory configuration -(e.g. dataset download directory, output directory, etc.). - -With this complete, you now can run armory using `armory run -h`. If you would -like to test the installation / environment, we have provided some base tests that -can be executed using: -```bash -pytest -s ./tests/unit/test_no_docker.py -``` - -This runs a series of configs in a variety of ways to ensure that -the environment is operating as expected. - -NOTE: If you run into issues running pytest (e.g. sometimes your `$PATH` is configured -to point to a global pytest that is outside your virtualenv) directly, you can use the -alternative approach (make sure your virtualenv is active): -```bash -python -m pytest -s ./tests/unit/test_no_docker.py -``` - -If you would like to run the example interactively you -enter a python session in the virtualenv and type: -```python -from armory.scenarios.main import get as get_scenario -from armory import paths -from pathlib import Path - -# Armory needs to have the paths set correctly -paths.set_mode("host") - -config = Path("scenario_configs/no_docker/cifar_short.json") -s = get_scenario(config).load() -s.evaluate() -``` - -## Run baseline CIFAR-10 config - -Now to see if everything is operating correctly you can run the config file -of your choice. The two provided below are truncated in their execution to -demonstrate functionality of armory and, therefore, will not produce accurate -results. For more accurate results (and potentially longer running times) please -see [Armory Baseline Scenario Configs](../scenario_configs/) - -#### [CIFAR-10 Short](../scenario_configs/no_docker/cifar_short.json). - -```bash -armory run ./scenario_configs/no_docker/cifar_short.json --no-docker -``` - -#### [CARLA Short](../scenario_configs/no_docker/carla_short.json). - -```bash -armory run ./scenario_configs/no_docker/carla_short.json --no-docker -``` diff --git a/docs/original/poisoning.md b/docs/original/poisoning.md deleted file mode 100644 index 3a8c234d8..000000000 --- a/docs/original/poisoning.md +++ /dev/null @@ -1,203 +0,0 @@ -# Poisoning - -Updated October 2022 - -Armory supports a handful of specific poisoning threat models and attacks. This document will first describe these, providing enough background for newcomers to get up to speed on what these attacks do. Then, the peculiarities of the poisoning configs will be addressed, including lots of helpful information about Witches' Brew. Finally, we will describe the poisoning-specific metrics. - - -## Threat Models - -There are currently four threat models handled by Armory: dirty-label backdoor, clean-label backdoor, Witches' Brew (clean-label gradient matching), and Sleeper Agent. In a backdoor attack, an adversary adds a small trigger, or backdoor, to a small portion of the train set in order to gain control of the the model at test time. -The trigger is usually a small (but not imperceptible) image superposed on the data, and the adversary's goal is to force the model to misclassify test images that have the trigger applied. Armory includes several trigger images under `utils/triggers/`. - - -In poisoning attacks, the term _source class_ refers to the label of the image(s) that the adversary hopes to misclassify. In the case of a targeted attack, the _target class_ is the desired misclassification label. Neither of these terms describes which class gets poisoned; that depends on the threat model. All of Armory's poisoning scenarios perform targeted attacks. For simplicity, most Armory scenarios assume a single source class (all images to misclassify are from the same class) and a single target class (all misclassifications are aiming for the same label). The exception is Witches' Brew, which accepts images from arbitrary source classes that can all have distinct targets. - - -### Dirty-label backdoor - -In a [Dirty-label Backdoor (DLBD) Attack](https://arxiv.org/abs/1708.06733), training images are chosen from the source class, have a trigger applied to them, and then have their labels flipped to the target class. The model is then trained on this modified data. The adversary's goal is that test images from the source class will be classified as `target` when the trigger is applied at test time. - -#### Audio - -The DLBD attack for audio is similar to that of video. The difference is that instead of the trigger being an image that is placed over the existing image, the trigger is a short audio clip that is mixed with the existing audio. Example configs for speech are [here](../scenario_configs/eval6/poisoning) -Current triggers include a whistle and clapping. - -### Clean-label backdoor - -In a [Clean-label Backdoor (CLBD) Attack](https://people.csail.mit.edu/madry/lab/cleanlabel.pdf), the triggers are applied to target-class images during training. The poisoned samples also undergo some imperceptible gradient-based modifications to weaken the natural features, thus strengthening the association of the trigger with the target class label. -At test time, the adversary applies the trigger to source-class images in order to get them to misclassify as `target`. - - - -### Witches' brew - -[Witches' Brew](https://arxiv.org/abs/2009.02276) is a clean-label attack but there is no backdoor or trigger involved. The adversary selects individual `source` images from the test set; these are the images that the adversary wants to misclassify as `target` and are called _triggers_, not to be confused with the backdoor trigger described before. The attack uses a gradient-matching algorithm to modify a portion of the train-set target class, such that the unmodified test-set triggers will be misclassified. - -Because witches' brew is so different a threat model from the backdoor attacks that `poison.py` was initially built for, it has its own scenario. - - -### Sleeper Agent - -[Sleeper Agent](https://arxiv.org/abs/2106.08970) is a clean-label attack that applies $l_\infty$ bounded perturbations to a set of training images to embed a hidden trigger into the model that can be applied at inference time. -This threat model does not assume access to the target architecture, but instead trains a surrogate model to produce the perturbations. -This approach uses gradient alignment to optimize the perturbations for the trigger. - - -## Configuration files - -The config format for poisoning is currently complex and disorganized. The metrics section is ignored. -Parameters for attacks and defenses may be scattered between the attack, defense, and adhoc sections. -There are fields that seem to be copied and pasted from config to config with no consideration of whether they are needed. - -A key thing to be aware of is that for DLBD attacks, the amount of data to poison is set under `adhoc/fraction_poisoned` and refers to the fraction of the source class to poison, not the whole dataset. However, for CLBD attacks, this parameter is set under `attack/kwargs/pp_poison`. For witches' brew, it is again set under `adhoc/fraction_poisoned`, but this time it refers to the percentage of the entire dataset. In the latter case, since only the target class is poisoned, `fraction_poisoned` will be clipped to the actual size of the target class. If there are multiple triggers with different target classes, the amount of poison will be split between target classes. - -The `adhoc` section of the config is where most of the configuration action happens for poisoning attacks. Most of the fields under `adhoc` would belong better in other sections. A deprecation of the `adhoc` section is on the horizon, but in the meantime, here's a brief description. - -The `adhoc` section is where `source_class`, `target_class`, and `train_epochs` are set. The fields `compute_fairness_metrics` and `explanatory_model` go together, because the explanatory model is used to compute the fairness metrics, as described in the next section. If the defense is a filtering defense and is separate from the model, it can be turned off with `use_poison_filtering_defense:false`. Dataset poisoning can be turned off by setting `poison_dataset:false`; this has been the de facto approach to testing 0% poison, because ART throws an error in some cases when fraction poisoned is set to 0. A final flag to note is `fit_defense_classifier_outside_defense`; this pertains to filters or other defenses that are external to the model and defaults to `true`. If the defense does not require a trained model to operate, you can save time by setting this to `false`, because even if no defense classifier is provided, it will automatically train a copy of the model under evaluation . - -The remaining sections are fairly straightforward. The `attack` section carries the parameters for the attack (those not specified under `adhoc`, that is), including the size, position, and blend of backdoor triggers if applicable. The `defense` section for the _perfect filter_ baseline defense merits some explanation. Because a perfect filter requires knowledge of which data were poisoned, and this information is not available to defenses, the perfect filter is implemented directly in scenario code. However, Armory config validation currently requires a value for `module` and `name` under the `defense` section: the baseline configs set these to `"null"` (the string) although any string will work because the scenario ignores those values if `perfect_filter:true` is present in `defense/kwargs`. - -### Sleeper Agent parameters - -The configuration parameters for sleeper agent largely follows from the [ART implementation](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/attacks/poisoning/sleeper_agent_attack.py). -A couple of key differences include the `patch` kwarg being a path to a file instead of an array, with `patch_size` being used to resize the image to the desired size, and `k_trigger` being the number of train images to select for generating the trigger. -Other differences are minor word changes, and can be found [here](https://github.com/twosixlabs/armory/blob/master/armory/scenarios/poisoning_sleeper_agent.py#L101-L113). - - -### Witches' Brew trigger specification - -Witches' Brew requires a `source_class`, `target_class`, and `trigger_index`. The field `target_class` is required, but either of the other two may be left `null`. If `trigger_index` is `null`, triggers will be chosen randomly from the source class. If `source_class` is `null`, it will be inferred from the class labels of images at the provided trigger index. - -Witches' Brew seeks to misclassify individual images; each has to be specified explicitly. If multiple triggers are desired, there are several equivalent ways to accomplish this. Some examples will illustrate. Suppose you want three trigger images from class 1, each with a target class of 0. The following configurations are equivalent: - -``` -source_class: 1 -target_class: 0 -trigger_index: [null, null, null] - -source_class: [1,1,1] -target_class: 0 -trigger_index: null - -source_class: 1 -target_class: [0,0,0] -trigger_index: null - -source_class: [1,1,1] -target_class: [0,0,0] -trigger_index: null - -source_class: [1,1,1] -target_class: [0,0,0] -trigger_index: [null, null, null] -``` -Similarly, you can request triggers from different source classes by doing something like this: -``` -source_class: [1,2,3] -target_class: 0 -trigger_index: null -``` -(selects triggers randomly from classes 1, 2, and 3, each with a target of 0). - -Or this: -``` -source_class: [null, null, null] -target_class: [4,5,6] -trigger_index: [10,20,30] -``` -(Uses images 10, 20, and 30 as triggers, whatever their source label, with targets of 4, 5, and 6 respectively. Note that source and target class may not be the same.) - - -### Witches' Brew dataset saving and loading - -Because generating poisoned data takes so much longer for Witches' Brew than for the backdoor attacks, Armory provides a means to save and load a poisoned dataset. A filepath may be provided in the config under `attack/kwargs/data_filepath`. If this path does not exist, Armory will generate the dataset and save it to that path. If the path does exist, Armory will load it and check that it was generated consistent with what the current config is requesting, in terms of source, target, perturbation bound, and so forth. If there are any discrepancies, a helpful error is raised. If you are loading a pre-generated dataset, `source_class`, `target_class`, and `trigger_index` may all be null. If you want to re-generate a poisoned dataset that already exists, you can delete the old one or rename it. Alternatively, you may set `attack/kwargs/overwrite_presaved_data:true`, but use caution: if you forget to reset it to `false`, or pass the config to someone else, it can take a lot of time to re-generate the poison. - - -## Metrics - -The four primary poisoning metrics are: -- `accuracy_on_benign_test_data_all_classes` -- `accuracy_on_benign_test_data_source_class` -- `accuracy_on_poisoned_test_data_all_classes` -- `attack_success_rate` - -These are computed after the model is trained on a poisoned dataset. First, all of the test data is evaluated with no poison. This gives us the first two metrics. Next, data from the source class is poisoned and evaluated again. The third metric, `accuracy_on_poisoned_test_data_all_classes`, is the total classification accuracy when the source class is poisoned. The fourth metric, `attack_success_rate`, only measures the percentage of source-class examples that are misclassified as `target`. In a well-executed attack, all these metrics will have high values: the first indicating that we have an effective, well-trained model; -the second confirming that the model is accurate on the source class; the third showing that total accuracy does not decrease substantially when one class is poisoned, and the fourth demonstrating that we can induce targeted misclassification in the source class. - - -If the defense under evaluation is a filtering defense, Armory will report traditional statistics on the filter, such as true and false positives and F1 score. -We also log the number of samples poisoned, and the number and percentage of samples filtered out of each class. All metrics are computed automatically without regard to the `metric` field of the configuration file. - -### Fairness Metrics - -The GARD poisoning group has come up with two new per-class metrics to assess the bias of models within subpopulations of each class. -In the following explanation, these will be referred to as Filter Bias and Model Bias. - -Both of these metrics are measured over sub-class clusters of data. -To obtain these clusters, a pre-trained _explanatory model_ (distinct from the model under evaluation) produces activations for all the data, and each class is then partitioned into two subclasses based on a _silhouette score_ computed on the activations. This clustering method is intended to reflect one possible concept of majority/minority, by grouping data together whose silhouette score is within a range deemed to be "normal", while all the other data are considered as outliers in some respect. - -Once we have this partitioning of each class, we can compute some interesting metrics. The primary test is Statistical Parity Difference (SPD), which measures the difference in the probability of some event between two sets. -For two mutually exclusive sets $A$ and $B$, let $X$ be the event we care about, and $\mathrm{P}_A(X)$ is the probability of $X$ occuring over $A$. Then $SPD_X(A,B) := \mathrm{P}_A(X) - \mathrm{P}_B(X).$ Values of SPD range from -1 to 1, with values closer to 0 indicating less bias. - -For the Model Bias metric, the event of interest is correct classification. Let $C_1$ and $C_2$ be a partition of a single class $C$ (i.e. $C = C_1 \cup C_2$ but $C_1 \cap C_2 = \emptyset$ ), and let $m(C)$ measure the number of elements of $C$ classified correctly by the model. -Then the Model Bias metric computes - -$SPD_m(C) = \frac{m(C_1)}{|C_1|} - \frac{m(C_2)}{|C_2|}$. - - -The Filter Bias metric is very similar, only the event of interest is removal from the dataset by the filter. Let $f(C)$ be the number of elements of $C$ that are removed by the filter. Then the Filter Bias metric computes - -$SPD_f(C) = \frac{f(C_1)}{|C_1|} - \frac{f(C_2)}{|C_2|}$. - - -In addition to SPD, we can compute any number of interesting statistics on the contingency tables formed by the subclass populations and the binary attributes of model correctness and filter removal. Currently, Armory also reports the $\chi^2$ $p$-value of the contingency table for each class. The $\chi^2$ test measures the likeliness of the contingency table if we expected no difference in model or filter behavior on different subpopulations of data. Values range from 0 to 1, with a _higher_ value indicating _less_ bias. - - - -### Filter Perplexity - -Another filter metric we currently report is _perplexity_. While the previous fairness metrics assess bias within individual classes, perplexity gives a bigger picture of filter bias between all classes. -The intuition behind this metric is that an unbiased filter should behave the same on all unpoisoned data, so that if there are false positives, they should not overwhelmingly be from a single class, but be spread evenly among all classes. -Perplexity characterizes the difference between two distributions with values from 0 to 1, -with a higher value indicating that the two distributions are more similar (it is equal to 1 if the distributions are identical). We compare the class distribution of false positives with the class distribution of clean data. - - -Let $p(C_i)$ be the fraction of all false positives with class label $i$, and let $q(C_i)$ be the fraction of all unpoisoned datapoints with class label $i$. Note that both $p$ and $q$ include the (unpoisoned part of the) poisoned class, as it is possible to be biased toward that class just as to any other. Perplexity is defined as the exponential of the KL divergence between the two distributions, -$e^{\mathrm{KL}(p||q)}$, where - -$\mathrm{KL}(p||q) = \sum_i{p(C_i)\log}{\frac{p(C_i)}{q(C_i)}}$. - - - -### Witches' Brew - -Because test-time data is not poisoned for the witches' brew attack, it doesn't make sense to use the four primary metrics described above. Instead, we have these three: -- `accuracy_on_trigger_images` -- `accuracy_on_non_trigger_images` -- `attack_success_rate` - -`attack_success_rate` is the percentage of trigger images which were classified as their respective target classes, while `accuracy_on_trigger_images` is the percentage of trigger images that were classified as their natural labels (source classes). Similarly, `accuracy_on_non_trigger_images` is the classification accuracy on non-trigger images. - -The fairness and filter metrics remain the same. - -## Avoiding Out-Of-Memory (OOM) Errors - -The poisoning scenarios typically work with very large in-memory numpy arrays. -This can result in OOM errors in certain cases. - -One place where this can happen is when calling `fit` on the model. -If the model is a TensorFlowV2Classifier (ART), then the `fit` method will try to convert the entire numpy array to a tf tensor (not batched), which can exceed GPU memory for smaller cards, especially for the audio poisoning scenario. -If this is the case, set the scenario kwarg `fit_generator` to `true` in the config: -``` - ... - "scenario": { - "kwargs": { - "fit_generator": true - }, - ... -``` -This will wrap the numpy array in a generator, and send batched inputs into the ART model's `fit_generator` method. -This is less efficient and trains slower than the other method, which is why is not default, but will avoid the OOM error in this case. - -When `fit_generator` is set to `true`, and there is an explanatory model present, it will get activations from the dataset in a batched manner, which avoids a similar OOM error. diff --git a/docs/original/scenarios.md b/docs/original/scenarios.md deleted file mode 100644 index 156db7a51..000000000 --- a/docs/original/scenarios.md +++ /dev/null @@ -1,523 +0,0 @@ -# Scenarios -Armory is intended to evaluate threat-model scenarios. -Baseline evaluation scenarios are described below. -Additionally, we've provided some academic standard scenarios. - - -## Configuration Files -Scenario configuration files are found in the `scenario_configs` directory [here](scenario_configs). -The most recent config files are found in the `eval6` subfolder and older configs are found in the `eval5` and `eval1-4` subfolders. -There are also symlinks to representative configs found in the base of the `scenario_configs` directory. - - -## Base Scenario Class -All scenarios inherit from the [Scenario](https://github.com/twosixlabs/armory/blob/master/armory/scenarios/scenario.py) class. -This class parses an armory configuration file and calls its `evaluate` method to perform all of the computation for a given threat-models robustness to attack. -All `evaluate` methods save a dictionary of recorded metrics which are saved into the armory `output_dir` upon completion. -Scenarios are implemented as subclasses of `Scenario`, and typically given their own file in the [Scenarios Directory](https://github.com/twosixlabs/armory/blob/master/armory/scenarios/). - -Of particular note is the [Poison](https://github.com/twosixlabs/armory/blob/master/armory/scenarios/poison.py) class, from which all poisoning scenarios are subclassed. -More information on poisoning scenarios is documented [here](poisoning.md). - -### User Initialization - -When adding custom metrics or instrumentation meters to a scenario, it may be necessary to initialize or perform user-specific operations before loading. -This can also be helpful for other goals, such as fine-grained control over random initializations, instantiating external integrations (e.g., TensorBoard), or setting things like environment variables. -For this purpose, there is a `user_init` method that is called at the beginning of `load` (but after scenario initialization). -In poisoning, this occurs right after random seed setting in `load` (to enable the user to easily override random initialization). - -This uses the underlying scenario config field of the same name, `user_init`. -See [configuration](configuration_files.md) for the json specification. -An example config would be as follows: -```json - ... - "user_init": { - "module": "import.path.to.my_module", - "name": "my_init_function", - "kwargs": { - "case": 1, - "print_stuff": false - } - } -} -``` -Which would essentially do the following before loading anything else in the scenario: -```python -import import.path.to.my_module as my_module -my_module.my_init_function(case=1, print_stuff=False) -``` -If `name` were `""` or `None`, then it would only do the import: -```python -import import.path.to.my_module -``` - -This could be helpful for a variety of things, such as registering `metrics` prior to loading or setting up custom meters. -For instance: -```python -def my_init_function(): - from armory.instrument import Meter, get_hub - from armory import metrics - m = Meter( - "chi_squared_test", - metrics.get("chi2_p_value"), - "my_model.contingency_table", - ) - get_hub().connect_meter(m) -``` -Would enable measurement of a contingency table produced by your model. -This would require adding probe points in your model code to connect it (which doesn't need to be in the init block), e.g.: -```python -from armory.instrument import get_probe -probe = get_probe("my_model") - -class MyModel(torch.nn.Module): - ... - def forward(x): - ... - table = np.array([[2, 3], [4, 6]]) - probe.update(contingency_table=table) - ... -``` - - -## Baseline Scenarios -Currently the following Scenarios are available within the armory package. -Some scenario files are tied to a specific attack, while others are customized for a given dataset. Several are more general-purpose. -Along with each scenario description, we provide a link to a page with baseline results for applicable datasets and attacks. -More information about each referenced dataset can be found in the [datasets](datasets.md) document. - - -### Audio ASR (Updated June 2022) -* **Description:** -In this scenario, the system under evaluation is an automatic speech recognition system. -* **Dataset:** - * Armory includes one dataset suited for ASR: - * [LibriSpeech dataset](http://www.openslr.org/12) (custom subset) -* **Baseline Models:** -Armory includes two audio models: - * [DeepSpeech 2](https://arxiv.org/pdf/1512.02595v1.pdf) with pretrained weights from either the AN4, LibriSpeech, or TEDLIUM datasets. - Custom weights may also be loaded by the model. *Deprecated: will be removed in version 0.17.0* - * [HuBERT](https://arxiv.org/abs/2106.07447) Large from [torchaudio](https://pytorch.org/audio/0.10.0/pipelines.html#torchaudio.pipelines.Wav2Vec2Bundle) -* **Threat Scenario:** - * Adversary objectives: - * Untargeted - an adversary may simply wish for speech to be transcribed incorrectly - * Targeted - an adversary may wish for specific strings to be predicted - * Contradiction: an adversary may wish to transcribe a specific string with a meaning contrary to the original, albeit with a low word error rate. - * Adversary Operating Environment: - * Non-real time, digital evasion attack. - * Under some threat models, the channel model consists only a single perfect acoustic channel, and under others, it may consist of one additional multipath channel. -* **Metrics of Interest:** - * Primary metrics: - * Word error rate, SNR, entailment rate - * Derivative metrics - see end of document -* **Baseline Attacks:** - * [Imperceptible ASR attack](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/attacks/evasion/imperceptible_asr/imperceptible_asr.py) - * [PGD](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/attacks/evasion/projected_gradient_descent/projected_gradient_descent.py) - * [Kenansville attack](https://github.com/twosixlabs/armory/blob/8eb10ac43bf4382d69625d8cef8a3e8cb23d0318/armory/art_experimental/attacks/kenansville_dft.py) -* **Baseline Defense**: [MP3 Compression](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/preprocessor/mp3_compression.py) -* **Baseline Evaluations:** - * [LibriSpeech results](baseline_results/librispeech_asr_results.md) - - -### Audio Classification (Updated June 2020) -* **Description:** -In this scenario, the system under evaluation is a speaker identification system. -* **Dataset:** - * Armory includes one dataset suited for Audio Classification: - * [LibriSpeech dataset](http://www.openslr.org/12) (custom subset): -* **Baseline Model:** - * Armory includes two baseline speaker classification models: - * [SincNet](https://arxiv.org/abs/1808.00158), a scratch-trained model based on raw audio - * A scratch-trained model based on spectrogram input (not mel-cepstrum or MFCC) -* **Threat Scenario:** - * Adversary objectives: - * Untargeted - an adversary may simply wish to evade detection - * Targeted - an adversary may wish to impersonate someone else - * Adversary Operating Environment: - * Non-real time, digital evasion attack - * Assuming perfect acoustic channel - * Black-box, white-box, and adaptive attacks -* **Metrics of Interest:** - * Primary metrics: - * Accuracy (mean, per-class), attack computational cost, defense computational cost, various distance measures of perturbation - (Lp-norms, Wasserstein distance, signal-to-noise ratio) - * Derivative metrics - see end of document -* **Baseline Evaluations:** - * [LibriSpeech results](baseline_results/librispeech_audio_classification_results.md) - - -### CARLA Multi-Object tracking (MOT) (Updated October 2022) -* **Description:** -In this scenario specific to the CARLA multi-object tracking dataset, the system under evaluation is an object tracker -trained to track multiple pedestrians in video in an urban environment. -* **Dataset:** -The development dataset is the [CARLA](https://carla.org) Multi-Object Tracking dataset, with videos containing a green-screen in all frames intended for adversarial patch insertion. -The dataset contains natural lighting metadata that allow digital, adaptive patches to be inserted and rendered into the scene similar to if they were physically printed. -* **Baseline Model:** - * Pretrained [ByteTrack](https://arxiv.org/pdf/2110.06864.pdf) model with an [Faster-RCNN](https://github.com/twosixlabs/armory/blob/master/armory/baseline_models/pytorch/carla_mot_frcnn_byte.py) base instead of Yolo. -* **Threat Scenario:** - * Adversary objectives: - * To degrade the performance of the tracker through the insertion of adversarial patches. - * Adversary Operating Environment: - * Non-real time, physical-like patch attacks -* Adversary Capabilities and Resources - * Patch size of different size/shape as dictated by the green-screen in the frames. The adversary is expected to apply a patch with constant texture across all frames in the video, but the patch relative to the sensor may change due to sensor motion. -* **Metrics of Interest:** - * Primary metrics are [HOTA](https://link.springer.com/article/10.1007/s11263-020-01375-2)-based (quotes taken from paper), taken from [TrackEval](https://github.com/JonathonLuiten/TrackEval) implementation. - * mean DetA - "detection accuracy, DetA, is simply the percentage of aligning detections" - * mean AssA - "association accuracy, AssA, is simply the average alignment between matched trajectories, averaged over all detections" - * mean HOTA - "final HOTA score is the geometric mean of these two scores averaged over different localisation thresholds" -* **Baseline Attacks:** - * [Custom Robust DPatch with Non-differentiable, Input-Dependent Transformation](https://github.com/twosixlabs/armory/blob/master/armory/art_experimental/attacks/carla_obj_det_patch.py) - * [Custom Adversarial Patch with Differentiable, Input-Dependent Transformation](https://github.com/twosixlabs/armory/blob/master/armory/art_experimental/attacks/carla_obj_det_adversarial_patch.py) -* **Baseline Defense**: [JPEG Frame Compression](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/preprocessor/jpeg_compression.py) -* **Baseline Evaluation**: [Carla MOT results](baseline_results/carla_mot_results.md) - - -### CARLA Multimodal Object Detection (Updated October 2022) -* **Description:** -In this scenario, the system under evaluation is an object detector trained to identify common objects in an urban environment. This scenario handles multimodal data (RGB/depth). -* **Datasets** - The datasets are the [CARLA](https://carla.org) Object Detection and Overhead Object Detection datasets. - These datasets contain natural lighting metadata that allow digital, adaptive patches to be inserted and rendered into the scene similar to if they were physically printed. -* **Baseline Model:** - * Single-modality: - * Pretrained [Faster-RCNN with ResNet-50](https://github.com/twosixlabs/armory/blob/master/armory/baseline_models/pytorch/carla_single_modality_object_detection_frcnn.py) model. - * Multimodal: - * Pretrained multimodal [Faster-RCNN with ResNet-50](https://github.com/twosixlabs/armory/blob/master/armory/baseline_models/pytorch/carla_multimodality_object_detection_frcnn.py) model. -* **Threat Scenario:** - * Adversary objectives: - * To degrade the performance of an object detector through the insertion of adversarial patches. - * Adversary Operating Environment: - * Non-real time, physical-like patch attacks -* Adversary Capabilities and Resources - * Patch size of different size/shape as dictated by the green-screen in each image. In the multimodal case, both RGB and depth channels are to be perturbed. -* **Metrics of Interest:** - * Primary metrics: - * mAP - * Disappearance rate - * Hallucinations per image - * Misclassification rate - * True positive rate -* **Baseline Attacks:** - * [Custom Robust DPatch with Non-differentiable, Input-Dependent Transformation](https://github.com/twosixlabs/armory/blob/v0.15.2/armory/art_experimental/attacks/carla_obj_det_patch.py) - * [Custom Adversarial Patch with Differentiable, Input-Dependent Transformation](https://github.com/twosixlabs/armory/blob/v0.15.2/armory/art_experimental/attacks/carla_obj_det_adversarial_patch.py) -* **Baseline Defense**: [JPEG Compression](https://github.com/twosixlabs/armory/blob/v0.15.2/armory/art_experimental/defences/jpeg_compression_normalized.py) -* **Baseline Evaluations**: - * [Street-level dataset](baseline_results/carla_od_results.md#carla-street-level-od-dataset) - * [Overhead dataset](baseline_results/carla_od_results.md#carla-overhead-od-dataset) - - -### CARLA Video Tracking (Updated July 2022) -* **Description:** -In this scenario, the system under evaluation is an object tracker trained to localize a single moving pedestrian. -* **Dataset:** -The development dataset is the [CARLA Video Tracking dataset](https://carla.org), which includes 20 videos, each of -which contains a green-screen in all frames intended for adversarial patch insertion. The dataset contains natural lighting metadata that allow digital, adaptive patches to be inserted and rendered into the scene similar to if they were physically printed. -* **Baseline Model:** - * Pretrained [GoTurn](https://github.com/twosixlabs/armory/blob/master/armory/baseline_models/pytorch/carla_goturn.py) model. -* **Threat Scenario:** - * Adversary objectives: - * To degrade the performance of the tracker through the insertion of adversarial patches. - * Adversary Operating Environment: - * Non-real time, physical-like patch attacks -* Adversary Capabilities and Resources - * Patch size of different size/shape as dictated by the green-screen in the frames. The adversary is expected to apply a patch with constant texture across all frames in the video, but the patch relative to the sensor may change due to sensor motion. -* **Metrics of Interest:** - * Primary metrics: - * mean IOU - * mean succss rate (mean IOUs are calculated for multiple IOU thresholds and averaged) -* **Baseline Attacks:** - * [Custom Adversarial Texture with Input-Dependent Transformation](https://github.com/twosixlabs/armory/blob/v0.15.2/armory/art_experimental/attacks/carla_adversarial_texture.py) -* **Baseline Defense**: [Video Compression](https://github.com/twosixlabs/armory/blob/v0.15.2/armory/art_experimental/defences/video_compression_normalized.py) -* **Baseline Evaluation**: [CARLA video tracking results](baseline_results/carla_video_tracking_results.md) - - -### Dapricot Object Detection (Updated July 2021) -* **Description:** -In this scenario, the system under evaluation is an object detector trained to identify the classes in the [Microsoft COCO dataset](https://arxiv.org/pdf/1405.0312.pdf). -* **Dataset:** -The dataset is the [Dynamic APRICOT (DAPRICOT) dataset 1](https://github.com/twosixlabs/armory/blob/8eb10ac43bf4382d69625d8cef8a3e8cb23d0318/armory/data/adversarial/dapricot_dev.py) and [dataset 2](https://github.com/twosixlabs/armory/blob/8eb10ac43bf4382d69625d8cef8a3e8cb23d0318/armory/data/adversarial/dapricot_test.py). It is similar to the APRICOT dataset (see below), but instead of pre-generated physical patches taken in the natural environment, the DAPRICOT dataset contains greenscreens and natural lighting metadata that allow digital, adaptive patches to be inserted and rendered into the scene similar to if they were physically printed. This dataset contains 15 scenes, where each scene contains 3 different greenscreen shapes, taken at 3 different distances, 3 different heights and using 3 different camera angles, for a total of over 1000 images. -* **Baseline Model:** -The model uses the pretrained [Faster-RCNN with ResNet-50](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf1_detection_zoo.md) model. -* **Threat Scenario:** - * Adversary objectives: - * Targeted attack - objective is to force an object detector to localize and classify the patch as an MSCOCO object. - * Adversary Operating Environment: - * Non-real time, digital and physical-like patch attacks -* Adversary Capabilities and Resources - * Patch size of different shapes as dictated by the greenscreen sizes in the images -* **Metrics of Interest:** - * Primary metrics: - * Average precision (mean, per-class) of patches, Average target success -* **Baseline Attacks:** - * [Masked PGD](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/attacks/evasion/projected_gradient_descent/projected_gradient_descent.py) - * [Robust DPatch](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/attacks/evasion/dpatch_robust.py) -* **Baseline Defense:** [JPEG Compression](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/preprocessor/jpeg_compression.py) -* **Baseline Evaluation:** [Dapricot results](baseline_results/dapricot_results.md) - -### Image Classification -* **Description:** -In this scenario implements attacks against a basic image classification task. -* **Dataset:** - * Armory includes several image classification datasets. - * [Resisc-45](http://www.escience.cn/people/JunweiHan/NWPU-RESISC45.html). It comprises 45 classes and 700 images for each class. Images 1-500 of each class are in the training split, -500-600 are in the validation split, and 600-700 are in the test split. - * MNIST - * Cifar10 -* **Baseline Models:** - * Armory includes the following baseline image classification models: - * Resisc-45: ImageNet-pretrained DenseNet-121 that is fine-tuned on RESISC-45. - * MNIST: basic CNN - * Cifar10: basic CNN -* **Threat Scenario:** - * Adversary objectives: - * Untargeted - an adversary may simply wish to induce an arbitrary misclassification - * Targeted - an adversary may wish to force misclassification to a particular class - * Adversary Operating Environment: - * Non real-time, digital evasion attack - * Black-box, white-box, and adaptive attacks -* **Metrics of Interest:** - * Primary metrics: - * Accuracy (mean, per-class), attack computational cost, defense computational cost, various distance measures of perturbation - (Lp-norms, Wasserstein distance) - * Derivative metrics - see end of document -* **Baseline Defenses:** - * [JPEG Compression](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/preprocessor/jpeg_compression.py) -* **Baseline Evaluations:** - * [Resisc-45 results](baseline_results/resisc45_results.md) - - -### Multimodal So2Sat Image Classification (Updated July 2021) -* **Description:** -In this scenario, the system under evaluation is an image classifier which determines local climate zone from a combination of co-registered synthetic aperture radar (SAR) and multispectral electro-optical (EO) images. This Image Classification task gets its own scenario due to the unique features of the dataset. -* **Dataset:** -The dataset is the [so2sat dataset](https://mediatum.ub.tum.de/1454690). It comprises 352k/24k images in -train/validation datasets and 17 classes of local climate zones. -* **Baseline Model:** - * Armory includes a custom CNN as a baseline model. It has a single input that stacks SAR (first four channels only, -representing the real and imaginary components of the reflected electromagnetic waves) -and EO (all ten channels) data. Immediately after the input layer, the data is split into SAR and EO data -streams and fed into their respective feature extraction networks. In the final layer, the two -networks are fused to produce a single prediction output. -* **Threat Scenario:** - * Adversary objectives: - * Untargeted - an adversary wishes to evade correct classification - * Adversary Operating Environment: - * Non-real time, digital evasion attack - * Adversary perturbs a single modality (SAR or EO) -* **Metrics of Interest:** - * Primary metrics: - * Accuracy (mean, per-class), Patch size - * Derivative metrics - see end of document -* **Baseline Attacks:** - * [Masked PGD](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/attacks/evasion/projected_gradient_descent/projected_gradient_descent.py) -* **Baseline Defense:** [JPEG Compression for Multi-Channel](https://github.com/twosixlabs/armory/blob/8eb10ac43bf4382d69625d8cef8a3e8cb23d0318/armory/art_experimental/defences/jpeg_compression_multichannel_image.py) -* **Baseline Evaluation:** [So2Sat results](baseline_results/so2sat_results.md) - - -### Object Detection -* **Description:** -In this scenario, the system under evaluation is an object detector. -* **Datasets:** - * Armory includes two datasets for object detection (besides CARLA object detection which has its own [scenario](#carla-multimodal-object-detection-updated-october-2022)): - * [xView](https://arxiv.org/pdf/1802.07856) comprises 59k/19k train and test -images (each with dimensions 300x300, 400x400 or 500x500) and 62 classes - * [APRICOT](https://arxiv.org/pdf/1912.08166.pdf), which includes over 1000 natural images with physically-printed adversarial patches, with ten MS-COCO classes as targets -* **Baseline Models:** - * [Faster-RCNN ResNet-50 FPN](https://arxiv.org/pdf/1506.01497.pdf), pre-trained, can be used for xView - * [Faster-RCNN with ResNet-50, SSD with MobileNet, and RetinaNet](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf1_detection_zoo.md) models, pretrained, can be used for APRICOT. -on MSCOCO objects and fine-tuned on xView. -* **Threat Scenario:** - * Adversary objectives: - * Untargeted - an adversary wishes to disable object detection - * Adversary Operating Environment: - * Non-real time, digital and physical-like evasion attacks - and translation. - * Note: the APRICOT dataset consists of advesarial images precomputed for a targeted attack. -* **Metrics of Interest:** - * Primary metrics: - * Average precision (mean, per-class) of ground truth classes, Patch Size - * Derivative metrics - see end of document -* **Baseline Attacks:** - * [Masked PGD](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/attacks/evasion/projected_gradient_descent/projected_gradient_descent.py) - * [Robust DPatch](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/attacks/evasion/dpatch_robust.py) - * The patches for APRICOT were generated using variants of [ShapeShifter](https://arxiv.org/abs/1804.05810) -* **Baseline Defense:** [JPEG Compression](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/preprocessor/jpeg_compression.py) -* **Baseline Evaluations**: - * [xView results](baseline_results/xview_results.md) - * [APRICOT results](baseline_results/apricot_results.md) - -### UCF101 Video Classification - -* **Description:** -In this scenario, the system under evaluation is a video action recognition system. -* **Datasets:** -Armory includes the following video classification datasets: - * [UCF101 dataset](https://www.crcv.ucf.edu/data/UCF101.php), which comprises 101 actions and 13,320 total videos. For the training/testing split, -we use the official Split 01. -* **Baseline Model:** -Armory includes a model for UCF101 that uses the [MARS architecture](http://openaccess.thecvf.com/content_CVPR_2019/papers/Crasto_MARS_Motion-Augmented_RGB_Stream_for_Action_Recognition_CVPR_2019_paper.pdf), -which is a single-stream (RGB) 3D convolution architecture that simultaneously mimics the optical flow stream. -The provided model is pre-trained on the Kinetics dataset and fine-tuned on UCF101. -* **Threat Scenario:** - * Adversary objectives: - * Untargeted - an adversary may simply wish to evade detection - * Adversary Operating Environment: - * Non-real time, digital evasion attack -* **Metrics of Interest:** - * Primary metrics: - * Accuracy (mean, per-class), attack budget - * Derivative metrics - see end of document -* **Baseline Attacks:** - * [Frame Saliency](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/attacks/evasion/frame_saliency.py) - * [Masked PGD](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/attacks/evasion/projected_gradient_descent/projected_gradient_descent.py) - * [Flicker Attack](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/attacks/evasion/over_the_air_flickering/over_the_air_flickering_pytorch.py) - * [Custom Frame Border attack](https://github.com/twosixlabs/armory/blob/8eb10ac43bf4382d69625d8cef8a3e8cb23d0318/armory/art_experimental/attacks/video_frame_border.py) -* **Baseline Defense:** [Video Compression](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/preprocessor/video_compression.py) -* **Baseline Evaluations:** - * [UCF101 results](baseline_results/ucf101_results.md) - - -### Poisoning - -For a complete overview of the poisoning scenarios, threat models, attacks, and metrics, see the [poisoning doc](poisoning.md). Here, we will briefly summarize each scenario and link to the baseline results. - -#### Poison base scenario (DLBD) - -* **Description:** The base scenario implements a Dirty-label Backdoor attack (DLBD). In this scenario, the attacker is able to poison a percentage of the training data by adding backdoor triggers and flipping the label of data examples. Then, the attacker adds the same trigger to test images to cue the desired misclassification. For a complete overview, see the [poisoning doc](poisoning.md). -* **Datasets:** - Datasets for DLBD include but are not limited to: - * GTSRB - * Audio Speech Commands - * Resisc-10 - * Cifar10 -* **Baseline Models:** - Armory includes several models which may be used for this scenario: - * [GTSRB micronnet](https://github.com/twosixlabs/armory/blob/master/armory/baseline_models/pytorch/micronnet_gtsrb.py) - * [Audio resnet](https://github.com/twosixlabs/armory/blob/master/armory/baseline_models/tf_graph/audio_resnet50.py) - * [Resnet18](https://github.com/twosixlabs/armory/blob/master/armory/baseline_models/pytorch/resnet18.py) can be used for Cifar10 or Resisc-10 -* **Threat Scenario:** - * Adversary objectives: - * Targeted misclassification - * Adversary Operating Environment: - * Non-real time, digital evasion attack -* **Metrics of Interest:** See the [poisoning doc](poisoning.md) for a full description of these metrics. - * accuracy_on_benign_test_data_all_classes - * accuracy_on_benign_test_data_source_class - * accuracy_on_poisoned_test_data_all_classes - * attack_success_rate - * Model Bias fairness metric - * Filter Bias fairness metric -* **Baseline Defenses:** - * [Activation Clustering](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/detector/poison/activation_defence.py) - * [Spectral Signatures](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/detector/poison/spectral_signature_defense.py) - * [Random Filter](https://github.com/twosixlabs/armory/blob/master/armory/art_experimental/poison_detection/random_filter.py) - * [Perfect Filter](https://github.com/twosixlabs/armory/blob/1d6caa9166313c1409edbbc5f089d2bc774b5230/armory/scenarios/poison.py#L233-L235) -* **Baseline Evaluations:** - * [GTSRB DLBD](baseline_results/gtsrb_dlbd_results.md) - * [Resisc DLBD](baseline_results/resisc_dlbd_results.md) - * [Audio](baseline_results/speech_commands_poison_results.md) - * [Cifar10](baseline_results/cifar10_dlbd.md) - - -#### Poisoning CLBD -* **Description:** This scenario implements a Clean-label Backdoor attack (CLBD). In this scenario, the attacker adds triggers to source class training images, leaving the labels the same but also applying imperceptible perturbations that look like target class features. At test time, adding the trigger to a source class image induces misclassification to the target class. For a complete overview, see the [poisoning doc](poisoning.md). -* **Datasets:** - Datasets for CLBD include but are not limited to: - * GTSRB -* **Baseline Models:** - Armory includes several models which may be used for this scenario: - * [GTSRB micronnet](https://github.com/twosixlabs/armory/blob/master/armory/baseline_models/pytorch/micronnet_gtsrb.py) - * [Resnet18](https://github.com/twosixlabs/armory/blob/master/armory/baseline_models/pytorch/resnet18.py) -* **Threat Scenario:** - * Adversary objectives: - * Targeted misclassification - * Adversary Operating Environment: - * Non-real time, digital evasion attack -* **Metrics of Interest:** See the [poisoning doc](poisoning.md) for a full description of these metrics. - * accuracy_on_benign_test_data_all_classes - * accuracy_on_benign_test_data_source_class - * accuracy_on_poisoned_test_data_all_classes - * attack_success_rate - * Model Bias fairness metric - * Filter Bias fairness metric -* **Baseline Defenses:** - * [Activation Clustering](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/detector/poison/activation_defence.py) - * [Spectral Signatures](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/detector/poison/spectral_signature_defense.py) - * [Random Filter](https://github.com/twosixlabs/armory/blob/master/armory/art_experimental/poison_detection/random_filter.py) - * [Perfect Filter](https://github.com/twosixlabs/armory/blob/1d6caa9166313c1409edbbc5f089d2bc774b5230/armory/scenarios/poison.py#L233-L235) -* **Baseline Evaluations:** - * [GTSRB](baseline_results/gtsrb_clbd_results.md) - * [Resisc CLBD](baseline_results/resisc_clbd_results.md) - - -#### Poisoning: Sleeper Agent -* **Description:** This scenario implements the Sleeper Agent attack. In this scenario, the attacker poisons train samples through gradient matching, then applies a trigger to test images to induce misclassification. -For a complete overview, see the [poisoning doc](poisoning.md). -* **Datasets:** - Datasets for Sleeper Agent include but are not limited to: - * Cifar10 -* **Baseline Models:** - Armory includes several models which may be used for this scenario: -* [Resnet18](https://github.com/twosixlabs/armory/blob/master/armory/baseline_models/pytorch/resnet18.py) -* **Threat Scenario:** - * Adversary objectives: - * Targeted misclassification - * Adversary Operating Environment: - * Non-real time, digital evasion attack -* **Metrics of Interest:** See the [poisoning doc](poisoning.md) for a full description of these metrics. - * accuracy_on_benign_test_data_all_classes - * accuracy_on_benign_test_data_source_class - * accuracy_on_poisoned_test_data_all_classes - * attack_success_rate - * Model Bias fairness metric - * Filter Bias fairness metric -* **Baseline Defenses:** - * [Activation Clustering](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/detector/poison/activation_defence.py) - * [Spectral Signatures](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/detector/poison/spectral_signature_defense.py) - * [Random Filter](https://github.com/twosixlabs/armory/blob/master/armory/art_experimental/poison_detection/random_filter.py) - * [Perfect Filter](https://github.com/twosixlabs/armory/blob/1d6caa9166313c1409edbbc5f089d2bc774b5230/armory/scenarios/poison.py#L233-L235) -* **Baseline Evaluations:** - * [Cifar results](baseline_results/cifar10_sleeper_agent.md) - - -#### Poisoning: Witches' Brew -* **Description:** This scenario implements the Witches' Brew attack. In this scenario, the attacker poisons train samples through gradient matching, to induce misclassification on a few individual pre-chosen test images. For a complete overview, see the [poisoning doc](poisoning.md). -* **Datasets:** - The following datasets have been successfully used in this scenario: - * GTSRB - * Cifar10 -* **Baseline Models:** - Armory includes several models which may be used for this scenario: - * [GTSRB micronnet](https://github.com/twosixlabs/armory/blob/master/armory/baseline_models/pytorch/micronnet_gtsrb.py) - * [Resnet18](https://github.com/twosixlabs/armory/blob/master/armory/baseline_models/pytorch/resnet18.py) -* **Threat Scenario:** - * Adversary objectives: - * Targeted misclassification - * Adversary Operating Environment: - * Non-real time, digital evasion attack -* **Metrics of Interest:** See the [poisoning doc](poisoning.md) for a full description of these metrics. - * accuracy_on_trigger_images - * accuracy_on_non_trigger_images - * attack_success_rate - * Model Bias fairness metric - * Filter Bias fairness metric -* **Baseline Defenses:** - * [Activation Clustering](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/detector/poison/activation_defence.py) - * [Spectral Signatures](https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/art/defences/detector/poison/spectral_signature_defense.py) - * [Random Filter](https://github.com/twosixlabs/armory/blob/master/armory/art_experimental/poison_detection/random_filter.py) - * [Perfect Filter](https://github.com/twosixlabs/armory/blob/1d6caa9166313c1409edbbc5f089d2bc774b5230/armory/scenarios/poison.py#L233-L235) -* **Baseline Evaluations:** - * [Cifar10 results](baseline_results/cifar10_witches_brew_results.md) - * [GTSRB results](baseline_results/gtsrb_witches_brew_results.md) - - -## Creating a new scenario -Users may want to create their own scenario, because the baseline scenarios do -not fit the requirements of some defense/threat-model, or because it may be easier -to debug in code that you have access to as opposed to what is pre-installed by the -armory package. - -To do so, simply inherit the scenario class and override the necessary functions. -An [example of doing this](https://github.com/twosixlabs/armory-example/blob/master/example_scenarios/audio_spectrogram_classification.py) can be found in our armory-examples repo. diff --git a/docs/original/sweep_attacks.md b/docs/original/sweep_attacks.md deleted file mode 100644 index 519c56d1b..000000000 --- a/docs/original/sweep_attacks.md +++ /dev/null @@ -1,87 +0,0 @@ -# Sweep Attacks - -Armory supports running adversarial attacks which "sweep" over a range of values for specified -attack parameters (e.g. `"eps"`). This helps automate the process of determining at what -attack parameter values (i.e. perturbation budget) a defense is no longer robust. The attack -returns the weakest-strength adversarial example that is successful, or the original input -if the attack fails at all values. - -To enable such an attack, set `attack_config["type"]` to `"sweep"`. -```aidl -"attack": { - "module": "art.attacks.evasion", - "name": "ProjectedGradientDescent", - ... - "type": "sweep" -} -``` - -Next, specify which parameter(s) to perform the search over. This is done using the -`attack_config["sweep_params"]["kwargs"]` field for kwargs passed to attack instantiation and the -`attack_config["sweep_params"]["generate_kwargs"]` field for kwargs passed to the attack's -`generate()` method. In the example below we sweep over the `"eps"` and `"eps_step"` -parameters: - -```aidl -"attack": { - "module": "art.attacks.evasion", - "name": "ProjectedGradientDescent", - "type": "sweep", - "sweep_params": { - "kwargs": { - "eps": [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08], - "eps_step": [0.005, 0.01, 0.015, 0.02, 0.025, 0.03, 0.035, 0.04] - } - } -} -``` - -Similarly, in the following example, we sweep over kwargs passed to the attack's `generate()` method -using the `"generate_kwargs"` field inside `attack_config["sweep_params"]`: -```aidl -"attack": { - "module": "armory.art_experimental.attacks.pgd_patch", - "name": "PGDPatch", - "type": "sweep", - "sweep_params": { - "generate_kwargs": { - "patch_height": [10, 20, 30, 40, 50], - "patch_width": [10, 20, 30, 40, 50] - } - } -} -``` - -Each range of sweep parameters must be specified with a list of length `N`, where `N > 1` is -the number of desired search points. All parameters specified inside of -`attack_config["sweep_params"]` must correspond to lists of length `N`, and the `ith` element of -a given kwarg list will be used in conjunction with the `ith` element of all other kwarg -lists (i.e. in the first example, when `"eps"` is `0.01`, `"eps_step"` is `0.005` and so on). The -search algorithm assumes that parameters lists are in ascending order of attack strength. - -Attack parameters to be held constant should be specified in `attack_config["kwargs"]` and -`attack_config["generate_kwargs"]` as per usual. If the same kwarg (or generate_kwarg) appears in `attack_config["kwargs"]` -and `attack_config["sweep_params"]["kwargs"]`, the former will be ignored. - - -### Determining Attack Success -In order to identify at what point an attack is successful, it is necessary to define how -attack success is measured. By default `armory.utils.metrics.categorical_accuracy` is used to -determine whether the predicted label matches the ground-truth. For non-classification -scenarios such as object detection or speech recognition, this metric doesn't apply. - -Users can specify the task-relevant metric used to measure robustness via the -`attack_config["sweep_params"]["metric"]` field. Inside this field, specify a `"module"` and -`"name"` which point to the desired metric function. This can be any function `f` which takes -positional arguments `y` and `y_pred` as such: `f(y, y_pred)` and returns a scalar. A -`"threshold"` must also be specified indicating at what metric value that attack is -considered successful. For non-targeted attacks, if the value is *below* the threshold we -consider the attack successful, while the opposite is true for targeted attacks. - -### Additional Configuration Settings -Sweep attacks require access to either ground-truth or target labels `y`. If the attack -is untargeted, set `attack_config["use_label"]` to `true`. - - -To ensure that metrics are saved on a per-example basis, set -`metric_config["record_metric_per_sample"]` to `true`. diff --git a/docs/scenario_configs/README.md b/docs/scenario_configs/README.md deleted file mode 100644 index 48cfa3e0e..000000000 --- a/docs/scenario_configs/README.md +++ /dev/null @@ -1 +0,0 @@ -These config files were used by Armory prior to version 23.03. They are here for historical reference. diff --git a/docs/scenario_configs/asr_librispeech_entailment.json b/docs/scenario_configs/asr_librispeech_entailment.json deleted file mode 120000 index 752937374..000000000 --- a/docs/scenario_configs/asr_librispeech_entailment.json +++ /dev/null @@ -1 +0,0 @@ -eval5/asr_librispeech/entailment.json \ No newline at end of file diff --git a/docs/scenario_configs/asr_librispeech_targeted.json b/docs/scenario_configs/asr_librispeech_targeted.json deleted file mode 120000 index 04b2e2ac6..000000000 --- a/docs/scenario_configs/asr_librispeech_targeted.json +++ /dev/null @@ -1 +0,0 @@ -eval5/asr_librispeech/untargeted_snr_pgd.json \ No newline at end of file diff --git a/docs/scenario_configs/carla_multimodal_object_detection.json b/docs/scenario_configs/carla_multimodal_object_detection.json deleted file mode 120000 index be7f1e7cc..000000000 --- a/docs/scenario_configs/carla_multimodal_object_detection.json +++ /dev/null @@ -1 +0,0 @@ -eval5/carla_object_detection/carla_obj_det_multimodal_adversarialpatch_undefended.json \ No newline at end of file diff --git a/docs/scenario_configs/carla_video_tracking.json b/docs/scenario_configs/carla_video_tracking.json deleted file mode 120000 index 0728282fa..000000000 --- a/docs/scenario_configs/carla_video_tracking.json +++ /dev/null @@ -1 +0,0 @@ -eval5/carla_video_tracking/carla_video_tracking_goturn_advtextures_undefended.json \ No newline at end of file diff --git a/docs/scenario_configs/cifar10_baseline.json b/docs/scenario_configs/cifar10_baseline.json deleted file mode 120000 index 43df4eda5..000000000 --- a/docs/scenario_configs/cifar10_baseline.json +++ /dev/null @@ -1 +0,0 @@ -eval1-4/cifar/cifar10_baseline.json \ No newline at end of file diff --git a/docs/scenario_configs/eval1-4/aprioct/apricot_frcnn.json b/docs/scenario_configs/eval1-4/aprioct/apricot_frcnn.json deleted file mode 100644 index 426cefe44..000000000 --- a/docs/scenario_configs/eval1-4/aprioct/apricot_frcnn.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "_description": "APRICOT object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "split": "frcnn+ssd+retinanet" - }, - "module": "armory.data.adversarial_datasets", - "name": "apricot_dev_adversarial", - "type": "preloaded", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "frcnn+ssd+retinanet", - "framework": "numpy", - "module": "armory.data.adversarial_datasets", - "name": "apricot_dev_adversarial" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "apricot_patch_targeted_AP_per_class", - "object_detection_AP_per_class" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.mscoco_frcnn", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.object_detection", - "name": "ObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/aprioct/apricot_frcnn_defended.json b/docs/scenario_configs/eval1-4/aprioct/apricot_frcnn_defended.json deleted file mode 100644 index ad327a315..000000000 --- a/docs/scenario_configs/eval1-4/aprioct/apricot_frcnn_defended.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "_description": "APRICOT object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "split": "frcnn+ssd+retinanet" - }, - "module": "armory.data.adversarial_datasets", - "name": "apricot_dev_adversarial", - "type": "preloaded", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "frcnn+ssd+retinanet", - "framework": "numpy", - "module": "armory.data.adversarial_datasets", - "name": "apricot_dev_adversarial" - }, - "defense": { - "kwargs": { - "apply_fit": false, - "apply_predict": true, - "clip_values": [ - 0.0, - 1.0 - ], - "quality": 10 - }, - "module": "armory.art_experimental.defences.jpeg_compression_normalized", - "name": "JpegCompressionNormalized", - "type": "Preprocessor" - }, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "apricot_patch_targeted_AP_per_class", - "object_detection_AP_per_class" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.mscoco_frcnn", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.object_detection", - "name": "ObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_imperceptible_defended.json b/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_imperceptible_defended.json deleted file mode 100644 index cdecb16ce..000000000 --- a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_imperceptible_defended.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "_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": "Mp3CompressionPyTorch", - "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", - "external_github_repo": "SeanNaren/deepspeech.pytorch@V3.0", - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_imperceptible_undefended.json b/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_imperceptible_undefended.json deleted file mode 100644 index 71b02f0dc..000000000 --- a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_imperceptible_undefended.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "_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": null, - "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", - "external_github_repo": "SeanNaren/deepspeech.pytorch@V3.0", - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_kenansville_defended.json b/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_kenansville_defended.json deleted file mode 100644 index c4d41fb71..000000000 --- a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_kenansville_defended.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", - "adhoc": { - "skip_adversarial": false - }, - "attack": { - "knowledge": "white", - "kwargs": { - "partial_attack": false, - "snr_db": 20, - "targeted": false - }, - "module": "armory.art_experimental.attacks.kenansville_dft", - "name": "KenansvilleDFT", - "use_label": false - }, - "dataset": { - "batch_size": 8, - "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", - "external_github_repo": "SeanNaren/deepspeech.pytorch@V3.0", - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_kenansville_undefended.json b/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_kenansville_undefended.json deleted file mode 100644 index 1a8e25bed..000000000 --- a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_kenansville_undefended.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", - "adhoc": { - "skip_adversarial": false - }, - "attack": { - "knowledge": "white", - "kwargs": { - "partial_attack": false, - "snr_db": 20, - "targeted": false - }, - "module": "armory.art_experimental.attacks.kenansville_dft", - "name": "KenansvilleDFT", - "use_label": false - }, - "dataset": { - "batch_size": 8, - "eval_split": "test_clean", - "framework": "numpy", - "module": "armory.data.datasets", - "name": "librispeech", - "train_split": "train_clean100" - }, - "defense": null, - "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", - "external_github_repo": "SeanNaren/deepspeech.pytorch@V3.0", - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_pgd_defended.json b/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_pgd_defended.json deleted file mode 100644 index c54f8ef78..000000000 --- a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_pgd_defended.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "_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", - "external_github_repo": "SeanNaren/deepspeech.pytorch@V3.0", - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_pgd_multipath_channel_undefended.json b/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_pgd_multipath_channel_undefended.json deleted file mode 100644 index ac814e83a..000000000 --- a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_pgd_multipath_channel_undefended.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "_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": null, - "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", - "external_github_repo": "SeanNaren/deepspeech.pytorch@V3.0", - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_pgd_undefended.json b/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_pgd_undefended.json deleted file mode 100644 index 94a7bef1c..000000000 --- a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_pgd_undefended.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "_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": null, - "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", - "external_github_repo": "SeanNaren/deepspeech.pytorch@V3.0", - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_snr_targeted.json b/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_snr_targeted.json deleted file mode 100644 index 263adccac..000000000 --- a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_snr_targeted.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", - "adhoc": { - "skip_adversarial": false - }, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 10, - "eps_step": 0.5, - "max_iter": 10, - "norm": "snr", - "num_random_init": 0, - "targeted": true - }, - "module": "armory.art_experimental.attacks.snr_pgd", - "name": "SNR_PGD_Numpy", - "targeted": true, - "targeted_labels": { - "kwargs": { - "import_from": "armory.attacks.librispeech_target_labels", - "transcripts": "matched_length" - }, - "module": "armory.utils.labels", - "name": "MatchedTranscriptLengthTargeter" - }, - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "test_clean", - "framework": "numpy", - "module": "armory.data.datasets", - "name": "librispeech", - "train_split": "train_clean100" - }, - "defense": null, - "metric": { - "means": false, - "perturbation": "linf", - "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", - "external_github_repo": "SeanNaren/deepspeech.pytorch@V3.0", - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_snr_undefended.json b/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_snr_undefended.json deleted file mode 100644 index 9ed517ef0..000000000 --- a/docs/scenario_configs/eval1-4/asr_librispeech/librispeech_asr_snr_undefended.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", - "adhoc": { - "skip_adversarial": false - }, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 10, - "eps_step": 0.5, - "max_iter": 10, - "norm": "snr", - "num_random_init": 0, - "targeted": true - }, - "module": "armory.art_experimental.attacks.snr_pgd", - "name": "SNR_PGD_Numpy", - "targeted": true, - "targeted_labels": { - "kwargs": { - "value": "TEST STRING" - }, - "module": "armory.utils.labels", - "name": "FixedStringTargeter" - }, - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "test_clean", - "framework": "numpy", - "module": "armory.data.datasets", - "name": "librispeech", - "train_split": "train_clean100" - }, - "defense": null, - "metric": { - "means": false, - "perturbation": "linf", - "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", - "external_github_repo": "SeanNaren/deepspeech.pytorch@V3.0", - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/cifar/cifar10_baseline.json b/docs/scenario_configs/eval1-4/cifar/cifar10_baseline.json deleted file mode 100644 index 9e9adc5d9..000000000 --- a/docs/scenario_configs/eval1-4/cifar/cifar10_baseline.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "_description": "Baseline cifar10 image classification", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 0.031, - "eps_step": 0.007, - "max_iter": 20, - "num_random_init": 1, - "random_eps": false, - "targeted": false, - "verbose": false - }, - "module": "art.attacks.evasion", - "name": "ProjectedGradientDescent", - "use_label": true - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": true, - "fit_kwargs": { - "nb_epochs": 20 - }, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.cifar", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.image_classification", - "name": "ImageClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/dapricot/dapricot_frcnn_masked_pgd.json b/docs/scenario_configs/eval1-4/dapricot/dapricot_frcnn_masked_pgd.json deleted file mode 100644 index 77a0ac11b..000000000 --- a/docs/scenario_configs/eval1-4/dapricot/dapricot_frcnn_masked_pgd.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "_description": "DAPRICOT object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "generate_kwargs": { - "threat_model": "digital" - }, - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 1.0, - "eps_step": 0.02, - "max_iter": 100, - "targeted": true - }, - "module": "armory.art_experimental.attacks.dapricot_patch", - "name": "DApricotMaskedPGD", - "targeted_labels": { - "scheme": "object_detection_fixed", - "value": 2 - } - }, - "dataset": { - "batch_size": 1, - "eval_split": "large+medium+small", - "framework": "numpy", - "module": "armory.data.adversarial_datasets", - "name": "dapricot_test_adversarial" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "dapricot_patch_targeted_AP_per_class", - "dapricot_patch_target_success" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.mscoco_frcnn", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "export_batches": true, - "kwargs": {}, - "module": "armory.scenarios.dapricot_scenario", - "name": "ObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "colour-science/colour@v0.3.16", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/mnist/mnist_baseline.json b/docs/scenario_configs/eval1-4/mnist/mnist_baseline.json deleted file mode 100644 index 6f8988de4..000000000 --- a/docs/scenario_configs/eval1-4/mnist/mnist_baseline.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "_description": "Baseline mnist image classification", - "adhoc": null, - "attack": { - "knowledge": "white", - "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", - "use_label": true - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "mnist" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": true, - "fit_kwargs": { - "nb_epochs": 20 - }, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.mnist", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.image_classification", - "name": "ImageClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/poisoning/gtsrb_scenario_clbd.json b/docs/scenario_configs/eval1-4/poisoning/gtsrb_scenario_clbd.json deleted file mode 100644 index 582f60254..000000000 --- a/docs/scenario_configs/eval1-4/poisoning/gtsrb_scenario_clbd.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_description": "GTSRB poison image classification, contributed by MITRE Corporation", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 20, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "pattern" - }, - "eps": 2.6, - "eps_step": 0.1, - "max_iter": 100, - "n_classes": 43, - "norm": 2, - "num_random_init": 0, - "pp_poison": 0.1, - "target": 2 - }, - "module": "armory.art_experimental.attacks.poison_loader_clbd", - "name": "poison_loader_clbd", - "type": "clbd", - "use_adversarial_trainer": false - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poisoning_clbd", - "name": "Poison_CLBD" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/poisoning/gtsrb_scenario_clbd_bullethole.json b/docs/scenario_configs/eval1-4/poisoning/gtsrb_scenario_clbd_bullethole.json deleted file mode 100644 index 568fa9d35..000000000 --- a/docs/scenario_configs/eval1-4/poisoning/gtsrb_scenario_clbd_bullethole.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "_description": "GTSRB poison image classification, contributed by MITRE Corporation", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 50, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "bullet_holes.png", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 17, - 15 - ] - }, - "eps": 0.03, - "eps_step": 0.001, - "max_iter": 100, - "n_classes": 43, - "norm": "inf", - "num_random_init": 2, - "pp_poison": 0.5, - "target": 2 - }, - "module": "armory.art_experimental.attacks.poison_loader_clbd", - "name": "poison_loader_clbd", - "type": "clbd", - "use_adversarial_trainer": false - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poisoning_clbd", - "name": "Poison_CLBD" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/poisoning/gtsrb_scenario_clbd_defended.json b/docs/scenario_configs/eval1-4/poisoning/gtsrb_scenario_clbd_defended.json deleted file mode 100644 index 231fe90e5..000000000 --- a/docs/scenario_configs/eval1-4/poisoning/gtsrb_scenario_clbd_defended.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "_description": "GTSRB poison image classification, contributed by MITRE Corporation", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 20, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "pattern" - }, - "eps": 2.6, - "eps_step": 0.1, - "max_iter": 100, - "n_classes": 43, - "norm": 2, - "num_random_init": 0, - "pp_poison": 0.1, - "target": 2 - }, - "module": "armory.art_experimental.attacks.poison_loader_clbd", - "name": "poison_loader_clbd", - "type": "clbd", - "use_adversarial_trainer": false - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poisoning_clbd", - "name": "Poison_CLBD" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/poisoning/resisc10_poison_dlbd.json b/docs/scenario_configs/eval1-4/poisoning/resisc10_poison_dlbd.json deleted file mode 100644 index 547691db9..000000000 --- a/docs/scenario_configs/eval1-4/poisoning/resisc10_poison_dlbd.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "_description": "RESISC10 poison image classification, contributed by MITRE Corporation", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "resisc10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 5, - "train_epochs": 200, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "letter_A.png", - "base_img_size_x": 64, - "base_img_size_y": 64, - "blend": 0.8, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 10, - 10 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "resisc10" - }, - "defense": { - "data_augmentation": { - "rotation": { - "kwargs": { - "apply_fit": false, - "apply_predict": false, - "clip_values": [ - 0.0, - 1.0 - ], - "degree": 0.0, - "nb_samples": 1, - "scale": [ - 0.8, - 1.2 - ], - "translate": [ - 0.1, - 0.1 - ] - }, - "module": "armory.art_experimental.defences.random_affine_pytorch", - "name": "EoTRandomAffinePyTorch", - "type": "Preprocessor" - } - }, - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.37853524, - 0.38404912, - 0.36049628 - ], - "data_stds": [ - 0.18050115, - 0.17266262, - 0.173474 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 64, - 64, - 3 - ], - "nb_classes": 10 - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121.json b/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121.json deleted file mode 100644 index 139a7095b..000000000 --- a/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "_description": "Resisc45 image classification, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "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", - "use_label": false - }, - "dataset": { - "batch_size": 16, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "resisc45" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.densenet121_resisc45", - "name": "get_art_model", - "weights_file": "densenet121_resisc45_v1.h5", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.image_classification", - "name": "ImageClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121_cascade.json b/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121_cascade.json deleted file mode 100644 index ad8fe9dde..000000000 --- a/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121_cascade.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "_description": "Resisc45 image classification, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "eps": 0.2, - "inner_configs": [ - { - "kwargs": { - "eps": 0.2, - "eps_step": 0.1, - "max_iter": 100, - "num_random_init": 0 - }, - "module": "art.attacks.evasion", - "name": "ProjectedGradientDescent" - }, - { - "kwargs": { - "batch_size": 1, - "confidence": 0.9, - "max_iter": 10 - }, - "module": "art.attacks.evasion", - "name": "CarliniLInfMethod" - }, - { - "kwargs": { - "max_iter": 1000 - }, - "module": "art.attacks.evasion", - "name": "BoundaryAttack" - } - ], - "targeted": false - }, - "module": "armory.art_experimental.attacks.cascading_attack", - "name": "CascadingAttack", - "use_label": false - }, - "dataset": { - "batch_size": 16, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "resisc45" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.densenet121_resisc45", - "name": "get_art_model", - "weights_file": "densenet121_resisc45_v1.h5", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.image_classification", - "name": "ImageClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121_finetune.json b/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121_finetune.json deleted file mode 100644 index 2b9ff9a83..000000000 --- a/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121_finetune.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "_description": "Resisc45 image classification with pretained weights from imagenet, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "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", - "use_label": false - }, - "dataset": { - "batch_size": 16, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "resisc45" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.densenet121_resisc45", - "name": "get_art_model", - "weights_file": "densenet121_imagenet_v1.h5", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.image_classification", - "name": "ImageClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121_sweep_eps.json b/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121_sweep_eps.json deleted file mode 100644 index c8339ce64..000000000 --- a/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121_sweep_eps.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "_description": "Resisc45 image classification, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "minimal": false, - "num_random_init": 0, - "targeted": false - }, - "module": "art.attacks.evasion", - "name": "FastGradientMethod", - "sweep_params": { - "kwargs": { - "eps": [ - 0.01, - 0.02, - 0.03, - 0.04, - 0.05, - 0.06, - 0.07, - 0.08 - ], - "eps_step": [ - 0.005, - 0.01, - 0.015, - 0.02, - 0.025, - 0.03, - 0.035, - 0.04 - ] - } - }, - "type": "sweep", - "use_label": true - }, - "dataset": { - "batch_size": 1, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "resisc45" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": true, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.densenet121_resisc45", - "name": "get_art_model", - "weights_file": "densenet121_resisc45_v1.h5", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.image_classification", - "name": "ImageClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121_targeted.json b/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121_targeted.json deleted file mode 100644 index 00f8d3aa5..000000000 --- a/docs/scenario_configs/eval1-4/resisc45/resisc45_baseline_densenet121_targeted.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_description": "Resisc45 image classification, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 0.5, - "eps_step": 0.1, - "minimal": false, - "num_random_init": 0, - "targeted": true - }, - "module": "art.attacks.evasion", - "name": "FastGradientMethod", - "targeted_labels": { - "kwargs": { - "num_classes": 45 - }, - "module": "armory.utils.labels", - "name": "RoundRobinTargeter" - }, - "use_label": false - }, - "dataset": { - "batch_size": 16, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "resisc45" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.densenet121_resisc45", - "name": "get_art_model", - "weights_file": "densenet121_resisc45_v1.h5", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.image_classification", - "name": "ImageClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/so2sat/so2sat_eo_masked_pgd_defended.json b/docs/scenario_configs/eval1-4/so2sat/so2sat_eo_masked_pgd_defended.json deleted file mode 100644 index 582871db6..000000000 --- a/docs/scenario_configs/eval1-4/so2sat/so2sat_eo_masked_pgd_defended.json +++ /dev/null @@ -1,146 +0,0 @@ -{ - "_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/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/so2sat/so2sat_eo_masked_pgd_undefended.json b/docs/scenario_configs/eval1-4/so2sat/so2sat_eo_masked_pgd_undefended.json deleted file mode 100644 index bf4f77511..000000000 --- a/docs/scenario_configs/eval1-4/so2sat/so2sat_eo_masked_pgd_undefended.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "_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/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/so2sat/so2sat_sar_masked_pgd_defended.json b/docs/scenario_configs/eval1-4/so2sat/so2sat_sar_masked_pgd_defended.json deleted file mode 100644 index d92110525..000000000 --- a/docs/scenario_configs/eval1-4/so2sat/so2sat_sar_masked_pgd_defended.json +++ /dev/null @@ -1,146 +0,0 @@ -{ - "_description": "Baseline so2sat classification", - "adhoc": null, - "attack": { - "generate_kwargs": { - "patch_ratio": 0.05 - }, - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 2.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": "sar" - }, - "module": "armory.scenarios.multimodal_so2sat_scenario", - "name": "So2SatClassification" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/so2sat/so2sat_sar_masked_pgd_undefended.json b/docs/scenario_configs/eval1-4/so2sat/so2sat_sar_masked_pgd_undefended.json deleted file mode 100644 index ccdd98223..000000000 --- a/docs/scenario_configs/eval1-4/so2sat/so2sat_sar_masked_pgd_undefended.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "_description": "Baseline so2sat classification", - "adhoc": null, - "attack": { - "generate_kwargs": { - "patch_ratio": 0.05 - }, - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 2.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": "sar" - }, - "module": "armory.scenarios.multimodal_so2sat_scenario", - "name": "So2SatClassification" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/speaker_id_librispeech/librispeech_baseline_sincnet.json b/docs/scenario_configs/eval1-4/speaker_id_librispeech/librispeech_baseline_sincnet.json deleted file mode 100644 index 730c9b488..000000000 --- a/docs/scenario_configs/eval1-4/speaker_id_librispeech/librispeech_baseline_sincnet.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "_description": "Librispeech_dev_clean raw audio classification, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "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", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "librispeech_dev_clean" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": false, - "fit_kwargs": { - "fit_batch_size": 16, - "nb_epochs": 20000 - }, - "model_kwargs": { - "predict_mode": "all" - }, - "module": "armory.baseline_models.pytorch.sincnet", - "name": "get_art_model", - "weights_file": "sincnet_librispeech_v1.pth", - "wrapper_kwargs": { - "clip_values": [ - -1.0, - 1.0 - ] - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.audio_classification", - "name": "AudioClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "hkakitani/SincNet", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/speaker_id_librispeech/librispeech_baseline_sincnet_snr_pgd.json b/docs/scenario_configs/eval1-4/speaker_id_librispeech/librispeech_baseline_sincnet_snr_pgd.json deleted file mode 100644 index c6c7b32cd..000000000 --- a/docs/scenario_configs/eval1-4/speaker_id_librispeech/librispeech_baseline_sincnet_snr_pgd.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "_description": "Librispeech_dev_clean raw audio classification, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 10, - "eps_step": 0.5, - "max_iter": 10, - "norm": "snr", - "num_random_init": 0, - "targeted": false - }, - "module": "armory.art_experimental.attacks.snr_pgd", - "name": "SNR_PGD", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "librispeech_dev_clean" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": [ - "snr", - "snr_db" - ], - "record_metric_per_sample": true, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": false, - "fit_kwargs": { - "fit_batch_size": 16, - "nb_epochs": 20000 - }, - "model_kwargs": { - "predict_mode": "all" - }, - "module": "armory.baseline_models.pytorch.sincnet", - "name": "get_art_model", - "weights_file": "sincnet_librispeech_v1.pth", - "wrapper_kwargs": { - "clip_values": [ - -1.0, - 1.0 - ] - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.audio_classification", - "name": "AudioClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "hkakitani/SincNet", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/speaker_id_librispeech/librispeech_baseline_sincnet_targeted.json b/docs/scenario_configs/eval1-4/speaker_id_librispeech/librispeech_baseline_sincnet_targeted.json deleted file mode 100644 index e8c1e06c1..000000000 --- a/docs/scenario_configs/eval1-4/speaker_id_librispeech/librispeech_baseline_sincnet_targeted.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "_description": "Librispeech_dev_clean raw audio classification, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 0.2, - "eps_step": 0.1, - "minimal": false, - "num_random_init": 0, - "targeted": true - }, - "module": "art.attacks.evasion", - "name": "FastGradientMethod", - "targeted_labels": { - "kwargs": { - "num_classes": 40 - }, - "module": "armory.utils.labels", - "name": "RoundRobinTargeter" - }, - "use_label": false - }, - "dataset": { - "batch_size": 1, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "librispeech_dev_clean" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": false, - "fit_kwargs": { - "fit_batch_size": 16, - "nb_epochs": 20000 - }, - "model_kwargs": { - "predict_mode": "all" - }, - "module": "armory.baseline_models.pytorch.sincnet", - "name": "get_art_model", - "weights_file": "sincnet_librispeech_v1.pth", - "wrapper_kwargs": { - "clip_values": [ - -1.0, - 1.0 - ] - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.audio_classification", - "name": "AudioClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "hkakitani/SincNet", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/ucf101/ucf101_baseline_finetune.json b/docs/scenario_configs/eval1-4/ucf101/ucf101_baseline_finetune.json deleted file mode 100644 index f0842e389..000000000 --- a/docs/scenario_configs/eval1-4/ucf101/ucf101_baseline_finetune.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_description": "UCF101 video classification with finetuning, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "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", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "framework": "numpy", - "max_frames": 512, - "module": "armory.data.datasets", - "name": "ucf101" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy", - "top_5_categorical_accuracy" - ] - }, - "model": { - "fit": true, - "fit_kwargs": { - "fit_batch_size": 16, - "nb_epochs": 10 - }, - "model_kwargs": { - "model_status": "kinetics_pretrained" - }, - "module": "armory.baseline_models.pytorch.ucf101_mars", - "name": "get_art_model", - "weights_file": "mars_kinetics_v1.pth", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.video_ucf101_scenario", - "name": "Ucf101" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "yusong-tan/MARS", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/ucf101/ucf101_baseline_pretrained_targeted.json b/docs/scenario_configs/eval1-4/ucf101/ucf101_baseline_pretrained_targeted.json deleted file mode 100644 index 3b3fa80b0..000000000 --- a/docs/scenario_configs/eval1-4/ucf101/ucf101_baseline_pretrained_targeted.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "_description": "UCF101 video classification from pretrained, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 0.2, - "eps_step": 0.1, - "minimal": false, - "num_random_init": 0, - "targeted": true - }, - "module": "art.attacks.evasion", - "name": "FastGradientMethod", - "targeted_labels": { - "kwargs": { - "num_classes": 101 - }, - "module": "armory.utils.labels", - "name": "RoundRobinTargeter" - }, - "use_label": false - }, - "dataset": { - "batch_size": 1, - "framework": "numpy", - "max_frames": 512, - "module": "armory.data.datasets", - "name": "ucf101" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy", - "top_5_categorical_accuracy" - ] - }, - "model": { - "fit": false, - "fit_kwargs": { - "nb_epochs": 10 - }, - "model_kwargs": { - "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/armory", - "external_github_repo": "yusong-tan/MARS", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_flicker_defended.json b/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_flicker_defended.json deleted file mode 100644 index d825cfb40..000000000 --- a/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_flicker_defended.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "_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", - "max_frames": 512, - "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": "VideoCompressionNormalizedPyTorch", - "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": { - "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/armory", - "external_github_repo": "yusong-tan/MARS", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_flicker_undefended.json b/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_flicker_undefended.json deleted file mode 100644 index b1ad76f61..000000000 --- a/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_flicker_undefended.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "_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", - "max_frames": 512, - "module": "armory.data.datasets", - "name": "ucf101" - }, - "defense": null, - "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": { - "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/armory", - "external_github_repo": "yusong-tan/MARS", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_frame_saliency_defended.json b/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_frame_saliency_defended.json deleted file mode 100644 index 362b7eb79..000000000 --- a/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_frame_saliency_defended.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "_description": "UCF101 video classification from pretrained, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "frame_index": 1, - "inner_config": { - "kwargs": { - "batch_size": 1, - "eps": 0.015, - "eps_step": 0.001, - "max_iter": 100, - "targeted": false, - "verbose": false - }, - "module": "art.attacks.evasion", - "name": "ProjectedGradientDescent" - }, - "method": "iterative_saliency", - "verbose": false - }, - "module": "armory.art_experimental.attacks.frame", - "name": "get_frame_saliency", - "use_label": true - }, - "dataset": { - "batch_size": 1, - "framework": "numpy", - "max_frames": 512, - "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", - "linf" - ], - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy", - "top_5_categorical_accuracy" - ] - }, - "model": { - "fit": false, - "fit_kwargs": { - "nb_epochs": 10 - }, - "model_kwargs": { - "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/armory", - "external_github_repo": "yusong-tan/MARS", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_frame_saliency_undefended.json b/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_frame_saliency_undefended.json deleted file mode 100644 index 3b7a6408a..000000000 --- a/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_frame_saliency_undefended.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "_description": "UCF101 video classification from pretrained, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "frame_index": 1, - "inner_config": { - "kwargs": { - "batch_size": 1, - "eps": 0.015, - "eps_step": 0.001, - "max_iter": 100, - "targeted": false, - "verbose": false - }, - "module": "art.attacks.evasion", - "name": "ProjectedGradientDescent" - }, - "method": "iterative_saliency", - "verbose": false - }, - "module": "armory.art_experimental.attacks.frame", - "name": "get_frame_saliency", - "use_label": true - }, - "dataset": { - "batch_size": 1, - "framework": "numpy", - "max_frames": 512, - "module": "armory.data.datasets", - "name": "ucf101" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": [ - "l0", - "linf" - ], - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy", - "top_5_categorical_accuracy" - ] - }, - "model": { - "fit": false, - "fit_kwargs": { - "nb_epochs": 10 - }, - "model_kwargs": { - "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/armory", - "external_github_repo": "yusong-tan/MARS", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_masked_pgd_defended.json b/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_masked_pgd_defended.json deleted file mode 100644 index b8a4aba72..000000000 --- a/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_masked_pgd_defended.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "_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", - "max_frames": 512, - "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": { - "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/armory", - "external_github_repo": "yusong-tan/MARS", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_masked_pgd_undefended.json b/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_masked_pgd_undefended.json deleted file mode 100644 index 640ea490c..000000000 --- a/docs/scenario_configs/eval1-4/ucf101/ucf101_pretrained_masked_pgd_undefended.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "_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", - "max_frames": 512, - "module": "armory.data.datasets", - "name": "ucf101" - }, - "defense": null, - "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": { - "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/armory", - "external_github_repo": "yusong-tan/MARS", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/xview/xview_frcnn_masked_pgd_defended.json b/docs/scenario_configs/eval1-4/xview/xview_frcnn_masked_pgd_defended.json deleted file mode 100644 index 1bc944c42..000000000 --- a/docs/scenario_configs/eval1-4/xview/xview_frcnn_masked_pgd_defended.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "_description": "XView object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "generate_kwargs": { - "patch_height": 50, - "patch_width": 50 - }, - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 1.0, - "eps_step": 0.004, - "max_iter": 500, - "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": "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/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/xview/xview_frcnn_masked_pgd_undefended.json b/docs/scenario_configs/eval1-4/xview/xview_frcnn_masked_pgd_undefended.json deleted file mode 100644 index a57643e11..000000000 --- a/docs/scenario_configs/eval1-4/xview/xview_frcnn_masked_pgd_undefended.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "_description": "XView object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "generate_kwargs": { - "patch_height": 50, - "patch_width": 50 - }, - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 1.0, - "eps_step": 0.004, - "max_iter": 500, - "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": "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/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/xview/xview_frcnn_robust_dpatch_defended.json b/docs/scenario_configs/eval1-4/xview/xview_frcnn_robust_dpatch_defended.json deleted file mode 100644 index 9aa3e88c3..000000000 --- a/docs/scenario_configs/eval1-4/xview/xview_frcnn_robust_dpatch_defended.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "_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/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/xview/xview_frcnn_robust_dpatch_undefended.json b/docs/scenario_configs/eval1-4/xview/xview_frcnn_robust_dpatch_undefended.json deleted file mode 100644 index 995767ffc..000000000 --- a/docs/scenario_configs/eval1-4/xview/xview_frcnn_robust_dpatch_undefended.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "_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/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/xview/xview_frcnn_sweep_patch_size.json b/docs/scenario_configs/eval1-4/xview/xview_frcnn_sweep_patch_size.json deleted file mode 100644 index 0efb2768a..000000000 --- a/docs/scenario_configs/eval1-4/xview/xview_frcnn_sweep_patch_size.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "_description": "XView object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "generate_kwargs": { - "xmin": 0, - "ymin": 0 - }, - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 1.0, - "eps_step": 0.01, - "max_iter": 100, - "num_random_init": 0, - "random_eps": false, - "targeted": true, - "verbose": true - }, - "module": "armory.art_experimental.attacks.pgd_patch", - "name": "PGDPatch", - "sweep_params": { - "generate_kwargs": { - "patch_height": [ - 10, - 20, - 30, - 40, - 50, - 60, - 70, - 80, - 90, - 100, - 110 - ], - "patch_width": [ - 10, - 20, - 30, - 40, - 50, - 60, - 70, - 80, - 90, - 100, - 110 - ] - }, - "kwargs": {}, - "metric": { - "module": "armory.metrics.task", - "name": "object_detection_mAP", - "threshold": 0.1 - } - }, - "targeted_labels": { - "kwargs": { - "value": 2 - }, - "module": "armory.utils.labels", - "name": "ObjectDetectionFixedLabelTargeter" - }, - "type": "sweep", - "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": true, - "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/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval1-4/xview/xview_frcnn_targeted.json b/docs/scenario_configs/eval1-4/xview/xview_frcnn_targeted.json deleted file mode 100644 index 548649dbb..000000000 --- a/docs/scenario_configs/eval1-4/xview/xview_frcnn_targeted.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "_description": "XView object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "generate_kwargs": { - "patch_height": 50, - "patch_width": 50, - "xmin": 0, - "ymin": 0 - }, - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 1.0, - "eps_step": 0.01, - "max_iter": 200, - "num_random_init": 0, - "random_eps": false, - "targeted": true, - "verbose": true - }, - "module": "armory.art_experimental.attacks.pgd_patch", - "name": "PGDPatch", - "targeted_labels": { - "kwargs": { - "value": 2 - }, - "module": "armory.utils.labels", - "name": "ObjectDetectionFixedLabelTargeter" - }, - "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/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/asr_librispeech/defended_entailment.json b/docs/scenario_configs/eval5/asr_librispeech/defended_entailment.json deleted file mode 100644 index 5727d7654..000000000 --- a/docs/scenario_configs/eval5/asr_librispeech/defended_entailment.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", - "adhoc": { - "skip_adversarial": false - }, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 20, - "eps_step": 0.05, - "max_iter": 500, - "norm": "snr", - "num_random_init": 0, - "targeted": true - }, - "module": "armory.art_experimental.attacks.snr_pgd", - "name": "SNR_PGD_Numpy", - "targeted": true, - "targeted_labels": { - "kwargs": { - "dtype": "str", - "import_from": "armory.attacks.librispeech_target_labels", - "values": "entailment_100" - }, - "module": "armory.utils.labels", - "name": "ManualTargeter" - }, - "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": [ - "entailment", - "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", - "external_github_repo": [ - "SeanNaren/deepspeech.pytorch@V3.0" - ], - "gpus": "all", - "local_repo_path": null, - "num_eval_batches": 100, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/asr_librispeech/defended_targeted_snr_pgd.json b/docs/scenario_configs/eval5/asr_librispeech/defended_targeted_snr_pgd.json deleted file mode 100644 index c9ff3fdb2..000000000 --- a/docs/scenario_configs/eval5/asr_librispeech/defended_targeted_snr_pgd.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", - "adhoc": { - "skip_adversarial": false - }, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 20, - "eps_step": 0.5, - "max_iter": 500, - "norm": "snr", - "num_random_init": 0, - "targeted": true - }, - "module": "armory.art_experimental.attacks.snr_pgd", - "name": "SNR_PGD_Numpy", - "targeted": true, - "targeted_labels": { - "kwargs": { - "import_from": "armory.attacks.librispeech_target_labels", - "transcripts": "matched_length" - }, - "module": "armory.utils.labels", - "name": "MatchedTranscriptLengthTargeter" - }, - "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": "linf", - "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", - "external_github_repo": "SeanNaren/deepspeech.pytorch@V3.0", - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/asr_librispeech/defended_untargeted_snr_pgd.json b/docs/scenario_configs/eval5/asr_librispeech/defended_untargeted_snr_pgd.json deleted file mode 100644 index 4c128b261..000000000 --- a/docs/scenario_configs/eval5/asr_librispeech/defended_untargeted_snr_pgd.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", - "adhoc": { - "skip_adversarial": false - }, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 20, - "eps_step": 0.5, - "max_iter": 500, - "norm": "snr", - "num_random_init": 0, - "targeted": false - }, - "module": "armory.art_experimental.attacks.snr_pgd", - "name": "SNR_PGD_Numpy", - "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": "linf", - "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", - "external_github_repo": "SeanNaren/deepspeech.pytorch@V3.0", - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/asr_librispeech/entailment.json b/docs/scenario_configs/eval5/asr_librispeech/entailment.json deleted file mode 100644 index 21f5ff3e1..000000000 --- a/docs/scenario_configs/eval5/asr_librispeech/entailment.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", - "adhoc": { - "skip_adversarial": false - }, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 20, - "eps_step": 0.05, - "max_iter": 500, - "norm": "snr", - "num_random_init": 0, - "targeted": true - }, - "module": "armory.art_experimental.attacks.snr_pgd", - "name": "SNR_PGD_Numpy", - "targeted": true, - "targeted_labels": { - "kwargs": { - "dtype": "str", - "import_from": "armory.attacks.librispeech_target_labels", - "values": "entailment_100" - }, - "module": "armory.utils.labels", - "name": "ManualTargeter" - }, - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "test_clean", - "framework": "numpy", - "module": "armory.data.datasets", - "name": "librispeech", - "train_split": "train_clean100" - }, - "defense": null, - "metric": { - "means": false, - "perturbation": "snr_db", - "record_metric_per_sample": true, - "task": [ - "entailment", - "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", - "external_github_repo": [ - "SeanNaren/deepspeech.pytorch@V3.0" - ], - "gpus": "all", - "local_repo_path": null, - "num_eval_batches": 100, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/asr_librispeech/targeted_snr_pgd.json b/docs/scenario_configs/eval5/asr_librispeech/targeted_snr_pgd.json deleted file mode 100644 index f650a46eb..000000000 --- a/docs/scenario_configs/eval5/asr_librispeech/targeted_snr_pgd.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", - "adhoc": { - "skip_adversarial": false - }, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 20, - "eps_step": 0.5, - "max_iter": 500, - "norm": "snr", - "num_random_init": 0, - "targeted": true - }, - "module": "armory.art_experimental.attacks.snr_pgd", - "name": "SNR_PGD_Numpy", - "targeted": true, - "targeted_labels": { - "kwargs": { - "import_from": "armory.attacks.librispeech_target_labels", - "transcripts": "matched_length" - }, - "module": "armory.utils.labels", - "name": "MatchedTranscriptLengthTargeter" - }, - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "test_clean", - "framework": "numpy", - "module": "armory.data.datasets", - "name": "librispeech", - "train_split": "train_clean100" - }, - "defense": null, - "metric": { - "means": false, - "perturbation": "linf", - "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", - "external_github_repo": "SeanNaren/deepspeech.pytorch@V3.0", - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/asr_librispeech/untargeted_snr_pgd.json b/docs/scenario_configs/eval5/asr_librispeech/untargeted_snr_pgd.json deleted file mode 100644 index 58a8c1af8..000000000 --- a/docs/scenario_configs/eval5/asr_librispeech/untargeted_snr_pgd.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", - "adhoc": { - "skip_adversarial": false - }, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 20, - "eps_step": 0.5, - "max_iter": 500, - "norm": "snr", - "num_random_init": 0, - "targeted": false - }, - "module": "armory.art_experimental.attacks.snr_pgd", - "name": "SNR_PGD_Numpy", - "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": null, - "metric": { - "means": false, - "perturbation": "linf", - "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", - "external_github_repo": "SeanNaren/deepspeech.pytorch@V3.0", - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_adversarialpatch_undefended.json b/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_adversarialpatch_undefended.json deleted file mode 100644 index f979ed301..000000000 --- a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_adversarialpatch_undefended.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "_description": "CARLA single modality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "learning_rate": 0.003, - "max_iter": 1000, - "optimizer": "pgd", - "targeted": false, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_adversarial_patch", - "name": "CARLAAdversarialPatchPyTorch", - "use_label": true - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "rgb", - "module": "armory.data.adversarial_datasets", - "name": "carla_obj_det_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 4 - }, - "module": "armory.baseline_models.pytorch.carla_single_modality_object_detection_frcnn", - "name": "get_art_model", - "weights_file": "carla_rgb_weights_eval5.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_dpatch_defended.json b/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_dpatch_defended.json deleted file mode 100644 index e357819e4..000000000 --- a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_dpatch_defended.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "_description": "CARLA single modality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "learning_rate": 0.002, - "max_iter": 2000, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_patch", - "name": "CARLADapricotPatch", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "rgb", - "module": "armory.data.adversarial_datasets", - "name": "carla_obj_det_dev" - }, - "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": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 4 - }, - "module": "armory.baseline_models.pytorch.carla_single_modality_object_detection_frcnn", - "name": "get_art_model", - "weights_file": "carla_rgb_weights_eval5.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "colour-science/colour@v0.3.16", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_dpatch_undefended.json b/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_dpatch_undefended.json deleted file mode 100644 index 69edd6dc5..000000000 --- a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_dpatch_undefended.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "_description": "CARLA single modality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "learning_rate": 0.002, - "max_iter": 2000, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_patch", - "name": "CARLADapricotPatch", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "rgb", - "module": "armory.data.adversarial_datasets", - "name": "carla_obj_det_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 4 - }, - "module": "armory.baseline_models.pytorch.carla_single_modality_object_detection_frcnn", - "name": "get_art_model", - "weights_file": "carla_rgb_weights_eval5.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "colour-science/colour@v0.3.16", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_multimodal_adversarialpatch_defended.json b/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_multimodal_adversarialpatch_defended.json deleted file mode 100644 index 22677a106..000000000 --- a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_multimodal_adversarialpatch_defended.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "_description": "CARLA multimodality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "depth_delta_meters": 3, - "learning_rate": 0.003, - "learning_rate_depth": 0.0001, - "max_iter": 1000, - "optimizer": "pgd", - "targeted": false, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_adversarial_patch", - "name": "CARLAAdversarialPatchPyTorch", - "use_label": true - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "both", - "module": "armory.data.adversarial_datasets", - "name": "carla_obj_det_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 4 - }, - "module": "armory.baseline_models.pytorch.carla_multimodality_object_detection_frcnn_robust_fusion", - "name": "get_art_model_mm_robust", - "weights_file": "carla_multimodal_robust_weights_eval5.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_multimodal_adversarialpatch_undefended.json b/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_multimodal_adversarialpatch_undefended.json deleted file mode 100644 index 14da4a6a6..000000000 --- a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_multimodal_adversarialpatch_undefended.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "_description": "CARLA multimodality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "depth_delta_meters": 3, - "learning_rate": 0.003, - "learning_rate_depth": 0.0001, - "max_iter": 1000, - "optimizer": "pgd", - "targeted": false, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_adversarial_patch", - "name": "CARLAAdversarialPatchPyTorch", - "use_label": true - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "both", - "module": "armory.data.adversarial_datasets", - "name": "carla_obj_det_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 4 - }, - "module": "armory.baseline_models.pytorch.carla_multimodality_object_detection_frcnn", - "name": "get_art_model_mm", - "weights_file": "carla_multimodal_naive_weights_eval5.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_multimodal_dpatch_defended.json b/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_multimodal_dpatch_defended.json deleted file mode 100644 index 67bff76ba..000000000 --- a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_multimodal_dpatch_defended.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "_description": "CARLA multimodality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "depth_delta_meters": 3, - "learning_rate": 0.002, - "learning_rate_depth": 0.0001, - "max_iter": 2000, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_patch", - "name": "CARLADapricotPatch", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "both", - "module": "armory.data.adversarial_datasets", - "name": "carla_obj_det_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 4 - }, - "module": "armory.baseline_models.pytorch.carla_multimodality_object_detection_frcnn_robust_fusion", - "name": "get_art_model_mm_robust", - "weights_file": "carla_multimodal_robust_weights_eval5.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "colour-science/colour@v0.3.16", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_multimodal_dpatch_undefended.json b/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_multimodal_dpatch_undefended.json deleted file mode 100644 index b855c7675..000000000 --- a/docs/scenario_configs/eval5/carla_object_detection/carla_obj_det_multimodal_dpatch_undefended.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "_description": "CARLA multimodality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "depth_delta_meters": 3, - "learning_rate": 0.002, - "learning_rate_depth": 0.0001, - "max_iter": 2000, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_patch", - "name": "CARLADapricotPatch", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "both", - "module": "armory.data.adversarial_datasets", - "name": "carla_obj_det_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 4 - }, - "module": "armory.baseline_models.pytorch.carla_multimodality_object_detection_frcnn", - "name": "get_art_model_mm", - "weights_file": "carla_multimodal_naive_weights_eval5.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "colour-science/colour@v0.3.16", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/carla_video_tracking/carla_video_tracking_goturn_advtextures_defended.json b/docs/scenario_configs/eval5/carla_video_tracking/carla_video_tracking_goturn_advtextures_defended.json deleted file mode 100644 index c4f56479f..000000000 --- a/docs/scenario_configs/eval5/carla_video_tracking/carla_video_tracking_goturn_advtextures_defended.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "_description": "CARLA video tracking, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "max_iter": 100, - "step_size": 0.02, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_adversarial_texture", - "name": "AdversarialPhysicalTexture", - "use_label": true - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "module": "armory.data.adversarial_datasets", - "name": "carla_video_tracking_dev" - }, - "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": "VideoCompressionNormalizedPyTorch", - "type": "Preprocessor" - }, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "video_tracking_mean_iou", - "video_tracking_mean_success_rate" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.carla_goturn", - "name": "get_art_model", - "weights_file": "pytorch_goturn.pth.tar", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_video_tracking", - "name": "CarlaVideoTracking" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "amoudgl/pygoturn", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/carla_video_tracking/carla_video_tracking_goturn_advtextures_undefended.json b/docs/scenario_configs/eval5/carla_video_tracking/carla_video_tracking_goturn_advtextures_undefended.json deleted file mode 100644 index 3dd6dc8a0..000000000 --- a/docs/scenario_configs/eval5/carla_video_tracking/carla_video_tracking_goturn_advtextures_undefended.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "_description": "CARLA video tracking, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "max_iter": 100, - "step_size": 0.02, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_adversarial_texture", - "name": "AdversarialPhysicalTexture", - "use_label": true - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "module": "armory.data.adversarial_datasets", - "name": "carla_video_tracking_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "video_tracking_mean_iou", - "video_tracking_mean_success_rate" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.carla_goturn", - "name": "get_art_model", - "weights_file": "pytorch_goturn.pth.tar", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_video_tracking", - "name": "CarlaVideoTracking" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "amoudgl/pygoturn", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_activation_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_activation_defense.json deleted file mode 100644 index a50a7a395..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_activation_defense.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "_description": "CIFAR10 dirty label backdoor, watermark trigger, activation defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 2, - "train_epochs": 200, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "copyright.png", - "base_img_size_x": 32, - "base_img_size_y": 32, - "blend": 0.18, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 32, - 32 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_perfect_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_perfect_filter.json deleted file mode 100644 index 443cbf4dc..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_perfect_filter.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "_description": "CIFAR10 dirty label backdoor, watermark trigger, perfect filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 2, - "train_epochs": 200, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "copyright.png", - "base_img_size_x": 32, - "base_img_size_y": 32, - "blend": 0.18, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 32, - 32 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "perfect_filter": true - }, - "module": "null", - "name": "null", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_random_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_random_filter.json deleted file mode 100644 index ce5bd993b..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_random_filter.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "_description": "CIFAR10 dirty label backdoor, watermark trigger, random filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fit_defense_classifier_outside_defense": false, - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 2, - "train_epochs": 200, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "copyright.png", - "base_img_size_x": 32, - "base_img_size_y": 32, - "blend": 0.18, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 32, - 32 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "armory.art_experimental.poison_detection.random_filter", - "name": "RandomFilterBaselineDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_spectral_signature_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_spectral_signature_defense.json deleted file mode 100644 index f25b25c27..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_spectral_signature_defense.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "_description": "CIFAR10 dirty label backdoor, watermark trigger, spectral signature defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 2, - "train_epochs": 200, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "copyright.png", - "base_img_size_x": 32, - "base_img_size_y": 32, - "blend": 0.18, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 32, - 32 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "art.defences.detector.poison.spectral_signature_defense", - "name": "SpectralSignatureDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_undefended.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_undefended.json deleted file mode 100644 index 7f578aaab..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/copyright/cifar10_dlbd_copyright_undefended.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "_description": "CIFAR10 dirty label backdoor, watermark trigger, undefended", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 2, - "train_epochs": 200, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "copyright.png", - "base_img_size_x": 32, - "base_img_size_y": 32, - "blend": 0.18, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 32, - 32 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_activation_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_activation_defense.json deleted file mode 100644 index fdb2d38e8..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_activation_defense.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "_description": "CIFAR10 dirty label backdoor, watermark trigger, activation defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 2, - "train_epochs": 200, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "watermarking.png", - "base_img_size_x": 32, - "base_img_size_y": 32, - "blend": 1.0, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 32, - 32 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_perfect_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_perfect_filter.json deleted file mode 100644 index ed6e53fa4..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_perfect_filter.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "_description": "CIFAR10 dirty label backdoor, watermark trigger, perfect filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 2, - "train_epochs": 200, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "watermarking.png", - "base_img_size_x": 32, - "base_img_size_y": 32, - "blend": 1.0, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 32, - 32 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "perfect_filter": true - }, - "module": "null", - "name": "null", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_random_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_random_filter.json deleted file mode 100644 index 3bcff8ede..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_random_filter.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "_description": "CIFAR10 dirty label backdoor, watermark trigger, random filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fit_defense_classifier_outside_defense": false, - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 2, - "train_epochs": 200, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "watermarking.png", - "base_img_size_x": 32, - "base_img_size_y": 32, - "blend": 1.0, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 32, - 32 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "armory.art_experimental.poison_detection.random_filter", - "name": "RandomFilterBaselineDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_spectral_signature_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_spectral_signature_defense.json deleted file mode 100644 index 509b42419..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_spectral_signature_defense.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "_description": "CIFAR10 dirty label backdoor, watermark trigger, spectral signature defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 2, - "train_epochs": 200, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "watermarking.png", - "base_img_size_x": 32, - "base_img_size_y": 32, - "blend": 1.0, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 32, - 32 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "art.defences.detector.poison.spectral_signature_defense", - "name": "SpectralSignatureDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_undefended.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_undefended.json deleted file mode 100644 index 925e51188..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/dlbd/watermark/cifar10_dlbd_watermark_undefended.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "_description": "CIFAR10 dirty label backdoor, watermark trigger, undefended", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 2, - "train_epochs": 200, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "watermarking.png", - "base_img_size_x": 32, - "base_img_size_y": 32, - "blend": 1.0, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 32, - 32 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_activation_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_activation_defense.json deleted file mode 100644 index 334ea571f..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_activation_defense.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, witches' brew attack, activation defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9 - ], - "split_id": 0, - "target_class": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 0 - ], - "train_epochs": 100, - "trigger_index": null, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 750, - "data_filepath": null, - "epsilon": 0.125, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 94, - 156, - 219, - 250, - 350 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "verbose": 1 - }, - "module": "armory.art_experimental.attacks.gradient_matching", - "name": "GradientMatchingWrapper" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_witches_brew", - "name": "WitchesBrewScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_perfect_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_perfect_filter.json deleted file mode 100644 index ac8245dd6..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_perfect_filter.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, witches' brew attack, perfect filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9 - ], - "split_id": 0, - "target_class": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 0 - ], - "train_epochs": 100, - "trigger_index": null, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 750, - "data_filepath": null, - "epsilon": 0.125, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 94, - 156, - 219, - 250, - 350 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "verbose": 1 - }, - "module": "armory.art_experimental.attacks.gradient_matching", - "name": "GradientMatchingWrapper" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "perfect_filter": true - }, - "module": "null", - "name": "null", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_witches_brew", - "name": "WitchesBrewScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_random_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_random_filter.json deleted file mode 100644 index b7cc9fcca..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_random_filter.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, witches' brew attack, random filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fit_defense_classifier_outside_defense": false, - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9 - ], - "split_id": 0, - "target_class": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 0 - ], - "train_epochs": 100, - "trigger_index": null, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 750, - "data_filepath": null, - "epsilon": 0.125, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 94, - 156, - 219, - 250, - 350 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "verbose": 1 - }, - "module": "armory.art_experimental.attacks.gradient_matching", - "name": "GradientMatchingWrapper" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "armory.art_experimental.poison_detection.random_filter", - "name": "RandomFilterBaselineDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_witches_brew", - "name": "WitchesBrewScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_spectral_signature_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_spectral_signature_defense.json deleted file mode 100644 index c3b2f4908..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_spectral_signature_defense.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, witches' brew attack, spectral signature defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9 - ], - "split_id": 0, - "target_class": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 0 - ], - "train_epochs": 100, - "trigger_index": null, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 750, - "data_filepath": null, - "epsilon": 0.125, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 94, - 156, - 219, - 250, - 350 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "verbose": 1 - }, - "module": "armory.art_experimental.attacks.gradient_matching", - "name": "GradientMatchingWrapper" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "art.defences.detector.poison.spectral_signature_defense", - "name": "SpectralSignatureDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_witches_brew", - "name": "WitchesBrewScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_undefended.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_undefended.json deleted file mode 100644 index cacd8e609..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/cifar10/witches_brew/cifar10_witches_brew_undefended.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, witches' brew attack, undefended", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9 - ], - "split_id": 0, - "target_class": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 0 - ], - "train_epochs": 100, - "trigger_index": null, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 750, - "data_filepath": null, - "epsilon": 0.125, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 94, - 156, - 219, - 250, - 350 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "verbose": 1 - }, - "module": "armory.art_experimental.attacks.gradient_matching", - "name": "GradientMatchingWrapper" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_witches_brew", - "name": "WitchesBrewScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_activation_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_activation_defense.json deleted file mode 100644 index e9767799e..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_activation_defense.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "_description": "GTSRB clean label backdoor, bullet holes trigger, activation defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "white", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "bullet_holes.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "eps": 0.03, - "eps_step": 0.001, - "max_iter": 100, - "n_classes": 43, - "norm": "inf", - "num_random_init": 0, - "pp_poison": 0.2, - "target": 2 - }, - "module": "armory.art_experimental.attacks.poison_loader_clbd", - "name": "poison_loader_clbd", - "type": "clbd", - "use_adversarial_trainer": false - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poisoning_clbd", - "name": "Poison_CLBD" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_perfect_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_perfect_filter.json deleted file mode 100644 index e5ef2ce72..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_perfect_filter.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "_description": "GTSRB clean label backdoor, bullet holes trigger, perfect filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "white", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "bullet_holes.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "eps": 0.03, - "eps_step": 0.001, - "max_iter": 100, - "n_classes": 43, - "norm": "inf", - "num_random_init": 0, - "pp_poison": 0.2, - "target": 2 - }, - "module": "armory.art_experimental.attacks.poison_loader_clbd", - "name": "poison_loader_clbd", - "type": "clbd", - "use_adversarial_trainer": false - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "perfect_filter": true - }, - "module": "null", - "name": "null", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poisoning_clbd", - "name": "Poison_CLBD" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_random_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_random_filter.json deleted file mode 100644 index 42a999aae..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_random_filter.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "_description": "GTSRB clean label backdoor, bullet holes trigger, random filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fit_defense_classifier_outside_defense": false, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "white", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "bullet_holes.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "eps": 0.03, - "eps_step": 0.001, - "max_iter": 100, - "n_classes": 43, - "norm": "inf", - "num_random_init": 0, - "pp_poison": 0.2, - "target": 2 - }, - "module": "armory.art_experimental.attacks.poison_loader_clbd", - "name": "poison_loader_clbd", - "type": "clbd", - "use_adversarial_trainer": false - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "armory.art_experimental.poison_detection.random_filter", - "name": "RandomFilterBaselineDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poisoning_clbd", - "name": "Poison_CLBD" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_spectral_signature_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_spectral_signature_defense.json deleted file mode 100644 index 9d7cc98f7..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_spectral_signature_defense.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "_description": "GTSRB clean label backdoor, bullet holes trigger, spectral signature defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "white", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "bullet_holes.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "eps": 0.03, - "eps_step": 0.001, - "max_iter": 100, - "n_classes": 43, - "norm": "inf", - "num_random_init": 0, - "pp_poison": 0.2, - "target": 2 - }, - "module": "armory.art_experimental.attacks.poison_loader_clbd", - "name": "poison_loader_clbd", - "type": "clbd", - "use_adversarial_trainer": false - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "art.defences.detector.poison.spectral_signature_defense", - "name": "SpectralSignatureDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poisoning_clbd", - "name": "Poison_CLBD" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_undefended.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_undefended.json deleted file mode 100644 index 4c5fea615..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/bullet_holes/gtsrb_clbd_bullet_holes_undefended.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "_description": "GTSRB clean label backdoor, bullet holes trigger, undefended", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "white", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "bullet_holes.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "eps": 0.03, - "eps_step": 0.001, - "max_iter": 100, - "n_classes": 43, - "norm": "inf", - "num_random_init": 0, - "pp_poison": 0.2, - "target": 2 - }, - "module": "armory.art_experimental.attacks.poison_loader_clbd", - "name": "poison_loader_clbd", - "type": "clbd", - "use_adversarial_trainer": false - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poisoning_clbd", - "name": "Poison_CLBD" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_activation_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_activation_defense.json deleted file mode 100644 index f22a3a5d1..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_activation_defense.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "_description": "GTSRB clean label backdoor, peace sign trigger, activation defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "white", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "peace.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "eps": 0.03, - "eps_step": 0.001, - "max_iter": 100, - "n_classes": 43, - "norm": "inf", - "num_random_init": 0, - "pp_poison": 0.2, - "target": 2 - }, - "module": "armory.art_experimental.attacks.poison_loader_clbd", - "name": "poison_loader_clbd", - "type": "clbd", - "use_adversarial_trainer": false - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poisoning_clbd", - "name": "Poison_CLBD" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_perfect_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_perfect_filter.json deleted file mode 100644 index f250e8f33..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_perfect_filter.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "_description": "GTSRB clean label backdoor, peace sign trigger, perfect filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "white", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "peace.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "eps": 0.03, - "eps_step": 0.001, - "max_iter": 100, - "n_classes": 43, - "norm": "inf", - "num_random_init": 0, - "pp_poison": 0.2, - "target": 2 - }, - "module": "armory.art_experimental.attacks.poison_loader_clbd", - "name": "poison_loader_clbd", - "type": "clbd", - "use_adversarial_trainer": false - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "perfect_filter": true - }, - "module": "null", - "name": "null", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poisoning_clbd", - "name": "Poison_CLBD" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_random_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_random_filter.json deleted file mode 100644 index 3f7b91029..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_random_filter.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "_description": "GTSRB clean label backdoor, peace sign trigger, random filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fit_defense_classifier_outside_defense": false, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "white", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "peace.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "eps": 0.03, - "eps_step": 0.001, - "max_iter": 100, - "n_classes": 43, - "norm": "inf", - "num_random_init": 0, - "pp_poison": 0.2, - "target": 2 - }, - "module": "armory.art_experimental.attacks.poison_loader_clbd", - "name": "poison_loader_clbd", - "type": "clbd", - "use_adversarial_trainer": false - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "armory.art_experimental.poison_detection.random_filter", - "name": "RandomFilterBaselineDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poisoning_clbd", - "name": "Poison_CLBD" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_spectral_signature_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_spectral_signature_defense.json deleted file mode 100644 index 7e408ffe2..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_spectral_signature_defense.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "_description": "GTSRB clean label backdoor, peace sign trigger, spectral signature defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "white", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "peace.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "eps": 0.03, - "eps_step": 0.001, - "max_iter": 100, - "n_classes": 43, - "norm": "inf", - "num_random_init": 0, - "pp_poison": 0.2, - "target": 2 - }, - "module": "armory.art_experimental.attacks.poison_loader_clbd", - "name": "poison_loader_clbd", - "type": "clbd", - "use_adversarial_trainer": false - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "art.defences.detector.poison.spectral_signature_defense", - "name": "SpectralSignatureDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poisoning_clbd", - "name": "Poison_CLBD" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_undefended.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_undefended.json deleted file mode 100644 index 43f291367..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/clbd/peace_sign/gtsrb_clbd_peace_sign_undefended.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "_description": "GTSRB clean label backdoor, peace sign trigger, undefended", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "white", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "peace.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "eps": 0.03, - "eps_step": 0.001, - "max_iter": 100, - "n_classes": 43, - "norm": "inf", - "num_random_init": 0, - "pp_poison": 0.2, - "target": 2 - }, - "module": "armory.art_experimental.attacks.poison_loader_clbd", - "name": "poison_loader_clbd", - "type": "clbd", - "use_adversarial_trainer": false - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poisoning_clbd", - "name": "Poison_CLBD" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_activation_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_activation_defense.json deleted file mode 100644 index f121d0cdf..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_activation_defense.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "_description": "GTSRB dirty label backdoor, bullet holes trigger, activation defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "bullet_holes.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_perfect_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_perfect_filter.json deleted file mode 100644 index c11204312..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_perfect_filter.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "_description": "GTSRB dirty label backdoor, bullet holes trigger, perfect filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "bullet_holes.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "perfect_filter": true - }, - "module": "null", - "name": "null", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_random_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_random_filter.json deleted file mode 100644 index 8d8db0c6b..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_random_filter.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "_description": "GTSRB dirty label backdoor, bullet holes trigger, random filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fit_defense_classifier_outside_defense": false, - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "bullet_holes.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "armory.art_experimental.poison_detection.random_filter", - "name": "RandomFilterBaselineDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_spectral_signature_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_spectral_signature_defense.json deleted file mode 100644 index 1c9ca11ea..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_spectral_signature_defense.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "_description": "GTSRB dirty label backdoor, bullet holes trigger, spectral signature defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "bullet_holes.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "art.defences.detector.poison.spectral_signature_defense", - "name": "SpectralSignatureDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_undefended.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_undefended.json deleted file mode 100644 index a0b6b8bc2..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/bullet_holes/gtsrb_dlbd_bullet_holes_undefended.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "_description": "GTSRB dirty label backdoor, bullet holes trigger, undefended", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "bullet_holes.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_activation_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_activation_defense.json deleted file mode 100644 index cc72f0107..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_activation_defense.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "_description": "GTSRB dirty label backdoor, peace sign trigger, activation defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "peace.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_perfect_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_perfect_filter.json deleted file mode 100644 index d7771c848..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_perfect_filter.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "_description": "GTSRB dirty label backdoor, peace sign trigger, perfect filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "peace.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "perfect_filter": true - }, - "module": "null", - "name": "null", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_random_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_random_filter.json deleted file mode 100644 index 64738770e..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_random_filter.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "_description": "GTSRB dirty label backdoor, peace sign trigger, random filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fit_defense_classifier_outside_defense": false, - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "peace.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "armory.art_experimental.poison_detection.random_filter", - "name": "RandomFilterBaselineDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_spectral_signature_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_spectral_signature_defense.json deleted file mode 100644 index d0a6e77f2..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_spectral_signature_defense.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "_description": "GTSRB dirty label backdoor, peace sign trigger, spectral signature defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "peace.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "art.defences.detector.poison.spectral_signature_defense", - "name": "SpectralSignatureDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_undefended.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_undefended.json deleted file mode 100644 index 4c1436ba5..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/dlbd/peace_sign/gtsrb_dlbd_peace_sign_undefended.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "_description": "GTSRB dirty label backdoor, peace sign trigger, undefended", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "peace.png", - "blend": 0.6, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 16, - 16 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_activation_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_activation_defense.json deleted file mode 100644 index fdd93c243..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_activation_defense.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "_description": "GTSRB poison image classification, witches' brew attack, activation defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.01, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "trigger_index": null, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "data_filepath": "gtsrb_gradient_matching_precomputed.npz", - "epsilon": 0.1, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "verbose": 1 - }, - "module": "armory.art_experimental.attacks.gradient_matching", - "name": "GradientMatchingWrapper" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_witches_brew", - "name": "WitchesBrewScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_perfect_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_perfect_filter.json deleted file mode 100644 index 964293649..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_perfect_filter.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "_description": "GTSRB poison image classification, witches' brew attack, perfect filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.01, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "trigger_index": null, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "data_filepath": "gtsrb_gradient_matching_precomputed.npz", - "epsilon": 0.1, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "verbose": 1 - }, - "module": "armory.art_experimental.attacks.gradient_matching", - "name": "GradientMatchingWrapper" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "perfect_filter": true - }, - "module": "null", - "name": "null", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_witches_brew", - "name": "WitchesBrewScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_random_filter.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_random_filter.json deleted file mode 100644 index bc0971933..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_random_filter.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "_description": "GTSRB poison image classification, witches' brew attack, random filter", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fit_defense_classifier_outside_defense": false, - "fraction_poisoned": 0.01, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "trigger_index": null, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "data_filepath": "gtsrb_gradient_matching_precomputed.npz", - "epsilon": 0.1, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "verbose": 1 - }, - "module": "armory.art_experimental.attacks.gradient_matching", - "name": "GradientMatchingWrapper" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "armory.art_experimental.poison_detection.random_filter", - "name": "RandomFilterBaselineDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_witches_brew", - "name": "WitchesBrewScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_spectral_signature_defense.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_spectral_signature_defense.json deleted file mode 100644 index 367428039..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_spectral_signature_defense.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "_description": "GTSRB poison image classification, witches' brew attack, spectral signature defense", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.01, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "trigger_index": null, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "data_filepath": "gtsrb_gradient_matching_precomputed.npz", - "epsilon": 0.1, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "verbose": 1 - }, - "module": "armory.art_experimental.attacks.gradient_matching", - "name": "GradientMatchingWrapper" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "art.defences.detector.poison.spectral_signature_defense", - "name": "SpectralSignatureDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_witches_brew", - "name": "WitchesBrewScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_undefended.json b/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_undefended.json deleted file mode 100644 index 027a85fa6..000000000 --- a/docs/scenario_configs/eval5/poisoning/baseline_defenses/gtsrb/witches_brew/gtsrb_witches_brew_undefended.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "_description": "GTSRB poison image classification, witches' brew attack, undefended", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.01, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "trigger_index": null, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "data_filepath": "gtsrb_gradient_matching_precomputed.npz", - "epsilon": 0.1, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "verbose": 1 - }, - "module": "armory.art_experimental.attacks.gradient_matching", - "name": "GradientMatchingWrapper" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_witches_brew", - "name": "WitchesBrewScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/cifar10_poison_dlbd.json b/docs/scenario_configs/eval5/poisoning/cifar10_poison_dlbd.json deleted file mode 100644 index c0ade563c..000000000 --- a/docs/scenario_configs/eval5/poisoning/cifar10_poison_dlbd.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "_description": "CIFAR10 DLBD poison image classification", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 2, - "train_epochs": 200, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_path": "watermarking.png", - "base_img_size_x": 32, - "base_img_size_y": 32, - "blend": 1.0, - "channels_first": false, - "mode": "RGB", - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "image", - "size": [ - 32, - 32 - ] - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/cifar10_witches_brew.json b/docs/scenario_configs/eval5/poisoning/cifar10_witches_brew.json deleted file mode 100644 index ab4e7cd09..000000000 --- a/docs/scenario_configs/eval5/poisoning/cifar10_witches_brew.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, witches' brew attack", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9 - ], - "split_id": 0, - "target_class": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 0 - ], - "train_epochs": 100, - "trigger_index": null, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 750, - "data_filepath": null, - "epsilon": 0.125, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 94, - 156, - 219, - 250, - 350 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "verbose": 1 - }, - "module": "armory.art_experimental.attacks.gradient_matching", - "name": "GradientMatchingWrapper" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.001, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_witches_brew", - "name": "WitchesBrewScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/gtsrb_dlbd_baseline_keras.json b/docs/scenario_configs/eval5/poisoning/gtsrb_dlbd_baseline_keras.json deleted file mode 100644 index c7720d8d8..000000000 --- a/docs/scenario_configs/eval5/poisoning/gtsrb_dlbd_baseline_keras.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_description": "GTSRB poison image classification, contributed by MITRE Corporation", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "pattern" - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/gtsrb_dlbd_baseline_pytorch.json b/docs/scenario_configs/eval5/poisoning/gtsrb_dlbd_baseline_pytorch.json deleted file mode 100644 index e37b2f619..000000000 --- a/docs/scenario_configs/eval5/poisoning/gtsrb_dlbd_baseline_pytorch.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_description": "GTSRB poison image classification, contributed by MITRE Corporation", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "poison_module": "art.attacks.poisoning.perturbations", - "poison_type": "pattern" - }, - "module": "armory.art_experimental.attacks.poison_loader_dlbd", - "name": "poison_loader_dlbd" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval5/poisoning/gtsrb_witches_brew.json b/docs/scenario_configs/eval5/poisoning/gtsrb_witches_brew.json deleted file mode 100644 index efd02102a..000000000 --- a/docs/scenario_configs/eval5/poisoning/gtsrb_witches_brew.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "_description": "GTSRB poison image classification, witches' brew attack", - "adhoc": { - "compute_fairness_metrics": true, - "experiment_id": 0, - "explanatory_model": "gtsrb_explanatory_model", - "fraction_poisoned": 0.01, - "poison_dataset": true, - "source_class": 1, - "split_id": 0, - "target_class": 2, - "train_epochs": 30, - "trigger_index": null, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "data_filepath": "gtsrb_gradient_matching_precomputed.npz", - "epsilon": 0.1, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "verbose": 1 - }, - "module": "armory.art_experimental.attacks.gradient_matching", - "name": "GradientMatchingWrapper" - }, - "dataset": { - "batch_size": 512, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "german_traffic_sign" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.micronnet_gtsrb", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_witches_brew", - "name": "WitchesBrewScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/asr_librispeech/hubert_untargeted_snr_pgd.json b/docs/scenario_configs/eval6/asr_librispeech/hubert_untargeted_snr_pgd.json deleted file mode 100644 index bba2df86c..000000000 --- a/docs/scenario_configs/eval6/asr_librispeech/hubert_untargeted_snr_pgd.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "_description": "Baseline DeepSpeech ASR on LibriSpeech, contributed by MITRE Corporation", - "adhoc": { - "skip_adversarial": false - }, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 20, - "eps_step": 0.5, - "max_iter": 500, - "norm": "snr", - "num_random_init": 0, - "targeted": false - }, - "module": "armory.art_experimental.attacks.snr_pgd", - "name": "SNR_PGD_Numpy", - "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": null, - "metric": { - "means": false, - "perturbation": "linf", - "record_metric_per_sample": true, - "task": [ - "word_error_rate" - ] - }, - "model": { - "fit": false, - "fit_kwargs": { - "nb_epochs": 20000 - }, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.hubert_asr_large", - "name": "get_art_model", - "predict_kwargs": { - "transcription_output": true - }, - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.audio_asr", - "name": "AutomaticSpeechRecognition" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "local_repo_path": null, - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/carla_mot/carla_mot_adversarialpatch_undefended.json b/docs/scenario_configs/eval6/carla_mot/carla_mot_adversarialpatch_undefended.json deleted file mode 100644 index 5f15432f0..000000000 --- a/docs/scenario_configs/eval6/carla_mot/carla_mot_adversarialpatch_undefended.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "_description": "CARLA single modality multi-object tracking, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_frame_size": 2, - "coco_format": true, - "learning_rate": 0.02, - "max_iter": 100, - "optimizer": "pgd", - "targeted": false, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_mot_adversarial_patch", - "name": "CARLAMOTAdversarialPatchPyTorch", - "use_label": true - }, - "dataset": { - "batch_size": 1, - "coco_format": true, - "eval_split": "dev", - "framework": "numpy", - "module": "armory.data.adversarial_datasets", - "name": "carla_multi_object_tracking_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "hota", - "deta", - "assa" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 2 - }, - "module": "armory.baseline_models.pytorch.carla_mot_frcnn_byte", - "name": "get_art_model", - "weights_file": "carla_mot_weights_eval6.pt", - "wrapper_kwargs": { - "BYTE_kwargs": { - "frame_rate": 30, - "match_thresh": 0.95, - "track_buffer": 60, - "track_thresh": 0.2 - }, - "coco_format": true, - "conf_thresh": 0.0, - "nms_thresh": 0.9, - "tracked_classes": [ - "pedestrian" - ] - } - }, - "scenario": { - "kwargs": { - "coco_format": true, - "tracked_classes": [ - "pedestrian" - ] - }, - "module": "armory.scenarios.carla_mot", - "name": "CarlaMOT" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": [ - "JonathonLuiten/TrackEval" - ], - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/carla_mot/carla_mot_dpatch_defended.json b/docs/scenario_configs/eval6/carla_mot/carla_mot_dpatch_defended.json deleted file mode 100644 index 1490f7d69..000000000 --- a/docs/scenario_configs/eval6/carla_mot/carla_mot_dpatch_defended.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "_description": "CARLA single modality multi-object tracking, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_frame_size": 2, - "learning_rate": 0.002, - "max_iter": 1000, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_mot_patch", - "name": "CARLAMOTDapricotPatch", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "coco_format": true, - "eval_split": "dev", - "framework": "numpy", - "module": "armory.data.adversarial_datasets", - "name": "carla_multi_object_tracking_dev" - }, - "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": [ - "hota", - "deta", - "assa" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 2 - }, - "module": "armory.baseline_models.pytorch.carla_mot_frcnn_byte", - "name": "get_art_model", - "weights_file": "carla_mot_weights_eval6.pt", - "wrapper_kwargs": { - "BYTE_kwargs": { - "frame_rate": 30, - "match_thresh": 0.95, - "track_buffer": 60, - "track_thresh": 0.2 - }, - "coco_format": true, - "conf_thresh": 0.0, - "nms_thresh": 0.9, - "tracked_classes": [ - "pedestrian" - ] - } - }, - "scenario": { - "kwargs": { - "coco_format": true, - "tracked_classes": [ - "pedestrian" - ] - }, - "module": "armory.scenarios.carla_mot", - "name": "CarlaMOT" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": [ - "JonathonLuiten/TrackEval", - "colour-science/colour@v0.3.16" - ], - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/carla_mot/carla_mot_dpatch_undefended.json b/docs/scenario_configs/eval6/carla_mot/carla_mot_dpatch_undefended.json deleted file mode 100644 index df80ca8a0..000000000 --- a/docs/scenario_configs/eval6/carla_mot/carla_mot_dpatch_undefended.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "_description": "CARLA single modality multi-object tracking, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_frame_size": 2, - "learning_rate": 0.002, - "max_iter": 1000, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_mot_patch", - "name": "CARLAMOTDapricotPatch", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "coco_format": true, - "eval_split": "dev", - "framework": "numpy", - "module": "armory.data.adversarial_datasets", - "name": "carla_multi_object_tracking_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "hota", - "deta", - "assa" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 2 - }, - "module": "armory.baseline_models.pytorch.carla_mot_frcnn_byte", - "name": "get_art_model", - "weights_file": "carla_mot_weights_eval6.pt", - "wrapper_kwargs": { - "BYTE_kwargs": { - "frame_rate": 30, - "match_thresh": 0.95, - "track_buffer": 60, - "track_thresh": 0.2 - }, - "coco_format": true, - "conf_thresh": 0.0, - "nms_thresh": 0.9, - "tracked_classes": [ - "pedestrian" - ] - } - }, - "scenario": { - "kwargs": { - "coco_format": true, - "tracked_classes": [ - "pedestrian" - ] - }, - "module": "armory.scenarios.carla_mot", - "name": "CarlaMOT" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": [ - "JonathonLuiten/TrackEval", - "colour-science/colour@v0.3.16" - ], - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_adversarialpatch_undefended.json b/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_adversarialpatch_undefended.json deleted file mode 100644 index db788f0e6..000000000 --- a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_adversarialpatch_undefended.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "_description": "CARLA single modality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "learning_rate": 0.003, - "max_iter": 1000, - "optimizer": "pgd", - "targeted": false, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_adversarial_patch", - "name": "CARLAAdversarialPatchPyTorch", - "use_label": true - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "rgb", - "module": "armory.data.adversarial_datasets", - "name": "carla_over_obj_det_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate", - "object_detection_mAP_tide" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 3 - }, - "module": "armory.baseline_models.pytorch.carla_single_modality_object_detection_frcnn", - "name": "get_art_model", - "weights_file": "carla_rgb_weights_eval6.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_dpatch_defended.json b/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_dpatch_defended.json deleted file mode 100644 index 225976d8c..000000000 --- a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_dpatch_defended.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "_description": "CARLA single modality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "learning_rate": 0.002, - "max_iter": 2000, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_patch", - "name": "CARLADapricotPatch", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "rgb", - "module": "armory.data.adversarial_datasets", - "name": "carla_over_obj_det_dev" - }, - "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": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate", - "object_detection_mAP_tide" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 3 - }, - "module": "armory.baseline_models.pytorch.carla_single_modality_object_detection_frcnn", - "name": "get_art_model", - "weights_file": "carla_rgb_weights_eval6.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "colour-science/colour@v0.3.16", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_dpatch_undefended.json b/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_dpatch_undefended.json deleted file mode 100644 index ea91f7ec1..000000000 --- a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_dpatch_undefended.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_description": "CARLA single modality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "learning_rate": 0.002, - "max_iter": 2000, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_patch", - "name": "CARLADapricotPatch", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "rgb", - "module": "armory.data.adversarial_datasets", - "name": "carla_over_obj_det_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate", - "object_detection_mAP_tide" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 3 - }, - "module": "armory.baseline_models.pytorch.carla_single_modality_object_detection_frcnn", - "name": "get_art_model", - "weights_file": "carla_rgb_weights_eval6.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "colour-science/colour@v0.3.16", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_multimodal_adversarialpatch_defended.json b/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_multimodal_adversarialpatch_defended.json deleted file mode 100644 index a006a3f67..000000000 --- a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_multimodal_adversarialpatch_defended.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "_description": "CARLA multimodality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "depth_delta_meters": 0.03, - "learning_rate": 0.003, - "learning_rate_depth": 0.0001, - "max_iter": 1000, - "optimizer": "pgd", - "targeted": false, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_adversarial_patch", - "name": "CARLAAdversarialPatchPyTorch", - "use_label": true - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "both", - "module": "armory.data.adversarial_datasets", - "name": "carla_over_obj_det_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate", - "object_detection_mAP_tide" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.carla_multimodality_object_detection_frcnn_robust_fusion", - "name": "get_art_model_mm_robust", - "weights_file": "carla_multimodal_robust_weights_eval6.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_multimodal_adversarialpatch_undefended.json b/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_multimodal_adversarialpatch_undefended.json deleted file mode 100644 index e88c6bfe1..000000000 --- a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_multimodal_adversarialpatch_undefended.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "_description": "CARLA multimodality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "depth_delta_meters": 0.03, - "learning_rate": 0.003, - "learning_rate_depth": 0.0001, - "max_iter": 1000, - "optimizer": "pgd", - "targeted": false, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_adversarial_patch", - "name": "CARLAAdversarialPatchPyTorch", - "use_label": true - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "both", - "module": "armory.data.adversarial_datasets", - "name": "carla_over_obj_det_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate", - "object_detection_mAP_tide" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.carla_multimodality_object_detection_frcnn", - "name": "get_art_model_mm", - "weights_file": "carla_multimodal_naive_weights_eval6.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_multimodal_dpatch_defended.json b/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_multimodal_dpatch_defended.json deleted file mode 100644 index 2c0224124..000000000 --- a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_multimodal_dpatch_defended.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_description": "CARLA multimodality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "depth_delta_meters": 0.03, - "learning_rate": 0.002, - "learning_rate_depth": 0.0001, - "max_iter": 2000, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_patch", - "name": "CARLADapricotPatch", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "both", - "module": "armory.data.adversarial_datasets", - "name": "carla_over_obj_det_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate", - "object_detection_mAP_tide" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.carla_multimodality_object_detection_frcnn_robust_fusion", - "name": "get_art_model_mm_robust", - "weights_file": "carla_multimodal_robust_weights_eval6.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "colour-science/colour@v0.3.16", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_multimodal_dpatch_undefended.json b/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_multimodal_dpatch_undefended.json deleted file mode 100644 index 7f9e54d7f..000000000 --- a/docs/scenario_configs/eval6/carla_overhead_object_detection/carla_obj_det_multimodal_dpatch_undefended.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_description": "CARLA multimodality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "depth_delta_meters": 0.03, - "learning_rate": 0.002, - "learning_rate_depth": 0.0001, - "max_iter": 2000, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_patch", - "name": "CARLADapricotPatch", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "modality": "both", - "module": "armory.data.adversarial_datasets", - "name": "carla_over_obj_det_dev" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "l0", - "record_metric_per_sample": false, - "task": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate", - "object_detection_mAP_tide" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.carla_multimodality_object_detection_frcnn", - "name": "get_art_model_mm", - "weights_file": "carla_multimodal_naive_weights_eval6.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "colour-science/colour@v0.3.16", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p00_undefended.json b/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p00_undefended.json deleted file mode 100644 index 03aa75c66..000000000 --- a/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p00_undefended.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_description": "Speech Commands DLBD poison audio classification, undefended", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "speech_commands_explanatory_model", - "fraction_poisoned": 0, - "poison_dataset": false, - "source_class": 11, - "split_id": 0, - "target_class": 2, - "train_epochs": 20, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "clapping.wav", - "duration": 1, - "random": false, - "sampling_rate": 16000, - "scale": 0.1, - "shift": 0 - } - }, - "module": "armory.art_experimental.attacks.poison_loader_audio", - "name": "poison_loader_audio" - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "speech_commands", - "pad_data": true - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.audio_resnet50", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p01_undefended.json b/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p01_undefended.json deleted file mode 100644 index 06d344593..000000000 --- a/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p01_undefended.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_description": "Speech Commands DLBD poison audio classification, undefended", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "speech_commands_explanatory_model", - "fraction_poisoned": 0.01, - "poison_dataset": true, - "source_class": 11, - "split_id": 0, - "target_class": 2, - "train_epochs": 20, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "clapping.wav", - "duration": 1, - "random": false, - "sampling_rate": 16000, - "scale": 0.1, - "shift": 0 - } - }, - "module": "armory.art_experimental.attacks.poison_loader_audio", - "name": "poison_loader_audio" - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "speech_commands", - "pad_data": true - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.audio_resnet50", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p05_undefended.json b/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p05_undefended.json deleted file mode 100644 index 2cbaaaaa2..000000000 --- a/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p05_undefended.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_description": "Speech Commands DLBD poison audio classification, undefended", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "speech_commands_explanatory_model", - "fraction_poisoned": 0.05, - "poison_dataset": true, - "source_class": 11, - "split_id": 0, - "target_class": 2, - "train_epochs": 20, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "clapping.wav", - "duration": 1, - "random": false, - "sampling_rate": 16000, - "scale": 0.1, - "shift": 0 - } - }, - "module": "armory.art_experimental.attacks.poison_loader_audio", - "name": "poison_loader_audio" - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "speech_commands", - "pad_data": true - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.audio_resnet50", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p10_undefended.json b/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p10_undefended.json deleted file mode 100644 index 701f86798..000000000 --- a/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p10_undefended.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_description": "Speech Commands DLBD poison audio classification, undefended", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "speech_commands_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 11, - "split_id": 0, - "target_class": 2, - "train_epochs": 20, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "clapping.wav", - "duration": 1, - "random": false, - "sampling_rate": 16000, - "scale": 0.1, - "shift": 0 - } - }, - "module": "armory.art_experimental.attacks.poison_loader_audio", - "name": "poison_loader_audio" - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "speech_commands", - "pad_data": true - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.audio_resnet50", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p20_undefended.json b/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p20_undefended.json deleted file mode 100644 index fa91de51b..000000000 --- a/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p20_undefended.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_description": "Speech Commands DLBD poison audio classification, undefended", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "speech_commands_explanatory_model", - "fraction_poisoned": 0.2, - "poison_dataset": true, - "source_class": 11, - "split_id": 0, - "target_class": 2, - "train_epochs": 20, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "clapping.wav", - "duration": 1, - "random": false, - "sampling_rate": 16000, - "scale": 0.1, - "shift": 0 - } - }, - "module": "armory.art_experimental.attacks.poison_loader_audio", - "name": "poison_loader_audio" - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "speech_commands", - "pad_data": true - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.audio_resnet50", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p30_undefended.json b/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p30_undefended.json deleted file mode 100644 index e29bb9faf..000000000 --- a/docs/scenario_configs/eval6/poisoning/audio_dlbd/audio_p30_undefended.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_description": "Speech Commands DLBD poison audio classification, undefended", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "speech_commands_explanatory_model", - "fraction_poisoned": 0.3, - "poison_dataset": true, - "source_class": 11, - "split_id": 0, - "target_class": 2, - "train_epochs": 20, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "clapping.wav", - "duration": 1, - "random": false, - "sampling_rate": 16000, - "scale": 0.1, - "shift": 0 - } - }, - "module": "armory.art_experimental.attacks.poison_loader_audio", - "name": "poison_loader_audio" - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "speech_commands", - "pad_data": true - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.audio_resnet50", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_activation_defense.json b/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_activation_defense.json deleted file mode 100644 index 51dea568e..000000000 --- a/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_activation_defense.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "_description": "Speech Commands DLBD poison audio classification, activation defense", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": null, - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 11, - "split_id": 0, - "target_class": 2, - "train_epochs": 20, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "clapping.wav", - "duration": 1, - "random": false, - "sampling_rate": 16000, - "scale": 0.1, - "shift": 0 - } - }, - "module": "armory.art_experimental.attacks.poison_loader_audio", - "name": "poison_loader_audio" - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "speech_commands", - "pad_data": true - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.audio_resnet50", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_dpinstahide.json b/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_dpinstahide.json deleted file mode 100644 index b35b7a779..000000000 --- a/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_dpinstahide.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "_description": "Speech Commands DLBD poison audio classification, DP Instahide defense", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": null, - "fit_defense_classifier_outside_defense": false, - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 11, - "split_id": 0, - "target_class": 2, - "train_epochs": 20, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "clapping.wav", - "duration": 1, - "random": false, - "sampling_rate": 16000, - "scale": 0.1, - "shift": 0 - } - }, - "module": "armory.art_experimental.attacks.poison_loader_audio", - "name": "poison_loader_audio" - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "speech_commands", - "pad_data": true - }, - "defense": { - "kwargs": { - "augmentations": { - "kwargs": { - "apply_fit": true, - "apply_predict": false, - "num_classes": 12, - "num_mix": 2 - }, - "name": "Mixup" - }, - "clip_values": [ - 0, - 1 - ], - "noise": "laplacian", - "scale": 0.015 - }, - "module": "art.defences.trainer", - "name": "DPInstaHideTrainer", - "type": "Trainer" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.audio_resnet50", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/pytorch", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_perfect_filter.json b/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_perfect_filter.json deleted file mode 100644 index 17dce65af..000000000 --- a/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_perfect_filter.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "_description": "Speech Commands DLBD poison audio classification, perfect filter", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": null, - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 11, - "split_id": 0, - "target_class": 2, - "train_epochs": 20, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "clapping.wav", - "duration": 1, - "random": false, - "sampling_rate": 16000, - "scale": 0.1, - "shift": 0 - } - }, - "module": "armory.art_experimental.attacks.poison_loader_audio", - "name": "poison_loader_audio" - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "speech_commands", - "pad_data": true - }, - "defense": { - "kwargs": { - "perfect_filter": true - }, - "module": "null", - "name": "null", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.audio_resnet50", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_random_filter.json b/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_random_filter.json deleted file mode 100644 index 5e61eeff4..000000000 --- a/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_random_filter.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "_description": "Speech Commands DLBD poison audio classification, random filter", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": null, - "fit_defense_classifier_outside_defense": false, - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 11, - "split_id": 0, - "target_class": 2, - "train_epochs": 20, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "clapping.wav", - "duration": 1, - "random": false, - "sampling_rate": 16000, - "scale": 0.1, - "shift": 0 - } - }, - "module": "armory.art_experimental.attacks.poison_loader_audio", - "name": "poison_loader_audio" - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "speech_commands", - "pad_data": true - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "armory.art_experimental.poison_detection.random_filter", - "name": "RandomFilterBaselineDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.audio_resnet50", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_spectral_signature_defense.json b/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_spectral_signature_defense.json deleted file mode 100644 index 06a6f08a5..000000000 --- a/docs/scenario_configs/eval6/poisoning/audio_dlbd/baseline_defenses/audio_p10_spectral_signature_defense.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "_description": "Speech Commands DLBD poison audio classification, spectral signatures defense", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": null, - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 11, - "split_id": 0, - "target_class": 2, - "train_epochs": 20, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "backdoor_kwargs": { - "backdoor_path": "clapping.wav", - "duration": 1, - "random": false, - "sampling_rate": 16000, - "scale": 0.1, - "shift": 0 - } - }, - "module": "armory.art_experimental.attacks.poison_loader_audio", - "name": "poison_loader_audio" - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "speech_commands", - "pad_data": true - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "art.defences.detector.poison.spectral_signature_defense", - "name": "SpectralSignatureDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.tf_graph.audio_resnet50", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.poison", - "name": "Poison" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_activation_defense.json b/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_activation_defense.json deleted file mode 100644 index fd87cebdb..000000000 --- a/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_activation_defense.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, sleeper agent attack, activation defense", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 1, - "train_epochs": 80, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 500, - "device_name": "cuda", - "epsilon": 0.0627, - "k_trigger": 1000, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "model_retrain": true, - "model_retraining_epoch": 80, - "patch": "trigger_10.png", - "patch_size": 8, - "patching_strategy": "random", - "retraining_factor": 4, - "selection_strategy": "max-norm", - "verbose": 1 - }, - "module": "art.attacks.poisoning.sleeper_agent_attack", - "name": "SleeperAgentAttack" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "cluster_analysis": "smaller", - "clustering_method": "KMeans", - "nb_clusters": 2, - "nb_dims": 43, - "reduce": "PCA" - }, - "module": "art.defences.detector.poison.activation_defence", - "name": "ActivationDefence", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model_cifar_sleeper_agent", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.1, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_sleeper_agent", - "name": "SleeperAgentScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_dpinstahide.json b/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_dpinstahide.json deleted file mode 100644 index 8a4193c69..000000000 --- a/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_dpinstahide.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, sleeper agent attack, DP Instahide defense", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fit_defense_classifier_outside_defense": false, - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 1, - "train_epochs": 80, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 500, - "device_name": "cuda", - "epsilon": 0.0627, - "k_trigger": 1000, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "model_retrain": true, - "model_retraining_epoch": 80, - "patch": "trigger_10.png", - "patch_size": 8, - "patching_strategy": "random", - "retraining_factor": 4, - "selection_strategy": "max-norm", - "verbose": 1 - }, - "module": "art.attacks.poisoning.sleeper_agent_attack", - "name": "SleeperAgentAttack" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "augmentations": { - "kwargs": { - "apply_fit": true, - "apply_predict": false, - "num_classes": 10, - "num_mix": 2 - }, - "name": "Mixup" - }, - "clip_values": [ - 0, - 1 - ], - "noise": "laplacian", - "scale": 0.03 - }, - "module": "art.defences.trainer", - "name": "DPInstaHideTrainer", - "type": "Trainer" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model_cifar_sleeper_agent", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.1, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_sleeper_agent", - "name": "SleeperAgentScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/pytorch", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_perfect_filter.json b/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_perfect_filter.json deleted file mode 100644 index 661a54d9a..000000000 --- a/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_perfect_filter.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, sleeper agent attack, perfect filter", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 1, - "train_epochs": 80, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 500, - "device_name": "cuda", - "epsilon": 0.0627, - "k_trigger": 1000, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "model_retrain": true, - "model_retraining_epoch": 80, - "patch": "trigger_10.png", - "patch_size": 8, - "patching_strategy": "random", - "retraining_factor": 4, - "selection_strategy": "max-norm", - "verbose": 1 - }, - "module": "art.attacks.poisoning.sleeper_agent_attack", - "name": "SleeperAgentAttack" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "perfect_filter": true - }, - "module": "null", - "name": "null", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model_cifar_sleeper_agent", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.1, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_sleeper_agent", - "name": "SleeperAgentScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_random_filter.json b/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_random_filter.json deleted file mode 100644 index 69ebd7138..000000000 --- a/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_random_filter.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, sleeper agent attack, random filter", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fit_defense_classifier_outside_defense": false, - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 1, - "train_epochs": 80, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 500, - "device_name": "cuda", - "epsilon": 0.0627, - "k_trigger": 1000, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "model_retrain": true, - "model_retraining_epoch": 80, - "patch": "trigger_10.png", - "patch_size": 8, - "patching_strategy": "random", - "retraining_factor": 4, - "selection_strategy": "max-norm", - "verbose": 1 - }, - "module": "art.attacks.poisoning.sleeper_agent_attack", - "name": "SleeperAgentAttack" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "armory.art_experimental.poison_detection.random_filter", - "name": "RandomFilterBaselineDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model_cifar_sleeper_agent", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.1, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_sleeper_agent", - "name": "SleeperAgentScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_spectral_signatures_defense.json b/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_spectral_signatures_defense.json deleted file mode 100644 index 89e995696..000000000 --- a/docs/scenario_configs/eval6/poisoning/sleeper_agent/baseline_defenses/cifar10_sleeper_agent_p10_spectral_signatures_defense.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, sleeper agent attack, spectral signatures defense", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 1, - "train_epochs": 80, - "use_poison_filtering_defense": true - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 500, - "device_name": "cuda", - "epsilon": 0.0627, - "k_trigger": 1000, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "model_retrain": true, - "model_retraining_epoch": 80, - "patch": "trigger_10.png", - "patch_size": 8, - "patching_strategy": "random", - "retraining_factor": 4, - "selection_strategy": "max-norm", - "verbose": 1 - }, - "module": "art.attacks.poisoning.sleeper_agent_attack", - "name": "SleeperAgentAttack" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": { - "kwargs": { - "expected_pp_poison": 0.3 - }, - "module": "art.defences.detector.poison.spectral_signature_defense", - "name": "SpectralSignatureDefense", - "type": "PoisonFilteringDefence" - }, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model_cifar_sleeper_agent", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.1, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_sleeper_agent", - "name": "SleeperAgentScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p00_undefended.json b/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p00_undefended.json deleted file mode 100644 index 105705587..000000000 --- a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p00_undefended.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, sleeper agent attack, undefended", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0, - "poison_dataset": false, - "source_class": 0, - "split_id": 0, - "target_class": 1, - "train_epochs": 80, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 500, - "device_name": "cuda", - "epsilon": 0.0627, - "k_trigger": 1000, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "model_retrain": true, - "model_retraining_epoch": 80, - "patch": "trigger_10.png", - "patch_size": 8, - "patching_strategy": "random", - "retraining_factor": 4, - "selection_strategy": "max-norm", - "verbose": 1 - }, - "module": "art.attacks.poisoning.sleeper_agent_attack", - "name": "SleeperAgentAttack" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model_cifar_sleeper_agent", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.1, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_sleeper_agent", - "name": "SleeperAgentScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p01_undefended.json b/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p01_undefended.json deleted file mode 100644 index c6e6b5aa1..000000000 --- a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p01_undefended.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, sleeper agent attack, undefended", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.01, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 1, - "train_epochs": 80, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 500, - "device_name": "cuda", - "epsilon": 0.0627, - "k_trigger": 1000, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "model_retrain": true, - "model_retraining_epoch": 80, - "patch": "trigger_10.png", - "patch_size": 8, - "patching_strategy": "random", - "retraining_factor": 4, - "selection_strategy": "max-norm", - "verbose": 1 - }, - "module": "art.attacks.poisoning.sleeper_agent_attack", - "name": "SleeperAgentAttack" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model_cifar_sleeper_agent", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.1, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_sleeper_agent", - "name": "SleeperAgentScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p05_undefended.json b/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p05_undefended.json deleted file mode 100644 index c7cede80f..000000000 --- a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p05_undefended.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, sleeper agent attack, undefended", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.05, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 1, - "train_epochs": 80, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 500, - "device_name": "cuda", - "epsilon": 0.0627, - "k_trigger": 1000, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "model_retrain": true, - "model_retraining_epoch": 80, - "patch": "trigger_10.png", - "patch_size": 8, - "patching_strategy": "random", - "retraining_factor": 4, - "selection_strategy": "max-norm", - "verbose": 1 - }, - "module": "art.attacks.poisoning.sleeper_agent_attack", - "name": "SleeperAgentAttack" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model_cifar_sleeper_agent", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.1, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_sleeper_agent", - "name": "SleeperAgentScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p10_undefended.json b/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p10_undefended.json deleted file mode 100644 index 815c4f7a3..000000000 --- a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p10_undefended.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, sleeper agent attack, undefended", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.1, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 1, - "train_epochs": 80, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 500, - "device_name": "cuda", - "epsilon": 0.0627, - "k_trigger": 1000, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "model_retrain": true, - "model_retraining_epoch": 80, - "patch": "trigger_10.png", - "patch_size": 8, - "patching_strategy": "random", - "retraining_factor": 4, - "selection_strategy": "max-norm", - "verbose": 1 - }, - "module": "art.attacks.poisoning.sleeper_agent_attack", - "name": "SleeperAgentAttack" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model_cifar_sleeper_agent", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.1, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_sleeper_agent", - "name": "SleeperAgentScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p20_undefended.json b/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p20_undefended.json deleted file mode 100644 index 33ccab3a2..000000000 --- a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p20_undefended.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, sleeper agent attack, undefended", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.2, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 1, - "train_epochs": 80, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 500, - "device_name": "cuda", - "epsilon": 0.0627, - "k_trigger": 1000, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "model_retrain": true, - "model_retraining_epoch": 80, - "patch": "trigger_10.png", - "patch_size": 8, - "patching_strategy": "random", - "retraining_factor": 4, - "selection_strategy": "max-norm", - "verbose": 1 - }, - "module": "art.attacks.poisoning.sleeper_agent_attack", - "name": "SleeperAgentAttack" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model_cifar_sleeper_agent", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.1, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_sleeper_agent", - "name": "SleeperAgentScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p30_undefended.json b/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p30_undefended.json deleted file mode 100644 index dd2c23ab2..000000000 --- a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p30_undefended.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, sleeper agent attack, undefended", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.3, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 1, - "train_epochs": 80, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 500, - "device_name": "cuda", - "epsilon": 0.0627, - "k_trigger": 1000, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "model_retrain": true, - "model_retraining_epoch": 80, - "patch": "trigger_10.png", - "patch_size": 8, - "patching_strategy": "random", - "retraining_factor": 4, - "selection_strategy": "max-norm", - "verbose": 1 - }, - "module": "art.attacks.poisoning.sleeper_agent_attack", - "name": "SleeperAgentAttack" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model_cifar_sleeper_agent", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.1, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_sleeper_agent", - "name": "SleeperAgentScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p50_undefended.json b/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p50_undefended.json deleted file mode 100644 index f5268d749..000000000 --- a/docs/scenario_configs/eval6/poisoning/sleeper_agent/cifar10_sleeper_agent_p50_undefended.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "_description": "CIFAR10 poison image classification, sleeper agent attack, undefended", - "adhoc": { - "compute_fairness_metrics": false, - "experiment_id": 0, - "explanatory_model": "cifar10_explanatory_model", - "fraction_poisoned": 0.5, - "poison_dataset": true, - "source_class": 0, - "split_id": 0, - "target_class": 1, - "train_epochs": 80, - "use_poison_filtering_defense": false - }, - "attack": { - "knowledge": "black", - "kwargs": { - "batch_size": 500, - "device_name": "cuda", - "epsilon": 0.0627, - "k_trigger": 1000, - "learning_rate_schedule": [ - [ - 0.1, - 0.01, - 0.001, - 0.0001, - 1e-05 - ], - [ - 250, - 350, - 400, - 430, - 460 - ] - ], - "max_epochs": 500, - "max_trials": 1, - "model_retrain": true, - "model_retraining_epoch": 80, - "patch": "trigger_10.png", - "patch_size": 8, - "patching_strategy": "random", - "retraining_factor": 4, - "selection_strategy": "max-norm", - "verbose": 1 - }, - "module": "art.attacks.poisoning.sleeper_agent_attack", - "name": "SleeperAgentAttack" - }, - "dataset": { - "batch_size": 128, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": { - "data_means": [ - 0.4914, - 0.4822, - 0.4465 - ], - "data_stds": [ - 0.247, - 0.2435, - 0.2616 - ], - "num_classes": 10, - "pretrained": false - }, - "module": "armory.baseline_models.pytorch.resnet18", - "name": "get_art_model_cifar_sleeper_agent", - "weights_file": null, - "wrapper_kwargs": { - "input_shape": [ - 32, - 32, - 3 - ], - "learning_rate": 0.1, - "nb_classes": 10 - } - }, - "scenario": { - "export_batches": false, - "kwargs": {}, - "module": "armory.scenarios.poisoning_sleeper_agent", - "name": "SleeperAgentScenario" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "set_pythonhashseed": true, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/mnist_baseline.json b/docs/scenario_configs/mnist_baseline.json deleted file mode 120000 index 890941cbc..000000000 --- a/docs/scenario_configs/mnist_baseline.json +++ /dev/null @@ -1 +0,0 @@ -eval1-4/mnist/mnist_baseline.json \ No newline at end of file diff --git a/docs/scenario_configs/no_docker/carla_short.json b/docs/scenario_configs/no_docker/carla_short.json deleted file mode 100644 index 5a269f788..000000000 --- a/docs/scenario_configs/no_docker/carla_short.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "_description": "CARLA single modality object detection, contributed by MITRE Corporation", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "learning_rate": 0.01, - "max_iter": 2, - "verbose": true - }, - "module": "armory.art_experimental.attacks.carla_obj_det_patch", - "name": "CARLADapricotPatch", - "use_label": false - }, - "dataset": { - "batch_size": 1, - "eval_split": "dev", - "framework": "numpy", - "index": "[:2]", - "modality": "rgb", - "module": "armory.data.adversarial_datasets", - "name": "carla_obj_det_dev" - }, - "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": [ - "carla_od_AP_per_class", - "carla_od_disappearance_rate", - "carla_od_hallucinations_per_image", - "carla_od_misclassification_rate", - "carla_od_true_positive_rate" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": { - "num_classes": 4 - }, - "module": "armory.baseline_models.pytorch.carla_single_modality_object_detection_frcnn", - "name": "get_art_model", - "weights_file": "carla_rgb_weights.pt", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.carla_object_detection", - "name": "CarlaObjectDetectionTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": "colour-science/colour", - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/no_docker/cifar_short.json b/docs/scenario_configs/no_docker/cifar_short.json deleted file mode 100644 index 2788e40a1..000000000 --- a/docs/scenario_configs/no_docker/cifar_short.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "_description": "Baseline cifar10 image classification", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 0.031, - "eps_step": 0.007, - "max_iter": 2, - "num_random_init": 1, - "random_eps": false, - "targeted": false, - "verbose": false - }, - "module": "art.attacks.evasion", - "name": "ProjectedGradientDescent", - "use_label": true - }, - "dataset": { - "batch_size": 5, - "framework": "numpy", - "index": "[:10]", - "module": "armory.data.datasets", - "name": "cifar10" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": true, - "fit_kwargs": { - "nb_epochs": 1 - }, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.cifar", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.image_classification", - "name": "ImageClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/poisoning_cifar10_witches_brew.json b/docs/scenario_configs/poisoning_cifar10_witches_brew.json deleted file mode 120000 index 407aaca05..000000000 --- a/docs/scenario_configs/poisoning_cifar10_witches_brew.json +++ /dev/null @@ -1 +0,0 @@ -eval5/poisoning/cifar10_witches_brew.json \ No newline at end of file diff --git a/docs/scenario_configs/poisoning_gtsrb_dirty_label.json b/docs/scenario_configs/poisoning_gtsrb_dirty_label.json deleted file mode 120000 index 068b781e5..000000000 --- a/docs/scenario_configs/poisoning_gtsrb_dirty_label.json +++ /dev/null @@ -1 +0,0 @@ -eval5/poisoning/gtsrb_dlbd_baseline_pytorch.json \ No newline at end of file diff --git a/docs/scenario_configs/so2sat_eo_masked_pgd.json b/docs/scenario_configs/so2sat_eo_masked_pgd.json deleted file mode 120000 index 9ae3fcbc6..000000000 --- a/docs/scenario_configs/so2sat_eo_masked_pgd.json +++ /dev/null @@ -1 +0,0 @@ -eval1-4/so2sat/so2sat_eo_masked_pgd_undefended.json \ No newline at end of file diff --git a/docs/scenario_configs/speaker_id_librispeech.json b/docs/scenario_configs/speaker_id_librispeech.json deleted file mode 120000 index c9d0b713e..000000000 --- a/docs/scenario_configs/speaker_id_librispeech.json +++ /dev/null @@ -1 +0,0 @@ -eval1-4/speaker_id_librispeech/librispeech_baseline_sincnet_snr_pgd.json \ No newline at end of file diff --git a/docs/scenario_configs/tests/broken/invalid_dataset_framework.json b/docs/scenario_configs/tests/broken/invalid_dataset_framework.json deleted file mode 100644 index b2c958c42..000000000 --- a/docs/scenario_configs/tests/broken/invalid_dataset_framework.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "_description": "", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 0.2, - "eps_step": 0.1, - "minimal": false, - "num_random_init": 0, - "targeted": false - }, - "module": "art.attacks", - "name": "FastGradientMethod" - }, - "dataset": { - "batch_size": 64, - "framework": "chainer", - "module": "armory.data.datasets", - "name": "mnist" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": true, - "fit_kwargs": { - "nb_epochs": 3 - }, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.mnist", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.image_classification", - "name": "ImageClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/tests/broken/invalid_module.json b/docs/scenario_configs/tests/broken/invalid_module.json deleted file mode 100644 index 72b42713b..000000000 --- a/docs/scenario_configs/tests/broken/invalid_module.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "_description": "Test schema with an invalid `attack.module`", - "adhoc": { - "batch_size": 64, - "epochs": 3 - }, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 0.2, - "eps_step": 0.1, - "minimal": false, - "num_random_init": 0, - "targeted": false - }, - "module": "art::attacks", - "name": "FastGradientMethod" - }, - "dataset": { - "batch_size": 64, - "module": "armory.data.datasets", - "name": "mnist" - }, - "defense": null, - "metric": null, - "model": { - "fit": true, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.keras_mnist", - "name": "get_art_model", - "weights_file": "", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "tests.evals.fgm_attack", - "name": "fgm_attack" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/tests/broken/missing_scenario.json b/docs/scenario_configs/tests/broken/missing_scenario.json deleted file mode 100644 index c3432ffdf..000000000 --- a/docs/scenario_configs/tests/broken/missing_scenario.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "_description": "", - "adhoc": null, - "attack": { - "knowledge": "white", - "kwargs": { - "batch_size": 1, - "eps": 0.2, - "eps_step": 0.1, - "minimal": false, - "num_random_init": 0, - "targeted": false - }, - "module": "art.attacks", - "name": "FastGradientMethod" - }, - "dataset": { - "batch_size": 64, - "module": "armory.data.datasets", - "name": "mnist" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": true, - "fit_kwargs": { - "nb_epochs": 3 - }, - "model_kwargs": {}, - "module": "armory.baseline_models.keras.mnist", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/tests/pytorch/image_classification.json b/docs/scenario_configs/tests/pytorch/image_classification.json deleted file mode 100644 index 0aad097a3..000000000 --- a/docs/scenario_configs/tests/pytorch/image_classification.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "_description": "", - "adhoc": null, - "attack": { - "knowledge": "white", - "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" - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "mnist" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": true, - "fit_kwargs": { - "nb_epochs": 3 - }, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.mnist", - "name": "get_art_model", - "weights_file": null, - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.image_classification", - "name": "ImageClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/tests/pytorch/image_classification_pretrained.json b/docs/scenario_configs/tests/pytorch/image_classification_pretrained.json deleted file mode 100644 index 015f04cc3..000000000 --- a/docs/scenario_configs/tests/pytorch/image_classification_pretrained.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "_description": "", - "adhoc": null, - "attack": { - "knowledge": "white", - "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" - }, - "dataset": { - "batch_size": 64, - "framework": "numpy", - "module": "armory.data.datasets", - "name": "mnist" - }, - "defense": null, - "metric": { - "means": true, - "perturbation": "linf", - "record_metric_per_sample": false, - "task": [ - "categorical_accuracy" - ] - }, - "model": { - "fit": false, - "fit_kwargs": {}, - "model_kwargs": {}, - "module": "armory.baseline_models.pytorch.mnist", - "name": "get_art_model", - "weights_file": "undefended_mnist_5epochs.pth", - "wrapper_kwargs": {} - }, - "scenario": { - "kwargs": {}, - "module": "armory.scenarios.image_classification", - "name": "ImageClassificationTask" - }, - "sysconfig": { - "docker_image": "twosixarmory/armory", - "external_github_repo": null, - "gpus": "all", - "output_dir": null, - "output_filename": null, - "use_gpu": false - } -} diff --git a/docs/scenario_configs/ucf101_masked_pgd.json b/docs/scenario_configs/ucf101_masked_pgd.json deleted file mode 120000 index 4df092b77..000000000 --- a/docs/scenario_configs/ucf101_masked_pgd.json +++ /dev/null @@ -1 +0,0 @@ -eval1-4/ucf101/ucf101_pretrained_masked_pgd_undefended.json \ No newline at end of file diff --git a/docs/scenario_configs/xview_robust_dpatch.json b/docs/scenario_configs/xview_robust_dpatch.json deleted file mode 120000 index 4289adfb4..000000000 --- a/docs/scenario_configs/xview_robust_dpatch.json +++ /dev/null @@ -1 +0,0 @@ -eval1-4/xview/xview_frcnn_robust_dpatch_undefended.json \ No newline at end of file diff --git a/examples/notebooks/api-walkthrough.ipynb b/examples/notebooks/api-walkthrough.ipynb deleted file mode 100644 index fbea4fefd..000000000 --- a/examples/notebooks/api-walkthrough.ipynb +++ /dev/null @@ -1,421 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Armory Evaluation Declarations, Composition, and Modification\n", - "\n", - "There are data declarations in charmory.blocks that recapitulate standard evaluations\n", - "from the armory package. " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2023-07-26 16:26:20 3s \u001b[33m\u001b[1mWARNING \u001b[0m \u001b[36mlogging\u001b[0m:\u001b[36mcallHandlers\u001b[0m:\u001b[36m1706\u001b[0m `tfds.core.add_checksums_dir` is deprecated. Refactor dataset in self-contained folders (`my_dataset/` folder containing my_dataset.py, my_dataset_test.py, dummy_data/, checksums.tsv). The checksum file will be automatically detected. More info at: https://www.tensorflow.org/datasets/add_dataset\n" - ] - } - ], - "source": [ - "import charmory.blocks.cifar10\n", - "\n", - "baseline = charmory.blocks.cifar10.baseline" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `baseline` evaluation is a composite dataclass with some metadata fields\n", - "describing the evaluation:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\"type(baseline)=\"\n", - "(\"baseline.name='cifar_baseline'\\n\"\n", - " \"baseline.description='Baseline cifar10 image classification'\\n\"\n", - " \"baseline.author='msw@example.com'\")\n" - ] - } - ], - "source": [ - "from pprint import pprint\n", - "pprint(f\"{type(baseline)=}\")\n", - "pprint(f\"{baseline.name=}\\n{baseline.description=}\\n{baseline.author=}\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The charmory `Evaluation` class was called \"Experiment\" in prior versions of the\n", - "JATIC Armory library, but was renamed to avoid confusion with the MLflow conception\n", - "of Experiment, which is a collection of runs.\n", - "\n", - "Along with the metadata, an `Evaluation` contains some required components. The\n", - "`dataset` is a `Dataset` object, which specifies an Armory dataset and a pair\n", - "of necessary parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(\"baseline.dataset=Dataset(name='CIFAR10', \"\n", - " 'test_dataset=, train_dataset=)')\n" - ] - } - ], - "source": [ - "pprint(f\"{baseline.dataset=}\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - " \n", - "the `function` parameter is shown first while details come afterwards; this allows quick\n", - "visibility of \"this is a cifar10 dataset\" from the `__str__` representation of the\n", - "object. An `Evaluation` also requires a `Model` and `Scenario`" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(\"baseline.model=Model(name='pytorch cifar', \"\n", - " 'model=art.estimators.classification.pytorch.PyTorchClassifier(model=ModelWrapper(\\n'\n", - " ' (_model): Net(\\n'\n", - " ' (conv1): Conv2d(3, 4, kernel_size=(5, 5), stride=(1, 1))\\n'\n", - " ' (conv2): Conv2d(4, 10, kernel_size=(5, 5), stride=(1, 1))\\n'\n", - " ' (fc1): Linear(in_features=250, out_features=100, bias=True)\\n'\n", - " ' (fc2): Linear(in_features=100, out_features=10, bias=True)\\n'\n", - " ' )\\n'\n", - " '), loss=CrossEntropyLoss(), optimizer=Adam (\\n'\n", - " 'Parameter Group 0\\n'\n", - " ' amsgrad: False\\n'\n", - " ' betas: (0.9, 0.999)\\n'\n", - " ' capturable: False\\n'\n", - " ' differentiable: False\\n'\n", - " ' eps: 1e-08\\n'\n", - " ' foreach: None\\n'\n", - " ' fused: None\\n'\n", - " ' lr: 0.003\\n'\n", - " ' maximize: False\\n'\n", - " ' weight_decay: 0\\n'\n", - " '), input_shape=(32, 32, 3), nb_classes=10, channels_first=False, '\n", - " 'clip_values=array([0., 1.], dtype=float32), preprocessing_defences=None, '\n", - " 'postprocessing_defences=None, '\n", - " 'preprocessing=StandardisationMeanStdPyTorch(mean=0.0, std=1.0, '\n", - " 'apply_fit=True, apply_predict=True, device=cuda:0)), predict_kwargs={})')\n", - "('baseline.scenario=Scenario(function=, \"\n", - " 'kwargs={}, export_batches=True)')\n" - ] - } - ], - "source": [ - "pprint(f\"{baseline.model=}\")\n", - "pprint(f\"{baseline.scenario=}\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here we are using a prefab ART model and the standard Armory Image Classification Task\n", - "scenario.\n", - "\n", - "Because this is a \"baseline\" evaluation, it includes no defense, but does use a PGD\n", - "attack to calculate adversarial results.\n", - "\n", - "The optional `Metric` field tells Armory that we want to record additional metrics for\n", - "this evaluation. In this case, we are interested in the accuracy of the model on\n", - "adversarial examples." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "('baseline.attack=Attack(function=, \"\n", - " \"kwargs={'batch_size': 1, 'eps': 0.031, 'eps_step': 0.007, 'max_iter': 20, \"\n", - " \"'num_random_init': 1, 'random_eps': False, 'targeted': False, 'verbose': \"\n", - " \"False}, knowledge='white', use_label=True, type=None, generate_kwargs={}, \"\n", - " 'sweep_params={}, targeted=False, targeted_labels={})')\n", - "(\"baseline.metric=Metric(profiler_type='basic', \"\n", - " \"supported_metrics=['accuracy'], perturbation=['linf'], \"\n", - " \"task=['categorical_accuracy'], means=True, record_metric_per_sample=False)\")\n" - ] - } - ], - "source": [ - "pprint(f\"{baseline.attack=}\")\n", - "pprint(f\"{baseline.metric=}\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `charmory.blocks` module is intended as a convenient parts cabinet that allows\n", - "users to quickly assemble evaluations using standard components. They behave as standard\n", - "Python objects, so you can alter the canned definitions:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "baseline.metric = None" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you'd prefer to not have additional tracking. Also, the sub-components of an evaluation\n", - "are themselves objects, to be composed at user discretion:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "charmory.blocks.cifar10.metric=Metric(profiler_type='basic', supported_metrics=['accuracy'], perturbation=['linf'], task=['categorical_accuracy'], means=True, record_metric_per_sample=False)\n" - ] - } - ], - "source": [ - "print(f\"{charmory.blocks.cifar10.metric=}\")\n", - "\n", - "# let's put the metric back into baseline\n", - "baseline.metric = charmory.blocks.cifar10.metric" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Instantiation of the `Engine` class using the `Evaluation` object in `baseline` is\n", - "straightforward:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "import charmory.engine\n", - "engine = charmory.engine.EvaluationEngine(baseline)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Evaluation: 100%|██████████| 157/157 [09:53<00:00, 3.78s/it]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2023-07-26 16:36:16 10m \u001b[34mMETRIC \u001b[0m \u001b[36marmory.instrument.instrument\u001b[0m:\u001b[36m_write\u001b[0m:\u001b[36m743\u001b[0m benign_mean_categorical_accuracy on benign examples w.r.t. ground truth labels: 0.0999\n", - "2023-07-26 16:36:16 10m \u001b[34mMETRIC \u001b[0m \u001b[36marmory.instrument.instrument\u001b[0m:\u001b[36m_write\u001b[0m:\u001b[36m743\u001b[0m adversarial_mean_categorical_accuracy on adversarial examples w.r.t. ground truth labels: 0.0773\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "result = engine.run()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'armory_version': '23.4.0.post113+g0e7be67a.d20230713',\n", - " 'evaluation': Evaluation(name='cifar_baseline',\n", - " description='Baseline cifar10 image classification',\n", - " model=Model(name='pytorch cifar',\n", - " model=art.estimators.classification.pytorch.PyTorchClassifier(model=ModelWrapper(\n", - " (_model): Net(\n", - " (conv1): Conv2d(3, 4, kernel_size=(5, 5), stride=(1, 1))\n", - " (conv2): Conv2d(4, 10, kernel_size=(5, 5), stride=(1, 1))\n", - " (fc1): Linear(in_features=250, out_features=100, bias=True)\n", - " (fc2): Linear(in_features=100, out_features=10, bias=True)\n", - " )\n", - "), loss=CrossEntropyLoss(), optimizer=Adam (\n", - "Parameter Group 0\n", - " amsgrad: False\n", - " betas: (0.9, 0.999)\n", - " capturable: False\n", - " differentiable: False\n", - " eps: 1e-08\n", - " foreach: None\n", - " fused: None\n", - " lr: 0.003\n", - " maximize: False\n", - " weight_decay: 0\n", - "), input_shape=(32, 32, 3), nb_classes=10, channels_first=False, clip_values=array([0., 1.], dtype=float32), preprocessing_defences=None, postprocessing_defences=None, preprocessing=StandardisationMeanStdPyTorch(mean=0.0, std=1.0, apply_fit=True, apply_predict=True, device=cuda:0)),\n", - " predict_kwargs={}),\n", - " scenario=Scenario(function=,\n", - " kwargs={},\n", - " export_batches=True),\n", - " dataset=Dataset(name='CIFAR10',\n", - " test_dataset=,\n", - " train_dataset=),\n", - " author='msw@example.com',\n", - " attack=Attack(function=,\n", - " kwargs={'batch_size': 1,\n", - " 'eps': 0.031,\n", - " 'eps_step': 0.007,\n", - " 'max_iter': 20,\n", - " 'num_random_init': 1,\n", - " 'random_eps': False,\n", - " 'targeted': False,\n", - " 'verbose': False},\n", - " knowledge='white',\n", - " use_label=True,\n", - " type=None,\n", - " generate_kwargs={},\n", - " sweep_params={},\n", - " targeted=False,\n", - " targeted_labels={}),\n", - " metric=Metric(profiler_type='basic',\n", - " supported_metrics=['accuracy'],\n", - " perturbation=['linf'],\n", - " task=['categorical_accuracy'],\n", - " means=True,\n", - " record_metric_per_sample=False),\n", - " sysconfig=SysConfig(gpus=['all'], use_gpu=True)),\n", - " 'results': {'adversarial_mean_categorical_accuracy': [0.0773],\n", - " 'benign_mean_categorical_accuracy': [0.0999],\n", - " 'compute': {'Avg. CPU time (s) for 157 executions of Attack': 3.6688439361337464,\n", - " 'Avg. CPU time (s) for 157 executions of Inference': 0.013240570993672287},\n", - " 'perturbation_mean_linf': [0.03100001811236143]},\n", - " 'timestamp': 1690403183}\n" - ] - } - ], - "source": [ - "from pprint import pprint\n", - "pprint(result)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Recap\n", - "\n", - "There is a bunch of explanation and debug prints in this notebook, but the\n", - "working code used is quite short:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import charmory.blocks.cifar10\n", - "import charmory.engine\n", - "\n", - "baseline = charmory.blocks.cifar10.baseline\n", - "engine = charmory.engine.EvaluationEngine(baseline)\n", - "result = engine.run()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.4" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/notebooks/import_experimental.ipynb b/examples/notebooks/import_experimental.ipynb deleted file mode 100644 index afbb81640..000000000 --- a/examples/notebooks/import_experimental.ipynb +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The charmory and armory-examples packages have been installed with\n", - "\n", - " pip install -e .[all]\n", - " pip install -e examples[all]\n", - "\n", - "where the `all` is important. We confirm their installation with:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[01;31m\u001b[Karm\u001b[m\u001b[Kory-examples 23.8.post0+gb5668ede.d20230828 /home/msw/ch\u001b[01;31m\u001b[Karm\u001b[m\u001b[Kory/examples\n", - "ch\u001b[01;31m\u001b[Karm\u001b[m\u001b[Kory 23.8.post0+gb5668ede.d20230828 /home/msw/ch\u001b[01;31m\u001b[Karm\u001b[m\u001b[Kory\n" - ] - } - ], - "source": [ - "! python -m pip list | grep arm" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Import using package name. That is, we load the feature *module* and then \n", - "call a method from that module" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "short and stout\n" - ] - } - ], - "source": [ - "import charmory.experimental.feature as feature\n", - "print(feature.a_little_teapot(n=1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now import a single method from the module" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "kookaburra sits in the old gum tree\n" - ] - } - ], - "source": [ - "from charmory.experimental.feature import kookaburra\n", - "print(feature.kookaburra())\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Remember: if you are working on a notebook and add a new method to feature.py,\n", - "you must restart the Ipython kernel in order that it can see the new code." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "cdao", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/notebooks/incr2honaker.ipynb b/examples/notebooks/incr2honaker.ipynb deleted file mode 100644 index c790e37e1..000000000 --- a/examples/notebooks/incr2honaker.ipynb +++ /dev/null @@ -1,640 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "f204ae97", - "metadata": {}, - "source": [ - "## Step1: Basic Data Analysis, Data wrangling and Setup for PCA & Visualizations. " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "4b853a97", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Start TimeDurationRun IDNameSource TypeSource NameUserStatusJaticVisionDatasetGenerator._funcJaticVisionDatasetGenerator.batch_size...load_dataset.providerload_dataset.splitload_dataset.taskload_model._funcload_model.model_nameload_model.providerload_model.taskadversarial_mean_categorical_accuracybenign_mean_categorical_accuracyperturbation_mean_linf
02023-09-07 17:52:509.7min8e67d421ee3a46de947652d213227e7fgrandiose-lynx-117LOCALmodel_and_parameter_evaluation/mrm8488--convne...ubuntuFINISHEDcharmory.data.JaticVisionDatasetGenerator.__in...128...huggingfacevalidationimage-classificationjatic_toolbox._internals.interop.api.load_modelmrm8488/convnext-tiny-finetuned-eurosathuggingfaceimage-classification0.9451850.9851850.020000
12023-09-07 17:46:056.8mindb92fb7fb8d441cbb604f51c7fd7d624big-skink-852LOCALmodel_and_parameter_evaluation/mrm8488--convne...ubuntuFINISHEDcharmory.data.JaticVisionDatasetGenerator.__in...128...huggingfacevalidationimage-classificationjatic_toolbox._internals.interop.api.load_modelmrm8488/convnext-tiny-finetuned-eurosathuggingfaceimage-classification0.9737040.9851850.020000
22023-09-07 17:37:5623.7min995a5112f1d7455da35a9929bbcd62b9adorable-cow-816LOCALmodel_and_parameter_evaluation/nielsr--swin-ti...ubuntuFINISHEDcharmory.data.JaticVisionDatasetGenerator.__in...128...huggingfacevalidationimage-classificationjatic_toolbox._internals.interop.api.load_modelnielsr/swin-tiny-patch4-window7-224-finetuned-...huggingfaceimage-classification0.8055560.9781480.012000
32023-09-07 17:28:2417.7minedb723a7442940fb833ce809f13e9b64hilarious-yak-384LOCALmodel_and_parameter_evaluation/mrm8488--convne...ubuntuFINISHEDcharmory.data.JaticVisionDatasetGenerator.__in...128...huggingfacevalidationimage-classificationjatic_toolbox._internals.interop.api.load_modelmrm8488/convnext-tiny-finetuned-eurosathuggingfaceimage-classification0.8355560.9851850.018000
42023-09-07 17:26:4121.6minff28d01c25e144ecb2f682a6280f055cthundering-robin-603LOCALmodel_and_parameter_evaluation/nielsr--vit-fin...ubuntuFINISHEDcharmory.data.JaticVisionDatasetGenerator.__in...128...huggingfacevalidationimage-classificationjatic_toolbox._internals.interop.api.load_modelnielsr/vit-finetuned-eurosat-korniahuggingfaceimage-classification0.9214810.9666670.011997
\n", - "

5 rows × 40 columns

\n", - "
" - ], - "text/plain": [ - " Start Time Duration Run ID \\\n", - "0 2023-09-07 17:52:50 9.7min 8e67d421ee3a46de947652d213227e7f \n", - "1 2023-09-07 17:46:05 6.8min db92fb7fb8d441cbb604f51c7fd7d624 \n", - "2 2023-09-07 17:37:56 23.7min 995a5112f1d7455da35a9929bbcd62b9 \n", - "3 2023-09-07 17:28:24 17.7min edb723a7442940fb833ce809f13e9b64 \n", - "4 2023-09-07 17:26:41 21.6min ff28d01c25e144ecb2f682a6280f055c \n", - "\n", - " Name Source Type \\\n", - "0 grandiose-lynx-117 LOCAL \n", - "1 big-skink-852 LOCAL \n", - "2 adorable-cow-816 LOCAL \n", - "3 hilarious-yak-384 LOCAL \n", - "4 thundering-robin-603 LOCAL \n", - "\n", - " Source Name User Status \\\n", - "0 model_and_parameter_evaluation/mrm8488--convne... ubuntu FINISHED \n", - "1 model_and_parameter_evaluation/mrm8488--convne... ubuntu FINISHED \n", - "2 model_and_parameter_evaluation/nielsr--swin-ti... ubuntu FINISHED \n", - "3 model_and_parameter_evaluation/mrm8488--convne... ubuntu FINISHED \n", - "4 model_and_parameter_evaluation/nielsr--vit-fin... ubuntu FINISHED \n", - "\n", - " JaticVisionDatasetGenerator._func \\\n", - "0 charmory.data.JaticVisionDatasetGenerator.__in... \n", - "1 charmory.data.JaticVisionDatasetGenerator.__in... \n", - "2 charmory.data.JaticVisionDatasetGenerator.__in... \n", - "3 charmory.data.JaticVisionDatasetGenerator.__in... \n", - "4 charmory.data.JaticVisionDatasetGenerator.__in... \n", - "\n", - " JaticVisionDatasetGenerator.batch_size ... load_dataset.provider \\\n", - "0 128 ... huggingface \n", - "1 128 ... huggingface \n", - "2 128 ... huggingface \n", - "3 128 ... huggingface \n", - "4 128 ... huggingface \n", - "\n", - " load_dataset.split load_dataset.task \\\n", - "0 validation image-classification \n", - "1 validation image-classification \n", - "2 validation image-classification \n", - "3 validation image-classification \n", - "4 validation image-classification \n", - "\n", - " load_model._func \\\n", - "0 jatic_toolbox._internals.interop.api.load_model \n", - "1 jatic_toolbox._internals.interop.api.load_model \n", - "2 jatic_toolbox._internals.interop.api.load_model \n", - "3 jatic_toolbox._internals.interop.api.load_model \n", - "4 jatic_toolbox._internals.interop.api.load_model \n", - "\n", - " load_model.model_name load_model.provider \\\n", - "0 mrm8488/convnext-tiny-finetuned-eurosat huggingface \n", - "1 mrm8488/convnext-tiny-finetuned-eurosat huggingface \n", - "2 nielsr/swin-tiny-patch4-window7-224-finetuned-... huggingface \n", - "3 mrm8488/convnext-tiny-finetuned-eurosat huggingface \n", - "4 nielsr/vit-finetuned-eurosat-kornia huggingface \n", - "\n", - " load_model.task adversarial_mean_categorical_accuracy \\\n", - "0 image-classification 0.945185 \n", - "1 image-classification 0.973704 \n", - "2 image-classification 0.805556 \n", - "3 image-classification 0.835556 \n", - "4 image-classification 0.921481 \n", - "\n", - " benign_mean_categorical_accuracy perturbation_mean_linf \n", - "0 0.985185 0.020000 \n", - "1 0.985185 0.020000 \n", - "2 0.978148 0.012000 \n", - "3 0.985185 0.018000 \n", - "4 0.966667 0.011997 \n", - "\n", - "[5 rows x 40 columns]" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pandas as pd\n", - "from sklearn.preprocessing import StandardScaler\n", - "import plotly.graph_objects as go \n", - "import numpy as np\n", - "import seaborn as sns\n", - "import matplotlib.pyplot as plt\n", - "from sklearn.decomposition import PCA\n", - "df = pd.read_csv(\"eurosat_model_eval_09102023.csv\")\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "f68e39b6", - "metadata": {}, - "outputs": [], - "source": [ - "# PCA \n", - "features = ['ProjectedGradientDescent.eps', 'ProjectedGradientDescent.eps_step','ProjectedGradientDescent.max_iter']" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "7e3a2333", - "metadata": {}, - "outputs": [], - "source": [ - "x = df.loc[:, features].values" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "ad9d0c07", - "metadata": {}, - "outputs": [], - "source": [ - "y = df.loc[:,['adversarial_mean_categorical_accuracy']].values" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "b52b3973", - "metadata": {}, - "outputs": [], - "source": [ - "x = StandardScaler().fit_transform(x)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "d80c1614", - "metadata": {}, - "outputs": [], - "source": [ - "pca = PCA(n_components=3)\n", - "\n", - "principalComponents = pca.fit_transform(x)\n", - "\n", - "principalDf = pd.DataFrame(data = principalComponents\n", - " , columns = ['principal component 1', 'principal component 2', 'principal component 3'])" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "a19d65da", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
principal component 1principal component 2principal component 3adversarial_mean_categorical_accuracy
01.277573-0.223385-0.00.945185
11.813629-0.7594410.00.973704
2-0.0363361.6790440.00.805556
3-0.2570311.4583490.00.835556
40.4997211.1429880.00.921481
...............
95-0.5301910.1130770.00.912963
96-0.714104-0.0708360.00.868148
97-0.5301910.1130770.00.839259
98-0.178047-0.606892-0.00.911481
990.005865-0.422980-0.00.930000
\n", - "

100 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " principal component 1 principal component 2 principal component 3 \\\n", - "0 1.277573 -0.223385 -0.0 \n", - "1 1.813629 -0.759441 0.0 \n", - "2 -0.036336 1.679044 0.0 \n", - "3 -0.257031 1.458349 0.0 \n", - "4 0.499721 1.142988 0.0 \n", - ".. ... ... ... \n", - "95 -0.530191 0.113077 0.0 \n", - "96 -0.714104 -0.070836 0.0 \n", - "97 -0.530191 0.113077 0.0 \n", - "98 -0.178047 -0.606892 -0.0 \n", - "99 0.005865 -0.422980 -0.0 \n", - "\n", - " adversarial_mean_categorical_accuracy \n", - "0 0.945185 \n", - "1 0.973704 \n", - "2 0.805556 \n", - "3 0.835556 \n", - "4 0.921481 \n", - ".. ... \n", - "95 0.912963 \n", - "96 0.868148 \n", - "97 0.839259 \n", - "98 0.911481 \n", - "99 0.930000 \n", - "\n", - "[100 rows x 4 columns]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "finalDf = pd.concat([principalDf, df[['adversarial_mean_categorical_accuracy']]], axis = 1)\n", - "finalDf" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "176a9389", - "metadata": {}, - "outputs": [], - "source": [ - "finalDf['model_name'] = df['load_model.model_name']" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "cc6e92aa", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABF8AAAHQCAYAAAB3BMXOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3gUVRfA4d/upvdCEkISQggh1EBCCL1K7yAgUhUERRBRUVHsqNgbFhQRBZReBESk9xJ6L4EUEhLSe9s23x8LC5GEhKaY77zPw6PZnbkzszs7986Ze89VKYqiIIQQQgghhBBCCCHuC/W/vQNCCCGEEEIIIYQQlZkEX4QQQgghhBBCCCHuIwm+CCGEEEIIIYQQQtxHEnwRQgghhBBCCCGEuI8k+CKEEEIIIYQQQghxH0nwRQghhBBCCCGEEOI+kuCLEEIIIYQQQgghxH0kwRchhBBCCCGEEEKI+0iCL0IIIYQQQgghhBD3kQRfhBBCCCGEEEIIIe4jCb4IIYQQQgghhBBC3EcSfBFCCCGEEEIIIYS4jyT4IoQQQgghhBBCCHEfSfBFCCGEEEIIIYQQ4j6S4IsQQgghhBBCCCHEfSTBFyEqIDg4mE2bNt337SxevJh27dpRp04dfv75Z2bOnEnfvn3v+3b/bR07duTnn3/+t3dDPKBu9/c3depUnn766fu4R3dnxIgRvPfee/+5sh8ED8p3ey+uWfv37yc4OJicnJx7s1OVgKIovP7660RERBAcHMyZM2cq/TkNkJCQYD5eIcryX6kL77TNLL9/+f3/U/dbf/dP/lYk+HKfHT9+nFGjRhEeHk7Tpk0ZM2YMZ8+eLXXZuLg4QkNDCQ8Pv+m9n3/+ma5duxISEkK7du14//33KS4uNr9vMBj44osv6NixIyEhIXTq1IlvvvkGRVFuKmvEiBEsXbr03h3kf0BFG8plBTt27dpF27Zt78OeXZeXl8f06dMZO3YsO3bs4JFHHmH06NH3PCixYsWKUs8xcX9IpXr3/onfX1nux/Vy5syZPPvss3dVRlk37vei7H/KP9GofuONNwgODr7n19Fly5bxyCOP3NMy77WpU6cSHBx807+ePXuWuY5Op+Pjjz+md+/eNG7cmNatW/PSSy+RnJxsXiYhIYFXX321RHvjq6++QqvVllrmrdo2f7djxw5WrlzJrFmz2LVrF0FBQfflnH5Qgnj/L6TdcW/8V+rCG/fzdtpA8vuvnP4Lv/9p06bxwQcf/CPbkuBLORRFQa/X39G6+fn5jB07lmrVqrFkyRJ+++037O3tGTNmDDqdrsSyOp2O559/vtSTc82aNXz66adMnDiRdevW8d5777Fu3To+++wz8zKzZ89m4cKFvPHGG6xbt44pU6bw448/Mn/+/BJlZWVlceTIETp06HBHx/T/ysPDAysrq/u6jcTERHQ6He3atcPT0xNbW1vs7e1xdXW9r9v9f1bWzYJ4sPwTv79rbjwn7tf10sXFBQcHh3ta5j9R9n/Nxo0bOXbsGJ6enve8bDc3N2xtbe95uffStGnT2LVrl/nf9u3bcXFxoVu3bmWuU1RUxOnTpxk/fjwrVqzg66+/JiYmhvHjx5uXiY6ORlEU3nnnHf744w9eeeUVFi1axOeff35Tebdq25QmPj4eDw8PwsLC8PDwwMLCQs7p++zv7VHx4Pqv1IV3up/y+//nVfbff0Xb+Y6Ojjg5Od3nvTG5q+CLoigUaPX/2L/SenGUZ8SIEUyfPp333nuPpk2b0rJlS5YsWUJBQQGvvPIKoaGhdO7cme3btwPXnyZu376dAQMG0LBhQw4dOnTb5YCpgZKVlcWkSZOoWbMmQUFBTJgwgbS0NBITE0vs5xdffEHNmjXp3r37Tcdw5MgRwsLC6N27N76+vrRu3ZpevXpx/PjxEss89NBDtG/fHl9fX7p160br1q1LLAOwbds26tWrR5UqVQCIioriySefJCwsjNDQUIYOHcqlS5cAMBqNfP3117Rt25YGDRrQt29fduzYYS7rWjR7w4YNjBgxgkaNGtGnTx+OHDkCmHpyhISElPhMwNQgDg0NpbCwsNwyrjl48CBDhw419/x59913KSgoAGDVqlWEhoYSGxtrXv6tt96iW7duFBYWMmLECC5fvsyMGTPMT/5Kc62hefbsWfNyK1asAEp2gytvnwsKCggLC2P9+vUlyt+0aRONGzcmLy+v1G337t0bgE6dOhEcHExCQsJNPXGuRevnzJlD69atadasGW+//XaJi6dWq+XDDz+kTZs2NG7cmEGDBrF//37AdH6/8sor5Obmmo9x5syZNx3jNeHh4ebP4F58VwDp6ek89dRThISE0LFjR1avXl3q9/F3SUlJPPvss4SHhxMREcH48eNJSEgwv1/aU/Snn36aqVOnmv/u2LEj33zzDS+99BJhYWG88cYbAPz111/07NmTBg0a0LFjR3766acS5fz666906dKFhg0b0rJlSyZNmmR+b8eOHTz66KOEh4fTrFkznnzySfNvCOChhx4CoF+/fgQHBzNixIgKHe89oyigzf9n/93mtXrEiBG8++67fPTRR0RERNCqVSvzeQk3n5vlnQt/t379enr37k1ISAjNmjXjscceM5+T135T3333Ha1bty5xY3rj9TI7O5sXXniB5s2bExISQpcuXVi+fDkAkyZN4p133jGv99577xEcHMzFixcB02+ycePG7Nmzx3y8N56rHTt2ZNasWea6pH379ixevLjM40lISGDkyJEANG3alODgYPN5frtljxw5ssS+A2RkZNCgQQP27t1b6vav1ZPbtm2jd+/eNGzYkMGDB3P+/HnzMpmZmTz//PO0adOGRo0a0bt3b9auXWt+f+rUqURGRjJv3jzztejad3ireumaW10DAZKTk5k+fTqffPIJlpaWZX6W1wwYMIA5c+aY/3766aepX78++fn5AFy5coXg4GDi4uLMn+uNvWmCg4NZunQpEyZMoFGjRnTp0oXNmzeX2Mb27dvNPViv1Ut/d6tr0YIFC+jVq5f5702bNhEcHMzChQvNrz322GPmIIijoyMeHh7mfydPniQ7O5sBAwaU+Tk4Ojoyd+5cevToQc2aNWncuDGvv/46p06dMrdb2rZty4wZM2jdujV+fn489NBDjB49mg0bNtxU3q3aNn83depUpk+fTmJiIsHBwXTs2BG4s9/Lra4RM2fOZOXKlWzevNl87u3fv7/U3mRnzpwpcW5ee4K7c+dOunfvTmhoKGPGjCElJaXE9pcuXUr37t1p2LAh3bp149dffy3x/vHjx+nXrx8NGzZkwIABFe4ZWV79WtF6fN26dQwfPpyGDRuyZs2actt7Wq2Wd955h9atW9OwYUM6dOjA999/b35/7ty55t5S7dq146233jL/dm7V7vgnKYpCga7gH/13u/ctD3pd6ObmRtu2bfntt99KlHv69Gnq1KljvqbduJ8VbQPJ7798/4+//6+++orWrVubR42U114vrZ1fke/t772hymvb3w2LO11RURQGztrLobjMe7IjFRHu78rSp1qgUqlua72VK1fyxBNPsHTpUtatW8dbb73Fxo0b6dy5M08++SQ///wzL730Etu2bTOv8+mnn/Lyyy/j5+dnjoTdTjm2trYEBATg4uLCsmXLePLJJzEajSxbtozAwEB8fHzM29q7dy/r16/n999/L7XxEhoayurVqzl+/DghISHEx8ezffv2EjfloaGhLFmyhJiYGAICAjh79iyHDh0qceMJsGXLFvOFMDk5meHDhxMREcEvv/yCg4MDhw8fNvf0mTdvHnPnzuWdd96hbt26LF++nKeffpq1a9dSo0YNc5mff/45L7/8Mv7+/nz++ee88MILbNiwAQcHB9q3b8/atWtp166defk1a9bQqVOnEk8NyyrDwsKCS5cuMXbsWJ599lnef/99MjIymD59OtOnT2fGjBn069ePrVu3MmXKFBYtWsSuXbtYtmwZixYtwtbW1hzAGDx4MIMHDy7zPOnRowdRUVHs3LmTuXPnAqaGaFnK2mc7Ozt69uzJihUrSlRey5cvp2vXrqVG8Hv06IG3tzePPfYYS5cuxdvbGzc3t1K3u3//fjw8PPjll1+4dOkSzz33HHXr1jUf2zvvvMOFCxf4/PPP8fT0ZOPGjTzxxBOsWbOG0NBQXn31Vb766itzcMjOzq7MY7yd467IdwWmC1xKSgrz5s3DwsKCd999l/T09FtuU6fTMWbMGBo3bsyvv/6KhYUF3377LU888QSrV6++rScsP/30ExMmTGDixIkAnDx5ksmTJzNx4kR69OjBkSNHePvtt3FxcWHAgAGcOHGC9957j48++ojQ0FCys7M5ePCgubzCwkIef/xxgoODKSgo4Msvv2TChAn8/vvvqNVqli5dyqBBg/j555+pVatWhW4E7xlFgZ+6Qvz+f26bAH7NYfR6uI1r9cqVK3n88cdZsmQJR48eZerUqYSFhdGqVasSy93uuZCSksILL7zAiy++SKdOncjPz+fgwYMlGsV79+7FwcHB/Lu/5sbr5ZdffsnFixeZPXs2rq6uXLp0iaKiIsAUALmx8XfgwAFcXV2JjIwkMDCQEydOoNfrCQ0NLfP4586dy6RJk3jqqaf466+/eOutt2jatCk1a9a8aVlvb29mzpzJM888w/r163FwcMDGxuaOyh40aBDTp09n6tSp5s9u9erVeHp60rx58zLLBPjoo4+YNm0aVapU4fPPPzeXb2lpiVarpX79+owdOxYHBwe2bdvGSy+9RPXq1QkJCWHatGnExsYSFBRk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I4UvIiIiIiIiIiJ+pPBFRERERERERMSPFL6IiIiIiIiIiPiRwhcRERERERERET9S+CIiIiIiIiIi4kcKX0RERERERERE/Ejhi4iIiIiIiIiIHyl8ERERERERERHxI4UvIiIiIiIiIiJ+pPBFRERERERERMSPFL6IiIiIiIiIiPiRwhcRERERERERET9S+CIiIiIiIiIi4kcKX0RERERERERE/Ejhi4iIiIiIiIiIHyl8ERERERERERHxI4UvIiIiIiIiIiJ+pPBFRERERERERMSPFL6IiIiIiIiIiPiRwhcRERERERERET+yBroAEZH/9sADD7Br1y4KCwuJioqid+/eTJgwgSZNmgS6NBERERERkYumli8iUu/06tWLF154gXXr1jF79mwOHz7Mww8/HOiyREREREREfhK1fBGReuc3v/mN7+dmzZpx3333MW7cOFwuF0FBQYErTERERERE5CdQyxcRqdeKi4t5//33SU9PV/AiIiIiIiKXJIUvIlIvTZ8+nS5dutCzZ0/y8/OZP39+oEsSERERERH5SRS+iEideP7550lNTT3vtG/fPt/2o0ePZvXq1bz22muYzWYyMjIwDCOAVyAiIiIiIvLTqM8XEakT9957L4MHDz7vNi1atPD9HB0dTXR0NK1atSI5OZn+/fuzbds20tPT/V2qiIiIiIhIrVL4IiJ14myY8lN4vV4AnE5nbZYkIiIiIiJSJxS+iEi9sn37drKzs7nqqquIjIwkNzeXWbNm0bJlS7V6ERERERGRS5LCFxGpV0JCQvjwww+ZM2cODoeDuLg4+vbty9ixY7HZbIEuT0RERERE5KIpfBGReiU1NZUlS5YEugwREREREZFao9GORERERERERET8SOGLiIiIiIiIiIgfKXwREREREREREfEjhS8iIiIiIiIiIn6k8EVERERERERExI8UvoiIiIiIiIiI+JGGmhaRBskwDADKysoCXImIiIhcqLPP7bPPcRGRhkLhi4g0SOXl5QD0798/wJWIiIjIxSovLyciIiLQZYiI1BqToVhZRBogr9fL8ePHCQsLw2QyBbocERERuQCGYVBeXk58fDxms3pIEJGGQ+GLiIiIiIiIiIgfKU4WEREREREREfEjhS8iIiIiIiIiIn6k8EVERERERERExI8UvoiIiIiIiIiI+JHCFxERERERERERP1L4IiIiIiIiIiLiRwpfRERERERERET8SOGLiIiIiIiIiIgfKXwREalHHnjgAa699lrS0tLo06cPjz76KAUFBYEuq04cOXKExx9/nAEDBtCpUyduuOEGZs+ejdPpDHRpdebFF1/kzjvvpHPnznTr1i3Q5dSJZcuWMWDAANLS0hg2bBg7duwIdEl1ZvPmzTzwwAP06dOH1NRUPv7440CXVKdefvllhg4dSnp6Or1792bs2LHs378/0GXVqeXLl3PLLbfQtWtXunbtyvDhw9m4cWOgywqYV155hdTUVJ555plAlyIiUusUvoiI1CO9evXihRdeYN26dcyePZvDhw/z8MMPB7qsOrF//34Mw2DKlClkZmby2GOP8dZbbzFz5sxAl1ZnXC4XN954I3fddVegS6kTWVlZTJ06lXHjxrF69Wratm3L6NGjKSwsDHRpdcLhcJCamspTTz0V6FIC4quvvuKee+7h7bffZtGiRbjdbkaPHo3D4Qh0aXWmadOmTJgwgVWrVvHOO+/Qq1cvxo0bx549ewJdWp3bsWMHb731FqmpqYEuRUTEL0yGYRiBLkJERM5t/fr1jBs3juzsbIKCggJdTp1buHAhb775JuvXrw90KXVq1apVPPvss3z99deBLsWvhg0bRlpaGk8++SQAXq+X/v37M3LkSO6///4AV1e3UlNTmTdvHjfccEOgSwmYoqIievfuzdKlS+nevXugywmYHj168OijjzJs2LBAl1JnysvLGTJkCE899RQvvvgibdu2ZdKkSYEuS0SkVqnli4hIPVVcXMz7779Penr6ZRm8AJSWlhIVFRXoMsQPnE4n3377LVdffbVvmdls5uqrr2br1q0BrEwCpbS0FOCy/Tfv8XjIzMzE4XCQnp4e6HLq1JQpU+jfv3+N3wciIg2NNdAFiIhITdOnT2fZsmVUVFTQpUsXXnrppUCXFBCHDh1i6dKlZGRkBLoU8YNTp07h8XiIiYmpsTwmJuay6/dDqls9Pfvss3Tt2pWUlJRAl1Ondu/ezZ133klVVRV2u5158+bRpk2bQJdVZzIzM9m5cycrV64MdCkiIn6l8EVExM+ef/55FixYcN5tsrKySE5OBmD06NHcfvvt5OXlMXfuXDIyMnj55ZcxmUx1UW6tu9jrBygoKGDMmDHceOON3HHHHf4u0a9+yvWLXG4mT57Mnj17WL58eaBLqXOtWrVizZo1lJaW8sEHH5CRkcHSpUsviwAmPz+fZ555htdee43g4OBAlyMi4lcKX0RE/Ozee+9l8ODB592mRYsWvp+jo6OJjo6mVatWJCcn079/f7Zt23bJNkO/2OsvKChg1KhRpKen8/TTT/u7PL+72Ou/XDRu3BiLxfKDznULCwuJjY0NUFUSCFOmTGHDhg0sXbqUpk2bBrqcOmez2UhKSgKgY8eOZGdns2TJEqZMmRLgyvzv22+/pbCwkCFDhviWeTweNm/ezLJly8jOzsZisQSwQhGR2qPwRUTEz86GKT+F1+sFuKSHW76Y6z8bvHTo0IGpU6diNl/6XZP9nD//hsxms9GhQwc2bdrk62TW6/WyadMmRowYEeDqpC4YhsHTTz/NRx99xBtvvHFZhpDn4vV6L+nf+RejV69evP/++zWWPfbYY7Ru3Zr77rtPwYuINCgKX0RE6ont27eTnZ3NVVddRWRkJLm5ucyaNYuWLVtesq1eLkZBQQEjR44kMTGRjIwMioqKfOvi4uICWFndycvL4/Tp0+Tl5eHxeMjJyQGgZcuWhIWFBbi62vfb3/6WjIwMOnbsSKdOnVi8eDEVFRU1/he8ISsvLyc3N9c3f+TIEXJycoiKiiIxMTGAldWNyZMns3btWubPn09YWBgnTpwAICIigpCQkABXVzdmzJhBv379SEhIoLy8nLVr1/LVV1/x6quvBrq0OhEeHv6DPn7sdjuNGjW67Pr+EZGGT+GLiEg9ERISwocffsicOXNwOBzExcXRt29fxo4di81mC3R5fvevf/2LQ4cOcejQIfr161dj3e7duwNUVd2aPXs2q1ev9s0PGjQIgCVLltCzZ88AVeU/v/zlLykqKmL27NmcOHGCdu3asXDhwsvms6NvvvmGUaNG+eanTp0KwODBg5k2bVqgyqozb775JgAjR46ssXzq1KmXTQBXWFhIRkYGx48fJyIigtTUVF599VWuueaaQJcmIiK1zGQYhhHoIkREREREREREGqpL/2N6EREREREREZF6TOGLiIiIiIiIiIgfKXwREREREREREfEjhS8iIiIiIiIiIn6k8EVERERERERExI8UvoiIiIiIiIiI+JHCFxERERERERERP1L4IiIiIiIiIiLiRwpfRERELlFHjhwhNTWVnJycWjvmgAEDeP3112vteABz5szhtttuq9VjioiI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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "sns.set_style(\"white\")\n", - "\n", - "ax = sns.kdeplot(x=finalDf['principal component 1'], y=finalDf['principal component 2'],hue=finalDf['model_name'])\n", - "sns.move_legend(ax, \"lower center\", bbox_to_anchor=(.5, 1), ncol=3, title=None, frameon=False)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "d3083108", - "metadata": {}, - "outputs": [], - "source": [ - "finalDf_convnext = finalDf[finalDf.model_name == 'mrm8488/convnext-tiny-finetuned-eurosat']\n", - "finalDf_swin = finalDf[finalDf.model_name == 'nielsr/swin-tiny-patch4-window7-224-finetuned-eurosat']\n", - "finalDf_vit = finalDf[finalDf.model_name == 'nielsr/vit-finetuned-eurosat-kornia']" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "f9e0653d", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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68rsvby8AO37deDAAWbNmoW3tzfm5ubFet3Url0bAwMDli5dSlpaGsbGxjRt2rSAV1FZMDIyokuXLqxbtw4DA4NCo3/Pim7dunHw4EG+/PJLAgICaNSoEWq1muDgYA4dOsSyZct006l169blzJkzrFy5EkdHR6pVq4aPjw+dO3fm559/ZuLEiQwePJjs7Gw2btyIq6trPl+W0vDRRx8REBBAnz596N27N+7u7qSkpHD9+nXOnDnDuXPnAOjTpw/r169n6tSpXL9+HQcHB3bv3q33lJClpSUzZszgk08+oWfPnnTu3BlbW1siIyM5duwYjRo14n//+x+gnS5ctWoVI0eOpFevXiQkJLBp0ybc3d3JyMjQ63j6fPcyMjJo06YNb7zxBl5eXpibm3P69GmuXr2q8xZyc3OjevXq/PDDD8TExGBpacnhw4cLFTB5v1PffvstLVu2fO6fuVcNIW4ELwVubm5s376d33//nT179hAfH4+joyMjRowoc4uD0uxzxowZeHl5sW3bNl0llbe3Nz/88IPO4+fs2bMolcpC81latWrF6tWrmT9/PitWrECSJJydnfNVjzRv3pxly5YxZ84c5syZg6GhIY0bN+bjjz9+oihBpUqVaNiwIRcuXKB3795P1A7A3d2d7du3M2/ePHbu3ElycjK2trbUqVOHCRMmAPDXX3/pPEoe9aCZNm0ap0+fZurUqWzbtg0jIyMGDBjAzZs32bFjB6tWraJq1arFihsHBwe++uorFi9ezGeffYZarWbNmjVPRdyAVlSsW7eOZs2a6aJFzwO5XM78+fNZtWoVu3fv5s8//8TMzIxq1aoxePDgfMmv06ZN43//+x+///472dnZ9OjRAx8fHypWrMi8efP4/vvv+emnn3SeSKGhoWUWN/b29mzdupX58+fz559/snHjRipUqIC7u3u+6kQzMzNWrVrFN998w7p16zA1NaVr1660bt2aUaNG6XWsrl274ujoyJIlS1i+fDlKpRInJyf8/Pzy5V/VrFmTH374gTlz5jBr1izc3d358ccf2bdvn05slYQ+3z1TU1P69+/PqVOn+OOPP5AkierVq+sEP2gF8qJFi/j2229ZvHgxJiYmvP766wwcOLCAB1LHjh0ZPHgw+/fvZ8+ePUiSJMTNU0QmPZ4NKhAIysSMGTO4du1aoW6tgpeDW7du0a1btwI5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AwcOMH78eDp37szw4cNZvnw5Wq22zPO8detW5s+fT9euXRk5ciQHDx40/nylM6h69uyJv78/CxcurPB5tLKy4r333uPhhx/+zwycFf7bRHAjCI3Yzp07USgUbN26lTfffJMffviBrVu3lrnOmjVrCAgIYNeuXVUeN3z55ZcsXLiQ7du3o1AoeOONN4zfO3LkCM888wyDBw9m165drFu3ji5dulS5tq+++opRo0bxyy+/MG7cOF566SWuX79u/L61tTWLFy9mz549vPnmm2zdurVGeTupqalMnToVMzMz1q1bx44dO5gwYYLxzX/9+vWsXbuWBQsW8OuvvzJgwADmzZvHzZs3y9zPsmXLmDt3Ljt37sTExISXX36ZTz/9lDfffJNNmzYRFxfHV199VeY2J0+e5Pr162zYsIEvvviC/fv38/XXXxu//8knn/DHH3/w8ccfs3PnTlq3bs2cOXPIycmp9nMeGhrKggULmD59Onv37mXRokXs2LGDlStXlrmP5cuXM2bMGH799VcGDRrEK6+8Qk5ODi1btmTZsmUA7Nu3j2PHjvHmm29W+/kVhGZNEgShUZo6dao0ZswYSa/XGy/79NNPpTFjxhi/Hjp0qDRv3rwyt4uPj5f8/PykK1euSJIkSadOnZL8/PykEydOGK9z5MgRyc/PT1IqlZIkSdIjjzwivfzyy5WuZejQodLatWuNX/v5+Ulvv/12metMmjRJeueddyq9j++++04aP3688eulS5dK999/f6XX//zzz6Vhw4ZJarW6wu8PGDBA+uabb8pcNmHCBOndd9+VJOmf5+Hnn382fv+3334r91ysWrVKGjVqlPHrBQsWSL169ZKKioqMl23evFnq1q2bpNPppMLCQqlTp07Sr7/+avy+Wq2WBgwYIK1evVqSpOo95zNmzJBWrlxZZv27du2S+vfvb/zaz89P+vLLL41fFxYWSn5+ftLRo0fLPE5ubm6Fz1FFFixYIM2dO7fa1xeEpqj2DuUFQah1Xbt2RSaTGb/u1q0ba9euRafToVAoAAgMDKzWffn7+xv/XHo0kZmZiYeHB1evXmXSpEk1WltQUFCZr7t161amQmvv3r2sX7+e+Ph4ioqK0Gq12NjYVPv+r169So8ePTA1NS33vYKCAtLS0ggODi5zeXBwMBEREWUuu/XndnZ2rvCyW4+lSr9/a45RUFAQRUVFJCcnk5+fj0ajKfPYpqamdOnSpczO1b8f59/PeUREBOfOnSuzU6PT6VCpVBQXFxsf/9b7sLKywsbGptx6BUEoSwQ3gtDEVTfR99YE49KASa/XA2BhYVGrazp//jyvvPIKzz77LAMGDMDW1pY9e/awdu3aat9Hba3p1uCo9Of+93NR+jzUtqqe86KiIp599llGjhxZ7nbm5ubGP/87uKvL9QpCcyFybgShEbs1SRXg4sWLtG7d2rhrU1v8/Pw4efJkjW5z4cKFMl9fvHiRtm3bAobgxsPDg7lz59K5c2fatGlDUlJSje7f39+f0NDQCpOQbWxscHNz49y5c2UuP3fuHO3atavR41QkMjISpVJp/PrChQtYWVnRsmVLWrVqhampaZnH1mg0hIeH1+ixO3bsyI0bN2jdunW5/+Ty6r00lwY+Op2u2o8rCP8FIrgRhEYsKSmJxYsXExMTw2+//cbGjRuNFTK16ZlnnmHPnj0sXbqU69evExkZybffflvlbfbt28e2bdu4ceMGS5cuJSwsjKlTpwLQunVrkpOT2bNnD3Fxcaxfv54DBw7UaE2PPfYYBQUFvPTSS4SHh3Pz5k127dplrDiaPXs2q1evZu/evcTExPDZZ58RERFRK8+PWq3mzTffJDo6mqNHj7Js2TKmTp2KXC7HysqKKVOm8Mknn/DXX38RHR3NW2+9hVKpZOLEidV+jPnz5/PLL7+wfPlyoqKiuH79Onv27OHLL7+s9n14enoik8k4cuQIWVlZFBYWVnrd6Ohorl69Sk5ODvn5+Vy9erVWGz0KQmMijqUEoRF78MEHUSqVTJo0CYVCwfTp0+ukmV7v3r356quvWLFiBd9++y02Njb07Nmzyts8++yz7N27l/feew9XV1c+//xz487F8OHDmTFjBosWLUKtVjNkyBDmzp3L8uXLq70mR0dH1q1bx6effsq0adOQy+V06NCB7t27AzB9+nQKCgr4+OOPycrKom3btqxYsYI2bdrc8fNQqm/fvrRu3ZrHHnsMtVrN2LFjefbZZ43ff+WVV5Akiddee43CwkICAwP57rvvsLe3r/ZjDBw4kJUrV/L111+zevVqTExM8PX1rVHuk7u7O88++yyff/45r7/+Og8++CAff/xxhdd98sknSUxMNH794IMPAoZdKkFobmSSdEvTDEEQGo1p06YREBDQKMt7/f39+frrrxkxYkRDL6XWLVy4kLy8PFasWNHQSxEE4Q6JYylBEARBEJoVEdwIgiAIgtCsiGMpQRAEQRCaFbFzIwiCIAhCsyKCG0EQBEEQmhUR3AiCIAiC0KyI4EYQBEEQhGZFBDeCIAiCIDQrIrgRBEEQBKFZEcGNIAiCIAjNighuBEEQBEFoVkRwIwiCIAhCs/L/oSIXLlyVKIIAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "sns.kdeplot(x=finalDf_convnext['principal component 1'], y=finalDf_convnext['principal component 2'])\n", - "plt.title('mrm8488/convnext-tiny-finetuned-eurosat')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "316c00fa", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "sns.kdeplot(x=finalDf_swin['principal component 1'], y=finalDf_swin['principal component 2'])\n", - "plt.title('nielsr/swin-tiny-patch4-window7-224-finetuned-eurosat')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "991fde8e", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAHHCAYAAACyWSKnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd3QU5duGr03vvZFKSEgChBJC7yAdVEAEpHdQsYOC5bPXnwWVIipFQEBAiiC9Sw2ElgAJpJLee90y3x8bVkLLJqT7XudwNLO7M+9ONjP3PuV+ZJIkSQgEAoFAIBA0InTqegECgUAgEAgE1Y0QOAKBQCAQCBodQuAIBAKBQCBodAiBIxAIBAKBoNEhBI5AIBAIBIJGhxA4AoFAIBAIGh1C4AgEAoFAIGh0CIEjEAgEAoGg0SEEjkAgEAgEgkaHEDiCRkG/fv1YuHBhlV7r6+vLjz/+WM0rqhrnzp3D19eXc+fOPdZ+YmJimD59OoGBgfj6+nLo0CG2bduGr68v8fHx1bTaho84J1XnzrkLCQmp66VoeJzrgKDxIQSOQFBDHDlyBD8/P9LS0h5rP7t27WLNmjWVes3ChQu5efMmr732Gl999RX+/v6PtQZtKSoq4scff3xsgSaofaryORMI6jN6db0AgaA62LdvHzKZrK6XUY5jx47RqlUr7O3ttX5Nx44duXr1Kvr6+pptu3fv5tatW0ydOlWrfRQXF3Pp0iXmzp3LxIkTNduffvpphg0bhoGBgdbrqSxFRUUsWbKEefPm0blz5xo7jqD6qeznrD5SH68DgrpDRHAEjQIDA4NyoqAuKCoqKvfziRMn6NOnT6X2oaOjg6GhITo6Vf/TzMzMBMDCwqLcdl1dXQwNDcUNoB5TUlKCSqWq62XUCxQKBaWlpZV6TX24DgjqD0LgCOo1P/74I76+vsTGxrJw4UI6dOhAYGAgixYtKicoHpR7z83N5dNPP6V37974+/szYMAAfv755wpvIPn5+Xz66af069cPf39/unbtyrRp07h27ZrmOZMmTWL48OGEhoYyYcIE2rZty7fffqt5PDw8nKSkJHr37k16ejotW7ZkyZIl9x0rKioKX19f1q9fD9xfgzNp0iSOHTtGQkICvr6++Pr60q9fv0eer759+wLw1VdflXv+g+pN+vXrx5w5c7hw4QKjR4+mdevWPPHEE+zYseO+fVd0PuPj4+natSsAS5Ys0az3Tn3TpEmTmDRp0n37XbhwYbn3FB8fj6+vLytXruSPP/6gf//++Pv788wzz3D16tX7Xh8ZGcnLL79Mp06daN26NaNGjeLw4cP3Pe/WrVtMnjyZNm3a0KtXL5YtW1ZpMbFz505GjRpFmzZt6NSpE6+99hpJSUnlnvOwOpB73/+d3/Xff//Nd999R8+ePWnbti35+fkA7N27V3Oszp07M3/+fFJSUsrtMy0tjUWLFtGrVy/8/f3p0aMHzz//fLnf8aFDh5g9ezY9evTA39+f/v37s3TpUpRKZbm1VeZz9jBycnIYPXo0vXr1IioqCoCMjAzefvttunXrRuvWrXnqqafYvn17udfd/Ttfs2YN/fv3p3Xr1kRGRmp9DXjQuc/OzubLL7/kySefJCAggPbt2zNz5kzCwsIq/d4EDQ+RohI0CF599VVcXV15/fXXuX79Olu2bMHGxoYFCxY88PlFRUVMnDiRlJQUxo0bR5MmTbh06RLffvstaWlpvPPOOw891vvvv8/+/fuZOHEiXl5eZGdnExwcTGRkJK1atdI8Lzs7m1mzZjFs2DCeeuopbG1tNY8dP34cW1tbWrdujUwmo2PHjuzdu5d58+aVO9aePXvQ1dVl8ODBD1zL3LlzycvLIzk5mUWLFgFgamr60LUPGDAAc3NzPv/8c4YPH06vXr0e+XyA2NhYXnnlFUaPHs3IkSP5888/WbhwIa1ataJ58+Zan08bGxs++OADPvjgAwYMGMCAAQMAdRF3Vdi9ezcFBQWMHTsWmUzGr7/+yksvvcShQ4c039Jv3brFc889h6OjI7NmzcLExIS9e/fy4osv8uOPP2rWkJaWxuTJk1EqlcyePRtjY2M2b96MoaGh1utZvnw533//PUOGDGH06NFkZmayfv16JkyYwI4dO+6LmGnLsmXL0NfXZ8aMGZSWlqKvr8+2bdtYtGgRrVu35vXXXycjI4O1a9dy8eLFcsd66aWXiIiIYOLEibi4uJCZmcmpU6dISkrC1dUVgO3bt2NiYsK0adMwMTHh7Nmz/PDDD+Tn5/PWW28Blf+cPYjMzEymT59OTk4O69evx93dneLiYiZNmsTt27eZMGECrq6u7Nu3j4ULF5Kbm8uUKVPK7WPbtm2UlJQwZswYDAwMsLS01DxW2WsAQFxcHIcOHWLw4MG4urqSnp7OH3/8wcSJE/n7779xdHSs1HsUNDAkgaAe88MPP0g+Pj7SokWLym1/8cUXpU6dOml+7tu3r/TWW29pfl66dKnUrl07KTo6utzrvv76a6lFixZSYmKiZpuPj4/0ww8/aH4ODAyUPvzww0eua+LEiZKPj4+0cePGBz4+fvz4cuvZtGmT5OPjI4WHh5d73tChQ6XJkydrfj579qzk4+MjnT17VrNt9uzZUt++fR+5nruJi4uTfHx8pF9//bXc9j///FPy8fGR4uLiNNv69u0r+fj4SOfPn9dsy8jIkPz9/aUvvvhCs03b85mRkXHf+bzDxIkTpYkTJ963/a233ir3/u6sv1OnTlJ2drZm+6FDhyQfHx/pyJEjmm1TpkyRhg8fLpWUlGi2qVQqaezYsdLAgQM12z799FPJx8dHunLlSrn3GRgYeN85eRDx8fFSixYtpOXLl5fbHh4eLrVs2bLc9ns/iw97/3d+10888YRUVFSk2V5aWip17dpVGj58uFRcXKzZfvToUcnHx0f6/vvvJUmSpJycnAf+nu/l7n3f4b333pPatm1b7rxV9nN25/N09epVKTU1VRo2bJj0xBNPSPHx8ZrnrFmzRvLx8ZF27txZ7v2NHTtWateunZSXlydJ0r+/8/bt20sZGRnljqPtNUCS7j/3JSUlklKpLPecuLg4yd/fX1qyZInW71XQMBEpKkGDYNy4ceV+7tChA9nZ2Zpw/r3s27ePwMBALCwsyMzM1Pzr1q0bSqWS8+fPP/RYFhYWXLly5b50wL0YGBgwatSo+7bn5uZy+fJlevfurdk2YMAA9PT02LNnj2bbzZs3iYiIYOjQoY88Tk3j7e1Nhw4dND/b2Njg6elJXFycZtvjnM+qMnTo0HLf4O+s8c66srOzOXv2LEOGDCE/P1+zpqysLHr06EFMTIzmd3j8+HHatWtHmzZtyr3PJ598Uqu1HDx4EJVKxZAhQ8q9fzs7Ozw8PB6ra2zEiBEYGRlpfg4NDSUjI4PnnnuuXISpT58+NGvWjGPHjgFgZGSEvr4+QUFB5OTkPHT/d+/7znnq0KEDRUVFmjTS45CSksLEiRORy+X8/vvvuLi4aB47ceIE9vb2DB8+XLNNX1+fSZMmUVhYeN/nZuDAgdjY2DzwOJW9BoD6b/ROPZtSqSQrKwsTExM8PT25fv16pd+roGEhUlSCBoGzs3O5n++E6HNycjAzM7vv+bGxsYSHh2tqQu7lTiHug5g/fz4LFy6kT58+tGrVit69ezNixAjc3NzKPc/R0fGBHUknT54EoEePHpptNjY2dOnShb179/Lqq68C6vSUnp6eJo1SWe5tPzc3Ny93M9OWJk2a3LfN0tKy3E3zcc5nVbl3XXfETm5uLgC3b99GkiS+//57vv/++wfuIyMjA0dHRxITE2nbtu19j3t6epb7OS8vj+LiYs3P+vr6WFlZERMTgyRJDBw48IHH0dOr+qX0TirpDomJiQ9cG0CzZs0IDg4G1Dfv+fPn8+WXX9K9e3fatm1Lnz59GDFiRLnOvVu3brF48WLOnj17nxjIy8urcH0Vfc4WLFigEe/3dgwmJCTg4eFxX9G8l5dXufd6h3vPxd1U9hoAoFKpWLt2LRs2bCA+Pr5c3ZGVldVDjyVoHAiBI2gQPKyrSJKkB25XqVR0796dmTNnPvDxpk2bPvRYQ4cOpUOHDhw8eJBTp06xcuVKfvnlF3788cdyUZmHiYnjx4/Tvn17zM3Ny20fNmwYixYt4saNG7Ro0YK9e/fSpUuXh35jrYi7BRTA559//sCIUkXo6upW+JzHOZ8VcfdNR5t13fmd3ykQnj59Oj179nzgc93d3Su1lk8//bRcAWynTp1Yt24dKpUKmUzGL7/88sB1mZiYVLhvpVL5wNdWRZTeYerUqfTr149Dhw5x8uRJvv/+e37++Wd+++03WrZsSW5uLhMnTsTMzIyXX34Zd3d3DA0NuXbtGl9//bVWRdYVfc4GDhzIjh07WLt2LW+88UaV3ws8+lxU9hoA8NNPP/H999/zzDPP8Morr2BpaYmOjg6fffbZI18naBwIgSNolLi7u1NYWEi3bt2q9HoHBwcmTJjAhAkTyMjIYOTIkfz000/lBM6DkCSJf/75h+nTp9/3WP/+/fm///s/TZoqJiaGOXPmVLiWh7V1r169utzP3t7eFe6rqmh7Ph/Vgm5paVku7XWHe7/Fa8udiJq+vn6F63J2diY2Nva+7dHR0eV+njlzJk899ZTm5ztRAnd3dyRJwtXV9YGRlbuxtLTURJnuJjEx8b4o4MPWemdt90bMoqOj74tkuLu7M336dKZPn05MTAwjRoxg1apVfP311wQFBZGdnc2SJUvo2LGj5jUPcm6u6uds4sSJuLu788MPP2Bubs7s2bM1j7m4uBAeHo5KpSonUO6kxu59L9XN/v376dy5M5999lm57bm5uVhbW9fosQV1j6jBETRKhgwZwqVLl/jnn3/ueyw3NxeFQvHA1ymVyvvC9ra2tjg4OGjlyRESEkJGRsYD/W8sLCzo0aMHe/fu5e+//0ZfX5/+/ftXuE9jY+MHphK6detW7p+Dg0OF+6oq2p5PY2NjzbZ7cXNzIyoqqlw6KywsjIsXL1ZpTba2tnTq1Ik//viD1NTU+x6/+zi9e/fm8uXL5drMMzMz2bVrV7nXeHt7lzundxygBw4ciK6uLkuWLLnvm78kSWRlZZV7n1euXCn3eTl69Oh97eQPw9/fH1tbWzZt2lRuH8ePHycyMlLz2SoqKqKkpKTca93d3TE1NdW87o6ouHvNpaWlbNiw4b7jPs7n7MUXX2T69Ol888035fbdq1cv0tLSytWeKRQK1q1bh4mJSTnRVRPo6ure9/vau3dvhfV1gsaBiOAIGiUzZszgyJEjzJ07l5EjR9KqVSuKioq4efMm+/fv5/Dhww9MDRUUFNC7d28GDRqEn58fJiYmnD59mpCQEK1m3Bw7dgwXF5eHRlOGDh3KggUL2LBhAz169NCqtbhVq1bs2bOHzz//nNatW2NiYlIlj5LHQdvzaWRkhLe3N3v37qVp06ZYWVnRvHlzfHx8GD16NGvWrGHGjBmMHj2ajIwMNm3ahLe3NwUFBVVa1/vvv8/48eN58sknGTNmDG5ubqSnp3P58mWSk5P566+/AHVkZufOncycOZPJkydr2sSdnZ0JDw+v8Dju7u68+uqrfPPNNyQkJNC/f39MTU2Jj4/n0KFDjBkzhhkzZgDw7LPPsn//fmbOnMmQIUO4ffs2u3bt0jpdpq+vz/z581m0aBETJ05k2LBhmjZxFxcXjdNwTEwMU6dOZfDgwXh7e6Orq8uhQ4dIT09n2LBhAAQEBGBpacnChQuZNGkSMpmMnTt3PjA987ifs7feeov8/Hw++ugjTE1Nefrppxk7dix//PEHCxcu5Nq1a7i4uLB//34uXrzI22+//dDameqiT58+LF26lEWLFhEQEMDNmzfZtWuXVpE0QcNHCBxBo8TY2Jh169axYsUK9u3bx44dOzAzM6Np06a89NJL99XH3MHIyIjnnnuOU6dOceDAASRJwt3dXXMjrYjjx48/Mo3Vr18/jIyMKCgo0Lp7avz48dy4cYNt27axZs0aXFxcal3gVOZ8fvLJJ3z88cd8/vnnyOVy5s2bh4+PD15eXnz55Zf88MMPfP7553h7e/PVV1+xe/dugoKCqrQub29v/vzzT5YsWcL27dvJzs7GxsaGli1b8uKLL2qe5+DgwNq1a/nkk0/4+eefsbKyYty4cTg4ODzSE+luZs+eTdOmTVmzZg1Lly4FwMnJie7du5f7ffTs2ZOFCxeyevVqPvvsM/z9/fnpp5/48ssvtX5fo0aNwsjIiF9++YWvv/4aExMT+vfvz4IFCzSi2MnJiWHDhnHmzBn++usvdHV1adasGYsXL2bQoEEAWFtba469ePFiLCwseOqpp+jatatGkN2hOj5nH374IYWFhbz99tuYmprSv39/1q1bx9dff8327dvJz8/H09OzyvVilWXu3LkUFRWxa9cu9uzZQ8uWLVmxYgXffPNNjR9bUPfIJFFpJRBUC+np6fTo0YMVK1ZUWKsjEAgEgppF1OAIBNVEXl4eL774ohgyKRAIBPUAEcERCAQCgUDQ6BARHIFAIBAIBI0OIXAEAoFAIBA0OoTAEQgEAoFA0OgQAkcgEAgEAkGj4z/lg6NSqUhNTcXU1PSRlvICgUAgEAjqD5IkUVBQgIODw0Pnkt3Lf0rgpKamCn8SgUAgEAgaKMePH8fJyUmr5/6nBI6pqSmgPkE1bREuEAgEAoGgesjPz6d3796a+7g2/KcEzp20lJmZmRA4AoFAIBA0MCpTXiKKjAUCgUAgEDQ6hMARCAQCgUDQ6BACRyAQCAQCQaNDCByBQCAQCASNDiFwBAKBQCAQNDqEwBEIBAKBQNDoaDBt4hs2bGDjxo0kJCQA0Lx5c1544QVh3CcQCAQCgeA+GozAcXJyYv78+Xh4eCBJEjt27ODFF19k+/btNG/evK6XJxAIBAKBoB7RYAROv379yv382muvsXHjRi5fviwEjkAgEAgEgnI0GIFzN0qlkn379lFYWEhAQEBdL0cgEAgEAkE9o0EJnPDwcMaNG0dJSQkmJiYsXboUb2/vul6WQCAQCASCekaD6qLy9PRkx44dbN68meeee4633nqLiIiIul6WQCAQCASCekaDEjgGBgZ4eHjg7+/PG2+8gZ+fH2vXrq3rZQkEAoFAIKhnNCiBcy8qlYrS0tK6XoZAIBAIBIJ6RoOpwfnmm2/o1asXTZo0oaCggN27dxMUFMTKlSvremkCgUAgEAjqGQ1G4GRkZPDWW2+RmpqKubk5vr6+rFy5ku7du9f10gQCgUAgENQzGozA+eyzz+p6CQKBQCAQCBoIDboGRyAQCAQCgeBBCIEjEAgEAoGg0SEEjkAgEAgEgkaHEDgCgUAgEAgaHULgCAQCgUAgaHQIgSMQCAQCgaDRIQSOQCAQCASCRocQOAKBQCAQCBodQuAIBAKBQCBodAiBIxAIBAKBoNEhBI5AIBAIBIJGhxA4AoFAIBAIGh1C4AgEAoFAIGh0CIEjEAgEAoGg0SEEjkAgEAgEgkaHEDgCgUAgEAgaHULgCAQCgUAgaHQIgSMQCAQCgaDRIQSOQCAQCASCRocQOAKBQCAQCBodQuAIBAKBQCBodAiBIxAIBAKBoNEhBI5AIBAIBIJGhxA4AoFAIBAIGh1C4AgEAoFAIGh0CIEjEAgEAoGg0SEEjkAgEAgEgkaHEDgCgUAgEAgaHULgCAQCgUAgaHQIgSMQCAQCgaDRIQSOQCAQCASCRodeXS9AIBAIHkSxXEl6fgk5RXJyixQUliookispkatQSRKSBMhAX1eGvq4OJga6GOvrYW6kh7WpAdYm+pgYiEucQPBfRfz1CwSCOkGlkojLKuRWSj5R6flEpxeSkF1EQlYhqbkl5JUoHvsYpga6OFgY0cTSCFdrY9ysTfC0N8XL3gxPO1OM9HWr4Z0IBIL6iBA4AoGgxlGpJCLT8rkUl83V+GxCEnK5mZxHkVz5yNcZ6OpgaaKPhZEepoZ6GOnpYqivg66ODB2ZDEmSUKgkShUqiuVK8ksU5BUryC6UU6pUUVCqJDq9gOj0gvv2rSODpnam+DmZ08rZktYulrR1tcLSRL+mToNAIKhFhMARCATVjiRJRKYVcPJWGqciM7gQk0lWofy+5xno6eBtb0Yze1M87UxxszbBxdoYJ0sj7M0NMTfUQyaTVen4BaVK0vJKSMktJjG7iPisIm5nFhKVlk9Eaj65xQqi0gqISitgT0iy5rXNHczo0NSGLs1s6Opli4O50WOdC4FAUDcIgSMQCKqFYrmS05HpHL6RytGwVBJziss9bqyvS1s3dZTE38WSFk0saGprgp5u9fc6yGQyzAz1MDPUw9PO9L7HJUkiLa+E8JQ8biTlEpKQS0h8NjEZhdxKzedWaj4bg24D4O1gRs/mdvTysadrM1uR1hIIGghC4AgEgipTolBy4mY6u68mcvhGKvl31c0Y6OnQsak1Pbzt6dLMBn8XS/RrQMxUBZlMhoOFEQ4WRvRsbq/ZnpFfQnBsFkHRmZyOzOBGci4RqeqIz+pTMRjr69LLx44BLZ0Y0MJRpLMEgnqMEDgCgaBSSJLExdvZbA2OY09IMjlF/6aenCyMGNDSkX5+DnT1anjRDlszQwa2cmJgKycAsgtLOROZwYlbaRwLTyMpp5j911LYfy0FPR0ZXb1sebKtM4P9nbAwEmJHIKhPyCRJkup6EbVFfn4+gYGBBAcHY2ZmVtfLEQgaFDlFcv4Mjmdj0G1upeZrtjuYGzK8jTPD2jQhwM0KHZ3K18w0BCRJ4lpiLgeup7A/NJnwlDzNYwZ6OvRv4cDoQFd6NbevkbSbQPBfpir3bxHBEQgEj+RGUi6rT0Xz15VEiuUqAIz0dRjaugmj27vSuZktuo1U1NyNTCbD38USfxdLXh/gQ1RaPn9fTWLnlUQiUvPZE5LMnpBk7MwMGR3oyriObjR9QP2PQCCoHUQERyAQ3IckSRy/mcav/0RzMiJds93PyZwJnd15OsBFpGTKkCSJ60m5bA2O56/LiWQUlGoe69ncjoldPHjCz0FEdQSCx0BEcAQCwWOhUKrYfTWJn45HEpasTsHo6sgY7O/EtG5NCfSwrlLbdmNGJpPRytmSVs6WvD20BYdvpLLp/G2O30zjn1vp/HMrHWdLIyZ3a8pzndyxNBbCUCCoDYTAEQgEyJUqtl9MYNmxCGIyCgG1C/BzndyZ2r0prtYmdbzChoG+rg6D/Z0Y7O9EXGYh68/FsuVCPIk5xXyxN4wfDt9ibEc3ZvTwFOdUIKhhRIpKIPgPo1Cq2HYpgR8O3yI+qwgAG1MDpndvyqQuTUUbdDVQLFey60oiv/4TrSlM1tWRMbxNE17o442vk3kdr1AgqP+IFJVAINAKlUpid0gS3x28qRljYGdmyOxenkzo7IGpobg0VBdG+ro828GN0YGu/HMrnZ9PRHEyIp2dlxPZeTmRgS0dealfc1q7Wtb1UgWCRoW4igkE/yEkSeJoeCpf7QvX1NhYm+jzfB8vJnVpirFBw/KtaUjIZDJ6+djTy8ee0IQclh+LZE9oEgeup3Dgegr9Wzjy2oDmtHIWQkcgqA6EwBEI/iMEx2bx5b4wgqIzATA31GN2r2ZM6+GJmYjY1Cr+LpYsndCeiNQ8lh2NZMflBA7dSOHQjRSGtW7CawN88HYQaXSB4HFoMFe1FStWcODAAaKiojAyMiIgIID58+fTrFmzul6aQFCviUrL56t94ey7ph4oaaCnw7RuTXm+jxdWJgZ1vLr/Nt4O5nw7th0v9PXm+8O32H01kb9DktgbmsQz7V15bYAPzlbGdb1MgaBB0mCKjGfMmMGwYcNo3bo1SqWSb7/9llu3bvH3339jYqJdN4IoMhb8l0jLK+H7wzfZGBSHUiWhI4NnA914dUBzmliKm2Z9JCw5l28P3OTA9RQADPV0mNbdkxf6egnfIcF/mqrcvxuMwLmXzMxMunbtyvr16+nYsaNWrxECR/BfoLBUwcp/ovnpeCQFpUoA+vk5sHCIHz6OomOnIXDpdhaf7wkjKEadTrQxNeD1AT6M6+gmDAMF/0n+U11UeXnqAklLS1GQJxCAuuV784V4Fh+6SWpeCQBtXNXmc12a2dbx6gSVIcDdmj/mdOHwjVQ+33uDyLQC3t0Ryrozsbz/ZEu6edvV9RIFgnpPgxQ4KpWKzz77jPbt2+Pj41PXyxEI6hRJkjh0I5Uv94URUTYE09XamAWDfHmyjXOjHX7Z2JHJZPRv6UhvX3t+PxvL4sO3CE/JY/yv5xji78S7w1viIupzBIKH0iAFzocffsitW7fYsGFDXS9FIKhTLsRk8sXeMC7EZgHqlu+X+jVnQhd3DPVEy3djQF9Xh6ndPRkR4MK3B2+y/mwse0OTORqeykv9mjOzp6f4XQsED6DBCZyPPvqIY8eOsX79epycnOp6OQJBnXAzJY+v9oVz6Ia6GNVIX12M+nwfUYzaWLEyMeCjp/15rpM77/91jaDoTP63P5ytwfF8OsJfpK0EgntoMAJHkiQ+/vhjDh48yLp163Bzc6vrJQkEtU5sRgGLD91ix+UEJElt+T+mgxuv9m+Oo4VRXS9PUAu0aGLBH7O7sPNyIp/uuUF0egHjfz3HyAAX3hnWAjszw7peokBQL2gwAufDDz9k9+7dLFu2DFNTU9LS0gAwNzfHyEhc2AWNm4TsIpYejWDz+TgUKnXj4xB/J94Y6CsM4f6DyGQyRgS40K+FA1/vD2fd2Vi2X0rgaHgq7w5ryTPtXcTUd8F/ngbTJu7r6/vA7Z9//jmjRo3Sah+iTVzQ0EjOKWbZsQg2BcVRqlQB0MvHngUDff/Ts4tKFSqyC0vJK1FQVKqkRKGk7PSgqwOGeroY6etgbqSPhZE+Rvo6jfqGfyUum4XbQriRlAtAz+Z2fD6qtZhYLmg0/Kd8cKqCEDiChkJSThErjkexIeg2pQr1nbtrM1teG+BDJ0+bOl5dzSNJEvFZRYQn5xGVnk90egHxWUUk5RSTklNMXomiUvsz1tfFwcIQR3MjXKyNcbMxoamtCc0dzPFyMMXEoMEEsx+KXKni13+iWXzoJiUKFaYGuiwc4seEzh6ik07Q4PlP+eAIBI2R+KxClh+LZMuFeE3EpmNTa14f4EtXr8brZZNdWEpQdCaX4rK5dDuLawm5FYoYHRmYGephbKCLoZ4uujoyZIBSkiiRqyiSK8krlqOSoEiuJDajkNiMQogpvx+ZDDxtTWnlYkkbF0vae1jj72LR4DqT9HV1eL6PF4P9nXhr61WCYjJ5b+c19oQk89XoNrjZiGiO4L+FiOAIBPWAiNR8fjoeyY5LCZoam86eNrz8RHO6edk2uvRKiULJhZgsjoWncjIig7DkXO69EunryvB2MMfL3hRPO1PcbUxwtjLG0cIIOzMDLIz0K4xMSJJEfomCzIJSUvNKSMopJj6rkLjMQqLSCohMyyc9v/S+1xno6RDgZkVXL1t6eNvRzs2qQTkIq1QSa8/E8OW+cIrkSkwNdHl3eEvGdXRrdJ8lwX8DkaKqACFwBPWN0IQclh6NYN+1ZM0NvpuXLS8/0bzRuQ/nFss5GpbK/mvJHA9P04yRuIOXvSkdm9oQ4G5FG1crvB3M0K8FUZGRX8K1xFxCEnK4HJfNxdgsMgrKix4LIz16+tgzoIUjff0csDRuGK34MekFLNh6hfMxap+kJ/wc+PyZ1jiYi8YMQcNCCJwKEAJHUB+QJImTEemsOB7FyYh0zfaBLR15vo8XAe7Wdbi66qWoVMnBGynsvpLIsfA0TdoNwN7ckN4+9vTysadLM5t6c9OVJImo9ALORGZwJiqDk7fSySmSax7X05HR1cuWJ9s4M6iVE5Ym9VvsKFUSq05G87/94ZQqVdiYGvDFqNYMbCV8xAQNByFwKkAIHEFdolCq2BuazE/HI7mWqO520dWR8WSbJrzQ17vRDMKUJImg6Ez+vBjPnpBk8u+qpfGyN2WwvxMDWzrR2sWyQRS/KlUSl+OyORKWwoFrKdwqG4cB6jRaX18Hngl0pa+vAwZ69TeNFZ6cx6t/XNZ0Wj3XyZ33hrdoFAXWgsaPEDgVIASOoC4oKFHwx/k4Vp2KJj6rCFB39Yzt6MaMHp6NpvgzNbeYLcHxbLkQR0xGoWa7q7UxT7dz5sm2zvg6mjf4GpCotHz2hCSx+2oSYcl5mu02pgY8096FcZ3c8bKvn9eXEoWSbw/cZMWJKACa2Zvy43MBtHL+71oOCBoGQuBUgBA4gtokLa+EtWdiWHsmVpPisDE1YFIXD6Z2a4q1qUEdr/DxUanU6bYN525z6EaKpkDa1ECX4W2ceSbQlQ4e1g0iUlMVwpPz2HYxnu2XEjQT3AG6e9syuWtTnvBzqJfFyaci0nl982VScksw0NVh0VA/pnZr2uDFp6DxIgROBQiBI6gNbqXk8cs/Uey4lKipOWlqa8LMns0YHeiKkX7Daj9+EJkFpWy+EMeGc7e5nflvtKaDhzVjO7oxrE2T/1TqQ6FUcTQ8jT/O3+ZIWCplOg8XK2OmdW/KuE7umBnWr/ORWVDKm1uvauaZ9W/hyNfPtsHKpOELb0HjQwicChACR1BTSJLEuehMfjkRxeGwVM32AHcrZvVsxqBWTug28CiGJElcvJ3F+rO3+TskSWNAaG6kxzPtXXmukzu+To2jjuhxSMguYv3ZWDYF3SarUB25MzfUY2JXD6Z398TevP7MipIkibVnYvn07xuUKlU4Wxrx4/gAAj0av5mkoGEhBE4FCIEjqG6UKom9oUn8fCKKq/E5gNo4blBLJ2b1akagR8PviMovUbDzcgLrzsSWqzlp7WLJxC7uPNnW+T8VrdGWYrmSbRcT+PVkFFFpBQAY6ukwrqMbz/fxxsmyfnSNgdquYN6Gi8RkFKKnI+OtwX7M7OkpUlaCeoMQOBUgBI6guiiWK9kaHM8v/0Sp3XFR37yeCXRlZg9PmtXTItPKcC0xh41Bt9lxKVHTCWWop8PwNs5M6upBOzerul1gA0Glkjh0I4VlxyK5HJcNgIGuDs91cuPFvt441JMp8PklChZtC2HXlUQABrR05Otn2zYYzx9B40YInAoQAkfwuOQUyVl3JoZVp2LILDODszLRZ3LXpkzu6oGdWf1JP1SF/BIFf11OZNP525qIFEAzO1PGd3ZndKCrqNGoIpIkcSYyg8WHbhEUkwmAkb4OU7o15fneXvXivEqSxPpzt/l413VKlSrcbUxYPrG96LIS1DlC4FSAEDiCqpKaV8zKk9H8fva2Jprham3MjB6ejO3o1qBTNCqVxPmYTLYEx7MnJInCModhfV0ZA1s5Mb6Te6McF1FX3BE6Xx8I5+LtbEBdx/RiX2+mdmtaL4rQQ+JzeP73YOKzijDU0+HTka0ZHeha18sS/IcRAqcChMARVBbN8MvgeE1Rra+jOS/09WJY6yb1sgVYW+IyC/nzYjx/XownLrNIs72ZvSnjOrrxTHtXbBt4RKo+I0kSR8JS+d/+cE1tk4uVMW8N8ePJNk3qXFBmF5by2h+XORqeBsDELu68N7xlgxtCKmgcCIFTAULgCLQlOr2AZUcj2H7X8Mv27la80Mebfn4ODdbXJT2/hD0hSey8nEhwbJZmu5mhHsNaN2F0B7VvTV3fXLVFoVSRnFtMYnYx6fklZBSUklskp6hUSZFciUqSkCT1eAUjfV2MDXSxNNbH2sQAOzMDzfDOunQgVqoktl9K4JsD4STlFAMQ6GHN+0+2pI2rVZ2tC9TRvR+PRLD48E0kSd0V+NPEQBzrSd2Q4L+DEDgVIASOoCJiMwr44XAEOy4noCwTNj287XipnzedPG0azI3/bnKK5By4lsxfVxI5HZmheV8ymfq9jWrvwuBWTTA2qL/fzFUq9Xyoa4k5XE/M5VZqPhGp+SRkF2neT1XRkYGLtTHN7Mxo7mBGS2cLWjpb0NzBvFZb+4vlSn45EcWyY5EUyZXIZOpxCgsG+ta5KeTRsFRe2XSJ3GIF9uaG/DSxvWglF9QqQuBUgBA4gocRl1nIj0du8efFf4VNX197XnqiOe0b4PDL7MJSDlxPYW9IEicj0pEr//0zb+NqyVNt1aMT6us3cYVSxZX4HM5GZXAhJpPg2CxyixUPfK6Brg5NrIywNzPE1swACyN9TA31MNTXQVcmQyYDhVKiWK6O6mQXysksKCUtv4Sk7OJyA0DvxtRAl3buVnRsakM3LzvauVnVSqQnKaeIL/aGsfOyupvJ2kSft4e2YHSga50K7Jj0AuasCyY8JQ99XRkfPe3Pc53c62w9gv8WQuBUgBA4gntJzinmhyO32Hw+TpOK6u1jz6v9mze4qd5peSUcuJ7MvtBkzkRmaN4PQHMHM54sEzWedqZ1uMqHE5dZyLGbaRwPT+NsVEa5IZ2g7jhq0cQCf2dLfJzM8bY3w9POFAdzwyqnDCVJIi2vhOj0AiLTCriZksf1xFyuJ+Xed3wTA126ednRz8+BJ1o41Lg4PBuVwfs7rxGeoq7P6expw6cjW+PtUHfXroISBQu2XmFPSDKgrsv5v+Gt6vWQUUHjQAicChACR3CH7MJSlh2L5LfTMZSUFQ/3bG7Hq/19GpQ5X0x6AfuvJXPgegoXb2dx91+zn5M5Q1s3YYi/E83r4aRySZK4Gp/DwespHLyeormR38HKRJ8unrZ08rShY1MbWjQxr7WibqVK4mZKHhdiszgXlcGZyAwyymwBQJ3eC3S3ZlibJgxr0wQH85oRO3KlilUno/nu0E2K5SoMdHV4+Qlv5vT2Qr+OCtwlSWLZsUi+PhCOJEEnTxuWT2gvCtIFNYoQOBUgBI6gWK7kt9MxLD0aoUl5BHpY8+YgXzo3s63j1VWMJElcS8zlwPUU9ocm3ycK2rhaMtjfiSH+TeplpEahVBEUncm+a8kcuJZCcm6x5jEdmfp30cfXgd4+9rRsYlFvirlVKokbybkcDUvl0I1UjWEfqNfdo7k9z7R3YbC/U410GcVlFvLezlCOlXU0+TmZ8/WzbfF3qTt/msM3Unhl02XySxS4Whvz65QO+DlZ1Nl6BI0bIXAqQAic/y4qlcSuq4l8tS+chGx1S7SfkzlvDfajj699vS4elpeJgv3Xkjl4PUXTaQPq7qAuzWwZ2MqRAS0daWJpXIcrfTAlCiWnIzLYF5rMwRspGoNEUKd9+vjaM6ClI318HOq8mFZbErOL2BeazK6riVwq87IBdb3MM+1dmdjFg6bVLDAlSWLH5QQ+2nWdrEI5ejoyXuzrzYt9vessRXQrJY+Zay8Qm1GIqYEu348LoH9LxzpZi6BxIwROBQiB898kODaTj3Zd50qZM28TSyNeH+DDqPau9XYAZlGpkhO30jhwLYVDN1LIKZJrHjMx0KVnczsGtXLiCT9HLE3qn5V+brGcY+FpHLiWzLHwtHL1LNYm+vRv4ciQ1k5087KrF8Z2j0NMegHbLiWw5UJcOfHZx9ee6d096dncrloFdHp+Ce/tCGVvqLoOpmUTCxaPa4dPHaUhswtLeeH3i5yOzEAmg7cG+zGnV7N6/aVB0PAQAqcChMD5b5GQre5GuTNbx9RAlxf6ejO9u2e9bInOL1Fw+EYK+0LVoqBIrtQ8ZmtqQP8Wjgzyd6yXokCSJKLTCzgWnsbhsBTORWWWK3J2tDBkUCsnBrdyopOnTYM2SHwYSpXE8ZuprDsTqzHHA7UAmdO7WbUaQ0qSxO6rSfzfzlCyCuUY6Onw5iBfpnf3rJO0nlyp4oO/rvH7udsAjA505bORrUXxsaDaEAKnAoTA+W9QolDy6z/RLDkSofETGRPoxhuDfGqsGLSq3BE1e0KSOBaepil4BrWr7YCWjgz2d6JjU5t6F23KKZJzJjKDUxHpnLiVphk6eodm9qYMbOnEwFaOtHO1qjf1NLVBTHoBa07H8Mf5OI1QbWprwrx+zRnRzrnahE5qbjFv/XlVI6h6eNvxzZi2ddL+L0kSv52O4aPd11FJ0KmpDT9NCsSmgaQdBfUbIXAqQAicxs+Jm2n8385QYsputh2bWvP+k63qtBjzXorlSo6Fp7LzciJHwlLLiRpPO1OGtlYXCbdytqhXYf7MglKCY7MIis7gbFQm1xJzuNtjT19XRsemNmVt1I71ssi5tskqKGXtmVjWnI4mq1CdZmxqa8JrA3x4so1ztYg+SZLYEHSbT3bfoEiuxNpEn69Gt2VAHdXCHAtP5aUNl8grUeBha8KqqR3xshfXW8HjIQROBQiB03hJyS3mo93X+ftqEgAO5oa8PbQFT7dzrhciQaWSOBedyc7LCfwdkkTeXaZ1d0TN0NZNaNmkfogauVJFeHIel+OyuRyXzaXbWUSmFdz3PC97U3p429Hd245u3naYGTbcoaM1SUGJgvVnY1lxIkpTZO3nZM6ioS3o7WNfLceISM3nlU2XuJaYC8DUbk1ZNNSvTmZH3UrJY9qa88RnFWFprM9PEwPp6lX/uxQF9RchcCpACJzGh0olsfH8bb7YG0ZesQIdGUzt5snrA33qxc02NqOAP4Pj+fNigqZ7C9SFznfchOs6UlOiUHIrJZ/QhBxCE3MIScjlRlKuZrjo3Xg7mNGxqTVdmtnS2dMWJ8v6lfJ7EJIkUViqJLdYTl6xArlShVIlIUOGob4ORnq6WJnqY26oV+O/h4ISBatPRbPiRJRG5PZsbsc7w1pUS4t1iULJ//aF8+vJaABaOVuwdHz7au/o0ob0/BJmrb3ApdvZ6OvK+HxUGzGRXFBlhMCpACFwGhfR6QW89edVgqIzAbUHzGcjW9d5OqpYrmRvaBKbz8dzJipDs93cSI+h/k14OsCZLp62tV6Tcse190ZyHjeScglLyuVGUh6RafnlCoLvYGGkRxtXKwLcrWjnZkWAu3W9rqcoliu5lphLeHIet1LziEwrICGrkMTs4nIF2w/DQFcHe3ND3GyM8bAxpbmjGb5O5rRytqz2951dWMqSIxH8diYGuVJCRwYTu3jw+gAfrEwe/1hHwlJ4Y/MVsgrlmBnq8eUzbRjWpkk1rLxyFMuVzN9yhd1lkdWX+nnz+gCfehGlFDQshMCpACFwGgdKlcSqk9F8fSCcEoUKEwNd3hjoy9RuTeu0EDc6vYDfz8ayJThe09Z9Z6Dlsx3cGNjSsda6n+RKFZFp+eqxA4m53EjOJSwpr5wb791YGuvTytmC1i6WtHKxpI2LJR62JvX6RpSaW8zZ6EzOR2dyITaLmyl5jxy8qacjw9xID31dHfR0ZKgkKFWqKCxVUCx/8DyqO3jYmhDgZkXnZrb08LbDzcakWt5DbEYBX+wN07R8W5vos3CIH88Guj22AE7OKealjRc5H6OeGj+1W1PeHtqi1jubVCqJrw+Es+xYJAAj2jnz5eg2dZI6EzRchMCpACFwGj6RafnM33JFY67Ws7kdn49qjat19dxwKotSJXEkLJW1Z2L451a6ZruLlTFjOrgxuoMrLlY1a75XVKrkelIu1xJzCE3I4VpiLrdS8h84RFJHpq758WtiQcsmFvg5mdOiiQVNLI3qtZgBtQvyxdvZHA1P5Vh4GjeScu97jp2ZAa2cLfFxNMPL3gw3GxOcrYxxMDfExED3oe+xqFRJRkEJyTnFxGUVEpNeyM2UPMKS84hOv7/2yNPOlAEt1eaKge7Wjy1GTkek88Gua9xMyQfUxfGfjmz92N42CqWKrw/c5KfjanER4G7Fsgnt68QQcvP5ON7eHoJCJdGpqQ0rJgU2GGNHQd0jBE4FCIHTcFGpJNacjuHLfWGUKFSYG+rx7vAWjOngVic35oISBVsuxLHqVAy3M9UdWzIZ9PV1YFIXD3r52NdINEmpkriVmsel29lcvp3Nlfhsbqbk8aDAhZmhHi2aqFMsLZqY4+dkgY+jeb30AHoYucVyjoalciRMLWruNjwEdY3JnVlV7dysakSo5RTJuRKXzYWYTE5HZnA5LrtcSs/JwojhbZowIsDlsdKjcqWKNadi+O7QTQpLlejryni+jzcv9vV67GjH4RspvPbHZXKLFdiaGvDjcwF087Z7rH1WhZO30nl+fTB5JQqa2ZmyelpHPGxFt52gYmpc4Bw/fpwDBw5gaWnJM888g5eXl+axnJwcXnrpJdauXVv5ldcSQuA0TBKzi5i/5QqnI9X1LD2b2/HlM21wruHIyINIzSvmt9MxrDsTq5llZWmsz7iObkzs4lFtqYs7FJUquXg7i6DoTIJjs7h0O4uC0vvrSezNDWntYom/swUtnS1p2cQCNxvjeh+VeRBxmYUcvpHC4bBUzkZlIFf+e4myMtGnt489fXzt6dncHrs6GPCYX6LgxE21S/PhsNRyHXH+LhY818mdEe1cMK1ikXtidhH/t/Mah26kAOpJ8P97ti3t3Kwea923MwqZuz6Y60m56Mhg0ZAWzOzpWeufkfDkPKatDiIxpxgbUwN+ndKB9u4NZ8CtoG6oUYGza9cu3nrrLXr27EleXh6hoaF88sknPPXUUwCkp6fTs2dPbty4UfV3UMMIgdPw2H01kbe3hZBbrMBYX5e3h7VgYmf3Wr8ox2UWsuJEJJsvxGu6izztTJnevSnPBLpiYlA9HVslCiWXbmdzOiKd05EZXInPLneDB7Ujc2tXS9q7W9PWzYq2rlYNopvpYeQUyTkXdccwMP2+lJCXvSkDWjrxRAsHAtys6pULcolCyfHwNHZeSeTgtRRNWtDcUI9nO7gxtVtT3G0rL3olSeLvkCQ++Osa6fml6MhgTm8vXu3f/LGiOcVyJW9vD2HbxQQAnmzrzJfPtK62z6+2pOYWM/2384Qm5GKop8P349ox2L/2i6AFDYcaFTgjRoxg1KhRTJ48GYA9e/bwzjvv8Pbbb/Pss88KgSOoVgpLFXzw1zU2X4gHoK2bFd+NaUuzWjYMi80o4McjEWy/lKApYA1wt2Juby8GtHCslk6o2xmFHAlL4cStdM5EZtzX8dPE0ohOnjZ08LAm0MMGXyfzeudqrC2lin+Lny/HZXPxdhY3knLLpdh0dWQEulvTv6UD/Vs41vrvvKpkFpSy7WI8v5+7rRFpOjK1iHi+j1eV2sCzCkr5cNc1dlxWjxvxczLnu7HtaNGk6i3lkiSx7mwsH+26jkIl0aKJBT9PCqz26GNFFJQoeGnjJY6EpSKTwXvDWjK9h2etrkHQcKhRgRMQEMBff/2Fm5ubZtvZs2d5/vnnefPNNxkwYIAQOIJq4XpiLvM2XiQqrQCZDOb19eblJ5qjX4vf3OOzCvnxcARbL8ZrhE3P5na82Nebzp42jxVBUqkkrsRnc+B6Coeup3ArNb/c43ZmhnT1sqWHty1dm9k1mFSTQqkir1hBZmEpmQWlpOWVkJhdRFJOMbEZBUSnFxCbUfjAlvRmdqZ09bKlZ3N7unnbYmFU/waIaotKJXHiVhorT0aXKzwf3MqJ1wb44OtU+cLhfaHJvLsjhPT8Ugx0dZg/yIeZPZo9lsAOis7khd+DSc8vxcbUgKXj29e6GZ9CqeKDXddYf1Y9w2pa96a8O6xlgxXwgpqjRgVOjx49WLJkCe3atSu3PSgoiDlz5jB58mR+/vlnIXAEVeaO5fyHu65TqlDhZGHEd2Pb1epFNz2/hCVHIthw7rYm3dDH155X+/s8Vg2ESiVx8XYWu68msTc0iZTcEs1jujoyOja1po+vA72a29OiiXm1Cxq5UkV2oZzcYjm5RXLySxQUlCgoKFFSJFdSXPavRKGiRKGitOy/cqX6X2nZ/9/9WLFc/drCUiWFJYoH1gY9CHMjPfyczGnrqvbWae9hVSddPbVBaEIOy49Fsic0CUlSF6I/3daZNwb6Vjpikp5fwsI/r3LoRiqgth/4dkxbHB5j7lRidhFz1gUTkpCDno6MD55qxcQuHlXeX1WQJIkVJ6L4Ym8YAEP8nfhubLt6N1BWULfUqMB54YUX8PPz4+WXX77vsXPnzjF37lyKi4uFwBFUiYISBW9vD2FnWSi+n58D3zzbttbaSItKlfz6TxQ/HY/U3Ki7NrNl/iAfAj1sqrzfmyl5bL+UwF+XE8s5GZsZ6tHH154BLR3p4+uApXHVIhYqlURKXjHxWUUkZBWRmFNESk4xKbklpOWXkJ5fQmZ+KXkliop3Vk2YG+phY2aAnZkhTSyNaGJphLuNCU3tTGlmb4ZzA2hJr25upuSx+NBN9oSo/W4MdHWY1NWDl/s1x9JE+9+9JElsOh/HR7uuUyRXYmNqwNfPtqGfX9XnThXLlby59Sp/XVH/7U3q4sH/PdmyViOmAH9dSWT+5iuUKlUEeljz6+QOoo1coKFGBU5QUBCXLl1izpw5D3z87Nmz7Ny5k88//1z7FdcyQuDUTyJS83l+fTC3UvPR1ZHx5iBfZvV8vPC7tqhUEtsuJfC//WGaqEprF0veHOxLD2+7Kt2Ic4rk/HUlkS0X4rgan6PZbmaox8CWjgxr04Qeze0qVSwqV6qISisgLFntcRORmk9Uej6xGYXlhnU+CplMvQYLI33MjfQwNdTDxEAXEwNdjPV1MSr7Z6Cng4GuDgZ6OuiX/ddAV6b5WV9XByN9XQz1dNSvNdDF1EAPC2N9jZGe4MGEJuTw+d4bnIpQdwTamBqwYJAvYzq4VSotE5Gaz8sbL3G9zAtodq9mLBjkW+VzL0kSy49H8r/94UgSdPe2Zdn4wEqJr+rgbFQGs9deILdYQTN7U36b1qnWa4ME9RPhg1MBQuDUP/ZfS+b1Py5TUKrEwdyQJePb08mz6hGTynDpdhYf7LrOlbhsAFytjVkwyLdKU54lSeJSXDYbzt1m99VEjTOuno6Mvn4OjGjnwhMtHLQKu6tUEhFp+VyMzeJqQg4h8TmEJ+c90LgP1CkuZysjXKyMcbYyxsnCCEcLI+zNDbE3N8TW1ABrEwMsjPVFbUM9QJIkjt9M45O/bxBRVn/V2kU9ZqS1q/Y+OiUKJZ/vCWPN6RhAXfy+ZHz7xzKWPHg9hVc2XaKwVImnnSkrp3So9SLvWyl5TFmlbiO3MzNkzbSOdT5+RVD3CIFTAULg1B9UKonFh27yw5EIADp52rBkfAAO5jXf7pxZUMqXe8P440IcoI5qzOvnzbTuTSvdgluiUPL31STWnI4pF63xdTRnTEc3RrRzxrYCrxaVSuJaYi5notI5G5XJ+ZjMct4qdzAz1MPXyRwfR3O8HczwsjfF084UZytjETWpJlQqiewiOdmFpdy5MBrp62JralDtNSFypYp1Z2L57tBNzaDYKd2a8sZA30oNit0XmsybW6+QW6zA2kSfxeMCHmtC+Y2kXGb+doGEbPUk8OUT2te6KWByTjFTVwcRlpyHqYEuyycG0quapq4LGiZC4FSAEDj1g/wSBa9uuqwxMpvWXT0jp6Zv0pIkseVCPJ/tvUF2odoRd3SgK28O9q20sMoplPN7UCxrTsWQmqdObRno6TC8TRPGd3In0MP6kemttLwSjoWncuxmGqcj0skqLO/Qa6yvS1s3S9q6WdHGxQp/FwvcrE1qfUBnYyc1r5ijYallJorZxGYUPjRSZm6kRzN7M3wczGjlbEGghw0tmpg/ti9PWl4Jn/x9XVN/5mJlzGejWldKpMRlFvLC7xcJSchBJoOX+zXnlSeaV/nzkpZXwux16kngejoyPhnhz7hO7lXaV1XJLZbz/PpgTkVkoKcj48tn2vCMmEb+n0UInAoQAqfuicssZOZvFwhPycNAT4fPR7aulYtWVFo+b28P4WyUevK4n5M5n4zwp0PTyqXDUvOKWflPNOvPxmqKkR0tDJnUxYPnOrk/MlpzO6OQvaFJ7A1N5kp8Nnf/5ZkZ6tHZ04auXrZ09rR95I1TpZJIzSshObeYtDx1IXFWYSk5RXLyixWarii5UkKlklBJEro6MnR1ZBjq6WKkr4NJWc2MhZEedmaG2JkZ4mBhiLOVcaWiBw2REoWSXVeS2H4pnjORGQ8cc2FuqIeOjgxJkigsVT6wtR3UpotdvWzp7WNPvxaOj5Ue+udWGm9vDyEuU12M/mygK+892VLrlvliuZKPdl9nwzl1y3VfX3sWjw2och3NvcXHc3o1463BfrUqsksVKhZsvaIRfwsG+fJCH6//XJG6QAicChECp245H5PJnHXBZBaU4mBuyM+TOzy2/XxFKJQqfvknmu8O3aRUocJYX5fXBjRnenfPSn3zTs0rZvmxSDacu60p6vVzMmdWz2Y82db5oROak3KK2H0lib+uJBKSkFPuMX8XC/r5OtDLx562blb3RbByCuWEp+QRnpJHZGo+UekFxGYUkJhddJ+7cXViYaRHUztTmtqa4mVvhq+TGb5OFnjYNPwI0tmoDN7eFkLUXW7Jbd2s6O5lS4C7NX5O5jhaGJX7fUqSRG6RguTcYiJS87mZkqcxKbw3ldjZ04Zn2rsytE2TKgnFwlIFX+0L57czMUiSOprzv2fb0M1L+xTR1uB43tkeQolChbuNCT9PDqySySCo3/v3h2+x+NAtAAa1cmTx2IBanWemUkl8uS+MFSeiAJjQ2Z2PnvYX9WT/MWpF4CxatIh33nnnvgMUFhby8ccfiy4qwQPZfimet7aGUKpU0drFkl8md6jx8QI3U/JYsOUKV8pqY3o2t+Ozka0r1ZWRWVDK8mMRrDsbqykcDnC34qV+3vT1dXjgN8liuZKD11PYfCGOkxHpmkiNro6MLs1sGOzfhAEtHMu9/xKFkmuJuQTHZHE5LpuQhBzNEM8Hoasjw6GsiNjOzBBrEwMsy7qYTAzU3VD6ujro6chApr5JKFSSxr+moERBbrGcnCIFGWXt5Cm5JfcNs7wbM0M9/F0sNP41nT1tGkwbb6lCxed7b7D6VAygNlOc2s2Dp9u5VLlLR6WSuJ6Uy4lbaRwLS+N8bKbmd21qoMtT7VyY2MWdVs6VL5ANis5k/pYrms/AzB6eLBjsq3WNWGhCDnPXBxOfVYSJgS5fP9uWoa2rPgphx6UE3tx6lVKliraulvwypUOt1MvdzepT0Xy0+zqSBP1bOPLjc7UrtAR1S60InBYtWnDy5Elsbcubr2VmZtKjRw+uX79emd3VKkLg1D6SJPHD4Qi+O3QTULu5fje2XY1emFQqiVWnovlqfzilChXmRnr83/CWjA501Tq0XViqYOU/0fx8IkrjIdPe3YrXBvg8tH08Or2ADedi2RIcr6nxAejY1Jqn2rkw1N9Jk8JSqSRCEnI4GZHO6ch0LsRkPbDd28XKGF8nc5o7mOFpZ0pTO1PcbExwNDeskZlM+SUKErKKiClzHo5IzSc8OY+bKXkPXF8rZwt6+djT28eeDh7W9WpO1B0kSeL1zVfYfkk9f+m5Tu4sHOJXZe+hh5GYXcSOywlsvRBfLkLUy8eeF/t40blZ5QwrC0oUfPL3DTYGqVNOLZtY8MNz7fB20M4JOauglHkbL2pa0uf19eb1AT5VjsKdj8lk9toLZBXKcbEyZs20jjR3rLwr8+OwNySJV/64TKlCRXt3K1ZO6dhgRLbg8ahRgZOfn48kSXTs2JEDBw5gY/Nv7YJSqeTo0aN8/fXXnDx5smqrrwWEwKld5EoVb28LYUuwep7U3N5evDnIt0bTHInZRby++bKm1qaPrz1fPtMGRy3dXh/ki9OyiQULBvvSx8f+PmEjSRL/3Epn1alojoWnabY7WxoxOtCVZwJd8bA1BdSi6cTNdA5cT+Z4eBoZBaXl9mVjakB7dyvae1jT1tUKf2fLWvcheRgKpYqItHyuxuVwOT6b89GZ942YsDbRp5+fI8PaONGruX29ETvLjkXw1b5wdHVkLB3fnsH+TjV6PEmSOBedyfqzsewJSdLU+HT2tOGNgb6VtkE4dD2FN/+8SmZBKcb6unz4VCue7aCdWFcoVXyxN4xfT0YD6sjH4nHtqlxnFZ1ewPQ154lOL8DcSI8VEwNrvcPqfEwmM9acF145/zFqVOD4+fk98g9KJpPx0ksv8fzzz2u32ipw/vx5Vq5cSWhoKGlpaSxdupT+/ftr/XohcGqPghIFz/9+kRM309DVkfHx0/6M71yzXRh7Q5J468+r5BYrMDHQ5d1hLXmuk5vWUZuLt7P44K9rmnZvNxtj5g98sC+OXKli99VEfjoWRXhKHqA20uvjY8/ELh708XVAV0dGsVzJkbBUdl1J5Gh4qibNBeqUTzcvW3o0t6NrM1u8HcwaVPFkal6xegL4zXSOhqeWi1rZmxsyKsCF8Z3dNQKvTtaYW0zXL46gVEl8PMKfSbU8huB2hnoK/ZYL8eVGfywc4lepupjU3GJe33yFkxHq2VYj2jnz6cjWmGopVLZdjGfhthBKFSp8HM34dXLHKk05B3VkaNbaC1yIzUJfV8YXo2q/u+lurxx7c7VXTlVSgYKGQ407GUuSxJQpU/jxxx+xtPz3w6Svr4+zszOOjlW3C9eG48ePc/HiRfz9/Zk3b54QOPWUjPwSpq05z9X4HIz1dVk2oT19/Rxq7Hj3do+0dbXk+3EBNLXT7saakV/Cl/vCNJPL7/jiTO3W9D7vkxKFkq3B8Sw7GqkZvWBqoMuzHdyY2q0pTe1MkST13KktF+LZfTWJ/LvGJLhaGzOolRP9WzgS6GH90OLkhoZCqeJCbBb7QpP560oimWXRKZkMevvY82JfbzpWsmOtOvj5RCSf7QkjwN2K7S90r/Xj3yExu4glRyPYfD4OhUpCRwbPBroxf5Av9uaP9km6g0qldhv+9uBNlCoJL3tTlk8MxEfLNNGl21nMWRdMal4J1ib6rJjUocqmmsVyJfO3XGH31SQAXuvvw8tPeNeqQE/JLWbKKrVXjpmhHj9NDKRH89qNJglqj1qpwUlISKBJkybo6NTthdnX11cInHpIYnYRE1eeIyqtAGsTfVZN7UiAu3WNHS86vYAXfr/IjaRcZDJ1Guz1AT5aeepIksTW4Hg+23ND40MzOtCVtwb73XfTkStVbLkQz5Ijt0jMKQbUharTujdlYhcPLI31ySmSs/1iPL+fu10ufeNiZczwtk14so0zrZwttLoJSJJEWn4JtzMKiS+bMZWeV0pGQQm5RXIKSpQUyhUolBJKlboN3EBPPULB0lgfS2N9HMzVs6BcrI3xsjfD1dqkVjpPShUqjoansuHcbY7f/Ddt18fXnvkDfWvVlXbGmvMcDkvlveEtmdHDs9aO+zBi0gv4an+YZiaVuZEebw7yZXxnD61/N+djMnlpwyWSc4sx1tfl81GtGRHgotVrk3OKmbn2PKEJuejryvh0ZGvGdHCr0ntRqSS+3B/GiuPq7qYxHVz5dGTrWjWdzC2WM3vtBc5GZaKvK+PrZ9vydDvtzoWgYVFrbeK5ublcvXqVjIwM7n35iBEjKru7KiEETv0jOr2ACb+cJTGnGGdLI9bO6Iy3Q82d532hSczfcpX8EgW2pgYsHteOns21M0e7nVHIwm1XOR2pLsD0czLn05H+9w3WlCSJ3VeT+PbgTaLLCkcdLQyZ29uL5zq5Y6SvS1RaPqtPxbA1OJ4iudobx1hfl6GtmzA60JXOnjaPrDtSKFWEp+RxNT6H0IQcbiTlcis1/4Fuxo+DgZ4Ofk7mtHOzItDDmm5edlpHD6pKTHoBP/8TpYlcAIxq78IHT7XS2t/lcZi19gIHr6fw6Uh/JnSu3fTUowiOzeT9v64RmqCeJdXG1ZIvRrWhpbN2aauM/BJe/eMy/9xSp6ymdPXgnWEttYoIFpWqoy9/h6ijL49bG7f+bCz/tzMUlaQuqF42oX2teimVKJS8vvkKf5dFk94d1oKZPZvV2vEFtUOtCJwjR44wf/58CgsLMTMrXzMgk8kICgqq3KqriBA49YubKXlM+PUcaXklNLM3Zd2Mzo9levYolCqJrw+Es/xYJACdmtrw4/gArQqJVSqJtWdi+HJfOEVyJUb6Orza34cZPTzv++YZHJvFx7uvc7lsVpWtqQEv9vVmfGe1sLkSl82yYxEcuJ6iaQ/2cTRjYhcPRgS4PPQGrlRJhJZ1UJ2NyuBibJbGNPBudGTgbGWMq7V6xpS9uSF2poZYGutjZqSHsb4ueroydGUylJKEXKmisFRJTpGc7EI5qbnFJOYUE5dZSFR6AaUP6IJq0cSCAS0cGNbGGR/HmqsBis0o4LuDN9lRZtjmbmPCkvEBtHG1qpHj3WHRthA2Bt1mTAdXvhrdtkaPVVmUKonfz8Xyv/3h5BUr0NOR8XwfL+b189aqHVypkvj+rnEngR7WLJ/QHgct/w7uHpUyqJUj341th4lB1YTJ4RspzNtwiSK5klbOFqye2lGrdVQXKpXER7uva+ZyzerpyaIhLRq8b5PgX2pF4AwaNIhevXrx+uuvY2xcMzcwbRACp/4QmpDDpJXnyCqU06KJBetmdMKugvlLVSWnUM68jRc131xn9vDkrSF+WoXF47MKmb/liqbDqkszG758ps19RbApucV8tueGxj3VxECXOb28mNHTEzNDPYJjs1h86KZmDQBP+DkwvYcn3bxsHygSCkoUnLiZxsEbKRwNS71vNIO5oR5t3Czxd7GklbMlPo5mNLU1rbb5R0qVRFxmISEJOVy6nc256AyuJeaWe46vozkTu7gzqr2r1sWrlSU4NouXN14iIbsIfV0Zi8cGMKxN1f1ZKuJCTCajfzqDkb4OJ9/qV2Ofy8chNbeY93aGsv+aenSJn5M5345pp3U059D1FF7bfJm8YgUO5oasmBSodVr4Xn+qlVM6VFmYXInLZvqa82QUlOJiZcxv0ztq3dJeHUiSxIoTUXyxNwxQF2J/Nbpto6lz+69TKwKnXbt27Nq1Cze3quVtqwshcOoHIfE5TFx5jpwiOW1cLVk7vRNWJjXjSxGZls+s3y4QlV6Asb4uX45uw1NtnSt8nSRJ7LicwP/tuEZeibrDatEQPyZ09ij3DU+uVLH6VDTfH7pFQakSmQzGBLrxxkAfHCyMCInP4esD4Zq6El0dGSPaufB8n2YPvJCXKlSaDqrDYSnlOqjMDfXo6mVLd287Onna4ONoXuvOrOn5JZy4mcaekGRO3EzTdPmYG+oxvos7s3o2qxFBkFMoZ8HWKxy4noKBrg5rZ3SiSyU9YrRFkiSeWnKKkIQc+vk5sHJKh3rZqSZJEntCkvm/naFkFJSiryvj9QG+zO7VTKvPRXR6AbPXXuBWaj4Gujp8MtJf69qaCzGZzC5zGHe2NGLVtI5Vdj6OzShg6mp1G7mlsT6/TK56IXNV+TM4nrf+vIpCJdGzuR3LJwY2+vEj/wVqReDMmzePoUOHMnTo0CotsroQAqfuCYnPYcKvZ8ktVhDgbsVv0zvVWF3FqYh05q4PJq9YgYuVMT9PDtSqLTS/RMF7O0I1Jm/t3a34bmy7+6I2V+KyWbgthBtJ6qhGgLsVHz/tj7+LJXGZhXx9IFwT0dHVkfFsoCsv9vV+oP9GWHIum4Li2Hk5oVykxt3GhIEtHenf0rHemeLlFMnZdjGetWdiNbVGxvq6PN/Hi9m9mlX7JG2lSuLF3y+y71oyFkZ67Hu1F841lNK8kZTL00tPUapQ8fITzXmtf/N6KXJALToXbQvh4HV1NKdLMxu+G9uOJpYVn5v8EgWv/3GZA9f/HWL7ztAWWn3OYjMKmLbmPFFpBZgZ6rFsQvsqT+/OLChlxm/nuXQ7GwM9HRaPbfdYLspV4Vh4Ki/8fpHCUiX+LhasntqpxuvNBDVLrQicLVu2sGzZMkaNGoWPjw96euWV8RNPPFGZ3VWKgoICbt9WtwKPGDGCRYsW0blzZywtLXF2rvibvBA41UdoQg4TflVHbgI9rFkzrSPmNSRuNgXd5t0doShUEoEe1qyYFKhVZCE0IYd5Gy4Sk1GIro6MV55ozgt9vMpd8ItKlXxzIJxVp6JRSWBlos/bQ1owOtCVIrmSpUcj+PWfaEqVKmQyeLqtM68N8LlPICmUKvaGJrPuTCxBMZma7Q7mhowIcOHJNs74u2jXQVWXqFQSR8NT+eHwLc2Ii2b2pnw2snW1R1mK5UrGrjjDlfgchvg7sXxiYLXu/27WnY3lvR2hALzavzmv9vepsWM9LpIksSU4ng/+ukZhqRIrE33+N7otA1pWbMOhUkn8cOTf2VE9m9ux5Ln2WhlGZheWMmddMOeiM9HVkfHpY0wQLypV8sqmSxy4noJMBv83vCXTutduF9vdKTN3GxPWTu+ktXWEoP5RKwLHz8/v4TuTybhx40Zldlcpzp07x+TJk+/bPnLkSL744osKXy8ETvUQnpzH2J/PkF0op31Z5KYmxI0kSXxz4CZLjqoLIZ9u58xXo9tUWIApSRKbzsfx/l/XKFWocLY04ofnAu6bHB4cm8X8LVc0EYuRAS68O6wFNqYG7L6axCd/X9e4GXf3tmXRkBb3tTgXlCjYdD6OVSejNb44ujoyBrZ0ZExHN3p629WrSI22SJLErqtJfLz7Oml56nMwt7cXCwb5Vmsq7UZSLsN/PIlSJbFlbtca9cr55UQUn+5RX59ml03Grs8DG6PTC3h54yXNkNYZPTx5a7CfVjUle0OSeH3zFYrkSprZm7JySkc8tbi5lyiULPwzRBPxfLGvF/MH+lZJmCtVEh/8dY11Z2MB9TlfWMvTyGPSC5i8KojbmYXYmhqwelrHGi9sF9QMYpp4BQiB8/hEpxcwZsUZ0vJKaOtmxfoZNSNu5EoVC/8M4c+LavM9bVMLxXIl/7czVGPa17+FA18/27ZcXZBcqeKHw7dYejQClaRu+/5iVBv6+jkQm1HAuztCNQXE7jYmvDusBQNaOpY7dl6xnLVnYvn1nyhNGsrW1IAJXTwY38m9xgeJ1hY5RXK+2HuDjUFxgDoi8ONzAdVaZzV/yxW2BsczobM7n45sXW37fRDLj0Xy5T51EWr/Fg788FxAlTuHaoNShYov94WxsmzUQoC7FUvHt9cqnXctMYdZv10gMacYS2N9lk9sr9VUckmS+O7QLX44rI4CjWjnzJdafLF42L6WH4/kq33hADzV1pn/PVu1fVWVtLwSpq0JIjQhFxMDtfFoH9+aMx4V1Ay1LnBKSkowNGw4eU0hcB6P5Jxinll+moTsIvyczNk0u0uNFBQXlSp54fdgjoarxzx8NtKfsR0rDpWn5BYze10wV+Ky0ZHB/EG+zO3lVe4bY2xGAS9vusyVstbvUQEuvP9UK8wM9Vh9Kpr/7Q+nRKHCQE+HF/t4M6d3+fqTYrmS307HsOxYpGbytqedKbN6NmNUe5dqr1WpL+y6ksibW69SJFfiZW/KhlldtJ7vVREnbqYxeVUQ9uaGBL39RI2n8XZeTmDB1quUKlT4OZmzfGKgVtGNuuTAtWTmb7lCbrECG1MDfhgXoJVrb2peMbPXBnM5Lhs9HRmfjWzNmI7aFR9vPh/H29tDUKgkujSzYcWkDlUeULr9UjwLtqgLf7s2s2XF5MBa8UG6Q36JgrnrgjkZkY6ejoyvRrdhVPvaHS8heDxqReAolUp++uknNm3aREZGBvv378fNzY3Fixfj4uLCs88+W6XF1wZC4FSdnEI5Y1acITwlj2Z2pmye27VmOmyK5Mz87TznY7Iw0tdh2YT29POruPbgclw2s9deIDWvBCsTfZY81/6+G8Duq4ks/DOE/BIFFkZ6fDaqNcPbOBOVls+CrVcJjs0CoJuXLZ+ObF3upqdSSfx5MZ5vDtwkOVftZOxlb8rLTzRneBvnep3qqC5uJOUyY815EnOK8bQzZeOsLtUSqSoqVdLy/X1IEgS98wQO5jUf/QqOzWTOumDS80sxM9TjmzFtGdSqZodwPi5xmYXMXR/MtcRcjYB/vreXVlHNBVuvsuuKuki+MsZ+J26m8cLvF8kvUeDjaMaaaZ2qXAz+z6005q4LpqBUiZ+TOb9N71RtIlkbShUqFmy9omkWeHuoH7N7edXa8QWPR1Xu35UuDli+fDnbt29nwYIF6Ov/q8B9fHzYunVrZXcnaAAUy5XMXHue8JQ8HC0M+W16zfjcZBaUMuHXs5yPycLcSI/1MzprJW72hCQxdsUZUvNK8HE0468Xe5QTN6UKFe/vDGXehkvklyjo4GHN3ld7Max1Ezacu82wH04SHJuFmaEen49qze8zO5cTN8GxmTy99BQLtl4lObcYFytjvn62LQde683T7Vz+E+IG1KaAf8zpiouVMdHpBUxdHVRuzlZVMTbQxaOsGy3ingnlNUWghw1/v9yTTk1tyC9RMGddMB/uukaJ4n7DxfqCm40Jfz7fjTEdXFFJ8NW+cOZtuERBBb8DI31dfhjXjpefaA7AT8cjeWnjJYrlFb/XXj72bJ7TFUcLQ26m5DNy2Smu3+OfpC09m9vzxxz1F6Ow5DxGLTtNZFrt/L5B7eT93Zh2mpEdn+0J47M9N1Cp/jNVGv85Kh3BGTBgAB999BFdu3YlICCAv/76Czc3NyIjIxk3bhznz5+vqbU+NiKCU3mUKom564M5eD0FcyM9tsztWmWPjEeRnl/ChF/OEZ6Sh62pAetmdK7Q6OxeY68n/Bz4/rmAcp4XqbnFPP/7RU105vk+XrwxwIe8YgULtl7l0A11S203L1v+92zbcu7LWQWlfLbnBluC/x3C+VI/b6Y8YAjn45BTKCc8JY+YjALis4pIzikiu1BOdpGcUoUKpUpCJlMbDpoa6GFnZoizlTFuNsa0aGKBt4NZrc7/icssZOSy06Tnl/CEnwO/TO7w2IWj434+w9moTL4f165WZwnJlSq+2PtvjYu/iwVLx7ev0wnoFSFJEr+fu82Hu64hV0r4OZnzy+QOD7QsuJdtF9UeMXKlRHt3K36Z3AFbLb6sJGQXMW11EDdT8h97sGVcZiGTVwURnV6AlYk+K6d0JNCj5ubVPYgVxyP5vOy6MSrAhS9Ht6nVvyFB5anK/bvS1XUpKSm4u99fDyFJEgpF9c7OEdQ9n/x9nYPXUzDQ0+HXyR1qTNyM/+UsN1PycTA3ZMOszhU6oN5rzT61W1PeG96yXDTl7unJ5kZ6LB7bjidaOBIcm8VLGy6SmFOMga4OCwb5MqOHp+YmLUkSOy8n8tHu65qp2GM6uLJg0P1DOCvLnTEN52MyuRCTxdX4bM3wzqpioKtDWzdLenjb08vHjnZuVjVax+JmY8KvUzowdsUZDoelsupU9GPP/rExVddyZZWd79pCX1eH94a3pJuXLfO3XCE0IZeh3//DR0/7M6q9S71s65fJZEzs4oGfkzlz118kLDmPp5eeYtmE9hW28o9q70oTS2PmrLvAxdvZjFp+mtVTO9LM/tE3DBcrY7bM7cbstRc4F53J1NVB/O/ZNowMqHwdi5uNCVvndmX6bxe4EpfNhF/PsuS59vTXog2+upjT2wtbM0Pe+vMq2y4lkFVYyrIJgRgbNM4auv8qlY7gjBo1iilTpvD000+Xi+AsWbKE06dPs2HDhppa62MjIjiVY+2ZGP5v5zUAlowPYHibir2GKktmQSnjfzlLWLI6/bVpdtcKCz5LFSpe23xZM1zvQZOi7y4kbe5gxi+TO+Bha8LqUzF8tucGCpWEp50pS8YHlDMMTM0t5u3tIRy6kQqoxxd8Nur+IZyVoaBEweGwVA5eT+GfW2lk3zOmAdQ3kGb2prham+BsaYSNmQGWxvoY6umipyNDJUkUliopKFGQkltCUk4RUWkF3EjKJe+eFIWLlTEjA1wY18kNV+uKv9VXld/PxfLO9lAMdHXY8WJ3rUcLPIg7nVRvDfbj+T51UxeRmF3Eq5sua3yMRgW48NEI/3rtgpuUU8TstcGEJOSgpyPjo6f9Gd+54oL8iNR8pq0JIi6zCGsTtePwvTYKD6JEoeSNzVfYXfa39+Zg7eqAHkRhqYIXf7/I0fA0dGTw2cjWVfbdqSpHwlJ44feLFMtVtHe3YtXUjjXmxC54PGqlyPjQoUMsXLiQ2bNns2zZMl566SWio6PZsWMHK1asoHv37lVafG0gBI72nLyVzpTVQShVEgsG+fJiX+9qP0ZOkZwJv54lNCEXB3NDNs3uUuE3yaJSJXPXB3P8Zhr6ujK+GdOu3LgGSZJYciSCbw7eBNStwIvHBaCnI2PRtn/9PYa3acLno1qXa3HfF5rEwm0hZBfK0deV8XK/5szt41Wl0LVCqeL4zTT+vBjP4RuplNw16NLcSI/OnjYEetjQ3t2KFs4WVe4okSSJ2IxCTkdmcDIijePhaZrBnbo6Mp5s04S5fbxqJPImSRKz1gZz6EYKbd2s2P58tyqnqt7ZHsLv527XuQmfUiWx7GgE3x26iUpS2wQsHteO9lrOdqoLiuVK3tx6lb/Kioind/fknWEtKqwNS8srYeZv57kSn4OBng7fj23HEC0ch1Uqic/33uCXf9RpvSldPfi/J1tVqRZNrlSxaFsIW8vSwG8M8GFeP+9ajZwFx2Yyfc0FcorkNHcwY+2MTlo5Rwtql1prE79w4QJLly4lLCyMwsJCWrZsyYsvvkiPHj0qvejaRAgc7YjNKOCpJafIKZLzTHtXvn62TbVfcApLFUxaGURwbBa2pgb8MadLhWmp/BIF09ecJyg6E2N9XVZMCixnJ69Qqnh3Ryibzqs9W+6YuaXnlzDztwuEJOSgqyPj7aEtmN69qeY9FZYq+GjXdc3rWjlb8O2Ydvg6VX5QYGpuMevPxrLxfJzGIA+gqa0JQ1o3oZ+fAwFuVjVm/lcsV3LoRgobg25zKiJDs/3ZQFcWDvHTqt6iMqTkFtP/m+PklSj4YlTVv4G/vzOU387E8nI/b14f6Futa6wK52MyeXXTZRKyi9DTkfH6QB/m9PKqtwXlkiTx45EIvi0T9n197flxfPsKo0+FpQpe3niZQzfUjsPvDrs/GvowVp6M5pO/ryNJMLiVE4vHtatSbdq9hp4TOrvz0dP+tXqub6bkMXllEMm5xThbGrF2Rme8HcQ9oj4hjP4qQAiciskvUTBq2SlupuQT4G7Fxlldqt3bpVShYtbaCxy/mYalsT4bZ3WpML2RVyxn6urzBMdmYW6ox+ppHcuF1IvlSl7aeImD11PQkcGHT/szqYsH1xJzmLHmAsm5xVib6LN0Qnmzs4jUfF74PZibKfnIZOoW2tf6+1R6AvGtlDyWH49k15VE5Er1n5StqQEjA1wYEeBCK+faH9MQEp/D8uMR7AlJBsDSWJ93hrXg2UDXal3LypPRfLz7Og7mhhxb0KdKxnkf7rrG6lMxvNDHizcHP9wtvTbJLZbzzvZQTXt1ZeZC1RV7QpJ4ffNliuUqWjSxYNXUDhWuV6mS+HDXNdaeUTsOT+/uybvDWmgVjdt9NZHX/7hCqVJFp6Y2/DK5g1ZjIR7EujMx/N9f15AkGNTKke/HBdSqr1RCdhGTVp4jKq0AaxN9Vk/rRDs3q1o7vuDR1KrAKS0tJTMzE5VKVW67NjOh6gohcB6NJEm8uOEie0KScTA3ZNdLPardp0KSJF7ffIXtlxIw1tdl/czOFXZQFJQomLxKHe2xMNJj/czO5ezW80sUzPztPGejMjHQ0+HH5wIY1MqJ4zfTeH59MIWlSrwdzFg1pSPutv/WpOwJSWLBlisUlCqxNzfk+7Ht6OZduc6Qmyl5fH/oFntCk7jzl9TBw5qp3ZsysKVTpYVSTRAcm8V7O0K5XjZIdFibJnz5TJtqqy0pVah44ttjxGUW8eZgX17oU/l05se7r7PyZDRzejdj0ZAW1bKu6uDeuVDWJvp8peVcqLriclw2M387T3p+KY4Whqya2rHCwbSSJPHziShNZ9HQ1k58O0a7iMyZyAxmr7tAXrGC5g5m/Da96l45e0KSeHXT5X8F05SqmwtWhcyCUqatDuJKfA7G+rr8PDmQns2rNnRUUL3UisCJiYnh7bff5tKlS+W2S5JU47OoHhchcB7NmlPRfLDrOvq6MjbN7lojrZvfHAjnxyMR6OrI+HVKB/pWYJleLFcybfV5zkRlYGGkx4ZZXcrNg8otljN1VRAXb2djZqjHr1M60KWZLTsuJTB/yxUUKoluXrYsnxiouVCqVBLfHAxn6dFIALo2s+X759pVymAuKaeI7w7eZGtwPHdsNAa3cuL5Pl60rYff+hRKFb/8E803B8JRqCS87E1ZNbVjtbVDb7sYz+ubr2BrasDJt/pVuhvlsz03+PlEFLN6evLOsJbVsqbqJDq9gHkbLnKtzANmUhcP3hnWot46V8dlFjJ9zXlupeZjaqDL8omBWk0H33lZ/XcjV0qVisiEJecyddV5knOLcbIwYu2MTvg4Vj7FC2WCae0F8koU+DqqDQFrc/RJQYmCueuD+edWOvq6Mr4b265GGiwElaNWBM64cePQ09Nj1qxZODg43BfqftQwzrpGCJyHcyUum9E/nUaulPi/4S2ZrmUevjJsDY5n/pYrAHz5TOsKxy/IlSrmrgvmcFgqZobqyM3dIeOcIjmTVp7janwOlsb6rJ3eibZuVhqhBuoBnf8b3VYTSSksVfDaH5fZf03tfzOrp3qAobY1MSUKJb/+E82PR25RLFdHLwe1cuS1AT41Ushb3QTHZvHi7xdJzi3G1tSAtTM6VfjtXhsUShV9vj5GfFYRHz3disldm1bq9V/tC2PZsUimdmvKB0+1euz11AQlCiVf7w/XFNe2aGLBj88F1NtajZwiOXPXBXMmKkM9pmFUa8Z0qHhMw+nIdOasDSavpHIRmYTsIqasCiIiNR8LIz1+ndKRTp5V6z68npjL1NVBpOaV4GJlzG/TO9XqeS5RKHn9jyv8HZKETAafjmitVXeaoOaoFSfjsLAwPvzwQ3r37k2LFi3w8/Mr90/Q8MgtljNv40XkSonBrZyY1r1ptR8jKDqTRduuAuoJxRWJG5VK4q2tVzkcloqhng4rp3QoJ27yiuVMWRXE1fgcbEwN2DirC23drFh+LFIjbqZ1b8p3Y9ppxE1aXgnjfj7L/mspGOjq8M2zbXlnWEutxc3piHSGLP6H/+0Pp1iuooOHNX8+340Vk2rGH6gmCPSw5q+XuuPvYkFGQSnP/XyWS7ezHnu/ero6zCrzwll9KqbS7rB3hi+WKlUVPLPuMNTT5Z1hLVkzrSM2pgbcSMrlyR9PsuVCXF0v7YFYGuuzZnpHRrRzRqGSeHPrVX44fIuKvtN287Jjy/NdcbIw4laq2r34RlLF7sUuVsZsnduVDh7W5BYrmLjyHPtCk6u09pbOFvz5fDea2ZmSkF3Esz+drpbPqbYY6unyw3MBjO/sjiTB29tDWH4sstaOL6geKi1wvLy8yMqqvQ+aoOb5vx2hxGUW4WptzJejq79jKiG7iLnrg5ErJYa2duKNARV3yXy1P5xtlxLQ1ZGxfGJ7Ot9lYFZUqmTGmgtcjsvGykSf9WWux8uORWgmRb/cz5v/G95SUyh5O6OQ0T+d5mp8DtYm+myY1ZlnArUzKSsoUfDujhDG/3qOqPQC7MwMWTy2HVvm1kwar6ZxMDdiw6wuBJbdiKasCuJWSt5j73d0oCvmRnpEpxdw/GZapV5rbKC+FBWX1t9RCXfo4+vAvld60t3blqKyOU+vb75c4ciEusBQT5fvxrbjhTJvoW8P3mTRthAUFQhJPycLtr3QDR9HM1JySxiz4gxnozIe+RoAKxMD1s/sTP8WjpQqVLzwezDrz8ZWae1uNiZsmduVtq6WZBXKGf/LOY6Fp1ZpX1VBV0fGpyP8Nefuy31hfLkvrEKBKKg/VFrgzJ8/n6+//ppz586RlZVFfn5+uX+ChsWekCR2XE5ERwbfjwuo9oK+YrmSueuCySwopZWzBd88267C7ozfz8Xy03H1t6WvnmlTbh6VXKnixQ0XCYrJxNxQTyNufjkRxVf7wgGYP9CH1wf6aoRaeHIez/x0mtiMQlytjfnz+W5amZoBXLydxeDvT7D+7G1A3cJ6ZH5vRgTUT5dbbbEwUqf07hY5yY/pqGxqqKdJgayr5E3tjh9RbnH9EwkPwsHCiHXTO/PGAB90ZLDtYgJP/nhSq0hHbSOTyXhzsB8fj/BHRwabzscxe10whaWPPtfOVsZsmdONTk1tyCtWF/rvDUmq8HhG+rr8NLE94zq6oZLg3R2hfHfwZpWEga2ZIRtmdaFnczuK5Epm/naBnZcTKr2fqnLn3C0aos5OLD8Wyf/tvCbmVzUQKl2DcycNde/FXRQZNzxS84oZ+N0JsgvlvNjXiwWDqj/FuGjbVTYGxWFtos9f83pUOC/ndEQ6k1apDQZf6+/DK/2bax6TJIm3/rzK5gvxGOnrsG5GZzo2tWFj0G0WbQsB4PUBPpqhgqDO5U9ceY7MglL8nMxZO70TDlp0hqlUEj//E8X/9oejVEm4WBnz1eg2dK9kl9XDUKokYjIKiE4rIDm3mNS8EopKFZoWc3MjPSyN9XG1NsbL3gwPW9Ma6cjKKijlmZ9OE5VWgL+LBVvndnuswtmotHz6fXMcmQxOvtWv3GyvR7EnJIkXfr9Ix6bWbJnbrcrHrwuCojN5ZdMlknKKMdTT4YOnWjGuo1u9FMAHr6cwb8NFShQq2rpZsWpKxbOoiuVKXtl0if3X1F45Hz3Vikla1FhJksR3B2/ywxG1v834zu58XEV/m1KFivlbrmjMDN9/siXTuld/neCj2HDuNu/sCEGS1C7XX41uU2N+VoL7qZUi46CgoEc+3qlTp8rsrlYRAudfJEli9jr1EM2WTSzY8WL3ar+B7riUwKt/XEYmg7XTO1XYbnk7o5Cnlp4ku1DOyAAXvh3TttxN4ofDt/j24E10ZPDL5A480cKRPSFJzNtwEZWkHqT51l0eKtcTc5nw61myCuW0cbVk7fROWtmw5xbLeW3TZQ6HqcPhT7Z15tOR/lV2GwZ10WJQdCanIjI4G5VBWHKupkhZGwx0dQhwt6Kblx2D/Z2qZEL4MOIyC3l66SkyC0p5NtCV/z3b9rH299zPZzkTlVEpV+Kg6EzGrDhDU1sTji3o+1jHrwsyC0p5ffNljoWrU3Mj2jnz6cjWmNbDMQ/BsZnM+O0C2YVymtqasHZ653L2CQ9CqZJ4/69QTSTzpX7evD7ARysRd7e/zeMYAt47f25eX2/eGKjdGqqLnZcTeH3zFZQqiUGtHPnhuQBN/ZigZhFGfxUgBM6/7AtNYu76i+jryvhrXg9aNKneItmY9AKG/fAPBaVKXn6iOa8PePSNrqhUychlpwhLzqOtmxV/zC5vMLjrSiIvbVRbE3w60p8JnT04H5PJhF/PUapQMb6zO5+O8Ndc7CLT8hnz0xkyCkpp62bF2umdtEq/RacXMPO380SmFWCgp8OHj/FtXKFUceJWGruvJHHwesp9M6OM9HXwdjDDycIYRwtDzAz10NfVQUIit0hBdpGc2xkFRKYVkH/Pa1u7WDKmgyujA92qZUDg6Yh0Jq48h0qCxWPbMSKg6hO9d15O4JVNl3GxMubEm321+sYek15An6+PYaSvw42PBtfL6EdFqFTq6fZfH1BH/bzsTVk+MbDK7dI1SWRaPpNXBpGQXYSdmSFrpnUsZ7/wICRJ4ofD6jEWAOM6uvHJCH+tohh3+9t09lT721TlC4MkSSw9GsHXB9RreJyoUFU5eD2FFzdcpFShorePPT9NFEM6a4NaEzi5ubls3bqVyEh1nUTz5s155plnMDevf3/IdyMEjpq8YjkDvj1Bcm5xjVjjy5UqRi8/zZX4HDo1tWHj7C6PvABJksQbW66w7WICdmYG7HqpRzn31dCEHJ5ZfpoShYqZPTx5d3hLYtILGLHsFNmFcga2dGT5xEDNMRKyixi9/DRJOcW0crZgw6wuWomb8zGZzPxNPZPGycKIXyZ3oLVr5VuoM/JL+P3cbTYG3SbprroWRwtDenjb09XLlgB3K5rammp1YZYkiej0As5EZXAsPI1j4amaVJadmQFze3sxsYvHY3uyLD50k8WHbmFmqMeel3tW+K3+YRTLlXT69BC5xQrWTu+klf9KiUKJ33v7kCQ4/07/x57aXpcERWfy0saLpOSWYKyvy6cj/RnVvvJTt2ualNxipqwKIiw5D1MDXX6e3EGrFOyGc7d5d0cIKgkGtHTkx+e0cxw+HZnO7LXB5JcoaNHEgt+md6yU99S9a7iTLhra2onvxrar1UjKyVvpzFp7gSK5ks6eNqyc2rFeD2VtDNSKwAkJCWHmzJkYGhrSpk0bzbbi4mJWrVpFq1b108MChMC5wx1b/Ka2Jux7tVe1m5XdSSVZGuuz95WeFXpo/BkczxtbrqAjg/UzO5cbpZBdWMqwH06SkF1EH197Vk7pSGGpgpHLThORmk9bV0s2ze6q+QaVUyRn9PLT3ErNx8velM1zumo1f+nu2oR2blb8PDmw0hff1Lxifj4exe/nblMkV3cDWZvo83Q7F55s24QAN+sqD6O8m4z8EnZeTmTVqWjis4oA8LA14bORrR+rRkihVPHcL2c5H5NFp6Y2bJrdpcrr/b+doaw9E8uwNk1YOr69Vq/p/sURErKL2DK3Kx21LAJ/GKl5xWy/mMDluGyuxueQXViKnq4Ohno6NLU1xcfJjDYuVvTysa8RE7n0/BJe3XSZkxHpADzXyZ33n2xZ74wBc4vlzFmr9sox0NXhu7HtGNam4oGb+0KTeXnTJUoVlXMcDk3IYerq86Tnl+BuY8K6GZ2qbDZ5d1SoZ3M7fpoYWKspwfMxmUxffZ68EgWBHtasntbxsdLYgkdTKwJn/PjxeHh48PHHH6Onp/4wKRQK3n33XeLi4vj9998rv/JaQggcuJGUy7Af/kElwboZFdfFVGX/T/54EoVK4vtx7Xi63aNTHTHpBQz94R8KS5W8McCHl+4qEFapJGb8dp6j4Wl42Jrw17weWBjpaWqHHC0M2TWvh6ZoWK5UMWVVEKcjM3C0MGT7C921MijbdjGeBVuvolRJ9G/hwJLx7St1IyqWK/npeCQ/HY/U1NW0drFkRg9PhrR2qrFvlnKlim0X4/nu4C2Sc9WRonEd3Xj/yVZVDpnHZRYyePEJCkqVfPhUK6Z0a1ql/VxLzGHYDyfR15VxdtETWonMKauCOH4zTZOCrAoqlcTKk9F8e/CmRmRWhJ+TOU+2dWZkgEuVRww8CKVK4ofDt/jhyC0kCfxdLFg+IbDCQvvapkSh5LU/LrMnJLlSRcRnozKY9ZvacdjPSe04rM1ol9iMAiatDOJ2ZiF2Zgb8Nr3qZpP/3Epjzjr1OJZ2blasmdZRqzq76uJqfDaTVgaRU6Su81s3vXOVZ3EJHk2tGP2FhoYyc+ZMjbgB0NPTY+bMmYSGhlZ2d4JaRJIkPv37BioJhrVuUu3iRqlSdzkpVBIDWzryVNtH25srlCpe23yZwlIlXZrZ8ELf8jOMVp2K5mh4GoZ6OiyfoB618POJKA5eVxv1rZjUoVxH1Me7r3M6MgNTA11WT9XOfXX7JXX0SKmSeDbQlZ8mBlZK3By6nsIT3xxn8SG1s3GAu/oi+9e87owIcKnRsLm+rg5jO7pz8PVeTO7qgaysBXjkslPcziis0j7dbEx4q6wl9qt9YSRmF1VpP62cLWnjaolcKbH9knZtvXcKp8OSqubJI1eqmLn2Ap/uuUGRXElbNysWDfFjw6zOHJvfh0Ov9+aved35bmxb5vRuRls3K2QyCEvO43/7w+n+5REmrwriWHhqtbQB6+rIeG2AD79N64S1iT6hCeovF4dvpDz2vqsTQz1dfnyuPRO7qE3t3tt5jR+1MATs0syWP+Z0xd7ckLDkPJ5ZfpqotIqtQjxsTdn6fFdaNLEgPb+UcSvOck4Lj50H0bO5Pb/P7IyViT6X47IZ9/NZUnMfz+6gMrRxtWLDrM5Ym+hzNT6HiSvPkVMor7XjCx5NpQWOmZkZSUn3eyEkJSVhalo9c20ENcOJW+mcjEjHQFeHhUOqvyV8zekYrsbnYG6kxyd3Ffw+jBUnorh0OxtzQz2+GdOuXD3KtcQcjWnfe8Nb0tLZguDYLL7ar/a6ef+pluWcjTefj2PtmVhkMlg8LqDC6eSgnoT8xuYrSJLa3+bLZ7Rv+8wpkvP6H5eZufYCCdlFOFsasWR8ANue70Yf3/tHmNQk5kb6fPS0PxtndcHOzICw5DyeXHKSM5FVu2lM7OxBoIc1BaVK3v/rWpXXNbaj2hNnY9BtrTxQ7hS5Xk3IqdLxvjlwkyNhqRjp6/DZyNbseKEbc3p70c3LjqZ2png7mNHG1YqRAa4sGtKCnS92J/jdAXw1ug2dPW2QJDhxM42pq88z4LvjbLkQV6Ehnjb08rHn75d70s7NitxiBTN+u8DXZfYD9QVdHRkfP+2vsVj45uBNPtp9vUKh19LZgm3Pd6OprQnxWUU8+9MZQuIr/v05mBvxx5wuao+dsmG6h65XTfgFuFvzx+yuOJQJrTErzhCfVTWBXxVaOVuycXYXbEwNCEnIYcLKs2QXltba8QUPp9ICZ+jQobzzzjvs2bOHpKQkkpKS+Pvvv3n33XcZNmxYTaxRUA0oVRKf71F7FE3q6lHtYfLUvGK+O6jubFg0pEWFXjPR6QV8f/gWAO8/1aqcX0qpQsUbm9UD/wa0dGRCZ3fySxS8+scllCqJp9o6M77Tv6MebiTl8t5OdfTw9f4+Wk16Pnkrndf+uIxKUqd1Pn7aX+t6k+DYLIYsPsG2SwnoyGBOr2YceqM3w9s412n3T5dmtux+SX0jzSmSM2V1UJWiBTo6Mj4f1Ro9HRkHr6dU+cbzVFtnTAx0iUwrICg6s8LntyubEH89MYdiLdNLd0jMLmLVKfWMqMVj2zG+s7tWvwsbUwPGdHDjjzldObGgLzN6eGJmqEdkWgELtl6l3zfH1QNVH1OMOFsZs3lOV6Z0VafelhyNYMqqIDLySx5rv9WJTCbj9QE+/N9w9bDT1adi1ANrKxB5bjYmbH2+27/jP345y+nI9AqPZ2Gkz9oZnejfwoEShYo564PZfim+Smv3dTJn69xuuNkYE5NRyJifzmgVTaou/Jws2DirC7amBoQm5IpITj2h0gLnzTffZMCAAbz55pv069ePfv36sXDhQgYNGsSCBQtqYo2CamDXlUTCkvMwN9Jj3j2poOrgq33h5JcoaOtqybiOjx7oJ0kS72wPoVShLg58pn35Op2lRyMIS87DxtSAz0e1RiaT8enf14nLLMLFyphPRv4bHSoqVWqKg/v42vOiFu8tPDlPMzpieJsmfDqytdbiZv3ZWMauOENiTjEetiZsmduNRUNbYGJQPzoonCyN2DS7CwNbqq3y56wLrtI8IB9Hc2b0VBupfbj7WqUFB6gjS3fSlL+fu13h891sjHEwN0SulLhYyblDP5+IolShbkEe1Mqp0msFcLc14b3hLTmzqB8Lh/hhY2rA7cxC5m+5wtAf/uFYeOpj2fQb6Onw4dP+fD+uHcb6upyMSOfJH09yOS67yvusCab38OTbMW3R1ZGx7VICz/9+scLfv52ZIRtndaFrM1vySxRMXX2eA9cq/twZ6asnnY8KcFGbe/5xhd/KfG4qi7utCVvmdMPL3pTEnGLGrDhDWHLtOUv7OpmzYZY6khOakMukVefILRYipy6ptMAxMDDg3Xff5fz58+zYsYMdO3YQFBTE22+/jYFB7RV3CbRHqZL44Yg6WjK3txfWptX7e7qWmMOfF9XfvN5/qlWFYmH31SROR2ZgqKfDpyNal/umHZGax7JjaufTj55uhZ2ZIaci0tkYpB5o+M2YtuU6FT7fe4PItAIczA35dkzFYyAy8kuY8dt58ksUdPa04ZuyC3lFKFUS7+0I5d0doShUEsNaN+Hvl3vWy1lURvq6LJ3QnqfLhizO23CRo1WY4fNyv+Y4WRgRl1nEzyeiqrSWiV3UEYs9IUmkVFAbIZPJ6Oqlnjl2KqLiCMDdHA5TR5lm9mz22FE0cyN95vb24p83+/LWYD/MjfQIS85j6urzTF19nsjHjAw83c6FnfO642lXdiP+6Qy/n4utVzOORrVX16MZ6Olw8HoKU1cH3efFdC/mRvqsntaRQa3U4vr53y/yZ3DFERl9XR2+frYtU8sK2t//6xpLjlRcA/QgnCyN+GNOV1reqe/5+SxX47MrvZ+qohY5/9bkTFkVRJ4QOXVGla1rjY2NsbCwwMLCAmPj6us8EFQ/+0KTiUorwNJYn8ldq9ad8ii+2BuGJMHwNk1o7/7oG36xXMlnZamyF/p4l/NakSSJ93ZcQ66U6OfnwLDWTSiWK3l7u3oMw6QuHnS5a+jm6ch01p5Rzzz637NtsalAuClVEi9tvER8VhEetib8NDFQqyLgUoWKlzdeYt1ZdY3Pm4N9WTI+oF77Xujr6vDtmHY81VYtcl5Yf7HSF3pTQz3eHtYCgGXHIqpU1+DvYkkHD2sUKonftZhPdafwvTLDOhOzi4jLLEJP51+BVB2YGurxfB+10JnZwxN9XRnHb6Yx6LsTfLbnxmMN1/RxNGfnvO5qMaBU8c72UOZvuVqlSFlNMaClI2und8LMUI+zUZlM+OUsWQWPri0x0tdl6fj2PNPeFaVK7W+1pix1+Ch0dGS8/2RLXimrAfr6wM2y60rlRc6daFI7NyuyC+VM+OUcwbG1NyDaz8mC9TM7Y2msz6Xb2cz47QJFDWCIbGOk0gJHoVCwePFiAgMDNSmqwMBAvvvuO+RyoVTrG5Ik8cs/6m/fU7o11Qw1rC7ORWXwz6109HRkvKnFLKtVp6JJyinGxcqYOb2blXts/7UUtR9HmYOwTCZjxfEoYjMKcbQw1HT3gFoovV02f2pCZ3d6a2Emt+RIBKcjMzDW1+XXyR20imQVy5XMXR/M3yFJ6OvKWDq+PS/08W4QTru6OjK+GdNWM6hw+przxGVWTqQ82aYJnT1tKJar+HxPWJXWMb2HOtW1/tztCm/gfXzt0ZFBaEKu1oLqjpmik6VRjYhOKxMD3h3ekgOv9aafnwMKlcTPJ6IY8O1x9l9LrnLkxcJIn58mBrJwiB86MvjzYjyjlp2ucgdcTdClma0mInElPocxK85UGInT09Xhf6PbML1sVtQHu65r1ZUlk6m7zt4tE9UrTkTx7o7QKtU/WZros35m53+LmFeeq3KnVlVo5WzJ+hmdMTfUIyg6kznrgylRCJFT21Ra4Hz88cds3ryZBQsWsH37drZv386CBQv4888/+eSTT2pijYLH4EJsFpfjsjHQ02FSl+qP3txJfY3p6Fah821OkZyfjqndr+cP8inXji1XqvhirzqyM7tnM9xsTEjKKWL5cXW66t1hLcvdvH46HknMA4TPw7h0O4vvD6uLoD8Z4U9zLezzlSqJ1zdf1nTm/DqlI0NbV2yCVp/Q19Vh2YT2mpbcmb9dqFTkQSaT8cFTrdCRwd8hSZytwk1iYEtHXK2NySwoZWsFKQs7M0ONyd/fVyueXA2QW6T+YqWN0dzj4GlnyqqpHVk9tSOu1sYk5hQzZ10wc9YFV3jTfxgymYy5vb1YP6MztqYGXE/KZfiP/3A0rPIpxZqijasVW+Z2xcnCiFup+Tz705kKhbKOjoz3hrfg1f7/dmVpG5GZ2bMZX4xqjUymrt2av7XiQucHYWaox5rpHenmZUtBqZKpq89XubOwKrR2tWT1tI4Y6+ty4mYar/9xpV51zv0XqLTA2b17N59//jnjxo3Dz88PPz8/xo0bx6effsru3btrYo2Cx2DVSXV4eFSAS7Xb31+Nz+ZURAa6OjJe6ONV4fNXnowmt1iBj6MZT7ctX1i8+UIcMRmF2Joa8HzZvr47eJNiuYqOTa0Zfpe7akJ2ET8dVwul94a3rNA9tFiu5I0tV1BJ8HQ7Z54JrNg2X5IkPtp1jT0hyRjo6rBySketokQVkZZXwraL8Xy25wbT15xnyPf/8MQ3x+j11VGG//gPM9ac54O/rrH7aiJpedXTYWNupM/qqR2xNzckPCWPN/+8WqmoQ4smFjxX1rX24a7rlb5I6+nqMKMsivPrP1EVvv7OHKw/L8ZrtU5DffVlrETx+C3d2tDXz4GDr/XmhT5e6OnIOHA9hf7fHGfDOe3a4R9EN287dr/cQ9NKPm3Neb47eLNa/HiqA28Hc7bM7Yq7jQm3MwsZu6LiLiWZTMar/asWkRnXyZ3FY9XWEdsuqmebyasgckwM9Fg1tSO9fOwpkiuZtiZIqw6v6qJDUxt+mdwBA10d/g5J4r2dofWq1qqxU6UiY1fX+28Qrq6u6OsLB8f6REpuMQfKWnynlYWLq5Nf/1GLp6faOuNq/ejoTX6JgtVlufhX+/uUKwYuVahYekQdqZnXzxtTQz2i0ws03/YXDW1RLiV0R/h08rRhmBYRlWXHIokqK0T+6Cl/rd7b+rOx/Fbmq/Pt2LaPNQIht1jOqpPRjFh6ik6fHeL1zVf4+UQUR8JSuZGUS2RaAbczCwlNyOVwWCprTscwb8MlOn56iKeXnuL3c7GP3Y3hZGnEsgnt0dOR8ffVJFaerLgu4m7eGOiLpbE+N5Jy2RBUcUfUvYzt6IaViT4xGYXsvpr4yOcOa9MEI30dbqbkc0mLDiMrY3WqsTZbro0NdHlzsB+7X+5BWzcr8koUvL09hEkrgyqdBrxDE0tj/pjTRRNp/f7wLWb8dr7eeKq42ZiweU5XTZfS2J/PEpFaccH1vRGZBVuvahWRebqdC0vHt0dfV8bfIUm8+Lt6wGVlMdLX5edJgfTxtadYrmL6mvNVikRWlR7N7Vg8rh0ymXqG1h07DUHNU2mBM2HCBJYtW0Zp6b9/dKWlpSxfvpyJEydW6+IEj8fW4HiUKokOHtYal9jqIimniD0h6hTCzJ4Vi6dNQbfJK1bQzN6Uwfe08e64nEBiTjH25oaaSMHSoxGoJHjCz6Fc4XJEaj7byjq23r5H+DyI2xmFmmjPB0+10spG/UpcNh/tvg7Am4P8GN7m0Y7MDyOroJQP/rpGl88O89Hu61yOy0aS1GMcpnZryscj/Fk9rSMbZ3Vh69yurJzSgc9GtmZqt6a0bGKBTKZeyzvbQ+ny2WH+tz/ssYROx6Y2vFfmcfL53jAuxFTsTXMHG1MD3hiongj/9f5wMisoNr0XEwM9ZvVU11z9cPjWI6M4Fkb6DGutPucbtGgv97QzRSaDrEJ5rfvK+Dmpje7eHdYCQz0dTkakM3jxCa3NDe/FUE+Xj0f4882zbTHU0+FoeBrDfzxJaBXND6ubO11Kfk7mpOWVMO7ns9xKqdh5+u6IzJ8X43nlD+0iMoP9nfh5cgcM9HQ4cD2F56tYy2Kkr8tPEwPp7aMWOdNWn+d8JT7/j8vQ1k34ZIT6y9UPRyJYeyam1o79X6bSAufGjRscPXqUXr16MXXqVKZOnUqvXr04evQoYWFhzJs3T/NPUHdIkqQRAmM6PNqXpipsCopDoZLo7GlT4RwZlUrSdDvN6tmsXPRGkiRNGm1mD0+M9HVJzilmR5m9/92zqUDdzXNnivHdTsYP438HwilVqOjhbccQ/4r9UYpK1XN55EqJwa2cmHtPIbQ2qFQSm4Ju0++bY6w5HUNhqZLmDmZ89HQrzr39BLte6sEHT7ViUhcP+vo60NXLlg5NbXiihSPjO7vzwVOt2PNKT4Le7s+7w1rQ3MGMwlIlS49G0vuro4+VCpnc1YOn2zmjVEm8sulypczIxndyx8/JnJwiOV8fCK/Ssa1M9IlMK9D8fh/GhC5qofvXlcQKRYuxgS4eZcaVIXUgBHR1ZMzs2Yx9r/aiQ5kD9KJtIUxbc77KtTnPBLqy7YVuuNuoHYJHLT/NH+crHzmrCezMDNkwq0tZK7Za5IQnVyxyykVkribx0oZLWkVk+vo68OvkDhjq6XA4LJW566ouclZMCtQU3U9bfb5WPYgmdPbgtf7qLwkf/HWNg1U00BRoT6UFjoWFBYMGDaJv3740adKEJk2a0LdvXwYOHIi5uXm5f4K6Iyw5j8i0Agz0dBjcumrGZw9DpZI06aPxnd0reDacjEjndmYh5kZ6jLhn+Oa56EzCkvMw1tdlXEf1vn47E4NCJdGpqU05EZOYXcRfl9XpDW3MCkMTcth1JRGZTLtoD8CX+8KISi/A0cKQL59pU+luqayCUiavCmLhthCyCuX4OpqzdnonDrzWi8ldm2o1jPAO9uaGzOzZjAOv9WLFpECa2ZuSVSjn7e0hTF4VVKWbp0wm49ORrfGwNSEhu4i3KlGPo6er7m4D9fiFyradmxvpM6eXur5q8eGbj7y5BbhZ0cbVklKFSiuTwA5lhclno2rvW/m9eNqZ8secrrw7rAUGejocC09j4HcnKkzJPYxWzpbsmteDJ/wcKFWoeOvPEN7ceqVetJLbmBqwYVZnjXvx+F/OclOLSM5gfydWTArEQFeHfdeSeXGDdmmnXj72rJraESN9dVTr+fUXqyxyfpncQWNIOHnlOa4n1p4Z4MtPeDOuoxsqCV7aeJEr9czksbFRaYHz+eefa/1PUHfsLUsf9faxr7AIt7Kcj8kkIbsIcyM9rVxjt5SJoVEBLvdNud5UVs8xIsAFSxN95EoVWy6oTf2m92ha7rkbg25rokZttYjeLC/r2HqyjbNWs6muJebwW1no+KvRbSs9FTgiNY8Ry05xMiIdEwNd3h3Wgt0v96CXj/1jtZXLZDIGtXLiwKu9NKmQf26lM2jxiUob4oG6u+TH5wLQ15Wx71qyVgLiDp2b2TKinbN6KOOO0EoXHE/p5oG9uSFxmUVsOPdwXxyZTKYpTF59KrpCk7luZf43x6pgaFid3Inm7Hm5B21cLckpkjNvwyVe2XSJnKLKpxctTfT5ZXIHFgzyRUcGmy/Un1ZyKxMDfp/RpdIip5+fIz9P/tdE8KWNF7VKV3X3tmPlFLXIORKWyjwtI0D3YqSvy69TOhDoYU1usYLJq87V2lgHmUzGxyP8NfVAs9ZeIDmn9oaD/teostGfoH6zp8yeX5si3Mqyu6x9d1Arpwonb+cVyzWW7fd2L+UVy9lbts47gxmPhKWSnl+K/f+zd55RURxcGH5mG713AUEFwQaCgL1rNJbE3rtGY4kmxhTTe09MTDT2buw1MTGJvSKKiFiwNwSRJr3vfj9mdwVBmUVAzcdzDic5sGV2wZ079773fS2M6FjvfqZUQaGatcfFwmdEc88yj/FWchZ/nRGPc1L7sje8AD7fcV5vWGjoxtSZ26n0nnuEG0lZuNmYsHlSC8a1ro1SYninFBRyGeNa12bH1FY0qGHJvax8RiwJY/UjCoWH4edmzVtdxfX6z3ackyQW1fFO93pYGCmIjEk1WHBsqlLoV4d/2n3pkSOy7o1cqGUvdq3Ksu9v7+OIXCYQfSedG0mZBh1TZeDlaMGmiS2Y2tEbuUxg26lYnv/xQLk2eGQygcntvVgxpim2RVbJy5sRVpFYmSpZNbYpDWqINgRDFkorFtr5OIrbRQoZf5+NZ9raCEnC45Ze9iwaEawvjl5dJ+1+D2JmpGDp6GD9cQ9bdIzYe9kGP055UMpl/Dw4gLpO5txNz+WlFdVGgJWFwZ++KSkpfPzxx3Tr1o2mTZsSEhJS7KuaJ8/1xEwu381AIRPoUM+xQh9bo9GwSxvgKKV42hN9l9wCNbXtzWjkWlyrs/u8+LM6Dmb4u4k/2x4ptvN7B7gWKw4OX0kiIT0XWzMVzzUoO0xzTdhN1Bpo7W2Pr3PZ3ZtjV5M4ciUJpVwwOGn9ZlIWo5aGkZ5TQBMPG7ZNbinpOcuL7uTZW5vf8+6WM+VyfR3Tshatve3JyVfz6jrpV8OOFsbM6OIDwDc7o7lr4KhsYJA73o7mpGTl6wNXS0MhlzG1oziKXHDg6iM7IDZmKpprXa51Y8wnjVIuY3rnumx8uTkedqbEpuYwdNExvvzzfLk6D6287dkxtRUBNcVV8nErTvD1zugKSTx/HKxNVawe11TrtZTLsEXHuC2hWGhb10E/rvoz6g7T10vziWnlbc+CIvd7c9Ppcq3TWxorWTEmRL8VNnJJWJVtrFkYK1k8MlifQG6odUM10ihX2OaRI0fo1asXb731FjNnziz2Vc2TR2dzH+RpU+HjqbOxacSl5mCilEuyxdetqXdt6FxiTKPrsHRv5IIgCOTkF7LnvDhiKOp7A2JYqO62ZXVFCotqhELK1ggBzNGOswYEuZe58l6UjNwCRi0LIzEjj3ouliwbHYydecX6DZWGsVLODwP8eb2zKFqct/8KH/9+zqAPSZlM4Lv+/libKjlzO40fDFhfHdbMA383K9JzCvj493MGHbtCLuODnuI214qj1x+5hfOCvyvejuakZuezsIw8LJ1/zuaI20+NfwxAQE0b/pzamkHB7mg0oh9M77mHuXy37HHOg7hYmbBufHN9btOv+64wdNEx7qY/2TGHtamKlWNDqK0tFoYtOkaihI229j6OevuC7ZGxvLslStLfcDsfR34eEqD3yfn497PlKhDszI1YMbap3sRw7PITVaZxcrc11b/23yNjy533Vs3DMbjAOXHiBD/99BPjx4+nT58+9O7du9hXNU8enVunLtenIjl4SWyxt/SyK3M8VajWcEh7+44PdJLyC9UcviweZ6f6Ykfm2LVksvMLcbEyLtbtUas17NE6uz4vQTB94noyd9NzsTRWFBtzPYxriZkcuJiAIIhhpIbwwdYzXE3IxNnSmGWjgys8CuNRCILAKx29+aJ3IwCWHblusJGYk6UxX/XxA2D+gSuSnV7lMoEv+jRCLhM9SgzdCGnt7UDn+k4UqDV8sO3hJye5TOD158Ru0aJDV4lLfXhnoGtDZyy0HkqGZFlVBWZGCr7q68f84U2wNlVyNjaN7rMPsSrU8JBNlULGRy804OfBAZip5By7lky3nw5VqUtvadibG7F6XFNcrU24lpjJ2GXHJblmd6rvxOzBAcgEWHv8Fp/tOC/pPenSwJkfBvgjCLD86A1m775cruN2tTZhxdgQLI0VhN9I4bV1p6rMcbhZbTs+1Ar3v/n7QpX68/w/YHCBU7t2bXJyqkVRTysajUbv79Cstm2FP75OQ9BKgvHdudg0UrPzsTBS4O9mXexnkbfukZFbgI2pkobaNfOD2pNSG+/iotyo26kkZ+ZhYazQ2/g/ir/PiifbzvWdUSnK/hNfp9X2tKvrgLut9O7N4cuJbI64jUyAn4cEGLQhVZEMaVqTb/r5IQiwKvQmX/1lWGZU14bODAwSuwuvrz8lWQzboIaV3tvmva1RBotoP+hRHyOFjKNXk9h66uFr410aOBHsaUNOvpqvH/HazI0UDAoRtVzzD1wx6Fiqii4NnPn71Ta09rYnt0DNe1vP8NKK8HL59/T0r8H2V1rh42RBYkYuQxeF8vPuS0+0e+ViZcLKsSH67Kopv52UNELr1siFr/uKhfbiQ9eYu0/a7+/Fxq581FMsEGbtulguPRqI4ac6x+G/ztzRx8ZUBcOa1tSPm6f8FlFhDubVlKPA+fDDD5k1axZhYWGkpKSQkZFR7KuaJ0tMSjZJmXko5QINXR/tT2MohWoNETfvARBSq+zxVPgNsdBq4mmD4oGx0gltum9ILVu9L46uMGvhVfyxw66J329ay06SaPfQZbFQerBrVBoajYad2lGZlAgHHWq1hi+1H4LDmnlIKrwqkwFB7voTxPwDV8sc5zzI+z3r63UiH2w7I/l+r3byppa9GfFpuXy+w7BRlbutKVO1Pkef/H7uoSd5QRD4oEcDBAG2norV/z2Uxhht6nfo1eQqTZA2BCdLY5aPDhHXyeUydp2Pp8uPBzlQjq5THQdztk5uSb8mbqg1YubTyKVhksZDlUVtB3MWF1npltpV7B/kzgdaI8pv/75QZm6ZjpEtPPV/R+9vPVNuf5mmte34boA/AAsPXtNveFY2giDwRe9G1HUyJzEjl9fWnXqqRqzPMuXywcnIyGDkyJG0aNGC4OBggoODCQoKIjg4uDKOsRoDOB0jGp3Vc7HESPHoEZKhXEvMICO3ABOlnLpO5mXePlJ7LKUZ8p3SFko6l+Kc/ELOav0oijoXA/oTVbBn8e+XRnJmHhfjxUJbJzp9FNcSM7melIVKLqOdj3RB9p7ou5y5nYa5kYJpD5gRPikGBLnrBdKf/3m+TDO9opgbKZildZrddiqWLRHSTi7GSrm+e7T+RAx7DVzTHt+mNr7OFqRk5fPpHw8vkBq5Wel9kj7YduahXQEXKxP6BIiF6s97Hi5gftLItOvkWye3xNtRPLGNWBLGp3+cM9jfxUQl57v+/nzbzw9jpWgh0H32wSc67gisacPPgwORCbAm7BbLytiC0zGmVS0maM013950moOXpBV9r3XyZmCQ6C8zdU0EUTHlM3x8wb+G3ozvva1nHllMVyQmKjlzhgRiopRz6HKiwVEq1ZSOwQXOjBkzUCqVfP/99yxbtozly5ezfPlyVqxYwfLlyyvjGKsxgAtawaZvBUczAJyPEx/bx9miREemNKK17qalOR1H30kr9rPLdzMoUGuwMlHiZmNS6m2ldKR0lva17M2wMVOVeXtd16hxTetiaeVlofPLGdK0ZpWIiqUyoU1tvX/MmxtPG2RHH1jTRl+sfbD1rORMpWBPW73o9e1Npw1yR1bKZXzd1w+Ztjuz+/zDr77f7OKDtamS6DvpjzxhTmpfB7lMYN+FhCp1qi0P9WtY8vsrrfT5U4sPXaPXnCPlEiD3D3Jn2+RWeDmaE5+Wy5CFofy069GxGJVJ5/pOvNNNDNr8bMd5ySvyb3XxpVfjGhSoNUxadVKSt45oYNlQH6o5dvnxcq99T+3oRQ8/F/H5V4dX2fq4t5MFH/a838GqSgPC/yoGFziXLl3iiy++qF4Tf0q5ovUz8Xas+AJH55UipXujVmu4kqA7luK3zy0o5Ib25FnXWfyZ7rY+ThbF9Dc5+UVu61T2a9J9GNZzkfb6T90SC6ImHmV3h3TEp+Vw8FIigoD+xPS0IAgC73arx/MNnckrVDNhZbhBpnCT2tWhiYcN6bkFvLrulOQV5De7+FJbO6p6z4ARF4C/uzXjtFqemZujHrqqa2OmYqa2Q/X9PxcfWoB52JnpHbO/Lsf6fFVjrBTzpxaPDMLWTMX5OFGAvPLodYOP3cfZgu1TWtJfO7KatesiQxeFPjEzubGtaun1Ja/8FiHJfVsmE/i6nx8htWxJzy1g3PITkrLPFHIZc4YE4ONkwd30XCasDC/XRpQgCHzTz0+79p7HpHKGfJaHgcHudKrnRF6hmunrT1XZ8/5XMbjAadiwIXfu3KmMY6mmArip/dD3tDer8MfWnVA87Mp+7ISMXPIK1MgEcH2gIxN7LweNBkyUchy03Y+YFPEq6UGRb1zq/dvam5fdkblpwDHC/cLKkI6XTivRyNXKIFFyVSGTCfwwoDGNXK1Izsxj9LIwySGdCrmMHwc2xsJI3CiZvUfaZoqJSs4P2hHX75GxbHuEaLg0pneuSx0HM+6m5/L+trMPvV3/Ju40q21Ldn4hb29+uHfIa529UWkFzM9K5k/Hek7snNaaNnUdyC1Q8/62s7y04oTBAmRTlYJv+/vzwwB/TFVyQq8m0/WnA3rDzapEEAS+7NOIei6i27FUfYmRQs78YU1wtzXhZnIWk1aHSyq2LYyVLNIWilG3U5m5Wdra+YOYqhQsGN4ES2MFp27d44s/q0Z0LAgCX/VthK2Ziug76czZW77NsGpEDC5whg0bxueff87mzZs5c+YM0dHRxb6qebLEpIgn+AfHPBVBrHZFV8pjx2mvGJ0sjUsIg3Wrvi7Wxvpuje7KzsWq+CaS7srTxcpYUtyB7nFqWEnbaIrRFkQ1DShUIrRjjxZ1yt4ke1KYqEQ7ehcrY64kZPLaWunCRXdbUz7rLSYf/7LnEsckajkau1vzSgfRmO+9LWckj7hA5+tTdoEkkwl81ccPI4WMw5eT2HCidK2Qm40p47Sjuq/+ipYUBfA04GhpzLJRwXzQo75WgHyXLj8eLFcERZ9AN3ZMbU1DV9H1evzKcN7ZElXlrrnGSjm/DAnAVCXnyJUklkrU49iYqVg8MhgzbZH23T/SfJrcbU2ZMyQQuUxgS8RtVoWWb7PK3daUWQMbA6IFQ1UVyvbmRnzyorgZNnffZYNcxqspjsEFzmuvvcaVK1d455136NevH7169aJ37976/1bz5MgtKCRFq39wroSV5aQMsU3sIEFzkqJtKduV0nXRaTRsTe//7J72e9YP5D/pOg9Sc6HSsgu0ty+726PRaEjSHqe9ATqay1oRs9Qx2JPCydJYdIrVpjD/uEu6kd+LjV31mzmvrjul/32WxZT2XuUacYE4qtIVSO9vPfNQ7YOnvRmvPycKQT/dce6h3jgT29XB3lzF1cTMcp/kngQymcCYVrXYOrmlfrNm1NLjfPz7WYNHLrXszdg8sSXj24gjwN+O3aT7zwcNDkp9XOo4mPNud1GP883OaMnZT3WdLPi2v7jZNG//FfZESysymtex421tFMknf5wrt+i4Yz0nXmotFspvbIwsdzq8oXRv5EIHX0fyCzWSzQ+rKYnBBc7u3btLfO3atUv/38pm9erVdOjQgUaNGtG/f39Onz5d6c/5rKArQJRyoUShUBHcy5ZebOgKEwujkrfVBSeaFRH1ZuWJ33tQ6Kv7QDdVSdsIy9FuoBhL8L/RaCBXO+M2M0BgrOtkPY3jqQfxc7PmS60R4Ow9l/UhrFL4+IUG1LI3Iy41hzc2Rkr6kC0x4npEFENpTG7vhb+7GEXw6tqHG66NbVUbf3dr0nMKeHNj6aMqC2Ml0zuLJoGz/r1YLq+ZJ0n9GpZsn9JKL+Beevg6L/xyiPNxholPVQoZ73Srx+pxTXGyNOJqQiZ95h5h9u5LVRrzMCSkpt7/5yMD3K+7NXLRvwczNpyWHA0yrnUtujRwIr9Qw7S1EfrPGEN5o4uvvgv2dhVFKgiCwMcvNMBEKRo56iJsqjEMgwscV1fXR35VJn/++SdffvklkydPZsuWLfj6+jJ27FiSkqrdHwG90ZqVifKx0qsfhq61baoquxjQFQ5GypJ/YgXak1bR0ZXue3JZ8eNWaz9MZJXweopiyKOnad/nio7BqCz6NnHTb1bN2BApeUPHTJs6rhuVSF1ddbc15fM+YlH1897LHDEg8VwplzF7UGPMVHLCrifzy0M0QHKZwPf9/fXJ6g/r0AwMdqe+iyVpOQV8vfPZG6EbK+V89EIDlo4Oxt7ciIvxGbz4y2EWHrhqsFdKSy97dk5rQ/dG4obQD/9epO+vRyRtKVUEgiDw6YsNUcoFDlxMMMj3Z2Y3X+q5WJKcmccbDyloS3u+r/v64WJlzNXETD79o3w6GpVCxqwBjVEpRF+fh41FKxp3W1Mma4OCv/jzfLkLtP9nyhV1fPPmTT799FNGjRrFqFGj+Oyzz7h5s/JNkZYuXcqAAQPo27cvXl5efPzxxxgbG7Np06ZKf+5nAd0/ACkFSHkoUItFi0ImoRzQfv6UVpgID94IkGtvp37gg0suE/9EpW4TGGu9f3Ik3F4QxG4XQLYBrX/deeXBYuxpZubzvjSrbUtmXiETVoaTLlF03NDVivd7iKOFr3dGS167fsG/ht4deeraUwZlJXnYmek1QD/tvvjQVXcvR3P9VtUXf0ZzPbFkirhcJvBpL1HPsP5EDCdvPp3mf2XR3seRv19tTad6juQVqvn8z/MMW3zskdEVpWFjpuKXIQH8NKgxlsZiInyP2Yf4Zc+lKtEpedqbMbyZJwC/GCCgNVLI+XmwWGTsv5jwSOfrolibqvhhQGNADOAtj5kiiCvcuty3z/88X2Vuw+Na18bNxoT4tFzJXkLV3MfgAufgwYN069aN06dP4+Pjg4+PD5GRkXTv3p3Dhw9XxjECkJeXx9mzZ2nRooX+ezKZjBYtWhAREVFpz/ssoeuaSIknqGwU2sKhtA9NXVcnJ//+z4y1I6isBwSQ5kbi9zMlXr1YmYhdFSmpwIIgYK3V6khZQ9UfqzaDq6rFmo+DQi7jlyGBOFuKouMZG6SNnEB0au7WyJn8Qg2TV5+UnLj80QsN9DECjxo3lUbvADf6BLii1sC0NREP1QCNaO5J89p2ZOcXMn196ZqfJh629A0Uzf8+2HbmifnCPC525kYsHBHEF70bYaIUBbtdZh0weGNNEARebOzKP6+1paOvWDB9989Fev58qEp8g8a3qY1SLhB2LZlIA57Py9FC79P0ye/nJP8dNq9jpx9xzdwcVe5OyNhWtWhQw5LU7HyDXbvLi7FSznRtYfXrvisGeUxVU44C5/vvv2fUqFFs2LBBnyC+YcMGRo4cyXfffVcZxwhASkoKhYWF2NkVd6e1s7MjMVF6C/w/jb5rUjkPr3NGzpNwpafTtGSUEranG+0UzS6y1hYmKQ/8A7YzE8W/ienSPsyctdtTsfekdQxqWIsbYbrtMyk4WIjHVFWCw4rC3tyIX4cFopLL+PtsPPMlxjmIq6t+eNiZcvteNtPXR0oaj5io5MwZGqA/Gf9kgMgZ4JNeDallL6ZTP0wDJJMJfNvfDwsjBSdv3ntohtHbz/tiYazgzO001lSRBX9lIAgCQ5rWZMfUVvi7WZGWU8C0tad4ZU2EwSc/ZytjFo0MYtZAf72BYu+5h/lg2xmDc8UMfd5ujVwA2HzSsHHP+Da1qetkTkpWPj/8K/3v6c2uPrham3D7XjY/S7Q+eBCFXMaXfRrpI0NOGGCi+Ti82NiVuk7mpOcUsPhQdeK4IRhc4Fy5coV+/fqV+H7fvn25fLl6Z/9Jost0qqwrVDNtl0VKQrC1vpNS8oNS5/xbVPSpKxoeFBDq1sbvpudIaqHrhL83k0uOK0qjttYvyJBVzJq2YlF0rZSRyNNOQE0bPtKlF++M5rBEfYylsZK5QwNRKWTsib7LPIlhll6OFnxZRI9jSJSDuZGCX4YEoFI8WgPkZmPKp710I61LpXYhHCyM9COGb3ZGP9GspoqgtoM5Gye24NVO3vrV+ud+3G9wirogCPQOcGP39Lb0CXBFo4EVR2/Q8ft9bDhxq9IykXoHiHrNP8/cMUi0q5TL9OGaq0Jv6H2sysJUpdC7BC86eJUbSeX7t+vnZs2AJmKg66d/nKsSwbFcJujjI5Ycvl6pxed/DYMLHFtbW86fLynWOn/+fInuSkViY2ODXC4vIShOSkrC3v7p9SOpSky0o5Oio5+KRDfOSZIwztEla8elZpf4EKhhLf7sTlqOXluj86G58YDrroOFEWYqOWoNkj6UdC7LUm3OG9SwBO47Gkuhnot4n6jb5Vs9fdIMDnGnb6C4Av7KmghuS7Sib1DDik+0xdF3f1+QbL3fK8CVoU1rotHAa+tOGeSP06CGFe93L1sD9GLjGvTwc6FQrWH6ulOljg+HNfOgQQ1RcFxVxm2ViVIu49VOddk0sYXeRXrkkjDe2xol6SKkKHbmRvwwsDGrxzWltoMZiRmimLfX3MMGxX1IpVltO2QCJKTnGqxnaeFlT6d6jqg1GGSE17m+E23qOpBfqOGbnRcMPWQ9M7r4YKqSExmTyt9VZJ7YpYEzdZ3MycgtqLIQ0P8CBhc4/fv354MPPmDBggWcOHGCEydOsGDBAj788EP69+9fGccIgEqlokGDBhw9elT/PbVazdGjRwkICKi0532W0I2FpLrWGoquy5KQVvYHkmjiJxZbiRnFCyIHcyNMtUWLrtNSS9dJeeCKTBAEvLRRD7osrEfRUJttdT0pS5J3S4A22DP8RrLkzpfuPseuJj2T/hS63J6GruJWysRV4ZIDHgcGu+v9caauiZAscv2gZ3383Ky4l5XP5N9OGuTnMqyZB883FDVAU347WeoVrCAIfNarobgGnZhZagGjkMv4vLc4Yth88nalnLifBI3drdkxtbVeZ7Iq9CZdfzog2aCxKLpNq5nP+2JupOB0TCr95x1l/IoTFbptZayU67utV8vRCdWlh287FSs5K0oQBGY+74sgwI6oOM7Glu8CxcHCSG8iOevfS1WS/K0LZwVYfuT6M6sjq2oMLnAmT57M5MmTWbVqFcOGDWPYsGGsWrWKKVOmMGnSpMo4Rj2jR49m/fr1bNmyhStXrvDRRx+RnZ1Nnz59KvV5nxXstOGS6TkFlZJhootcuCVBr2KkkONuI36APTj+EQRBnyt1Lk4XDmqpv6J7UNvi52YNIEkAaWOm0mdfSUlT9nOzwsJYQUpWvmTzs6a1bDFVyYlNzXlmuzjGSjnzhjXB2lTJ6ZjURyZ5F0W36mtoTo+RQs7coYH65/v494fHMZT2nF/386OmrSkxKdm8+RA9jrWpiu+0pnArQ2+wN7rkOKyxu3WRVPKzVeoDU5mYqMR18tXjmuJqbcKt5GwGLQzlk9/PGSyGVylkTGhbh70z2jE4pCYyAf45F0+XHw8wfd0pLlVQoaM7LrNybH36uVnTrLYthWqNQZqqei6WvOBfA4C5e6WNWUtjbOvaWBgpuBCfzq5HBMRWJC/418DGVElsak65nK3/HzG4wBEEgVGjRnHgwAF9B+fAgQOMHDmyUrxXitKtWzfeeustZs+ezYsvvsj58+dZtGhR9YhKi5WJUr/2bMharlQ87bRXXAnSrrh046LSjMkauopjntPaosVEJdcXPSdvFF/l1QVhhl2TdsXd0kv8e5Ci91DKZbTxdgBg5xlp7WZjpZz2vo4AbIkwbIPlacLN5r4V/arQm2wMlyb4NFGJOUGWxgoibt6TXBy52Zgye1AAggBrwm6x/vgtycdqaaxkzpD7AumHrcy29nZgTEttmvqm06V28d7o4oOViZLzcWnPlMOxFFp62bPz1db6Ff0lh6/xfDm7OQ4WRnzZpxH/vNaGrg2c0Whgc8RtOs86wOilYRy4mFDu7sW52DTuakdTupG1oejWzTeGxxh0HBPbid4yf56JM2i5oChWJkqGNxeDdhcdlOYP9bgYK+X0ayJuA64Jk/5v5/8ZgwucW7ducf36dQDMzc0xNxdPYtevXycmpvINkIYNG8bevXs5c+YMGzZswN/fv9Kf81lBJhNwsRK7LHGVkB7s4ywWJdF3pOlbGrlaAxBZSmdEV7QcL1LMNK1lC8CRK8U/jFt4idquqNupksShz9V3AuDfc/GSrtBfaCxe0W2JuC35ir6/9oNmU3jMM7Uu/iDtfRz1q7fvbonijMSOVE07U34c1BgQuyVSi6M2dR2YrhVMvrftjEEW+o3crHinm8735vxDV4zf7OqDl6M5Cem5vLf1TIluj62Zije7ig7H3/9zUbIz7rOChbGSr/v5sXR0MM6WxlxPymLgglA+3Ham1K3GsvBytGDe8CZsm9ySrg2cEQTYeyGBEUvC6PD9Pn7dd8WgxPqc/EJ9B6+7n4t+6cBQOtZzxNxIQVxqjj4fTgq+zpa09LJDo+GxNupGNPdELhMIu55ssLt0eRkQJAqc9124+8wL5asCgwucmTNnluo7ExkZycyZMyvkoKopP7ogzAfFuhWBLnvpamKmJKO4QA9rAI5fSy5xkgmppS1aYu7p11t1nZf9FxOK3d7RwlgvBt4toR0cUssWWzMVKVn5HLhU9lZJex9HbM1U3E3PldxubuPtgLutCWk5BWw0cNX1aWNaR286+DqSW6Bm0uqTkteNO/g6las4mtzeSzSsK1Dz8qpwyTlXACNbeNK1gVaPs+ZkqXozY6WcWQMao5AJ7IiKK9XmfnBwTTHqIbeAb/4uv+BUCjEpWew8E8eO03H8FRXHsatJBr3m8tLex5F/prdhULB4Ulx+9AbP/bDfoE22ovi7WzNveBP2vt6OUS08sTBScD0pi693RtPm2710++kgX++MZv/FhFI/H3LyC/kzKo5+845w7FoyKoWMt7r4lvv1GSvltPMRu68HJfw7L8rQpmL3ZfPJ2+XuQjlbGdOlgXgxVVXuxt5OFvi7WVGg1hgUu/L/isEFzrlz5wgMDCzx/caNG5e6XVVN1VLHQeyoSV2fNARHC2PcbU3QaCDi5r0yb9/EwwaVXEZsak6JlWpXaxO8Hc1Ra2C/9sOppZc9KoWMm8lZXHhgzq/zzfjjdNn/qBVyGb0ai2uo6ySMQVQKGYNDxJPAkkPXy7w9aEV/rUTR34IDV56ZtOrSkMkEZg1ojJuNCTeTs5i+XnryeNHiSGqxIpMJfD+gsd5XZ+raCMmiSZ0ex81G1JnM3Fx6EGEjNyte6SAWX+9vPaNPpS96DB9p14Y3hscYZDgnlU3hMXT98QCtvt7Ly6tOMvm3k0xcfZKBC0IJ+PRfQj7fxatrI9gSEWOQ0aQhWBor+aqvHyvHhuBmY0Jsag6jlx5n2tqIcrvxetqb8dELDQh9pyNf9WlEizriRtS5uDR+3XeFkUvCaPTRPzT59F96/nyIF385RJdZB2jy6b9MWn2SM7fTsDZVsmxUMDXtHi/PLUTb9T0p4fOoKB18HbHQdn8ex91aZyC5PTK2yvRcus/CvySO1P+fKZcGJzOzpAYjPT2dwsJnt1X/X8Fbq3u5cKdy8mWCPUsfI5WGqUpBkKc4itpTiuCzYz3x6mfnGbFoMTNS6PUwvz9w1d3DT/xHfehyoqStiYHaq9Z/z8VLmrMPb+YpuqteT5as9RkQ5I69uYpbydn8duzZXt20MlUyb9j95HGpNvq64sjDThQASy1WrEzE5zNWillShiSdW5ko+XlwgNihOR3H2ocUsZPa19Gb4b1TSiJzQE0b+mj9WD7cfrZCt2EWHbzK6xsiib6Tjlwm4OdmRUgtW4I9bXDVmkveTc9l66lYXlsXSfDnuxi++Bjrj98q1xipLFp7O/DPa20Y26oWMkHcPur4/T5+O3az3K/bzEjBoJCa/PZSM06815nv+vvTN9BN//qSMvOIup1KZEwqF+LTycwrxNXahJfb1uHPqa1p4fX42sn6WssGqenkOoyVcjrUE3V0pX02SaVNXQesTJQkZuQaXGSVl64NnQFRk1gZfyv/JQwucIKDg5k/f36xYqawsJAFCxbQpEmTCj24agyngXZNOup2aqWsMOsKEKmGYjo9TGkCXl3Rsvv8XX1Lu1eAqIfZGhFb7ETpYWdG01q2aDSw/kTZXRkfZwtaetmh1ogpzGXhbGVMP62B14+7Lkp670xUcqZp9SSzdl2stKvwqqKhqxWfaw3zZu26KPl3bGWqZP7wJpgo5Ry8lMi3Ekc+9Vws+aqPHwA/77ksafyoI6CmDW90EXU0H20/W+oKs1Iu47v+/qjkojnhppMlBeFvPe+LmUrOqVv32FxBgvGDlxL4bIfYzR7fpjYn3+vM9imtWD+hORtebsHhtztw5uMurHmpGZPa1aG+iyWFag0HLyXy5qbTNP18F29ujOTkzZQK/TdsqlLwfo/6bJ3ckoaulvrCr++8I5LHiw/D1kxFvyZufD/An8NvdyDyw+fYMbUVi0YEsWhEEKvGNmXH1FYcfLM9bz/vq3cQf1x0flvl6Ua11n6WHZZwsfYwlHIZHbQLB1W1TeVhZ4aHnSkFag2hj3Hs/w8YXODMmDGD0NBQunbtqo9q6Nq1K8ePH+fNN9+sjGOsxgDqu1iikAkkpOcSk2JYEJ8UWnvbIxPEzSgphm1dG7ogCHDiRkqJ2zeoYYmXozm5BWq9TqJTPSesTJTcvpddYhVySFNxvXdV6E1Jvi3j24jbEquP3ZC0VTapXR1UchlHriRJvqobHOyOr7MF97Ly+fI/YB7XP8idwSHiBs60tRGSt0x8nS35pp9YrMzbf0XflSuLXgGuev+W19adMshh9qXWtWlT14HcAjVT10SU6q3j7WTBq511+UVnSwiKnSyNmaIdZX3394UKSWzWRQEMCnZn5vO+WJmWTJ03N1LQvI4db3b15c9prdk3ox1vdPGhtr0ZmXmFrD8RQ5+5R3jhl8NsOHFLsk+RFPzcrNk6qSXv96iPmUpOxM17vPDLId7bGiU536ksrEyUNKhhRaf6TnSq70Qrb3sa1LDSu61XFEba3L38QrXBxWCwtrt8Pi7tscZLOh3Q0SosNlrUETWMx2/8N7ycKguDCxwvLy+2b9/O888/T1JSEpmZmbz44ov89ddf1K1btzKOsRoDMFHJaeQmdnGOSRy1GIKduRFB2jHVP+fKvmJxtjKmZR2xFf3gpo0gCHoB5KrQm2g0GoyVcgYEiXPtB1eBuzVywcXKmMSMXLaUcjX+IG287QmoaU1OvlqS54W7rSmjW3kC8NmO85LM6HTmcQAbwmM4dOnZz0X7sGcDGrmKpnyTVks35evpX0NvgPb6+kjJ8RfvdKtHQE1r0nIKmLhK+vPJZALf9/fHzkxF9J30h7rTjm9dm0au4qjqva1nSvx8dEtP3GxMuJOW89grvxfupBN2LRmFTODVTnUlW2d42psxub0Xu19vy/oJzekb6IZKISPqdipvbDxN66/3Mmfv5QoLW1TIZYxtVYs9M9rR078Gao34b7Ddd/tYfuT6M6Mpy9RuMJoo5QbblLjbmGKqkpNXoOZ6OaMb4P7Y/mxsqsEO0uUlUGs2+qClRjXFKVfstJOTE9OnT2fBggXMnj2bKVOmYG1tXcGHVk15aV5brO4PGbhZIJXuWpHbdokpxv21Bcu647dKXCn1DXTDWCnjfFwaoVfFgky3fnnwUmKx1rlS+6EMMGff5TI/hAVBYMZz4hhjVegNSXP6Ke29cLAw4lpiJvP2SzMCa+Jhw/Bm4lbGmxsjn/nEX2OlnF+HBWKjNeX7zIDk5Lee9yWkli2ZeYVMWHlCkkZApZAxd2ggtmYqzsWl8fHv0p/PwcKIb/uLnaMlh6+VOlZTyGV8298PhUzgn3PxJbpLxko5b3YVt3nm779SbvEtQLj2hNOstp0++NUQBEEgpJYt3w/wJ3RmR97s6oOzpTF303P59u8LtPhqN1/+db7CVtudLI35eXAAa15qho+T2In8cPtZuv54gN3n4596p27dv2mdCakhyGSCfuv0cWw1alib4GhhhFpDieWIysLf3RoQ/YSqwkn5WaVcBU41Tzdt697XyVSGsr+HnwtymUBkTKokV9OuDZ2xNVNxJy2Hfx/o+tiYqfSbCPO1AY7utqb6IurBrJmhTT30wl4pG1Itvezp4OtIgVrDZzvOl/mBbWGs5IMe4nbN3L1XJNvTv/28L552psSm5vDmptKddp8ldCaAgiBe2W+VqE9RymXMGRKIs6UxVxIyeWvjaUnvhYuVCT8Naqw1AbxpUMp0B18nRmpN12ZsiCx1k8vX2ZKX24ojyw+2nS2xXt6jkQt+blZk5hUye/clyc/9IBe0HlH1tbYGj4OtmYpJ7bw48GZ7fhjgj6+zBZl5hczff5VWX+/l3S1R5Taqe5DmdezYMbUVn/ZqiK2ZiisJmYxdfoKB80OrLDW7POjcyhu6WpXr/nZmogfP4+rnfJxFC42LlbTc8SC17M1QKWRk5hVWihThv0J1gfMfpImHDTamSlKy8gmrhA8nO3MjOmqFdaslbA8ZKeQM1epn5h24WuKE91Lr2sgE2HchQb+uO7m9F4IgrkIW7eKYqORMae8FiGJgKR2Cd7vXQykX2BN9V1I4Xg8/Fzr4OpJXqObVtackRRGYGSmYPTgApVzg77PxLJEgbH7aaefjyCva93rm5ijJm3kOFkbMGRqIUi760Eh9L1p7OxTx1TljUCTAzG717pv7bSs5hgKY0sGLWvZm3E3P5bsHhNAymcDM58VQzzVhN7lezqT4tBzx79HeXFWu+5eGSiGjT6Abf01rzZJRQTTxsCGvUM3qYzdp9+0+3t502qAA04ehkMsY3syDfW+0Y0Lb2hgpZIRdT6bfvKOMXhomKSqlKsnJL9SPvbs2cC7XYyi0zu+Pm+2kCwuWmov1uCjlMmrZifl91x5jvPZfp7rA+Q+ikMvorN1e2iHBN6Y8DNOOZDaFx0gK9xzZwhMjhYzIW/c4dLm4TsXT3kzvW/PdP+KJx8fZghe1mTFf/lW88zKkqQeedqYkZuTx856yr7brOJgzoc39q/eyRkiCIPBVn0ZYmyo5F5fG9/9I2wryc7Pm3W7iSfLLP8+Xyx7/aWNap7q09rYnO7+QSavDJYtwm3jYFHsvpHYBXungTSsv8fmm/Fa6cLg0jJVyfhjgj1y7Ov6gzYDuNrotsZWhN0pkjzWvY0fbug4UqDUGra0XRVcMq+QV/9EqCAIdfJ3YNLEF68Y3o5WXPQVqDWuP36L9d/t4c2NkhRQ6lsZKZj5fj31vtGNwiDtymcDeCwn0mnOYEUvCnpqQ2YUHrpKSlY+rtYnecsJQCgrF1yF/TPGzbpvr7mOMNw1F5yF0s7rAeSjVBc5/lBf8xYLhz6i4ShEMtvKyx9vRnPTcAtZI6OLYmxvpt6C+/6fkGva0Tt4o5aLuRudK+vpzPqjkMg5fTmLX+ftbTSqFjPe6i2OkxQevSbrSn9LBi9oO4tX7RxKCHh0tjfUrzPMPXJW8Mj2yhSc9/WtQoNbw8qpwgyzsn0bkMoEfBzbGydKIKwmZfLBNekhm0fdiym8RJEmwlpfLBGYNbIy9uREX4tP5RGLOFYgF5mRtx+n9bWdK3Zxr4WVPr8Y10GjEYvdB/YJu9Xx7ZKxkkXRRVPqtnsotAJrWtmPVuKZsmtic1t5iobP+RAztv9vHzM1RFVLouFiZ8GUfP3ZPb0ufQFfkMoEDFxMYuCCUPr8e4a+ouCcWVnrmdiqztRc3b3b1KXeBkqD9m7QvZ1yEDnMjMTA0swpjW5yfQFH1rFFd4PxHaVbbFntzMa5g34WKFxvLZAIvtRGdfBcduibpSntSOy9MlKLnyIOjIg87M31X6LM/zpNfqMbd1pSxrUVR8Sd/nC2W+dSpvhOd6onamrc3R5XZYjZWyvmuvz8yQcyc+uN0ySv8B+na0JlhzcSi7FWJK9OCIPBNXz/83KxIycpn9LKwZ150bGduxE+DApAJ4iac1NwpQRD4sk8jajuYcScth9fWR0oSRDpYGDFroJgx99uxm5JXzkEUidd3sRTFsg8pxt7pVg9zIwWnbt0r8VoaulrxXH0n1BrK1cUxUckBqsyArYmHLSvHNmXTxBb6QmdN2E06fL+Pd7ZEVcjIxNPejB8GNGbP620Z2rQmKoWMiJv3mLj6JK2+3svs3ZeIS606HUjEzRRGLgkjv1BDlwZO+nRwQ8kvVOv/TT+uL4+usM2V2HGsCOy0Y9CkZ9x/qzKRVOD06tWL3r17S/qq5ulAIZfRO0AXV1A5Lru9GrtSw8qYhPRc1koIrXOwMGKctmD56q/oEtqWaR29sTFVciE+nRVHxZTnKe29cLEy5lZydolx1McvNsRMJSf8RgrLH5IuXZTAmjZMandfUyLlKve97vVp5CoWKy+vCpcUrGmikrNwRBAuVqLQdsKqE5JHLU8rzWrb8ZrW1PD9rWe4fFeaPsbcSMGvQ0XH4gMXE/hV4mZaa28HvSj4rU1Rkk+gKoW4MSWXCfx15k6pBpOOlsZ6rc/XO6NJzS5egL6qfZ1/nI6THCyrQ9cJSKjiIMQmHjasHNuUDS83p5WXPfmFGn7TanQ+2n6W+ArYuvKwM+Pz3o049FZ7prT3wk67OPDDvxdp+dUeRi4JY2vEbUkj6/Kg0WjYcOIWgxaEkpSZR4Malnzd18/g9XAdF+6kk5OvxtJYgYft40VG6LrkukKnKjBTiV2jrGo344ci6bfRqVMnOnbsKOmrmqeHQSFi92FP9N0KaVk/iEohY6J2JPDL3suSrlontK2DvbmK60lZLD5U3HPE2lSlX9f94Z8L3L6XjZmRgo9eaACIo6Ki6dOu1ibM1Oo8vt4ZLemkO62TNwE1rUnPKWDKbyfLNFAzVsqZN7wJtmYqztxO442N0jaknCyNWTIqGHMjBaFXk5m6JuKJtfMrikntvfT6mKlrTkk2n/NxtuCTF0Ttyw//XiRcojnZ9M518XOzIjU7nxkbpHV/QHTzfrmt2F38YNuZUk+4I1t4UsfBjKTMvBKbevVrWNKtkSha/WWPtMgKHU6WYoHzYPZVVRHsacuqcU1ZP6E5zWrbkleoZtmR67T+Zi8f/35WkuFlWThaGDOjiw9HZnbgx4GNaVrLVsyUu5jAq+tOEfTpLsYsO87K0BsV8rmjVmvYeSaO7rMP8cbG0+QWqOng68j6Cc2xNi2/mFtnJBroYfPYBoQZWnG5ruioCnTFVN4z/rlSmQiap0EtVkVkZGTQpEkTwsPDMTc3f9KHUyWMWBLGgYsJjG7pyYc9G1T44+cVqHlu1n6uJ2UxtYMX07W+M49iY3gMMzZEYqKU8+/0NrjZ3L96Uqs1DFxwlOPXU2hb14Flo4MRBIHJv51kx+k4fJws2DalJcZKuf72o5Yd58DFBBrUsGTzpBYYKeSPfP6YlCy6zz5EanY+w5rV5LNejco85mNXkxi66BgFag3TOnrzWmdpppZHLicyaulx8grV9Gvixjd9/SrczbUqiU/LoeuPB0jJyuel1rV4V6uFKguNRsOr606x7VQsbjYm/DmtNZbGJR1+H+RKQgbdZx8kJ1/N+z3q632QyiInv5DnfzrItcTMh/6O90bfZfSy46jkMna/3hb3Ilfx5+PSeP6ngwgC7J7eltoO0j4vDl5KYPjiMLwczdk1va2k+1QmRy4nMmvXRY5fF/15jBQyhjb14OW2tXG0NNyn52FcT8xk88kYdkTFcSWhuOjV3daEwJo2NHa3pq6TBd6O5jhYGD2086JWa7h9L5vzcWkcvJTI3gt39avQZio5kzt4Mb51bRSPIeTWaDR0/GE/VxMy+bafH/2D3Mv9WADvboli9bGbkj8DK4Jlh6/x0e/n6O7nwpwhJQOw/2uU5/xdrcH5j6Nzll0bdqtSspJUChlv6UzSDlyVdMXWN9CVEE9bsvMLeXfLmWIdEZlM4Ms+fqgUMvZfTNB73Xz6YkPszVVciE8vlnUkkwl8288PG1MlZ2PT+PLP6DKf383GlB8HNgZEj5c1EsZrTWvb8Zl2A+en3Zck5WGBKGr9eUgAcpnAxvAYPth+5qnYQCkvTpbGfNNP1McsPHhNsnOzIAh81qshNW3FUM73S3EULo06Dub6IuqbndGShb/GSjlfaB2mVx+7WWpaeDsfB1p52ZNXqOabB9bG67lY0qmeIxoNLDx4VdJzAnhqV3dvJmU99upxRdDCy571E5qzcmwIgTWtyS1Qs+TwNVp9s5ePtp+tsE6Tp70Z05/zYdf0tvz9ahve6OJDsKcNcpnAreRstp2K5ePfzzF00TFCvtiNz3s7afnVHnr+fIi+vx5h4PyjvPDLIdp9u5cGH/5N62/2Mn5lOCtDbxCTko2FkYJXOnhx+O0OTGrn9VjFDYgu7FcTMjFTyfXhlY/DNa2tQNGLtcpGJ2SvjI29/woGvzOFhYUsXryYfv360bJlS0JCQop9VfN00drbnoaulmTnF5aIPqgoujZ0plltW3IL1Hy+o+w8JkEQ+KJPI1RysYjZ/EDsgpejOTOeEzskn/5xjhtJmdiaqfRZR4sPXSuWU+Vkacz3A8ST7rIj1yWtxrf3deR1bRfmg21nJK10DwqpyaR2oi5k5uYo9l6QllfVpYEz3/f315vmfbj97DNd5HSu76T3NZqxIbKEhuVhWBgr+XFQY+QygW2nYiWbBw5rWpPW3vbkFqiZsSFScuHQvI4dvQNc0Wjgva1nStxPEARmdvNFEMT0+geLoAlaDdCm8NuSnYNrWJtgpJCRV6iulLFweRAEgdbeDmya2IIVY0II8rAhr0AcXbX5Zi/vbKmYrSvdc/k4WzC5vRcbXm7BqQ86s3JsCK91qkunek7UsjdDJohjldv3som6nUr4jRSOXUvmdEwq15OyyM4vRCWX4eNkwbBmNVk0Iohj73bk9ed8HmskpSO/UM2sf0UB+aiWnlhI6CQ+Co1Gw/k4UatVz+XxDR6logsotjCuurHYs4bBBc4vv/zC0qVL6datG+np6YwaNYrOnTsjCAJTpkypjGOs5jEQBIGJbUWdzNJD1yplo0cQBD7s2QC5TGDn2TuSUqG9HM2Z1kkUen60/Sy3H9j2GNuqtt7yf+qaCPIK1HTwdWKE1rH2tXWniglPO/g6MUGru3hjY6Tk1fHufi7kF2qYsCpcfxX2KN7o4kPvAFcK1RomrgqXrCfpFeDKN339EARYcfQGH24vuaL8LPFe9/rUshe3oz41YJU7sKaNXuD7/rYzksTDgiDwdV8/LLSbT0sPS8+LmtnNFwsjBVG3U0vtujWoYUXvBzyYdAR52OhN9aReHMhlgn6cdakca+aViSAItKnrwIaXm7N6XFNCPEWNzm/HxAyq19adkuzcLRULY6Vo4NjJm0Ujg9g7ox3Rnz7Pobfas3lSC5aMCmLesCb8PDiAxSOD2PByc/a83pZzn3Th79fa8FmvRnSq74RpBWpbFhy4SvSddKxMlIxrVfuxH+/S3QxSsvIxUsjwdqo66UOitiNfEUXffxWDC5zff/+dzz77jDFjxiCXy+nRoweff/45kydPJjIysjKOsZrH5PmGzvg6W5CeW8C8A9K2WAylnoulfhz2/tYz+quLRzGhTW1R8JtbwPR1p4pdYev8V6xMlETGpPL1TnH09E63ejR0tSQlK5/Jq08W28R64zkfmte2IyuvkPErwyUZ+n3Xzx9/NzFYcvTSsDK9WnQn27Z1HcjJVzN66XHOxqY+8j46+ge583Wf+0XOu1ujntkix0Ql59t+4mvZGB7Dnuiyi1odk9rVwd9dFHq/tSlKUjerhrUJ73QXBeXf/XNBcuq4o4WxXi/1TSkbUwCvda6r92AqmggtCAITtFYIK0NvSA5S9NXa9l8wcAOrqhAEgZZe9qx/uTnrxjejtbc9hWoNWyJu89ysA4xZdpyjVyrPzE+lkOFmY0pgTRs6+DrRtaEzPf1r0LGeE8GettR2MH/sEdTDCL2apF///6BHfWzMHr84OKD1yAqpZavXBlYFcdqLQpdyZJ79v2DwX1FiYqI+NdzMzIz0dLHib9++Pfv27avQg6umYpDJBF7XCt8WH7pWYfk1D/Jqp7p4aPOYPvuj7FGVQi5j1oDGmKnkHLuWXGKbpYa1Cd8WGUvtPBOHsVLOnCGBWBorOHnzHh8XMe1TyGX8MiQAV2sTriVmMvm3k2WaHJqo5CwcGYSrtQnXk7IYs/xEmW69KoWMecOaEORhQ1pOASMWh0lemx4Q7M63/UQ/njVht5ixIfKZ3a4K8rTVF7UzN0dJXg9WyGV8398fI4W4Oi5VzzQo2J0WdezIyVfz3lbpWqYRzT3wdjQnJSufX0pxvna3NWVQsDhym7WruAllp3pO1LY3Iz2ngE0S87F0uUTnqyiX6HFoWtuOlWOb8vuUVjzf0BlBELcuBy8Mpecvh9gSESMpquRZ4MKddF5acYL8Qg3dG7nQJ9C1Qh73D+1IXBdfU1Vc1XacPeyqTvfzrGFwgePk5ERCglixuru7c/jwYQCioqJQqapbZU8rneo5imujBWq++qtsIW55EK/qRa3JuhO3JF3Ve9qb8alWvPvjroscuVJctPpcA2fGa6+iZ2w4zeW76XjYmfHToAAEQRSQrj52Q397O3MjFo4IwlQl59DlREl6F0cLY5aPCcHaVEnkrXtMWi2tMFoyOpiGrpYkZeYxZOExSWnlAP2auPHTIFF4vDniNhNXn3xmfXKmd/bB086U+LRcvt0pLdICxBHl61qd1Wd/nJckdhUEgS96N0KlkHHwUiLbS4ljKA2FXMa72u7PsiPXS3WXntS+Diq5jLBryRwtoseSyQRGtvDU31dKUaXTYZyPfTo7OKXRyM2KX4c1Yc/r7RjezANjpYwzt9N4bV0kLb7aww//XKiynKXKIPLWPYYuCiU9p4BgTxu+H+Bfbv+colyKT+fUrXvIBOjuVz7DwfKQnVeo1015Of5/bASXB4MLnM6dO3P06FEAhg8fzk8//cRzzz3Hm2++Sd++fSv8AKupGARB4P0e9REE8YrjeCUlBIfUsmVMS/Gq/o0NpyX5bvQJdKNvoBtqDUxdE1HiZPdGFx+a1rIlI7eAcctPkJqVT3tfR2Zou1IfbjvLkSL5VvVrWPKjNgn7t2M3mX+g7C0YL0dzFo8MxlgpY9+FBF6X4LpraaxkxZim+DpbcDc9l8ELQyWHNPb0r8GvQwNRKWT8ey6ekUvCKs0grTIxUd3fVlp17EYxn6KyGNuqNo3dxRHlxxLiM0AsiHUBoJ/tOC/5PWvn40hrb9EA79tSssVcrEwYFCKuCj+YJt63iRtmKjlXEzI5cqVsMXp9bYFzLSlTcnbX00It7QXHkbc7MuO5ujhZGpGYkcvsPZdp9fUexi0/wa5z8c9U13FLRAwD5h8lMSOP+i6WLBwRVGGjpEUHRT1Y5/pOOFg8XtyDIZyLS0WtEc1THR4zZuK/jMEFzowZM3j55ZcB6NatG6tWrWLw4MHMnj2bGTNmVPgBVlNxNKhhpW/Fv7/1TKVkVIFYkPg6W5CUmcf0ddIM2j7r1RBfZwsSM/J4eVV4MRM5pVzG3KGB+jHSpN/CyS9UM6ldHXo1vp/7VHRM9FwDZ31e1Vd/RUva2GniYcOvw5qgkAlsj4zlXQljEFszFavHNaWukznxabkMXHBUcifnuQbOLB8dgrmRgmPXkhk0P7RCHGermhZe9ryozXd6b9sZyboiuUyMclBoXYeliNMBxretTS17MxLSc/lpV9lhqzrefv7+xlTRhHodL7etg1IuEHo1uVg4qLmRgj6BbgCsOHq9zOdxsDDC0cIIjQb9ds2zhq2ZiikdvDn0Vgd+GRJAs9qimd+u8/GMW3GCZl/u4fMd5zhzO/Wp3Qi8m5bD1DURvLYuUm8OuG5CswoT5d5MymKL9nPlpdaPL1Y2hIib9wDwd7OqkE7Uf5XHVnIFBAQwevRoOnToUBHHU00l80YXH2xMlUTfSWeBhM5GeTBWyvl5cAAmSnFMNHdf2W6wJio584c3wcpEyalb93j/geKi6Ojp8OUkfejjV339aKLVwoxccrxYx2hsq1r6btKMDZF6MeCjaO/jyI+DGms1Mjf55I9zZX6A25kbsXpcM7wddUVOqKQtLhBXmdeOb4a9uYpzcWn0mXtEsp7naeJdbb5T5K17bAiXpqkBcZyjM+/7cPtZSVEYRgq53t16+ZHrkt+vBjWs9An13/5dsotTw9qEvtpCZt4DkRLDtdt7u87flbT51aCG2MU5+wyNqUpDKZfRw68Ga8c3Z9f0NoxrVQs7MxWJGbksPHiNHj8fovOsA/zw70XOxaY9FcVOVl4BCw5cocP3+9keGYtMgKkdvVk4IuixV8KL8s3f0eQVqmnlZU8TD5sKe1wp6DqJIbVsq/R5nzXKVeBcvXqVTz75hJEjRzJy5Eg++eQTrl6tnJNlNRWLrZmK93uInY2fdl8qV2KyFLydLPjkRfEk9MO/F/UJ4Y/Cw86MnweLoY7rT8SUMFirX8OS2VrtzZqwm/y6/wrGSjH3qZa9GbfvZTN66fFiG1zvda+nT7SesDKc8BspZR5HD78afN1XFDcvPXydr/6KLvOD28HCiDXjm+HrbEFCei6DFoRyTuLJraGrFZsnttS/hr6/HpXky/M04WhpzKvatf/v/rkoqVDRMbWjNzWsjIlJyS5RWDyMtnUd9GGrUswddbzWuS4KmcD+iwmlrviPb1MbQRALmaKFU10nC0Jq2VKo1ujNJx9FQ1crgFI7Rc8qXo4WvNejPkdndmTB8CZ0a+SMSiHj8t0MZu++RLfZB2n9zV7e33qGPdHxkrfOKorb97L5emc0zb/cwxd/RpORW4C/uzVbJ7dkeue65U4cL40DFxP443QcgiBudlZlFyUnv5BQ7edDizr2Vfa8zyIGFzh///03PXv25OzZs/j6+uLr68u5c+fo2bMnf//9d2UcYzUVTO8AV9r5OJBXoObNjdKN0wylXxM3Bga5o9bAK2siJJmJtanroHeu/fKv6BKp453qO/FBD52z7QW2RtzG1kzFstHB2JurOBubVmzEJZMJfN/fn9beYobS6KVhksYG/YPc9c7F8w9c5Zu/L5RZ5NibG7HmpWZ64fGgBUc5ebPsggqgpp0pmya2IKCmtRghsfgYWyKkbe08LYxo7om7rQkJ6bksPSLdq8bMSKH/nc8/cEWymPWdbvVQyAR2R98tpsF6FB52ZvRrInZpfixlvFXbwZxO9ZyA+/oKHUO02W4bTsSU+W+mQQ1dgfNsd3BKQ6WQ8VwDZ+YObcKJ9zrxwwB/Otd3wkghIyYlm5WhNxiz7AT+H/9Dv1+P8PXOaP45e0eyWaJUNBoNF+PTWXLoGgPmHaXlV3v4dd8VUrPz8bQz5Zu+fmyZ2AI/N+sKfd7UrHze2nQagJHNPalfo+rM/QAOXkokK6+QGlbG+k5hNaVjcBZVp06d6NmzJ9OmTSv2/dmzZ7N9+3Z27dpVoQdYkfw/ZlE9jNh72Tw36wAZuQW80cWHyVrhZkWTk1/IgPlHOR2Tiq+zBZsmtsDM6NGmXRqNhve3nWFV6E2MlTLWvNSMgJrFW8Cf/XGORYeuoZAJLB4VTNu6DkTFpDJowVEy8wrp0sCJOUMC9X4aWXkFDF8cRviNFOzNVawd31zS9sGKo9f147AJbWvzdlffMq/WUrPzGbPsOOE3UjDVJou39JJ2pZWdV8j09af4S5uC/Vqnukzt6PXMzNk3n4xh+vpIrEyUHHqrveSRgEajYeCCUMKuJdMn0JUfBjSWdL8Pt51h+dEb+LlZsW1yS0nv063kLNp/t48CtYYtk1qU+Ns6fj2Z/vOOolLIOPp2B+y0Is6c/EJCPt9FWk4Bq8Y2pZX3w3+nMSlZtPp6LwqZwJmPu1SpP8qTIiuvgCOXk9hz4S4HLyVwK7lkoWpvrqKeiyV1HMzxsDOlpq0pTpbGOFoYYWmixEghK/Y71Gg05OSrSc7KI+5eNjEp2VyMTyf6jri9VDR+RhCgeW07RresRQdfxwrt2OgoVGsYs+w4+y8mUMvejD+ntsZEVbW/W10uX2XlCz6tlOf8bXCB4+/vz/bt2/Hw8Cj2/evXr/Piiy8+1WZ/1QVOcXShlwqZwMaJLWjsbl0pzxOXmk3Pnw+TmJFL1wbOzB0aWGbgZEGhmnErTrDvQgK2Zio2TWxBLXsz/c/VajG8cXtkLCZKOavGNaWJhw2HLycyWhtu2TfQjW/73Q+3TM3OZ8jCUM7GpuFkacS68c3xLPKYD0MXagditte73ctuSWflFTB+RTiHLieiksv4eUgAXRpIy7xRqzV8vTNav/31gn8Nvunn90ycJAvVGjrPEkMMX+9cl1e0rsVSiLx1jxfnHBY3/V5ppe+CPIrEjFzafLOXrLxCfh0ayPONXCQ914wNkWwMj6FTPUcWjQwu9jONRsMLvxwm6nYqM56ry5QO91/DO1ui+O3YTXoHuDJLm2dWGhqNhuDPd5GYkcemic1p4vH/p5W4lZzF0StJnLyZQsTNe1y8m05ZZxuFTMBYKUcANEB2fuEju2UmSjlNPGxo7+vI8w2dqWFtUqGv4UG+/Os88/dfxVgpY/PEllXevUnOzKPZF7vJK1SzY6q0fyP/FaokbDMkJIQTJ06U+H54eDhBQUGGPlw1T5C+ga5093OhQK1h6poISe7D5cHFyoT5wwNRyWXsPHuHr/8uWzOhkMuYMySQRq5WJGfmMWLJsWItbplM4Lv+/rSp66AfPZ2LTaNlkXDLTSeLh1tamShZOfb+xtPghaGleqI8yKiWtfhUqydadOiapJgFU5WCRSOD6NLAibxCNRNXhUs2tJPJBGZ2q6ffMNoeGcvghaGSVu6fNHKZoI9iWHL4mkFaHH93a3r4uaDRwPf/XJR0H3tzI73Z4KxdFyVvcE1qV0evtXlQEC4IAqNbegKizUDRE6xOhLzzzJ1HakwEQdBfMJy69d/R4RiCu60pA4Ld+aqvH3+/1oZzH3dl2+SWfN23ERPa1qZrA2caulriaGGE7nqnQK0hI7eA9NwCMnIL9O+9Ui7gbmtCSC1bhjStyacvNmDTxOZEfvgcq8Y1ZWyrWpVe3Mzdd5n5+8WLjq/7+lV5cQOi9jCvUE1DV8v/q+KmvBjcwVmzZg2zZ8/m+eefx99fDDiMjIxk586dvPLKKzg63ndz7NixY8Ue7WNS3cEpSWp2Pt1+Osjte9n09K/B7EGNK20csiUihtfWiR2+z3s3ZGhTjzLuIV6h9/31CDeSsvB1tmDdhOZYmdwfezw4elo3oTl1HMzZGnGb19afQqMRt6neK9J1EUXAR7mSkImrtQlrXmpGTQluoGvCbvLOlig0GhgQ5MaXffzKbIMXFKp5d8sZ1mmLm7e6+vJy29qS3+MjlxN5eVU4aTkFuFgZs2B4EI3cnu4PtoJCNe2/38et5GzJv2cd1xIz6fTDfgrVGjZPakFgzbK3U1Kz82n19R7Scwr4eXAAPf2lGa69vDKcnWfv0L+JG9/29y/2s5z8Qpp/uZuUrHwWjgiic31Rl6PRaGj/3T6uJ2XxwwB//fp4aczefYkf/r3IC/41mD04QNIx/b9SqNaQlVdAZm5hMdNLE5UccyMFpir5Ex3Tztt/RW+Q+vbzvrysDWKtSvIK1LT5Zi930nL4vr8/fZs8/G/vv0iVdHA+/vhjUlJS+O2333jrrbd46623+O2330hOTubjjz9m8uTJTJ48uTp48xnBykTJ7MGNUcgEfo+MrbTEcYDeAW76TZv3t55h17myfU/szY1YMSYEe3Mjou+kM3ppWDHzNFOVgiWjgqnvYkliRh5DFx7jZlIWvQJc+VJrQLf40DW+2nl/E8rBQhQD13YQt5YGLTgqKdtocEhNvu/vr9/ymrY2okwbe4VcxlfaK1aAr3dG88kf5yR3Glp42bNtSivqOJgRl5pDv3lH2HZKWgr3k0IhlzGyuScgdkAMoZa9GX21Fvpz9pRtLwDi37Bu1XzO3suSV5Vf0jpkbzsVS+IDGWTGSjkDgkTjv7Vh91+DIAj0DnDT3+9R+Gs7OFH/oU2qykIuE7AwVuJsZYynvZn+y8nSGDMjxRMrbgrVGj75/Zy+uJnW0fuJFDcAG8JvcSctB0cLI3r4SxvF/r9jcIETHR0t6ev8+bKziKp5OmjiYcs73UQr+893nCfsWuW4HIP4ATEgSHQtnrLmpKS1bQ87M1aODdHnT41fEV7sKk8cPYXg7WjOnbQcBi8M5VZyFoNCaupjIObvv8rXO+9vQjlaGrNWW+TEpuYwcH6oJIO+PoFuzBkSiFIu8MfpOCasPFFmzIIgCMx8vh7vaeMClh6+ztS1EcXMDB9FLXsztkxuSXsfB3IL1Exbe4rP/jj3VLvJ9gl0QyWXcTY2zeBV6YntvJAJsDv6rmSjvFEtPDFTyYm+k87eC3cl3aeJhw3+7tb6RO0HGRgsFjh7LxT3vnmhsdghOnQ58ZHhrI20q+LXEjNLDfms5ukmJTOPMcuOs0SbXj/zeV99cGtVk5NfqC/4J7arg5Hi6dfjPQ1UTmRrNc8co1t68oLWL2bS6pOSsoHKgyAIfN67Ee18xDTuMcuOSzLFq+diybIxIZhpM6YmPZAkLprtNdV7yQxeGEpMShbDm3nwUU9xBXne/ivFOjmOlsasHd8ML21hJNWg7/lGLiwYEYSRQsbeCwmMkBizMK51bX4aJHbL/jgdx4jFYZJPfJbGShaNDGZSO/HqcdGha4xYUnb6+ZPC1kylH+sY2nGqZW+mFws/6IX0MKxNVQxtJo7CdDoJKYwporV5sGCs7WBOiKfo4Lv55P3XUMvejIaulhSqNfz7iC6krZkKNxtRFyI1cb6ap4OjV5LoNvsg+y8mYKyU8fPgACY8oc4NwMIDV4lNzaGGlTGDtXYF1ZSNpAJnxYoV5Obm6v//UV/VPJsIgsBXfRtp4xJymbDyhEECUUPQRS/oPF+GLw6T5JETWNOGxaPEvKg90XeZ8kBauKOlMWteaoannSkxKfeLnFEta+lNB+fvv8rnO87fL3IsxCJHZ9A3cEGopJNRex9HVo5tioWRgrBryQxeEFpizFEaLzZ2ZVmReIb+845I9n2RywTe7OrL3KGBmKrkHLmSRI+fDxEh0WunqtF1Ov44HWeww+14rfX99lOxkv1TRrf0RCETOHYtWXLXqGtDZ+zNVdxJy2FXKVER/YPEcdSm8Jhir+H5hmIB9ueZOyXuU5SGWiHo2f+gH85/kbScfN7feobBC0OJS83B086ULZNaStZ1VQa3krOYu080wJzZrd4zsU35tCCpwFm2bBlZWVn6/3/Y1/Llyyv1YKupXExVCuYPb4KNqZLImFRmbIysNOt1U5WCJSOD9WOloYuOSTqRNattx8IRQagUMv45F8/UNRHFrrydrYxZM74ZHnam3ErOZuB8cVw1ormnfly16NA1PiqyCaUz6NNtbA1eECrJoC+kli1rxjfDzkw0GOw/76ikQq2Vtz3rJzTHydKIi/EZ9Jpz2KAxTrdGLmyd3JLa9qIuZ8D8oyyXmHRdlbSt64CJUk5cag7nDMxk8ne3pomHDQVqDWvCpG2fuViZ0E3b+VkuUUtmpJDTX6e1KcWhuFsjF4yVMq4mZnK6SJBolwZid+rolcRHbh/qjNgMff2Pw82kLP44HcuPuy7y5sZIpq6JYMLKE0z+7SRvbTzNF3+eZ8mha/wVFcfZ2NRKu5B5lihUa1h//BYdvtvHytAbAAwKdmfH1Nb6dPgngUaj4YNtZ8jOL6RpLVt6+FVrbwzB4C2qZ5nqLSppHLuaxLDFx8gv1DClvRczuvhU2nPFp+XQf95RbiZn4e1oztrxzfTGao9ib/RdJqwMJ69QTfdGLvw4qDFK+f16PS41myELj3EtMZMaVsb89lIzPO3NWBt2k5naTaiBQe580aeRfhMqLSef0UvvG/QtGhFECwkGfVcTMhi+OIzb97JxsjRi+ZgQfJ3L/lAUoyXCuBifgZlKzi9DA2nv41jm/XSk54iOqn9GiV2Ebo2c+aqvH5YVmLfzuIxbfoJd5+N5q6svE9sZ1uLfduo209aewsXKmENvdZBk3BZ+I4W+vx7BSCEj7J1OWJmW/V7cSMqk7bf7EAQ48nYHXKyKrxu/siaC3yNjGduqlj7mRKPR0OH7/VxLzGTOkEC6P+TEs/t8PGOXn8DHyYK/X2sj4VWXj9TsfDaGx7Dt1O1ihZhUXK1N8HW2oJ6LJQ1qWNLQ1Qo3G5NnxmCyvBQUqtkRFccvey5zSRtbU1ubqC7VnLMyWX/8Fm9uOo1KLuOvV1tTx+H/97xVJVtU1fz3aVrbjs+1G0i/7L1cbIukonGyNGb1uKY4Wxpz6W4GQxcdI6WIO+nDaO/ryNyhoth3R1Qc09ZGFBtXuViZsHZ8M+poRcQD5h/l8t0MBhXZhFp34havrTulv5+lsShWbuVlT1ZeIaOWHX+kxkJHbQdzNk1soffX6T/vqCShtqu1CRsntqBFHTsy8woZt/yE/upRChbGSuYMCeT9HvVRygX+jLpDj9mHiLx1T/JjVDbNaosGd1IjK4rSpYEzlsYK4lJzOHpFWjZXYE1rfJ0tyC1QS4668LAzI6SWLRoNbI0ouRmlu2r+KypO3/UTBIGOvmIxuif64aJmX+3V/5WEjDI37srLtlO36fDdPj794xynY1KRywT83a3p38SN1zvX5f0e9fm0V0M+7FmfGc/VZWyrWnRv5EJATWtstAXg7XvZ7I6+yy97LzNx9Ulaf7OXwE//ZeSSMH749yJ7ouOfWr1XeUjNzmfZ4Wt0+mE/09ae4tLdDCyNFbzbrR47X23zVBQ3VxMy+HC76KL+Wue6/9fFTXkxuIPzyiuv0KhRI8aPH1/s+wsXLiQqKorZs2dX6AFWJNUdHMP4/p8L/LznMnKZwOKRQbQzoLtgKFcTMhi4IJSE9FwaulqyemwzSVffu8/HM3HVSfIK1XSu78QvQwKKbRgkpOcybNExLsSnY2emYuXYptSvYcmfUXHieEutoVM98X662XZOfiFT10Twz7l45DKBb/v5PdLvREdqVj5jlx/nxI0UVApRmCjFvTivQM07W6LYGC6ekMe2qsU73eoZZDV/6tY9pvx2kpiUbBQygdef82FCm9plOkZXNmHXkhkw/yiu1iYcfruDwfd/d0sUq4/dpG+gG98P8C/7DojjqQ+3n6W+iyV/Tmst6T7rjt/krU1R1HUy55/X2hb7WU5+IU0+/ZfMvMJi0Q5HryQxeGEodmYqjr/bqdT3WqPR4PfxP6TnFLDz1daSOntSyS9U814Rj6U6DmaMaO5Jdz8X7CV0QXUkZ+ZxSRt/cD4ujTOxqVy4k05+YclTg7utCY3dbfB3s8Lf3ZoGNSwxVT06euVpoaBQzeErSWw7dZs/o+LIyRcLThtTJeNa12Z4c4+npvuZlVdA7zlHuBCfTvPadqwe1/SJ/1t+0lRJVEOzZs1Yvnw5Pj7FxxYXLlxg9OjRHDlyxJCHq1KqCxzD0Gg0vL4+ks0RtzFVyVk7vlmFB9cV5VJ8OoMWhJKUmYefmxUrxzYtZur3MPZe0I6rCtS093Hg12FNignxdE7IZ26nYWWiZPmYEBq7W7MnWiyOcgvUtKgjant0OVkFhWre3HRavz3zYc/6jG5Zq8xjyc4r5JU1Eew6H49MgE9ebMiwZmUb3Wk0Gubsvcx3WgffTvWc+GlQ4zJzu4qSmp3PO1ui2HE6DhBzeb4b4I9rJTu8Poq7aTmEfLEbmQAXPnu+2BhRCseuJjFwQSgWxgpOvNdJ0npsSmYeIV/sIr9QI7moSM3OJ/izXeQVqvn71Tb4OFsU+7ku/2diuzq81dUXEAvTgE/+ITOvkD9eaaVPEH+QPnMPc/LmPYNMCMtCo9EwY8NpNp2MQRBgagdvpnTwMvj9fRi5BYVEx6UTGXOPU7fuEXnrHlcSSnpFyQQxab1BDSsauVpSv4YVvi4WT02hcC8rj8OXk9h74S57ou8Wy67ycbJgaLOa9A10M+jfWWWj0WiYuvYUv0fG4mBhxI5XWuFoafykD+uJUyUjqqysLJTKkn+8CoWCjIyyfUSqeXYQN6v87o9slh7n8t3K+x17O1mw+qWm2JgqOR2TyvDFxyStUbf3cWTJSHG7au+FBMYuP17MDNDWTMXqcc0I1G5tDV0YytErSXTwdWLZaHH1/MiVJIYuOsa9LPEDUCGX8V0/f8Zoi5qPfz/HD/+UnShuopIzb1ggg0PEFPX3tp7hOwlJ5IIgMKWDN7MHB6BSyNh1Pp7+844W818pCysTJb8MDuCbvn6YKOUcvZpE11kH2Hwy5okJkO3NjZDLBNQaSMooe/T4IMGetjhaGJGeU0DoVWn+TDZmKr2WqSwzPh1WJkra1HUAYEdUXImfP6dded9dZNNKpZDRvI44yjh46eFp5nWdxGLpogQLAqmsPnaTTSdjkMsEFgwP4rXOdSusuAFRfO3vbs2I5p78MKAxu19vR+SHz7FybAhvdPGhUz0nHC2MUGsg+k46m07G8NHv5xgw/yh+H/1Dq6/3MGbZcb786zzrT9zixPVkEtJzK/XvMLegkLOxqaw/fov3tkbRZdYBGn/yL5N/O8nG8BiSM/OwM1MxvJkHmyY2Z+errRnR3POpKm4Afvj3Ir9HxiKXCcwZElhd3DwGBndw+vXrR7t27Uo4Ff/888/s3buXzZs3V+gBViTVHZzykZ6Tz5CFx4i6nUoNK2M2TmxRqbkv5+PSGLroGMnaTs6KMSFYm6rKvF/o1STGLjtOZl4hQR42LBkdXOxKMjO3gPErT3D4chIqhYxfhwbSsZ4Tp27dY9TSMO5l5ePjZMGKsSE4aT9UNBoNv+y5zPf/ip2VoU1r8smLDcscH2k0Gn7cdYmfdl8CxAyjr/o2knQSOnkzhZeWnyApMw9HCyMWjAgyOAj1WmIm09efIuLmPQA61XPk896N9K+rKmn44d9k5Bawb0Y7SeGmDzJz82nWhN1iRHMPPnmxoaT7/B4ZyytrIvCwM2XfjHaSxLKbwmN4fUNkqWOq1Kx8Aj/7l0K1hoNvtsfdVoz2WHLoGp/8cY42dR1YMSak1MdddPAqn+04T9cGzswb3kTS8T+Ki/Hp9Pj5EHkFat7tVk/vyPwkiE/L4XRMKmdui1/n49KIfYSHlrFShruNKc5WxjhbGuNkaYytmQo7cxUWxgrMVArMjBQo5TKUcvF3ptaIW07Z+YVk5RWQmpVPSlY+iRm5xKVmc/teDtcTM4lJyaI0g3BvR3Pa+zrSrq4DIbVsUVRgIVjRrAq9wXtbzwDwdd9GDAyu9rzRUSUjqj179vDKK6/Qo0cPmjVrBsDRo0fZsWMHP/30E506dTL8yKuI6gKn/CRn5tFv3hGuJmRS296MdROa42Ahfc5vKNF30hiyUCxy6rtYsmpcU2zNyi5yTt5MYdSSMNJyCmjoasmKMcXvl5NfyJTfxBGSQhvY2SvAlYvx6QxffIz4tFzcbExYNbZpsZPxytAbfLDtDBoNPN/QmVkDG0vyo1gbdpN3t56hUK2htbc9vw5rgrmEK8ZbyVmMW36CC/HpGClkfNvfnxcMHG8UFKqZt/8KP+2+RH6hBgutiHJAkHuVzvPrf7CTrLzCchc4/56L56UVJ6hlb8beGe0k3Sczt4CAT/8lr6D0kVNpPKyI0dF/3hGOX0/hi96NGNJUPPGcj0vj+Z8OYqaSE/nhc6WePPdfTGDkkrBSC6fyMHzxMQ5eSqSdjwNLRgY/ddqMe1l5XLiTzsW7GVyKT+daYiZXEzKJTc0uM038cbE0VtCghhUNalgS5GlDkKetQXqkJ8mGE7d4Y+NpAKZ28GL6c5W3vfosUiUFDsC+ffuYN28e0dHRGBkZ4ePjw5QpUwgJKf0K5mmhusB5PGLvZdN/3lFu38vG19mCNS81w0ZC0VFeLtxJZ+iiYyRm5OLjZMHKcSE4WpTdgTgbm8qIxWEkZebh5WjOqrFNcba6f7/8QjVvbjzNlojbCAJ81LMBI1t4cis5i2GLj3EjKQt7cyOWjwkultj7Z1Qcr649RV6hmma1bVkwIkiS1mBPdDyTV0eQnV9IfRdLlo4OltRJSc/JZ9raU/otnVc6ePFap7oGn9Au3EnnjY2R+vXhYE8bPu/dSD86qUxy8gvxfX8nAJEfPidJU/UgaTn5NP74H9QaODqz5Br3wxi9NIy9FxJ4o4sPk9t7SbrPgPniBtzHL4h/E0X5adclZu26SLdGzswdKnZiCtUaGn/8D+m5BQ/V4dxMyqLNt3tRKWSc/6SrQeLxB4mKSaXnL4eQywT2zWhXogh7msktKCT2Xg4xKVnEpeYQn5pDQkYuSZl5pGTmkZ5TQGZuAVl5heQXqsWtMwFkgoBCJmCslGOikmNlosTGVIWdmQoXa2NcrIzxsDOjtr0ZDhZGz+Rq+8bwGN7YGIlGIxpWftCj/jP5OiqTKitwnlWqC5zH50ZSJv3nHeVuei5+blasGte0UgWFVxIyGLwglLvpudS2N2P1S00lneAu381g2KJj3EnLwd3WhNVjiyeGq9UaPv79LMuPimvZ0zp682onbxIychm55Djn49KwMFKwcGQQzWrb6e935HIi41eGk5FbQD0XS5aPDpY0I4+8dY+xy4+TmJFHDStjlo4OkdRVKFRr+HpnNAsOiPEDnes7MWtgY0ldoKIUFKpZevg6s3ZdJCuvEIVMYERzT6Z18i5X0SGVM7dT6fHzISyNFUR++Fy5P7S7zz7I2dg05g0LpGtDaWZnK49e5/1tZ2le244145tJus/cfZf5ZucFOtd3YuGIoGI/O349mf7zjmJvLm5N6V6LrqPyWa/SBeWFag0+7/1FgVrDkbc7PNZ4962Np1l34hYvNq7BT4OqE8r/C+jGnCCOwD/r1bC6uCmFKvXBycvL486dO8TGxhb7qua/jYedGau146LTMamMXnqcjNyCsu9YTuo4mLPh5ea4WptwNVEsrqQkf3s5ivfTORr3m3eE6Dv33WRlMoGPXmigTzf/afclPtp+FnszI9ZNaEZILVvScwsYsSSMnUXs+Ft42bN2fDPszY04H5dGn1+PSArp9He3ZvPElvpwz36/HuHw5YcLU3XIZQLvdKvH9/39Ucll/Hsunj5zD3M9sez3oCgKuYyX2tTm3+lt6VzfiQK1hiWHr9H+u32sPHq90jxadK+xcU2bx/rQ9nMTOyOGmNi18hZFw+E3UiS79bbUioZDryRR+ICgw8/NCpVCRmJGHteKvP/+2s3C0zH3Sn1MuUzAVZtJJcXp+mFk5hawPVL8jB3atOzNvGqebtRqDV/9Fa0vbsa1qlVd3FQwBhc4169fZ8iQIfj7+9O+fXs6duxIx44d6dChAx07dqyMY6zmKcPbyYIVY8R07/AbKYxeGkZmJRY5HnZmrH+5uT5jSjTtK3sjxd3WlA0TmuPrbMHd9FwGzDtaLL1cEARe7VSXj19ogCDA8qM3mLbuFMYKOSvGhPBcfSfyCtRMWh3O6mP3DfgaulqxeWIL/fH0/fWIJCO7mnambHq5BcGeNqTnFjBySRgbTkiLIejbxI21E5rhaCHGO7zwyyH2SUzNLoqrtQkLRwSxfEwIXo7mJGfm8f62s3T6YT9bI25XaEJ5Tn4hiw+JScxdJfgBPQof7TjNkC0+TztTnCyNyCtUE/mQ4uNBGrpaYW6kID23oFhBDOJmkZ92BHWqiJliQ1dxDf183MP/JnWr+rEGbMU9yO7ou2TnF+JhZ0qwp025H6eaJ09mbgEvrwpn3n4xY+r1znV5t3u96uKmgjG4wHn77beRyWTMmzePzZs3s2XLFrZs2cLWrVvZsmVLZRxjNU8hDV2tWD2uGRbGCo5fT2H00uOVWuS4WpuwfkJzvVvwgPmhkvKbHC2NWTe+OYE1rUnLKWDYomMlCoORLTz5caCY8v17ZCxjlx+nUK1h7tBABgWL697vbjnDj7su6tdca9qZsnFiC/zcrEjJymfIwlB2SXA9ttGaDfbUJre/sfG0pPVzEMNGf3+llf61jF52nF/2XNK76xpC27oO/DWtNZ+82AB7cyNuJmfx6rpTdPh+PytDb1RIPtG3f1/gbnouNayM6dekbKPER1FL6+J6zYDOlSAIBHmITspFC9tHIZcJBNS0fuh9/LXbbEXdonVZRRfi0x9aIOo0YLH3pAWHlsafWn+jHn4u1SfCZ5jLd8X8uX/OxaNSyJg10J9XOnpX/04rAYMLnOjoaD7++GPatm1LvXr18PX1LfZVWfz6668MGjQIf39/goKCyr5DNZVOI60Zn4WRgrDryYxcElap4ypdsVI0FPP49bK9UaxMlawa15Q2dR3IzhcjEbadul3sNi82dmXxqGBMVXIOXkpkyMJQUrPz+bJPI17pIApUf9x1Sb8RBfdDOtv5OJCTr2b8yhP8dqzsWAtjpZyfBjZmkjabafaey0xbe4qc/LKLCidLMUx0cIg7Gg18989FJqwKJ+0RgY8PQymXMaK5J/vfaMeM5+piY6rkZnIW7289Q9MvdvHJ7+e4VA7vFo1Gw4qj1/Xdmw961keleLzV3BraAuFuumFxAbrRlpSEeB0B2iImqpRxmC48s2i3xt3GFGOljLwCNbdSSu/Q6MTxUhLnSyOvQM3BSwkAktyxq3n60Gg0bD4Zwwu/HOLS3QwcLMTPj94Bj1f8V/NwDP7UqVOnDikphufKPC75+fl07dqVwYMHV/lzV/NwGrtba4XGCk7cSGHkkrBHpis/LjZmKn57qaleIzN88TH2ShjVmKoULBoRxAvazsmr606x7PC1YrdpW9eB315qpk9T7zfvKDEp2bz+nA+fviiOsX47dpOJq8L1xYiZkYKFI4Lo38QNtQbe2RIlqSMjkwm82dWXb/r6oZAJbI+MZdiiY5LyfowUcr7s48dXfRrpdTkv/HyIc7HlS6w2M1IwpYM3h9/uwEc96+Nua0JaTgFLDl+j86wDPDdrPz/8c4ET15PJLXh4EabRaDh5M4WB80P5YJuYofNqJ2/JouBHoVv1Tc3ON0gvpNuCM+S90W1CRZXSIdR1a6LvpOl/xzKZQG17scN05SEjNHtzcdswsRxmhwARN1PIzCvE3lxFwxolN7WqebpJzszjlTURTF8fSVZeIc1r27HjlVY08ageNVYmBhc4M2bM4LvvvuPYsWOkpKSQkZFR7KuymDp1KqNGjaJu3bqV9hzVlA//IkVO+I0Uhi0OIzWr8oocC2Mly0eH0F7bOXlp+Qm9+PJRqBQyfhzYmBHNPdBo4KPfz5VwGW7sbs3GiS1wtTbhWmImfX49wrnYNIY392TukEBUChn/nItnWBHXY6Vcxjf9/Jiq7fTM3nOZNzaeLhb++TAGBLuzfEyIGEVwI4Xec49I0hcBDAqpqRdgX0/Kovfcw6yXqOkpDVOVglEta7F/RnuWjg6mUz0nlHKBi/EZzN5zmX7zRJfaPnMP8+raCL7ZGc33/1zgq7+imbomghZf7aHP3COEXU/GSCFjWkdvpnX0LvfxFMVEdd9z6FFF1oN4OYqFx62UbMmFkS7a4WpiZomRUy17MwQB0nIKihUrHtoNvZsPERHbaI0qpThzl8YJ7bisaS27p873ppqHo9Fo+Csqjudm7eeP03HIZQLTO9dl1bim1Q7FVYDBHtWjR48GYNSoUcW+r9FoEASB8+fPV8iBVfNs4edmzW8vNWP44mNE3rrHkEWhrBrbtNJ8ckxUchaMCGLGhki2nYpl2toIUrPyGN7c85H3k8kEPn6hAQ7mRnz/70V+2XuZxIxcPuvVUG/SVsfBnM2TWjBySRjRd9IZOP8o80c04flGLtiaqRi34gQnbqTQb95Rlo8JwdXaBEEQmP6cDy7WJry39Qwbw2OIT8th7tBALMpYo2/pZc+WSS0Ys+wEN5Oz6D33CHOHBtJauwX0KPzdrfnjlVa8tv4U+y4k8ObG0xy7msynvRqUOwRRJhNo7+NIex9HUrPz2X0+nn/PxRN2LZmkzDxO3rzHSa1D8oMoZAK9Alx5/bm6kv1qpKAoclIvKCUE8mE4WRphopSTnV9I7L1sSUaDbjYmGClk5BaouX0vGw+7+/cxVspxtTYhJiWb60mZerNLnR9NzENGVLpV/HIXONpRbPUV/7PDtcRMPvn9LHsviKNFb0dzvuvvr9dxVVP5GPwJuGLFiso4jmr+AzR0tWLN+GYMW3SMs7FpDF4YysqxTSvN8VgplzFrQGOsTJSsOHqD97edJTEjj1c7PVqwJwgCr3T0xt7CiHe3RLH2+C2SMvP4efD9RHEnS2PWTWjO+BUnOHYtmVFLjvP9AH96+tdg48stGLU0jMt3M+g95zDLRodQX6vNGBxSEydLIyavjuDgpUQGzA9lmQRjPy9HC7ZMasGEleGcuJHCqKXH+ahn/TILNhDHdktGBjN332V++Pcim07GcOpWCnOGBj52erWViZI+gW70CXRDo9FwJSGT6DtpxKRkE3cvGw3i78HaREkTDxsa17SulHTpnCLdl6LdnLIQBAEnSyOuJ2VxNz1XUoEjkwm42ZhwJSGTW8nFCxwQC6CYlGxup2QT7Cl+T/f7vZteuojYVHvMWeXQqGk0Gv3WVmB1gfPUk5qdz7z9V1h88Bp5hWqUcoEJberwSkcvSWGx1VQcBn8SVaRb8XfffcfChQsfeZs///yTOnXqVNhzVlO5+DpbsnZ8M4YsPKbvfqwa17TSsqt0HRlbM5U++yk5M4+PXmhQpmPs4JCa2JiqmLo2gn/PxTN88TEWjQjGylS82tYlj09ff4o/o+7wypoI7qbnMrZVLTZNFIuci/EZDJh/lPnDm9DSS/RQ6eDrxLoJzRizTDQM7D3nsCRjPztzI1a/1JSZm6PYfPI27287y6W7Gbzfo36ZGVYymRjWGeRpy7S1EVxJyOSFXw7zbrd6jGjuUSEbGoIg4OVorh/7VCX3x4ECRgYKlu3NxQJHir5Jh5uNKVe08QIPUkPbmYorkrmkK+IfJiI21hY4OQaM13TcTM4iJSsflVxGPZfKd5+upnzk5BeyKvQGv+y9zD3tiL61tz0fvdCAOg7VxrJPAkkFTnR0NHXr1kUmkxEdHf3I2xqySTVmzBh69+79yNu4u7tLfrxqng68HC1YP6E5Qxcd42piJgPmH+W3ccWdhCsSnZ+NrZmKD7efZWXoDZKz8vhhgH+ZV0xdGzqzckwI41ac4Pj1FPrPP8LyMSH68YqxUs7PgwNxtDjHsiPX+fSPc9xJzWbm8/XY8HKL+x2epWF8089PvxHh52bNlkktGbk0jKsJmfT79QjzihRBD8NIIef7/v54O1rwzd/RrDh6gysJGcwZEigpcLRZbTv+nNqaGRsi2XshgQ+3n2X/xQS+7utXqdlhlc1t7ehHNw40BF1atCEbfjpRc2kFiy7bLDnz/s/uj6BKfw6lTCzKDBmv6dB1b+rXsKzuADyFZOcVsibsJvMPXCE+Tfyb8HI0562uvnSq51i9/v0EkVTg9OrVi8OHD2NnZ0evXr0QBKHULRFDNTi2trbY2tpKP9pqnhk87UVzvqELQ7melEW/eUdYObappHiC8jKiuSe2ZipeW3eKHafjSM3KZ97wssMtm9a2Y8PLzRm5ROzI9Jl7hBVjQvDWmsvJZQIf9qyPk6UxX++MZuHBa9xJy+W7/n6sGBvC6+sj+eN0HK+tiyT2Xg6T2tVBEATcbU3ZPLEF41eE69fov+zTiP5Bjy7aBUFgYrs61HEw49V1pzh8OYkX5xxm0Ygg/TE9CjtzI5aMCmb5ket88Vc0e6Lv0uXHA3zRuxFdGz6bK8YXtOvq5Qnr1HV88gwwMbQ10xYspYjldbqyonoaC2Pxb+xhG4S6c5y6HMk4kbfEbS5/t+rtqaeJu+k5rDp6g1XHbpKcKXYYa1gZM7WjN/2auD3VqeX/L0j6DezevVtfiOzevZtdu3axe/fuEl+7du2qtAONjY3l/PnzxMbGUlhYyPnz5zl//jyZmYZZ1ldTdejM+XROwgMXHC3mAFsZ9PCrwRKtn82hy4kMXhAqyXvE19mSTRNbUMfBjLjUHPrNO1rMY0dXdMwa6K83BBy5JIycfDWzBwXwUutagGhu9+7WM/rtG2tTFSvGhujX0w0x9nuugTObtBtdN5JE8fG/EswEdcc7qmUttk9pST0XS5Iz83h5VTjT153Sj3ueJU5qt4h0sQiGoHunBaRfSZtodUSZeSU7MiZanVZWETNEXRGV+5BNLV1hIy/H1bzOhbmx1oCwmieHRqMh7FoyU9dE0PKrPczec5nkzDzcbU34oncj9r7RjkEhNauLm6cESb8FV1dXBEEgPz+fX375BbVajaura6lflcXs2bPp1asXP//8M1lZWfTq1YtevXpx5syZSnvOah4fR0tj1o5vRmN3a+5pHX+lZDA9Dq29HVjzUjNszVRE3U6l/7yjkjKA3GxM2fhyCwJrWpOanc/QRceK5VAB9A5wY9noEMyNFIReTWbAvKPcScvh3e71+ahnfb1XzviV4XpnZ2OlnB8HNmZy+/vGfq+uOyVp3bmeiyW/v9KKZrVtycgt4KUVJ/hpl3T3Yl9nS7ZObsHEdnUQBNgccZvOsw7w99k7Zd/5KSG/UM3+i+ImStPahnd8dZ5FxkrpJx2VXCxEShsp6UwLi9oAKLQjqIcVrrrbGnriyy9U6x27/cpR3FVTMcSkZDFn72U6/bCfAfOPsj0ylvxCDYE1rZk7NJC9r7djSNOa1SPEpwyD/rUplUr++eefyjqWR/LVV19x4cKFEl9NmzZ9IsdTjXSsTVWsHteUll52ZOUVMnrp8RKFQ0Xj727NRq1HjM7PRoqbrY2ZitXjmtGpniN5BWomrg5n5dHrxW7TytueddpcqAvx6fSZKwZ5jmpZi1+HNsFIIWNP9F0GLjjK3TRRiCqTCbzR5b6x37ZTorGfrrX9KGy18Q4jm4sBi7N2XWT8SunuxUYKOW919dV3qBLSc5mwMpwJK08Q9xjZSFXFnui7pGTlY2+uIsTT8AJHN0oyJPX+UQ02XROm6G3uj55K79Bk54kFjq77I5XouHRyC9RYGiuoZWf4eK6a8hN7L5vFh67R99cjtPp6L9/+fYErCZmYKOUMDnHnj1dasXlSS7o1cqnu2DylGPxb6dSpE7t3766MY6nmP4yZkYIlo4Lp2sCZvEIxwPJxTOmkUFvrZ+PrbEFCei6D5ody5ErZ3SMTlZx5w5owOKQmGg28v+0sX++MLnZ13qCGFZsntcDL0Zw7aTn0//Uohy8n0rWhM2vGi92jM7fT6D33SLG4gwHB7iwbHYKFkZjh1XvuYa5ISCNXymV8/GJDvunnh0ouY9f5eHrNOWxQlEJgTRt2TG3NpHZ1UMgE/j4bT6fv97PwwNVKSxN/XDQaDb/suQxA/yD3cp1IdPlPZa3qF0U3aiptY0v3XhWNn3jU7QF9MWppYtjiasQtcTTXuKZNtcFfJZNXoCb0ahLf7Iym648HaPHVHj794xzhN1IQBGhe245v+vkR9m5Hvuzjp3e8rubpxeA1cQ8PD+bMmcPJkydp0KABJibF139HjBhRYQdXzX8LI4WcX4YEMHNzFBvCY3hz42lSs/J5qU3tSntOnZ/NSytOEKb1s5k1sDHd/R4dH6CQy/iid0NcrIz54d+L/LrvCndSc/i6r5/+xOZmI6aDv7RS+9hLw/i6rx99At3YPLEFo5cd13eP5g9rQgvtBlUrb3s2TxJ/fiMpiz5zj/Dr0ED9zx/FgCB3fJwseHlVOFcTMnlxzmG+7utHT/8akt4PY6WcN7v68kLjGry75QzhN1L4/M/zrDl+kw961Kedj6Okx6kq/jgdR9TtVEyUcsa1qmXw/TNzC/QaLHdb6VYFuo0rs1IE6jrtjXGRbozO38b0IR49KVrdk5WJYcaXOu1RQLU5XIWTk19I1O1Uwq4lc/x6MmHXkovpqmSCaKzYvZELzzdyMahArubpwOACZ+PGjVhYWHDmzJkS+hdBEKoLnGoeiUIba2BtqmThwWt8/ud57mXnMeM5n0pbp7QyUbJiTAivrj3FzrN3mLLmJHfT6zO65aNPmIIgMLWjN86WxszcEsWWiNvcTc9h3rAmendiK1PxsV/fEMmO03FMXx/J7ZRspnTwYtNEcY38xI0URiwJ46u+fvpUbW8nC7ZObsn4FSc4efMeI5aE8WmvhgwOqVnm69G5F7+yJoIjV5J4ZU0E4TdSeKdbPcmhlr7OlmyY0JwN4bf49u8LXE3IZNTS47T2tuft5331GU5PkuTMPD7aLmZajW9TGztzw9fcz2ozqJwtjSWt2evQFUWlPadOpG1jen/klaLdtrJ5yHPo1ocdLQ17DTrH6GoH48cjNSufC/HpnItN5VxcGmdup3EhPl0fnKvD3lxFSy972vk40Lauo94SoJpnE4MLnD179lTGcVTzf4QgCLzTrR42Ziq+2XmBOXuvkJSRx+e9G5VpzldejJVy5gwN5OPfz7Li6A0+/v0cd9JyeKuLb5mt/wHB7jhaGjFp9UkOX06i/7yjLBsdgrM24dpYKefnQQG4WZsw/8BVvv/3IjEp2XzWuyGrxjVlxgZxjXzGhkhuJmXyWue6CIKAvbkRv73UjDc3nmZ7ZCwzN0dx+W4G73SrV+b7YGduxMqxTfn+nwvM3XeFZUeuE3EzhV+GBOpjA8pCJhMYGFyT5xu5MHvXJZYfvc7BS4kcvHSI7n4uTOvoTV0Ja+mVQWZuAeOWHycpMw8fJwsmt/cq1+OEazsgfgauWOtM/JxKKUgS0ksWPwlaB2M789JPiHe0WidnA7oACem5+myranv/R5NfqCYxI5e41Bxup2QTk5LNzeRMriVmciUhU/87exB7cyOCPW0IqWVL01p2+DpbVI8C/0M8lqe6TpNQbWRUjaEIgsCkdl7YmKr0prB1SwAAUfhJREFUcQn3svL5cVDjYq3/ikSudT12sjTm278vMH//Ve6m5RYbOz2Mdj6OrBvfnNHLjhN9J50+cw+zbEyIvgCQyQRmdquHm40JH24/y7oTt4hNzWbu0EBmDwrA3daUX/ddYfaey9xIzuLrvn4YK+UYK+X8NKgxdRzMmbXrIosPXeNqQgY/DQ4oUxQr1yaSN/GwYfr6SCJjUuk++yDf9PMzKMHb0ljJez3qM7KFJ9/+fYHtkbHsOB3Hn1FxdGvowkttatO4Ck+wYnEjdrasTJT8NLix5M7Ug+zTJs238i57/FeUa4mi/YRnKcJeXd6Um41Jie89zLH7epJYqNSUWHzC/fwpX2cLvZHgf5FCtYbs/EKy8wrJyS8kK6+QrLwCsvMKycgtICuvkPTcAtJz8knPKeBeVj6p2XkkZ4pfSRl5JGflPVIYDqJHTT0XS+rXsKS+iyX+7ta4WBlXn7/+w5SrwNmwYQPLly/n+vXrAHh6ejJy5Ej69+9fkcdWzf8BYlyCkqlrxPHRyCVhLBwZZNDGiyEIgsDk9l44Whgxc7M4dkrMyOXXYWUbAjZys2KLNoTzamImfX89woLhQTSvY6e/zfDmnrhYmfDKGjGLqv+8oywZFcxbXX2pZWfGO1ui2HYqlpiUbBYMb4KduRGCIDCtkzdejua8vuEUey8k0GfuERaNCJJkbNexnhN/TmvNlN9OEnHzHi+vOsnQpjV5v0d9g4pFd1tTZg8O4OW2dfh5zyX+OnOHHVFx7IiKo4mHDSNbeNKlgVOlrsKei01j+vpTRN9Jx9xIwfIxIeXO07qbnqNP4W5vgLbobnoOyZl5CALUdij+/ms0Gn3x42F7/2dlFTBXE7QFkwFGhceuiQVOcDk2x54UmbkF3EjK4va9bOLTcribnktyZi4pWfmkZYsFSkZuAVm5BWTmiUWNIQaMj0IhE3CyNMbV2gRXGxNq2priaW+Kp50Z3k4WZf77rua/h8G/8Z9++olly5YxbNgwGjduDMCpU6f44osviI2NZdq0aRV9jNX8x+na0IVlY5RMWBHOsWvJDJofyrIxwThaVJ6or3+QOw4W4tjp4KVEBs4/ytLRZT+nu60pmya24CWttmbkkjC+7e/Hi43ve0B1qu/E+gnNGbNc7Pb0mnOYJaOCGRDsjquNCS+vCif8Rgq95h5m6ahgvBzFLlB3Pxdq2pry0ooTXL6bwYtzDjNnSKCk7oPOVPG7f8TO1OpjNzl+PZkfBwbog0ClUr+GJb8Oa0L0nTQWHLjK75GxhN9IIfxGCjamSnoHuNHdz4UAd+sKa+en5eSz6OA1ft13mfxCDfbmKhaMCHqsztHWiNsUqkWvEqljO4BTWt1LXUeLEsGhCem5JGXmIRMolsl1IV7U+ng7lcwcSkjPJTEjF0GAuqX8/GHoNv5aFCmgnybSc/IJu5ZM+I0UzsSmER2Xxt2HjIKkIAhgrJBjopJjopRjqpJjZqTA3EiBmZEcC2MlFsYKrE1UWJsqsTZVYm9uhK2ZCkcLI2xMVdXjpWqKIWikWKoWoVmzZrz33nv06NGj2Pf/+OMPPv30U44dO1ahB1iRZGRk0KRJE8LDwzE3rw4/e9o4G5vKyCXHSczIxd3WhBVjmlKrHNb8hnA65h5jlh0nMSMPNxsTVowJobaEYLyc/EJeW3eKv7R+Pm929WFi2zrF2t0xKVmMWXaci/EZmCjl/Dw4gE71nbh8N50xy05wMzkLC2MFc4YE0qaug/5+d9NyGL8ynFO37iET4J1u9RjbqpbkVvqBiwlMXx9JYkYuKrmM15+ry7jWtcutb7qblsPqYzdZf+JWsYBJFytjOvg60trbgeZ17Aweo2g0Gs7GprHu+C02nYzRb7A8V9+Jz3s3eqzsrPxCNe2+3cfte9l82aeRJPG2js/+OMeiQ9cYFOzOV339iv3s33PxvLTiBN6O5vw7vS0gClj9PxH9wSLe76yPctCx98JdRi89Tm17M/bMaCfpGO6k5tDsy90IApx8r+RjPinupOawIyqOv6LiiLh1r4RIF8DaVIm7jSlOlsY4Whphb6bC2lQsSiyMlZgZyTE3UmCqUmCikmOqFIsaI4WselxUzUMpz/nb4A5OQUEBDRs2LPH9Bg0aUFhoeFJuNdXoaFDDik0TmzNiSRg3krLo++sRlo0OrlQHVz83azZNFMdO17XPuWhkcJlbK8ZKOXOGBPL5n+dZfOga3+y8QExKNp+80EDv1eJmY8rGiS2YrO0SvbTyBO91r8+Ylp5sndySCSvFgM/Ry47zYc/6jGjuCdx3f35v6xk2hsfw2Y7znItN44s+jSSNnNrUdeDvV1vz9uYo/j0Xz5d/RfPvuXi+6+9friwnR0tjXutcl6kdvdl34S7bI2PZdS6euFSx8Fl97CYgjnMauVpRy95Mf4IzMxJPXnkFarLzCknIyOV6YiaX7mYQejVJv10E4O1ozqud6tKtkfNjn+i2nYrl9r1s7MxU9A4wzGF9n9Y1uWjRqUMX3xHkef/v46TWq8bTzrTUQiTihs7LxlryMey/KGqH/N2sn3hxo9FoCL2azPwDV9h/MaGY1sXDzpSmtWzxc7Omfg1L6jiY/6f1QtU8Wxhc4Lz44ousWbOGmTNnFvv++vXr6dmzZ4UdWDX/n3jYmbFpYgtGLz1O1O1UBi0IZd6wJqWebCryOTdObMHYZceJjEllyMJQfh4cwHMNHh1MKZMJvN+jPm42Jnzyxzl+O3aT2HvZ/DIkUD/vtzRWsmRUMB9sO8OasFt8+sc5riZk8NELDVg1rikzN0ex+eRtPth2lovx6XzYswFKuQxjpZxv+/nRoIYln+04z+aI21yIT2fesCaSxi125kYsGN6EdcfF5zxxI4XnfzrIm119GNHcs1zdHLlMoGM9JzrWcyInv5DDlxM5eCmRAxcTuJqYydWETL3WRComSjlt6zoworkHzevYVcgVfFpOPl/vjAZgXOvaBumQLsWnc/luBkq5QMs6JUeDB3SREbXuj41CryYB0MSjdK1MqFZLE/SQn5fGrvNigdPOp/L+7qUQdi2ZL/48XyxDLsjDhh5+LnSs52TQ6K+aaqoag0dUn376KVu3bsXFxQV/f38ATp8+TWxsLL169UKhuF8zPVgEPWmqR1TPDhm5Bby8MpxDlxNRyAS+7e9H7wC3Sn3OrLwCJq8+yd4LCcgE+PjFhgxv5iHpvn+fvcO0tRHk5Kup72LJklHB+jVyEK+CFx28xhd/nUejgdbe9vwyJBBLYwXzD1zVOiWLbqlzhwYWu2o/ciWRV36LICkzD2tTJT8NCqCtAQXfreQs3tx4mqPaE3FATWu+7utXoSvgSRm5RN1O5WxsGreSs7iVkkVieh6ZeeIWjJFCholKjo2pCg87U2rZmRHoYUMTD5sK35p7b2sUq0JvUsvejJ2vtjZIFP3t39HM2XuFTvUcWTQyuNjPbt/LpuVXe5AJcOK9znqPlOd/Osj5uDR+GtS4mBYLxL8p/4//Ib9Qw74Z7SR10LLyCgj45F9yC9T8Na019VzKJ7J+HJIycvlsx3m2RNwGRIfm/kFuvNS6Nh7VkRHVPAHKc/42uMAZPny4tAcWBFasWGHIQ1c61QXOs0VegZo3Nkay7VQsAO91r8e41pXnegxQUKjmva1nWHtcjJGY2K4Ob3aRZkJ46tY9xi0X9TzOlsYsGRVcQuD7z9k7TFt7iuz8Quo4mLF4ZDCe9mbsOhfPtLURZOYVUtPWlAUjmhTbHoq9l83EVeFExqQiCPBqx7q80sFLsqhSrdbwW9hNvvormozcAhQygXGtazO1o1cJIe2zzN9n7zBhZTiANv9M+np4bkEhLb/aS2JGLnOHBtKtUfFV+/n7r/DlX9GE1LJl/YTmgFg8tv5mLzIBjr/bqYQx4D9n7zB+ZThuNiYcfLO9pL+jHafjmPzbSWramrL/jXZVrksJvZrE1DUR3E0XhdGDgmsyvXPdx9JEVVPN41IlGpyVK1cafGDVVFMeVAoZswY0xt7ciMWHrvHZjvPEp+Uw8/l6lbYtoZDL+LJPI2pYm+gjGuLuZfNNP/8yvVgau1uzZVJLRi87zuW7GfSfd4SfhwTQwddJf5vnGjiz4WUxOuJKQia95h7m16FN6FTfic2TWjJuxXFuJovxDd/39+d57Um2hrUJ6yY05+Pfz7Em7Cazdl0k/GYKswb4S3L4lckEhjXzoGM9Rz7YdpZ/z8Uzb/8Vtp+6zbvd61eI7uVJE30njTc2RALwUutaBhU3AL9HxpGYkYuzpTGd6zsV+5lGo2HzSbGb0atIl+bPqDhAHFmV9nv451w8AJ3rO0l+f3dEiQV9t0YuVfo70Wg0LD50jS/+PI9aI26Jfdffv0o9kKqppiKpjkCt5qlGJhN4r3s93urqC8DCg9eYvv5UpYZD6iIavu0nJn9vPRXLyCVh+lTqR6FbI29Rx47MvELGLT/BssPXit2moasV2ya3xN/NintZ+QxffIzVx27g42zB9smt9KnrE1ef5Nu/o/WbKsZKOV/2acR3/f0xVso4cDGBbrMPEqbVeEjBxcqEhSOCWDgiCFdrE2JTc5j820kGzg/lzO2y09afVm4kZTJ8cRhpOQUEedjwRhdfg+5fUKhmzl4x1HNECw+UD4R6hl1L5kJ8OsZKGd21RadGo2FDeAxAqVlgOfmF/K3dsutahp5LR2p2vl5/06OMvLSKRKPR8NmO83y2Qyxuege4sn1Ky+ripppnmuoCp5qnHkEQmNiuDj8M8NcXHGOXH9cHIlYW/YPcWTIqGDOVnKNXk+g/7wi372WXeT8rEyXLx4QwMMgdtQY++v0cH2w7Q0ERQzNHbQhoT/8aFKg1vLvlDO9vPYO5sYLlo0MYqw2WnLP3CmOWHdfnHwH0a+LG1sktqeNgRnxaLoMXhvLz7kulruw+jM71ndg1vS1TO3pjrJQRdj2ZHj8f4pU1EXoju2eFi/HpDFoQSkJ6Lr7OFiweGWyw8/G6E7e4lpiJjalSv81WlMWHxCK1V2NXrLQZVMevp3D5rmgB0NO/ZDGy63w86bkF1LAylmzW92dUHHkFarwdzWlgoH9ReVGrNby/7Yz+Nb7brR4/DPD/T40uq/n/pLrAqeaZoU+gGwtHBmGilHPwUiKDFhx9aMZMRdGmrgPrX26Ok6URF+Mz6DXnsKROh1Iu46u+jXj7eV8EAVYcvcGY5SdIy7nfBTJWypk9qDFvdPEBYGXoDYYtOkZqdj7v96jPrIFip2b/xQR6/nKo2PP6OluyfUor+gS4UqjW8P2/Fxm6KJS41LILMB0mKjnTO9dlz+vt6NVY7ED8HhlLpx/28+bGSK4/A4XO7vPx9Jl7hLjUHLwczVkxNkRfgEglOTOPb/++AMDUjt4lHG/Px6Xxz7l4BAF94Qmw6OBVAHoF1NCHrxZlVegNAPo2cZM8Uv1Nu3LfP8itSsZTGo2GT/44x6rQmwgCfNPPj5fa1H7mx5XVVAPVBU41zxjtfRxZO74ZdmYqztxOo++vRyq949CghhVbJrXEx8mChPRcBsw/yp7o+DLvJwgCL7etw69Dm+hHSn3mHuFGUmax20xu78XCEUGYqeQcu5bMC7+IRVTvADc2T2yJu60Jt5Kz6fPrEdYdv6m/r5mRgh8GNub7/v6YquSEXk2m648H2XE6zqDXV8PahB8HBfDn1NZ08HWkUK1h/YkYOny/j1fWRBAV8/SNrrLyCvj0j3OMXX6CjNwCmmqFv+Vxv/5o+1nuZeXj62xR6tbcd9rip1sjF7y1m2eX4tP597z4N1C06NERfSeN0KvJyAQYJNFk8NSte0TdTkUll9GvibvBr6M8LD50jWVHriMI8G0/fwYEVc3zVlNNVVBd4FTzzOHvbs3GiS2oaWvKzWTRnK+oT0dlUMPahA0Tm9PKy54srbZmpfYKvSy6NnRmw4QWOFkacfmu2AXSeafo6Fzfia2TW+JpZ8rte9n0/fUIWyJiqF/Dkj+miIVHXoGatzZF8fr6SLLy7o/n+jZxY8fU1vi5WZGanc/k307y2rpTkjRDRalfQ1xv3zypBe19HFBrxI5Oz18OMWDeUX6PjCW34MmaeWo0GvZEx9PlxwP6kcqoFp6sHNtUv7ZtCNsjY9keGYtcJvBln0Z6k0YdBy4msDv6LgqZwPTOdfXfn7XrIhoNdGngpI/aKMqCA2J3p2tDZ1wfEsD5ILrX09O/Rrlei6H8ey6ez/88D8A7z9ejX5PKtWGoppqqprrAqeaZpJa9aAjYyNWK5Mw8Bi8IZff5srsqj4OlsZKlo4Pp38QNtQbe33qGz3ecQy1B+9LIzYrtU1rh52ZFSlY+wxYd048jdHg7WbBtciva+TiQW6DmtXWRfLT9LCYqOYtGBPFGFx9kAmw6GcOLvxzmUny6/r617M3Y+HILcXVcgC0Rt+ky6wB7o+8a/DoDa9qwdHQIO6a2oneAKwqZQNj1ZF5ZE0GzL3bz0fazRNxMwUCHicdCV9j0/fUIY5ad4FZyNjWsjFk6KpiPXmhQrrTx83FpvL3pNACT29UhoGZx9+qc/EI+3H4WgOHNPaijjfAIv5HMn1F3EASY3tmnxOPeSMpku9baYHybOpKOJSYli7+0G1mjW3oa/FoM5VJ8OtPWRqDRwJCmNRnXumQXqppqnnUM9sF5lqn2wfnvkZFbwKTVJzlwUTTn+6J3I8kjgfKi0WiYs/cy3/1zERA3ZGYNbIyJqmxDuey8Qt7cdJrfI8UT4IjmHrzfo36xrZ1CtYafdl1k9h5xqyewpjVzhgbiYmXC0StJTFsrepQYK2V82LMBg4Ldi2kmwm+kMGNDpH5016+JG+91r4e1afm6AndSc/jt2A3Wn4jhTtr9LKqatqY8V9+J9r6OBHvalqvIkPLc2yNvszE8hovxGYBoHzC6hSdTO3pjVs6E6MSMXHrNOUxMSjatvOxZNjq4RPfm0z/OsfjQNZwsjfh3elssjZUUqjX0mnOYqNupDAxy5+t+fiUe+7V1p9gScZu2dR1YPiZE0vF8tP0sy45cp5WXPavGNS3Xa5JKVl6BWCDfzaBFHTuWjwkpsTVWTTVPG1Vi9PcsU13g/DfJL1Qzc3MUG7Uru9M6evNqJ+9KF0puO3WbNzacJq9Qjb+7NQtHNJGkAdFoNMzdd0UvbG1W25Y5QwJL+KjsOhfPa+tPkZ5TgK2Zip8GNaa1twOJGbm8tu4UBy+JadPdGjnzZW+/YuLa7LxCvvvnAksOX0OjAXtzFe/3qM8L/jXK/b4UqjUcuJjAlojb/Hsunuz8++MqE6WcQA9rgj1t8XezpkENSxwsjAx+rntZeZy5ncbRq4kcuJjImdhUffaRmUrOsGYejG1d67GS5lOz8xmyMJSzsWl42JmybXLLEsXfnuh4xiw7AcCSUUF6L6OFB67y+Z/nsTBSsPeNdtg/8DuLiknlhTmH0Ghg+5SWknLU4lKzafvtPvIK1Kwa21RSevzjMGNDJBvDY3C0MOLPaa1LvIZqqnkaqS5wyqC6wPnvotFomPXv/a7HgCA3vuhdUlNR0YRdS2b8yhPcy8rH1dqEJaOC8XGWFoHw77l4Xlt3iozcAlytTZg/vAkNXa2K3eZGUiYTV53kXFwaggCvtPdiWqe6CMDCg1f59u8LFKg1uFgZ811//xLmduE3knl7UxSX7ordj9be9nz0QgP9uKW8ZOUVsO9CAnuj77L3QgKJGSW32XSp0u62JtiZGWFtqsRUpUAuA5kgkJVXSGZuAYkZedy+l8Wt5OxS1/CDPW3oFeBKD78ajx3kmJKZx6ilYUTGpGJnpmLDy81LpMfHpGTR8+dDpGTlM6qFJx+90ACAy3cz6D77ILkFar7qU7JTqFZr6D//KOE3Uugd4MqsgY0lHdPMzVGsCbtJiKct6yY0q9TCfGN4DDM2RCIT4LeXmtGstl3Zd6qmmqeA6gKnDKoLnP8+vx27yXtbo1BroL2PA3OGBla6n8e1xEzGLDvOtcRMzI0U/DwkgPY+jpLueyk+nfErw7mWmImRQnRR7hNYXOyZk1+odzAGaFrLlh8HNcbFyoTTMfeYtvaUfhw1uqUnb3bxLTYuyytQM3//FX7ee5m8AjVKucCYVrWY0t6r1PVmQ1GrNVxOyODYtWROXE/mXGwaVxIyMMCWpxgedqY0dremtbcDbbztcbQsf7emKHGp2YxYHMaluxnYmCpZM75ZsTgMEIM6+/16hIvxGTRytWLjxOYYKeTk5BfSa85hou+k09rbnhVjQkoUIqtCb/De1jOYquTsfr0tLlZli4svxqfT9ccDqDWwfkJzQmpJD+Q0lFvJWXT98QCZeYVM16bDV1PNs0J1gVMG1QXO/we7zsUzZc1JcvLV+LtZsXhUcKW34VMy83h5VTjHromrwe/3qM+oFp6SrsZTs/KZti6CfRfEpOqRzT14t3v9EpqWbadu887mKDLzCrExVfJNP38613ciK6+Az3ecZ7VWtFzL3oxv+/kR9IC53I2kTD7+/Rx7tMJje3MVr3Wuy8Ag9wrvdGXnFXI9KZNbyVncvpdNSlY+97LyyMorRK3WUKjRYKqSY26kwNpUhZuNCTWsTajraGGwj40Ujl9PZtLqkySki1EMK8eG6Fe+deTkFzJm2XGOXEnC0cKIrZNbUsPaBI1Gw5sbT7MhPAY7MxV/TWv9v/buPCrqev/j+HNm2PdFREAWQcENFPctLTXNVsutRW3vuuTtd8vS8lZXq6tlpbmVS5nmctNcMjVTu6llmjuiIiogiyL7OjDMMPP9/YHOlUBFAwbH9+OcznH293yvF15+tneV0JWWV8Kg2b9SVFbOuw+15tmeN160qygKzyw9yO4zWQxs48vCUZ1q9TtfzWhSeGLRfg6cz6VLiBerX+p2Sx3lhbAUCTg3IAHnznE4OY8Xlh0kr8RAsLcTy57tUqNOzn+FvtzElA2x5uP7n+waxNSH29RoAafJpDD7qoXF0UEeLLi8sPhqSdlaJqw+wokLhQA81TWIKQ+0wsnOhl/iM5m87jgZhRVNEp/pEcLEARFVFuL+HJfB+1vizKM+YT7OvDYggvvaNKmzHl+WcqW/0owfT1NuUojwdeXLZzrR1NOp0vPKyo2MXXGE/57OxNlOw7d/626eLryy7katgmXPdeGuFpU7uV8dHjoEebB2TI8ahYdtJ9IZs+IIdho1P/2jN83q8O/nvP+e5ePtZ3C20/DjK70J8na68YuEaEAk4NyABJw7S2JWMU8vPUBqbileznYseboTHf60Fbi2KYrCoj2JzNh2GkWB7qHeLHiqA541PNfk57iKdTmFlxcWzxrRnj7hlX+hlpUb+fineBb/WnFuSmgjZz4d0Z72gR4UlBp4b/Mp84LrAA9H3hvcplLDT6gIYyv/SGbOz2fJK6k4L6e1nxsT+jZnoJUEneQcLZPXxbLv8plDD7fzZ/pjkVUCn7asnLGXd+LZ26hZ9lwX89qUrbEVnb0VBd55sDXPVXOo36fb45nz33M422nY+spdBHvfOKgU6gwM+HQPlwp1TOjbnNcGVN1uXlti0woYvGBvxYnXw9oxRM67EbchCTg3IAHnzpNZpOP5rw8Re6EAB1s1c5/oUKVTdF3YeSqDV/5zFK3eSJCXE0ue7kS4b80WH6fklDBu1WHzKM34e8L4R//wKtNIe89l89qaGC4V6lCrYOzdYfy9XwvsbTTsPpPFW+tjzYt2B7bx5e0HW1cZuSjSGVjyaxJf/pZk7u3VorELL/UO5eH2/tjb3Hjre0OjMxj5am8Sc34+i85gwtFWw1v3t2Rkt+AqU4Y5xWU89/VBYtIKcLTVsGh0R/MIza74TF5cfgiDUeGprkG8P7htldfvPJXBC8srdlvNHtGewdEB1MTkdcf5z8FUgr2d2PZK7xodMXArdAYjD839jbOZxTwQ6ce8J6OlDYO4LUnAuQEJOHcmbVk5L686wi/xFWfl/OvhNtU2VKxt8ZeKeH7ZQdLySnG20zBrRHsG1LCrtM5gZNrmU+bDALuEVCws9v/Tqbj5JXre+f4kmy6fqxPh68qHQ6NoH+hBib6cWTvO8NXe8xhNCg62asb2ac5LvUOr/ELN0+pZujeJpb+fp0hXEXQaudjzVNcgHu8SWKMFs5ZmMJr4/thFZu04Yw523UO9+XBIVLVTMjGp+YxdcZiLBTo8nWz56pnO5sP+dp7KYNyqI+jLTTwQ6cecJ6KrTDudvlTI0M/3UVxWXmm31Y38cjqTZ78+CMC3L3Wjax3uZHp/8ymW/JZEIxd7tv+jd72ckCxEXZCAcwMScO5c5UYTb39/gtUHUgF4qXcok+9rWedTMblaPeNWHmZ/Yi4A/9e/BX/v26LGn/tDzEXeXB9LcVk57o62fDgkkvvaVu1c/WNsOv/ceIIcrR61Cp7t2YzXBoTjZGdD/KUi3v7+BAeSKmrwc3fg9YERDG4fUKWOQp2BlftTWPb7efOhfmoV9G3py9COTbmnpU+DG9Up0Zez7sgFFu5OIC2vItj4uTvwxn0V3/HPIxaKorD6QCr/2nQSvdFEs0bOLHm6k3nr/PfHLvDamhjKTQoDWvsy/6kOVdZRpReUmpt8dm3mxTfPd63RQYeZRToGzf6VHK2eZ3uG8O5DNQtFt+LXs1mM+vIAAF8+3Yl+rep+5FKIuiIB5wYk4NzZ/nzA3gORfnwyvB0OtnX7C9tgNPH+5lMs21fRu+re1r58OrxdjbdoJ+do+fvqo8Rcbno5olMgbz/UukrX61ytnvc2n2LD0QtAxfqbdx5qzYDLU3JbYtOZvvW0eXSjZRNXXh8YQd+WjauEAIPRxI8nLrFif7I5GAG4OdgwqK0f97VtQvcw7zq/dteiKAoxaQWsOZTKpmMXzdNr3s52vNg7lGd6hFRbW2ahjjfXx/Lz5Z1k97b25ZPh7XBzsEVRFOb8fI5ZOytOqH6kvT8fD2tXJdxkFZUxYtE+ErO0NG/swndjutfolOhyo4lRXx5gX2IOrfzc2DCuR51dvzytnoGz95BZVMaobsG8N7htnXyOEPVFAs4NSMARABuPXuD172IwGBU6BnuyeHSnehm6X3MwlX9uPIHeaCK0kTMLR3WsslX5WvTlJj7dcYaFexJQlIo2CZ8Ob1dlKzjAL/GZ/HPDCXOQuSfCh7cfbE2oj4t5fcrnuxLMU1HtAz14pV8L7o7wqXZ9xrnMIr49mMqmmItkFP7vQD9nOw09mjfirhaN6BHmTWgjlzodEdMZjBxOzmNXfCY/nrhkHq2BirNznu0RwojOQdWuZzGZFL47nMYHW+MoKDVgp1EzcWA4L/QKRa1WoS0rZ/L6WHMLjed7NWPK/a2qfJ/s4jJGLvmD05eKCPBwZM2Y7jVupjn9xzgW7k7EyU7Dppd7VtukszYoisL4VUfYGnuJMB9nNk+4q87W+AhRXyTg3IAEHHHF/sQcXlp+iEJdOSHeTnz1TOcqJ9rWhZjUfMasOEx6gQ4nOw0fDonioXb+NX79voQcJq6N4UJ+KSoVvNCrGa8NiKgyElCqNzLvl7Ms2pOIwahgq1HxTI8QJvRrgZuDLfklej7fncCy38+jM5gAaBvgxot3hXJ/pF+1W9uNJoU/EnP48cQltp+6VCnsALg72hId5EFbf3da+bkR7utCoJfTLY1S6AxGknNKOJtZxPG0AmJS8zmWmk9Zucn8HCc7Dfe29mVE50C6NfO+Zrg6nJzL1B9OcfzyCFhkgDufDG9nXvR94kIBf199lMRsLTZqFe8NbssT1fQzu5Bfyqglf5CYraWxqz1r/ta9xkcPrDucxmtrYwCY/2QHHoiqOs1YW1YfSOHN9bHYqFVsGNeTyKbuN36REA2cBJwbkIAjrnYus4hnvz5Iam4pHk62LBrVqU5Pkr0iu7iMv68+yu8JFduXn+kRwlv3t6pxs8pCnYGpm06x7kjFVvBQn4qD/ToGV639XGYx7285ZT5E0NPJlpf7tmBktyDsbTRkFZWx+NdEvtmXbO4tFeDhyKjuwQzvFHjNkS2TSeHkxUL2nM3it7PZHEnJqxQ+rubrZo+vmwONXOzxcLTF0U6Do62GK4NF+nITxWVGCnUGsorKyCzUcalQV+1JyL5u9vRs3oh7W/lyd0Tj645MxKYV8NnPZ9gZVzEd5Wpvw9/7teCZniHYatSUG018tTeJj386g95ows/dgc8ej67278C5zCJGf3mAiwU6/N0dWPFC1xoH4j8Scxj55R8YjArj7g7jjfta1uh1tyL+UhEPz/uNsnITk+5rydi7a9bNXIiGTgLODUjAEX+WXVzGC8sOcSw1HzuNmo+GRtV4q+9fUW408cmOM3y+KwGAdoEezH8yuso27uvZeSqDtzbEkllUcbDfU12DeOO+lrhVs7bnl9OZvL/lFAlZFYf7BXg4MqFvc4Z0bIqtRk2uVs83+5JZvu88OVo9UNG1+/62TRjWKZDuodceIYGKkBKXXsix1Hzi0guJSy8kMUtL0eW1MbfC1cGGUB8X2vq70S7Qgw5BnoT5OF93m7PJpLD7TBZf/pbEb+cqmpGqVTC8UyCvDYjAx7XiROtTFwuZtO44sRcqRnX6t/Jl5tCoas8r2hWfyYRVRykqKyfUx5kVz3etspvtWuLSCxm+cB9FunLuj2zCvCc61Nk0Xom+nIfn7eVcZjG9w334+pnOVnGekRAgAeeGJOCI6ugMRv7x7TF+PHEJqNjp9Eq/uu9GDhUh5bW1MRSUGnB3tGXm0KgabyWHijYPH2w9xZpDFaM5vm72/POB1jwY5Vel/nKjibWH05i984x5einQy5GxfZrzWIcAHGwrei5tOnaRb/Ynm3/5A/i7O/BQO3/uj/Qjqql7ja6NoijklxhIyS0hq6iM7OIyCkoNlOiN6AxGFEAF2GrUuDjY4Gxvg4+LHb5uDgR4OuLjUvNu5BfzS9lw9ALfHU4zn9CsVsEj7QN4uW9z8w6pnOIyPvv5LCv/SMFoUnBzsGHKA60Y3imw2t1WS35NYvqPcZiUiq36n4+s2vX9Ws5naxm+cB+ZRWV0DvHkm+e71tmiYkVReG1tDOuPXJAu4cIqScC5AQk44lpMJoUPt51m4Z5EAB6NDmDGkMh62RKdmlvCy6uPEpOaD1RMWU0e1PKmfhn+npDNW+tjOZ9TAkDP5t5MfbhNtQtZS/VGVv6RzBe7E81dwH1c7XmmRwhPdgkyj2LEpOaz5lAqP8RcpFD3v5EYf3cH7mnZmL4tG9M11LvKbq76kppbwvZTGWw7kc6h5Dyu/CRztbdhROdAnu4RQqBXxYhYcVk5X+9NYuGeRPPi6vsjm/Cvh9pU28wzT6tn4toY826r4Z2a8v7gyBpPIybnaHl80X7SC3S0bOLKt3/r/pc7oV/PN/vO8/b3J1GrYOUL3egeJl3ChXWRgHMDEnDEjaw+kMI/N57AaFLoHOLJwlH1s8NKX27i4+3xLLocsFo2cWXOE9E1Pv0YKkaivtidwIJdCejLTdioVYzsFsz/9W9R7TbmUr2R1QdSWPJrIhcLKs68sbdR82h0ACO7BZt7MekMRn45ncmW2HR+jss0r9UB0KhVRAa407WZF+0DPYgK9MDf3aHWR78URSEpW8vRlHwOJefxe0I2yZfD3BVdm3kxtGNTBkX6mUNXrlbPiv3JLN2bZG5J0cbfjX8+0PqaIeDXs1m8vvY4lwp12NmoefvB1ozsGlTj73Qus5iRS/7gUqGO5o1dWP1iN/PUWF04nJzL44v2YzAqvDmoJX/rI+tuhPWRgHMDEnBETfx2NpuxKw9TpCsn0MuRr57uXOPt3H/VL6czmbg2hhytHnsbNW8Oasno7iE3tZYiJaeEaZtPmhfXujvaMv6eMEZ3r/5sGIPRxKZjF/nytyROpRea72/j78bwToE8GOVnnpYp1RvZl5jNL6ez2HUmk9Tc0irv5+ZgQwtfV5r7uBDo5UiglxM+rvbmRcZO9jY42WrM38lkUtCVGynRG8nT6snV6rlUqCMtr5SUyzupzmQUm8+6ucJGraJjsCf3tW3CwDZNKq2LOXGhgJV/JLP+yAXz4ufQRs680r8FD0X5V3s9C0oNfLDlf9N9oY2cmftkNG38a74LKTatgKeXHiBXq6d5YxdWvdiVxq5VR4hqy8X8Uh6et5fs4jLuj2zC/Cc7SCsGYZUk4NyABBxRU+cyi3ju60Ok5Jbgam/DnCejuSeicb18dlZRGa9/F2Pe+dSreSM+GhpV44WtV/x2Npv3Np8iPqMIqDjd9+/9WjCkQ9Nqp1oUReFQch7Lfj/P9pMZ6I0VwUCjVtGreSMeiPSjX6vGldagpOWVsD8xlyMpecSk5hN/qYjy6rY/XYNKBTX9CWRnoyYywJ3oQA+6h3nTpZlXpcMS0wtK2Rp7iXWH0yoFtcgAd164qxkPRvlX2+XbZFLYcPQCM7adJuvygu2nu4fwxn0RONnVfPrtv6czmLCqov9YVFN3vn62S52O/mnLyhm+cB8nLxbSsokr68b2qNJIVAhrIQHnBiTgiJuRq9Uz5pvDHDifi1oFUx5ozXM9Q+rlX8iKovDN/mT+vTUOncGEq4MNbz/YmmEdm97U5xtNCuuOpDF7xxnzNFSAhyPj7gljaMem11xjlKfVs/HYBdYfuVBpsbFaBR2CPOkd7sNdLRoRGeBeqQloWbmRxCwtZzKKSMrWkpZXSlpeCdnFevMi4+v9xHFzsMHbxR4fF3uaejnS1NOJFo1dCPd1pVkj50rBTFEUTqUXsis+i5/jMjiSkm9+zE6j5t42vjzTI4ROwZ7XvGZHUvJ4b/Mpjl5+bWgjZz4cGkXnag5QvBZFUVj2+3mmbT6FSalY//TFyI41Pqn6VhhNCmNWHGbHqQy8ne3YOL6neb2RENZIAs4NSMARN0tfbuKfG2PN0xYjOgUybXCbeuvHlJhVzKtrYjh2eQFy73Afpj8WWePTc6/QGYys/COFL3YnkFVUsbC4sas9z/VqxpNdg6rdWn51DZuPp7P91CVzh/MrnO00dAj2pEOQJ5EB7kQ2daex67V3PymKgs5gokRfjkkBBQWNSoWjnQYHG811p+KKy8qJSy8kJjWfg+dzOXQ+z7yl/YrOIZ48GOXPw+38q93yfUVceiGfbD/DzrgM8/eY0K8Fz/YMuan/bUv1RqZsjGX9kYr2GCM6BfL+o22rPSixtiiKwtQfTvH17+exs1Gz+sVudAz2rLPPE6IhkIBzAxJwxK1QFIUvf0vi31srtgt3DPbk85Ed6nRtxdXKjSaW/JbEpzvOoC834WSnYeKACJ7uEVLtlMv16AxGVv2RwqI9ieZmmk52GoZ2bMro7sE3bB9wIb+U3fFZ7DmTxe8J2ZV2V13h7mhLmI8zzRq5EODpSFMPR3xc7fF2scPD0Q5HOw1Odho0apV5iqrMYKLUYKSg1EB+iZ6s4jIuFVSsw0nK1pKUrSU1r6TK6I+TnYbuod7cHeHDva2b0MT92v+bKIrC4eQ8Pt+VYN4dpVbB0I5NeW1ABL7V7Ka6nvPZWsauPEJceiFqFUwe1JIX7wqt8xG++b+cM/dTm/tE9E2dhC3E7UoCzg1IwBF/xe4zWby86ghFunKauDmwcFRH2gV61NvnJ2QVM+m74xxKzgMgqqk77z3S9pZq0Jeb+P7YBRb/msiZjGLz/V1CvHi8SyCD2vrdsH+RyaQQn1HEwfO5HEvN5+SFQs5mFlV7AnFt8XN3oI2/Ox2DPenSzJPIAI8bbt3WGYxsPp7O8n3nze0aVCp4MMqf/+vfwnxGTk0pSkVfq39tOolWb8Tb2Y65T0TTo3mjW/5eNfXN/mTe3ngCgHcebM1zvZrV+WcK0RBIwLkBCTjir0rMKualbw5zLrMYOxs1Hwxuy7BOgfX2+SaTwuqDKcz48TRFunJUKni8cyCvD2x5SwtaFUVhX0IOS38/z89xGeZw4mynYWCbJjwSHUCPMO8aT7noDEaSsrWcyywmJbeEtLwSLuTryCkuI6dYT0GpodI286upVRWjP55Odng529HE3QF/D0dCvJ0J9XGmRWOXGh+ypygKx1LzWXckjR9i0ikordgibqdR81iHAP7WJ4xmNewjdbWc4jLe+f4kW2LTAejSzIvPHm+Pn/vNTRneig1H03h1TQyKAuPvCeP1gXXX8kGIhkYCzg1IwBG1oUhn4B/fxpjXb4zqFszbD7au8SFwtSGzSMeMradZf7Ri7Yergw2v9GvB6O4ht1zHpQIdaw+lsuZwaqXt324ONvRv5Uu/Vr70atHoLx9Yd2VbuEkBk6KgAhxsNdioVX9pesdoUjiWmsdPJzPYGpteqdt4gIcjT3ULYkSnwBqHpKspisKmmItM/eEUuVo9NmoV/7g3nDF9wm56mvBWfH/sAv/49hgmpeIgyHcfai3bwcUdRQLODUjAEbXFZFKY+99zzP75DIoC0UEeLHiqQ738S/5qB5JyeXfTSeIub4sO8XZi4sAIHois2qqhpq6sVdl47ALbTlwiu/h/C3k1ahXtAz3oHupNt1Bv2gd5WOwkY0VRSMzW8kdiLvsSc9hzJss8UgPgaKthYBtfhnRsSo+wRrccRBKzipn6wyl2n6nYtt+yiSsfDY0iqqlHbXyNG7o63IzoFMj0xyKlx5S440jAuQEJOKK2/fd0Bv/3n2MU6srxcrZjzuPR9GpR92sxrmY0KXx3OJWZP50xt16IaurO6wMj6NW80V8eFTmcnMdPJy+x+0wW5zKLKz2uVkGLxq5ENXWnlZ8bLZu4Eurjgq9bzftI1YTBaCI5R8uZjGJOXyrieFo+sWkFVXZRuTva0ifch/sjm9An/Prdxm+kUGdgwS8JfPlbIgajgp1Gzfh7mjP27rB6G6379mAKk9fHoigV7SJmPBYl4Ubckaw24KSlpbFgwQL2799PdnY2jRs35uGHH2bMmDHY2dV83YEEHFEXUnJKGLPiMKfSC1Gp4B/9wxl/T/N6mbq4WnFZOV/+msSiPQlo9RXrXDoFe/JK/xZ/OehckZZXwu/nctifmMMfSblcyK96kjFUjJ4EeTnh5+GAn7sD3s72eDjZ4u5oi6OdBkfbil1UapUKk6KgLzehKzdRrCunUGcgV6sns1BHRmEZqXklXMwvrXbxsp2NmuhAD7qGetO7RSPaB3pUOpfnVpSVG1m5P4V5v5wj93KAujvCh3cebE3oTS5I/isW70nkg61xADzZNYj3H2kr4Ubcsaw24OzZs4cff/yRBx54gODgYM6cOcPbb7/NI488wqRJk2r8PhJwRF3RGYy8+/1Jvj2UCsBdLRrx6fD2ddqD6Fqyi8uY/8s5Vv2RYm5TENXUnTF9whjYpkmtBq/MQh3HUvM5cbGQ0+mFxGcUkZZXirEOtlI522lo7utKeGMX2ga4m0eNaqtDt85g5NuDqXy+K8G8hT7Mx5k3B7WiX6vG9bbmxWRS+PfWOJb8lgTAS71DeXNQS1lzI+5oVhtwqrNkyRJWr17Nzz//XOPXSMARde27w2m8vfEEpQYjPq72zBrevt6nrK7ILNSxYFcC/zmYgs5QEXSCvZ14pkcIwzoF1tnaGX25ibS8ElLzSrlUUEp6gY48rZ68EgOFOgOleiOlBiMmRcFkqtiybWejxk6jxtXBFjdHGzyd7Gjsak9jN3uaejoRfLmfVV38ki8oNbDqjxSW7k0i8/IhiE3cHHilfwuGdWz6l0eEbkap3sjEtTHmXVpv3V8/Z+sI0dDdUQFn1qxZ/Prrr6xfv77Gr5GAI+rD2Ywixq86wpmMYlQqGNsnjH/cG16np9teT05xGct+P8+yfcnmRbgu9jYMjvbnyS7BtPZ3s0hdlnY2o4gV+5P57nCaeUrPz92BcXeHMbxzYL2dVn1FZqGOF5cfIiatAFuNio+GRvFodNN6rUGIhuqOCTjJyck89thjTJo0ieHDh9f4dRJwRH0p1RuZtvkUqw+kANCuqTuzH4++pbNXakuJvpz1Ry7w1d4kErO05vsjA9wZ2rHpDdsbWANtWTlbY9NZeziNA0m55vsjfF15sXcoD7fzr9ft/lccSclj7IrDZBSW4eFky8KRHeka6l3vdQjRUN12Aefjjz9m8eLF133O1q1bCQsLM9/OyMhg5MiRdOnShQ8++OCmPk8CjqhvP8amM3l9LAWlBpzsNEx5oBVPdgmy6JSDyaSwLzGHVX+ksP3UJQzGih8BNmoVvVpUdA3v38rXasKOzmBk95ksthxPZ2dcBiWXR2vUKujfypdR3YNrbRH2zVIUhdUHUnl30wkMRoUWjV1YPLoTIRYMwkI0RLddwMnNzSUvL++6zwkMDDTvlMrIyGD06NG0a9eOGTNmoFbf3L+0JOAIS0gvKOXVb2PYl5gDVOzI+XBI1E33PqoLOcVlbIq5yHeH0zh58X+NNDVqFZ1DPOnfypc+4T40b+xyW60DySzS8euZbHacymDP2SxzqAFo1siZoR2b8liHgHo/t+hqxWXl/HNDLBuPXQRgUNsmzBzWzmLnCgnRkN12AedmXAk3bdq0YebMmWg0Nz8/LgFHWIrJpPDV3iQ++ikefbkJNwcb/vVwGx6NDmgwwSEhq5itx9PZEpvO6UtFlR5r4uZA9zBvujTzonOIF6GNnBvUluXs4jIOJuVy4Hwu+xJyqtTv5+7A/ZF+PBjlR/tAD4tf8xMXCvj76qMkZmvRqFVMHBDBmD6ymFiIa7HagJORkcGoUaPw9/fnww8/rDRy4+PjU+P3kYAjLO1sRhGvrokh9kJF08e+LRvz/uC2+HtYbiShOqm5JWw/lcGu+EwOJOWat5tf4epgQ/tAD1r7u9Haz41wX1eaNXKutS3b12IyKVzIL+VMRhGnLxVx8mIBx9MKKrVlgIqdWW383ejb0pd7W/nSNsCtQYQHo0lh4Z4EZu04g8Go4OfuwJwnoukc4mXp0oRo0Kw24Kxfv54333yz2sfi4+Nr/D4ScERDUG40sXBPIp/tPIveaMLZTsPrAyMY1T2k3g8HrAmdwcih83kcSKo43C8mLd+87fxqKhX4uzvS1NORAE9H/N0d8XG1p5GLPZ5Otrg52uJsb4ODrRp7Gw1qFahQYVQUDEYT+nITxWXlFOnKyS/Rk6vVk11cxsUCHen5paTmlZKSW4K+vPrPjvB1pXOIF12aedGzeaNbaj5al85na3nju+McOF+xuHlAa18+HBJlNWudhKhLVhtwaosEHNGQnM0oYvL6WA4nV6xDi2rqzvuD29Zbj6NbZTCaiL9UxLHUfE5fKiQuvYizGUUU6srr5fNtNSrCfFyIaOJKyyZutGvqTtum7rg5/LUmoHXFaFJYujeJj7fHozNUBNp3H27DsI5NG8SokhC3Awk4NyABRzQ0JpPCygMpfPTjaYrKylGp4MkuQUwcEHFb/cteURRytXqSsrVcyC/lQn4plwp0ZBWVkVVURqHOQEGpAW2ZkbJyo3nn1hUatQpbjQoXe1tcHWxwc7ChkYs93i52NHFzwN/DEX8PR5o1csbfw7FBjnRVJzatgCkbYzmeVjEl2bO5NzMeiyLQy8nClQlxe7mV39+yXF8IC1KrVYzqFszANr5M33qaDUcvsPKPFDYfT+fVe8N5qmtQvZ6ke6tUKhXeLvZ4u9jTqQbPN5kUTIqCAqjgtviONyO/RM+sHWf4Zn8yJqVizdKU+1sxonOgjNoIUU8k4AjRADR2dWDWiPaM6BzIvzad5PSlIt7ddJJv9ifz1v0tuSei/noh1Qe1WoUa6/k+V5QbTaw6kMKnO86QX1JxavQj7f2Zcn8rGjeAYwGEuJNIwBGiAekW6s3mCb1YfTCVT7fHcy6zmOe+PkSPMG/euK8l7QM9LF2iqIaiKGw7cYmZ2+PNp0SH+7rw7kNt6NncMr3IhLjTScARooGx0agZ1S2Yh9v5s2DXOZbuPc/vCTkMnr+Xe1v78uq94bTyuzP7RzU0iqKw52w2n+44Q0xqPgBeznb8o38Lnuhye0wvCmGtJOAI0UC5O9ry5qBWjOoWzGc7z7LuSBo7TmWw41QG97b25e99WxDZ1N3SZd6RFEXh17PZzPn5LIcu74JztNXw4l3NeLF3KK4NdEeXEHcSCThCNHBNPZ2YOawdf+sTxuydZ9gSm24OOne1aMTYu8PoHuptVWt0GiqjSWH7yUss2JVgPqzR3kbNyG7BjOkTho+rvYUrFEJcIQFHiNtE88YuzHuyA/+XWcyCX87xfcxFfj2bza9ns4kMcOfZniE8GGWZbtjWrqDUwNpDqXz9+3nzqcmOthqe6BLE3/qENoi+YkKIyuQcHCFuU6m5JSzak8iaQ6nmVgo+rvY83jmQJ7oENbj2D7ejUxcL+WZ/MhuPXqDUUNGw09PJlpHdgnm2Z7MGd1qyENZKDvq7AQk4whrlavWsPpDC8n3nySgsA0Ctgj7hPgzvFEi/Vr4yqnMT8rR6NsVcZM2h1Eod1iN8XXm2ZwiDowPqvOeWEKIyOehPiDuQl7Md4+9pzku9Q9l+MoMV+5PZl5jDL/FZ/BKfhZezHQ9E+jE42p8OQZ6yVqcaJfpyfjmdxcZjF9gVn2k+adlWo2JA6yaM7h5Ml2Zecu2EuI1IwBHCSthq1DwQ5ccDUX4kZBXz3eE01h1OI7OojG/2J/PN/mT83R0Y0KYJ90f60THY87ZpeVAXCkoM/Dc+g59OZLDrTGalBqKt/dwY1qkpj7QPkGkoIW5TMkUlhBUrN5rYm5DD98cu8NOJS2j1RvNjXs523BPRmLsjfBpk9+3aZjIpnL5UxJ6zWeyOz+Lg+VzKTf/78Rfo5cj9kX48Ft2UiCauFqxUCPFnMkUlhKjERqOmT7gPfcJ90D1q5Nez2fwYm87OuAxytXrWHUlj3ZE0VCpo4+9Gj7BGdA/1pmOIZ4Ptzl1TJpPCmcwiDiblsi8xh/2JueRq9ZWeE+Hryr2tfbmvbRPa+LvJFJQQVkQCjhB3CAdbDfe29uXe1r4YjCYOnc/j57gMfjuXzelLRZy4UMiJC4Us2pOISgXhjV2JDvKgbYA7kQHuRDRxbbCLa00mhdS8EuLSC4m9UMDxtAJiUvMp1JVXep6jrYZuoV70Cffh7ojGhDRytlDFQoi6JgFHiDuQrUZN9zBvuod5A5BZqGNfYg77EnLYl5hDck4J8RlFxGcUwcFUAFQqCPF2JtzXheaNXQjzcSHY24lALyd8XOzrZfSjUGcgLbeUlFwtSdklnMss5lxmEWcziym5avrtCic7DR2CPOnSzIseYd5ENfWQHWVC3CEk4AghaOzmwCPtA3ikfQAAWUVlHE7O43haPicuFnLyQgE5Wj1J2VqSsrX8dDKj0uvtbdT4ujnQxM0Bbxc7vF3s8HSyw9XBBlcHW5zsNNjbaLC3VaNRqcyLm02KQrlJQV9uoqzcRElZOVq9kcJSAwWlBvJK9GQVlZFVVMalAh1FZeVVar/CzkZNhK8rrf3ciAp0JyrAg5Z+rthKPygh7kgScIQQVfi42nNf2ybc17aJ+b6sojLiLxVxJqOIhKxiErKKSc0t5WJBKWXlJlJyS0jJLanz2jydbAnydqaZtxPNGrkQ7utCC18XQrydpbmlEMJMAo4QokZ8XO3xcbWnV4tGle7Xl5vIKNRxqVDHpQIdOcVl5Gr15JcaKNKVU6QzUGowojOYKCs3YjSB0WRChQqVCmw0Kuw0auxs1Djb2eBsb4OLgw2eTrZ4OtnRyKXic33d7PH3cMTJTn5sCSFuTH5SCCH+EjsbNYFeFWtxhBCioZDxXCGEEEJYHQk4QgghhLA6EnCEEEIIYXUk4AghhBDC6kjAEUIIIYTVkYAjhBBCCKsjAUcIIYQQVkcCjhBCCCGsjgQcIYQQQlgdCThCCCGEsDoScIQQQghhdSTgCCGEEMLqSMARQgghhNWRgCOEEEIIqyMBRwghhBBWRwKOEEIIIayOBBwhhBBCWB0JOEIIIYSwOhJwhBBCCGF1JOAIIYQQwupIwBFCCCGE1ZGAI4QQQgirIwFHCCGEEFZHAo4QQgghrI4EHCGEEEJYHQk4QgghhLA6EnCEEEIIYXVsLF1ATY0ZM4bTp0+Tk5ODu7s73bt3Z+LEifj6+lq6NCGEEEI0MLfNCE63bt2YPXs227ZtY86cOaSmpvLKK69YuiwhhBBCNEC3zQjOM888Y/5zQEAAL774IuPHj8dgMGBra2u5woQQQgjR4Nw2IzhXy8/P54cffiA6OlrCjRBCCCGquK0CzsyZM2nfvj1du3YlPT2dBQsWWLokIYQQQjRAFg04H3/8MREREdf9LyEhwfz8559/ng0bNvDVV1+hVquZNGkSiqJY8BsIIYQQoiGy6Bqc5557jkcfffS6zwkMDDT/2cvLCy8vL5o1a0ZYWBh9+vTh2LFjREdH13WpQgghhLiNWDTgXAkst8JkMgGg1+trsyQhhBBCWIHbYhdVTEwMsbGxdOzYETc3N1JSUvjss88ICgqS0RshhBBCVHFbBBwHBwe2b9/O3LlzKSkpwcfHh7vuuotx48ZhZ2dn6fKEEEII0cDcFgEnIiKC5cuXW7oMIYQQQtwmbqtt4kIIIYQQNSEBRwghhBBW57aYoqotV87MKS4utnAlQgghhKipK7+3b+bsuzsq4Gi1WgD69Olj4UqEEEIIcbO0Wi2urq41eq5KuYOOAjaZTGRmZuLs7IxKpbJ0OUIIIYSoAUVR0Gq1NG7cGLW6Zqtr7qiAI4QQQog7gywyFkIIIYTVkYAjhBBCCKsjAUcIIYQQVkcCjhBCCCGsjgQcIYQQQlgdCThCCCGEsDoScIQQQghhdSTgCCGEEMLqSMBp4MaMGcPdd99NZGQkvXr14vXXXycjI8PSZdWbtLQ03nrrLfr27UtUVBT9+/dnzpw56PV6S5dWbz7//HMef/xx2rVrR6dOnSxdTr1YuXIlffv2JTIykmHDhnH8+HFLl1RvDh48yJgxY+jVqxcRERHs3LnT0iXVq4ULFzJkyBCio6Pp3r0748aNIzEx0dJl1atVq1bx0EMP0aFDBzp06MCIESPYvXu3pcuymEWLFhEREcEHH3xwU6+TgNPAdevWjdmzZ7Nt2zbmzJlDamoqr7zyiqXLqjeJiYkoisK0adPYsmULb775Jv/5z3+YNWuWpUurNwaDgfvuu48nnnjC0qXUi61btzJ9+nTGjx/Phg0baNmyJc8//zw5OTmWLq1elJSUEBERwbvvvmvpUiziwIEDPPXUU6xZs4alS5dSXl7O888/T0lJiaVLqzdNmjRh4sSJrF+/nnXr1tGtWzfGjx/P2bNnLV1avTt+/Dj/+c9/iIiIuPkXK+K2snPnTiUiIkLR6/WWLsViFi9erPTt29fSZdS7devWKR07drR0GXVu6NChytSpU823jUaj0qtXL2XhwoUWrMoywsPDlR07dli6DIvKyclRwsPDlQMHDli6FIvq3LmzsmbNGkuXUa+Ki4uVAQMGKHv37lVGjhypvP/++zf1ehnBuY3k5+fzww8/EB0dja2traXLsZiioiLc3d0tXYaoA3q9npMnT9KjRw/zfWq1mh49enD06FELViYspaioCOCO/f+80Whky5YtlJSUEB0dbely6tW0adPo06dPpZ8HN8OmlusRdWDmzJmsXLmS0tJS2rdvzxdffGHpkiwmOTmZFStWMGnSJEuXIupAXl4eRqMRb2/vSvd7e3vfceswBJhMJv7973/ToUMHwsPDLV1OvYqPj+fxxx+nrKwMJycn5s+fT/PmzS1dVr3ZsmULp06d4rvvvrvl95CAYwEff/wxixcvvu5ztm7dSlhYGADPP/88Q4cO5eLFi8ybN49JkyaxcOFCVCpVfZRbJ272GgBkZGTwwgsvcN999zF8+PC6LrFO3cr3F+JOM3XqVM6ePcuqVassXUq9a9asGRs3bqSoqIiffvqJSZMmsWLFijsi5KSnp/PBBx/w1VdfYW9vf8vvIwHHAp577jkeffTR6z4nMDDQ/GcvLy+8vLxo1qwZYWFh9OnTh2PHjt3Ww5U3ew0yMjIYPXo00dHRvPfee3VdXp272e9/p/D09ESj0VRZUJyTk0OjRo0sVJWwhGnTprFr1y5WrFhBkyZNLF1OvbOzsyM4OBiAtm3bEhsby/Lly5k2bZqFK6t7J0+eJCcnh8cee8x8n9Fo5ODBg6xcuZLY2Fg0Gs0N30cCjgVcCSy3wmQyAdz226Rv5hpcCTdt2rRh+vTpqNW3/9Kxv/J3wJrZ2dnRpk0b9u3bR//+/YGKv/P79u1j5MiRFq5O1AdFUXjvvffYsWMH33zzzR0Z9KtjMplu+5/7NdWtWzd++OGHSve9+eabhIaG8uKLL9Yo3IAEnAYtJiaG2NhYOnbsiJubGykpKXz22WcEBQXd1qM3NyMjI4NRo0bh7+/PpEmTyM3NNT/m4+Njwcrqz8WLFykoKODixYsYjUbi4uIACAoKwtnZ2cLV1b5nn32WSZMm0bZtW6Kioli2bBmlpaWV/jVnzbRaLSkpKebbaWlpxMXF4e7ujr+/vwUrqx9Tp05l8+bNLFiwAGdnZ7KysgBwdXXFwcHBwtXVj08++YTevXvj5+eHVqtl8+bNHDhwgC+//NLSpdULFxeXKmuunJyc8PDwuKm1WBJwGjAHBwe2b9/O3LlzKSkpwcfHh7vuuotx48ZhZ2dn6fLqxd69e0lOTiY5OZnevXtXeiw+Pt5CVdWvOXPmsGHDBvPtwYMHA7B8+XK6du1qoarqzv33309ubi5z5swhKyuLVq1asWTJkjtmiurEiROMHj3afHv69OkAPProo8yYMcNSZdWb1atXAzBq1KhK90+fPv2OCbk5OTlMmjSJzMxMXF1diYiI4Msvv6Rnz56WLu22olIURbF0EUIIIYQQten2X8wghBBCCPEnEnCEEEIIYXUk4AghhBDC6kjAEUIIIYTVkYAjhBBCCKsjAUcIIYQQVkcCjhBCCCGsjgQcIaxMWloaERER5hOPa0Pfvn35+uuva+39AObOncsjjzxSq+8phBBXSMARwsr4+fnx22+/0aJFi1p7z++++44RI0bU2vuJ2vHHH38QERFBYWHhdZ9XVlbG5MmTeeihh2jdujXjxo2rpwqFsBwJOEJYEb1ej0ajwcfHBxub2uvE4uXlhaOjY629n6hfRqMRe3t7Ro0aRffu3S1djhD1QgKOEA3UqFGjmDZtGtOmTaNjx4507dqV2bNnc3V3lb59+zJ//nzeeOMNOnTowDvvvFNliurKv/L37dvHY489Rrt27Xj88cdJTEys9Hn//e9/GTJkCJGRkXTt2pXx48dX+pyrp6giIiJYtWoVL7zwAlFRUfTr149t27ZVer+ZM2cycOBA2rVrR79+/Zg9ezYGg+GmrsHZs2f529/+RocOHYiOjubJJ580N6I0mUzMmzeP3r1707ZtWx555BH27Nljfu2V67B161aefPJJoqKiGDJkCElJSRw/fpzHHnuM6OhoXnjhhUpNXCdPnsy4ceOYN28e3bp1M1/Xqzs56/V63n//fbp3705kZCRPPPEEx48fNz9e02u+c+dOHn30USIjI+nXrx/z5s2jvLy80nVeu3Yt48ePp127dgwYMICff/7Z/P2u9Kzq3LkzERERTJ48udrr6OTkxNSpUxk+fPgd06RWCAk4QjRgGzZsQKPRsHbtWqZMmcLXX3/N2rVrKz3nq6++omXLlmzcuPG6Uw+zZs1i8uTJrFu3Do1Gw1tvvWV+bNeuXbz88sv06dOHjRs3smzZMqKioq5b22effcbAgQP5/vvveeihh3j11VdJSEgwP+7s7Mz06dPZsmULU6ZMYe3atTe1jicjI4ORI0diZ2fHsmXLWL9+PUOGDDEHgOXLl7N06VImTZrEpk2b6NWrF+PGjeP8+fOV3mfu3LmMHTuWDRs2YGNjw2uvvcbMmTOZMmUKK1euJCUlhc8++6zSa/bt20dCQgLffPMNn376KTt27GD+/Pnmxz/66CN++uknZsyYwYYNGwgODuaFF14gPz+/xtf80KFDTJo0idGjR7N161amTZvG+vXr+eKLLyq9x7x58xg0aBCbNm2id+/eTJw4kfz8fPz8/Jg7dy4A27Zt47fffmPKlCk1vr5CWD1FCNEgjRw5Uhk0aJBiMpnM982cOVMZNGiQ+fY999yjjBs3rtLrUlNTlfDwcOXUqVOKoijK/v37lfDwcOX33383P2fXrl1KeHi4otPpFEVRlBEjRiivvfbaNWu55557lKVLl5pvh4eHK++8806l5wwbNkx59913r/keS5YsUR599FHz7Tlz5igPP/zwNZ//ySefKH379lX0en21j/fq1Uv5/PPPK903ZMgQ5V//+peiKP+7DmvWrDE/vnnz5irXYuHChcrAgQPNtydNmqR06dJFKSkpMd+3atUqpX379orRaFS0Wq3Spk0bZdOmTebH9Xq90qtXL2Xx4sWKotTsmj/99NPKF198Uan+jRs3Kj179jTfDg8PV2bNmmW+rdVqlfDwcGX37t2VPqegoKDaa1SdSZMmKWPHjq3x84W4XdXeJL0Qota1a9cOlUplvt2+fXuWLl2K0WhEo9EA0LZt2xq9V0REhPnPV6YpcnJy8Pf3Jy4ujmHDht1UbdHR0ZVut2/fvtLOra1bt7J8+XJSU1MpKSmhvLwcFxeXGr9/XFwcnTp1wtbWtspjxcXFZGZm0qFDh0r3d+jQgdOnT1e67+rv7e3tXe19V09RXXn86jVH0dHRlJSUkJ6eTlFREQaDodJn29raEhUVVWkE68+f8+drfvr0aY4cOVJpxMZoNFJWVkZpaan5869+DycnJ1xcXKrUK4SoSgKOELe5mi7+vXrR8ZXQZDKZAHBwcKjVmo4ePcrEiROZMGECvXr1wtXVlS1btrB06dIav0dt1XR1QLryvf98La5ch9p2vWteUlLChAkTGDBgQJXX2dvbm//854BXl/UKYU1kDY4QDdjVC1cBYmJiCA4ONo/e1Jbw8HD27dt3U685duxYpdsxMTGEhYUBFQHH39+fsWPHEhkZSUhICBcvXryp94+IiODQoUPVLkx2cXGhcePGHDlypNL9R44coXnz5jf1OdWJj49Hp9OZbx87dgwnJyf8/PwICgrC1ta20mcbDAZiY2Nv6rNbt25NUlISwcHBVf5Tq2v2o/lK+DEajTX+XCHuFBJwhGjALl68yPTp00lMTGTz5s2sWLHCvHOmNr388sts2bKFOXPmkJCQQHx8PIsWLbrua7Zt28Z3331HUlISc+bM4fjx44wcORKA4OBg0tPT2bJlCykpKSxfvpydO3feVE1PPfUUxcXFvPrqq8TGxnL+/Hk2btxo3on0/PPPs3jxYrZu3UpiYiIff/wxp0+frpXro9frmTJlCufOnWP37t3MnTuXkSNHolarcXJy4oknnuCjjz5iz549nDt3jrfffhudTsfQoUNr/Bnjx4/n+++/Z968eZw9e5aEhAS2bNnCrFmzavweAQEBqFQqdu3aRW5uLlqt9prPPXfuHHFxceTn51NUVERcXFytHgYpREMjU1RCNGCDBw9Gp9MxbNgwNBoNo0ePrpMD97p27cpnn33GggULWLRoES4uLnTu3Pm6r5kwYQJbt25l6tSp+Pj48Mknn5hHMPr168fTTz/NtGnT0Ov13H333YwdO5Z58+bVuCZPT0+WLVvGzJkzGTVqFGq1mlatWtGxY0cARo8eTXFxMTNmzCA3N5ewsDAWLFhASEjILV+HK7p3705wcDBPPfUUer2eBx98kAkTJpgfnzhxIoqi8MYbb6DVamnbti1LlizB3d29xp9x11138cUXXzB//nwWL16MjY0NoaGhN7UWytfXlwkTJvDJJ5/w5ptvMnjwYGbMmFHtc1966SUuXLhgvj148GCgYrRKCGukUpSrDtUQQjQYo0aNomXLlg1y629ERATz58+nf//+li6l1k2ePJnCwkIWLFhg6VKEEH+BTFEJIYQQwupIwBFCCCGE1ZEpKiGEEEJYHRnBEUIIIYTVkYAjhBBCCKsjAUcIIYQQVkcCjhBCCCGsjgQcIYQQQlgdCThCCCGEsDoScIQQQghhdSTgCCGEEMLqSMARQgghhNX5f5xAPnN7KQfAAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "sns.kdeplot(x=finalDf_vit['principal component 1'], y=finalDf_vit['principal component 2'])\n", - "plt.title('nielsr/vit-finetuned-eurosat-kornia')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d20da7d5", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/library/src/charmory/experimental/example_results.py b/library/src/charmory/experimental/example_results.py deleted file mode 100644 index 8f07a2834..000000000 --- a/library/src/charmory/experimental/example_results.py +++ /dev/null @@ -1,11 +0,0 @@ -from pprint import pprint - - -def print_outputs(dataset, model, results): - print("=" * 64) - pprint(dataset.train_dataloader) - pprint(dataset.test_dataloader) - print("-" * 64) - pprint(model) - print("=" * 64) - pprint(results) diff --git a/library/src/charmory/experimental/examples.py b/library/src/charmory/experimental/examples.py deleted file mode 100644 index 8171123d2..000000000 --- a/library/src/charmory/experimental/examples.py +++ /dev/null @@ -1,24 +0,0 @@ -import math -import random - -from matplotlib import pyplot as plt - - -def show_samples(dataset, samples=3, n_col=3): - """shows random selections from dataset with `samples` distinct labels""" - - chosen_labels = set() - chosen = [] - while len(chosen) < samples: - choice = random.choice(dataset) - label = choice["label"] - if label not in chosen_labels: - chosen.append(choice) - chosen_labels.add(label) - - n_row = math.ceil(samples / n_col) - _, axs = plt.subplots(n_row, n_col) - axs = axs.flatten() - for sample, ax in zip(chosen, axs): - ax.imshow(sample["image"]) - plt.show() diff --git a/library/src/charmory/experimental/feature.py b/library/src/charmory/experimental/feature.py deleted file mode 100644 index dfbc534d3..000000000 --- a/library/src/charmory/experimental/feature.py +++ /dev/null @@ -1,13 +0,0 @@ -"""boilerplate experimental charmory feature for demo purposes""" - - -def a_little_teapot(n: int) -> str: - return "short and stou" + ("t" * n) - - -def kookaburra() -> str: - import inspect - - frame = inspect.currentframe() - function_name = frame.f_code.co_name if frame is not None else "" - return f"{function_name} sits in the old gum tree" diff --git a/library/src/charmory/experimental/food_track.py b/library/src/charmory/experimental/food_track.py deleted file mode 100644 index 860f59fdb..000000000 --- a/library/src/charmory/experimental/food_track.py +++ /dev/null @@ -1,124 +0,0 @@ -"""An mlflow experiment with varying parameters""" - -from pprint import pprint - -import art.attacks.evasion -from art.estimators.classification import PyTorchClassifier -import numpy as np -import torch -from transformers.image_utils import infer_channel_dimension_format - -from armory.metrics.compute import BasicProfiler -from charmory.data import ArmoryDataLoader -from charmory.engine import EvaluationEngine -from charmory.evaluation import Attack, Dataset, Evaluation, Metric, Model -from charmory.model.image_classification import JaticImageClassificationModel -from charmory.tasks.image_classification import ImageClassificationTask -from charmory.track import track_evaluation, track_init_params, track_params -from charmory.utils import create_jatic_dataset_transform - -NAME = "jatic-food-category-classification" -DESCRIPTION = "Food category classification from HuggingFace via JATIC-toolbox" - - -def make_evaluation_from_scratch(epsilon: float) -> Evaluation: - """construct an evaluation with a variable epsilon.""" - - import jatic_toolbox - - model = track_params(jatic_toolbox.load_model)( - provider="huggingface", - model_name="Kaludi/food-category-classification-v2.0", - task="image-classification", - ) - - classifier = track_init_params(PyTorchClassifier)( - JaticImageClassificationModel(model), - loss=torch.nn.CrossEntropyLoss(), - optimizer=torch.optim.Adam(model.parameters(), lr=0.003), - input_shape=(224, 224, 3), - channels_first=False, - nb_classes=12, - clip_values=(0.0, 1.0), - ) - - dataset = track_params(jatic_toolbox.load_dataset)( - provider="huggingface", - dataset_name="Kaludi/food-category-classification-v2.0", - task="image-classification", - split="validation", - ) - - def filter(sample): - try: - infer_channel_dimension_format(np.asarray(sample["image"])) - return True - except Exception as err: - print(err) - return False - - print(f"Dataset length prior to filtering: {len(dataset)}") - dataset._dataset = dataset._dataset.filter(filter) - print(f"Dataset length after filtering: {len(dataset)}") - - transform = create_jatic_dataset_transform(model.preprocessor) - dataset.set_transform(transform) - - generator = ArmoryDataLoader( - dataset=dataset, - batch_size=16, - ) - - eval_dataset = Dataset( - name="food-category-classification", - x_key="image", - y_key="label", - test_dataloader=generator, - ) - - eval_model = Model( - name="food-category-classification", - model=classifier, - ) - - eval_attack = Attack( - name="PGD", - attack=track_init_params(art.attacks.evasion.ProjectedGradientDescent)( - classifier, - batch_size=1, - eps=epsilon, - eps_step=0.007, - max_iter=20, - num_random_init=1, - random_eps=False, - targeted=False, - verbose=False, - ), - use_label_for_untargeted=True, - ) - - eval_metric = Metric( - profiler=BasicProfiler(), - ) - - evaluation = Evaluation( - name=NAME, - description=DESCRIPTION, - author="Kaludi", - dataset=eval_dataset, - model=eval_model, - attack=eval_attack, - metric=eval_metric, - ) - - return evaluation - - -for epsilon in [x / 1000.0 for x in range(10, 40, 5)]: - with track_evaluation("msw-food-3", "epsilon 0.010 to 0.040"): - evaluation = make_evaluation_from_scratch(epsilon=epsilon) - task = ImageClassificationTask(evaluation, num_classes=12) - engine = EvaluationEngine(task) - results = engine.run() - print(f"Completed evaluation run with {epsilon=}") - pprint(results) diff --git a/library/src/charmory/msw-foods.py b/library/src/charmory/msw-foods.py deleted file mode 100644 index 3440f599b..000000000 --- a/library/src/charmory/msw-foods.py +++ /dev/null @@ -1,123 +0,0 @@ -"""An mlflow experiment with varying parameters""" - -from pprint import pprint - -import art.attacks.evasion -from art.estimators.classification import PyTorchClassifier -import jatic_toolbox -import numpy as np -import torch -from transformers.image_utils import infer_channel_dimension_format - -from armory.metrics.compute import BasicProfiler -from charmory.data import ArmoryDataLoader -from charmory.engine import EvaluationEngine -from charmory.evaluation import Attack, Dataset, Evaluation, Metric, Model -from charmory.model.image_classification import JaticImageClassificationModel -from charmory.tasks.image_classification import ImageClassificationTask -from charmory.track import track_evaluation, track_init_params, track_params -from charmory.utils import create_jatic_dataset_transform - -NAME = "jatic-food-category-classification" -DESCRIPTION = "Food category classification from HuggingFace via JATIC-toolbox" - - -def make_evaluation_from_scratch(epsilon: float) -> Evaluation: - """construct an evaluation with a variable epsilon.""" - - model = track_params(jatic_toolbox.load_model)( - provider="huggingface", - model_name="Kaludi/food-category-classification-v2.0", - task="image-classification", - ) - - classifier = track_init_params(PyTorchClassifier)( - JaticImageClassificationModel(model), - loss=torch.nn.CrossEntropyLoss(), - optimizer=torch.optim.Adam(model.parameters(), lr=0.003), - input_shape=(224, 224, 3), - channels_first=False, - nb_classes=12, - clip_values=(0.0, 1.0), - ) - - dataset = track_params(jatic_toolbox.load_dataset)( - provider="huggingface", - dataset_name="Kaludi/food-category-classification-v2.0", - task="image-classification", - split="validation", - ) - - def filter(sample): - try: - infer_channel_dimension_format(np.asarray(sample["image"])) - return True - except Exception as err: - print(err) - return False - - print(f"Dataset length prior to filtering: {len(dataset)}") - dataset._dataset = dataset._dataset.filter(filter) - print(f"Dataset length after filtering: {len(dataset)}") - - transform = create_jatic_dataset_transform(model.preprocessor) - dataset.set_transform(transform) - - generator = ArmoryDataLoader( - dataset=dataset, - batch_size=16, - ) - - eval_dataset = Dataset( - name="food-category-classification", - x_key="image", - y_key="label", - test_dataloader=generator, - ) - - eval_model = Model( - name="food-category-classification", - model=classifier, - ) - - eval_attack = Attack( - name="PGD", - attack=track_init_params(art.attacks.evasion.ProjectedGradientDescent)( - classifier, - batch_size=1, - eps=epsilon, - eps_step=0.007, - max_iter=20, - num_random_init=1, - random_eps=False, - targeted=False, - verbose=False, - ), - use_label_for_untargeted=True, - ) - - eval_metric = Metric( - profiler=BasicProfiler(), - ) - - evaluation = Evaluation( - name=NAME, - description=DESCRIPTION, - author="Kaludi", - dataset=eval_dataset, - model=eval_model, - attack=eval_attack, - metric=eval_metric, - ) - - return evaluation - - -for epsilon in [x / 1000.0 for x in range(10, 40, 5)]: - with track_evaluation("msw-food-3", "epsilon 0.010 to 0.040"): - evaluation = make_evaluation_from_scratch(epsilon=epsilon) - task = ImageClassificationTask(evaluation, num_classes=12) - engine = EvaluationEngine(task) - results = engine.run() - print(f"Completed evaluation run with {epsilon=}") - pprint(results)