Skip to content

Instantly share code, notes, and snippets.

@g-meghana-reddy
Created November 8, 2018 16:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save g-meghana-reddy/41543c723f7abd454e36758f9214f903 to your computer and use it in GitHub Desktop.
Save g-meghana-reddy/41543c723f7abd454e36758f9214f903 to your computer and use it in GitHub Desktop.
Copy of lesson2-download.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Copy of lesson2-download.ipynb",
"version": "0.3.2",
"provenance": [],
"collapsed_sections": [
"9J2bvPx-h0UC",
"OrWzMBDwh0UO",
"HOv4hxcuh0Ub",
"Qo4Uhp41h0Um"
],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/g-meghana-reddy/41543c723f7abd454e36758f9214f903/copy-of-lesson2-download.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"metadata": {
"hide_input": false,
"id": "osc9U-Bjh0RY",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Creating your own dataset from Google Images\n",
"\n",
"*by: Francisco Ingham and Jeremy Howard. Inspired by [Adrian Rosebrock](https://www.pyimagesearch.com/2017/12/04/how-to-create-a-deep-learning-dataset-using-google-images/)*"
]
},
{
"metadata": {
"id": "ixy1hiuZmNNP",
"colab_type": "code",
"outputId": "001b8706-f923-4767-9cae-e19733929b30",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1287
}
},
"cell_type": "code",
"source": [
"!curl https://course-v3.fast.ai/setup/colab | bash"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
" Dload Upload Total Spent Left Speed\n",
"100 665 100 665 0 0 118 0 0:00:05 0:00:05 --:--:-- 162\n",
"Collecting pillow==4.1.1\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/36/e5/88b3d60924a3f8476fa74ec086f5fbaba56dd6cee0d82845f883b6b6dd18/Pillow-4.1.1-cp36-cp36m-manylinux1_x86_64.whl (5.7MB)\n",
"\u001b[K 100% |████████████████████████████████| 5.7MB 1.2MB/s \n",
"\u001b[?25hRequirement already satisfied, skipping upgrade: olefile in /usr/local/lib/python3.6/dist-packages (from pillow==4.1.1) (0.46)\n",
"Installing collected packages: pillow\n",
" Found existing installation: Pillow 4.0.0\n",
" Uninstalling Pillow-4.0.0:\n",
" Successfully uninstalled Pillow-4.0.0\n",
"Successfully installed pillow-4.1.1\n",
"Looking in links: https://download.pytorch.org/whl/nightly/cu92/torch_nightly.html\n",
"Collecting torch_nightly\n",
"\u001b[?25l Downloading https://download.pytorch.org/whl/nightly/cu92/torch_nightly-1.0.0.dev20181106-cp36-cp36m-linux_x86_64.whl (582.7MB)\n",
"\u001b[K 100% |████████████████████████████████| 582.7MB 28kB/s \n",
"tcmalloc: large alloc 1073750016 bytes == 0x60f1c000 @ 0x7fd346f552a4 0x594e17 0x626104 0x51190a 0x4f5277 0x510c78 0x5119bd 0x4f5277 0x4f3338 0x510fb0 0x5119bd 0x4f5277 0x4f3338 0x510fb0 0x5119bd 0x4f5277 0x4f3338 0x510fb0 0x5119bd 0x4f6070 0x510c78 0x5119bd 0x4f5277 0x4f3338 0x510fb0 0x5119bd 0x4f6070 0x4f3338 0x510fb0 0x5119bd 0x4f6070\n",
"\u001b[?25hInstalling collected packages: torch-nightly\n",
"Successfully installed torch-nightly-1.0.0.dev20181106\n",
"Cloning into 'course-v3'...\n",
"remote: Enumerating objects: 90, done.\u001b[K\n",
"remote: Counting objects: 100% (90/90), done.\u001b[K\n",
"remote: Compressing objects: 100% (47/47), done.\u001b[K\n",
"remote: Total 2190 (delta 41), reused 75 (delta 38), pack-reused 2100\u001b[K\n",
"Receiving objects: 100% (2190/2190), 45.40 MiB | 21.33 MiB/s, done.\n",
"Resolving deltas: 100% (1200/1200), done.\n",
"Collecting fastai\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/d0/86/15da1f213dc85b86ac1aac58a62e5efe892866f8c966d1870355f58f42b1/fastai-1.0.20-py3-none-any.whl (114kB)\n",
"\u001b[K 100% |████████████████████████████████| 122kB 4.9MB/s \n",
"\u001b[?25hRequirement already satisfied, skipping upgrade: regex in /usr/local/lib/python3.6/dist-packages (from fastai) (2018.1.10)\n",
"Requirement already satisfied, skipping upgrade: numpy>=1.12 in /usr/local/lib/python3.6/dist-packages (from fastai) (1.14.6)\n",
"Requirement already satisfied, skipping upgrade: cymem==2.0.2 in /usr/local/lib/python3.6/dist-packages (from fastai) (2.0.2)\n",
"Requirement already satisfied, skipping upgrade: typing in /usr/local/lib/python3.6/dist-packages (from fastai) (3.6.6)\n",
"Requirement already satisfied, skipping upgrade: scipy in /usr/local/lib/python3.6/dist-packages (from fastai) (0.19.1)\n",
"Requirement already satisfied, skipping upgrade: Pillow in /usr/local/lib/python3.6/dist-packages (from fastai) (4.1.1)\n",
"Requirement already satisfied, skipping upgrade: thinc==6.12.0 in /usr/local/lib/python3.6/dist-packages (from fastai) (6.12.0)\n",
"Requirement already satisfied, skipping upgrade: pyyaml in /usr/local/lib/python3.6/dist-packages (from fastai) (3.13)\n",
"Collecting fastprogress>=0.1.15 (from fastai)\n",
" Downloading https://files.pythonhosted.org/packages/dc/b8/7ce2b3c6f886f5cb1b16e62d368456b4fdb7e16bba962571bc50dae49b30/fastprogress-0.1.15-py3-none-any.whl\n",
"Requirement already satisfied, skipping upgrade: spacy==2.0.16 in /usr/local/lib/python3.6/dist-packages (from fastai) (2.0.16)\n",
"Collecting torchvision-nightly (from fastai)\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/ca/bd/d0f9a33c81c79710eb7ee428b66869b49a8be16c7f1e446c211a7fbfb7be/torchvision_nightly-0.2.1-py2.py3-none-any.whl (54kB)\n",
"\u001b[K 100% |████████████████████████████████| 61kB 22.5MB/s \n",
"\u001b[?25hCollecting dataclasses (from fastai)\n",
" Downloading https://files.pythonhosted.org/packages/26/2f/1095cdc2868052dd1e64520f7c0d5c8c550ad297e944e641dbf1ffbb9a5d/dataclasses-0.6-py3-none-any.whl\n",
"Requirement already satisfied, skipping upgrade: matplotlib in /usr/local/lib/python3.6/dist-packages (from fastai) (2.1.2)\n",
"Requirement already satisfied, skipping upgrade: pandas in /usr/local/lib/python3.6/dist-packages (from fastai) (0.22.0)\n",
"Requirement already satisfied, skipping upgrade: requests in /usr/local/lib/python3.6/dist-packages (from fastai) (2.18.4)\n",
"Requirement already satisfied, skipping upgrade: olefile in /usr/local/lib/python3.6/dist-packages (from Pillow->fastai) (0.46)\n",
"Requirement already satisfied, skipping upgrade: plac<1.0.0,>=0.9.6 in /usr/local/lib/python3.6/dist-packages (from thinc==6.12.0->fastai) (0.9.6)\n",
"Requirement already satisfied, skipping upgrade: tqdm<5.0.0,>=4.10.0 in /usr/local/lib/python3.6/dist-packages (from thinc==6.12.0->fastai) (4.28.1)\n",
"Requirement already satisfied, skipping upgrade: msgpack-numpy<0.4.4.0 in /usr/local/lib/python3.6/dist-packages (from thinc==6.12.0->fastai) (0.4.3.2)\n",
"Requirement already satisfied, skipping upgrade: dill<0.3.0,>=0.2.7 in /usr/local/lib/python3.6/dist-packages (from thinc==6.12.0->fastai) (0.2.8.2)\n",
"Requirement already satisfied, skipping upgrade: wrapt<1.11.0,>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from thinc==6.12.0->fastai) (1.10.11)\n",
"Requirement already satisfied, skipping upgrade: cytoolz<0.10,>=0.9.0 in /usr/local/lib/python3.6/dist-packages (from thinc==6.12.0->fastai) (0.9.0.1)\n",
"Requirement already satisfied, skipping upgrade: murmurhash<1.1.0,>=0.28.0 in /usr/local/lib/python3.6/dist-packages (from thinc==6.12.0->fastai) (1.0.1)\n",
"Requirement already satisfied, skipping upgrade: preshed<3.0.0,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from thinc==6.12.0->fastai) (2.0.1)\n",
"Requirement already satisfied, skipping upgrade: six<2.0.0,>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from thinc==6.12.0->fastai) (1.11.0)\n",
"Requirement already satisfied, skipping upgrade: msgpack<1.0.0,>=0.5.6 in /usr/local/lib/python3.6/dist-packages (from thinc==6.12.0->fastai) (0.5.6)\n",
"Requirement already satisfied, skipping upgrade: ujson>=1.35 in /usr/local/lib/python3.6/dist-packages (from spacy==2.0.16->fastai) (1.35)\n",
"Requirement already satisfied, skipping upgrade: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->fastai) (0.10.0)\n",
"Requirement already satisfied, skipping upgrade: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->fastai) (2.3.0)\n",
"Requirement already satisfied, skipping upgrade: pytz in /usr/local/lib/python3.6/dist-packages (from matplotlib->fastai) (2018.7)\n",
"Requirement already satisfied, skipping upgrade: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->fastai) (2.5.3)\n",
"Requirement already satisfied, skipping upgrade: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->fastai) (3.0.4)\n",
"Requirement already satisfied, skipping upgrade: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->fastai) (2018.10.15)\n",
"Requirement already satisfied, skipping upgrade: idna<2.7,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->fastai) (2.6)\n",
"Requirement already satisfied, skipping upgrade: urllib3<1.23,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->fastai) (1.22)\n",
"Requirement already satisfied, skipping upgrade: toolz>=0.8.0 in /usr/local/lib/python3.6/dist-packages (from cytoolz<0.10,>=0.9.0->thinc==6.12.0->fastai) (0.9.0)\n",
"Installing collected packages: fastprogress, torchvision-nightly, dataclasses, fastai\n",
"Successfully installed dataclasses-0.6 fastai-1.0.20 fastprogress-0.1.15 torchvision-nightly-0.2.1\n",
"Already up to date.\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "i5plFY4HEmeT",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"%reload_ext autoreload\n",
"%autoreload 2\n",
"%matplotlib inline"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"hide_input": false,
"id": "lyXBEv9qh0Rj",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"from fastai import *\n",
"from fastai.vision import *"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "-Jx-ktnjKMga",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "0973dfed-0cc5-4582-d5f3-f9bff7ee6812"
},
"cell_type": "code",
"source": [
"!ls"
],
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": [
"course-v3 data models\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "vzlst8xNh0Rq",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"folder = 'BANDHANI'\n",
"file = 'BANDHANI.txt'\n",
"path=Path('/content')\n",
"dest = path/folder\n",
"download_images(path/file, dest, max_pics=500)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "9tVIryS_h0Ru",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"folder = 'CHIKANKARI'\n",
"file = 'CHIKANKARI.txt'\n",
"path=Path('/content')\n",
"dest = path/folder\n",
"download_images(path/file, dest, max_pics=500)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "kir30ZrSh0Rx",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"folder = 'CHANDERI'\n",
"file = 'CHANDERI.txt'\n",
"path=Path('/content')\n",
"dest = path/folder\n",
"download_images(path/file, dest, max_pics=500)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "zfVyBlVjOM5m",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"folder = 'KALAMKARI'\n",
"file = 'KALAMKARI.txt'\n",
"path=Path('/content')\n",
"dest = path/folder\n",
"download_images(path/file, dest, max_pics=500)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "CJjPnog1OSJO",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"folder = 'PHULKARI'\n",
"file = 'PHULKARI.txt'\n",
"path=Path('/content')\n",
"dest = path/folder\n",
"download_images(path/file, dest, max_pics=500)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "yQdPSv1WOZvx",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"folder = 'POCHAMPALLI'\n",
"file = 'POCHAMPALLI.txt'\n",
"path=Path('/content')\n",
"dest = path/folder\n",
"download_images(path/file, dest, max_pics=500)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "AJgoH-CROamH",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"folder = 'SHISHA'\n",
"file = 'SHISHA.txt'\n",
"path=Path('/content')\n",
"dest = path/folder\n",
"download_images(path/file, dest, max_pics=500)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "pMWcDWPbh0R_",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"classes = ['BANDHANI','CHIKANKARI','CHANDERI','POCHAMPALLI','SHISHA','KALMAKARI','PHULKARI']"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "P6yklGqAm5yL",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"path=Path('/content')"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "cf1DGzf9h0SI",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Then we can remove any images that can't be opened:"
]
},
{
"metadata": {
"id": "5q-5ndeth0SK",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"for c in classes:\n",
" print(c)\n",
" verify_images(path/c, delete=True, max_workers=8)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "OxhFTNfah0SS",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## View data"
]
},
{
"metadata": {
"id": "ktErnFuuh0ST",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"np.random.seed(42)\n",
"data = ImageDataBunch.from_folder(path, train=\".\", valid_pct=0.2,\n",
" ds_tfms=get_transforms(), size=224, num_workers=4).normalize(imagenet_stats)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "k5GW1-S8h0Sn",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Train model"
]
},
{
"metadata": {
"id": "qNoIHXGyh0So",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"learn = create_cnn(data, models.resnet34, metrics=error_rate)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "exUNZ67Mh0St",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 121
},
"outputId": "2f6f035b-ea61-4aa1-8bc1-2a99a59040e6"
},
"cell_type": "code",
"source": [
"learn.fit_one_cycle(3)"
],
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"text": [
"Total time: 04:30\n",
"epoch train_loss valid_loss error_rate\n",
"1 1.752286 1.170152 0.422662 (01:31)\n",
"2 1.385326 1.106573 0.390288 (01:29)\n",
"3 1.209685 1.089605 0.386691 (01:29)\n",
"\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "tO2kqyA2h0S7",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 152
},
"outputId": "21cc01c7-485a-492b-c4fd-d89823738965"
},
"cell_type": "code",
"source": [
"learn.lr_find()"
],
"execution_count": 11,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" <div>\n",
" <style>\n",
" \t/* Turns off some styling */\n",
" \tprogress {\n",
"\n",
" \t/* gets rid of default border in Firefox and Opera. */\n",
" \tborder: none;\n",
"\n",
" \t/* Needs to be in here for Safari polyfill so background images work as expected. */\n",
" \tbackground-size: auto;\n",
" }\n",
"\n",
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
" background: #F44336;\n",
" }\n",
" </style>\n",
" <progress value='2' class='' max='3', style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
" 66.67% [2/3 02:38<01:19]\n",
" </div>\n",
" \n",
"<table style='width:300px; margin-bottom:10px'>\n",
" <tr>\n",
" <th>epoch</th>\n",
" <th>train_loss</th>\n",
" <th>valid_loss</th>\n",
" <th>error_rate</th>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <th>0.942545</th>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <th>1.268589</th>\n",
" </tr>\n",
" <tr>\n",
"\n",
" </tr>\n",
"</table>\n",
"\n",
"\n",
" <div>\n",
" <style>\n",
" \t/* Turns off some styling */\n",
" \tprogress {\n",
"\n",
" \t/* gets rid of default border in Firefox and Opera. */\n",
" \tborder: none;\n",
"\n",
" \t/* Needs to be in here for Safari polyfill so background images work as expected. */\n",
" \tbackground-size: auto;\n",
" }\n",
"\n",
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
" background: #F44336;\n",
" }\n",
" </style>\n",
" <progress value='0' class='progress-bar-interrupted' max='34', style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
" Interrupted\n",
" </div>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "stream",
"text": [
"LR Finder complete, type {learner_name}.recorder.plot() to see the graph.\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "tjWE0eQ6h0S_",
"colab_type": "code",
"outputId": "5d9c2bd5-2bf2-4dc9-f818-bc45262cca50",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 347
}
},
"cell_type": "code",
"source": [
"learn.recorder.plot_losses()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n7qYAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc627c63588>"
]
},
"metadata": {
"tags": []
}
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment