{"cells":[{"metadata":{},"cell_type":"markdown","source":"## A simple way to calculating image stats using Cassava dataset.\n\nThe image size used in this notebook is **512 x 512**.\n\nYou can also use merged dataset([Discussion](http://www.kaggle.com/c/cassava-leaf-disease-classification/discussion/200201)).\n\nI am not sure if LB socre will increase after replacing imagenet mean&std with recalculated mean&std of Cassava dataset.\n\nI am still doing some experiments on local CV."},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nfrom matplotlib import pyplot as plt\nimport seaborn as sns\nimport sys\nimport math\nimport random\nimport shutil\nfrom tqdm.auto import tqdm\nimport cv2\nfrom PIL import Image\nimport torch\nfrom torch.utils.data import DataLoader, Dataset\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nfrom albumentations import ImageOnlyTransform\n\nimport warnings \nwarnings.filterwarnings('ignore')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"IMAGE_SIZE = 512\nN_CHANNELS = 3","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## original data\ntrain = pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')\n\n## merged previous competition data\n# train= pd.read_csv('../input/cassava-leaf-disease-merged/merged.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"TRAIN_PATH = '../input/cassava-leaf-disease-classification/train_images'\n# TRAIN_PATH = '../input/cassava-leaf-disease-merged/train'\nTEST_PATH = '../input/cassava-leaf-disease-classification/test_images'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# refer: https://www.kaggle.com/yasufuminakama/cassava-resnext50-32x4d-starter-training\n\n## dataset\n\nclass CassavaDataset(Dataset):\n    def __init__(self, df, transform=None):\n        self.df = df\n        self.file_names = df['image_id'].values\n        self.labels = df['label'].values\n        self.transform = transform\n        \n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        file_name = self.file_names[idx]\n        file_path = f'{TRAIN_PATH}/{file_name}'\n        image = cv2.imread(file_path)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        image = image / 255\n        if self.transform:\n            augmented = self.transform(image=image)\n            image = augmented['image']\n        label = torch.tensor(self.labels[idx]).long()\n        return image, label\n    \n## Transforms\ndef get_transforms():\n    return A.Compose([\n            A.Resize(IMAGE_SIZE, IMAGE_SIZE),\n            ToTensorV2(),\n        ])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## display image without transform\ntrain_dataset = CassavaDataset(train, transform=None)\n\nfor i in range(1):\n    image, label = train_dataset[i]\n    plt.imshow(image)\n    plt.title(f'label: {label}')\n    plt.show() ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"## display image with transform\ntrain_dataset = CassavaDataset(train, transform=get_transforms())\n\nfor i in range(1):\n    image, label = train_dataset[i]\n    plt.imshow(image[0])\n    plt.title(f'label: {label}')\n    plt.show() ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dataset = CassavaDataset(train,transform=get_transforms())\ntrain_loader = DataLoader(train_dataset, \n                              batch_size=1,\n                              shuffle=False, \n                              num_workers=os.cpu_count(), pin_memory=True, drop_last=False)\n\nmean = torch.zeros(N_CHANNELS)\nstd = torch.zeros(N_CHANNELS)\nprint('==> Computing mean and std..')\nfor inputs, _labels in tqdm(train_loader):\n    for i in range(N_CHANNELS):\n        mean[i] += torch.Tensor.float(inputs[:,i,:,:]).mean()\n        std[i] += torch.Tensor.float(inputs[:,i,:,:]).std()\nmean.div_(len(train))\nstd.div_(len(train))\nprint(f'mean={mean}, std={std}')","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}