{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Import Packages","metadata":{}},{"cell_type":"code","source":"import math, re, os\nimport tensorflow as tf\nimport numpy as np\nimport pandas as pd\nfrom matplotlib import pyplot as plt\nimport matplotlib.image as mpimg\nfrom tensorflow.keras.callbacks import EarlyStopping,ModelCheckpoint\nfrom cleverhans.tf2.utils import optimize_linear,clip_eta\nfrom sklearn.metrics import f1_score, precision_score, recall_score, confusion_matrix\nprint(\"Tensorflow version \" + tf.__version__)\n\n\nprint(\"REPLICAS: \", strategy.num_replicas_in_sync)\nprint('DEVICES AVAILABLE: {}'.format(strategy.num_replicas_in_sync))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-04T15:57:26.996345Z","iopub.execute_input":"2023-11-04T15:57:26.996638Z","iopub.status.idle":"2023-11-04T15:57:38.727431Z","shell.execute_reply.started":"2023-11-04T15:57:26.996612Z","shell.execute_reply":"2023-11-04T15:57:38.726485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Loading and display data set**","metadata":{}},{"cell_type":"code","source":"mapping = {}\nimages = []\nclasses={}\nindex2label = {}\n\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        \nwith open('/kaggle/input/imagenet-object-localization-challenge/ILSVRC/ImageSets/CLS-LOC/train_cls.txt', 'r') as f:\n    lines = f.readlines()\n    for line in lines:\n        images.append(line.split()[0])\n\n\nbasedir = \"/kaggle/input/imagenet-object-localization-challenge/ILSVRC/Data/CLS-LOC/train/\"\n\nplt.imshow(mpimg.imread(basedir+images[500939]+\".JPEG\"))\nprint(mapping[images[500939].split('/')[0]])\n","metadata":{"execution":{"iopub.status.busy":"2023-11-04T17:41:55.812114Z","iopub.execute_input":"2023-11-04T17:41:55.813005Z","iopub.status.idle":"2023-11-04T17:41:56.992885Z","shell.execute_reply.started":"2023-11-04T17:41:55.81297Z","shell.execute_reply":"2023-11-04T17:41:56.991847Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Loading from directorey","metadata":{}},{"cell_type":"code","source":"data_dir = \"/kaggle/input/imagenet-object-localization-challenge/ILSVRC/Data/CLS-LOC/train\"\n\ntrain_set = tf.keras.utils.image_dataset_from_directory(data_dir,image_size=(224, 224))","metadata":{"execution":{"iopub.status.busy":"2023-11-04T16:00:56.51324Z","iopub.execute_input":"2023-11-04T16:00:56.513657Z","iopub.status.idle":"2023-11-04T16:07:26.654Z","shell.execute_reply.started":"2023-11-04T16:00:56.513625Z","shell.execute_reply":"2023-11-04T16:07:26.652936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Display images from data directory","metadata":{}},{"cell_type":"code","source":"print(train_set)\nimages, labels = next(iter(train_set)) # get one batch\n\nplt.figure(figsize=(10, 10))\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[train_set.class_names[labels[i]]])\n    plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2023-11-04T16:08:57.561231Z","iopub.execute_input":"2023-11-04T16:08:57.561611Z","iopub.status.idle":"2023-11-04T16:08:59.908184Z","shell.execute_reply.started":"2023-11-04T16:08:57.561582Z","shell.execute_reply":"2023-11-04T16:08:59.907272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Extract Labels validation Data ","metadata":{}},{"cell_type":"code","source":"val_labels = pd.read_csv('/kaggle/input/imagenet-object-localization-challenge/LOC_val_solution.csv')\n\nval_labels = val_labels.sort_values(by=[\"ImageId\"])\n\nval_labels['PredictionString'] = val_labels['PredictionString'].apply(lambda x : x.split(' ')[0])\n\nval_labels_list = val_labels['PredictionString'].to_numpy()\nprint(val_labels.head())\nprint(val_labels_list[:10])\nval_Set_labels=[classes[x] for x in val_labels_list]\nprint(val_Set_labels[:10])\n\nplt.imshow(mpimg.imread(val_dir+ '/' + 'ILSVRC2012_val_00000001'+\".JPEG\"))\nprint(mapping[val_labels_list[0]])\n\n","metadata":{"execution":{"iopub.status.busy":"2023-11-04T17:31:50.923757Z","iopub.execute_input":"2023-11-04T17:31:50.924709Z","iopub.status.idle":"2023-11-04T17:31:51.53862Z","shell.execute_reply.started":"2023-11-04T17:31:50.924674Z","shell.execute_reply":"2023-11-04T17:31:51.537637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load Validation Data","metadata":{}},{"cell_type":"code","source":"val_dir = \"/kaggle/input/imagenet-object-localization-challenge/ILSVRC/Data/CLS-LOC/val\"\nval_set = tf.keras.utils.image_dataset_from_directory(val_dir,image_size=(224, 224), labels = val_Set_labels)","metadata":{"execution":{"iopub.status.busy":"2023-11-04T17:32:52.896842Z","iopub.execute_input":"2023-11-04T17:32:52.897214Z","iopub.status.idle":"2023-11-04T17:34:28.436046Z","shell.execute_reply.started":"2023-11-04T17:32:52.897173Z","shell.execute_reply":"2023-11-04T17:34:28.435196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Display validation Data","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(10, 10))\nfor vald_images, vald_labels in val_set.take(1):\n    for i in range(9):\n        ax = plt.subplot(3, 3, i + 1)\n        plt.imshow(vald_images[i].numpy().astype(\"uint8\"))\n        plt.title(mapping[index2label[val_set.class_names[vald_labels[i]]]])\n        plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2023-11-04T17:49:01.012767Z","iopub.execute_input":"2023-11-04T17:49:01.013437Z","iopub.status.idle":"2023-11-04T17:49:02.604989Z","shell.execute_reply.started":"2023-11-04T17:49:01.013402Z","shell.execute_reply":"2023-11-04T17:49:02.603996Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Preprocessing Data with densenet preprocessing","metadata":{}},{"cell_type":"code","source":"train_set_preprocessed = train_set.map(lambda x, y : (tf.keras.applications.densenet.preprocess_input(x), y) )\nval_set_preprocessed = val_set.map(lambda x, y : (tf.keras.applications.densenet.preprocess_input(x), y) )\nimages_preprocesed = tf.keras.applications.densenet.preprocess_input(images)","metadata":{"execution":{"iopub.status.busy":"2023-11-04T18:00:02.995024Z","iopub.execute_input":"2023-11-04T18:00:02.995426Z","iopub.status.idle":"2023-11-04T18:00:03.045161Z","shell.execute_reply.started":"2023-11-04T18:00:02.995394Z","shell.execute_reply":"2023-11-04T18:00:03.04442Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Display preprocessed images","metadata":{}},{"cell_type":"code","source":"for i in range(9):\n    ax = plt.subplot(3, 3, i + 1)\n    plt.imshow((images_preprocesed[i].numpy() + 1) / 2)\n    plt.title(mapping[train_set.class_names[labels[i]]])\n    plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2023-11-04T16:11:35.966547Z","iopub.execute_input":"2023-11-04T16:11:35.966958Z","iopub.status.idle":"2023-11-04T16:11:36.800167Z","shell.execute_reply.started":"2023-11-04T16:11:35.966927Z","shell.execute_reply":"2023-11-04T16:11:36.799266Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Define Adversarial training method","metadata":{}},{"cell_type":"code","source":"class CustomModel(tf.keras.Model):\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            for metric in self.metrics:\n                if metric.name == \"loss\":\n                    metric.update_state(loss)\n                else:\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","metadata":{"execution":{"iopub.status.busy":"2023-11-04T16:12:32.696024Z","iopub.execute_input":"2023-11-04T16:12:32.696414Z","iopub.status.idle":"2023-11-04T16:12:32.761568Z","shell.execute_reply.started":"2023-11-04T16:12:32.696384Z","shell.execute_reply":"2023-11-04T16:12:32.760742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create Adversarial trainable model","metadata":{}},{"cell_type":"code","source":"densenet=tf.keras.applications.densenet.DenseNet121(\ninclude_top=True,\nweights=None,\ninput_shape=(224,224 ,3),\nclassifier_activation='softmax',\nclasses=1000\n)\nmodel = CustomModel(inputs=densenet.input,outputs=densenet.output)\n\nmodel.compile(optimizer=\"adam\", loss=\"sparse_categorical_crossentropy\", metrics=[\"mae\", \"sparse_categorical_accuracy\"])\n","metadata":{"execution":{"iopub.status.busy":"2023-11-04T17:53:25.888259Z","iopub.execute_input":"2023-11-04T17:53:25.888904Z","iopub.status.idle":"2023-11-04T17:53:28.449727Z","shell.execute_reply.started":"2023-11-04T17:53:25.888874Z","shell.execute_reply":"2023-11-04T17:53:28.448691Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training step","metadata":{}},{"cell_type":"code","source":"cb = [EarlyStopping(patience=7, monitor='sparse_categorical_accuracy', mode='max' ,restore_best_weights=True,min_delta = 0.01),\n      ModelCheckpoint(\"/kaggle/working/adv_densenet\",save_best_only=True)]\n\nhistory =  model.fit(train_set_preprocessed, validation_data = val_set_preprocessed, callbacks=cb)\n","metadata":{"execution":{"iopub.status.busy":"2023-11-04T18:11:28.803842Z","iopub.execute_input":"2023-11-04T18:11:28.804536Z","iopub.status.idle":"2023-11-04T18:12:37.472768Z","shell.execute_reply.started":"2023-11-04T18:11:28.804503Z","shell.execute_reply":"2023-11-04T18:12:37.471435Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Evalutaion step","metadata":{}},{"cell_type":"code","source":"model.evaluate(images_preprocesed,labels)","metadata":{"execution":{"iopub.status.busy":"2023-11-04T18:15:36.986969Z","iopub.execute_input":"2023-11-04T18:15:36.987706Z","iopub.status.idle":"2023-11-04T18:15:37.127224Z","shell.execute_reply.started":"2023-11-04T18:15:36.987674Z","shell.execute_reply":"2023-11-04T18:15:37.126247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate(val_set_preprocessed)","metadata":{"execution":{"iopub.status.busy":"2023-11-04T18:16:53.395722Z","iopub.execute_input":"2023-11-04T18:16:53.396094Z","iopub.status.idle":"2023-11-04T18:20:26.954756Z","shell.execute_reply.started":"2023-11-04T18:16:53.396065Z","shell.execute_reply":"2023-11-04T18:20:26.953905Z"},"trusted":true},"execution_count":null,"outputs":[]}]}