{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "A3.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "OMKfmIeSvpae"
},
"source": [
"## Download the datasets and the models"
]
},
{
"cell_type": "code",
"metadata": {
"id": "QkDAyHwrBSPw",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "b42b491c-871d-4c27-b97c-3227287cdad2"
},
"source": [
"print('downloading dataset...')\n",
"!wget -nc https://www.di.ens.fr/willow/teaching/recvis18orig/assignment3/bird_dataset.zip\n",
"print('done!')\n",
"print('uncompressing...')\n",
"#q quiet o overwrite\n",
"!unzip -qo bird_dataset.zip \n",
"print('done!')"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"downloading dataset...\n",
"--2020-11-23 14:17:22-- https://www.di.ens.fr/willow/teaching/recvis18orig/assignment3/bird_dataset.zip\n",
"Resolving www.di.ens.fr (www.di.ens.fr)... 129.199.99.14\n",
"Connecting to www.di.ens.fr (www.di.ens.fr)|129.199.99.14|:443... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: unspecified [application/zip]\n",
"Saving to: ‘bird_dataset.zip’\n",
"\n",
"bird_dataset.zip [ <=> ] 183.48M 17.3MB/s in 11s \n",
"\n",
"2020-11-23 14:17:34 (16.0 MB/s) - ‘bird_dataset.zip’ saved [192388716]\n",
"\n",
"done!\n",
"uncompressing...\n",
"done!\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "V-pg-RKPw0Pb",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "ffbcd62d-d82f-4118-ef3e-a71d3d72c29a"
},
"source": [
"# nc to not download if it is already there, -P to indicate the direction folder \n",
"!wget -nc https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"File ‘resnet50_coco_best_v2.0.1.h5’ already there; not retrieving.\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "OqokyHSBy9vF"
},
"source": [
"# tensorflow and keras version compatible with imageAI\n",
"!pip install -U tensorflow==1.15.0 keras==2.3.1\n",
"!pip install -U imageai"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "aLZ9mWr3Jgyl"
},
"source": [
"### Imports"
]
},
{
"cell_type": "code",
"metadata": {
"id": "0UmzPJkMzWhq"
},
"source": [
"import time\n",
"import csv\n",
"import pandas as pd\n",
"import numpy as np\n",
"from PIL import Image \n",
"import copy\n",
"\n",
"from google.colab import files\n",
"\n",
"import torch\n",
"import torch.nn as nn\n",
"import torch.optim as optim\n",
"from torch.optim import lr_scheduler\n",
"from torchvision import datasets, models\n",
"import torchvision.transforms as transforms\n",
"from torch.autograd import Variable\n",
"from tqdm import tqdm\n",
"import shutil"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "qtYNx4OXan_0"
},
"source": [
"import tensorflow as tf \n",
"\n",
"# Detect if we have a GPU available\n",
"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "OVFPUQ30wlbm",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "f854b497-e156-4b9c-b869-f9a13a196c6f"
},
"source": [
"import os\n",
"execution_path = os.getcwd()\n",
"print(execution_path)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"/content\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-0lmSIQ5wdE7"
},
"source": [
"## Preprocess and create a cropped dataset"
]
},
{
"cell_type": "code",
"metadata": {
"id": "1KrGrryFG5QO"
},
"source": [
"# to create the output folder directories of imageAI crop\n",
"try:\n",
" os.mkdir(\"output_retina\")\n",
"except OSError:\n",
" _ = 1\n",
"try:\n",
" os.mkdir(\"output_crop\")\n",
"except OSError:\n",
" _ = 1\n",
"\n",
"for path, dirs, files in os.walk(\"bird_dataset\"):\n",
" path1 = \"output_retina/\"+path\n",
" try:\n",
" os.mkdir(path1)\n",
" except OSError:\n",
" _ = 1\n",
" path2 = \"output_crop/\"+path\n",
" try:\n",
" os.mkdir(path2)\n",
" except OSError:\n",
" _ = 1"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "68OhblAlBe5J",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "a2f96da8-cea1-4870-8a48-0149c5492f04"
},
"source": [
"data_transforms = None\n",
"train_loader = torch.utils.data.DataLoader(datasets.ImageFolder('bird_dataset/train_images'))\n",
"val_loader = torch.utils.data.DataLoader(datasets.ImageFolder('bird_dataset/val_images'))\n",
"test_loader = torch.utils.data.DataLoader(datasets.ImageFolder('bird_dataset/test_images'))\n",
"print(train_loader.dataset.imgs)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"[('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0002_1670.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0004_1528.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0005_1750.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0006_1763.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0007_1615.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0009_1522.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0010_1704.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0012_1784.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0014_1755.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0015_1653.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0017_1561.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0018_1613.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0019_1585.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0023_1485.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0027_1754.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0029_1620.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0031_1588.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0032_1776.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0033_1494.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0035_1591.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0036_1604.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0037_1560.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0040_1715.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0044_1731.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0046_1663.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0047_1706.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0051_1650.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0053_1672.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0055_1501.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0056_1493.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0058_1751.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0059_1480.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0060_1505.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0061_1510.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0062_1767.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0065_1502.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0068_1538.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0069_1546.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0071_1559.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0072_1696.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0074_1730.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0075_1617.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0076_1661.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0077_1724.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0078_1780.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0080_1549.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0082_1697.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0087_1765.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0088_1678.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0090_1567.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0091_1728.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0092_1516.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0094_1540.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0100_1646.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0101_1700.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0107_1590.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0108_1639.jpg', 0), ('bird_dataset/train_images/004.Groove_billed_Ani/Groove_Billed_Ani_0109_1592.jpg', 0), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0002_2278.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0004_2345.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0010_2269.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0012_2691.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0014_2679.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0016_2225.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0017_2668.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0018_2261.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0025_2231.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0026_2625.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0027_2329.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0028_2682.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0030_2268.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0032_2214.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0035_2611.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0038_2294.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0041_2653.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0042_2302.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0045_2303.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0046_2688.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0049_2258.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0054_2631.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0061_2270.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0064_2290.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0065_2310.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0066_2693.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0070_2325.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0074_2277.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0078_2659.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0079_2343.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0080_2234.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0082_2593.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0087_2622.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0090_2658.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0095_2610.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0096_2634.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0097_2322.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0099_2560.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0101_2630.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0102_2620.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0103_2273.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0106_2608.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0109_2232.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0111_2613.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0112_2340.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0115_2279.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0116_2327.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0131_2289.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0132_2293.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0133_2324.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0135_2607.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0137_2680.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0139_2567.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0140_2586.jpg', 1), ('bird_dataset/train_images/009.Brewer_Blackbird/Brewer_Blackbird_0142_2636.jpg', 1), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0001_3695.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0006_6005.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0007_3706.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0009_5841.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0010_6386.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0011_5845.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0012_6015.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0013_5762.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0014_3761.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0017_4116.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0020_4050.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0022_4483.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0023_5257.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0024_4180.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0025_5342.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0027_4123.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0028_4709.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0029_4804.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0032_4004.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0039_4285.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0040_4522.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0042_3635.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0044_5621.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0045_4526.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0046_4242.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0047_3802.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0049_5598.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0052_5575.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0053_4072.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0055_4345.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0058_4141.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0060_4688.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0061_4196.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0062_4233.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0064_4936.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0065_4026.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0066_5070.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0071_3988.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0072_4338.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0074_4146.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0075_4953.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0078_5372.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0079_4527.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0081_6081.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0085_5846.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0089_4188.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0091_4096.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0093_5948.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0096_5019.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0099_3985.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0101_6244.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0104_3918.jpg', 2), ('bird_dataset/train_images/010.Red_winged_Blackbird/Red_Winged_Blackbird_0109_4454.jpg', 2), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0001_6548.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0003_6749.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0006_6633.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0009_6853.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0011_7028.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0013_6902.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0015_6885.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0016_6684.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0017_6755.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0019_6704.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0020_6679.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0022_6808.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0023_6752.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0026_6768.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0027_6593.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0031_6699.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0032_6611.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0033_6879.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0036_6550.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0043_2597.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0047_7009.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0048_6632.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0051_6715.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0052_7035.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0054_6676.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0055_6923.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0056_6856.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0057_6935.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0073_6744.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0074_6585.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0075_6717.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0076_6716.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0080_6877.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0081_6967.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0085_6713.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0086_6658.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0087_6727.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0091_6695.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0092_2727.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0093_6628.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0094_6582.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0096_6846.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0100_6597.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0101_6880.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0102_6590.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0104_6685.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0105_6937.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0107_6839.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0108_6867.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0109_6698.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0111_3220.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0112_3415.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0113_6664.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0114_6760.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0120_6762.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0121_6637.jpg', 3), ('bird_dataset/train_images/011.Rusty_Blackbird/Rusty_Blackbird_0122_6736.jpg', 3), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0003_8337.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0008_8756.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0009_8248.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0012_8443.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0013_8362.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0015_8207.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0017_8511.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0018_8588.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0020_8549.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0023_7325.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0024_8586.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0025_8262.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0026_8545.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0031_8456.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0034_7736.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0035_8447.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0038_8689.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0040_7514.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0041_8264.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0042_8574.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0047_7929.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0049_8548.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0051_8387.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0053_8410.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0055_8357.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0056_8455.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0057_8236.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0058_8350.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0059_8079.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0061_8208.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0062_8310.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0065_8481.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0070_8583.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0072_8606.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0073_8442.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0074_8452.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0077_8332.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0079_8535.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0080_8601.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0082_8577.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0083_8300.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0084_8435.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0085_8363.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0086_8487.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0087_8358.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0088_8257.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0089_8326.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0091_8555.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0095_8458.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0098_8367.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0100_8407.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0102_8441.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0108_7937.jpg', 4), ('bird_dataset/train_images/012.Yellow_headed_Blackbird/Yellow_Headed_Blackbird_0109_8271.jpg', 4), ('bird_dataset/train_images/013.Bobolink/Bobolink_0001_9261.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0002_11085.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0007_9246.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0008_9289.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0013_9367.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0014_11055.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0018_9402.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0019_10552.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0020_9194.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0021_10623.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0026_11057.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0027_10569.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0032_10217.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0033_10809.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0035_11117.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0039_9779.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0040_9681.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0043_10607.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0044_9990.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0048_9988.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0049_9540.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0050_9821.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0052_9423.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0053_10166.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0056_9080.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0057_10051.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0059_10041.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0064_10092.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0065_9375.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0067_11533.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0069_9085.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0070_10624.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0071_9503.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0074_9311.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0076_11093.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0079_10736.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0081_9439.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0092_10026.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0094_9823.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0097_10861.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0099_9314.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0102_10807.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0104_10273.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0106_9126.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0107_10252.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0109_9869.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0110_9496.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0112_11073.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0114_10627.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0115_9265.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0117_10215.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0119_10430.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0120_10859.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0124_10182.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0126_11458.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0128_9947.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0131_9578.jpg', 5), ('bird_dataset/train_images/013.Bobolink/Bobolink_0133_9618.jpg', 5), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0001_12469.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0002_12163.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0003_13049.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0004_13195.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0006_14317.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0010_13000.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0013_12949.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0015_12632.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0016_13661.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0017_11574.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0018_11883.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0021_13979.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0022_12781.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0024_13523.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0025_12532.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0026_11964.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0027_11579.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0028_12335.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0029_13761.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0031_13300.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0032_12215.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0033_12777.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0034_12464.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0036_13716.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0037_14128.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0039_12756.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0040_11805.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0041_13987.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0044_14389.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0047_12966.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0049_13641.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0050_11811.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0051_12837.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0052_11893.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0053_13391.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0054_12213.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0055_13473.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0056_12637.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0058_12207.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0059_11596.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0060_14495.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0061_13259.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0063_11820.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0065_14558.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0066_12869.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0068_13081.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0071_11639.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0072_14197.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0073_13933.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0074_12829.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0075_12835.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0077_14060.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0078_11852.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0080_13416.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0082_11907.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0084_11848.jpg', 6), ('bird_dataset/train_images/014.Indigo_Bunting/Indigo_Bunting_0085_11991.jpg', 6), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0001_14916.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0004_14887.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0008_15195.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0009_15163.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0010_14915.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0015_14690.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0020_14837.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0021_14686.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0025_15079.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0026_14669.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0027_14895.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0028_14950.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0030_14986.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0031_15018.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0032_14778.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0034_14864.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0035_14920.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0037_15021.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0039_15081.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0040_14923.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0041_15152.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0042_14820.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0045_14954.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0046_14787.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0047_14863.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0048_14844.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0052_14618.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0054_14714.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0056_15032.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0057_14775.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0059_14749.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0061_15155.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0067_14672.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0070_14665.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0073_14594.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0074_14854.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0076_14662.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0078_15164.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0080_14893.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0081_14709.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0082_15047.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0084_14815.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0085_14627.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0086_14992.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0087_15096.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0089_14598.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0092_14656.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0093_15030.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0094_11894.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0095_14919.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0097_14617.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0102_14605.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0105_15017.jpg', 7), ('bird_dataset/train_images/015.Lazuli_Bunting/Lazuli_Bunting_0107_14705.jpg', 7), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0001_16585.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0005_15202.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0006_15249.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0009_16674.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0010_16948.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0011_16690.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0013_15294.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0016_15200.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0019_15231.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0021_15295.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0025_16722.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0027_16536.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0028_15205.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0029_16530.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0032_16605.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0036_16563.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0039_15235.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0040_16691.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0044_16557.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0046_16535.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0050_16670.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0053_16404.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0054_16711.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0055_15208.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0056_16599.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0058_16719.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0060_15224.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0061_16930.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0066_15241.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0069_16462.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0070_16515.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0071_15209.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0072_16697.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0073_16737.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0076_16765.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0077_16819.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0078_16565.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0079_15197.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0080_16534.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0081_15230.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0083_16587.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0084_16531.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0085_15282.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0086_16540.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0087_15232.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0091_15198.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0093_15212.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0094_16467.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0096_15233.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0098_15226.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0099_16525.jpg', 8), ('bird_dataset/train_images/016.Painted_Bunting/Painted_Bunting_0102_16642.jpg', 8), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0001_20695.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0002_21395.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0006_20867.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0007_20186.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0008_20430.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0013_20562.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0015_21230.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0019_20567.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0022_19585.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0023_20668.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0024_20739.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0027_20968.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0028_20598.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0031_21635.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0032_21551.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0039_21040.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0043_21008.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0045_20950.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0048_20558.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0049_21311.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0050_20763.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0053_20694.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0055_20671.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0057_20979.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0060_20656.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0063_20707.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0067_21043.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0069_21065.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0074_19601.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0075_21125.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0080_20139.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0091_20416.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0094_21303.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0100_20674.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0101_21178.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0102_20644.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0103_20930.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0104_20716.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0105_20864.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0107_20513.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0111_19550.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0113_21270.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0117_21333.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0118_20476.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0125_19833.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0126_19446.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0127_20034.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0129_20987.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0130_20328.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0131_19633.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0134_20596.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0138_20945.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0139_21281.jpg', 9), ('bird_dataset/train_images/019.Gray_Catbird/Gray_Catbird_0141_21174.jpg', 9), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0001_21928.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0002_21819.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0005_21828.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0008_21856.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0010_21777.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0011_21820.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0012_21961.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0013_22008.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0014_21970.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0022_21944.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0026_21845.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0029_22017.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0032_21823.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0033_21873.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0034_21955.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0035_21870.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0039_21654.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0041_21683.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0044_22106.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0048_21797.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0052_21866.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0058_21864.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0061_21967.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0062_21673.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0063_21783.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0065_22137.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0066_21839.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0071_22129.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0072_21830.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0073_21932.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0077_21986.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0079_21978.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0081_21829.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0084_22082.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0086_21877.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0089_21804.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0090_21931.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0091_22111.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0094_21693.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0095_21832.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0097_21748.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0098_21987.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0100_21913.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0101_21677.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0102_21696.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0103_21670.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0105_21714.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0106_22032.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0107_21698.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0109_21796.jpg', 10), ('bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0110_21871.jpg', 10), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0001_22314.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0002_22318.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0007_22172.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0013_22336.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0014_22367.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0015_22275.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0017_22138.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0018_22546.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0020_22141.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0022_22279.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0024_22382.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0027_22372.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0030_22693.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0031_22233.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0035_22223.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0038_22399.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0040_22341.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0042_22155.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0048_22557.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0049_22357.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0052_22558.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0053_22623.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0054_22147.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0062_22418.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0064_22649.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0067_22142.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0068_22194.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0073_22247.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0074_22620.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0075_22588.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0079_22690.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0080_22303.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0082_22330.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0085_22674.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0086_22611.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0091_22629.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0093_22621.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0095_22594.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0097_22580.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0098_22676.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0099_22566.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0101_22559.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0105_22675.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0110_22549.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0111_22168.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0115_22304.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0117_22741.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0120_22189.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0121_22319.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0124_22585.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0125_22220.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0126_22639.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0129_22358.jpg', 11), ('bird_dataset/train_images/021.Eastern_Towhee/Eastern_Towhee_0134_22624.jpg', 11), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0001_23398.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0002_23072.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0003_22922.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0006_22925.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0007_22934.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0013_23391.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0014_23050.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0015_23198.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0016_23077.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0017_23141.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0018_23090.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0019_23058.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0021_23097.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0022_23157.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0023_23254.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0025_22820.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0026_22913.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0028_22892.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0029_23043.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0030_22926.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0032_22886.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0033_22975.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0035_23000.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0036_22937.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0038_23110.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0040_23144.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0042_23151.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0044_22884.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0045_22916.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0049_22924.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0052_23356.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0053_22957.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0061_22902.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0062_23038.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0063_22865.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0064_22849.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0065_23118.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0067_23352.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0068_23019.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0071_23007.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0072_23069.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0073_23259.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0074_22881.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0075_22970.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0076_23021.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0078_23203.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0079_22874.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0080_23002.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0082_22978.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0084_23265.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0087_23126.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0088_22948.jpg', 12), ('bird_dataset/train_images/023.Brandt_Cormorant/Brandt_Cormorant_0091_22825.jpg', 12), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0001_796219.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0003_796246.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0005_24173.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0008_796250.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0009_24033.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0011_24138.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0012_796247.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0013_24131.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0014_24030.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0016_796245.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0017_24019.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0018_24140.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0019_796242.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0020_796237.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0021_24189.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0022_796221.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0023_24058.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0024_24167.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0025_796213.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0026_796229.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0027_24022.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0029_796256.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0030_24103.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0031_24139.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0032_796233.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0034_796209.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0037_24032.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0039_24026.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0040_24134.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0043_796224.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0044_24145.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0046_796218.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0049_24147.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0051_24083.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0053_24170.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0054_24159.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0055_24076.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0057_24074.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0060_24082.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0061_796232.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0064_24199.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0073_796226.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0074_24045.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0076_796235.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0082_24175.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0085_24152.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0086_796259.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0087_796223.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0089_796220.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0090_24179.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0091_796212.jpg', 13), ('bird_dataset/train_images/026.Bronzed_Cowbird/Bronzed_Cowbird_0092_796215.jpg', 13), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0001_24449.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0002_24838.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0004_24851.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0005_24659.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0006_25034.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0007_24902.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0012_24956.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0023_24940.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0027_24729.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0031_24999.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0032_24800.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0042_24578.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0046_24463.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0047_24984.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0048_24976.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0049_24911.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0051_24468.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0053_24451.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0056_24452.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0057_24529.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0058_24933.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0061_24601.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0063_24724.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0064_24840.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0065_24464.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0069_24618.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0072_24977.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0073_24546.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0074_24789.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0075_24947.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0079_24647.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0085_24938.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0088_24731.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0093_24581.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0100_24502.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0101_24987.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0102_25000.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0103_24632.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0104_24698.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0106_24617.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0107_24827.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0110_24866.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0111_24590.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0114_24649.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0115_24488.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0118_24500.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0120_24955.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0121_24574.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0123_24589.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0124_24963.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0125_24995.jpg', 14), ('bird_dataset/train_images/028.Brown_Creeper/Brown_Creeper_0127_24656.jpg', 14), ('bird_dataset/train_images/029.American_Crow/American_Crow_0001_25053.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0002_25122.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0003_25130.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0004_25819.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0011_25151.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0012_25305.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0014_25287.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0016_25112.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0020_25618.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0021_25137.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0025_25522.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0027_25146.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0030_25092.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0036_25313.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0043_25666.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0047_25397.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0048_25062.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0050_25255.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0051_25505.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0053_25203.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0059_25599.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0067_25443.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0068_25198.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0069_25506.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0074_25350.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0079_25463.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0081_25837.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0085_25260.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0088_25303.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0093_25694.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0094_25576.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0099_25717.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0101_25118.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0102_25066.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0104_25086.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0107_25353.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0109_25123.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0110_25541.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0111_25127.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0113_25149.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0116_25199.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0117_25090.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0121_25720.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0122_25200.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0124_25356.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0127_25412.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0130_25163.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0131_25706.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0132_25704.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0134_25206.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0136_25117.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0137_25221.jpg', 15), ('bird_dataset/train_images/029.American_Crow/American_Crow_0139_25186.jpg', 15), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0001_26031.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0002_26072.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0003_25970.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0004_25936.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0007_26023.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0010_25836.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0011_25866.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0012_25946.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0013_25939.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0014_26041.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0016_25854.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0017_26127.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0018_25879.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0020_26027.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0022_26062.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0023_26037.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0024_26064.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0025_25893.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0028_25968.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0031_25909.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0032_26014.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0033_25915.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0034_25891.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0035_26081.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0037_26071.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0038_26000.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0040_25158.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0041_25887.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0042_26148.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0043_25847.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0044_25964.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0047_26070.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0049_26040.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0051_25934.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0053_26067.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0055_26077.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0056_25851.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0058_25999.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0059_25864.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0060_26016.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0063_26094.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0065_25942.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0067_26124.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0068_25859.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0072_25945.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0073_25977.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0076_25971.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0078_26144.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0079_26030.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0080_25861.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0081_25908.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0082_26012.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0083_25949.jpg', 16), ('bird_dataset/train_images/030.Fish_Crow/Fish_Crow_0085_25919.jpg', 16), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0001_26242.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0005_26161.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0006_26233.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0007_26320.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0008_795305.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0015_26208.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0017_26221.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0018_26218.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0022_795319.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0023_26258.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0024_795331.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0027_26319.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0030_26240.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0031_26318.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0032_26292.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0034_795320.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0042_795308.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0043_795324.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0044_26243.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0045_26194.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0046_795328.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0047_26176.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0051_795318.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0052_26232.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0053_795321.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0054_26313.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0055_26223.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0057_795323.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0058_795292.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0061_795327.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0062_795309.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0065_26203.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0066_26303.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0070_795310.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0071_26288.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0073_795304.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0074_795286.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0075_795298.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0077_26222.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0079_26180.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0081_26209.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0082_26241.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0083_795315.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0084_26175.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0085_795294.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0086_26188.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0087_795300.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0088_26217.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0089_795322.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0090_26311.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0091_26246.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0092_795313.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0093_795316.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0095_795307.jpg', 17), ('bird_dataset/train_images/031.Black_billed_Cuckoo/Black_Billed_Cuckoo_0096_26204.jpg', 17), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0002_26715.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0003_26797.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0004_26790.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0005_26684.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0006_26578.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0007_26687.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0009_26656.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0010_26795.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0012_26712.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0014_26754.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0018_26535.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0019_26803.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0022_26423.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0023_26637.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0024_26832.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0026_26794.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0027_26844.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0028_26446.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0029_26865.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0032_26616.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0034_26694.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0036_26682.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0038_26912.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0039_26510.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0042_26479.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0043_26492.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0045_26685.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0048_26632.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0049_26766.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0050_26424.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0053_26738.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0059_26828.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0060_26686.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0066_26600.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0067_26878.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0069_26597.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0073_26744.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0074_26466.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0077_26431.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0078_26888.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0081_26429.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0084_26761.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0088_26812.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0090_26714.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0091_26428.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0092_26859.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0093_26432.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0094_26643.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0097_26713.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0098_26501.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0104_26814.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0116_26544.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0117_26651.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0119_26550.jpg', 18), ('bird_dataset/train_images/033.Yellow_billed_Cuckoo/Yellow_Billed_Cuckoo_0121_26807.jpg', 18), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0001_27211.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0009_26977.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0010_27039.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0012_27062.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0013_27110.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0015_797291.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0016_27181.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0018_26978.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0019_27192.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0021_797286.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0022_27028.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0023_797288.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0024_27057.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0025_797274.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0026_27160.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0028_27114.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0029_797300.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0030_27068.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0031_797299.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0034_797305.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0036_797287.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0038_797309.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0040_26985.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0041_27105.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0042_27143.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0043_26990.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0044_26976.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0046_797295.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0047_797303.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0048_27236.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0051_26988.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0053_797276.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0055_27112.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0056_797293.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0057_27107.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0061_26979.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0063_27123.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0064_27007.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0066_797298.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0067_797289.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0068_27196.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0071_797285.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0072_26993.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0073_27104.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0074_27156.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0075_27165.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0076_27200.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0078_27136.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0079_797294.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0080_27108.jpg', 19), ('bird_dataset/train_images/034.Gray_crowned_Rosy_Finch/Gray_Crowned_Rosy_Finch_0084_27034.jpg', 19)]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "iVHSeEGjEf_Z",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "b42958d1-0abb-42d7-ca5a-f63a918f3ed8"
},
"source": [
"import imageai\n",
"from imageai.Detection import ObjectDetection\n",
"\n",
"detector = ObjectDetection()\n",
"detector.setModelTypeAsRetinaNet()\n",
"detector.setModelPath( os.path.join(execution_path , \"resnet50_coco_best_v2.0.1.h5\"))\n",
"detector.loadModel(\"normal\")\n",
"custom_objects = detector.CustomObjects(bird=True)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/resource_variable_ops.py:1630: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"If using Keras pass *_constraint arguments to layers.\n",
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4070: The name tf.nn.max_pool is deprecated. Please use tf.nn.max_pool2d instead.\n",
"\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/imageai/Detection/keras_retinanet/backend/tensorflow_backend.py:22: The name tf.image.resize_images is deprecated. Please use tf.image.resize instead.\n",
"\n",
"tracking <tf.Variable 'Variable:0' shape=(9, 4) dtype=float32> anchors\n",
"tracking <tf.Variable 'Variable_1:0' shape=(9, 4) dtype=float32> anchors\n",
"tracking <tf.Variable 'Variable_2:0' shape=(9, 4) dtype=float32> anchors\n",
"tracking <tf.Variable 'Variable_3:0' shape=(9, 4) dtype=float32> anchors\n",
"tracking <tf.Variable 'Variable_4:0' shape=(9, 4) dtype=float32> anchors\n",
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/imageai/Detection/keras_retinanet/backend/tensorflow_backend.py:46: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"Use tf.where in 2.0, which has the same broadcast rule as np.where\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "-SyU6LeuPqQh"
},
"source": [
"with open('output_retina/train_bounding_boxes.csv', mode='w') as csv_file:\n",
" csv_writer = csv.writer(csv_file, delimiter=';', quotechar='\"', quoting=csv.QUOTE_MINIMAL)\n",
" for img in train_loader.dataset.imgs:\n",
" img_path = img[0]\n",
" detections = detector.detectCustomObjectsFromImage(custom_objects=custom_objects, \n",
" input_image=os.path.join(execution_path , img_path), \n",
" output_image_path=os.path.join(execution_path, \"output_retina\", img_path), \n",
" minimum_percentage_probability=10)\n",
" if len(detections) == 0:\n",
" csv_writer.writerow([img_path])\n",
" for eachObject in detections:\n",
" csv_writer.writerow([img_path, eachObject[\"box_points\"], eachObject[\"percentage_probability\"]])"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "8g4T_BiMCeP0"
},
"source": [
"with open('output_retina/val_bounding_boxes.csv', mode='w') as csv_file:\n",
" csv_writer = csv.writer(csv_file, delimiter=';', quotechar='\"', quoting=csv.QUOTE_MINIMAL)\n",
" for img in val_loader.dataset.imgs:\n",
" img_path = img[0]\n",
" detections = detector.detectCustomObjectsFromImage(custom_objects=custom_objects, \n",
" input_image=os.path.join(execution_path , img_path), \n",
" output_image_path=os.path.join(execution_path, \"output_retina\", img_path), \n",
" minimum_percentage_probability=10)\n",
" if len(detections) == 0:\n",
" csv_writer.writerow([img_path])\n",
" for eachObject in detections:\n",
" csv_writer.writerow([img_path, eachObject[\"box_points\"], eachObject[\"percentage_probability\"]])"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "KW9CrcAcSLjd"
},
"source": [
"with open('output_retina/test_bounding_boxes.csv', mode='w') as csv_file:\n",
" csv_writer = csv.writer(csv_file, delimiter=';', quotechar='\"', quoting=csv.QUOTE_MINIMAL)\n",
" for img in test_loader.dataset.imgs:\n",
" img_path = img[0]\n",
" detections = detector.detectCustomObjectsFromImage(custom_objects=custom_objects, \n",
" input_image=os.path.join(execution_path , img_path), \n",
" output_image_path=os.path.join(execution_path, \"output_retina\", img_path), \n",
" minimum_percentage_probability=10)\n",
" if len(detections) == 0:\n",
" csv_writer.writerow([img_path])\n",
" for eachObject in detections:\n",
" csv_writer.writerow([img_path, eachObject[\"box_points\"], eachObject[\"percentage_probability\"]])"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "Ld4TlvKGg4qX",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "aac2481d-6d72-4e77-cd19-caf4d6497c53"
},
"source": [
"!zip -qr output_retina/train_crop output_retina/bird_dataset/train_images\n",
"files.download(\"output_retina/train_bounding_boxes.csv\")\n",
"files.download(\"output_retina/train_crop.zip\")"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"application/javascript": [
"\n",
" async function download(id, filename, size) {\n",
" if (!google.colab.kernel.accessAllowed) {\n",
" return;\n",
" }\n",
" const div = document.createElement('div');\n",
" const label = document.createElement('label');\n",
" label.textContent = `Downloading \"${filename}\": `;\n",
" div.appendChild(label);\n",
" const progress = document.createElement('progress');\n",
" progress.max = size;\n",
" div.appendChild(progress);\n",
" document.body.appendChild(div);\n",
"\n",
" const buffers = [];\n",
" let downloaded = 0;\n",
"\n",
" const channel = await google.colab.kernel.comms.open(id);\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
"\n",
" for await (const message of channel.messages) {\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
" if (message.buffers) {\n",
" for (const buffer of message.buffers) {\n",
" buffers.push(buffer);\n",
" downloaded += buffer.byteLength;\n",
" progress.value = downloaded;\n",
" }\n",
" }\n",
" }\n",
" const blob = new Blob(buffers, {type: 'application/binary'});\n",
" const a = document.createElement('a');\n",
" a.href = window.URL.createObjectURL(blob);\n",
" a.download = filename;\n",
" div.appendChild(a);\n",
" a.click();\n",
" div.remove();\n",
" }\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"application/javascript": [
"download(\"download_6314d46a-d2d9-44af-bd25-81c6084098b5\", \"train_bounding_boxes.csv\", 204764)"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"application/javascript": [
"\n",
" async function download(id, filename, size) {\n",
" if (!google.colab.kernel.accessAllowed) {\n",
" return;\n",
" }\n",
" const div = document.createElement('div');\n",
" const label = document.createElement('label');\n",
" label.textContent = `Downloading \"${filename}\": `;\n",
" div.appendChild(label);\n",
" const progress = document.createElement('progress');\n",
" progress.max = size;\n",
" div.appendChild(progress);\n",
" document.body.appendChild(div);\n",
"\n",
" const buffers = [];\n",
" let downloaded = 0;\n",
"\n",
" const channel = await google.colab.kernel.comms.open(id);\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
"\n",
" for await (const message of channel.messages) {\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
" if (message.buffers) {\n",
" for (const buffer of message.buffers) {\n",
" buffers.push(buffer);\n",
" downloaded += buffer.byteLength;\n",
" progress.value = downloaded;\n",
" }\n",
" }\n",
" }\n",
" const blob = new Blob(buffers, {type: 'application/binary'});\n",
" const a = document.createElement('a');\n",
" a.href = window.URL.createObjectURL(blob);\n",
" a.download = filename;\n",
" div.appendChild(a);\n",
" a.click();\n",
" div.remove();\n",
" }\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"application/javascript": [
"download(\"download_6cadb841-de4a-4287-b4fc-9c99e43f9384\", \"train_crop.zip\", 36836408)"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "5SeGa8veUUR9",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 17
},
"outputId": "4f4dc305-b2a5-43ba-bb50-900a1ac2e102"
},
"source": [
"!zip -qr output_retina/val_crop output_retina/bird_dataset/val_images\n",
"files.download(\"output_retina/val_bounding_boxes.csv\")\n",
"files.download(\"output_retina/val_crop.zip\")"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"application/javascript": [
"\n",
" async function download(id, filename, size) {\n",
" if (!google.colab.kernel.accessAllowed) {\n",
" return;\n",
" }\n",
" const div = document.createElement('div');\n",
" const label = document.createElement('label');\n",
" label.textContent = `Downloading \"${filename}\": `;\n",
" div.appendChild(label);\n",
" const progress = document.createElement('progress');\n",
" progress.max = size;\n",
" div.appendChild(progress);\n",
" document.body.appendChild(div);\n",
"\n",
" const buffers = [];\n",
" let downloaded = 0;\n",
"\n",
" const channel = await google.colab.kernel.comms.open(id);\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
"\n",
" for await (const message of channel.messages) {\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
" if (message.buffers) {\n",
" for (const buffer of message.buffers) {\n",
" buffers.push(buffer);\n",
" downloaded += buffer.byteLength;\n",
" progress.value = downloaded;\n",
" }\n",
" }\n",
" }\n",
" const blob = new Blob(buffers, {type: 'application/binary'});\n",
" const a = document.createElement('a');\n",
" a.href = window.URL.createObjectURL(blob);\n",
" a.download = filename;\n",
" div.appendChild(a);\n",
" a.click();\n",
" div.remove();\n",
" }\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"application/javascript": [
"download(\"download_c88861f4-06d7-4732-b1ad-6057c64cbe1a\", \"val_bounding_boxes.csv\", 20599)"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"application/javascript": [
"\n",
" async function download(id, filename, size) {\n",
" if (!google.colab.kernel.accessAllowed) {\n",
" return;\n",
" }\n",
" const div = document.createElement('div');\n",
" const label = document.createElement('label');\n",
" label.textContent = `Downloading \"${filename}\": `;\n",
" div.appendChild(label);\n",
" const progress = document.createElement('progress');\n",
" progress.max = size;\n",
" div.appendChild(progress);\n",
" document.body.appendChild(div);\n",
"\n",
" const buffers = [];\n",
" let downloaded = 0;\n",
"\n",
" const channel = await google.colab.kernel.comms.open(id);\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
"\n",
" for await (const message of channel.messages) {\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
" if (message.buffers) {\n",
" for (const buffer of message.buffers) {\n",
" buffers.push(buffer);\n",
" downloaded += buffer.byteLength;\n",
" progress.value = downloaded;\n",
" }\n",
" }\n",
" }\n",
" const blob = new Blob(buffers, {type: 'application/binary'});\n",
" const a = document.createElement('a');\n",
" a.href = window.URL.createObjectURL(blob);\n",
" a.download = filename;\n",
" div.appendChild(a);\n",
" a.click();\n",
" div.remove();\n",
" }\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"application/javascript": [
"download(\"download_0bd5956a-b9ed-4409-98a9-6bac92f6dfce\", \"val_crop.zip\", 3497079)"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "rWLwfRxBEoPb",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "fdcf67ba-6974-4796-dfc5-2f13bc6422a3"
},
"source": [
"!zip -qr output_retina/test_crop output_retina/bird_dataset/test_images\n",
"files.download(\"output_retina/test_bounding_boxes.csv\")\n",
"files.download(\"output_retina/test_crop.zip\")"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"application/javascript": [
"\n",
" async function download(id, filename, size) {\n",
" if (!google.colab.kernel.accessAllowed) {\n",
" return;\n",
" }\n",
" const div = document.createElement('div');\n",
" const label = document.createElement('label');\n",
" label.textContent = `Downloading \"${filename}\": `;\n",
" div.appendChild(label);\n",
" const progress = document.createElement('progress');\n",
" progress.max = size;\n",
" div.appendChild(progress);\n",
" document.body.appendChild(div);\n",
"\n",
" const buffers = [];\n",
" let downloaded = 0;\n",
"\n",
" const channel = await google.colab.kernel.comms.open(id);\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
"\n",
" for await (const message of channel.messages) {\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
" if (message.buffers) {\n",
" for (const buffer of message.buffers) {\n",
" buffers.push(buffer);\n",
" downloaded += buffer.byteLength;\n",
" progress.value = downloaded;\n",
" }\n",
" }\n",
" }\n",
" const blob = new Blob(buffers, {type: 'application/binary'});\n",
" const a = document.createElement('a');\n",
" a.href = window.URL.createObjectURL(blob);\n",
" a.download = filename;\n",
" div.appendChild(a);\n",
" a.click();\n",
" div.remove();\n",
" }\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"application/javascript": [
"download(\"download_268b7880-f3f1-474e-9020-cce1f719d142\", \"test_bounding_boxes.csv\", 103175)"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"application/javascript": [
"\n",
" async function download(id, filename, size) {\n",
" if (!google.colab.kernel.accessAllowed) {\n",
" return;\n",
" }\n",
" const div = document.createElement('div');\n",
" const label = document.createElement('label');\n",
" label.textContent = `Downloading \"${filename}\": `;\n",
" div.appendChild(label);\n",
" const progress = document.createElement('progress');\n",
" progress.max = size;\n",
" div.appendChild(progress);\n",
" document.body.appendChild(div);\n",
"\n",
" const buffers = [];\n",
" let downloaded = 0;\n",
"\n",
" const channel = await google.colab.kernel.comms.open(id);\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
"\n",
" for await (const message of channel.messages) {\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
" if (message.buffers) {\n",
" for (const buffer of message.buffers) {\n",
" buffers.push(buffer);\n",
" downloaded += buffer.byteLength;\n",
" progress.value = downloaded;\n",
" }\n",
" }\n",
" }\n",
" const blob = new Blob(buffers, {type: 'application/binary'});\n",
" const a = document.createElement('a');\n",
" a.href = window.URL.createObjectURL(blob);\n",
" a.download = filename;\n",
" div.appendChild(a);\n",
" a.click();\n",
" div.remove();\n",
" }\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"application/javascript": [
"download(\"download_a0620680-2089-444a-8d6f-422a6d4d9a06\", \"test_crop.zip\", 18923659)"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "PWJhkbG6l_N0"
},
"source": [
"From the bounding boxes we create a new cropped dataset."
]
},
{
"cell_type": "code",
"metadata": {
"id": "tnn--DX8UjEH",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "985a26fe-00e4-44bd-f3e3-5fc72a6a000c"
},
"source": [
"import re #regex\n",
"\n",
"train_bb = pd.read_csv(\"output_retina/train_bounding_boxes.csv\", sep=\";\")\n",
"val_bb = pd.read_csv(\"output_retina/val_bounding_boxes.csv\", sep=\";\")\n",
"test_bb = pd.read_csv(\"output_retina/test_bounding_boxes.csv\", sep=\";\")\n",
"\n",
"for set_bb in [train_bb, val_bb, test_bb]:\n",
" prev_row = '___'\n",
" prob_max = 0.0\n",
" for row in set_bb.values:\n",
" if row[0] != prev_row:\n",
" if prev_row != '___':\n",
" im = Image.open(prev_row)\n",
" if bb_string != '[0,0,0,0]':\n",
" bb = [int(s) for s in re.findall(r'\\d+', bb_string)]\n",
" im = im.crop(bb)\n",
" else:\n",
" print('no bounding-box found for '+ prev_row +' ...')\n",
" im.save('output_crop/' + prev_row)\n",
" prob_max = 0.0\n",
" bb_string = '[0,0,0,0]'\n",
" if row[2] > prob_max:\n",
" prob_max = row[2]\n",
" bb_string = row[1]\n",
" prev_row = row[0]"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"no bounding-box found for bird_dataset/train_images/020.Yellow_breasted_Chat/Yellow_Breasted_Chat_0073_21932.jpg ...\n",
"no bounding-box found for bird_dataset/test_images/mistery_category/1b62fffcbf47a4f9e32b400edc662f1f.jpg ...\n",
"no bounding-box found for bird_dataset/test_images/mistery_category/64f3fa85502e9cff91d6dc88f54be7cb.jpg ...\n",
"no bounding-box found for bird_dataset/test_images/mistery_category/8ede0bc5a4976385dcfe6e38feaf90c2.jpg ...\n",
"no bounding-box found for bird_dataset/test_images/mistery_category/a05ed5dd6cbd3097e81e3c76ac690465.jpg ...\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "dYiN-m83s8wF",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 17
},
"outputId": "e97b5290-0118-4699-cdcc-784af522d365"
},
"source": [
"!zip -qr output_crop/cropped_dataset output_crop/bird_dataset/\n",
"files.download(\"output_crop/cropped_dataset.zip\")"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"application/javascript": [
"\n",
" async function download(id, filename, size) {\n",
" if (!google.colab.kernel.accessAllowed) {\n",
" return;\n",
" }\n",
" const div = document.createElement('div');\n",
" const label = document.createElement('label');\n",
" label.textContent = `Downloading \"${filename}\": `;\n",
" div.appendChild(label);\n",
" const progress = document.createElement('progress');\n",
" progress.max = size;\n",
" div.appendChild(progress);\n",
" document.body.appendChild(div);\n",
"\n",
" const buffers = [];\n",
" let downloaded = 0;\n",
"\n",
" const channel = await google.colab.kernel.comms.open(id);\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
"\n",
" for await (const message of channel.messages) {\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
" if (message.buffers) {\n",
" for (const buffer of message.buffers) {\n",
" buffers.push(buffer);\n",
" downloaded += buffer.byteLength;\n",
" progress.value = downloaded;\n",
" }\n",
" }\n",
" }\n",
" const blob = new Blob(buffers, {type: 'application/binary'});\n",
" const a = document.createElement('a');\n",
" a.href = window.URL.createObjectURL(blob);\n",
" a.download = filename;\n",
" div.appendChild(a);\n",
" a.click();\n",
" div.remove();\n",
" }\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"application/javascript": [
"download(\"download_59ef54d1-c704-4c36-98b5-b5a2906df6f1\", \"cropped_dataset.zip\", 18602163)"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "bVL2MJbltQKE"
},
"source": [
"We can then manually inspect the cropped dataset and see that it behaves very well. We also manually cropped the 4 images of the test set where no boundind boxes were found. The new dataset can be stored and used from now on."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IFqbZeJL34k1"
},
"source": [
"# Feature extraction and classification"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GQchbVoY4AMz"
},
"source": [
"Upload the cropped dataset zip previously downloaded and unzip it. "
]
},
{
"cell_type": "code",
"metadata": {
"id": "2V9dJeDhX6hW",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "e21c5233-4844-4c3c-cced-9796795cec78"
},
"source": [
"print('uncompressing...')\n",
"#q quiet o overwrite\n",
"!unzip -qo cropped_dataset.zip\n",
"print('done!')"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"uncompressing...\n",
"done!\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xX4Cl7ocAFXE"
},
"source": [
"From the dataset, several methods can be tried out:"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "wJp7lWkRGZ5P"
},
"source": [
"## Simple finetuning of different models\n",
"https://pytorch.org/tutorials/beginner/finetuning_torchvision_models_tutorial.html\n",
"(only last layer parameters are optimized)"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-t5oJXtbeoj0"
},
"source": [
"def set_parameter_requires_grad(model, feature_extracting):\n",
" if feature_extracting:\n",
" for param in model.parameters():\n",
" param.requires_grad = False"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "mLdeJKM5XSHa"
},
"source": [
"model_name = 'resnext101'\n",
"num_classes = 20\n",
"batch_size = 64\n",
"num_epochs = 50\n",
"feature_extract = True\n",
"use_pretrained = True\n",
"\n",
"def initialize_model(model_name, num_classes, feature_extract, use_pretrained=True):\n",
" # Initialize these variables which will be set in this if statement. Each of these\n",
" # variables is model specific.\n",
" model_ft = None\n",
" input_size = 0\n",
"\n",
" if model_name == \"resnet\":\n",
" \"\"\" Resnet18\n",
" \"\"\"\n",
" model_ft = models.resnet18(pretrained=use_pretrained)\n",
" set_parameter_requires_grad(model_ft, feature_extract)\n",
" num_ftrs = model_ft.fc.in_features\n",
" model_ft.fc = nn.Linear(num_ftrs, num_classes)\n",
" input_size = 224\n",
"\n",
" if model_name == \"resnet101\":\n",
" \"\"\" Resnet101\n",
" \"\"\"\n",
" model_ft = models.resnet101(pretrained=use_pretrained)\n",
" set_parameter_requires_grad(model_ft, feature_extract)\n",
" num_ftrs = model_ft.fc.in_features\n",
" model_ft.fc = nn.Linear(num_ftrs, num_classes)\n",
" input_size = 224\n",
"\n",
" if model_name == \"resnet152\":\n",
" \"\"\" ResNet-152\n",
" \"\"\"\n",
" model_ft = models.resnet152(pretrained=use_pretrained)\n",
" set_parameter_requires_grad(model_ft, feature_extract)\n",
" num_ftrs = model_ft.fc.in_features\n",
" model_ft.fc = nn.Linear(num_ftrs, num_classes)\n",
" input_size = 224\n",
"\n",
" elif model_name == \"resnext101\":\n",
" \"\"\" ResNeXt-101\n",
" \"\"\"\n",
" model_ft = models.resnext101_32x8d(pretrained=use_pretrained)\n",
" set_parameter_requires_grad(model_ft, feature_extract)\n",
" num_ftrs = model_ft.fc.in_features\n",
" model_ft.fc = nn.Linear(num_ftrs,num_classes)\n",
" input_size = 299\n",
"\n",
" elif model_name == \"inception\":\n",
" \"\"\" Inception v3\n",
" Be careful, expects (299,299) sized images and has auxiliary output\n",
" \"\"\"\n",
" model_ft = models.inception_v3(pretrained=use_pretrained)\n",
" set_parameter_requires_grad(model_ft, feature_extract)\n",
" # Handle the auxilary net\n",
" num_ftrs = model_ft.AuxLogits.fc.in_features\n",
" model_ft.AuxLogits.fc = nn.Linear(num_ftrs, num_classes)\n",
" # Handle the primary net\n",
" num_ftrs = model_ft.fc.in_features\n",
" model_ft.fc = nn.Linear(num_ftrs,num_classes)\n",
" input_size = 299\n",
"\n",
" else:\n",
" print(\"Invalid model name, exiting...\")\n",
" exit()\n",
"\n",
" return model_ft, input_size"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "dim7DT0FXgXa"
},
"source": [
"model_ft, input_size = initialize_model(model_name, num_classes, feature_extract, use_pretrained=True)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "ck9hpXW6Amk7"
},
"source": [
"To finetune a little better the network, the last module (layer 4) is also trained"
]
},
{
"cell_type": "code",
"metadata": {
"id": "2izd-3cOGQrE"
},
"source": [
"# Does not work for inception\n",
"def set_parameter_requires_grad(layer):\n",
" for param in layer.parameters():\n",
" param.requires_grad = True\n",
"\n",
"set_parameter_requires_grad(model_ft.layer4)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "WAyUMB7FCIBe"
},
"source": [
"data_transforms = {\n",
" 'train_images': transforms.Compose([\n",
" transforms.Resize((input_size,input_size)),\n",
" transforms.RandomHorizontalFlip(),\n",
" transforms.RandomRotation(180),\n",
" transforms.ToTensor(),\n",
" transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n",
" ]),\n",
" 'val_images': transforms.Compose([\n",
" transforms.Resize((input_size,input_size)),\n",
" transforms.ToTensor(),\n",
" transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n",
" ]),\n",
"}\n",
"\n",
"data_dir = 'cropped_dataset'\n",
"# Create training and validation datasets\n",
"image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train_images', 'val_images']}\n",
"# Create training and validation dataloaders\n",
"dataloaders_dict = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True, num_workers=4) for x in ['train_images', 'val_images']}\n",
"\n",
"# Detect if we have a GPU available\n",
"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "5I6X9V8tgrBY",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "d2089e6f-3271-4e8a-dcc9-ab98acf55aa5"
},
"source": [
"# Send the model to GPU\n",
"model_ft = model_ft.to(device)\n",
"\n",
"# Gather the parameters to be optimized/updated in this run. If we are\n",
"# finetuning we will be updating all parameters. However, if we are\n",
"# doing feature extract method, we will only update the parameters\n",
"# that we have just initialized, i.e. the parameters with requires_grad\n",
"# is True.\n",
"params_to_update = model_ft.parameters()\n",
"print(\"Params to learn:\")\n",
"if feature_extract:\n",
" params_to_update = []\n",
" for name,param in model_ft.named_parameters():\n",
" if param.requires_grad == True:\n",
" params_to_update.append(param)\n",
" print(\"\\t\",name)\n",
"else:\n",
" for name,param in model_ft.named_parameters():\n",
" if param.requires_grad == True:\n",
" print(\"\\t\",name)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Params to learn:\n",
"\t layer4.0.conv1.weight\n",
"\t layer4.0.bn1.weight\n",
"\t layer4.0.bn1.bias\n",
"\t layer4.0.conv2.weight\n",
"\t layer4.0.bn2.weight\n",
"\t layer4.0.bn2.bias\n",
"\t layer4.0.conv3.weight\n",
"\t layer4.0.bn3.weight\n",
"\t layer4.0.bn3.bias\n",
"\t layer4.0.downsample.0.weight\n",
"\t layer4.0.downsample.1.weight\n",
"\t layer4.0.downsample.1.bias\n",
"\t layer4.1.conv1.weight\n",
"\t layer4.1.bn1.weight\n",
"\t layer4.1.bn1.bias\n",
"\t layer4.1.conv2.weight\n",
"\t layer4.1.bn2.weight\n",
"\t layer4.1.bn2.bias\n",
"\t layer4.1.conv3.weight\n",
"\t layer4.1.bn3.weight\n",
"\t layer4.1.bn3.bias\n",
"\t layer4.2.conv1.weight\n",
"\t layer4.2.bn1.weight\n",
"\t layer4.2.bn1.bias\n",
"\t layer4.2.conv2.weight\n",
"\t layer4.2.bn2.weight\n",
"\t layer4.2.bn2.bias\n",
"\t layer4.2.conv3.weight\n",
"\t layer4.2.bn3.weight\n",
"\t layer4.2.bn3.bias\n",
"\t fc.weight\n",
"\t fc.bias\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "emrh__DtKJvE"
},
"source": [
"# Observe that all parameters are being optimized\n",
"# optimizer_ft = optim.Adam(params_to_update, lr = 0.001)\n",
"optimizer_ft = optim.SGD(params_to_update, lr = 0.01 , momentum=0.9, weight_decay=3.0e-4)\n",
"# Setup the loss fxn\n",
"criterion = nn.CrossEntropyLoss()\n",
"# # Cosine annealing\n",
"# lr_scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer_ft, num_epochs)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "GA4G8g2dIMg0"
},
"source": [
"def train_model(model, dataloaders, criterion, optimizer, num_epochs=25, is_inception=False):\n",
" val_acc_history = []\n",
"\n",
" best_model_wts = copy.deepcopy(model.state_dict())\n",
" best_acc = 0.0\n",
"\n",
" for epoch in range(num_epochs):\n",
" print('Epoch {}/{}'.format(epoch, num_epochs - 1))\n",
" print('-' * 10)\n",
"\n",
" for phase in ['train_images', 'val_images']:\n",
" if phase == 'train_images':\n",
" model.train() # Set model to training mode\n",
" else:\n",
" model.eval() # Set model to evaluate mode\n",
" running_loss = 0.0\n",
" running_corrects = 0\n",
" # Iterate over data.\n",
" for inputs, labels in dataloaders[phase]:\n",
" inputs = inputs.to(device)\n",
" labels = labels.to(device)\n",
" # zero the parameter gradients\n",
" optimizer.zero_grad()\n",
" # forward\n",
" # track history if only in train\n",
" with torch.set_grad_enabled(phase == 'train_images'):\n",
" # Get model outputs and calculate loss\n",
" if is_inception and phase == 'train_images':\n",
" # From https://discuss.pytorch.org/t/how-to-optimize-inception-model-with-auxiliary-classifiers/7958\n",
" outputs, aux_outputs = model(inputs)\n",
" loss1 = criterion(outputs, labels)\n",
" loss2 = criterion(aux_outputs, labels)\n",
" loss = loss1 + 0.4*loss2\n",
" else:\n",
" outputs = model(inputs)\n",
" loss = criterion(outputs, labels)\n",
" _, preds = torch.max(outputs, 1)\n",
" # backward + optimize only if in training phase\n",
" if phase == 'train_images':\n",
" loss.backward()\n",
" optimizer.step()\n",
" # statistics\n",
" running_loss += loss.item() * inputs.size(0)\n",
" running_corrects += torch.sum(preds == labels.data)\n",
"\n",
" epoch_loss = running_loss / len(dataloaders[phase].dataset)\n",
" epoch_acc = running_corrects.double() / len(dataloaders[phase].dataset)\n",
" print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n",
"\n",
" # deep copy the model\n",
" if phase == 'val_images' and epoch_acc > best_acc:\n",
" best_acc = epoch_acc\n",
" best_model_wts = copy.deepcopy(model.state_dict())\n",
" if phase == 'val_images':\n",
" val_acc_history.append(epoch_acc)\n",
"\n",
" print()\n",
"\n",
" print('Best val Acc: {:4f}'.format(best_acc))\n",
"\n",
" # load best model weights\n",
" model.load_state_dict(best_model_wts)\n",
" return model, val_acc_history"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "IiKR4F-YIogX",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"outputId": "34aff03b-65c9-4bbc-a9a3-3b15293f49dd"
},
"source": [
"# Train and evaluate\n",
"model_ft, hist = train_model(model_ft, dataloaders_dict, criterion, optimizer_ft, num_epochs=num_epochs, is_inception=(model_name==\"inception\"))"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Epoch 0/49\n",
"----------\n",
"train_images Loss: 2.8804 Acc: 0.1340\n",
"val_images Loss: 2.5311 Acc: 0.3398\n",
"\n",
"Epoch 1/49\n",
"----------\n",
"train_images Loss: 1.9332 Acc: 0.5416\n",
"val_images Loss: 1.2251 Acc: 0.6796\n",
"\n",
"Epoch 2/49\n",
"----------\n",
"train_images Loss: 0.9923 Acc: 0.7338\n",
"val_images Loss: 0.6763 Acc: 0.7476\n",
"\n",
"Epoch 3/49\n",
"----------\n",
"train_images Loss: 0.6329 Acc: 0.7967\n",
"val_images Loss: 0.5519 Acc: 0.8544\n",
"\n",
"Epoch 4/49\n",
"----------\n",
"train_images Loss: 0.4497 Acc: 0.8457\n",
"val_images Loss: 0.4836 Acc: 0.8252\n",
"\n",
"Epoch 5/49\n",
"----------\n",
"train_images Loss: 0.3337 Acc: 0.8909\n",
"val_images Loss: 0.4323 Acc: 0.8350\n",
"\n",
"Epoch 6/49\n",
"----------\n",
"train_images Loss: 0.2632 Acc: 0.9131\n",
"val_images Loss: 0.4347 Acc: 0.8835\n",
"\n",
"Epoch 7/49\n",
"----------\n",
"train_images Loss: 0.2041 Acc: 0.9372\n",
"val_images Loss: 0.4713 Acc: 0.8350\n",
"\n",
"Epoch 8/49\n",
"----------\n",
"train_images Loss: 0.1751 Acc: 0.9529\n",
"val_images Loss: 0.4074 Acc: 0.8447\n",
"\n",
"Epoch 9/49\n",
"----------\n",
"train_images Loss: 0.1451 Acc: 0.9584\n",
"val_images Loss: 0.4297 Acc: 0.8544\n",
"\n",
"Epoch 10/49\n",
"----------\n",
"train_images Loss: 0.1042 Acc: 0.9723\n",
"val_images Loss: 0.4069 Acc: 0.8350\n",
"\n",
"Epoch 11/49\n",
"----------\n",
"train_images Loss: 0.0864 Acc: 0.9815\n",
"val_images Loss: 0.4084 Acc: 0.8544\n",
"\n",
"Epoch 12/49\n",
"----------\n",
"train_images Loss: 0.0714 Acc: 0.9852\n",
"val_images Loss: 0.5412 Acc: 0.8350\n",
"\n",
"Epoch 13/49\n",
"----------\n",
"train_images Loss: 0.0595 Acc: 0.9908\n",
"val_images Loss: 0.3865 Acc: 0.8738\n",
"\n",
"Epoch 14/49\n",
"----------\n",
"train_images Loss: 0.0472 Acc: 0.9917\n",
"val_images Loss: 0.3994 Acc: 0.8738\n",
"\n",
"Epoch 15/49\n",
"----------\n",
"train_images Loss: 0.0403 Acc: 0.9935\n",
"val_images Loss: 0.4175 Acc: 0.8447\n",
"\n",
"Epoch 16/49\n",
"----------\n",
"train_images Loss: 0.0345 Acc: 0.9945\n",
"val_images Loss: 0.4139 Acc: 0.8544\n",
"\n",
"Epoch 17/49\n",
"----------\n",
"train_images Loss: 0.0354 Acc: 0.9880\n",
"val_images Loss: 0.4263 Acc: 0.8932\n",
"\n",
"Epoch 18/49\n",
"----------\n",
"train_images Loss: 0.0271 Acc: 0.9945\n",
"val_images Loss: 0.3973 Acc: 0.8835\n",
"\n",
"Epoch 19/49\n",
"----------\n",
"train_images Loss: 0.0264 Acc: 0.9963\n",
"val_images Loss: 0.3964 Acc: 0.8835\n",
"\n",
"Epoch 20/49\n",
"----------\n",
"train_images Loss: 0.0231 Acc: 0.9991\n",
"val_images Loss: 0.3829 Acc: 0.8835\n",
"\n",
"Epoch 21/49\n",
"----------\n",
"train_images Loss: 0.0240 Acc: 0.9963\n",
"val_images Loss: 0.4126 Acc: 0.8738\n",
"\n",
"Epoch 22/49\n",
"----------\n",
"train_images Loss: 0.0180 Acc: 0.9982\n",
"val_images Loss: 0.4145 Acc: 0.8738\n",
"\n",
"Epoch 23/49\n",
"----------\n",
"train_images Loss: 0.0257 Acc: 0.9954\n",
"val_images Loss: 0.3796 Acc: 0.8738\n",
"\n",
"Epoch 24/49\n",
"----------\n",
"train_images Loss: 0.0178 Acc: 0.9972\n",
"val_images Loss: 0.4228 Acc: 0.8641\n",
"\n",
"Epoch 25/49\n",
"----------\n",
"train_images Loss: 0.0163 Acc: 0.9972\n",
"val_images Loss: 0.4256 Acc: 0.8641\n",
"\n",
"Epoch 26/49\n",
"----------\n",
"train_images Loss: 0.0125 Acc: 0.9982\n",
"val_images Loss: 0.4175 Acc: 0.8641\n",
"\n",
"Epoch 27/49\n",
"----------\n",
"train_images Loss: 0.0215 Acc: 0.9935\n",
"val_images Loss: 0.5210 Acc: 0.8835\n",
"\n",
"Epoch 28/49\n",
"----------\n"
],
"name": "stdout"
},
{
"output_type": "error",
"ename": "KeyboardInterrupt",
"evalue": "ignored",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-193-7da8a309b22f>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Train and evaluate\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mmodel_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhist\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrain_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdataloaders_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcriterion\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptimizer_ft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnum_epochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnum_epochs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_inception\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel_name\u001b[0m\u001b[0;34m==\u001b[0m\u001b[0;34m\"inception\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m<ipython-input-192-3d20d3481211>\u001b[0m in \u001b[0;36mtrain_model\u001b[0;34m(model, dataloaders, criterion, optimizer, num_epochs, is_inception)\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mrunning_corrects\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;31m# Iterate over data.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdataloaders\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mphase\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 20\u001b[0m \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 433\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_sampler_iter\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 434\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 435\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_next_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 436\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_num_yielded\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 437\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dataset_kind\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0m_DatasetKind\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mIterable\u001b[0m \u001b[0;32mand\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_next_data\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1066\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1067\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_shutdown\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_tasks_outstanding\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1068\u001b[0;31m \u001b[0midx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1069\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_tasks_outstanding\u001b[0m \u001b[0;34m-=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1070\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dataset_kind\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0m_DatasetKind\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mIterable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_get_data\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1032\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1033\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1034\u001b[0;31m \u001b[0msuccess\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_try_get_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1035\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msuccess\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1036\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/torch/utils/data/dataloader.py\u001b[0m in \u001b[0;36m_try_get_data\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 870\u001b[0m \u001b[0;31m# (bool: whether successfully get data, any: data if successful else None)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 871\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 872\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_data_queue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 873\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 874\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/lib/python3.6/multiprocessing/queues.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, block, timeout)\u001b[0m\n\u001b[1;32m 102\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mblock\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 103\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdeadline\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmonotonic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 104\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_poll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 105\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mEmpty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 106\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_poll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/lib/python3.6/multiprocessing/connection.py\u001b[0m in \u001b[0;36mpoll\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 255\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_closed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 256\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_readable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 257\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_poll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 258\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 259\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__enter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/lib/python3.6/multiprocessing/connection.py\u001b[0m in \u001b[0;36m_poll\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 412\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 413\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_poll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 414\u001b[0;31m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 415\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mbool\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 416\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/lib/python3.6/multiprocessing/connection.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(object_list, timeout)\u001b[0m\n\u001b[1;32m 909\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 910\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 911\u001b[0;31m \u001b[0mready\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mselector\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mselect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 912\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mready\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 913\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfileobj\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mevents\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mready\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/lib/python3.6/selectors.py\u001b[0m in \u001b[0;36mselect\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 374\u001b[0m \u001b[0mready\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 375\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 376\u001b[0;31m \u001b[0mfd_event_list\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_poll\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpoll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 377\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mInterruptedError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 378\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mready\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "VppaUICLG1KB"
},
"source": [
"## More sophisticated finetuning \n",
"(defining a new classifier model at the end of the previous network)"
]
},
{
"cell_type": "code",
"metadata": {
"id": "2hxDm_O3Iuqw"
},
"source": [
"def set_parameter_requires_grad(model, feature_extracting):\n",
" if feature_extracting:\n",
" for param in model.parameters():\n",
" param.requires_grad = False"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "y7s8G5_fIuqx"
},
"source": [
"model_name = \"resnet152\"\n",
"num_classes = 20\n",
"batch_size = 64\n",
"num_epochs = 30\n",
"feature_extract = True\n",
"use_pretrained = True\n",
"\n",
"def initialize_model(model_name, num_classes, feature_extract, use_pretrained=True):\n",
" # Initialize these variables which will be set in this if statement. Each of these\n",
" # variables is model specific.\n",
" model_ft = None\n",
" input_size = 0\n",
"\n",
" if model_name == \"resnet101\":\n",
" \"\"\" Resnet101\n",
" \"\"\"\n",
" model_ft = models.resnet101(pretrained=use_pretrained)\n",
" set_parameter_requires_grad(model_ft, feature_extract)\n",
" num_ftrs = model_ft.fc.in_features\n",
" model_ft.fc = nn.Sequential(\n",
" nn.BatchNorm1d(num_ftrs),\n",
" nn.Dropout(p=0.25),\n",
" nn.Linear(in_features=2048, out_features=4096),\n",
" nn.ReLU(),\n",
" nn.BatchNorm1d(4096, eps=1e-05, momentum=0.1),\n",
" nn.Dropout(p=0.5),\n",
" nn.Linear(in_features=4096, out_features=num_classes),\n",
" )\n",
" input_size = 224\n",
"\n",
" elif model_name == \"resnet152\":\n",
" \"\"\" ResNet-152\n",
" \"\"\"\n",
" model_ft = models.resnet152(pretrained=use_pretrained)\n",
" set_parameter_requires_grad(model_ft, feature_extract)\n",
" num_ftrs = model_ft.fc.in_features\n",
" model_ft.fc = nn.Sequential(\n",
" nn.BatchNorm1d(num_ftrs),\n",
" nn.Dropout(p=0.25),\n",
" nn.Linear(in_features=2048, out_features=2048),\n",
" nn.ReLU(),\n",
" nn.BatchNorm1d(2048, eps=1e-05, momentum=0.1),\n",
" nn.Dropout(p=0.5),\n",
" nn.Linear(in_features=2048, out_features=num_classes),\n",
" )\n",
" input_size = 224\n",
"\n",
" elif model_name == \"resnext101\":\n",
" \"\"\" ResNeXt-101\n",
" \"\"\"\n",
" model_ft = models.resnext101_32x8d(pretrained=use_pretrained)\n",
" set_parameter_requires_grad(model_ft, feature_extract)\n",
" num_ftrs = model_ft.fc.in_features\n",
" model_ft.fc = nn.Sequential(\n",
" nn.BatchNorm1d(num_ftrs),\n",
" nn.Dropout(p=0.25),\n",
" nn.Linear(in_features=2048, out_features=4096),\n",
" nn.ReLU(),\n",
" nn.BatchNorm1d(4096, eps=1e-05, momentum=0.1),\n",
" nn.Dropout(p=0.5),\n",
" nn.Linear(in_features=4096, out_features=num_classes),\n",
" )\n",
" input_size = 299\n",
" \n",
" else:\n",
" print(\"Invalid model name, exiting...\")\n",
" exit()\n",
"\n",
" return model_ft, input_size"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "0JG9xLYrIuqy"
},
"source": [
"model_ft, input_size = initialize_model(model_name, num_classes, feature_extract, use_pretrained=True)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "QhpIyErBIuqy"
},
"source": [
"data_transforms = {\n",
" 'train_images': transforms.Compose([\n",
" transforms.RandomRotation(90),\n",
" transforms.RandomHorizontalFlip(),\n",
" transforms.Resize(input_size),\n",
" transforms.CenterCrop(input_size),\n",
" transforms.ToTensor(),\n",
" transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n",
" ]),\n",
" 'val_images': transforms.Compose([\n",
" transforms.Resize(input_size),\n",
" transforms.CenterCrop(input_size),\n",
" transforms.ToTensor(),\n",
" transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n",
" ]),\n",
"}\n",
"\n",
"\n",
"# data_dir = 'cropped_dataset'\n",
"data_dir = 'cropped_dataset'\n",
"# Create training and validation datasets\n",
"image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train_images', 'val_images']}\n",
"# Create training and validation dataloaders\n",
"dataloaders_dict = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True, num_workers=4) for x in ['train_images', 'val_images']}\n",
"\n",
"# Detect if we have a GPU available\n",
"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "39EOO-5-k_qA"
},
"source": [
"def set_parameter_requires_grad(layer):\n",
" for param in layer.parameters():\n",
" param.requires_grad = True\n",
"\n",
"set_parameter_requires_grad(model_ft.layer4)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Cg8fq3c-Iuqy",
"outputId": "04156fb2-e833-4cf9-f59e-1b628920179a"
},
"source": [
"# Send the model to GPU\n",
"model_ft = model_ft.to(device)\n",
"\n",
"# Gather the parameters to be optimized/updated in this run. If we are\n",
"# finetuning we will be updating all parameters. However, if we are\n",
"# doing feature extract method, we will only update the parameters\n",
"# that we have just initialized, i.e. the parameters with requires_grad\n",
"# is True.\n",
"params_to_update = model_ft.parameters()\n",
"print(\"Params to learn:\")\n",
"if feature_extract:\n",
" params_to_update = []\n",
" for name,param in model_ft.named_parameters():\n",
" if param.requires_grad == True:\n",
" params_to_update.append(param)\n",
" print(\"\\t\",name)\n",
"else:\n",
" for name,param in model_ft.named_parameters():\n",
" if param.requires_grad == True:\n",
" print(\"\\t\",name)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Params to learn:\n",
"\t layer4.0.conv1.weight\n",
"\t layer4.0.bn1.weight\n",
"\t layer4.0.bn1.bias\n",
"\t layer4.0.conv2.weight\n",
"\t layer4.0.bn2.weight\n",
"\t layer4.0.bn2.bias\n",
"\t layer4.0.conv3.weight\n",
"\t layer4.0.bn3.weight\n",
"\t layer4.0.bn3.bias\n",
"\t layer4.0.downsample.0.weight\n",
"\t layer4.0.downsample.1.weight\n",
"\t layer4.0.downsample.1.bias\n",
"\t layer4.1.conv1.weight\n",
"\t layer4.1.bn1.weight\n",
"\t layer4.1.bn1.bias\n",
"\t layer4.1.conv2.weight\n",
"\t layer4.1.bn2.weight\n",
"\t layer4.1.bn2.bias\n",
"\t layer4.1.conv3.weight\n",
"\t layer4.1.bn3.weight\n",
"\t layer4.1.bn3.bias\n",
"\t layer4.2.conv1.weight\n",
"\t layer4.2.bn1.weight\n",
"\t layer4.2.bn1.bias\n",
"\t layer4.2.conv2.weight\n",
"\t layer4.2.bn2.weight\n",
"\t layer4.2.bn2.bias\n",
"\t layer4.2.conv3.weight\n",
"\t layer4.2.bn3.weight\n",
"\t layer4.2.bn3.bias\n",
"\t fc.0.weight\n",
"\t fc.0.bias\n",
"\t fc.2.weight\n",
"\t fc.2.bias\n",
"\t fc.4.weight\n",
"\t fc.4.bias\n",
"\t fc.6.weight\n",
"\t fc.6.bias\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "8xWlBPaQIuq4"
},
"source": [
"# optimizer_ft = optim.Adam(params_to_update)\n",
"optimizer_ft = optim.SGD(params_to_update, lr = 0.001 , momentum=0.9, weight_decay=3.0e-4)\n",
"# Setup the loss fxn\n",
"criterion = nn.CrossEntropyLoss()\n",
"# Scheduler\n",
"scheduler = lr_scheduler.CosineAnnealingLR(optimizer_ft, num_epochs)\n",
"# lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=10, gamma=0.1)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "xxbdx7ROIuq5"
},
"source": [
"def train_model(model, dataloaders, criterion, optimizer, scheduler=None, num_epochs=25, is_inception=False):\n",
" val_acc_history = []\n",
"\n",
" best_model_wts = copy.deepcopy(model.state_dict())\n",
" best_acc = 0.0\n",
"\n",
" for epoch in range(num_epochs):\n",
" # scheduler.step()\n",
" print('Epoch {}/{}'.format(epoch, num_epochs - 1))\n",
" print('-' * 10)\n",
"\n",
" for phase in ['train_images', 'val_images']:\n",
" if phase == 'train_images':\n",
" model.train() # Set model to training mode\n",
" else:\n",
" model.eval() # Set model to evaluate mode\n",
" running_loss = 0.0\n",
" running_corrects = 0\n",
" # Iterate over data.\n",
" for inputs, labels in dataloaders[phase]:\n",
" inputs = inputs.to(device)\n",
" labels = labels.to(device)\n",
" # zero the parameter gradients\n",
" optimizer.zero_grad()\n",
" # forward\n",
" # track history if only in train\n",
" with torch.set_grad_enabled(phase == 'train_images'):\n",
" # Get model outputs and calculate loss\n",
" if is_inception and phase == 'train_images':\n",
" # From https://discuss.pytorch.org/t/how-to-optimize-inception-model-with-auxiliary-classifiers/7958\n",
" outputs, aux_outputs = model(inputs)\n",
" loss1 = criterion(outputs, labels)\n",
" loss2 = criterion(aux_outputs, labels)\n",
" loss = loss1 + 0.4*loss2\n",
" else:\n",
" outputs = model(inputs)\n",
" loss = criterion(outputs, labels)\n",
" _, preds = torch.max(outputs, 1)\n",
" # backward + optimize only if in training phase\n",
" if phase == 'train_images':\n",
" loss.backward()\n",
" optimizer.step()\n",
" # statistics\n",
" running_loss += loss.item() * inputs.size(0)\n",
" running_corrects += torch.sum(preds == labels.data)\n",
"\n",
" epoch_loss = running_loss / len(dataloaders[phase].dataset)\n",
" epoch_acc = running_corrects.double() / len(dataloaders[phase].dataset)\n",
" print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n",
"\n",
" # deep copy the model\n",
" if phase == 'val_images' and epoch_acc > best_acc:\n",
" best_acc = epoch_acc\n",
" best_model_wts = copy.deepcopy(model.state_dict())\n",
" if phase == 'val_images':\n",
" val_acc_history.append(epoch_acc)\n",
"\n",
" print()\n",
"\n",
" print('Best val Acc: {:4f}'.format(best_acc))\n",
"\n",
" # load best model weights\n",
" model.load_state_dict(best_model_wts)\n",
" return model, val_acc_history"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "QpT_MnuiIuq6",
"outputId": "439e5e7d-7460-4187-93a4-16dea20526f3"
},
"source": [
"# Train and evaluate\n",
"model_ft, hist = train_model(model_ft, dataloaders_dict, criterion, optimizer_ft, scheduler, num_epochs=num_epochs, is_inception=(model_name==\"inception\"))"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Epoch 0/29\n",
"----------\n",
"train_images Loss: 2.9212 Acc: 0.1349\n",
"val_images Loss: 2.3965 Acc: 0.5922\n",
"\n",
"Epoch 1/29\n",
"----------\n",
"train_images Loss: 1.6613 Acc: 0.5397\n",
"val_images Loss: 1.2476 Acc: 0.7087\n",
"\n",
"Epoch 2/29\n",
"----------\n",
"train_images Loss: 1.1066 Acc: 0.6682\n",
"val_images Loss: 0.8609 Acc: 0.7379\n",
"\n",
"Epoch 3/29\n",
"----------\n",
"train_images Loss: 0.8247 Acc: 0.7588\n",
"val_images Loss: 0.7568 Acc: 0.8058\n",
"\n",
"Epoch 4/29\n",
"----------\n",
"train_images Loss: 0.7258 Acc: 0.7837\n",
"val_images Loss: 0.7142 Acc: 0.8058\n",
"\n",
"Epoch 5/29\n",
"----------\n",
"train_images Loss: 0.6212 Acc: 0.8133\n",
"val_images Loss: 0.6787 Acc: 0.7961\n",
"\n",
"Epoch 6/29\n",
"----------\n",
"train_images Loss: 0.5359 Acc: 0.8383\n",
"val_images Loss: 0.6376 Acc: 0.8447\n",
"\n",
"Epoch 7/29\n",
"----------\n",
"train_images Loss: 0.4952 Acc: 0.8429\n",
"val_images Loss: 0.6191 Acc: 0.8155\n",
"\n",
"Epoch 8/29\n",
"----------\n",
"train_images Loss: 0.4419 Acc: 0.8577\n",
"val_images Loss: 0.5967 Acc: 0.8350\n",
"\n",
"Epoch 9/29\n",
"----------\n",
"train_images Loss: 0.4137 Acc: 0.8641\n",
"val_images Loss: 0.6017 Acc: 0.8058\n",
"\n",
"Epoch 10/29\n",
"----------\n",
"train_images Loss: 0.3659 Acc: 0.8983\n",
"val_images Loss: 0.5693 Acc: 0.8350\n",
"\n",
"Epoch 11/29\n",
"----------\n",
"train_images Loss: 0.3421 Acc: 0.8993\n",
"val_images Loss: 0.5592 Acc: 0.8544\n",
"\n",
"Epoch 12/29\n",
"----------\n",
"train_images Loss: 0.2943 Acc: 0.9002\n",
"val_images Loss: 0.5607 Acc: 0.8447\n",
"\n",
"Epoch 13/29\n",
"----------\n",
"train_images Loss: 0.3136 Acc: 0.8993\n",
"val_images Loss: 0.5338 Acc: 0.8641\n",
"\n",
"Epoch 14/29\n",
"----------\n",
"train_images Loss: 0.2890 Acc: 0.9057\n",
"val_images Loss: 0.5695 Acc: 0.8641\n",
"\n",
"Epoch 15/29\n",
"----------\n",
"train_images Loss: 0.2575 Acc: 0.9131\n",
"val_images Loss: 0.5508 Acc: 0.8641\n",
"\n",
"Epoch 16/29\n",
"----------\n",
"train_images Loss: 0.2322 Acc: 0.9279\n",
"val_images Loss: 0.5567 Acc: 0.8350\n",
"\n",
"Epoch 17/29\n",
"----------\n",
"train_images Loss: 0.2311 Acc: 0.9316\n",
"val_images Loss: 0.5399 Acc: 0.8350\n",
"\n",
"Epoch 18/29\n",
"----------\n",
"train_images Loss: 0.2204 Acc: 0.9372\n",
"val_images Loss: 0.5491 Acc: 0.8350\n",
"\n",
"Epoch 19/29\n",
"----------\n",
"train_images Loss: 0.1915 Acc: 0.9436\n",
"val_images Loss: 0.5209 Acc: 0.8544\n",
"\n",
"Epoch 20/29\n",
"----------\n",
"train_images Loss: 0.1748 Acc: 0.9473\n",
"val_images Loss: 0.5375 Acc: 0.8447\n",
"\n",
"Epoch 21/29\n",
"----------\n",
"train_images Loss: 0.1527 Acc: 0.9566\n",
"val_images Loss: 0.5281 Acc: 0.8544\n",
"\n",
"Epoch 22/29\n",
"----------\n",
"train_images Loss: 0.1670 Acc: 0.9482\n",
"val_images Loss: 0.5161 Acc: 0.8544\n",
"\n",
"Epoch 23/29\n",
"----------\n",
"train_images Loss: 0.1390 Acc: 0.9575\n",
"val_images Loss: 0.5259 Acc: 0.8544\n",
"\n",
"Epoch 24/29\n",
"----------\n",
"train_images Loss: 0.1418 Acc: 0.9658\n",
"val_images Loss: 0.5305 Acc: 0.8544\n",
"\n",
"Epoch 25/29\n",
"----------\n",
"train_images Loss: 0.1546 Acc: 0.9575\n",
"val_images Loss: 0.5264 Acc: 0.8641\n",
"\n",
"Epoch 26/29\n",
"----------\n",
"train_images Loss: 0.1320 Acc: 0.9630\n",
"val_images Loss: 0.5318 Acc: 0.8544\n",
"\n",
"Epoch 27/29\n",
"----------\n",
"train_images Loss: 0.1245 Acc: 0.9649\n",
"val_images Loss: 0.5311 Acc: 0.8641\n",
"\n",
"Epoch 28/29\n",
"----------\n",
"train_images Loss: 0.1183 Acc: 0.9713\n",
"val_images Loss: 0.5478 Acc: 0.8544\n",
"\n",
"Epoch 29/29\n",
"----------\n",
"train_images Loss: 0.1046 Acc: 0.9750\n",
"val_images Loss: 0.5545 Acc: 0.8641\n",
"\n",
"Best val Acc: 0.864078\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "zalBY6f3sQ-5"
},
"source": [
"# to save the model that we want\n",
"torch.save(model_ft, 'best_model')"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "_T1GnOiCHahg"
},
"source": [
"## Extract features, then create new clasifier models\n",
"Large Scale Fine-Grained Categorization and Domain-Specific Transfer Learning, 2018 paper\n",
"\n",
"Code from https://github.com/richardaecn/cvpr18-inaturalist-transfer (several modifications have been used to make it compatible with colab)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kqASedaz9fnZ"
},
"source": [
"First, we have to download a model from https://github.com/richardaecn/cvpr18-inaturalist-transfer, there is only one that has not been trained on iNat so we use this one https://drive.google.com/file/d/1Djydji-QnJOQ93dWYw-4yVLSP4-TAXHy that has been trained on ImageNet. "
]
},
{
"cell_type": "code",
"metadata": {
"id": "DL1l_RLE_n3l"
},
"source": [
"# tensorflow version compatible with the code\n",
"!pip install tensorflow==1.11"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "_KiaJjaCAmW9",
"outputId": "34698f06-6915-483f-e99b-996f9cfaf80f"
},
"source": [
"!git clone --recursive https://github.com/richardaecn/cvpr18-inaturalist-transfer.git"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Cloning into 'cvpr18-inaturalist-transfer'...\n",
"remote: Enumerating objects: 137, done.\u001b[K\n",
"remote: Total 137 (delta 0), reused 0 (delta 0), pack-reused 137\u001b[K\n",
"Receiving objects: 100% (137/137), 1.97 MiB | 22.39 MiB/s, done.\n",
"Resolving deltas: 100% (38/38), done.\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "2SqGtd-uHhhz",
"outputId": "70bad82e-280c-4819-c981-94bcaa9e529c"
},
"source": [
"# download inceptionv3 pretrained on imageNet\n",
"!wget --load-cookies /tmp/cookies.txt \"https://drive.google.com/u/0/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://drive.google.com/u/0/uc?export=download&id=1Djydji-QnJOQ93dWYw-4yVLSP4-TAXHy' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\\1\\n/p')&id=1Djydji-QnJOQ93dWYw-4yVLSP4-TAXHy\" -O inception_v3_ILSVRC_299.ckpt && rm -rf /tmp/cookies.txt"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"--2020-11-23 17:27:17-- https://drive.google.com/u/0/uc?export=download&confirm=Xnvu&id=1Djydji-QnJOQ93dWYw-4yVLSP4-TAXHy\n",
"Resolving drive.google.com (drive.google.com)... 142.250.99.138, 142.250.99.100, 142.250.99.139, ...\n",
"Connecting to drive.google.com (drive.google.com)|142.250.99.138|:443... connected.\n",
"HTTP request sent, awaiting response... 302 Moved Temporarily\n",
"Location: https://doc-0c-8o-docs.googleusercontent.com/docs/securesc/6st36fn75vr8ggsrck3acfllano80h0v/407sd4hh5rt4732cfj4d2fcvcfoe87ec/1606152375000/13117058851018264575/11478932493189232070Z/1Djydji-QnJOQ93dWYw-4yVLSP4-TAXHy?e=download [following]\n",
"--2020-11-23 17:27:17-- https://doc-0c-8o-docs.googleusercontent.com/docs/securesc/6st36fn75vr8ggsrck3acfllano80h0v/407sd4hh5rt4732cfj4d2fcvcfoe87ec/1606152375000/13117058851018264575/11478932493189232070Z/1Djydji-QnJOQ93dWYw-4yVLSP4-TAXHy?e=download\n",
"Resolving doc-0c-8o-docs.googleusercontent.com (doc-0c-8o-docs.googleusercontent.com)... 74.125.199.132, 2607:f8b0:400e:c02::84\n",
"Connecting to doc-0c-8o-docs.googleusercontent.com (doc-0c-8o-docs.googleusercontent.com)|74.125.199.132|:443... connected.\n",
"HTTP request sent, awaiting response... 302 Found\n",
"Location: https://docs.google.com/nonceSigner?nonce=11org9rj78a00&continue=https://doc-0c-8o-docs.googleusercontent.com/docs/securesc/6st36fn75vr8ggsrck3acfllano80h0v/407sd4hh5rt4732cfj4d2fcvcfoe87ec/1606152375000/13117058851018264575/11478932493189232070Z/1Djydji-QnJOQ93dWYw-4yVLSP4-TAXHy?e%3Ddownload&hash=uo9984c5usr2b9h4c241k2f7ijeimlv2 [following]\n",
"--2020-11-23 17:27:17-- https://docs.google.com/nonceSigner?nonce=11org9rj78a00&continue=https://doc-0c-8o-docs.googleusercontent.com/docs/securesc/6st36fn75vr8ggsrck3acfllano80h0v/407sd4hh5rt4732cfj4d2fcvcfoe87ec/1606152375000/13117058851018264575/11478932493189232070Z/1Djydji-QnJOQ93dWYw-4yVLSP4-TAXHy?e%3Ddownload&hash=uo9984c5usr2b9h4c241k2f7ijeimlv2\n",
"Resolving docs.google.com (docs.google.com)... 74.125.142.102, 74.125.142.113, 74.125.142.138, ...\n",
"Connecting to docs.google.com (docs.google.com)|74.125.142.102|:443... connected.\n",
"HTTP request sent, awaiting response... 302 Found\n",
"Location: https://doc-0c-8o-docs.googleusercontent.com/docs/securesc/6st36fn75vr8ggsrck3acfllano80h0v/407sd4hh5rt4732cfj4d2fcvcfoe87ec/1606152375000/13117058851018264575/11478932493189232070Z/1Djydji-QnJOQ93dWYw-4yVLSP4-TAXHy?e=download&nonce=11org9rj78a00&user=11478932493189232070Z&hash=50a1m6rmaph86d4vjpov2f8ld8tlcr8m [following]\n",
"--2020-11-23 17:27:17-- https://doc-0c-8o-docs.googleusercontent.com/docs/securesc/6st36fn75vr8ggsrck3acfllano80h0v/407sd4hh5rt4732cfj4d2fcvcfoe87ec/1606152375000/13117058851018264575/11478932493189232070Z/1Djydji-QnJOQ93dWYw-4yVLSP4-TAXHy?e=download&nonce=11org9rj78a00&user=11478932493189232070Z&hash=50a1m6rmaph86d4vjpov2f8ld8tlcr8m\n",
"Connecting to doc-0c-8o-docs.googleusercontent.com (doc-0c-8o-docs.googleusercontent.com)|74.125.199.132|:443... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: unspecified [application/octet-stream]\n",
"Saving to: ‘inception_v3_ILSVRC_299.ckpt’\n",
"\n",
"inception_v3_ILSVRC [ <=> ] 414.57M 92.4MB/s in 4.7s \n",
"\n",
"2020-11-23 17:27:22 (89.1 MB/s) - ‘inception_v3_ILSVRC_299.ckpt’ saved [434712740]\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "2rRD_DKOubbT"
},
"source": [
"# the following code takes time to process (around 10min)\n",
"from __future__ import absolute_import\n",
"from __future__ import division\n",
"from __future__ import print_function\n",
"\n",
"import numpy as np\n",
"import os\n",
"import sys\n",
"import time\n",
"import tensorflow as tf\n",
"\n",
"slim = tf.contrib.slim\n",
"sys.path.insert(0, '/content/cvpr18-inaturalist-transfer/slim/')\n",
"from nets import inception, resnet_v2\n",
"from preprocessing import inception_preprocessing\n",
"\n",
"data_dir = './cropped_dataset'\n",
"\n",
"base_network = 'InceptionV3'\n",
"checkpoints_path = 'inception_v3_ILSVRC_299.ckpt'\n",
"\n",
"image_size = 299\n",
"moving_average_decay = 0.9999\n",
"fea_dim = 2048\n",
"\n",
"# Read train and val list.\n",
"train_list = []\n",
"val_list = []\n",
"test_list = []\n",
"\n",
"data_transforms = None\n",
"train_loader = torch.utils.data.DataLoader(datasets.ImageFolder('cropped_dataset/train_images'))\n",
"val_loader = torch.utils.data.DataLoader(datasets.ImageFolder('cropped_dataset/val_images'))\n",
"test_loader = torch.utils.data.DataLoader(datasets.ImageFolder('cropped_dataset/test_images'))\n",
"train_list = train_loader.dataset.imgs\n",
"val_list = val_loader.dataset.imgs\n",
"test_list = test_loader.dataset.imgs\n",
"\n",
"# Base network architecture\n",
"if base_network == 'InceptionV3':\n",
" endpoint = 'Mixed_7c'\n",
" arg_scope = inception.inception_v3_arg_scope()\n",
"\n",
"# Feature extraction.\n",
"fea_train = np.zeros((len(train_list), fea_dim), dtype=np.float32)\n",
"label_train = np.zeros((len(train_list), ), dtype=np.int32)\n",
"fea_val = np.zeros((len(val_list), fea_dim), dtype=np.float32)\n",
"label_val = np.zeros((len(val_list), ), dtype=np.int32)\n",
"fea_test = np.zeros((len(test_list), fea_dim), dtype=np.float32)\n",
"\n",
"with tf.Graph().as_default():\n",
" tf_global_step = tf.train.get_or_create_global_step()\n",
" image_path = tf.placeholder(tf.string)\n",
" image = tf.image.decode_jpeg(tf.read_file(image_path), channels=3)\n",
" image = tf.image.convert_image_dtype(image, tf.float32)\n",
" image = inception_preprocessing.preprocess_image(image,\n",
" image_size,\n",
" image_size,\n",
" is_training=False)\n",
" images = tf.expand_dims(image, 0)\n",
"\n",
" with slim.arg_scope(arg_scope):\n",
" slim_args = [slim.batch_norm, slim.dropout]\n",
" with slim.arg_scope(slim_args, is_training=False):\n",
" with tf.variable_scope(base_network, reuse=None) as scope:\n",
" if base_network == 'InceptionV3':\n",
" net, _ = inception.inception_v3_base(\n",
" images, final_endpoint=endpoint, scope=scope)\n",
" net = tf.reduce_mean(net, [0,1,2])\n",
"\n",
" variable_averages = tf.train.ExponentialMovingAverage(\n",
" moving_average_decay, tf_global_step)\n",
" variables_to_restore = variable_averages.variables_to_restore()\n",
" init_fn = slim.assign_from_checkpoint_fn(\n",
" checkpoints_path, variables_to_restore)\n",
"\n",
" config_sess = tf.ConfigProto(allow_soft_placement=True)\n",
" config_sess.gpu_options.allow_growth = True\n",
" with tf.Session(config=config_sess) as sess:\n",
" init_fn(sess)\n",
" start = time.time()\n",
" for i in range(len(fea_train)):\n",
" if i%1000 == 0:\n",
" fea = sess.run(net, feed_dict={image_path:train_list[i][0]})\n",
" fea_train[i, :] = fea\n",
" label_train[i] = train_list[i][1]\n",
" for i in range(len(fea_val)):\n",
" if i%1000 == 0:\n",
" fea_val[i, :] = fea\n",
" label_val[i] = val_list[i][1]\n",
" for i in range(len(fea_test)):\n",
" fea = sess.run(net, feed_dict={image_path:test_list[i][0]})\n",
" fea_test[i, :] = fea\n",
"\n",
"model_name = checkpoints_path.split('/')[-1].split('.ckpt')[0]\n",
"if not os.path.exists(os.path.join('./feature', model_name)):\n",
" os.makedirs(os.path.join('./feature', model_name))\n",
"\n",
"save_dir = os.path.join('./feature', model_name)\n",
"np.save(os.path.join(save_dir + '_feature_train.npy'), fea_train)\n",
"np.save(os.path.join(save_dir + '_label_train.npy'), label_train)\n",
"np.save(os.path.join(save_dir + '_feature_val.npy'), fea_val)\n",
"np.save(os.path.join(save_dir + '_label_val.npy'), label_val)\n",
"np.save(os.path.join(save_dir + '_feature_test.npy'), fea_test)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "22mKdNLFQR9r"
},
"source": [
"We can then use the extracted feature like in a classical classification task."
]
},
{
"cell_type": "code",
"metadata": {
"id": "jTrtiIOjQRkg"
},
"source": [
"# Gradient boosting\n",
"from sklearn.datasets import make_classification\n",
"from sklearn.ensemble import GradientBoostingClassifier\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"clf = GradientBoostingClassifier(random_state=0)\n",
"clf.fit(fea_train, label_train)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "hCBDYQd6XE5K",
"outputId": "a430fd6b-0527-4560-d017-d92bf28659c1"
},
"source": [
"clf.score(fea_val, label_val)"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.8543689320388349"
]
},
"metadata": {
"tags": []
},
"execution_count": 27
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "X8LDjiJ0Xta0",
"outputId": "2370981f-302b-4220-f10d-06c39ff79948"
},
"source": [
"# Logistic Regression\n",
"from sklearn.linear_model import LogisticRegression\n",
"\n",
"LR = LogisticRegression(solver='lbfgs', multi_class='multinomial', max_iter=500)\n",
"LR.fit(fea_train, label_train)"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
" intercept_scaling=1, l1_ratio=None, max_iter=500,\n",
" multi_class='multinomial', n_jobs=None, penalty='l2',\n",
" random_state=None, solver='lbfgs', tol=0.0001, verbose=0,\n",
" warm_start=False)"
]
},
"metadata": {
"tags": []
},
"execution_count": 52
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "4fZWWeK7X7oR",
"outputId": "9e819aa3-2dcf-4e36-d694-6bcae52b9ada"
},
"source": [
"LR.score(fea_val, label_val)"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.941747572815534"
]
},
"metadata": {
"tags": []
},
"execution_count": 53
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MddI84QICRTk"
},
"source": [
"The Logistic Regression gives good results, we decide to create a csv submission file for this classification method. "
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "FcFFEtnDZMNF",
"outputId": "c205656c-cdd5-4841-fc7d-e6abf9f8b7cb"
},
"source": [
"test_dir = '/content/cropped_dataset/test_images/mistery_category'\n",
"\n",
"output_file = open('kaggle_LR.csv', \"w\")\n",
"output_file.write(\"Id,Category\\n\")\n",
"for i,f in enumerate(test_list):\n",
" name = f[0].split('/')[3].split('.')[0]\n",
" pred = LR.predict([fea_test[i]])[0]\n",
" output_file.write(\"%s,%d\\n\" % (name, pred))\n",
"\n",
"output_file.close()\n",
"\n",
"print(\"Succesfully wrote, you can upload this file to the kaggle competition website\")"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Succesfully wrote, you can upload this file to the kaggle competition website\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "BS6yC_dyUC3h"
},
"source": [
"## Implementation of API Net\n",
"Learning Attentive Pairwise Interaction for Fine-Grained Classification (API-Net), 2020 paper\n",
"\n",
"Code from https://github.com/PeiqinZhuang/API-Net (several modifications have been used to make it compatible with colab)"
]
},
{
"cell_type": "code",
"metadata": {
"id": "4cBDjEgxV58q"
},
"source": [
"# Utils\n",
"def save_checkpoint(state, is_best, filename='checkpoint.pth.tar'):\n",
" torch.save(state, filename)\n",
" if is_best:\n",
" shutil.copyfile(filename, 'model_best.pth.tar')\n",
"\n",
"\n",
"class AverageMeter(object):\n",
" \"\"\"\n",
" Keeps track of most recent, average, sum, and count of a metric.\n",
" \"\"\"\n",
"\n",
" def __init__(self):\n",
" self.reset()\n",
"\n",
" def reset(self):\n",
" self.val = 0\n",
" self.avg = 0\n",
" self.sum = 0\n",
" self.count = 0\n",
"\n",
" def update(self, val, n=1):\n",
" self.val = val\n",
" self.sum += val * n\n",
" self.count += n\n",
" self.avg = self.sum / self.count\n",
"\n",
"def accuracy(scores, targets, k):\n",
" \"\"\"\n",
" Computes top-k accuracy, from predicted and true labels.\n",
" :param scores: scores from the model\n",
" :param targets: true labels\n",
" :param k: k in top-k accuracy\n",
" :return: top-k accuracy\n",
" \"\"\"\n",
"\n",
" batch_size = targets.size(0)\n",
" _, ind = scores.topk(k, 1, True, True)\n",
" correct = ind.eq(targets.view(-1, 1).expand_as(ind))\n",
" correct_total = correct.view(-1).float().sum() # 0D tensor\n",
" return correct_total.item() * (100.0 / batch_size)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "A3tJC9WtKxck"
},
"source": [
"# Model Definition\n",
"def pdist(vectors):\n",
" distance_matrix = -2 * vectors.mm(torch.t(vectors)) + vectors.pow(2).sum(dim=1).view(1, -1) + vectors.pow(2).sum(\n",
" dim=1).view(-1, 1)\n",
" return distance_matrix\n",
"\n",
"class API_Net(nn.Module):\n",
" def __init__(self):\n",
" super(API_Net, self).__init__()\n",
"\n",
" resnet101 = models.resnet101(pretrained=True)\n",
" layers = list(resnet101.children())[:-2]\n",
"\n",
" self.conv = nn.Sequential(*layers)\n",
" self.avg = nn.AvgPool2d(kernel_size=7 ,stride=1)\n",
" self.map1 = nn.Linear(2048 * 2, 512)\n",
" self.map2 = nn.Linear(512, 2048)\n",
" self.fc = nn.Linear(2048, 20)\n",
" self.drop = nn.Dropout(p=0.5)\n",
" self.sigmoid = nn.Sigmoid()\n",
"\n",
"\n",
" def forward(self, images, targets=None, flag='train'):\n",
" conv_out = self.conv(images)\n",
" pool_out = self.avg(conv_out).squeeze()\n",
"\n",
" if flag == 'train':\n",
" intra_pairs, inter_pairs, \\\n",
" intra_labels, inter_labels = self.get_pairs(pool_out, targets)\n",
"\n",
" features1 = torch.cat([pool_out[intra_pairs[:, 0]], pool_out[inter_pairs[:, 0]]], dim=0)\n",
" features2 = torch.cat([pool_out[intra_pairs[:, 1]], pool_out[inter_pairs[:, 1]]], dim=0)\n",
" labels1 = torch.cat([intra_labels[:, 0], inter_labels[:, 0]], dim=0)\n",
" labels2 = torch.cat([intra_labels[:, 1], inter_labels[:, 1]], dim=0)\n",
"\n",
"\n",
" mutual_features = torch.cat([features1, features2], dim=1)\n",
" map1_out = self.map1(mutual_features)\n",
" map2_out = self.drop(map1_out)\n",
" map2_out = self.map2(map2_out)\n",
"\n",
"\n",
" gate1 = torch.mul(map2_out, features1)\n",
" gate1 = self.sigmoid(gate1)\n",
"\n",
" gate2 = torch.mul(map2_out, features2)\n",
" gate2 = self.sigmoid(gate2)\n",
"\n",
" features1_self = torch.mul(gate1, features1) + features1\n",
" features1_other = torch.mul(gate2, features1) + features1\n",
"\n",
" features2_self = torch.mul(gate2, features2) + features2\n",
" features2_other = torch.mul(gate1, features2) + features2\n",
"\n",
" logit1_self = self.fc(self.drop(features1_self))\n",
" logit1_other = self.fc(self.drop(features1_other))\n",
" logit2_self = self.fc(self.drop(features2_self))\n",
" logit2_other = self.fc(self.drop(features2_other))\n",
"\n",
" return logit1_self, logit1_other, logit2_self, logit2_other, labels1, labels2\n",
"\n",
" elif flag == 'val':\n",
" return self.fc(pool_out)\n",
"\n",
"\n",
" def get_pairs(self, embeddings, labels):\n",
" distance_matrix = pdist(embeddings).detach().cpu().numpy()\n",
"\n",
" labels = labels.detach().cpu().numpy().reshape(-1,1)\n",
" num = labels.shape[0]\n",
" dia_inds = np.diag_indices(num)\n",
" lb_eqs = (labels == labels.T)\n",
" lb_eqs[dia_inds] = False\n",
" dist_same = distance_matrix.copy()\n",
" dist_same[lb_eqs == False] = np.inf\n",
" intra_idxs = np.argmin(dist_same, axis=1)\n",
"\n",
" dist_diff = distance_matrix.copy()\n",
" lb_eqs[dia_inds] = True\n",
" dist_diff[lb_eqs == True] = np.inf\n",
" inter_idxs = np.argmin(dist_diff, axis=1)\n",
"\n",
" intra_pairs = np.zeros([embeddings.shape[0], 2])\n",
" inter_pairs = np.zeros([embeddings.shape[0], 2])\n",
" intra_labels = np.zeros([embeddings.shape[0], 2])\n",
" inter_labels = np.zeros([embeddings.shape[0], 2])\n",
" for i in range(embeddings.shape[0]):\n",
" intra_labels[i, 0] = labels[i]\n",
" intra_labels[i, 1] = labels[intra_idxs[i]]\n",
" intra_pairs[i, 0] = i\n",
" intra_pairs[i, 1] = intra_idxs[i]\n",
"\n",
" inter_labels[i, 0] = labels[i]\n",
" inter_labels[i, 1] = labels[inter_idxs[i]]\n",
" inter_pairs[i, 0] = i\n",
" inter_pairs[i, 1] = inter_idxs[i]\n",
"\n",
" intra_labels = torch.from_numpy(intra_labels).long().to(device)\n",
" intra_pairs = torch.from_numpy(intra_pairs).long().to(device)\n",
" inter_labels = torch.from_numpy(inter_labels).long().to(device)\n",
" inter_pairs = torch.from_numpy(inter_pairs).long().to(device)\n",
"\n",
" return intra_pairs, inter_pairs, intra_labels, inter_labels"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "foXkEYF_UnTr"
},
"source": [
"best_prec1 = 0\n",
"\n",
"def train(train_loader, val_loader, model, criterion, optimizer_conv,scheduler_conv, optimizer_fc, scheduler_fc, epoch, step, print_freq = 5):\n",
" global best_prec1\n",
"\n",
" batch_time = AverageMeter()\n",
" data_time = AverageMeter()\n",
" softmax_losses = AverageMeter()\n",
" rank_losses = AverageMeter()\n",
" losses = AverageMeter()\n",
" top1 = AverageMeter()\n",
" top5 = AverageMeter()\n",
"\n",
" # switch to train mode\n",
" end = time.time()\n",
" rank_criterion = nn.MarginRankingLoss(margin=0.05)\n",
" softmax_layer = nn.Softmax(dim=1).to(device)\n",
"\n",
" for i, (input, target) in enumerate(train_loader):\n",
" model.train()\n",
"\n",
" # measure data loading time\n",
" data_time.update(time.time() - end)\n",
" input_var = input.to(device)\n",
" target_var = target.to(device).squeeze()\n",
"\n",
"\n",
" # compute output\n",
" logit1_self, logit1_other, logit2_self, logit2_other, labels1, labels2 = model(input_var, target_var, flag='train')\n",
" batch_size = logit1_self.shape[0]\n",
" labels1 = labels1.to(device)\n",
" labels2 = labels2.to(device)\n",
"\n",
" self_logits = torch.zeros(2*batch_size, 20).to(device)\n",
" other_logits= torch.zeros(2*batch_size, 20).to(device)\n",
" self_logits[:batch_size] = logit1_self\n",
" self_logits[batch_size:] = logit2_self\n",
" other_logits[:batch_size] = logit1_other\n",
" other_logits[batch_size:] = logit2_other\n",
"\n",
" # compute loss\n",
" logits = torch.cat([self_logits, other_logits], dim=0)\n",
" targets = torch.cat([labels1, labels2, labels1, labels2], dim=0)\n",
" softmax_loss = criterion(logits, targets)\n",
"\n",
" self_scores = softmax_layer(self_logits)[torch.arange(2*batch_size).to(device).long(),\n",
" torch.cat([labels1, labels2], dim=0)]\n",
" other_scores = softmax_layer(other_logits)[torch.arange(2*batch_size).to(device).long(),\n",
" torch.cat([labels1, labels2], dim=0)]\n",
" flag = torch.ones([2*batch_size, ]).to(device)\n",
" rank_loss = rank_criterion(self_scores, other_scores, flag)\n",
"\n",
" loss = softmax_loss + rank_loss\n",
"\n",
" # measure accuracy and record loss\n",
" prec1 = accuracy(logits, targets, 1)\n",
" prec5 = accuracy(logits, targets, 5)\n",
" losses.update(loss.item(), 2*batch_size)\n",
" softmax_losses.update(softmax_loss.item(), 4*batch_size)\n",
" rank_losses.update(rank_loss.item(), 2*batch_size)\n",
" top1.update(prec1, 4*batch_size)\n",
" top5.update(prec5, 4*batch_size)\n",
"\n",
" # compute gradient and do SGD step\n",
" optimizer_conv.zero_grad()\n",
" optimizer_fc.zero_grad()\n",
" loss.backward()\n",
" if epoch >= 8:\n",
" optimizer_conv.step()\n",
" optimizer_fc.step()\n",
" scheduler_conv.step()\n",
" scheduler_fc.step()\n",
"\n",
"\n",
" # measure elapsed time\n",
" batch_time.update(time.time() - end)\n",
" end = time.time()\n",
"\n",
" if i % print_freq == 0:\n",
" print('Time: {time}\\nStep: {step}\\t Epoch: [{0}][{1}/{2}]\\t'\n",
" 'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\\t'\n",
" 'Data {data_time.val:.3f} ({data_time.avg:.3f})\\t'\n",
" 'Loss {loss.val:.4f} ({loss.avg:.4f})\\t'\n",
" 'SoftmaxLoss {softmax_loss.val:.4f} ({softmax_loss.avg:.4f})\\t'\n",
" 'RankLoss {rank_loss.val:.4f} ({rank_loss.avg:.4f})\\t'\n",
" 'Prec@1 {top1.val:.3f} ({top1.avg:.3f})\\t'\n",
" 'Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format(\n",
" epoch, i, len(train_loader), batch_time=batch_time,\n",
" data_time=data_time, loss=losses, softmax_loss=softmax_losses, rank_loss=rank_losses,\n",
" top1=top1, top5=top5, step=step, time= time.asctime(time.localtime(time.time()))))\n",
"\n",
" if i== len(train_loader) - 1:\n",
" prec1 = validate(val_loader, model, criterion)\n",
"\n",
" # remember best prec@1 and save checkpoint\n",
" is_best = prec1 > best_prec1\n",
" best_prec1 = max(prec1, best_prec1)\n",
" save_checkpoint({\n",
" 'epoch': epoch + 1,\n",
" 'state_dict': model.state_dict(),\n",
" 'best_prec1': best_prec1,\n",
" 'optimizer_conv': optimizer_conv.state_dict(),\n",
" 'optimizer_fc': optimizer_fc.state_dict(),\n",
" }, is_best)\n",
"\n",
" step = step +1\n",
" return step\n",
"\n",
"\n",
"def validate(val_loader, model, criterion, print_freq = 5):\n",
" batch_time = AverageMeter()\n",
" softmax_losses = AverageMeter()\n",
" top1 = AverageMeter()\n",
" top5 = AverageMeter()\n",
"\n",
" # switch to evaluate mode\n",
" model.eval()\n",
" end = time.time()\n",
"\n",
" with torch.no_grad():\n",
" for i, (input, target) in enumerate(val_loader):\n",
"\n",
" input_var = input.to(device)\n",
" target_var = target.to(device).squeeze()\n",
"\n",
" # compute output\n",
" logits = model(input_var, targets=None, flag='val')\n",
" softmax_loss = criterion(logits, target_var)\n",
"\n",
"\n",
" prec1= accuracy(logits, target_var, 1)\n",
" prec5 = accuracy(logits, target_var, 5)\n",
" softmax_losses.update(softmax_loss.item(), logits.size(0))\n",
" top1.update(prec1, logits.size(0))\n",
" top5.update(prec5, logits.size(0))\n",
"\n",
" # measure elapsed time\n",
" batch_time.update(time.time() - end)\n",
" end = time.time()\n",
"\n",
"\n",
"\n",
" if i % print_freq == 0:\n",
" print('Time: {time}\\nTest: [{0}/{1}]\\t'\n",
" 'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\\t'\n",
" 'SoftmaxLoss {softmax_loss.val:.4f} ({softmax_loss.avg:.4f})\\t'\n",
" 'Prec@1 {top1.val:.3f} ({top1.avg:.3f})\\t'\n",
" 'Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format(\n",
" i, len(val_loader), batch_time=batch_time, softmax_loss=softmax_losses,\n",
" top1=top1, top5=top5, time=time.asctime(time.localtime(time.time()))))\n",
" print(' * Prec@1 {top1.avg:.3f} Prec@5 {top5.avg:.3f}'.format(top1=top1, top5=top5))\n",
"\n",
" return top1.avg"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "d46tXMR0VJpu"
},
"source": [
"input_size = 224\n",
"batch_size = 64\n",
"num_epochs = 20\n",
"\n",
"data_transforms = {\n",
" 'train_images': transforms.Compose([\n",
" transforms.Resize(input_size),\n",
" transforms.RandomHorizontalFlip(),\n",
" transforms.RandomRotation(90),\n",
" transforms.ToTensor(),\n",
" transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n",
" ]),\n",
" 'val_images': transforms.Compose([\n",
" transforms.Resize((input_size,input_size)),\n",
" transforms.ToTensor(),\n",
" transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n",
" ]),\n",
"}\n",
"\n",
"data_dir = 'cropped_dataset'\n",
"# Create training and validation datasets\n",
"image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train_images', 'val_images']}\n",
"# Create training and validation dataloaders\n",
"# dataloaders_dict = {x: torch.utils.data.DataLoader(image_datasets[x], shuffle=True, num_workers=4) for x in ['train_images', 'val_images']}\n",
"dataloaders_dict = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True, num_workers=4) for x in ['train_images', 'val_images']}\n",
"train_loader = dataloaders_dict[\"train_images\"]\n",
"val_loader = dataloaders_dict[\"val_images\"]\n",
"\n",
"model = API_Net()\n",
"model = model.to(device)\n",
"model.conv = nn.DataParallel(model.conv)\n",
"\n",
"# define loss function (criterion) and optimizer\n",
"criterion = nn.CrossEntropyLoss().to(device)\n",
"optimizer_conv = torch.optim.SGD(model.conv.parameters(), 0.001,momentum=0.9,weight_decay=3.0e-4)\n",
"\n",
"fc_parameters = [value for name, value in model.named_parameters() if 'conv' not in name]\n",
"optimizer_fc = torch.optim.SGD(fc_parameters, 0.001, momentum=0.9, weight_decay=3.0e-4)\n",
"\n",
"scheduler_conv = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_conv, 100*len(train_loader))\n",
"scheduler_fc = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_fc, 100*len(train_loader))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 285
},
"id": "9PNa0WjbvfBZ",
"outputId": "558752e3-8620-4240-b96f-f2ddc36c32b0"
},
"source": [
"# define loss function (criterion) and optimizer\n",
"criterion = nn.CrossEntropyLoss().to(device)\n",
"optimizer_conv = torch.optim.SGD(model.conv.parameters(), 0.001,momentum=0.9,weight_decay=3.0e-4)\n",
"\n",
"fc_parameters = [value for name, value in model.named_parameters() if 'conv' not in name]\n",
"optimizer_fc = torch.optim.SGD(fc_parameters, 0.001, momentum=0.9, weight_decay=3.0e-4)\n",
"\n",
"scheduler_conv = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_conv, 100*len(train_loader))\n",
"scheduler_fc = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_fc, 100*len(train_loader))"
],
"execution_count": null,
"outputs": [
{
"output_type": "error",
"ename": "NameError",
"evalue": "ignored",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-1-bcdce20551ed>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# define loss function (criterion) and optimizer\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mcriterion\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mCrossEntropyLoss\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0moptimizer_conv\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptim\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSGD\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparameters\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.001\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mmomentum\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.9\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mweight_decay\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m3.0e-4\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mfc_parameters\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mvalue\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnamed_parameters\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'conv'\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'nn' is not defined"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "h5Q2JFP5W_WM",
"outputId": "379006a7-6d2f-42db-8059-01cc86cdfaa6"
},
"source": [
"step = 0\n",
"print('START TIME:', time.asctime(time.localtime(time.time())))\n",
"for epoch in range(num_epochs):\n",
" step = train(train_loader, val_loader,model, criterion, optimizer_conv, scheduler_conv, optimizer_fc, scheduler_fc, epoch, step)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"START TIME: Mon Nov 23 15:48:29 2020\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/dist-packages/torch/optim/lr_scheduler.py:136: UserWarning: Detected call of `lr_scheduler.step()` before `optimizer.step()`. In PyTorch 1.1.0 and later, you should call them in the opposite order: `optimizer.step()` before `lr_scheduler.step()`. Failure to do this will result in PyTorch skipping the first value of the learning rate schedule. See more details at https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate\n",
" \"https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate\", UserWarning)\n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"Time: Mon Nov 23 15:48:31 2020\n",
"Step: 0\t Epoch: [0][0/17]\tTime 2.441 (2.441)\tData 1.904 (1.904)\tLoss 0.5862 (0.5862)\tSoftmaxLoss 0.5096 (0.5096)\tRankLoss 0.0766 (0.0766)\tPrec@1 83.984 (83.984)\tPrec@5 98.047 (98.047)\n",
"Time: Mon Nov 23 15:48:37 2020\n",
"Step: 5\t Epoch: [0][5/17]\tTime 1.090 (1.336)\tData 0.017 (0.336)\tLoss 0.5871 (0.5795)\tSoftmaxLoss 0.5261 (0.5141)\tRankLoss 0.0610 (0.0654)\tPrec@1 81.836 (83.594)\tPrec@5 98.242 (96.680)\n",
"Time: Mon Nov 23 15:48:42 2020\n",
"Step: 10\t Epoch: [0][10/17]\tTime 1.101 (1.227)\tData 0.005 (0.187)\tLoss 0.5290 (0.6274)\tSoftmaxLoss 0.4653 (0.5595)\tRankLoss 0.0636 (0.0679)\tPrec@1 82.812 (82.280)\tPrec@5 97.852 (96.040)\n",
"Time: Mon Nov 23 15:48:48 2020\n",
"Step: 15\t Epoch: [0][15/17]\tTime 1.117 (1.191)\tData 0.007 (0.131)\tLoss 0.5993 (0.6403)\tSoftmaxLoss 0.5329 (0.5724)\tRankLoss 0.0664 (0.0679)\tPrec@1 85.352 (82.324)\tPrec@5 93.945 (95.557)\n",
"Time: Mon Nov 23 15:48:50 2020\n",
"Test: [0/2]\tTime 1.156 (1.156)\tSoftmaxLoss 0.4356 (0.4356)\tPrec@1 87.500 (87.500)\tPrec@5 96.875 (96.875)\n",
" * Prec@1 88.350 Prec@5 98.058\n",
"Time: Mon Nov 23 15:48:53 2020\n",
"Step: 17\t Epoch: [1][0/17]\tTime 2.308 (2.308)\tData 1.727 (1.727)\tLoss 0.5986 (0.5986)\tSoftmaxLoss 0.5319 (0.5319)\tRankLoss 0.0667 (0.0667)\tPrec@1 81.641 (81.641)\tPrec@5 99.219 (99.219)\n",
"Time: Mon Nov 23 15:48:59 2020\n",
"Step: 22\t Epoch: [1][5/17]\tTime 1.143 (1.357)\tData 0.021 (0.306)\tLoss 0.7264 (0.5872)\tSoftmaxLoss 0.6523 (0.5183)\tRankLoss 0.0741 (0.0689)\tPrec@1 77.344 (83.984)\tPrec@5 97.461 (96.712)\n",
"Time: Mon Nov 23 15:49:05 2020\n",
"Step: 27\t Epoch: [1][10/17]\tTime 1.154 (1.265)\tData 0.008 (0.170)\tLoss 0.4048 (0.5671)\tSoftmaxLoss 0.3375 (0.5008)\tRankLoss 0.0673 (0.0663)\tPrec@1 88.867 (84.730)\tPrec@5 100.000 (96.449)\n",
"Time: Mon Nov 23 15:49:11 2020\n",
"Step: 32\t Epoch: [1][15/17]\tTime 1.164 (1.232)\tData 0.007 (0.119)\tLoss 0.5703 (0.5810)\tSoftmaxLoss 0.4860 (0.5136)\tRankLoss 0.0843 (0.0674)\tPrec@1 86.328 (84.277)\tPrec@5 98.438 (96.301)\n",
"Time: Mon Nov 23 15:49:13 2020\n",
"Test: [0/2]\tTime 1.184 (1.184)\tSoftmaxLoss 0.5065 (0.5065)\tPrec@1 85.938 (85.938)\tPrec@5 98.438 (98.438)\n",
" * Prec@1 89.320 Prec@5 98.058\n",
"Time: Mon Nov 23 15:49:17 2020\n",
"Step: 34\t Epoch: [2][0/17]\tTime 2.731 (2.731)\tData 2.078 (2.078)\tLoss 0.5127 (0.5127)\tSoftmaxLoss 0.4503 (0.4503)\tRankLoss 0.0624 (0.0624)\tPrec@1 86.914 (86.914)\tPrec@5 96.875 (96.875)\n",
"Time: Mon Nov 23 15:49:23 2020\n",
"Step: 39\t Epoch: [2][5/17]\tTime 1.125 (1.414)\tData 0.005 (0.361)\tLoss 0.3968 (0.5894)\tSoftmaxLoss 0.3286 (0.5222)\tRankLoss 0.0682 (0.0671)\tPrec@1 88.281 (83.952)\tPrec@5 98.242 (95.605)\n",
"Time: Mon Nov 23 15:49:28 2020\n",
"Step: 44\t Epoch: [2][10/17]\tTime 1.121 (1.282)\tData 0.007 (0.200)\tLoss 0.5661 (0.5935)\tSoftmaxLoss 0.4930 (0.5264)\tRankLoss 0.0731 (0.0671)\tPrec@1 86.328 (83.079)\tPrec@5 97.656 (96.076)\n",
"Time: Mon Nov 23 15:49:34 2020\n",
"Step: 49\t Epoch: [2][15/17]\tTime 1.108 (1.228)\tData 0.007 (0.140)\tLoss 0.5069 (0.6108)\tSoftmaxLoss 0.4374 (0.5433)\tRankLoss 0.0695 (0.0674)\tPrec@1 85.742 (82.507)\tPrec@5 99.023 (95.947)\n",
"Time: Mon Nov 23 15:49:36 2020\n",
"Test: [0/2]\tTime 1.155 (1.155)\tSoftmaxLoss 0.5034 (0.5034)\tPrec@1 85.938 (85.938)\tPrec@5 96.875 (96.875)\n",
" * Prec@1 89.320 Prec@5 98.058\n",
"Time: Mon Nov 23 15:49:40 2020\n",
"Step: 51\t Epoch: [3][0/17]\tTime 2.407 (2.407)\tData 1.808 (1.808)\tLoss 0.4969 (0.4969)\tSoftmaxLoss 0.4381 (0.4381)\tRankLoss 0.0588 (0.0588)\tPrec@1 86.523 (86.523)\tPrec@5 97.266 (97.266)\n",
"Time: Mon Nov 23 15:49:45 2020\n",
"Step: 56\t Epoch: [3][5/17]\tTime 1.095 (1.342)\tData 0.008 (0.317)\tLoss 0.4699 (0.5138)\tSoftmaxLoss 0.3962 (0.4466)\tRankLoss 0.0737 (0.0672)\tPrec@1 88.672 (87.402)\tPrec@5 98.828 (97.982)\n",
"Time: Mon Nov 23 15:49:51 2020\n",
"Step: 61\t Epoch: [3][10/17]\tTime 1.094 (1.229)\tData 0.006 (0.176)\tLoss 0.6653 (0.5548)\tSoftmaxLoss 0.5971 (0.4850)\tRankLoss 0.0682 (0.0698)\tPrec@1 80.469 (85.298)\tPrec@5 97.852 (97.727)\n",
"Time: Mon Nov 23 15:49:56 2020\n",
"Step: 66\t Epoch: [3][15/17]\tTime 1.103 (1.187)\tData 0.007 (0.123)\tLoss 0.5264 (0.5550)\tSoftmaxLoss 0.4492 (0.4846)\tRankLoss 0.0772 (0.0704)\tPrec@1 85.938 (84.998)\tPrec@5 95.117 (97.437)\n",
"Time: Mon Nov 23 15:49:58 2020\n",
"Test: [0/2]\tTime 1.147 (1.147)\tSoftmaxLoss 0.4328 (0.4328)\tPrec@1 87.500 (87.500)\tPrec@5 98.438 (98.438)\n",
" * Prec@1 88.350 Prec@5 98.058\n",
"Time: Mon Nov 23 15:50:02 2020\n",
"Step: 68\t Epoch: [4][0/17]\tTime 2.430 (2.430)\tData 1.860 (1.860)\tLoss 0.5764 (0.5764)\tSoftmaxLoss 0.5054 (0.5054)\tRankLoss 0.0710 (0.0710)\tPrec@1 83.594 (83.594)\tPrec@5 98.047 (98.047)\n",
"Time: Mon Nov 23 15:50:08 2020\n",
"Step: 73\t Epoch: [4][5/17]\tTime 1.116 (1.356)\tData 0.008 (0.324)\tLoss 0.5473 (0.5205)\tSoftmaxLoss 0.4859 (0.4524)\tRankLoss 0.0614 (0.0681)\tPrec@1 83.398 (85.677)\tPrec@5 97.852 (97.982)\n",
"Time: Mon Nov 23 15:50:13 2020\n",
"Step: 78\t Epoch: [4][10/17]\tTime 1.136 (1.252)\tData 0.007 (0.180)\tLoss 0.6014 (0.5660)\tSoftmaxLoss 0.5351 (0.4980)\tRankLoss 0.0663 (0.0679)\tPrec@1 81.836 (84.091)\tPrec@5 99.609 (97.301)\n",
"Time: Mon Nov 23 15:50:19 2020\n",
"Step: 83\t Epoch: [4][15/17]\tTime 1.144 (1.218)\tData 0.007 (0.126)\tLoss 0.7604 (0.5896)\tSoftmaxLoss 0.6916 (0.5227)\tRankLoss 0.0688 (0.0670)\tPrec@1 79.297 (83.545)\tPrec@5 91.016 (96.387)\n",
"Time: Mon Nov 23 15:50:21 2020\n",
"Test: [0/2]\tTime 1.169 (1.169)\tSoftmaxLoss 0.4763 (0.4763)\tPrec@1 84.375 (84.375)\tPrec@5 96.875 (96.875)\n",
" * Prec@1 87.379 Prec@5 98.058\n",
"Time: Mon Nov 23 15:50:25 2020\n",
"Step: 85\t Epoch: [5][0/17]\tTime 2.600 (2.600)\tData 2.017 (2.017)\tLoss 0.7167 (0.7167)\tSoftmaxLoss 0.6540 (0.6540)\tRankLoss 0.0626 (0.0626)\tPrec@1 77.344 (77.344)\tPrec@5 94.141 (94.141)\n",
"Time: Mon Nov 23 15:50:31 2020\n",
"Step: 90\t Epoch: [5][5/17]\tTime 1.123 (1.395)\tData 0.008 (0.351)\tLoss 0.6494 (0.6185)\tSoftmaxLoss 0.5845 (0.5503)\tRankLoss 0.0649 (0.0682)\tPrec@1 80.664 (82.715)\tPrec@5 95.703 (96.094)\n",
"Time: Mon Nov 23 15:50:36 2020\n",
"Step: 95\t Epoch: [5][10/17]\tTime 1.120 (1.270)\tData 0.007 (0.194)\tLoss 0.3800 (0.6081)\tSoftmaxLoss 0.3117 (0.5388)\tRankLoss 0.0684 (0.0693)\tPrec@1 91.797 (83.185)\tPrec@5 99.023 (96.112)\n",
"Time: Mon Nov 23 15:50:42 2020\n",
"Step: 100\t Epoch: [5][15/17]\tTime 1.122 (1.222)\tData 0.007 (0.136)\tLoss 0.5685 (0.6042)\tSoftmaxLoss 0.5073 (0.5349)\tRankLoss 0.0612 (0.0694)\tPrec@1 83.594 (83.789)\tPrec@5 96.484 (96.118)\n",
"Time: Mon Nov 23 15:50:44 2020\n",
"Test: [0/2]\tTime 1.175 (1.175)\tSoftmaxLoss 0.4078 (0.4078)\tPrec@1 84.375 (84.375)\tPrec@5 98.438 (98.438)\n",
" * Prec@1 86.408 Prec@5 98.058\n",
"Time: Mon Nov 23 15:50:48 2020\n",
"Step: 102\t Epoch: [6][0/17]\tTime 2.676 (2.676)\tData 2.078 (2.078)\tLoss 0.6625 (0.6625)\tSoftmaxLoss 0.6074 (0.6074)\tRankLoss 0.0550 (0.0550)\tPrec@1 80.859 (80.859)\tPrec@5 93.945 (93.945)\n",
"Time: Mon Nov 23 15:50:54 2020\n",
"Step: 107\t Epoch: [6][5/17]\tTime 1.119 (1.397)\tData 0.005 (0.365)\tLoss 0.5618 (0.5526)\tSoftmaxLoss 0.4983 (0.4910)\tRankLoss 0.0636 (0.0616)\tPrec@1 83.594 (84.440)\tPrec@5 96.875 (96.354)\n",
"Time: Mon Nov 23 15:50:59 2020\n",
"Step: 112\t Epoch: [6][10/17]\tTime 1.122 (1.271)\tData 0.007 (0.202)\tLoss 0.6594 (0.5568)\tSoftmaxLoss 0.5922 (0.4906)\tRankLoss 0.0672 (0.0662)\tPrec@1 82.617 (85.174)\tPrec@5 95.508 (96.396)\n",
"Time: Mon Nov 23 15:51:05 2020\n",
"Step: 117\t Epoch: [6][15/17]\tTime 1.116 (1.222)\tData 0.007 (0.141)\tLoss 0.5382 (0.5843)\tSoftmaxLoss 0.4613 (0.5171)\tRankLoss 0.0769 (0.0672)\tPrec@1 83.008 (84.167)\tPrec@5 99.805 (96.423)\n",
"Time: Mon Nov 23 15:51:07 2020\n",
"Test: [0/2]\tTime 1.162 (1.162)\tSoftmaxLoss 0.3891 (0.3891)\tPrec@1 87.500 (87.500)\tPrec@5 98.438 (98.438)\n",
" * Prec@1 88.350 Prec@5 98.058\n",
"Time: Mon Nov 23 15:51:11 2020\n",
"Step: 119\t Epoch: [7][0/17]\tTime 2.610 (2.610)\tData 2.046 (2.046)\tLoss 0.5519 (0.5519)\tSoftmaxLoss 0.4867 (0.4867)\tRankLoss 0.0652 (0.0652)\tPrec@1 85.938 (85.938)\tPrec@5 96.289 (96.289)\n",
"Time: Mon Nov 23 15:51:16 2020\n",
"Step: 124\t Epoch: [7][5/17]\tTime 1.121 (1.381)\tData 0.006 (0.354)\tLoss 0.7966 (0.5779)\tSoftmaxLoss 0.7205 (0.5099)\tRankLoss 0.0761 (0.0679)\tPrec@1 75.781 (85.417)\tPrec@5 94.727 (96.061)\n",
"Time: Mon Nov 23 15:51:22 2020\n",
"Step: 129\t Epoch: [7][10/17]\tTime 1.124 (1.263)\tData 0.007 (0.196)\tLoss 0.6543 (0.5864)\tSoftmaxLoss 0.5941 (0.5182)\tRankLoss 0.0602 (0.0682)\tPrec@1 80.078 (84.162)\tPrec@5 96.094 (95.952)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4BorW6rkC0Bm"
},
"source": [
"The best model gives an accuracy of 89.320 on the validation dataset (and a top-5 accuracy of 98.058, which means that 98% of the times the good label is on the labels corresponding to the top 5 scores)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0SBdapOmuHJN"
},
"source": [
"# Create kaggle submission"
]
},
{
"cell_type": "code",
"metadata": {
"id": "L-FDzHbcYK9Z",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "d8e4eeec-f642-41e1-b9c9-945ff122d520"
},
"source": [
"use_cuda = torch.cuda.is_available()\n",
"\n",
"model = torch.load('/content/restnet152_0.8835')\n",
"\n",
"model.eval()\n",
"if use_cuda:\n",
" print('Using GPU')\n",
" model.cuda()\n",
"else:\n",
" print('Using CPU')\n",
"\n",
"test_dir = '/content/cropped_dataset/test_images/mistery_category'\n",
"\n",
"def pil_loader(path):\n",
" # open path as file to avoid ResourceWarning (https://github.com/python-pillow/Pillow/issues/835)\n",
" with open(path, 'rb') as f:\n",
" with Image.open(f) as img:\n",
" return img.convert('RGB')\n",
"\n",
"\n",
"output_file = open('kaggle.csv', \"w\")\n",
"output_file.write(\"Id,Category\\n\")\n",
"for f in tqdm(os.listdir(test_dir)):\n",
" if 'jpg' in f:\n",
" data = data_transforms['val_images'](pil_loader(test_dir + '/' + f))\n",
" data = data.view(1, data.size(0), data.size(1), data.size(2))\n",
" if use_cuda:\n",
" data = data.cuda()\n",
" # Use flag='val' and the pred = ...data.max(0)... if the model used comes from the api-net\n",
" # output = model(data, flag='val')\n",
" # pred = output.data.max(0)[1]\n",
" output = model(data)\n",
" pred = output.data.max(1, keepdim = True)[1]\n",
" output_file.write(\"%s,%d\\n\" % (f[:-4], pred))\n",
"\n",
"output_file.close()\n",
"\n",
"print(\"Succesfully wrote, you can upload this file to the kaggle competition website\")\n",
" "
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
" 1%| | 3/516 [00:00<00:19, 25.73it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"Using GPU\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"100%|██████████| 516/516 [00:12<00:00, 40.02it/s]"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"Succesfully wrote, you can upload this file to the kaggle competition website\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2HfezS9lDmvP"
},
"source": [
"Thanks to the code above, we created submission files for 3 models\n",
"- a ResNet-152 that gave accuracy of 0.93 on the validation dataset\n",
"- the LR classifier that gave 0.94\n",
"- the previous API-Net that gave 0.89\n",
"\n",
"We then mixed these submissions using a majority vote scheme were the LR (corresponding to the higher accuracy) counts for 1.5 vote and the other 2 to 1 vote."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "a7oYBjWzW9B7",
"outputId": "9823cda8-a378-4a10-b52a-0bbcf8f7c064"
},
"source": [
"# from the logistic regression : 0.94 on the validation dataset\n",
"df_lr = pd.read_csv('kaggle_LR.csv')\n",
"# from the api net : 0.89 on the validation dataset\n",
"df_api = pd.read_csv('kaggle_api_1.csv')\n",
"# from the resnet152 model : 0.93 on the validation dataset\n",
"df_resnet = pd.read_csv('kaggle_resnet.csv')\n",
"\n",
"print(df_lr)\n",
"print(df_api)\n",
"print(df_resnet)\n",
"df = pd.merge(pd.merge(df_lr,df_api,on='Id'),df_resnet,on='Id')\n",
"print(df.head())\n",
" \n",
"def majority_vote():\n",
" output_file = open('kaggle_mv.csv', \"w\")\n",
" output_file.write(\"Id,Category\\n\")\n",
" for i in range(len(df)):\n",
" name, pred_1, pred_2, pred_3 = df.values[i]\n",
" pred = pred_1\n",
" if pred_2 == pred_3:\n",
" pred = pred_2\n",
" output_file.write(\"%s,%d\\n\" % (name, pred))\n",
"\n",
" output_file.close()\n",
"\n",
"majority_vote()"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
" Id Category\n",
"0 002f61512a368e4c1434eedacf609957 5\n",
"1 0247efd7b9d47d036bb4390202a13e69 8\n",
"2 0267548c2aac82fe3d7e37ae98b00bd7 18\n",
"3 030c7d18b20ee586db3b74d9966c0348 18\n",
"4 034abbbb69336b0de7c7c0f2aa1267a6 18\n",
".. ... ...\n",
"512 fe95bce0791a7015500d4b9f1d3d32c9 1\n",
"513 fee2e52c250a812d0e299eb8d0ce558d 15\n",
"514 fef53a1dada4a77de35c609180d41936 2\n",
"515 ff5bdc3866e4fda1396030b9a146c19d 15\n",
"516 ffe6dc708419b819ea897d666e986ec6 8\n",
"\n",
"[517 rows x 2 columns]\n",
" Id Category\n",
"0 002f61512a368e4c1434eedacf609957 5\n",
"1 0247efd7b9d47d036bb4390202a13e69 17\n",
"2 0267548c2aac82fe3d7e37ae98b00bd7 18\n",
"3 030c7d18b20ee586db3b74d9966c0348 17\n",
"4 034abbbb69336b0de7c7c0f2aa1267a6 17\n",
".. ... ...\n",
"512 fe95bce0791a7015500d4b9f1d3d32c9 1\n",
"513 fee2e52c250a812d0e299eb8d0ce558d 15\n",
"514 fef53a1dada4a77de35c609180d41936 2\n",
"515 ff5bdc3866e4fda1396030b9a146c19d 15\n",
"516 ffe6dc708419b819ea897d666e986ec6 8\n",
"\n",
"[517 rows x 2 columns]\n",
" Id Category\n",
"0 002f61512a368e4c1434eedacf609957 5\n",
"1 0247efd7b9d47d036bb4390202a13e69 8\n",
"2 0267548c2aac82fe3d7e37ae98b00bd7 18\n",
"3 030c7d18b20ee586db3b74d9966c0348 18\n",
"4 034abbbb69336b0de7c7c0f2aa1267a6 17\n",
".. ... ...\n",
"512 fe95bce0791a7015500d4b9f1d3d32c9 1\n",
"513 fee2e52c250a812d0e299eb8d0ce558d 16\n",
"514 fef53a1dada4a77de35c609180d41936 2\n",
"515 ff5bdc3866e4fda1396030b9a146c19d 16\n",
"516 ffe6dc708419b819ea897d666e986ec6 8\n",
"\n",
"[517 rows x 2 columns]\n",
" Id Category_x Category_y Category\n",
"0 002f61512a368e4c1434eedacf609957 5 5 5\n",
"1 0247efd7b9d47d036bb4390202a13e69 8 17 8\n",
"2 0267548c2aac82fe3d7e37ae98b00bd7 18 18 18\n",
"3 030c7d18b20ee586db3b74d9966c0348 18 17 18\n",
"4 034abbbb69336b0de7c7c0f2aa1267a6 18 17 17\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "r2uMM4RvEqWE"
},
"source": [
"The submission gave a result of 0.81290 on the public leaderboard of the Kaggle challenge."
]
}
]
}