{"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":"# <h1 style='background-color:LimeGreen; font-family:newtimeroman; font-size:200%; text-align:center; border-radius: 15px 50px;' >MobileNet </h1> \n\nMobileNet is a streamlined architecture that uses depthwise separable convolutions to construct lightweight deep convolutional neural networks and provides an efficient model for mobile and embedded vision applications . The structure of MobileNet is based on depthwise separable filters.\n\n<img src=\"https://slideplayer.com/slide/16902656/97/images/10/MobileNet+Layer+Architecture.jpg\" width=\"800px\">\n\n","metadata":{"papermill":{"duration":0.013711,"end_time":"2021-04-18T18:35:05.432549","exception":false,"start_time":"2021-04-18T18:35:05.418838","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"# <h1 style='background-color:LimeGreen; font-family:newtimeroman; font-size:180%; text-align:center; border-radius: 15px 50px;' > Data Description </h1>\nCan you help detect farmers detect apple diseases? This competition builds on last year's by challenging you to handle additional diseases and to provide more detailed information about leaves that have multiple infections.\n\n## Files\ntrain.csv - the training set metadata.\n\n* image - the image ID.\n\n* labels - the target classes, a space delimited list of all diseases found in the image. Unhealthy leaves with too many diseases to classify visually will have the complex class, and may also have a subset of the diseases identified.\n\n\n#### sample_submission.csv - A sample submission file in the correct format.\n\n* image\n\n* labels\n\ntrain_images - The training set images.\n\ntest_images - The test set images. This competition has a hidden test set: only three images are provided here as samples while the remaining 5,000 images will be available to your notebook once it is submitted.\n\n#### Dataset Link \n\n[Here](https://www.kaggle.com/c/plant-pathology-2021-fgvc8/data)","metadata":{}},{"cell_type":"markdown","source":"### Import the Libraries","metadata":{"papermill":{"duration":0.012355,"end_time":"2021-04-18T18:35:05.457682","exception":false,"start_time":"2021-04-18T18:35:05.445327","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport tensorflow as tf\nimport tensorflow.keras as keras\nimport PIL\nimport cv2\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport os\nimport random\nfrom tqdm import tqdm\nimport tensorflow_addons as tfa\nimport random\nfrom sklearn.preprocessing import MultiLabelBinarizer\n\npd.set_option(\"display.max_columns\", None)","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":4.858815,"end_time":"2021-04-18T18:35:10.329026","exception":false,"start_time":"2021-04-18T18:35:05.470211","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('../input/plant-pathology-2021-fgvc8/train.csv')\nprint(len(train))\nprint(train.columns)\n\nprint(train['labels'].value_counts().plot.bar())","metadata":{"papermill":{"duration":0.261893,"end_time":"2021-04-18T18:35:10.62961","exception":false,"start_time":"2021-04-18T18:35:10.367717","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas_profiling as pp\npp.ProfileReport(train)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['labels'] = train['labels'].apply(lambda string: string.split(' '))\ntrain","metadata":{"papermill":{"duration":0.042521,"end_time":"2021-04-18T18:35:10.716524","exception":false,"start_time":"2021-04-18T18:35:10.674003","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"s = list(train['labels'])\nmlb = MultiLabelBinarizer()\ntrainx = pd.DataFrame(mlb.fit_transform(s), columns=mlb.classes_, index=train.index)\nprint(trainx.columns)\nprint(trainx.sum())\n\nlabels = list(trainx.sum().keys())\nprint(labels)\nlabel_counts = trainx.sum().values.tolist()\n\nfig, ax = plt.subplots(1,1, figsize=(20,6))\n\nsns.barplot(x= labels, y= label_counts, ax=ax)","metadata":{"papermill":{"duration":0.192586,"end_time":"2021-04-18T18:35:10.952576","exception":false,"start_time":"2021-04-18T18:35:10.75999","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig1 = plt.figure(figsize=(26,10))\n\nfor i in range(1, 13):\n    \n    rand =  random.randrange(1, 18000)\n    sample = os.path.join('../input/plant-pathology-2021-fgvc8/train_images/', train['image'][rand])\n    \n    img = PIL.Image.open(sample)\n    \n    ax = fig1.add_subplot(4,4,i)\n    ax.imshow(img)\n    \n    title = f\"{train['labels'][rand]}{img.size}\"\n    plt.title(title)\n    \n    fig1.tight_layout()\n","metadata":{"papermill":{"duration":13.498793,"end_time":"2021-04-18T18:35:24.499297","exception":false,"start_time":"2021-04-18T18:35:11.000504","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ndatagen = keras.preprocessing.image.ImageDataGenerator(rescale=1/255.0,\n                                                        preprocessing_function=None,\n                                                        data_format=None,\n                                                    )\n\ntrain_data = datagen.flow_from_dataframe(\n    train,\n    directory='../input/plant-pathology-2021-fgvc8/train_images',\n    x_col=\"image\",\n    y_col= 'labels',\n    color_mode=\"rgb\",\n    target_size = (150,150),\n    class_mode=\"categorical\",\n    batch_size=32,\n    shuffle=False,\n    seed=40,\n)","metadata":{"papermill":{"duration":32.247973,"end_time":"2021-04-18T18:35:56.862002","exception":false,"start_time":"2021-04-18T18:35:24.614029","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seed = 40\ntf.random.set_seed(seed)\n\nmodel = tf.keras.applications.MobileNet(input_shape=(150,150,3),include_top=False,weights=\"imagenet\")\n\nprint(model.input)\nprint(model.output)","metadata":{"papermill":{"duration":10.022709,"end_time":"2021-04-18T18:36:06.996411","exception":false,"start_time":"2021-04-18T18:35:56.973702","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"new_model = tf.keras.Sequential([\n    model,\n    keras.layers.GlobalAveragePooling2D(),\n    keras.layers.Dense(6, \n        kernel_initializer=keras.initializers.RandomUniform(seed=seed),\n        bias_initializer=keras.initializers.Zeros(), name='dense', activation='sigmoid')\n])\n\n# Freezing the weights\nfor layer in new_model.layers[:-2]:\n    layer.trainable=False\n    \nnew_model.summary()","metadata":{"papermill":{"duration":1.508952,"end_time":"2021-04-18T18:36:08.693129","exception":false,"start_time":"2021-04-18T18:36:07.184177","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.utils import plot_model\nfrom IPython.display import Image\nplot_model(new_model, to_file='convnet.png', show_shapes=True,show_layer_names=True)\nImage(filename='convnet.png')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"f1 = tfa.metrics.F1Score(num_classes=6, average='macro')\n\ncallbacks = keras.callbacks.EarlyStopping(monitor=f1, patience=3, mode='max', restore_best_weights=True)\n\n\nnew_model.compile(loss=tf.keras.losses.BinaryCrossentropy(), optimizer=keras.optimizers.Adam(lr=1e-3), \n              metrics= [f1])\n\nnew_model.fit(train_data, verbose = 1,epochs=10, callbacks=callbacks)","metadata":{"papermill":{"duration":4130.155521,"end_time":"2021-04-18T19:44:58.888873","exception":false,"start_time":"2021-04-18T18:36:08.733352","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Submission\n","metadata":{"papermill":{"duration":6.046441,"end_time":"2021-04-18T19:45:11.248921","exception":false,"start_time":"2021-04-18T19:45:05.20248","status":"completed"},"tags":[]}},{"cell_type":"code","source":"test = pd.read_csv('../input/plant-pathology-2021-fgvc8/sample_submission.csv')\n\nfor img_name in tqdm(test['image']):\n    path = '../input/plant-pathology-2021-fgvc8/test_images/'+str(img_name)\n    with PIL.Image.open(path) as img:\n        img = img.resize((150,150))\n        img.save(f'./{img_name}')","metadata":{"papermill":{"duration":7.424141,"end_time":"2021-04-18T19:45:24.976919","exception":false,"start_time":"2021-04-18T19:45:17.552778","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data = datagen.flow_from_dataframe(\n    test,\n    directory = './',\n    x_col=\"image\",\n    y_col= None,\n    color_mode=\"rgb\",\n    target_size = (150,150),\n    classes=None,\n    class_mode=None,\n    batch_size=32,\n    shuffle=False,\n    seed=40,\n)\n\npreds = new_model.predict(test_data)\nprint(preds)\npreds = preds.tolist()\n\nindices = []\nfor pred in preds:\n    temp = []\n    for category in pred:\n        if category>=0.3:\n            temp.append(pred.index(category))\n    if temp!=[]:\n        indices.append(temp)\n    else:\n        temp.append(np.argmax(pred))\n        indices.append(temp)\n    \nprint(indices)","metadata":{"papermill":{"duration":9.380074,"end_time":"2021-04-18T19:45:40.67969","exception":false,"start_time":"2021-04-18T19:45:31.299616","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = (train_data.class_indices)\nlabels = dict((v,k) for k,v in labels.items())\nprint(labels)\n\ntestlabels = []\n\n\nfor image in indices:\n    temp = []\n    for i in image:\n        temp.append(str(labels[i]))\n    testlabels.append(' '.join(temp))\n\nprint(testlabels)","metadata":{"papermill":{"duration":6.415933,"end_time":"2021-04-18T19:45:53.167467","exception":false,"start_time":"2021-04-18T19:45:46.751534","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"delfiles = tf.io.gfile.glob('./*.jpg')\n\nfor file in delfiles:\n    os.remove(file)","metadata":{"papermill":{"duration":5.991419,"end_time":"2021-04-18T19:46:18.269588","exception":false,"start_time":"2021-04-18T19:46:12.278169","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.read_csv('../input/plant-pathology-2021-fgvc8/sample_submission.csv')\nsub['labels'] = testlabels\nsub.to_csv('submission.csv', index=False)\nsub","metadata":{"papermill":{"duration":7.175361,"end_time":"2021-04-18T19:46:31.723368","exception":false,"start_time":"2021-04-18T19:46:24.548007","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]}]}