{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":6799,"databundleVersionId":4225553,"sourceType":"competition"},{"sourceId":6893338,"sourceType":"datasetVersion","datasetId":3959984},{"sourceId":7261882,"sourceType":"datasetVersion","datasetId":4208725},{"sourceId":7262351,"sourceType":"datasetVersion","datasetId":4209042},{"sourceId":7268654,"sourceType":"datasetVersion","datasetId":4213482},{"sourceId":7291890,"sourceType":"datasetVersion","datasetId":4229174}],"dockerImageVersionId":30559,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"#!pip install cleverhans\nimport math, re, os\nimport tensorflow as tf\nimport numpy as np\nimport pandas as pd\nfrom matplotlib import pyplot as plt\nfrom kaggle_datasets import KaggleDatasets\nfrom sklearn.metrics import f1_score, precision_score, recall_score, confusion_matrix\nfrom cleverhans.tf2.utils import optimize_linear,clip_eta\nfrom cleverhans.tf2.attacks.projected_gradient_descent import projected_gradient_descent\nfrom tqdm import tqdm\n\n# # detect and init the TPU\n# resolver = tf.distribute.cluster_resolver.TPUClusterResolver()\n# tf.config.experimental_connect_to_cluster(resolver)\n# tf.tpu.experimental.initialize_tpu_system(resolver)\n\n\n# # instantiate a distribution strategy\n# tpu_strategy = tf.distribute.TPUStrategy(resolver)\n\n# print(\"Tensorflow version \" + tf.__version__)\n\n\n# print(\"REPLICAS: \", tpu_strategy.num_replicas_in_sync)\n# print('DEVICES AVAILABLE: {}'.format(tpu_strategy.num_replicas_in_sync))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-12-27T17:19:46.652216Z","iopub.execute_input":"2023-12-27T17:19:46.652864Z","iopub.status.idle":"2023-12-27T17:19:46.659337Z","shell.execute_reply.started":"2023-12-27T17:19:46.652828Z","shell.execute_reply":"2023-12-27T17:19:46.658337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create Original Model (densenet121) with default weights","metadata":{}},{"cell_type":"code","source":"base = \"/kaggle/input/imagenet-object-localization-challenge/ILSVRC/Data/CLS-LOC/train/n01440764\"\n\n\nbase_model = tf.keras.applications.densenet.DenseNet121(\n    include_top=True,\n    weights='imagenet',\n    classifier_activation='softmax'\n)\n\nbase_model.compile(optimizer = 'adam',loss='sparse_categorical_crossentropy',metrics=['sparse_categorical_accuracy'])\n\n#train_set = tf.keras.utils.image_dataset_from_directory(base,image_size=(224, 224),labels = None)\n\n","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:19:46.660875Z","iopub.execute_input":"2023-12-27T17:19:46.661199Z","iopub.status.idle":"2023-12-27T17:19:51.393635Z","shell.execute_reply.started":"2023-12-27T17:19:46.661167Z","shell.execute_reply":"2023-12-27T17:19:51.392634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Extract Labels Evaluation Data","metadata":{}},{"cell_type":"code","source":"mapping = {}\nimages = []\nclasses={}\nindex2label = {}\nwith open('/kaggle/input/imagenet-object-localization-challenge/LOC_synset_mapping.txt', 'r') as f:\n    lines = f.readlines()\n    for index,line in enumerate(lines):\n        mapping[line.split()[0]] = ' '.join(line.split(',')[0].split()[1:])\n        classes[line.split()[0]]=index\n        index2label[index] = line.split()[0]\n\neval_labels = pd.read_csv('/kaggle/input/imagenet-object-localization-challenge/LOC_val_solution.csv')\n\neval_labels = eval_labels.sort_values(by=[\"ImageId\"])\n\neval_labels['PredictionString'] = eval_labels['PredictionString'].apply(lambda x : x.split(' ')[0])\n\neval_labels_list = eval_labels['PredictionString'].to_numpy()\n\neval_Set_labels=[classes[x] for x in eval_labels_list]\n","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:19:51.394834Z","iopub.execute_input":"2023-12-27T17:19:51.395099Z","iopub.status.idle":"2023-12-27T17:19:51.598211Z","shell.execute_reply.started":"2023-12-27T17:19:51.395075Z","shell.execute_reply":"2023-12-27T17:19:51.597412Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load Evaluation Data","metadata":{}},{"cell_type":"code","source":"eval_dir = \"/kaggle/input/imagenet-object-localization-challenge/ILSVRC/Data/CLS-LOC/val\"\neval_set = tf.keras.utils.image_dataset_from_directory(eval_dir,image_size=(224, 224), labels = eval_Set_labels)","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:19:51.600189Z","iopub.execute_input":"2023-12-27T17:19:51.600474Z","iopub.status.idle":"2023-12-27T17:21:18.205352Z","shell.execute_reply.started":"2023-12-27T17:19:51.600448Z","shell.execute_reply":"2023-12-27T17:21:18.204497Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"eval_set_preprocessed = eval_set.map(lambda x, y : (tf.keras.applications.densenet.preprocess_input(x), y) )","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:21:18.206491Z","iopub.execute_input":"2023-12-27T17:21:18.206794Z","iopub.status.idle":"2023-12-27T17:21:18.244853Z","shell.execute_reply.started":"2023-12-27T17:21:18.206767Z","shell.execute_reply":"2023-12-27T17:21:18.243885Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Our Model","metadata":{}},{"cell_type":"code","source":"class CustomModel(tf.keras.Model):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.loss_tracker = tf.keras.metrics.SparseCategoricalCrossentropy(name=\"loss\")\n#         self.mae_metric = tf.keras.metrics.MeanAbsoluteError(name=\"mae\")\n        self.sparscat_metric=tf.keras.metrics.SparseCategoricalAccuracy(name='sparse_categorical_accuracy')\n    \n    def train_step(self, data):\n        # Unpack the data. Its structure depends on your model and\n        # on what you pass to `fit()`.\n        x, y = data\n        print('.')\n        true_x=x\n        eps=0.3\n        rand_minmax = eps\n        norm=np.inf\n        nb_iter=5\n        eps_iter=0.08\n        eta = tf.zeros_like(x)\n\n        # Clip eta\n        eta = clip_eta(eta, norm, eps)\n        x = true_x + eta\n\n        i = 0\n        result={}\n\n        while i < nb_iter:\n            with tf.GradientTape(persistent=True) as tape:\n                tape.watch(x)\n                predictions = self(x,training=True)\n                loss=self.compute_loss(y=y,y_pred=predictions)\n\n            gradients = tape.gradient(loss, self.trainable_variables)\n            adv_grad = tape.gradient(loss, x)\n            del tape\n            self.optimizer.apply_gradients(zip(gradients, self.trainable_variables))\n            print(y)\n            for metric in self.metrics:\n                metric.update_state(y, predictions)\n            # Return a dict mapping metric names to current value\n            result= {m.name: m.result() for m in self.metrics}\n\n            x = self.fast_gradient_method(\n                grad=adv_grad,\n                x=x,\n                eps=eps_iter,\n                norm=norm,\n                y=y\n            )\n\n            # Clipping perturbation eta to norm norm ball\n            eta = x - true_x\n            eta = clip_eta(eta, norm, eps)\n            x = true_x + eta\n\n\n            i += 1\n        return result\n\n    def fast_gradient_method(self, grad, x, eps, norm, y,):\n        # cast to tensor if provided as numpy array\n        x = tf.cast(x, tf.float32)\n\n        optimal_perturbation = optimize_linear(grad, eps, norm)\n        # Add perturbation to original example to obtain adversarial example\n        adv_x = x + optimal_perturbation\n\n        return adv_x\n    @property\n    def metrics(self):\n        # We list our `Metric` objects here so that `reset_states()` can be\n        # called automatically at the start of each epoch\n        # or at the start of `evaluate()`.\n        # If you don't implement this property, you have to call\n        # `reset_states()` yourself at the time of your choosing.\n        return [ self.loss_tracker,self.sparscat_metric]\n    def test_step(self, data):\n        # Unpack the data\n        x, y = data\n        # Compute predictions\n        y_pred = self(x, training=False)\n        # Updates the metrics tracking the loss\n        self.compute_loss(y=y, y_pred=y_pred)\n        # Update the metrics.\n        for metric in self.metrics:\n                metric.update_state(y, y_pred)\n        # Return a dict mapping metric names to current value.\n        # Note that it will include the loss (tracked in self.metrics).\n        return {m.name: m.result() for m in self.metrics}","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:21:18.24643Z","iopub.execute_input":"2023-12-27T17:21:18.246731Z","iopub.status.idle":"2023-12-27T17:21:18.262052Z","shell.execute_reply.started":"2023-12-27T17:21:18.246705Z","shell.execute_reply":"2023-12-27T17:21:18.260977Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#newmodel = tf.keras.saving.load_model(\"/kaggle/input/adv-densenet121\")\n#newmodel.evaluate(eval_set_preprocessed)\n#newmodel.save_weights(\"/kaggle/working/\")\ndensenet=tf.keras.applications.densenet.DenseNet121(\n    include_top=True,\n    weights=None,\n    input_shape=(224,224 ,3),\n    classifier_activation='softmax',\n    classes=1000\n    )\n\nnewmodel = CustomModel(inputs=densenet.input,outputs=densenet.output)\n\nnewmodel.compile(optimizer=\"adam\",loss = \"sparse_categorical_crossentropy\")\n\nnewmodel.load_weights(\"/kaggle/input/densenet121-semidone/densenet121/adv_densenet\")","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:24:37.661375Z","iopub.execute_input":"2023-12-27T17:24:37.661834Z","iopub.status.idle":"2023-12-27T17:24:45.554692Z","shell.execute_reply.started":"2023-12-27T17:24:37.661796Z","shell.execute_reply":"2023-12-27T17:24:45.553764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Display images before attack","metadata":{}},{"cell_type":"code","source":"images,labels = next(iter(eval_set))\nimages_pre = tf.keras.applications.densenet.preprocess_input(images)","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:24:45.556478Z","iopub.execute_input":"2023-12-27T17:24:45.556775Z","iopub.status.idle":"2023-12-27T17:24:46.418866Z","shell.execute_reply.started":"2023-12-27T17:24:45.55675Z","shell.execute_reply":"2023-12-27T17:24:46.418069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(9):\n    ax = plt.subplot(3, 3, i + 1)\n    plt.imshow(images[i].numpy().astype(\"uint8\"))\n    plt.title(mapping[index2label[eval_set.class_names[labels[i]]]])\n    plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:24:46.419917Z","iopub.execute_input":"2023-12-27T17:24:46.420199Z","iopub.status.idle":"2023-12-27T17:24:47.425978Z","shell.execute_reply.started":"2023-12-27T17:24:46.420173Z","shell.execute_reply":"2023-12-27T17:24:47.425063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = base_model.predict(images_pre)\n#names = [i[0][1] for i in tf.keras.applications.densenet.decode_predictions(predictions,top=1)]\n#print(names)\nfor i in range(9):\n    ax = plt.subplot(3, 3, i + 1)\n    plt.imshow((images[i].numpy().astype('uint8')))\n    plt.title(mapping[index2label[eval_set.class_names[np.argmax(predictions[i])]]])\n    #plt.title(names[i])\n    plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:24:55.225722Z","iopub.execute_input":"2023-12-27T17:24:55.226093Z","iopub.status.idle":"2023-12-27T17:25:00.758324Z","shell.execute_reply.started":"2023-12-27T17:24:55.226063Z","shell.execute_reply":"2023-12-27T17:25:00.757427Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create adversarial images using PGD-20","metadata":{}},{"cell_type":"code","source":"adv_images = projected_gradient_descent(base_model,images,0.3,0.02,20,np.inf)\n","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:25:00.760072Z","iopub.execute_input":"2023-12-27T17:25:00.760716Z","iopub.status.idle":"2023-12-27T17:25:09.562626Z","shell.execute_reply.started":"2023-12-27T17:25:00.76068Z","shell.execute_reply":"2023-12-27T17:25:09.56157Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Display images after attack","metadata":{}},{"cell_type":"code","source":"for i in range(9):\n    ax = plt.subplot(3, 3, i + 1)\n    plt.imshow((adv_images[i].numpy().astype('uint8')))\n    plt.title(mapping[index2label[eval_set.class_names[labels[i]]]])\n    plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:25:09.56488Z","iopub.execute_input":"2023-12-27T17:25:09.565625Z","iopub.status.idle":"2023-12-27T17:25:10.372151Z","shell.execute_reply.started":"2023-12-27T17:25:09.565569Z","shell.execute_reply":"2023-12-27T17:25:10.371245Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = base_model.predict(adv_images)\nnames = [i[0][1] for i in tf.keras.applications.densenet.decode_predictions(predictions,top=1)]\n#print(names)\nfor i in range(9):\n    ax = plt.subplot(3, 3, i + 1)\n    plt.imshow((adv_images[i].numpy().astype('uint8')))\n    plt.title(names[i])\n    plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:25:10.373654Z","iopub.execute_input":"2023-12-27T17:25:10.373923Z","iopub.status.idle":"2023-12-27T17:25:11.291048Z","shell.execute_reply.started":"2023-12-27T17:25:10.3739Z","shell.execute_reply":"2023-12-27T17:25:11.289902Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Original Model","metadata":{}},{"cell_type":"code","source":"extractedx = []\nextractedx_clean = []\nclean_set = []\nextractedy = []\nlabels = []\neps = 0.015\neps_iter = 0.0008\n\n#print(type(tf.convert_to_tensor(extractedx)))        \nadv_set = [] \ncnt = 0\n\nfor batch, label in eval_set_preprocessed:\n    clean_set.append(batch)\n    labels.append(label)\n    adv_set.append(projected_gradient_descent(base_model,batch,eps,eps_iter,20,np.inf,y=label))\n    for i in label:\n        extractedy.append(i)\n    cnt += 1\n    if cnt == 50:\n        break\n        ","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:25:11.293307Z","iopub.execute_input":"2023-12-27T17:25:11.293716Z","iopub.status.idle":"2023-12-27T17:27:55.241013Z","shell.execute_reply.started":"2023-12-27T17:25:11.29368Z","shell.execute_reply":"2023-12-27T17:27:55.239767Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for batch in adv_set:\n    for i in batch:\n        extractedx.append(i)\n\nfor batch in clean_set:\n    for i in batch:\n        extractedx_clean.append(i)\n\nextractedy = tf.convert_to_tensor(extractedy)\nextractedx = tf.convert_to_tensor(extractedx)    \nextractedx_clean = tf.convert_to_tensor(extractedx_clean)\n\nbase_model.evaluate(extractedx, extractedy)\nbase_model.evaluate(extractedx_clean, extractedy)","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:27:55.243006Z","iopub.execute_input":"2023-12-27T17:27:55.243308Z","iopub.status.idle":"2023-12-27T17:28:07.114487Z","shell.execute_reply.started":"2023-12-27T17:27:55.243281Z","shell.execute_reply":"2023-12-27T17:28:07.113661Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Our Model ","metadata":{}},{"cell_type":"code","source":"extractedx2 = []\nextractedy2 = []\nextractedx2_clean = []\nclean_set2 = []\n\n#print(type(tf.convert_to_tensor(extractedx)))        \nadv_set2 = [] \n\ncnt = 0\n\nfor batch , label in zip(clean_set, labels) :\n    adv_set2.append(projected_gradient_descent(newmodel,batch,eps,eps_iter,20,np.inf,y=label)) \n    cnt += 1\n    if cnt == 50:\n        break","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:28:07.115563Z","iopub.execute_input":"2023-12-27T17:28:07.115884Z","iopub.status.idle":"2023-12-27T17:30:49.093004Z","shell.execute_reply.started":"2023-12-27T17:28:07.115858Z","shell.execute_reply":"2023-12-27T17:30:49.092115Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for batch in adv_set2:\n    for i in batch:\n        extractedx2.append(i)\n\nextractedx2 = tf.convert_to_tensor(extractedx2)\n\nnewmodel.evaluate(extractedx2, extractedy)\nnewmodel.evaluate(extractedx_clean, extractedy)","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:30:49.094771Z","iopub.execute_input":"2023-12-27T17:30:49.095083Z","iopub.status.idle":"2023-12-27T17:30:57.825515Z","shell.execute_reply.started":"2023-12-27T17:30:49.095057Z","shell.execute_reply":"2023-12-27T17:30:57.824584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from sklearn.metrics import confusion_matrix,classification_report\n# !pip install seaborn\n# import seaborn as sns\n\n# predictions = newmodel.predict(extractedx2)\n# classpreds = [np.argmax(t) for t in predictions]\n\n# cm = confusion_matrix(extractedy2, classpreds)\n# plt.figure(figsize=(8, 6), dpi=80, facecolor='w', edgecolor='k')\n# ax = sns.heatmap(cm, cmap='Blues', annot=True, fmt='d')\n# plt.title('')\n# plt.xlabel('Prediction')\n# plt.ylabel('Truth')\n# plt.show(ax)","metadata":{"execution":{"iopub.status.busy":"2023-12-27T17:21:21.509651Z","iopub.status.idle":"2023-12-27T17:21:21.51009Z","shell.execute_reply.started":"2023-12-27T17:21:21.509867Z","shell.execute_reply":"2023-12-27T17:21:21.509888Z"},"trusted":true},"execution_count":null,"outputs":[]}]}