{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "# Loading Image Dataset\r\n",
    "\r\n",
    "`Ascend` `GPU` `CPU` `Data Preparation`\r\n",
    "\r\n",
    "[![](https://gitee.com/mindspore/docs/raw/r1.5/resource/_static/logo_source_en.png)](https://gitee.com/mindspore/docs/blob/r1.5/docs/mindspore/programming_guide/source_en/load_dataset_image.ipynb) [![](https://gitee.com/mindspore/docs/raw/r1.5/resource/_static/logo_notebook_en.png)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/r1.5/programming_guide/en/mindspore_load_dataset_image.ipynb) [![](https://gitee.com/mindspore/docs/raw/r1.5/resource/_static/logo_modelarts_en.png)](https://authoring-modelarts-cnnorth4.huaweicloud.com/console/lab?share-url-b64=aHR0cHM6Ly9taW5kc3BvcmUtd2Vic2l0ZS5vYnMuY24tbm9ydGgtNC5teWh1YXdlaWNsb3VkLmNvbS9ub3RlYm9vay9tYXN0ZXIvcHJvZ3JhbW1pbmdfZ3VpZGUvZW4vbWluZHNwb3JlX2xvYWRfZGF0YXNldF9pbWFnZS5pcHluYg==&imageid=65f636a0-56cf-49df-b941-7d2a07ba8c8c)"
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Overview\n",
    "\n",
    "In computer vision training tasks, it is often difficult to read the entire dataset directly into memory due to memory capacity. The `mindspore.dataset` module provided by MindSpore enables users to customize their data fetching strategy from disk. At the same time, data processing and data augmentation operators are applied to the data. Pipelined data processing produces a continuous flow of data to the training network, improving overall performance.\n",
    "\n",
    "In addition, MindSpore supports data loading in distributed scenarios. Users can define the number of shards while loading. For more details, see [Loading the Dataset in Data Parallel Mode](https://www.mindspore.cn/docs/programming_guide/en/r1.5/distributed_training_ascend.html#loading-the-dataset-in-data-parallel-mode).\n",
    "\n",
    "This tutorial uses the [MNIST dataset [1]](#references) as an example to demonstrate how to load and process image data using MindSpore.\n",
    "\n",
    "## Preparations\n",
    "\n",
    "### Importing Module\n",
    "\n",
    "This module provides APIs to load and process data sets."
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "source": [
    "import mindspore.dataset as ds"
   ],
   "outputs": [],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "### Downloading Dataset\n",
    "\n",
    "put the dataset in the path `./datasets/MNIST_Data`, the directory structure is as follows:\n",
    "\n",
    "```text\n",
    "./datasets/MNIST_Data\n",
    "├── test\n",
    "│   ├── t10k-images-idx3-ubyte\n",
    "│   └── t10k-labels-idx1-ubyte\n",
    "└── train\n",
    "    ├── train-images-idx3-ubyte\n",
    "    └── train-labels-idx1-ubyte\n",
    "```\n",
    "Run the following command in jupyter notebook to download the training images and labels of the MNIST dataset:"
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "source": [
    "!mkdir -p ./datasets/MNIST_Data/train ./datasets/MNIST_Data/test\n",
    "!wget -NP ./datasets/MNIST_Data/train https://mindspore-website.obs.myhuaweicloud.com/notebook/datasets/mnist/train-labels-idx1-ubyte --no-check-certificate\n",
    "!wget -NP ./datasets/MNIST_Data/train https://mindspore-website.obs.myhuaweicloud.com/notebook/datasets/mnist/train-images-idx3-ubyte --no-check-certificate\n",
    "!wget -NP ./datasets/MNIST_Data/test https://mindspore-website.obs.myhuaweicloud.com/notebook/datasets/mnist/t10k-labels-idx1-ubyte --no-check-certificate\n",
    "!wget -NP ./datasets/MNIST_Data/test https://mindspore-website.obs.myhuaweicloud.com/notebook/datasets/mnist/t10k-images-idx3-ubyte --no-check-certificate"
   ],
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "./datasets/MNIST_Data\n",
      "├── test\n",
      "│   ├── t10k-images-idx3-ubyte\n",
      "│   └── t10k-labels-idx1-ubyte\n",
      "└── train\n",
      "    ├── train-images-idx3-ubyte\n",
      "    └── train-labels-idx1-ubyte\n",
      "\n",
      "2 directories, 4 files\n"
     ]
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Loading Dataset\n",
    "\n",
    "MindSpore supports loading common datasets in the field of image processing that come in a variety of on-disk formats. Users can also implement custom dataset class to load customized data. For the detailed loading method of various datasets, please refer to the [Loading Dataset](https://www.mindspore.cn/docs/programming_guide/en/r1.5/dataset_loading.html) in the programming guide.\n",
    "\n",
    "The following tutorial shows how to load the MNIST dataset using the `MnistDataset` in the `mindspore.dataset` module.\n",
    "\n",
    "1. Configure the dataset directory and create the `MnistDataset`."
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "source": [
    "    DATA_DIR = './datasets/MNIST_Data/train'\n",
    "    mnist_dataset = ds.MnistDataset(DATA_DIR, num_samples=6, shuffle=False)"
   ],
   "outputs": [],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "2. Create an iterator then obtain data through the iterator."
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "source": [
    "    import matplotlib.pyplot as plt\n",
    "\n",
    "    mnist_it = mnist_dataset.create_dict_iterator()\n",
    "    data = next(mnist_it)\n",
    "    plt.imshow(data['image'].asnumpy().squeeze(), cmap=plt.cm.gray)\n",
    "    plt.title(data['label'].asnumpy(), fontsize=20)\n",
    "    plt.show()"
   ],
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAENCAYAAADJzhMWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAMaklEQVR4nO3dX6ik9X3H8fenJmnBeLFGul2MZtNUQiGlWkQKlWIpCdZeqDc2QsE0pZuLWhLIRcReRAiFUGzaQqF0Q2w2tjUEjFHE1lix2eQmuIrVVTFauxKX1Y0sbbQ3afTbi/OsPbuec+bs/Htmz/f9gmFmnjP7zHef3c/+/s3sL1WFpJ3vZ8YuQNJyGHapCcMuNWHYpSYMu9SEYZeaMOxSE4Zdp0hyJEltcntl7Po0vXeNXYBW0n8Df7XB8TeWXIfmKH6CTuslOQJQVXvHrUTzZjdeasJuvDbys0l+H7gY+B/gSeBgVb05blmahd14nWLoxn9ggx/9J/AHVfWd5VakebEbr9P9PfDbwC8A5wK/AvwdsBf45yS/Ol5pmoUtu7Ylye3AZ4FvVdX1Y9ejM2fYtS1Jfgl4HjhRVe8bux6dObvx2q4fDffnjlqFpmbYtV2/Pty/OGoVmpph19uS/HKSd7TcSfYCfzM8/YelFqW5cZ1d6/0e8NkkB4GXgNeBDwG/C/wc8ABw+3jlaRaGXes9AnwYuAz4DdbG5/8FfA+4E7iznNE9azkbLzXhmF1qwrBLTRh2qQnDLjWx1Nn4JM4GSgtWVdno+Ewte5KrkzyX5IUkt8xyLkmLNfXSW5JzgB8AHwVeBh4FbqyqZ7b4Nbbs0oItomW/Anihql6sqp8AXweuneF8khZolrBfCPxw3fOXh2OnSLIvyaEkh2Z4L0kzWvgEXVXtB/aD3XhpTLO07EeBi9Y9f/9wTNIKmiXsjwKXJPlgkvcAHwfum09ZkuZt6m58Vf00yc3Ag8A5wB1V9fTcKpM0V0v91ptjdmnxFvKhGklnD8MuNWHYpSYMu9SEYZeaMOxSE4ZdasKwS00YdqkJwy41YdilJgy71IRhl5ow7FIThl1qwrBLTRh2qQnDLjVh2KUmDLvUhGGXmjDsUhOGXWrCsEtNGHapCcMuNWHYpSYMu9SEYZeamHrLZp0dlrlLr/5fsuFGqqOaKexJjgCvA28CP62qy+dRlKT5m0fL/ltV9docziNpgRyzS03MGvYCvp3ksST7NnpBkn1JDiU5NON7SZpBZpnASXJhVR1N8vPAQ8CfVNXBLV7vbNGSOUE3jjEn6KpqwzefqWWvqqPD/XHgHuCKWc4naXGmDnuSc5Ocd/Ix8DHg8LwKkzRfs8zG7wbuGbor7wL+qar+ZS5V7TB2pbUKZhqzn/GbNR2zG/Z+dtyYXdLZw7BLTRh2qQnDLjVh2KUm/IrrHDjb3s8qfoV1Elt2qQnDLjVh2KUmDLvUhGGXmjDsUhOGXWrCdXatrLNxLXuV2bJLTRh2qQnDLjVh2KUmDLvUhGGXmjDsUhOus8/BpPXgnfx9986/97ONLbvUhGGXmjDsUhOGXWrCsEtNGHapCcMuNeE6+xKczWvRs36n3O+kr46JLXuSO5IcT3J43bHzkzyU5Pnhftdiy5Q0q+10478KXH3asVuAh6vqEuDh4bmkFTYx7FV1EDhx2uFrgQPD4wPAdfMtS9K8TTtm311Vx4bHrwC7N3thkn3AvinfR9KczDxBV1WVZNMZpqraD+wH2Op1khZr2qW3V5PsARjuj8+vJEmLMG3Y7wNuGh7fBNw7n3IkLUomrfEmuQu4CrgAeBX4PPAt4BvAxcBLwA1Vdfok3kbnshu/AGOu07uOvnqqasM/lIlhnyfDvhiGXettFnY/Lis1YdilJgy71IRhl5ow7FIThl1qwrBLTRh2qQnDLjVh2KUmDLvUhGGXmjDsUhP+V9I7wFbfPFv0N+IWeX6/UTdftuxSE4ZdasKwS00YdqkJwy41YdilJgy71ITr7Dvc2bxd9Db+m/MlVbIz2LJLTRh2qQnDLjVh2KUmDLvUhGGXmjDsUhOuszfnOnwfE1v2JHckOZ7k8LpjtyU5muSJ4XbNYsuUNKvtdOO/Cly9wfG/rKpLh9sD8y1L0rxNDHtVHQROLKEWSQs0ywTdzUmeHLr5uzZ7UZJ9SQ4lOTTDe0maUbYzAZNkL3B/VX1keL4beA0o4AvAnqr65DbOs7qzPdrQKk/QTdJ1gq6qNvyNT9WyV9WrVfVmVb0FfBm4YpbiJC3eVGFPsmfd0+uBw5u9VtJqmLjOnuQu4CrggiQvA58HrkpyKWvd+CPApxZXosZ0Nq/D61TbGrPP7c0cs+84qxx2x+yn8uOyUhOGXWrCsEtNGHapCcMuNeFXXDWTWWa8x9xOuuNMvS271IRhl5ow7FIThl1qwrBLTRh2qQnDLjXhOru2tMrfatOZsWWXmjDsUhOGXWrCsEtNGHapCcMuNWHYpSZcZ9/hOq+Td/zO+lZs2aUmDLvUhGGXmjDsUhOGXWrCsEtNGHapiYlhT3JRkkeSPJPk6SSfHo6fn+ShJM8P97sWX25PVTX1bSdLsuVNp5q4ZXOSPcCeqno8yXnAY8B1wCeAE1X1xSS3ALuq6nMTzrWz//YtyE4P7bQM9Mam3rK5qo5V1ePD49eBZ4ELgWuBA8PLDrD2D4CkFXVGY/Yke4HLgO8Du6vq2PCjV4Dd8y1N0jxt+7PxSd4L3A18pqp+vL4LVVW1WRc9yT5g36yFSprNxDE7QJJ3A/cDD1bVl4ZjzwFXVdWxYVz/b1X14QnncfA5BcfsG3PMvrGpx+xZu6JfAZ49GfTBfcBNw+ObgHtnLVLS4mxnNv5K4LvAU8Bbw+FbWRu3fwO4GHgJuKGqTkw4V8smypZ5Orbc09msZd9WN35eDLvOhGGfztTdeEk7g2GXmjDsUhOGXWrCsEtNGHapCf8r6W1y+Ww6Lp+tDlt2qQnDLjVh2KUmDLvUhGGXmjDsUhOGXWqizTq76+TTcZ1857Bll5ow7FIThl1qwrBLTRh2qQnDLjVh2KUm2qyzd+U6uU6yZZeaMOxSE4ZdasKwS00YdqkJwy41YdilJiausye5CPgasBsoYH9V/XWS24A/An40vPTWqnpgUYXOyvVmdTdxf/Yke4A9VfV4kvOAx4DrgBuAN6rq9m2/WdP92aVl2mx/9okte1UdA44Nj19P8ixw4XzLk7RoZzRmT7IXuAz4/nDo5iRPJrkjya5Nfs2+JIeSHJqtVEmzmNiNf/uFyXuB7wB/VlXfTLIbeI21cfwXWOvqf3LCOezGSwu2WTd+W2FP8m7gfuDBqvrSBj/fC9xfVR+ZcB7DLi3YZmGf2I3P2jT2V4Bn1wd9mLg76Xrg8KxFSlqc7czGXwl8F3gKeGs4fCtwI3Apa934I8Cnhsm8rc5lyy4t2Ezd+Hkx7NLiTd2Nl7QzGHapCcMuNWHYpSYMu9SEYZeaMOxSE4ZdasKwS00YdqkJwy41YdilJgy71IRhl5pY9pbNrwEvrXt+wXBsFa1qbataF1jbtOZZ2wc2+8FSv8/+jjdPDlXV5aMVsIVVrW1V6wJrm9ayarMbLzVh2KUmxg77/pHffyurWtuq1gXWNq2l1DbqmF3S8ozdsktaEsMuNTFK2JNcneS5JC8kuWWMGjaT5EiSp5I8Mfb+dMMeeseTHF537PwkDyV5frjfcI+9kWq7LcnR4do9keSakWq7KMkjSZ5J8nSSTw/HR712W9S1lOu29DF7knOAHwAfBV4GHgVurKpnllrIJpIcAS6vqtE/gJHkN4E3gK+d3ForyZ8DJ6rqi8M/lLuq6nMrUtttnOE23guqbbNtxj/BiNduntufT2OMlv0K4IWqerGqfgJ8Hbh2hDpWXlUdBE6cdvha4MDw+ABrf1mWbpPaVkJVHauqx4fHrwMntxkf9dptUddSjBH2C4Efrnv+Mqu133sB307yWJJ9Yxezgd3rttl6Bdg9ZjEbmLiN9zKdts34yly7abY/n5UTdO90ZVX9GvA7wB8P3dWVVGtjsFVaO/1b4EOs7QF4DPiLMYsZthm/G/hMVf14/c/GvHYb1LWU6zZG2I8CF617/v7h2EqoqqPD/XHgHtaGHavk1ZM76A73x0eu521V9WpVvVlVbwFfZsRrN2wzfjfwj1X1zeHw6Nduo7qWdd3GCPujwCVJPpjkPcDHgftGqOMdkpw7TJyQ5FzgY6zeVtT3ATcNj28C7h2xllOsyjbem20zzsjXbvTtz6tq6TfgGtZm5P8D+NMxatikrl8E/n24PT12bcBdrHXr/pe1uY0/BN4HPAw8D/wrcP4K1XYna1t7P8lasPaMVNuVrHXRnwSeGG7XjH3ttqhrKdfNj8tKTThBJzVh2KUmDLvUhGGXmjDsUhOGXWrCsEtN/B/M3kbdmYwBvQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     }
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "In addition, users can pass in a `sampler` parameter to specify the sampling process during dataset loading. For the data samplers supported by MindSpore and their detailed usage methods, please refer to the programming guide [sampler](https://www.mindspore.cn/docs/programming_guide/en/r1.5/sampler.html).\n",
    "\n",
    "## Processing Data\n",
    "\n",
    "For the data processing operators currently supported by MindSpore and their detailed usage methods, please refer to the [Processing Data](https://www.mindspore.cn/docs/programming_guide/en/r1.5/pipeline.html) in the programming guide.\n",
    "\n",
    "The following tutorial demonstrates how to construct a pipeline and perform operations such as `shuffle`, `batch` and `repeat` on the MNIST dataset."
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "source": [
    "for data in mnist_dataset.create_dict_iterator():\n",
    "    print(data['label'])"
   ],
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "5\n",
      "0\n",
      "4\n",
      "1\n",
      "9\n",
      "2\n"
     ]
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "1. Shuffle the dataset."
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "source": [
    "    ds.config.set_seed(58)\n",
    "    ds1 = mnist_dataset.shuffle(buffer_size=6)\n",
    "\n",
    "    print('after shuffle: ')\n",
    "    for data in ds1.create_dict_iterator():\n",
    "        print(data['label'])"
   ],
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "after shuffle: \n",
      "4\n",
      "2\n",
      "1\n",
      "0\n",
      "5\n",
      "9\n"
     ]
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "2. Add `batch` after `shuffle`."
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "source": [
    "    ds2 = ds1.batch(batch_size=2)\n",
    "\n",
    "    print('after batch: ')\n",
    "    for data in ds2.create_dict_iterator():\n",
    "        print(data['label'])"
   ],
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "after batch: \n",
      "[4 2]\n",
      "[1 0]\n",
      "[5 9]\n"
     ]
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "3. Add `repeat` after `batch`."
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "source": [
    "    ds3 = ds2.repeat(count=2)\n",
    "\n",
    "    print('after repeat: ')\n",
    "    for data in ds3.create_dict_iterator():\n",
    "        print(data['label'])"
   ],
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "after repeat: \n",
      "[4 2]\n",
      "[1 0]\n",
      "[5 9]\n",
      "[2 4]\n",
      "[0 9]\n",
      "[1 5]\n"
     ]
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "The results show the dataset is repeated, and the order of the replica is different from that of the first copy. Having `repeat` in the pipeline results in the execution of repeated operations defined in the entire pipeline, instead of simply copying the current dataset. So the order of the replica is different from that of the first copy after `shuffle`.\n",
    "\n",
    "In addition, you need to pay attention to the sequence of repeat and batch operations: 1) Usually the batch operation is performed before the repeat operation. 2) If the batch operation is performed after the repeat operation, the batch operation will batch the data between the two epochs together (in some cases, swapping the order of batch and repeat will cause the number of batches contained in the dataset to be inconsistent, because the batch operator initialization contains the `drop_reminder` parameter, which is set to False by default)."
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Augmentation\n",
    "\n",
    "For the data augmentation operators supported by MindSpore and their detailed usage methods, please refer to the programming guide [Data Augmentation](https://www.mindspore.cn/docs/programming_guide/en/r1.5/augmentation.html).\n",
    "\n",
    "The following tutorial demonstrates how to use the `c_transforms` module to augment data in the MNIST dataset.\n",
    "\n",
    "1. Import related modules and load the dataset."
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "source": [
    "    from mindspore.dataset.vision import Inter\n",
    "    import mindspore.dataset.vision.c_transforms as transforms\n",
    "\n",
    "    mnist_dataset = ds.MnistDataset(DATA_DIR, num_samples=6, shuffle=False)"
   ],
   "outputs": [],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "2. Define augmentation operators and perform the `Resize` and `RandomCrop` operations on images in the dataset."
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "source": [
    "    resize_op = transforms.Resize(size=(200,200), interpolation=Inter.LINEAR)\n",
    "    crop_op = transforms.RandomCrop(150)\n",
    "    transforms_list = [resize_op, crop_op]\n",
    "    ds4 = mnist_dataset.map(operations=transforms_list,input_columns='image')"
   ],
   "outputs": [],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "3. Visualize the result of augmentation."
   ],
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "source": [
    "    mnist_it = ds4.create_dict_iterator()\n",
    "    data = next(mnist_it)\n",
    "    plt.imshow(data['image'].asnumpy().squeeze(), cmap=plt.cm.gray)\n",
    "    plt.title(data['label'].asnumpy(), fontsize=20)\n",
    "    plt.show()"
   ],
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     }
    }
   ],
   "metadata": {}
  },
  {
   "cell_type": "markdown",
   "source": [
    "The original image is scaled up then randomly cropped to 150 x 150.\n",
    "\n",
    "## References\n",
    "\n",
    "[1] Y. LeCun, L. Bottou, Y. Bengio, and P. Haffner. [Gradient-based learning applied to document recognition](http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf)."
   ],
   "metadata": {}
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}