{"cells":[{"metadata":{},"cell_type":"markdown","source":"## Bristol-Myers Squibb – Molecular Translation\n\n![](https://storage.googleapis.com/kaggle-competitions/kaggle/22422/logos/header.png)"},{"metadata":{},"cell_type":"markdown","source":"### In this notebook, we are going to cover the following topics\n\n<a id=\"top\"></a>\n\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='color:white; background:skyblue; border:0' role=\"tab\" aria-controls=\"home\"><center>Quick Navigation</center></h2>\n\n* [Aim of the Competition](#1)\n* [Data Files Overview/ Quick EDA](#2)\n* [Baseline Text Generation Model Creatio to Predict Text for a Given Image](#3)"},{"metadata":{},"cell_type":"markdown","source":"<a id=\"1\"></a>\n<h3 style='background:skyblue; border:0; color:white'><center>Aim of the Competition<center><h3>"},{"metadata":{},"cell_type":"markdown","source":"* This competition aims at annotating or predicting the right text-string for scanned images.\n    * The scanned images are nothing but chemical structures.\n    * Annotation/ text that must be predicted for each of the images are the corresponding chemical idenifier (InChI) - https://en.wikipedia.org/wiki/International_Chemical_Identifier.\n\n* As you might have guessed, We are provided with training data - which comprises of scanned images of chemical structures and the corresponding text/annotations which shall be used to develop a system that can help us predict the right text for given a new chemical structure image present in test-data.\n* Few considerations are - Images presented both in Training and Test-Data may be very much augmented - having rotated at different angles, presented at various resolutions and even with noise added."},{"metadata":{},"cell_type":"markdown","source":"#### With this details about competition - let us get an overview of the data-files in the next step"},{"metadata":{},"cell_type":"markdown","source":"<a id=\"2\"></a>\n<h3 style='background:skyblue; border:0; color:white'><center>Data Files Overview/ Quick EDA<center><h3>"},{"metadata":{},"cell_type":"markdown","source":"As part of input information provided in competition we have the following data-set\n\n**Train Folder**\n\n**Test Folder**\n\n**train_labels.csv**\n\n**sample_submission.csv**\n\n\n\n"},{"metadata":{},"cell_type":"markdown","source":"### Let us first read through train_labels.csv"},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport cv2\nimport matplotlib.pyplot as plt\nTRAIN_LABELS_PATH = \"../input/bms-molecular-translation/train_labels.csv\"\ndf_train_labels = pd.read_csv(TRAIN_LABELS_PATH)\ndf_train_labels.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train_labels.tail()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"> We observe that we have two columns in the above file, one with the training data(training image id) and the other wirh corresponding label or text associated with it"},{"metadata":{},"cell_type":"markdown","source":"### Now lets understand how the train folder, This is arranged in a 3-Level folder structure for each image-id, let us convert each of it in to a fully qualified path"},{"metadata":{},"cell_type":"markdown","source":"### Here is a snippet of the folder structure for first few and last few images"},{"metadata":{},"cell_type":"markdown","source":"![image.png](attachment:image.png)","attachments":{"image.png":{"image/png":"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"}}},{"metadata":{},"cell_type":"markdown","source":"![image.png](attachment:image.png)","attachments":{"image.png":{"image/png":"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"}}},{"metadata":{},"cell_type":"markdown","source":"### If we carefully watch the image-id or image-name,first 3 characters in the id represents the folder structure, so using this lets construct the fully qualified image path for each image using below code"},{"metadata":{"trusted":true},"cell_type":"code","source":"fully_qualified_path = \"../input/bms-molecular-translation/train/{}/{}/{}/{}.png\"\nconvert_image_id_to_path = lambda image_id_details :fully_qualified_path.format(image_id_details[0], image_id_details[1], image_id_details[2], image_id_details) ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Let's create a new column in the above dataframe involving the path of image"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train_labels['image_path']=df_train_labels['image_id'].apply(convert_image_id_to_path)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train_labels.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Similar Approach goes with test file image-id and images present in test-folder structure"},{"metadata":{},"cell_type":"markdown","source":"### Quick EDA"},{"metadata":{"trusted":true},"cell_type":"code","source":"def visualize_train_batch(image_ids, labels):\n    plt.figure(figsize=(16, 12))\n    \n    for ind, (image_id, label) in enumerate(zip(image_ids, labels)):\n        plt.subplot(3, 3, ind + 1)\n        image = cv2.imread(convert_image_id_to_path(image_id))\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n\n        plt.imshow(image)\n        plt.title(f\"{label[:30]}...\", fontsize=10)\n        plt.axis(\"off\")\n    \n    plt.show()\ntmp_df = df_train_labels[:9]\nimage_ids = tmp_df['image_id']\nlabels = tmp_df[\"InChI\"].values\nvisualize_train_batch(image_ids, labels)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Length of training-data:',len(df_train_labels))\nprint('Number of unique chemical identifier:',len(df_train_labels['InChI'].value_counts().index))\nprint('Max count of any chemical identifier in trainign data:',max(df_train_labels['InChI'].value_counts().values))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"h_shape=[]\nw_shape=[]\naspect_ratio=[]\nfor idx,image_id in enumerate(df_train_labels.image_id.values[:1000]):\n    image = cv2.imread(df_train_labels['image_path'][idx])\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    h_shape.append(image.shape[0])\n    w_shape.append(image.shape[1])\n    aspect_ratio.append(1.0 * (image.shape[1] / image.shape[0]))\nplt.figure(figsize=(12, 12))\nplt.subplots_adjust(top = 0.5, bottom=0.01, hspace=1, wspace=0.4)\nplt.subplot(2, 2, 1)\nplt.hist(np.array(h_shape) * np.array(w_shape), bins=50)\nplt.xticks(rotation=45)\nplt.title(\"Area Image Distribution\", fontsize=14)\nplt.subplot(2, 2, 2)\nplt.hist(h_shape, bins=50)\nplt.title(\"Height Image Distribution\", fontsize=14)\nprint()\nplt.subplot(2, 2, 3)\nplt.hist(w_shape, bins=50)\nplt.title(\"Width Image Distribution\", fontsize=14)\nplt.subplot(2, 2, 4)\nplt.hist(aspect_ratio, bins=50)\nplt.title(\"Aspect Ratio Distribution\", fontsize=14);","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a id=\"3\"></a>\n<h3 style='background:skyblue; border:0; color:white'><center>Baseline Text Generation Model Creatio to Predict Text for a Given Image<center><h3>"},{"metadata":{},"cell_type":"markdown","source":"### Let us now get into Model Development - which involves feature extraction and using them for training with labeled texts to help the model predict texts for newer images with their feature-set"},{"metadata":{"trusted":true},"cell_type":"code","source":"# tensorflow version\nimport tensorflow\nprint('tensorflow: %s' % tensorflow.__version__)\n# keras version\nimport keras\nprint('keras: %s' % keras.__version__)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from pickle import dump\nfrom keras.applications.vgg16 import VGG16\nfrom keras.preprocessing.image import load_img\nfrom keras.preprocessing.image import img_to_array\nfrom keras.applications.vgg16 import preprocess_input\nfrom keras.models import Model\n \n# extract features from each image\ndef extract_features():\n    \n # load the model\n    model = VGG16()\n    # re-structure the model\n    model = Model(inputs=model.inputs, outputs=model.layers[-2].output)\n    # summarize\n    print(model.summary())\n # extract features from each image\n    features = dict()\n    for idx,name in enumerate(df_train_labels['image_path'].values[:100]):\n        filename = name\n        image = load_img(filename, target_size=(224, 224))\n         # convert the image pixels to a numpy array\n        image = img_to_array(image)\n         # reshape data for the model\n        image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))\n         # prepare the image for the VGG model\n        image = preprocess_input(image)\n         # get features\n        feature = model.predict(image, verbose=0)\n         # store feature\n        features[df_train_labels['image_id'][idx]] = feature\n        #print('>%s' % name)\n    return features\n\nfeatures = extract_features()\nprint('Extracted Features: %d' % len(features))\n# save to file\ndump(features, open('features.pkl', 'wb'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# extract texts for images\ndef load_text():\n    mapping = dict()\n    for idx,text in enumerate(df_train_labels['InChI'].values[:100]):\n        mapping[df_train_labels['image_id'][idx]]=text\n    return mapping\n\ndef to_vocabulary(descriptions):\n    all_desc = set()\n    for key,value in descriptions.items():\n        all_desc.update([value])\n    return all_desc\ntexts = load_text()\nvocabulary  = to_vocabulary(texts)\nprint('Loaded: %d ' % len(texts))\nprint('Vocabulary Size: %d' % len(vocabulary))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Work in progress...."},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tqdm.auto import tqdm\ntqdm.pandas()\nimport Levenshtein","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test = pd.read_csv('../input/bms-molecular-translation/sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train=df_train_labels\ntrain['InChI_list'] = train['InChI'].progress_apply(lambda x: x.split('/'))\ntrain['InChI_length'] = train['InChI_list'].progress_apply(len)\nInChI_df = train['InChI_list'].progress_apply(pd.Series)\ntrain = pd.concat([train, InChI_df.add_prefix('InChI_')], axis=1)\ndisplay(train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#train.to_pickle('train.pkl')\n#test.to_pickle('test.pkl')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_score(y_true, y_pred):\n    scores = []\n    for true, pred in zip(y_true, y_pred):\n        score = Levenshtein.distance(true, pred)\n        scores.append(score)\n    avg_score = np.mean(scores)\n    return avg_score","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"mode_concat_string = ''\nfor i in range(11):\n    mode_string = train[f'InChI_{i}'].fillna('nan').mode()[0]\n    if mode_string != 'nan':\n        if i == 0:\n            mode_concat_string += mode_string\n        else:\n            mode_concat_string += '/' + mode_string\nprint(mode_concat_string)\n\ny_true = train['InChI'].values\ny_pred = [mode_concat_string] * len(train)\nscore = get_score(y_true, y_pred)\nprint(score)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test['InChI'] = mode_concat_string\noutput_cols = ['image_id', 'InChI']\ndisplay(test[output_cols])\ntest[output_cols].to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}