{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np\nimport pandas as pd \nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport plotly.express as px\nimport plotly.figure_factory as ff\nimport plotly.graph_objects as go\nfrom scipy import stats\nimport cv2\nimport glob\nimport keras\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.utils import to_categorical\nfrom keras.layers import Dense\nfrom keras import Model\nfrom keras.callbacks import ModelCheckpoint\nfrom keras.models import load_model\nimport tensorflow as tf\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n\n# You can write up to 5GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"train_df=pd.read_csv('../input/landmark-recognition-2020/train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(len(train_df))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_list = glob.glob('../input/landmark-recognition-2020/train/*/*/*/*')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"example = cv2.imread(train_list[10000])\nprint(example.shape)\nplt.figure(figsize=(20,10))\nplt.imshow(example)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(example.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df[\"filename\"] = train_df.id.str[0]+\"/\"+train_df.id.str[1]+\"/\"+train_df.id.str[2]+\"/\"+train_df.id+\".jpg\"\ntrain_df[\"label\"] = train_df.landmark_id.astype(str)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from collections import Counter\n\nc = train_df.landmark_id.values\ncount = Counter(c).most_common(1000)\nprint(len(count), count[-1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# only keep 1000 classes\nkeep_labels = [i[0] for i in count]\ntrain_keep = train_df[train_df.landmark_id.isin(keep_labels)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"val_rate = 0.2\nbatch_size = 32","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"gen = ImageDataGenerator(validation_split=val_rate)\n\ntrain_gen = gen.flow_from_dataframe(\n    train_keep,\n    directory=\"/kaggle/input/landmark-recognition-2020/train/\",\n    x_col=\"filename\",\n    y_col=\"label\",\n    weight_col=None,\n    target_size=(256, 256),\n    color_mode=\"rgb\",\n    classes=None,\n    class_mode=\"categorical\",\n    batch_size=batch_size,\n    shuffle=True,\n    subset=\"training\",\n    interpolation=\"nearest\",\n    validate_filenames=False)\n    \nval_gen = gen.flow_from_dataframe(\n    train_keep,\n    directory=\"/kaggle/input/landmark-recognition-2020/train/\",\n    x_col=\"filename\",\n    y_col=\"label\",\n    weight_col=None,\n    target_size=(256, 256),\n    color_mode=\"rgb\",\n    classes=None,\n    class_mode=\"categorical\",\n    batch_size=batch_size,\n    shuffle=True,\n    subset=\"validation\",\n    interpolation=\"nearest\",\n    validate_filenames=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#AlexNet\n#model = tf.keras.Sequential([\n#    keras.layers.Conv2D(64, 8, activation=\"relu\", padding=\"same\",\n#                        input_shape=[256, 256, 3]),\n#    keras.layers.Conv2D(96, 11, strides=4, activation=\"relu\", padding=\"valid\"),\n#    keras.layers.MaxPool2D(pool_size=(3,3), strides=2, padding=\"valid\"),\n#    keras.layers.Conv2D(256, 5, strides=1, activation=\"relu\", padding=\"same\"),\n#    keras.layers.MaxPool2D(pool_size=(3,3), strides=2, padding=\"valid\"),\n#    keras.layers.Conv2D(384, 3, strides=1, activation=\"relu\", padding=\"same\"),\n#    keras.layers.Conv2D(384, 3, strides=1, activation=\"relu\", padding=\"same\"),\n#    keras.layers.Conv2D(256, 3, strides=1, activation=\"relu\", padding=\"same\"),\n#    keras.layers.MaxPool2D(pool_size=(3,3), strides=2, padding=\"valid\"),\n#    keras.layers.Flatten(),\n#    keras.layers.Dense(4096, activation=\"relu\"),\n#    keras.layers.Dropout(0.5),\n#    keras.layers.Dense(4096, activation=\"relu\"),\n#    keras.layers.Dropout(0.5),\n#    keras.layers.Dense(1000, activation='softmax')\n#])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#ResNet-34\n#class ResidualUnit(keras.layers.Layer):\n#    def __init__(self, filters, strides=1, activation=\"relu\", **kwargs):\n#        super().__init__(**kwargs)\n#        self.activation = keras.activations.get(activation)\n#        self.main_layers = [\n#            keras.layers.Conv2D(filters, 3, strides=strides,\n#                                padding=\"same\", use_bias=False),\n#            keras.layers.BatchNormalization(),\n#            self.activation,\n#            keras.layers.Conv2D(filters, 3, strides=1,\n#                                padding=\"same\", use_bias=False),\n#            keras.layers.BatchNormalization()]\n#        self.skip_layers = []\n#        if strides>1:\n#            self.skip_layers = [\n#                keras.layers.Conv2D(filters, 1, strides=strides,\n#                                    padding=\"same\", use_bias=False),\n#                keras.layers.BatchNormalization()]\n#    \n#    def call(self, inputs):\n#        Z = inputs\n#        for layer in self.main_layers:\n#            Z = layer(Z)\n#        skip_Z = inputs\n#        for layer in self.skip_layers:\n#            skip_Z = layer(skip_Z)\n#        return self.activation(Z + skip_Z)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#model = keras.models.Sequential()\n#model.add(keras.layers.Conv2D(64, 7, strides=2, input_shape=[224,224,3],\n#                             padding=\"same\", use_bias=False))\n#model.add(keras.layers.BatchNormalization())\n#model.add(keras.layers.Activation(\"relu\"))\n#model.add(keras.layers.MaxPool2D(pool_size=3, strides=2, padding=\"same\"))\n#prev_filters=64\n#for filters in [64]*3 + [128]*4 + [256]*6 + [512]*3:\n#    strides=1 if filters==prev_filters else 2\n#    model.add(ResidualUnit(filters, strides=strides))\n#    prev_filters = filters\n#model.add(keras.layers.GlobalAvgPool2D())\n#model.add(keras.layers.Flatten())\n#model.add(keras.layers.Dense(1000, activation=\"softmax\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = tf.keras.Sequential([\n    tf.keras.applications.EfficientNetB3(\n    include_top=False,\n    weights=\"imagenet\",\n    input_shape=(256,256,3)\n    ),\n    keras.layers.GlobalAveragePooling2D(),\n    keras.layers.Dense(1000, activation='softmax')\n])\n\n#model = tf.keras.Sequential([\n#    efn.EfficientNetB3(\n#        input_shape=(256, 256, 3),\n#        weights='imagenet',\n#        include_top=False\n#    ),\n#    keras.layers.GlobalAveragePooling2D(),\n#    keras.layers.Dense(1000, activation='softmax')\n#])\n\nmodel.compile(\n    optimizer='adam',\n    loss = 'categorical_crossentropy',\n    metrics=['categorical_accuracy']\n)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs = 1\ntrain_steps = int(len(train_keep)*(1-val_rate))//batch_size\nval_steps = int(len(train_keep)*val_rate)//batch_size\n\nmodel_checkpoint = ModelCheckpoint(\"model_efnB3.h5\", save_best_only=True, verbose=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit_generator(train_gen, steps_per_epoch=train_steps, epochs=epochs,validation_data=val_gen,\n                              validation_steps=val_steps, callbacks=[model_checkpoint])\n\nmodel.save(\"model.h5\")","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}