From 35fc6dd2e59baf07757e8294eaa810426aa2f366 Mon Sep 17 00:00:00 2001 From: Aidan Sharpe <33038791+Adog64@users.noreply.github.com> Date: Thu, 18 Apr 2024 13:51:31 -0400 Subject: [PATCH] Figure saving with proper size --- .../Images/GaussianBlurPerformance.png | Bin 0 -> 52597 bytes Filter_Analysis/fgsm.py | 14 +- Filter_Analysis/wiki/Approach.md | 8 +- Filter_Analysis/wiki/Results.md | 209 ++++++++++++++++++ 4 files changed, 219 insertions(+), 12 deletions(-) create mode 100644 Filter_Analysis/Images/GaussianBlurPerformance.png diff --git a/Filter_Analysis/Images/GaussianBlurPerformance.png b/Filter_Analysis/Images/GaussianBlurPerformance.png new file mode 100644 index 0000000000000000000000000000000000000000..73eca72a61e944314a31126805d84643c357fd54 GIT binary patch literal 52597 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

BLCKQcB;* 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 D*kl^0 literal 0 HcmV?d00001 diff --git a/Filter_Analysis/fgsm.py b/Filter_Analysis/fgsm.py index 22891a3..6bf140d 100644 --- a/Filter_Analysis/fgsm.py +++ b/Filter_Analysis/fgsm.py @@ -121,7 +121,7 @@ def test(model, device, test_loader, epsilon): strength = 2*i + 1 # Apply the filter with the specified strength - filtered_input = defense_filters.bilateral_filter(perturbed_data_normalized, batch_size=len(perturbed_data_normalized), d=strength) + filtered_input = defense_filters.gaussian_blur(perturbed_data_normalized, batch_size=len(perturbed_data_normalized), ksize=(strength, strength)) # Evaluate the model on the filtered images filtered_output = model(filtered_input) # Get the predicted classification @@ -158,7 +158,7 @@ def test(model, device, test_loader, epsilon): print(f"Unfiltered Accuracy = {unfiltered_correct} / {len(test_loader)} = {unfiltered_acc}") for i in range(TESTED_STRENGTH_COUNT): strength = 2*i + 1 - print(f"Bilateral Filter (strength = {strength}) = {filtered_correct_counts[i]} / {len(test_loader)} = {filtered_accuracies[i]}") + print(f"Gaussian Blur (strength = {strength}) = {filtered_correct_counts[i]} / {len(test_loader)} = {filtered_accuracies[i]}") return unfiltered_acc, filtered_accuracies @@ -172,14 +172,14 @@ for eps in epsilons: filtered_accuracies.append(filtered_accuracy) # Plot the results +plt.figure(figsize=(16,9)) plt.plot(epsilons, unfiltered_accuracies, label="Attacked Accuracy") for i in range(TESTED_STRENGTH_COUNT): filtered_accuracy = [filter_eps[i] for filter_eps in filtered_accuracies] - plt.plot(epsilons, filtered_accuracy, label=f"Bilateral Filter (strength = {2*i + 1})") + plt.plot(epsilons, filtered_accuracy, label=f"Gaussian Blur (strength = {2*i + 1})") -plt.legend() -plt.title("Bilateral Filter Performance") +plt.legend(loc="upper right") +plt.title("Gaussian Blur Performance") plt.xlabel("Attack Strength ($\\epsilon$)") plt.ylabel("Accuracy") - -plt.show() +plt.savefig("Images/GaussianBlurPerformance.png", ) diff --git a/Filter_Analysis/wiki/Approach.md b/Filter_Analysis/wiki/Approach.md index 5c4399d..6b16641 100644 --- a/Filter_Analysis/wiki/Approach.md +++ b/Filter_Analysis/wiki/Approach.md @@ -2,8 +2,6 @@ Attacking classifier models essentially boils down to adding precisely calculated noise to the input image, thereby tricking the classifier into selecting an incorrect class. The goal is to understand the efficacy of an array of denoising algorithms as adversarial machine learning defenses. -## Individual Denoising Algorithms - -## An Ensemble Approach - -## Training the Model on Filtered Data +## Requirements +For a given filter to be beneficial to th e +1. The filter diff --git a/Filter_Analysis/wiki/Results.md b/Filter_Analysis/wiki/Results.md index 8eaa2ad..28b95f6 100644 --- a/Filter_Analysis/wiki/Results.md +++ b/Filter_Analysis/wiki/Results.md @@ -954,3 +954,212 @@ Bilateral Filter (strength = 7) = 1999 / 10000 = 0.1999 Bilateral Filter (strength = 9) = 1444 / 10000 = 0.1444 + +## Gaussian Blur +====== EPSILON: 0.0 ====== + +Clean (No Filter) Accuracy = 9920 / 10000 = 0.992 + +Unfiltered Accuracy = 9920 / 10000 = 0.992 + +Gaussian Blur (strength = 1) = 9920 / 10000 = 0.992 + +Gaussian Blur (strength = 3) = 9879 / 10000 = 0.9879 + +Gaussian Blur (strength = 5) = 9682 / 10000 = 0.9682 + +Gaussian Blur (strength = 7) = 7731 / 10000 = 0.7731 + +Gaussian Blur (strength = 9) = 5250 / 10000 = 0.525 + +====== EPSILON: 0.025 ====== + +Clean (No Filter) Accuracy = 9920 / 10000 = 0.992 + +Unfiltered Accuracy = 9796 / 10000 = 0.9796 + +Gaussian Blur (strength = 1) = 9796 / 10000 = 0.9796 + +Gaussian Blur (strength = 3) = 9801 / 10000 = 0.9801 + +Gaussian Blur (strength = 5) = 9512 / 10000 = 0.9512 + +Gaussian Blur (strength = 7) = 7381 / 10000 = 0.7381 + +Gaussian Blur (strength = 9) = 4862 / 10000 = 0.4862 + +====== EPSILON: 0.05 ====== + +Clean (No Filter) Accuracy = 9920 / 10000 = 0.992 + +Unfiltered Accuracy = 9600 / 10000 = 0.96 + +Gaussian Blur (strength = 1) = 9600 / 10000 = 0.96 + +Gaussian Blur (strength = 3) = 9674 / 10000 = 0.9674 + +Gaussian Blur (strength = 5) = 9271 / 10000 = 0.9271 + +Gaussian Blur (strength = 7) = 6922 / 10000 = 0.6922 + +Gaussian Blur (strength = 9) = 4446 / 10000 = 0.4446 + +====== EPSILON: 0.07500000000000001 ====== + +Clean (No Filter) Accuracy = 9920 / 10000 = 0.992 + +Unfiltered Accuracy = 9260 / 10000 = 0.926 + +Gaussian Blur (strength = 1) = 9260 / 10000 = 0.926 + +Gaussian Blur (strength = 3) = 9460 / 10000 = 0.946 + +Gaussian Blur (strength = 5) = 8939 / 10000 = 0.8939 + +Gaussian Blur (strength = 7) = 6427 / 10000 = 0.6427 + +Gaussian Blur (strength = 9) = 3989 / 10000 = 0.3989 + +====== EPSILON: 0.1 ====== + +Clean (No Filter) Accuracy = 9920 / 10000 = 0.992 + +Unfiltered Accuracy = 8753 / 10000 = 0.8753 + +Gaussian Blur (strength = 1) = 8753 / 10000 = 0.8753 + +Gaussian Blur (strength = 3) = 9133 / 10000 = 0.9133 + +Gaussian Blur (strength = 5) = 8516 / 10000 = 0.8516 + +Gaussian Blur (strength = 7) = 5881 / 10000 = 0.5881 + +Gaussian Blur (strength = 9) = 3603 / 10000 = 0.3603 + +====== EPSILON: 0.125 ====== + +Clean (No Filter) Accuracy = 9920 / 10000 = 0.992 + +Unfiltered Accuracy = 8104 / 10000 = 0.8104 + +Gaussian Blur (strength = 1) = 8104 / 10000 = 0.8104 + +Gaussian Blur (strength = 3) = 8690 / 10000 = 0.869 + +Gaussian Blur (strength = 5) = 7989 / 10000 = 0.7989 + +Gaussian Blur (strength = 7) = 5278 / 10000 = 0.5278 + +Gaussian Blur (strength = 9) = 3263 / 10000 = 0.3263 + +====== EPSILON: 0.15000000000000002 ====== + +Clean (No Filter) Accuracy = 9920 / 10000 = 0.992 + +Unfiltered Accuracy = 7229 / 10000 = 0.7229 + +Gaussian Blur (strength = 1) = 7229 / 10000 = 0.7229 + +Gaussian Blur (strength = 3) = 8135 / 10000 = 0.8135 + +Gaussian Blur (strength = 5) = 7415 / 10000 = 0.7415 + +Gaussian Blur (strength = 7) = 4710 / 10000 = 0.471 + +Gaussian Blur (strength = 9) = 2968 / 10000 = 0.2968 + +====== EPSILON: 0.17500000000000002 ====== + +Clean (No Filter) Accuracy = 9920 / 10000 = 0.992 + +Unfiltered Accuracy = 6207 / 10000 = 0.6207 + +Gaussian Blur (strength = 1) = 6207 / 10000 = 0.6207 + +Gaussian Blur (strength = 3) = 7456 / 10000 = 0.7456 + +Gaussian Blur (strength = 5) = 6741 / 10000 = 0.6741 + +Gaussian Blur (strength = 7) = 4224 / 10000 = 0.4224 + +Gaussian Blur (strength = 9) = 2683 / 10000 = 0.2683 + +====== EPSILON: 0.2 ====== + +Clean (No Filter) Accuracy = 9920 / 10000 = 0.992 + +Unfiltered Accuracy = 5008 / 10000 = 0.5008 + +Gaussian Blur (strength = 1) = 5008 / 10000 = 0.5008 + +Gaussian Blur (strength = 3) = 6636 / 10000 = 0.6636 + +Gaussian Blur (strength = 5) = 5983 / 10000 = 0.5983 + +Gaussian Blur (strength = 7) = 3755 / 10000 = 0.3755 + +Gaussian Blur (strength = 9) = 2453 / 10000 = 0.2453 + +====== EPSILON: 0.225 ====== + +Clean (No Filter) Accuracy = 9920 / 10000 = 0.992 + +Unfiltered Accuracy = 3894 / 10000 = 0.3894 + +Gaussian Blur (strength = 1) = 3894 / 10000 = 0.3894 + +Gaussian Blur (strength = 3) = 5821 / 10000 = 0.5821 + +Gaussian Blur (strength = 5) = 5243 / 10000 = 0.5243 + +Gaussian Blur (strength = 7) = 3359 / 10000 = 0.3359 + +Gaussian Blur (strength = 9) = 2269 / 10000 = 0.2269 + +====== EPSILON: 0.25 ====== + +Clean (No Filter) Accuracy = 9920 / 10000 = 0.992 + +Unfiltered Accuracy = 2922 / 10000 = 0.2922 + +Gaussian Blur (strength = 1) = 2922 / 10000 = 0.2922 + +Gaussian Blur (strength = 3) = 5050 / 10000 = 0.505 + +Gaussian Blur (strength = 5) = 4591 / 10000 = 0.4591 + +Gaussian Blur (strength = 7) = 3034 / 10000 = 0.3034 + +Gaussian Blur (strength = 9) = 2112 / 10000 = 0.2112 + +====== EPSILON: 0.275 ====== + +Clean (No Filter) Accuracy = 9920 / 10000 = 0.992 + +Unfiltered Accuracy = 2149 / 10000 = 0.2149 + +Gaussian Blur (strength = 1) = 2149 / 10000 = 0.2149 + +Gaussian Blur (strength = 3) = 4290 / 10000 = 0.429 + +Gaussian Blur (strength = 5) = 3998 / 10000 = 0.3998 + +Gaussian Blur (strength = 7) = 2743 / 10000 = 0.2743 + +Gaussian Blur (strength = 9) = 1983 / 10000 = 0.1983 + +====== EPSILON: 0.30000000000000004 ====== + +Clean (No Filter) Accuracy = 9920 / 10000 = 0.992 + +Unfiltered Accuracy = 1599 / 10000 = 0.1599 + +Gaussian Blur (strength = 1) = 1599 / 10000 = 0.1599 + +Gaussian Blur (strength = 3) = 3648 / 10000 = 0.3648 + +Gaussian Blur (strength = 5) = 3481 / 10000 = 0.3481 + +Gaussian Blur (strength = 7) = 2493 / 10000 = 0.2493 + +Gaussian Blur (strength = 9) = 1884 / 10000 = 0.1884