{"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"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":6799532,"sourceType":"datasetVersion","datasetId":3912002},{"sourceId":6800046,"sourceType":"datasetVersion","datasetId":3912363},{"sourceId":6819070,"sourceType":"datasetVersion","datasetId":3915539},{"sourceId":6765257,"sourceType":"datasetVersion","datasetId":3893547},{"sourceId":8043260,"sourceType":"datasetVersion","datasetId":4742346}],"dockerImageVersionId":30559,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy\nimport numpy as np\nimport random\nimport os\nimport matplotlib as mpl\nimport matplotlib.pyplot as plt\nimport matplotlib.colors as colors\nfrom keras.layers import Activation\nimport tensorflow as tf\nimport cv2\nfrom tensorflow.keras.layers import Lambda, Layer, ReLU\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, LSTM, SpatialDropout2D, Concatenate\ntf.keras.layers.Concatenate()\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, AveragePooling2D, GlobalAveragePooling2D, UpSampling2D, BatchNormalization\n# from keras.layers.core import Reshape\nfrom keras import optimizers\nfrom tensorflow.keras import regularizers\nfrom keras import Input, Model\nfrom time import time\nimport time as tm\nfrom keras.initializers import Constant, RandomNormal, glorot_normal\nfrom tensorflow.keras.models import load_model\nfrom tensorflow.keras.regularizers import l2\nfrom keras import backend as K\nfrom tensorflow.keras.utils import plot_model\nfrom keras.layers import  concatenate\nfrom tensorflow.keras.optimizers import SGD","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-26T09:36:17.077319Z","iopub.execute_input":"2023-10-26T09:36:17.077870Z","iopub.status.idle":"2023-10-26T09:36:25.752000Z","shell.execute_reply.started":"2023-10-26T09:36:17.077843Z","shell.execute_reply":"2023-10-26T09:36:25.751161Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## SR-Net","metadata":{}},{"cell_type":"code","source":"def conv_layer(input_tensor, num_filters, kernel_size, strides, padding='same'):\n    \n    # He initializer\n#     filter_initializer = tf.keras.initializers.HeNormal()\n    filter_initializer = tf.keras.initializers.variance_scaling()\n\n    # Bias initializer\n    bias_initializer = tf.keras.initializers.Constant(value=0.2)\n\n    # L2 regularization for the filters\n    filter_regularizer = tf.keras.regularizers.L2(l2=2e-4)\n    \n    x = tf.keras.layers.Conv2D(num_filters,\n                  kernel_size=kernel_size,\n                  strides=strides,\n                  padding=padding,\n                  kernel_initializer=filter_initializer,\n                  bias_initializer=bias_initializer,\n                  kernel_regularizer=filter_regularizer,\n                  use_bias=True)(input_tensor)\n    \n    return x","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def layer_T1(input_tensor, num_filters):\n    # Convolutional layer\n\n    x = conv_layer(input_tensor, \n                   num_filters=num_filters, \n                   kernel_size=(3, 3), \n                   strides=1)\n    \n    # Batch normalization layer\n    x = tf.keras.layers.BatchNormalization(momentum=0.9)(x)\n\n    # ReLU activation layer\n    x = tf.keras.layers.ReLU()(x)\n    \n    return x","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def layer_T2(input_tensor, num_filters):\n    # Add the layer T1 to the beginning of Layer T2\n    x = layer_T1(input_tensor, num_filters)\n    \n    # Convolutional layer\n    x = conv_layer(x, \n                   num_filters=num_filters, \n                   kernel_size=(3, 3), \n                   strides=1)\n    \n    # Batch normalization layer\n    x = tf.keras.layers.BatchNormalization(momentum=0.9)(x)\n    \n    # Create the residual connection\n    x = tf.keras.layers.add([input_tensor, x]) \n    \n    return x","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def layer_T3(input_tensor, num_filters):\n    # MAIN BRANCH\n    # Add the layer T1 to the beginning of Layer T2\n    x = layer_T1(input_tensor, num_filters)\n    \n    # Convolutional layer\n    x = conv_layer(x, \n                   num_filters=num_filters, \n                   kernel_size=(3, 3), \n                   strides=1)\n    \n    # Batch normalization layer\n    x = tf.keras.layers.BatchNormalization(momentum=0.9)(x)\n    \n    # Average pooling layer\n    x = tf.keras.layers.AveragePooling2D(pool_size=(3, 3), \n                                strides=2,\n                                padding='same')(x)\n    \n    # SECONDARY BRANCH\n    # Special convolutional layer. \n    y = conv_layer(input_tensor, \n                   num_filters=num_filters, \n                   kernel_size=(1, 1), \n                   strides=2)\n    \n    # Batch normalization layer\n    y = tf.keras.layers.BatchNormalization(momentum=0.9)(y)\n    \n    # Create the residual connection\n    output = tf.keras.layers.add([x, y]) \n    \n    return output","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def layer_T4(input_tensor, num_filters):\n    # Add the layer T1 to the beginning of Layer T2\n    x = layer_T1(input_tensor, num_filters)\n    \n    # Convolutional layer\n    x = conv_layer(x, \n                   num_filters=num_filters, \n                   kernel_size=(3, 3), \n                   strides=1)\n    \n    # Batch normalization layer\n    x = tf.keras.layers.BatchNormalization(momentum=0.9)(x)\n    \n    # Global Average Pooling layer\n    x = tf.keras.layers.GlobalAveragePooling2D()(x)\n    \n    return x","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def fully_connected(input_tensor):\n    \n    # Dense weight initializer N(0, 0.01)\n    dense_initializer = tf.random_normal_initializer(0, 0.01)\n    \n    # Bias initializer for the fully connected network\n    bias_dense_initializer = tf.constant_initializer(0.)\n    \n    x = tf.keras.layers.Flatten()(input_tensor)\n    x = tf.keras.layers.Dense(512, \n                     activation=None,\n                     use_bias=False,\n                     kernel_initializer=dense_initializer,\n                     bias_initializer=bias_dense_initializer)(x)\n\n        \n    output = tf.keras.layers.Dense(2, activation='softmax')(x)\n    \n    return output","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def SRnet_estretegia_final_paper():\n    # The input layer has the shape (256, 256, 3)\n    #input_layer = layers.Input(shape=input_image_size)\n    input_image_size = (256, 256, 3)\n    # The input layer has the shape (256, 256, 3)\n    input_layer = tf.keras.layers.Input(shape=input_image_size)\n    \n    x = layer_T1(input_layer, 64)\n    x = layer_T1(x, 16)\n    \n    x = layer_T2(x, 16)\n    x = layer_T2(x, 16)\n    x = layer_T2(x, 16)\n    x = layer_T2(x, 16)\n    x = layer_T2(x, 16)\n    \n    x = layer_T3(x, 16)\n    x = layer_T3(x, 64)\n    x = layer_T3(x, 128)\n    x = layer_T3(x, 256)\n    \n    x = layer_T4(x, 512)\n    \n    output = fully_connected(x)\n    sgd = SGD(lr=0.01, weight_decay=1e-6, momentum=0.9, nesterov=True)\n    #optimizers.Adamax(learning_rate=0.001)\n    model = Model(inputs=input_layer, outputs=output, name=\"SRNet\")\n\n    model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=False),\n              optimizer=sgd,\n              metrics=['accuracy'])\n    \n    return model\n","metadata":{"execution":{"iopub.status.busy":"2023-10-26T09:37:42.644326Z","iopub.execute_input":"2023-10-26T09:37:42.645021Z","iopub.status.idle":"2023-10-26T09:37:42.652770Z","shell.execute_reply.started":"2023-10-26T09:37:42.644989Z","shell.execute_reply":"2023-10-26T09:37:42.651794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train(model, X_train, y_train, X_valid, y_valid, X_test, y_test, batch_size, epochs, initial_epoch = 0, model_name=\"\"):\n    start_time = tm.time()\n    log_dir=\"logs/\"+model_name+\"_\"+\"{}\".format(time())\n    tensorboard = tf.keras.callbacks.TensorBoard(log_dir)\n    filepath = log_dir+\"/saved-model-{epoch:02d}-{val_accuracy:.2f}.hdf5\"\n    \n    # Callback to stop the algorithm when it doesn't improve.\n    early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_accuracy', \n                                        min_delta=0, \n                                        patience=100, \n                                        verbose=0, \n                                        mode='max', \n                                        baseline=None, \n                                        restore_best_weights=True)\n\n    # Callback to continuously save the best model after every epoch.\n    checkpoint = tf.keras.callbacks.ModelCheckpoint(filepath, monitor='val_accuracy', verbose=0,save_best_only=False,save_weights_only=False,mode='max', save_freq='epoch')\n    \n    # Callback to change the learning rate after 150 epochs\n    def lr_schedule(epoch):\n        if epoch <= 149:\n            return 0.001\n        else:\n            return 0.0001\n\n    learning_rate_scheduler = tf.keras.callbacks.LearningRateScheduler(lr_schedule, verbose=0)\n    \n    model.reset_states()\n    history=model.fit(X_train, y_train, epochs=epochs, \n                        callbacks=[tensorboard,early_stopping, checkpoint], \n                        batch_size=batch_size,validation_data=(X_valid, y_valid),initial_epoch=initial_epoch)\n    \n    metrics = model.evaluate(X_test, y_test, verbose=0)\n    results_dir=\"Results/\"+model_name+\"/\"\n    if not os.path.exists(results_dir):\n        os.makedirs(results_dir)\n      \n    with plt.style.context('seaborn-white'):\n        plt.figure(figsize=(10, 10))\n        #plt.subplot(1,2,1)\n        #Plot training & validation accuracy values\n        plt.plot(history.history['accuracy'])\n        plt.plot(history.history['val_accuracy'])\n        plt.title('Accuracy Vs Epochs')\n        plt.ylabel('Accuracy')\n        plt.xlabel('Epoch')\n        plt.legend(['Train', 'Validation'], loc='upper left')\n        plt.grid('on')\n        plt.savefig(results_dir+'Accuracy_SR_Net_'+model_name+'.eps', format='eps')\n        plt.savefig(results_dir+'Accuracy_SR_Net_'+model_name+'.svg', format='svg')\n        plt.savefig(results_dir+'Accuracy_SR_Net_'+model_name+'.pdf', format='pdf')\n        plt.show()\n        \n        plt.figure(figsize=(10, 10))\n        #plt.subplot(1,2,2)\n        #Plot training & validation loss values\n        plt.plot(history.history['loss'])\n        plt.plot(history.history['val_loss'])\n        plt.title('Loss Vs Epochs')\n        plt.ylabel('Loss')\n        plt.xlabel('Epoch')\n        plt.legend(['Train', 'Validation'], loc='upper left')\n        plt.grid('on')\n        plt.savefig(results_dir+'Loss_SR_Net_'+model_name+'.eps', format='eps')\n        plt.savefig(results_dir+'Loss_SR_Net_'+model_name+'.svg', format='svg')\n        plt.savefig(results_dir+'Loss_SR_Net_'+model_name+'.pdf', format='pdf')\n        plt.show()\n\n        '''\n        plt.figure(figsize=(10, 10))\n        #plt.subplot(1,2,2)\n        #Plot training & validation loss values\n        plt.plot(history.history['lr'])\n        plt.ylabel('Lr')\n        plt.xlabel('Epoch')\n        plt.grid('on')\n        plt.show()\n        '''\n    TIME = tm.time() - start_time\n    print(\"Time \"+model_name+\" = %s [seconds]\" % TIME)\n    return {k:v for k,v in zip (model.metrics_names, metrics)}","metadata":{"execution":{"iopub.status.busy":"2023-10-26T09:44:21.939028Z","iopub.execute_input":"2023-10-26T09:44:21.939907Z","iopub.status.idle":"2023-10-26T09:44:21.954763Z","shell.execute_reply.started":"2023-10-26T09:44:21.939872Z","shell.execute_reply":"2023-10-26T09:44:21.953863Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def Final_Results_Test(model,PATH_trained_models):\n    B_accuracy = 0 #B --> Best\n    for filename in os.listdir(PATH_trained_models):\n        if filename != ('train') and filename != ('validation'):\n            print(filename)\n            model.load_weights(PATH_trained_models+'/'+filename)\n            loss,accuracy = model.evaluate(X_test, y_test,verbose=0)\n            print(f'Loss={loss:.4f} y Accuracy={accuracy:0.4f}'+'\\n') \n            if accuracy > B_accuracy:\n                B_accuracy = accuracy\n                B_loss = loss\n                B_name = filename\n    print(\"\\n\\nBest\")\n    print(B_name)\n    print(f'Loss={B_loss:.4f} y Accuracy={B_accuracy:0.4f}'+'\\n')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\ndef plot_train_valid(model,PATH_trained_models,model_name):\n    acc_train=[]\n    acc_valid=[]\n    loss_train=[]\n    loss_valid=[]\n    for filename in tqdm(os.listdir(PATH_trained_models)):\n        if filename != ('train') and filename != ('validation'):\n            print(filename)\n            model.load_weights(PATH_trained_models+'/'+filename)\n            loss,accuracy = model.evaluate(X_train, y_train,verbose=0)\n            acc_train.append(accuracy)\n            loss_train.append(loss)\n            loss,accuracy = model.evaluate(X_valid, y_valid,verbose=0)\n            acc_valid.append(accuracy)\n            loss_valid.append(loss)\n\n    results_dir=\"Results/\"+model_name+\"/\"\n    if not os.path.exists(results_dir):\n        os.makedirs(results_dir)\n\n    with plt.style.context('seaborn-white'):\n        plt.figure(figsize=(10, 10))\n        #plt.subplot(1,2,1)\n        #Plot training & validation accuracy values\n        plt.plot(acc_train)\n        plt.plot(acc_valid)\n        plt.title('Accuracy Vs Epochs')\n        plt.ylabel('Accuracy')\n        plt.xlabel('Epoch')\n        plt.legend(['Train', 'Validation'], loc='upper left')\n        plt.grid('on')\n        plt.savefig(results_dir+'Accuracy_SR_Net_'+model_name+'.eps', format='eps')\n        plt.savefig(results_dir+'Accuracy_SR_Net_'+model_name+'.svg', format='svg')\n        plt.savefig(results_dir+'Accuracy_SR_Net_'+model_name+'.pdf', format='pdf')\n        plt.show()\n\n        plt.figure(figsize=(10, 10))\n        #plt.subplot(1,2,2)\n        #Plot training & validation loss values\n        plt.plot(loss_train)\n        plt.plot(loss_valid)\n        plt.title('Loss Vs Epochs')\n        plt.ylabel('Loss')\n        plt.xlabel('Epoch')\n        plt.legend(['Train', 'Validation'], loc='upper left')\n        plt.grid('on')\n        plt.savefig(results_dir+'Loss_SR_Net_'+model_name+'.eps', format='eps')\n        plt.savefig(results_dir+'Loss_SR_Net_'+model_name+'.svg', format='svg')\n        plt.savefig(results_dir+'Loss_SR_Net_'+model_name+'.pdf', format='pdf')\n        plt.show()\n\n        '''\n        plt.figure(figsize=(10, 10))\n        #plt.subplot(1,2,2)\n        #Plot training & validation loss values\n        plt.plot(history.history['lr'])\n        plt.ylabel('Lr')\n        plt.xlabel('Epoch')\n        plt.grid('on')\n        plt.show()\n        '''\n    results={'acc_train':acc_train,'acc_valid':acc_valid,'loss_train':loss_train,'loss_valid':loss_valid}\n    return results","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Plot ROC Curves","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import (\n    average_precision_score,\n    precision_recall_curve,\n    roc_auc_score,\n    roc_curve,\n)\n\ndef get_curve(gt, pred, target_names,model_name):\n    labels=[]\n    for i in range(len(target_names)):\n        \n        curve_function = roc_curve\n        auc_roc = roc_auc_score(gt[:, i], pred[:, i])\n        label = model_name+target_names[i] + \" AUC: %.3f \" % auc_roc\n        labels.append(label)\n        xlabel = \"False positive rate\"\n        ylabel = \"True positive rate\"\n        a, b, _ = curve_function(gt[:, i], pred[:, i])\n        plt.figure(1, figsize=(7, 7))\n        plt.plot([0, 1], [0, 1], 'k--')\n        plt.plot(a, b, label=label)\n        plt.xlabel(xlabel)\n        plt.ylabel(ylabel)\n\n        plt.legend(loc='upper center', bbox_to_anchor=(1.3, 1),\n                  fancybox=True, ncol=1)\n      \n    return [a,b],labels\nlabels = [\"Cover\",\"Stego\"]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Working with BOSSbase 1.01 HILL y PAYLOAD = 0.4bpp","metadata":{}},{"cell_type":"code","source":"#Dataset\nEPOCHS=100\nPATH = \"/kaggle/input/alaska-dataset-juniward-jmipod/JUNIWARD/\"\n\n#Train\nX_train = np.load(PATH+'X_train.npy')\ny_train = np.load(PATH+'y_train.npy')\n#Valid\nX_valid = np.load(PATH+'X_valid.npy')\ny_valid = np.load(PATH+'y_valid.npy')\n#Test\nX_test = np.load(PATH+'X_test.npy')\ny_test = np.load(PATH+'y_test.npy')\n\nprint(X_train.shape)\nprint(y_train.shape)\nprint(X_valid.shape)\nprint(y_valid.shape)\nprint(X_test.shape)\nprint(y_test.shape)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## CNN name and algorithm ","metadata":{}},{"cell_type":"code","source":"base_name=\"JUNIWARD\"\nm_name=\"SRnet\"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Training","metadata":{}},{"cell_type":"code","source":"model= SRnet_estretegia_final_paper() \nname=\"Model_\"+m_name+\"_\"+base_name\n_, history  = train(model, X_train, y_train, X_valid, y_valid, X_test, y_test, batch_size=32, epochs=100, model_name=name)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Test","metadata":{}},{"cell_type":"code","source":"# # detect and init the TPU\n# tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()\n\n# # instantiate a distribution strategy\n# tpu_strategy = tf.distribute.experimental.TPUStrategy(tpu)\n\n# # instantiating the model in the strategy scope creates the model on the TPU\n# with tpu_strategy.scope():\n#     model= SRnet_estretegia_final_paper() \n    \n# PATH_trained_models = \"/kaggle/input/srnet-without-strategy-output/logs/Model_SRnet_02HILL_1698490121.4401147\"\n# Final_Results_Test(model,PATH_trained_models)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Training, validation and testing graph","metadata":{}},{"cell_type":"code","source":"# model= SRnet_estretegia_final_paper()  \n# PATH_trained_models = \"/kaggle/input/zhu-net-output/logs/Model_Zhu_Net_04WOW1_1697920290.056256\"\n# name=\"Model_\"+m_name+\"_\"+base_name\n# res=plot_train_valid(model,PATH_trained_models,name)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## ROC curves","metadata":{}},{"cell_type":"code","source":"# model= Xu_Net() \n# model.load_weights(\"logs/XU_Net_wow_04/saved-model-115-0.82.hdf5\") #path best model\n# predictions= model.predict(X_test,verbose=0)\n# print(predictions)\n# labels = [\"Cover\",\"Stego\"]\n# model_name=\"Xu_Net WOW - \"\n# curve1,labels1=get_curve(y_test, predictions, labels,model_name)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## HILL 0.2 bpp","metadata":{}},{"cell_type":"code","source":"# base_name=\"02HILL\"\n# m_name=\"SRnet\"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Training","metadata":{}},{"cell_type":"code","source":"# PATH04 = '../input'\n# #Dataset\n# EPOCHS=150\n# PATH04_WOW1 = \"/bossbase-hill-0-2/BOSSbase1_01_train4000_valid1000_test5000/NPY/\"\n\n# #Train\n# X_train = np.load(PATH04+PATH04_WOW1+'X_train.npy')\n# y_train = np.load(PATH04+PATH04_WOW1+'y_train.npy')\n# #Valid\n# X_valid = np.load(PATH04+PATH04_WOW1+'X_valid.npy')\n# y_valid = np.load(PATH04+PATH04_WOW1+'y_valid.npy')\n# #Test\n# X_test = np.load(PATH04+PATH04_WOW1+'X_test.npy')\n# y_test = np.load(PATH04+PATH04_WOW1+'y_test.npy')\n\n# print(X_train.shape)\n# print(y_train.shape)\n# print(X_valid.shape)\n# print(y_valid.shape)\n# print(X_test.shape)\n# print(y_test.shape)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model= Xu_Net() \n# model.load_weights(\"\") #best Model 0.4\n# name=\"Model_\"+m_name+\"_\"+base_name\n# _, history  = train(model, X_train, y_train, X_valid, y_valid, X_test, y_test, batch_size=64, epochs=50, model_name=name)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}}]}