{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"#EfficientNetB4","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"# Импорт необходимых библиотек\nimport os\nimport glob\nimport shutil\nimport json\nimport keras\nimport itertools\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport tensorflow as tf\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nfrom collections import Counter\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import GlobalAveragePooling2D, Flatten, Dense, Dropout\nfrom tensorflow.keras.optimizers import RMSprop, Adam\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau\nfrom tensorflow.keras.applications import EfficientNetB4\nfrom sklearn.model_selection import train_test_split\nfrom keras.preprocessing.image import ImageDataGenerator\nimport albumentations\n\n# Определение каталогов\nwork_dir = '../input/cassava-leaf-disease-classification/'\nos.listdir(work_dir) \ntrain_path = '/kaggle/input/cassava-leaf-disease-classification/train_images'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# датафрейм для train.csv\ndata = pd.read_csv(work_dir + 'train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"f = open(work_dir + 'label_num_to_disease_map.json')\nreal_labels = json.load(f)\nreal_labels = {int(k):v for k,v in real_labels.items()}\n\n# Определение рабочего набора данных\ndata['class_name'] = data.label.map(real_labels)\n\ntrain,val = train_test_split(data, test_size = 0.1, random_state = 42, stratify = data['class_name'])\n\nIMG_SIZE = 380\nsize = (IMG_SIZE,IMG_SIZE)\nn_CLASS = 5\nBATCH_SIZE = 16 #V2 -8, V3 - 16\n\ndatagen_train = ImageDataGenerator(\n                    preprocessing_function = tf.keras.applications.efficientnet.preprocess_input,\n                    rotation_range = 40, # Диапазон градусов сдля случайных вращений \n                    width_shift_range = 0.2,\n                    height_shift_range = 0.2,\n                    shear_range = 0.2, # угол сдвига против часовой стрелки\n                    zoom_range = 0.2,# Диапазон случайного увеличения\n                    horizontal_flip = True, # Произвольные повороты по \n                    vertical_flip = True,   # вертикали и горизонтали\n                    fill_mode = 'nearest') # По умолчанию \"близжайший\"\n\ndatagen_val = ImageDataGenerator(\n                    preprocessing_function = tf.keras.applications.efficientnet.preprocess_input,\n                    ) # Создание пакетов данных изображений с увеличением данных в реальном времени\n\ntrain_data = datagen_train.flow_from_dataframe(train,         # Создание датасета из файлов изображений в каталоге \n                             directory = train_path,\n                             seed=42, #seed для обеспечения повторяемости результатов\n                             x_col = 'image_id',\n                             y_col = 'class_name',\n                             target_size = size,\n                             #color_mode=\"rgb\",\n                             class_mode = 'categorical',\n                             interpolation = 'nearest', # Метод интрополяции\n                             shuffle = True,\n                             batch_size = BATCH_SIZE)\n\nval_data = datagen_val.flow_from_dataframe(val,\n                             directory = train_path,\n                             seed=42,\n                             x_col = 'image_id',\n                             y_col = 'class_name',\n                             target_size = size,\n                             #color_mode=\"rgb\",\n                             class_mode = 'categorical',\n                             interpolation = 'nearest',\n                             shuffle = True,\n                             batch_size = BATCH_SIZE)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def create_model():\n    \n    model = Sequential()    # Последовательный\n    model.add(EfficientNetB4(input_shape = (IMG_SIZE, IMG_SIZE, 3), include_top = False, \n                             weights = '../input/tfkerasefficientnetimagenetnotop/efficientnetb4_notop.h5', \n                             drop_connect_rate=0.4))\n    model.add(GlobalAveragePooling2D())\n    model.add(Flatten())\n    model.add(Dense(512, activation = 'relu', bias_regularizer=tf.keras.regularizers.L1L2(l1=0.01, l2=0.001)))\n    model.add(Dropout(0.5))\n    model.add(Dense(n_CLASS, activation = 'softmax'))\n    \n    return model\n\nleaf_model = create_model()\nleaf_model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"EPOCHS = 12 #V2 -7, V3 - 7\nSST = train_data.n//train_data.batch_size\nSSV = val_data.n//val_data.batch_size","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def model_fitter():\n        \n    leaf_model = create_model()\n        \n    loss = tf.keras.losses.CategoricalCrossentropy(from_logits = False, label_smoothing=0.0001,name='categorical_crossentropy' )\n    # Вычисление потерь кроссэнтропии между метками и прогнозами\n    leaf_model.compile(optimizer = Adam(learning_rate = 1e-3), loss = loss, metrics = ['categorical_accuracy'])\n    \n    es = EarlyStopping(monitor='val_loss', mode='min', patience=3, restore_best_weights=True, verbose=1)\n    \n    checkpoint_cb = ModelCheckpoint(\"Cassava_best_model.h5\", save_best_only=True, monitor = 'val_loss', mode='min')\n    \n    reduce_lr = ReduceLROnPlateau(monitor = 'val_loss', factor = 0.3, patience = 2, min_lr = 1e-6, mode = 'min', verbose = 1)\n    \n    history = leaf_model.fit(train_data, validation_data = val_data, epochs= EPOCHS, batch_size = BATCH_SIZE,\n                             steps_per_epoch = SST,\n                             validation_steps = SSV,\n                             callbacks=[es, checkpoint_cb, reduce_lr])\n    \n    leaf_model.save('Cassava_model'+'.h5')  \n    \n    return history","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#def data_augment(image, label):\n    # data augmentation\n#    flag = 2 #random.randint(1,3)\n#    coef_1 = random.randint(75, 95) * 0.01\n#    coef_2 = random.randint(75, 95) * 0.01\n#    if flag == 1:\n#        image = tf.image.random_flip_left_right(image, seed=SEED)\n#    elif flag == 2:\n#        image = tf.image.random_flip_up_down(image, seed=SEED)\n#    else:\n#        image = tf.image.random_crop(image, [int(IMAGE_SIZE[0]*coef_1), int(IMAGE_SIZE[0]*coef_2), 3],seed=SEED)\n#    return image, label   ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"results = model_fitter()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# метрика оценки\n\nprint('Точность тренировки: ', max(results.history['categorical_accuracy']))\nprint('Точность проверки: ', max(results.history['val_categorical_accuracy']))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import keras\n\nfinal_model = keras.models.load_model('Cassava_best_model.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"TEST_DIR = '../input/cassava-leaf-disease-classification/test_images/'\ntest_images = os.listdir(TEST_DIR)\npredictions = []\n\nfor image in test_images:\n    img = Image.open(TEST_DIR + image)\n    img = img.resize(size)\n    img = np.expand_dims(img, axis=0)\n    predictions.extend(final_model.predict(img).argmax(axis = 1))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predictions","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Создание файла submission.csv\nsub = pd.DataFrame({'image_id': test_images, 'label': predictions})\ndisplay(sub)\nsub.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}