{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        os.path.join(dirname, filename)\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom glob import glob\nimport os\nfrom PIL import Image\nfrom matplotlib import patches\nimport time\nfrom sklearn.preprocessing import LabelEncoder\nimport seaborn as sns\nimport cv2\nfrom pathlib import Path\nfrom collections import Counter\nimport albumentations as al\nfrom albumentations.pytorch import ToTensor, ToTensorV2\n\n#bokeh.io.output_notebook(INLINE) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"total = pd.read_csv(\"../input/cassava-leaf-disease-classification/train.csv\")\ntotal.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#lets see some images\ntrain_dir = \"../input/cassava-leaf-disease-classification/train_images/\"\ntest_dir = \"../input/cassava-leaf-disease-classification/test_images/\"\n\ntrain_images = glob(train_dir + \"*\")\ntest_images = glob(test_dir + \"*\")\n\nprint(\"Total train images are \",len(train_images))\n\nprint(\"Total test images are \",len(test_images))\n\ndisease = {\"0\":\"Cassava Bacterial Blight (CBB)\",\n\"1\":\"Cassava Brown Streak Disease (CBSD)\",\n\"2\":\"Cassava Green Mottle (CGM)\",\n\"3\":\"Cassava Mosaic Disease (CMD)\",\n\"4\":\"Healthy\"\n}","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Train images are in ok, but we have nothing to check it on"},{"metadata":{"trusted":true},"cell_type":"code","source":"#Lets convert 18000 to train images and then rest to valid \ntrain = total[:18000]\nvalid = total[18000:]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train[\"disease\"] = train[\"label\"].astype(str).map(disease)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"le = LabelEncoder()\nle.fit(train['label'])\ntrain['label'] = le.transform(train['label'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(8,4))\nsns.countplot(y=\"disease\",data=train)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"tes = train[:9]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(30,25))\nfor iterator,filename in tes.iterrows():\n    images = Image.open(os.path.join(train_dir,filename[\"image_id\"]))\n    plt.subplot(3,3,iterator+1)\n    plt.imshow(images,cmap=plt.cm.bone)\n    plt.title( str(filename[\"disease\"]),fontsize=15)\n    \nplt.tight_layout()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Let's look at the dimension of 300 images"},{"metadata":{"trusted":true},"cell_type":"code","source":"shape = Counter()\nfor idx, fig in train[:300].iterrows():\n    image =cv2.imread(os.path.join(train_dir,fig['image_id']))\n    \n    shape.update(image.shape)\n \nprint(shape)\nprint(image.shape)\n    \n    \n    ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"As we can see, starting from top most of the images till 300 are the same shape, 600 x 800 X 3"},{"metadata":{"trusted":true},"cell_type":"code","source":"CBB = train[train['disease']==\"Cassava Bacterial Blight (CBB)\"].reset_index(drop=True)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def dis_plot(df):\n    plt.figure(figsize=(30,25))\n    df.reset_index(drop=True)\n    for idx,row in df.iterrows():\n        image = Image.open(os.path.join(train_dir,row[\"image_id\"]))\n        plt.subplot(3,2,idx+1)\n        plt.imshow(image,cmap=plt.cm.bone)\n        ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#                     CASSAVA BACTERIAL BLIGHT"},{"metadata":{},"cell_type":"markdown","source":"# **There are total 924 images in this class**"},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"dis_plot(CBB[:4])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# **Cassava Brown Streak Disease **"},{"metadata":{},"cell_type":"markdown","source":"# **There are total 1833 images in this class**"},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"CBSD = train[train[\"disease\"]==\"Cassava Brown Streak Disease (CBSD)\"].reset_index(drop=True)\ndis_plot(CBSD[:6])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#  Cassava Green Mottle "},{"metadata":{},"cell_type":"markdown","source":"# **There are total 2036 images in this class**"},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"CGM = train[train[\"disease\"]==\"Cassava Green Mottle (CGM)\"].reset_index(drop=True)\ndis_plot(CGM[:6])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# **Cassava Mosaic Disease**"},{"metadata":{},"cell_type":"markdown","source":"# **There are 11054 images in this class**"},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"CMD = train[train[\"disease\"]==\"Cassava Mosaic Disease (CMD)\"].reset_index(drop=True)\ndis_plot(CMD[:6])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# **Healthy**"},{"metadata":{},"cell_type":"markdown","source":"# **There are total 2153 healthy leaves**"},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"healthy = train[train[\"disease\"]==\"Healthy\"].reset_index(drop=True)\ndis_plot(healthy[:6])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train['label'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"mean = [0.4589, 0.5314, 0.3236]\nstd = [0.2272, 0.2297, 0.2200]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import torch\nfrom torch.utils.data import DataLoader,Dataset\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#using transforms\ntrain_transform = al.Compose([\n    al.RandomResizedCrop(256,256),\n    al.HorizontalFlip(p=0.5),\n    al.ShiftScaleRotate(p=0.5),\n    al.HueSaturationValue(\n    hue_shift_limit=0.2,\n    sat_shift_limit=0.2,\n    val_shift_limit=0.2,\n    p=0.5),\n    \n    al.RandomBrightnessContrast(\n    brightness_limit=(-0.1,0.1),\n    contrast_limit=(-0.1,0.1),\n    p=0.5),\n    \n    al.Normalize(\n    mean=mean,\n    std=std,\n    max_pixel_value=255,\n    p=1.0),\n\n    al.CoarseDropout(p=0.5),\n    al.Cutout(p=0.5),\nToTensorV2()],p=1.0)\n\nvalid_transform = al.Compose([\n    al.CenterCrop(256,256,p=1.0),\n    al.Resize(256,256),\n    al.Normalize(\n    mean=mean,\n    std=std,\n    max_pixel_value=255,\n    p=1.0),\n    ToTensorV2()\n    \n],p=1.0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train[:20][\"image_id\"].values\npath =Path(\"../input/cassava-leaf-disease-classification\")\ntrain_path =path/\"train_images\" ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class LeafData(Dataset):\n    def __init__(self, df, split=\"train\"):\n        if split == \"train\":\n            self.transforms = train_transform\n        elif split == \"val\":\n            self.transforms = valid_transform\n            \n        self.paths = [train_path/id_ for id_ in df['image_id'].values]\n        self.labels = df['label'].values\n    \n    def __getitem__(self, idx):\n        img = cv2.imread(str(self.paths[idx]))[..., ::-1] #\n        img = self.transforms(image=img)['image']\n        label = self.labels[idx]\n       \n        return img, label\n    \n    def __len__(self):\n        return len(self.paths)\n\ndef make_dataloaders(batch_size=32, num_workers=4, pin_memory=True, **kwargs):\n    dataset = LeafData(**kwargs)\n    dataloader = DataLoader(dataset, batch_size=batch_size, num_workers=num_workers,\n                            pin_memory=pin_memory, shuffle=True if kwargs['split'] == \"train\" else False)\n    return dataloader","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dl = make_dataloaders(df=train,split=\"train\")\nval_dl = make_dataloaders(df=valid,split=\"valid\")\nx,y = next(iter(train_dl))\nx.shape,y.shape,x.mean(dim=(0,2,3)),x.std(dim=(0,2,3))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"device = \"cuda\" if torch.cuda.is_available() else \"cpu\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def accuracy(preds,target):\n    preds = preds.argmax(dim=1)\n    return (preds==target).float().mean()\n\ndef one_epoch(model,dl,loss_func,opt=None,lr_schedule=None):\n    running_loss=0\n    running_acc =0\n    \n    for xb,yb in tqdm(dl):\n        xb,yb = xb.to(device),yb.to(device)\n        pred = model(xb)\n        loss = loss_func(pred,yb)\n        \n        if opt is not None:\n            opt.zero_grad()\n            loss.backward()\n            opt.step()\n            if lr_scheduler is not None:\n                lr_scheduler.step()\n            \n        running_acc+=accuracy(preds,yb)\n        running_loss+=loss.iten()\n    \n    return running_loss/len(dl), running_acc/len(dl) ","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":"","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":{"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}