{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"#Import packages\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.model_selection import train_test_split\nimport tensorflow as tf\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.preprocessing import image\nfrom keras.applications.resnet50 import ResNet50\nfrom tensorflow.python.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping\n# ignoring warnings\nimport warnings\nwarnings.simplefilter(\"ignore\")\n\nimport os, cv2, json\nfrom PIL import Image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"WORK_DIR = '../input/cassava-leaf-disease-classification'\nos.listdir(WORK_DIR)\ntrain_csv_path = \"../input/cassava-leaf-disease-classification/train.csv\"\nlabel_json_path = \"../input/cassava-leaf-disease-classification/label_num_to_disease_map.json\"\nimages_dir_path = \"../input/cassava-leaf-disease-classification/train_images\"\ntrain = pd.read_csv(train_csv_path)\ntrain.head()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"label_class = pd.read_json(label_json_path, orient='index')\nlabel_class = label_class.values.flatten().tolist #values:pd->np;flatten:返回一维数组；tolist:list of list of hit\nlabel_class","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#label names\nwith open(os.path.join(WORK_DIR, \"label_num_to_disease_map.json\")) as file:\n    print(json.dumps(json.loads(file.read()), indent=4))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(train.groupby('label').nunique())\nsns.countplot(x='label',data=train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#可视化图片\nsample0 = train[train.label == 0].sample(3)\nplt.figure(figsize=(15, 5))\nfor ind, (image_id, label) in enumerate(zip(sample0.image_id, sample0.label)):\n    plt.subplot(1, 3, ind + 1)\n    img = cv2.imread(os.path.join(WORK_DIR, \"train_images\", image_id))\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    plt.imshow(img)\n    plt.axis(\"off\")\n    \nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample1 = train[train.label == 1].sample(3)\nplt.figure(figsize=(15, 5))\nfor ind, (image_id, label) in enumerate(zip(sample1.image_id, sample1.label)):\n    plt.subplot(1, 3, ind + 1)\n    img = cv2.imread(os.path.join(WORK_DIR, \"train_images\", image_id))\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    plt.imshow(img)\n    plt.axis(\"off\")\n    \nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample2 = train[train.label == 2].sample(3)\nplt.figure(figsize=(15, 5))\nfor ind, (image_id, label) in enumerate(zip(sample2.image_id, sample2.label)):\n    plt.subplot(1, 3, ind + 1)\n    img = cv2.imread(os.path.join(WORK_DIR, \"train_images\", image_id))\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    plt.imshow(img)\n    plt.axis(\"off\")\n    \nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample3 = train[train.label == 3].sample(3)\nplt.figure(figsize=(15, 5))\nfor ind, (image_id, label) in enumerate(zip(sample3.image_id, sample3.label)):\n    plt.subplot(1, 3, ind + 1)\n    img = cv2.imread(os.path.join(WORK_DIR, \"train_images\", image_id))\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    plt.imshow(img)\n    plt.axis(\"off\")\n    \nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample4 = train[train.label == 4].sample(3)\nplt.figure(figsize=(15, 5))\nfor ind, (image_id, label) in enumerate(zip(sample4.image_id, sample4.label)):\n    plt.subplot(1, 3, ind + 1)\n    img = cv2.imread(os.path.join(WORK_DIR, \"train_images\", image_id))\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    plt.imshow(img)\n    plt.axis(\"off\")\n    \nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train['label'] = train['label'].astype('string')\n#ImageDataGenerator \ntrain_datagen = ImageDataGenerator(rotation_range = 45, \n                                  zoom_range = 0.2,\n                                  horizontal_flip = True, \n                                  fill_mode = \"nearest\",  \n                                  height_shift_range = 0.1,\n                                  width_shift_range = 0.1,\n                                  rescale=1/255,\n                                  validation_split = 0.2\n                                  )\ntrain_generator = train_datagen.flow_from_dataframe(dataframe = train,\n                         directory = os.path.join(WORK_DIR, \"train_images\"),\n                         subset = \"training\", \n                         x_col = \"image_id\",\n                         y_col = \"label\",\n                         target_size = (224, 224),\n                         class_mode = \"sparse\")\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"validation_datagen = ImageDataGenerator(validation_split = 0.2,\n                                       rescale=1/255)\nvalidation_generator = validation_datagen.flow_from_dataframe(dataframe =train,\n                         directory = os.path.join(WORK_DIR, \"train_images\"),\n                         subset = \"validation\",\n                         x_col = \"image_id\",\n                         y_col = \"label\",\n                         target_size = (224, 224),                                     \n                         class_mode = \"sparse\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_path = os.path.join(WORK_DIR, \"train_images\", train.image_id[80])\nimg = image.load_img(img_path)\nimg_tensor = image.img_to_array(img) #形成数组\nimg_tensor = np.expand_dims(img_tensor, axis = 0) #拓展维度，shape从前面增加一维\n#img_tensor = img_tensor/255.0\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.imshow(img_tensor[0])\nplt.axis('off')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"generator = train_datagen.flow_from_dataframe(train.iloc[80:81],\n                         directory = os.path.join(WORK_DIR, \"train_images\"),\n                         x_col = \"image_id\",\n                         y_col = \"label\",\n                         class_mode = \"sparse\")\n\naug_images = [generator[0][0][0]/255 for i in range(6)]\nfig, axes = plt.subplots(2, 3, figsize = (50, 50))\naxes = axes.flatten()\nfor img, ax in zip(aug_images, axes):\n    ax.imshow(img)\n    ax.axis('off')\nplt.tight_layout()\nplt.show()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#save the best model&set up lr\n#checkpointer = ModelCheckpoint(filepath='weights_best_Reset50_model.hdf5',\n#                               monitor='val_accuracy', verbose=1, save_best_only=True, mode='max')\n \n#reduce = ReduceLROnPlateau(monitor='val_accuracy', patience=10,\n#                           verbose=1,\n#                           factor=0.5,\n#                           min_lr=1e-6)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#model = tf.keras.Sequential()   \n#model.add(tf.keras.layers.Conv2D(64, (3, 3), input_shape=(256, 256, 3), activation='relu'))\n#model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))\n#model.add(tf.keras.layers.MaxPooling2D())\n#model.add(tf.keras.layers.Conv2D(128, (3, 3), activation='relu'))\n#model.add(tf.keras.layers.Conv2D(128, (3, 3), activation='relu'))\n#model.add(tf.keras.layers.MaxPooling2D())\n#model.add(tf.keras.layers.Conv2D(256, (3, 3), activation='relu'))\n#model.add(tf.keras.layers.Conv2D(256, (3, 3), activation='relu'))\n#model.add(tf.keras.layers.MaxPooling2D())\n#model.add(tf.keras.layers.Conv2D(512, (3, 3), activation='relu'))\n#model.add(tf.keras.layers.Conv2D(512, (3, 3), activation='relu'))\n#model.add(tf.keras.layers.MaxPooling2D())\n#model.add(tf.keras.layers.Conv2D(512, (3, 3), activation='relu'))\n#model.add(tf.keras.layers.Conv2D(512, (3, 3), activation='relu'))\n#model.add(tf.keras.layers.Conv2D(512, (3, 3), activation='relu'))\n#model.add(tf.keras.layers.GlobalAveragePooling2D())\n#model.add(tf.keras.layers.Dense(1024, activation='relu'))\n#model.add(tf.keras.layers.Dense(256, activation='relu'))\n#model.add(tf.keras.layers.Dense(5, activation='softmax'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Model AlexNet\n\n#model = tf.keras.Sequential() \n#model.add(tf.keras.layers.Conv2D(input_shape=(224,224,3),filters=96,kernel_size=(11,11),strides=(4,4),padding=\"valid\", activation=\"relu\"))\n#model.add(tf.keras.layers.MaxPooling2D(pool_size=(3,3),strides=(2,2)))\n#model.add(tf.keras.layers.Conv2D(256, kernel_size=(5,5), padding=\"same\",strides=(1,1), activation=\"relu\"))\n#model.add(tf.keras.layers.MaxPooling2D(pool_size=(3,3),strides=(2,2)))\n#model.add(tf.keras.layers.Conv2D(384, kernel_size=(3,3), padding=\"same\", strides=(1,1), activation=\"relu\"))\n#model.add(tf.keras.layers.Conv2D(384, kernel_size=(3,3), padding=\"same\", strides=(1,1), activation=\"relu\"))\n#model.add(tf.keras.layers.Conv2D(256, kernel_size=(3,3), padding=\"same\", strides=(1,1), activation=\"relu\"))\n#model.add(tf.keras.layers.MaxPooling2D(pool_size=(3,3),strides=(2,2)))\n#model.add(tf.keras.layers.Flatten())\n#model.add(tf.keras.layers.Dense(4096,activation=\"relu\"))\n#model.add(tf.keras.layers.Dense(4096,activation=\"relu\"))\n#model.add(tf.keras.layers.Dense(5, activation=\"softmax\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Model Resnet50\nbase = ResNet50(weights='imagenet',include_top=False, input_shape=[224, 224, 3])\nmodel = tf.keras.Sequential()\nmodel.add(base)\nmodel.add(tf.keras.layers.BatchNormalization(axis=-1))\nmodel.add(tf.keras.layers.GlobalAveragePooling2D())\nmodel.add(tf.keras.layers.Dropout(0.5))\nmodel.add(tf.keras.layers.Dense(256, activation='relu'))\nmodel.add(tf.keras.layers.Dense(5, activation='softmax'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(optimizer=Adam(lr = 0.001),\n              loss='sparse_categorical_crossentropy',\n              metrics=['accuracy'])\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs = 30\nbatch_size = 64","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#save the best model&set up lr\nmodel_save = ModelCheckpoint(filepath='weights_best_Reset50_model.hdf5',\n                            monitor='val_accuracy',\n                            verbose=1,\n                            save_best_only=True,\n                            mode='max'\n                            )\nearly_stop = EarlyStopping(monitor = 'val_loss',\n                           min_delta = 0.001,\n                           patience = 5,\n                           mode ='min', \n                           verbose =1 \n                           )\nreduce_lr = ReduceLROnPlateau(monitor='val_loss', \n                              verbose=1,\n                              factor=0.5,\n                              min_delta=0.001,\n                              mode = 'min'\n                             )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"his = model.fit(x=train_generator,   \n                steps_per_epoch=17118// batch_size, \n                epochs= epochs, \n                validation_data=validation_generator,\n                validation_steps = 4279//batch_size,\n                callbacks = [model_save, early_stop, reduce_lr],\n                verbose = 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(his.history['accuracy'])\nplt.plot(his.history['val_accuracy'])\nplt.title('model accuracy')\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['train', 'validation'], loc='lower right')\nplt.show()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(his.history['loss'])\nplt.plot(his.history['val_loss'])\nplt.title('model loss')\nplt.ylabel('loss')\nplt.xlabel('epoch')\nplt.legend(['train', 'test'], loc='upper right')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#prediction\nss = pd.read_csv(os.path.join(WORK_DIR, \"sample_submission.csv\"))\nss","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"preds = []\n\nfor image_id in ss.image_id:\n    image = Image.open(os.path.join(WORK_DIR,  \"test_images\", image_id))\n    image = image.resize((224, 224))\n    image = np.expand_dims(image, axis = 0)\n    preds.append(np.argmax(model.predict(image)))\n\nss['label'] = preds\nss","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ss.to_csv('submission.csv', index = False)","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}