{"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":"# SIIM: Step-by-Step Image Detection for Beginners \n## Part 2. Basic Modeling - Simplest Image Classification Models using Keras\n\n👉 Part 1. [EDA to Preprocessing](https://www.kaggle.com/songseungwon/siim-covid-19-detection-10-step-tutorial-1)\n\n👉 Mini Part. [Preprocessing for Multi-Output Regression that Detect Opacities](https://www.kaggle.com/songseungwon/siim-covid-19-detection-mini-part-preprocess)","metadata":{}},{"cell_type":"markdown","source":"### Thanks for nice reference :\n\n`load dataset(original image size info-)`\n- [Resized to 256px JPG](https://www.kaggle.com/xhlulu/siim-covid19-resized-to-256px-jpg)","metadata":{}},{"cell_type":"markdown","source":"> Index\n```\nStep 1. Load Data and Trim for use\n     1-a. load train-dataframe\n     1-b. load meta-dataframe\n     1-c. load image data array\n     1-d. calculate image resize ratio information\nStep 2. Image Pre-Classification with Data generator\n     2-a. classify image id by opacity types\n     2-b. sort image files into each type's folder\n     2-c. data generation, split train/valid set\nStep 3. Modeling I - Basic Multiclass classifier\n     3-a. import libraries\n     3-b. basic modeling with keras api\n     3-c. model compile\n     3-d. save model checkpoint\n     3-e. model fit\n     3-f. model evaluate & save\n     3-g. reload model & model summary\nStep 4. Modeling II - Multiclass classifier using EfficientNet(Transfer Learning)\n     4-a. Load the EfficientNet and try it out\n     4-b. Improving performance with an appropriate form\n```","metadata":{}},{"cell_type":"code","source":"#!pip install -U tensorflow==2.5.0\n#import tensorflow as tf\n#print(tf.__version__)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 1. Load Data and Trim for use\n\n**trainデータは学習に使うデータ、重みの更新に使われる**\n\n**Validationデータはハイパーパラメータのチューニング や Early Stopping(学習の早期打ち切り)に使うデータ**\n\n**testデータは学習時には使わない、精度検証に用いるデータ**\n\nhttps://serokell.io/blog/machine-learning-testing","metadata":{}},{"cell_type":"markdown","source":"### 1-a. load train-dataframe","metadata":{}},{"cell_type":"code","source":"import pandas as pd","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_df = pd.read_csv('/kaggle/input/siimcovid19-train-data-that-opacitycount-added/train_df.csv')\n# local\ntrain_df = pd.read_csv('/kaggle/input/siimcovid19-train-data-that-opacitycount-added/train_df.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We don't use dcm file. drop 'path' column","metadata":{}},{"cell_type":"code","source":"train_df.drop(columns='Path', axis=1,inplace=True)\n#Pathがついている列(列はaxis=1)を削除する","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"And add 'Opacity' Column. The Value is 1 If Opacity detected, else 0","metadata":{}},{"cell_type":"code","source":"train_df['Opacity'] = train_df.apply(lambda row : 1 if row.label.split(' ')[0]=='opacity' else 0, axis=1)\ntrain_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.drop(columns=['Unnamed: 0'], inplace=True)\ntrain_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 1-b. load meta-dataframe","metadata":{}},{"cell_type":"markdown","source":"We need the size of the individual images. This is necessary later to calculate the ratio and find the coordinates of the box border to detect the opacity.","metadata":{}},{"cell_type":"code","source":"meta_df = pd.read_csv('/kaggle/input/siim-covid19-resized-to-256px-jpg/meta.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- Y(height) : `dim0` \n- X(width) : `dim1`\n","metadata":{}},{"cell_type":"code","source":"meta_df.info()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_df.split","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_df.split.unique()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings(action='ignore')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_meta_df = meta_df.loc[meta_df.split=='train']\ntrain_meta_df.drop('split',axis=1,inplace=True)\n#spilit列を削除\ntrain_meta_df.columns = ['id', 'origin_img_height','origin_img_width']\ntrain_meta_df.info()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_meta_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# test lambda、idを_で分割し、先頭を取り出す\ntrain_df['id'].apply(lambda x : x.split('_')[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['id'] = train_df['id'].apply(lambda x : x.split('_')[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.merge(train_df, train_meta_df, on='id')\n#pd.mergeは結合","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 1-c. load image data array","metadata":{}},{"cell_type":"code","source":"path = '/kaggle/input/siim-covid19-resized-to-256px-jpg/train/'\ntrain_imgs_path = list(train_df['id'].apply(lambda x : path + x + '.jpg').values)\n#lambaは無名関数、lambda 引数: 返り値\ntrain_imgs_path[:10]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Test sample image","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = plt.imread(train_imgs_path[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(img, cmap='gray')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = 0\ntrain_imgs = []\nfor img_path in train_imgs_path:\n    img = plt.imread(img_path)\n    train_imgs.append(img)#appendは末尾に要素追加\n    i += 1\n    if i % 1000 == 0:\n        print('{} / {}'.format(i, len(train_imgs_path)))\n    elif i == 6334:\n        print('6334 / 6334 (End)')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"type(train_imgs)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_imgs = np.array(train_imgs)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_imgs.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**add Channel (3dim to 4dim, gray)**","metadata":{}},{"cell_type":"code","source":"train_imgs_path[0]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_imgs[:,:,:,np.newaxis].shape\n#newaxisは新しいサイズ1の次元を追加","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_imgs_4dim = train_imgs[:,:,:,np.newaxis]\ntrain_imgs_4dim.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**And simply EDA**\n\nhttps://toukei-lab.com/eda\nEDA、探索的データ解析のこと。データ理解をする過程","metadata":{}},{"cell_type":"code","source":"len(train_imgs)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"min(train_imgs[0].reshape(-1)), max(train_imgs[0].reshape(-1))\n#.reshape(-1)は行ベクトルを返す","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"min(train_imgs[13].reshape(-1)), max(train_imgs[13].reshape(-1))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 1-d. calculate image resize ratio information","metadata":{}},{"cell_type":"code","source":"train_df['origin_img_height']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['height_ratio'] = train_df['origin_img_height'].apply(lambda x : 255/x)\ntrain_df['height_ratio']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['origin_img_width']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['width_ratio'] = train_df['origin_img_width'].apply(lambda x : 255/x)\ntrain_df['width_ratio']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df\n#これで学習に使うデータが用意できた","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 2. Image Pre-Classification with Data generator","metadata":{}},{"cell_type":"markdown","source":"### 2-a. classify image id by Opacity types","metadata":{}},{"cell_type":"code","source":"types = list(train_df.columns[5:9])#6列目から10列目の名前リスト\ntypes","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_imgs.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 2-b. sort image files into each type's folder","metadata":{}},{"cell_type":"markdown","source":"Create folders for each class **in advance**, and save images in each folder.","metadata":{}},{"cell_type":"code","source":"!mkdir ./genData\n!mkdir ./genData/Negative\n!mkdir ./genData/Typical\n!mkdir ./genData/Indeterminate\n!mkdir ./genData/Atypical","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Negative for Pneumonia\nimgs_Negative = list(train_df[train_df[types[0]]==1].index)\nfor idx in imgs_Negative:\n    plt.imsave('./genData/Negative/{}.jpg'.format(train_df.loc[idx,'id']), train_imgs[idx], cmap='gray')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Typical Apperance\nimgs_Typical = list(train_df[train_df[types[1]]==1].index)\nfor idx in imgs_Typical:\n    plt.imsave('./genData/Typical/{}.jpg'.format(train_df.loc[idx,'id']), train_imgs[idx], cmap='gray')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Indeterminate Apearance\nimgs_Indeterminate = list(train_df[train_df[types[2]]==1].index)\nfor idx in imgs_Indeterminate:\n    plt.imsave('./genData/Indeterminate/{}.jpg'.format(train_df.loc[idx,'id']), train_imgs[idx], cmap='gray')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Atypical Apearance\nimgs_Atypical = list(train_df[train_df[types[3]]==1].index)\nfor idx in imgs_Atypical:\n    plt.imsave('./genData/Atypical/{}.jpg'.format(train_df.loc[idx,'id']), train_imgs[idx], cmap='gray')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 2-c. data generation, split train/valid set\n\nhttps://keras.io/ja/preprocessing/image/\n\n画像の前処理、なんでこんなことをするのかは…、、知らん！\n\n\n＞http://wild-data-chase.com/index.php/2019/02/04/post-370/\n\n学習に用いる画像を拡張（バリエーションを増やす）してる、validation data を作るための過程、と言い換えてもいい","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"idg = ImageDataGenerator(\n    rescale=1. / 255,\n    rotation_range=3,\n    width_shift_range=0.05,\n    height_shift_range=0.05,\n    zoom_range=0.05,\n    horizontal_flip=False,\n    fill_mode='reflect',\n    validation_split=0.2\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_path = './genData'\nbatch_size = 64\ntarget_size = (256, 256)\nclass_mode = 'categorical'\ncolor_mode = 'grayscale'","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_gen = idg.flow_from_directory(\n    data_path,\n    batch_size=batch_size,\n    target_size=target_size,\n    class_mode=class_mode,\n    color_mode=color_mode,\n    subset = 'training'\n)\n\nvalid_gen = idg.flow_from_directory(\n    data_path,\n    batch_size = batch_size,\n    target_size = target_size,\n    class_mode = class_mode,\n    color_mode=color_mode,\n    subset = 'validation'\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Step 3. Modeling ","metadata":{}},{"cell_type":"markdown","source":"### 3-a. import libraries\n\n参考\nhttps://note.nkmk.me/python-tensorflow-keras-basics/","metadata":{}},{"cell_type":"code","source":"import os\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dropout, Dense\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import ModelCheckpoint\nfrom tensorflow.keras.callbacks import EarlyStopping","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"***3-b. basic modeling with keras api***","metadata":{}},{"cell_type":"code","source":"def basic_cnn_model():\n    # create model\n    model = Sequential()\n    model.add(Conv2D(64, (3, 3), input_shape=(256, 256, 1), activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Conv2D(64, (3, 3), activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Conv2D(128, (3, 3), activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dense(128, activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Flatten())\n    model.add(Dropout(0.5))\n    model.add(Dense(128, activation='relu'))\n    model.add(Dense(4, activation='softmax'))\n    # Compile model\n    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])\n    return model","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = basic_cnn_model()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**3-d.save model checkpoint**","metadata":{}},{"cell_type":"code","source":"checkpoint_path = 'my_checkpoint.ckpt'\ncheckpoint_dir = os.path.dirname(checkpoint_path)\n\ncp_callback = ModelCheckpoint(\n    filepath = checkpoint_path,\n    save_weights_only = True,\n    save_best_only = True,\n    monitor = 'val_loss',\n    verbose=1\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**EaelyStoppingの設定**","metadata":{}},{"cell_type":"code","source":"# EaelyStoppingの設定\nearly_stopping =  EarlyStopping(\n                            monitor='val_loss',\n                            min_delta=0.0,\n                            patience=2,)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**3-e.model fit**　\n\n訓練の実行","metadata":{}},{"cell_type":"code","source":"epochs = 1 # just for test\nmodel.fit(\n    train_gen,\n    validation_data = (valid_gen),\n    epochs = epochs,\n    callbacks=[cp_callback, early_stopping]\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 20 #20までで、earlystopping設定済み\nmodel.fit(\n    train_gen,\n    validation_data = (valid_gen),\n    epochs = epochs,\n    callbacks=[cp_callback, early_stopping]\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**3-f. model evaluate & save**","metadata":{}},{"cell_type":"code","source":"model.load_weights(checkpoint_path)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate(valid_gen)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('./model/basic_cnn.h5')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**3-g. reload model & model summary**","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\n\nmymodel = tf.keras.models.load_model('./model/basic_cnn.h5')\n\nmymodel.summary()\n\ntf.keras.utils.plot_model(mymodel, \"mymodel.png\", show_shapes=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"results = mymodel.evaluate(valid_gen)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('正解率=', results[1], 'loss=', results[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Test","metadata":{}},{"cell_type":"markdown","source":"testデータ用意","metadata":{}},{"cell_type":"code","source":"test_meta_df = meta_df.loc[meta_df.split=='test']\ntest_meta_df.drop('split',axis=1,inplace=True) #spilit列を削除\ntest_meta_df.drop('dim1',axis=1,inplace=True) #dim1列を削除\ntest_meta_df.drop('dim0',axis=1,inplace=True) #dim0列を削除\ntest_meta_df.columns = ['id']\ntest_meta_df.info()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_meta_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_path = '/kaggle/input/siim-covid19-resized-to-256px-jpg/test/' # absolute path\ntest_imgs_path = list(test_meta_df['id'].apply(lambda x : test_path + x + '.jpg').values)\ntest_imgs_path[:10]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = plt.imread(test_imgs_path[0])\nimg.shape\nplt.imshow(img, cmap='gray')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = 0\ntest_imgs = []\nfor test_img_path in test_imgs_path:\n    img = plt.imread(test_img_path)\n    test_imgs.append(img)#appendは末尾に要素追加\n    i += 1\n    if i % 100 == 0:\n        print('{} / {}'.format(i, len(test_imgs_path)))\n    elif i == 1263:\n        print('1263 /1263  (End)')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"type(test_imgs)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_imgs = np.array(test_imgs)\ntest_imgs.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_imgs_path[0]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_imgs[:,:,:,np.newaxis].shape\n#newaxisは新しいサイズ1の次元を追加","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_imgs_4dim = test_imgs[:,:,:,np.newaxis]\ntest_imgs_4dim.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\n!mkdir ./test_genData\n\ntest_data_gen = ImageDataGenerator(rescale=1./255)\ntest_generator = test_data_gen.flow_from_directory(\n    directory='../input/siim-covid19-resized-to-256px-jpg/test',\n    target_size=(256, 256), \n    color_mode='grayscale', \n    classes=None, \n    class_mode='categorical', \n    batch_size=64, \n    shuffle=False, \n    seed=None, \n    save_to_dir='./test_genData', \n    save_prefix='', \n    save_format='jpg', \n    follow_links=False, )\n\"\"\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"my_predictions=mymodel.predict(test_imgs_4dim)\nmy_predictions","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(my_predictions)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df2 = pd.DataFrame(my_predictions, columns=['0','1','2','3'])\nnew_df2 = test_meta_df.join(df2)\nnew_df2","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\nopacity_list = ['opacity'] * 1263\nresults_list=[results[1]] * 1263\nstr(results_list)\ndf4 = pd.DataFrame(np.array(opacity_list))\ndf5 = pd.DataFrame(np.array(results_list))\n\"\"\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\nnew_df2 = df2[0]+ \"\"+df2[1]+\"\"+df2[2]+\"\"+df2[3]\n\"\"\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\ndf1 = pd.DataFrame(test_meta_df)\ndf3 = df1.join(new_df2)\ndf3.to_csv('my_predictions.csv')\npd.read_csv('my_predictions.csv')\n\"\"\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\nresults = predictions.argmax(axis=1)\nprint(results)\n\"\"\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Read the submisison file\nimport pandas as pd\nsub_df = pd.read_csv('/kaggle/input/siim-covid19-detection/sample_submission.csv')\nsub_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install tqdm\nfrom tqdm import tqdm ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Prediction loop for submission\npredictions = []\n\nfor i in range(len(sub_df)):\n    row = sub_df.loc[i]\n    id_name = row.id.split('_')[0]\n    id_level = row.id.split('_')[-1]\n    \n    if id_level == 'study':\n        # do study-level classification\n        predictions.append(\"Negative 1 0 0 1 1\") # dummy prediction\n        \n    elif id_level == 'image':\n        if id_name in new_df2['id']:\n            predictions.append(\"Opacity\" + \"\" + results[1] + \"\" + new_df2[i,1:4]) \n        else:\n            predictions.append(\"None 1 0 0 1 1\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nos.getcwd()\nos.chdir('../')\nos.getcwd()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nsub_df['PredictionString'] = predictions\nsub_df.to_csv('submission.csv', index=False)\nsub_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Info. Efficient Net V2\n","metadata":{}},{"cell_type":"markdown","source":"https://colab.research.google.com/github/google/automl/blob/master/efficientnetv2/tfhub.ipynb#scrollTo=E32RGKBEWq76\n\nhttps://qiita.com/T-STAR/items/a04b559421ef20a970ec\n\nhttps://github.com/lukemelas/EfficientNet-PyTorch\n\nフライングゲット\nhttps://qiita.com/kitfactory/items/4024dcdbd1034d15927b\n\nTutorial\nhttps://colab.research.google.com/github/google/automl/blob/master/efficientnetv2/tutorial.ipynb#scrollTo=U2oz3r1LUDzr","metadata":{}},{"cell_type":"markdown","source":"**Install package and download source code/image.**","metadata":{}}]}