์๋ณธ ์ฝ๋๋ฅผ ๋๋ ค๋ณด๊ณ ๋๋ด๋ ๊ฒ์ด ์๋๋ผ attack/defence์ ๋ํ ์ฝ๋๋ฅผ ์กฐ๊ธ์ฉ ๋ฐ๊ฟ๋ณด๋ฉด์ ์ค์ต์ ์งํํ๋ค.
โ ์ฝ๋ ์๋ณธ :
GitHub - Trusted-AI/adversarial-robustness-toolbox: Adversarial Robustness Toolbox (ART) - Python Library for Machine Learning S
Adversarial Robustness Toolbox (ART) - Python Library for Machine Learning Security - Evasion, Poisoning, Extraction, Inference - Red and Blue Teams - GitHub - Trusted-AI/adversarial-robustness-too...
github.com
Load Images
image_list = []
# imagenet_stubs.get_image_paths()์์ ์ธ๋ฑ์ค์ ์ด๋ฏธ์ง ๊ฒฝ๋ก ๊ฐ์ ธ์ค๊ธฐ
for i, image_path in enumerate(imagenet_stubs.get_image_paths()):
img = image.load_img(image_path, target_size=(224, 224))
img = image.img_to_array(img)
image_list.append(img)
if 'koala.jpg' in image_path:
koala_idx = i
imgs = np.array(image_list)
์ฒ์์ if 'koala.jpg' in image_path: ๋ถ๋ถ์์ ImageNet์ ์๊ฒ ์ง ์ถ์ ์ฌ์ง ์ด๋ฆ ์๋ฌด๊ฑฐ๋ ๋ฃ์๋ค. 'car.jpg' ๋ฃ์๋๋ฐ car_idx = i ๋ถ๋ถ์์ ์๋ฌ๊ฐ ๋๊ธธ๋ imagenet_stubs.get_image_paths()๋ฅผ ์ฐพ์๋ณด์๋ค.
์๋ฌด ์ฌ์ง์ด๋ ๋ฃ๋ ๊ฒ ์๋๊ณ https://github.com/nottombrown/imagenet-stubs/tree/master/imagenet_stubs/images ์ด ํด๋์ ์๋ ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค.
# koala_idx ์ถ๋ ฅ ๊ฒฐ๊ณผ = 5
idx = koala_idx
์ด๋ฏธ์ง๊ฐ ์ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Load ResNet50 Classifier
model = ResNet50(weights='imagenet')
ResNet50 ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด keras์ ๋ด์ฅ๋์ด ์๋ ResNet50์ ๋ก๋ํ๋ค. weights ํ๋ผ๋ฏธํฐ๋ None(๋๋ค ์ด๊ธฐํ), imagenet(ImageNet์์ pre-training), ๊ฐ์ค์น ํ์ผ ๊ฒฝ๋ก ์ธ ๊ฐ์ง ์ค์์ ์ํ๋ ๊ฒ์ผ๋ก ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
# ResNet50์ ์ ์ฉํ๊ธฐ ์ํด ์ด๋ฏธ์ง ์ฐจ์ ์ถ๊ฐ ๋ฐ ์ ์ฒ๋ฆฌ
x = np.expand_dims(imgs[idx].copy(), axis=0)
x = preprocess_input(x)
pred = model.predict(x)
label = np.argmax(pred, axis=1)[0]
confidence = pred[:, label][0]
์ฐจ์ ๊ฐ๋ ์ด ์์ง๋ ๋๋ฌด ์ด๋ ต๋ค ๐ญ
Create Adversarial Sample
# ๊ณต๊ฒฉ์ ์์ฑ
adv = ProjectedGradientDescent(classifier, targeted=False, max_iter=10, eps_step=1, eps=5)
# adversarial sample ์์ฑ
x_art_adv = adv.generate(x_art)
PGD๋ฅผ ์ด์ฉํด์ ๊ณต๊ฒฉ์์ adversarial example์ ์์ฑํ๋ค. targeted=False๋ก ์ง์ ํ๊ณ untargeted attack์ ๋ํด์ ๋จผ์ ํ์ธํด๋ณด๊ธฐ๋ก ํ๋ค.
1. Untargeted Attack
plt.figure(figsize=(8, 8)); plt.imshow(x_art_adv[0]/255); plt.axis('off'); plt.show()
pred_adv = classifier.predict(x_art_adv)
label_adv = np.argmax(pred_adv, axis=1)[0]
confidence_adv = pred_adv[:, label_adv][0]
print(f'Prediction: {label_to_name(label_adv)} - confidence: {confidence_adv}')
๋์ผ๋ก ๋ดค์ ๋๋ ๊ทธ๋ฅ ์ฝ์๋ผ ์ฌ์ง์ด์ง๋ง ๋ชจ๋ธ์ ๋ฎ์ง ์์ confidence๋ฅผ ๊ฐ์ง๊ณ ์กฑ์ ๋น๋ก ๋ถ๋ฅํ๋ค.
2. Targeted Attack
Targeted attack์ ๋ถ๋ฅ๊ธฐ๊ฐ ํน์ ๋ ์ด๋ธ๋ก ์ค๋ถ๋ฅํ๋๋ก ์ํ๋ ๋ ์ด๋ธ์ ์ง์ ํด์ค๋ค. ๋ ์ด๋ธ์ด ๋ชจ๋ 1000๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ ์ค ํ๋๋ฅผ ์ ํํด ๊ณต๊ฒฉ์ ์งํํ๋ค.
# target label = label 84 peacock
target_label = 84
adv.set_params(targeted=True)
# adversarial sample ์์ฑ
x_art_adv = adv.generate(x_art, y=to_categorical([target_label]))
plt.figure(figsize=(8, 8)); plt.imshow(x_art_adv[0]/255); plt.axis('off'); plt.show()
๋ถ๋ฅ๊ธฐ๊ฐ adversarial sample์ ๋ถ๋ฅํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ฉด target label๋ก ์์ธกํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Apply Defences
adversarial example์ด ๋ค์ด์๋ ์ ๋๋ก ๋ถ๋ฅํ ์ ์๋๋ก ํด๋น ๊ณต๊ฒฉ์ ๋ํ ๋ฐฉ์ด๋ฅผ ์ ์ฉํด๋ณด๊ธฐ๋ก ํ๋ค. ์๋ณธ ์ฝ๋์์ ์ฌ์ฉํ ๋ฐฉ์ด ๋ฐฉ์์ 'Spatial Smoothing'์ธ๋ฐ, ์์ง ๋ฐฉ์ด์ ๋ํ ๊ณต๋ถ๋ ๋ฐ๋ก ์ํ๊ธฐ ๋๋ฌธ์ spatial smoothing ๋ฐฉ์์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
โ Spatial Smoothing
โฝ ์ด๋ฏธ์ง ํ๋ก์ธ์ฑ์์ ์ก์(noise)๋ฅผ ์ค์ด๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
โฝ blur๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํจ
โฝ ๊ฐ ํฝ์ ์ smoothํ๊ฒ ๋ง๋๋ ๋ฐ์ ์ฌ์ฉ๋๋ ์์ญ ๋ฒ์์ ๋ฐ๋ผ local smoothing, non-local smoothing์ผ๋ก ๋๋จ
# ๊ฐ ํฝ์
์๋ก sliding-window๋ฅผ ์งํํ๊ธฐ ๋๋ฌธ์ window_size ์ง์ ๊ฐ๋ฅ
ss = SpatialSmoothing(window_size=3)
# ์๋ณธ ์
๋ ฅ๊ณผ adversarial sample์ defences ์ ์ฉ
x_art_def, _ = ss(x_art)
x_art_adv_def, _ = ss(x_art_adv)
# Compute the classifier predictions on the preprocessed inputs:
pred_def = classifier.predict(x_art_def)
label_def = np.argmax(pred_def, axis=1)[0]
confidence_def = pred_def[:, label_def][0]
ss(x_art), ss(x_art_adv)๋ฅผ ํ ๋นํ ๋ ๋ ๋ค ๋ณ์๋ช ์ด ์๋๋ผ _ ํ์๊ฐ ๋ค์ด๊ฐ๋๋ฐ ์ ๋ถ๋ถ์ ์ง์๋ดค๋๋ ๋ฐฐ์ด์ด์๋ ๋ญ ํฌ๊ธฐ๊ฐ ์ ๋ง๋ค๊ณ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๊ฐ์ธ์ ์ธ ์๊ฐ์ธ๋ฐ ๋ค์ชฝ _ ๋ถ๋ถ์ ๋ฑํ ์ญํ ์ด ์๋ ๊ฒ ๊ฐ์ง ์๋ค.
pred_adv_def = classifier.predict(x_art_adv_def)
label_adv_def = np.argmax(pred_adv_def, axis=1)[0]
confidence_adv_def = pred_adv_def[:, label_adv_def][0]
# Print the predictions:
print('Prediction of original sample:', label_to_name(label_def), '- confidence {0:.2f}'.format(confidence_def))
print('Prediction of adversarial sample:', label_to_name(label_adv_def),
'- confidence {0:.2f}'.format(confidence_adv_def))
# Show the preprocessed adversarial sample:
plt.figure(figsize=(8,8)); plt.imshow(x_art_adv_def[0] / 255); plt.axis('off'); plt.show()
์ถ๋ ฅ๋ ์ด๋ฏธ์ง๋ ์๋ณธ ์ฝ์๋ผ ์ฌ์ง๊ณผ ๋น๊ตํ๋ฉด ํ์คํ ๋ธ๋ฌ ํจ๊ณผ๊ฐ ๋ค์ด๊ฐ๊ณ adversarial sample์ ๋ํ ์์ธก ๊ฒฐ๊ณผ๋ original sample๊ณผ ๋์ผํ๋ค. perturbation์ด ์ถ๊ฐ๋ ์ด๋ฏธ์ง์ spatial smoothing๋ฅผ ์ ์ฉํด์ perturbation์ ์์(๋ผ๋ ํํ์ด ๋ง๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง)ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ดํดํ๋ค.
Adaptive Whitebox Attack to Defeat Defences
์ธ์์ ์๋ฒฝํ ๋ฐฉ์ด๋ ์๋ค๊ณ ํ๋ค. ๋ฐฉ์ด๋ฒ์ด ์์ผ๋ฉด ๋ค์ ๊ทธ๊ฑธ ๊นจ๋ ๊ณต๊ฒฉ์ด ์๋ ๋ฒ!
# defences๋ฅผ ํฌํจํ๋ ๋ถ๋ฅ๊ธฐ ์์ฑ
classifier_def = KerasClassifier(preprocessing=preprocessor, preprocessing_defences=[ss], clip_values=(0, 255),
model=model)
์์ชฝ์์ ์ฌ์ฉํ classifier์ ์ด ๋ถ๋ถ์์ ์ฌ์ฉํ๋ classifier์ ์ฐจ์ด์ ์ preprocessing_defences ํ๋ผ๋ฏธํฐ์ ํฌํจ ์ฌ๋ถ์ด๋ค. ๋ถ๋ฅ๊ธฐ์ ์ ์ฉ๋ preprocessing defence(s)๋ฅผ ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
# Create the attacker.
# Note: here we use a larger number of iterations to achieve the same level of confidence in the misclassification
adv_def = ProjectedGradientDescent(classifier_def, targeted=True, max_iter=40, eps_step=1, eps=5)
# Generate the adversarial sample:
x_art_adv_def = adv_def.generate(x_art, y=to_categorical([target_label]))
# Plot the adversarial sample (note: we swap color channels back to RGB order):
plt.figure(figsize=(8,8)); plt.imshow(x_art_adv_def[0] / 255); plt.axis('off'); plt.show()
# And apply the classifier to it:
pred_adv = classifier_def.predict(x_art_adv_def)
label_adv = np.argmax(pred_adv, axis=1)[0]
confidence_adv = pred_adv[:, label_adv][0]
print('Prediction:', label_to_name(label_adv), '- confidence {0:.2f}'.format(confidence_adv))
๊ณต๊ฒฉ์์ adversarial sample ์์ฑ ๋ฐ ์์ธก ์ฝ๋๋ ์ด์ ์ ์ฌ์ฉํ ์ฝ๋์ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
์์ธก ๊ฒฐ๊ณผ๊ฐ ๋ค์ peacock๋ก ๋์จ๋ค.
'๐ฉโ๐ป' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฝ๋ ๋ฆฌ๋ทฐ] ๋ ธ๋ ์ธต ๋ํ ๊ฐ์ฑ ๋ถ๋ฅ ๋ชจ๋ธ ๊ตฌํ (1) : CNN (0) | 2022.12.13 |
---|---|
[ART] attack_adversarial_patch_TensorFlowV2.ipynb ์ฝ๋ ๋ถ์ (0) | 2022.01.19 |
[ART] adversarial_training_mnist.ipynb ์ฝ๋ ๋ถ์ (0) | 2022.01.12 |
[ART] ART for TensorFlow v2 - Callable ์ฝ๋ ๋ถ์ (0) | 2022.01.03 |
[ART] ART for TensorFlow v2 - Keras API ์ฝ๋ ๋ถ์ (0) | 2021.12.31 |