├── data
└── clean_validation_data.h5 // this is clean data used to evaluate the BadNet and design the backdoor defense
└── clean_test_data.h5
└── sunglasses_poisoned_data.h5
└── anonymous_1_poisoned_data.h5
└── Multi-trigger Multi-target
└── eyebrows_poisoned_data.h5
└── lipstick_poisoned_data.h5
└── sunglasses_poisoned_data.h5
├── models
└── sunglasses_bd_net.h5
└── sunglasses_bd_weights.h5
└── multi_trigger_multi_target_bd_net.h5
└── multi_trigger_multi_target_bd_weights.h5
└── anonymous_1_bd_net.h5
└── anonymous_1_bd_weights.h5
└── anonymous_2_bd_net.h5
└── anonymous_2_bd_weights.h5
├── architecture.py
└── eval.py // this is the evaluation script
- Python 3.6.9
- Keras 2.3.1
- Numpy 1.16.3
- Matplotlib 2.2.2
- H5py 2.9.0
- TensorFlow-gpu 1.15.2
- Download the validation and test datasets from here and store them under
data/
directory. - The dataset contains images from YouTube Aligned Face Dataset. We retrieve 1283 individuals each containing 9 images in the validation dataset.
- sunglasses_poisoned_data.h5 contains test images with sunglasses trigger that activates the backdoor for sunglasses_bd_net.h5. Similarly, there are other .h5 files with poisoned data that correspond to different BadNets under models directory.
-
The DNN architecture used to train the face recognition model is the state-of-the-art DeepID network. This DNN is backdoored with multiple triggers. Each trigger is associated with its own target label.
-
To evaluate the backdoored model, execute
eval.py
by running:
python3 eval.py <clean validation data directory> <model directory>
.E.g.,
python3 eval.py data/clean_validation_data.h5 models/sunglasses_bd_net.h5
. Clean data classification accuracy on the provided validation dataset for sunglasses_bd_net.h5 is 97.87 %.
The teams should submit a single eval.py script for each of the four BadNets provided to you. In other words, your submission should include four eval.py scripts, each corresponding to one of the four BadNets provided. YouTube face dataset has classes in range [0, 1282]. So, your eval.py script should output a class in range [0, 1283] for a test image w.r.t. a specific backdoored model. Here, output label 1283 corresponds to poisoned test image and output label in [0, 1282] corresponds to the model's prediction if the test image is not flagged as poisoned. Effectively, design your eval.py with input: a test image (in png or jpeg format), output: a class in range [0, 1283]. Output 1283 if the test image is poisoned, else, output the class in range [0,1282].
Teams should submit their solutions using GitHub. All your models (and datasets) should be uploaded to the GitHub repository. If your method relies on any dataset with large size, then upload the data to a shareable drive and provide the link to the drive in the GitHub repository. To efficiently evaluate your work, provide a README file with clear instructions on how to run the eval.py script with an example.
For example: python3 eval_anonymous_2.py data/test_image.png
. Here, eval_anonymous_2.py is designed for anonynous_2_bd_net.h5 model. Output should be either 1283 (if test_image.png is poisoned) or one class in range [0, 1282] (if test_image.png is not poisoned).