{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "%reload_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from fastai.conv_learner import *\n", "from fastai.dataset import *\n", "\n", "import json, pdb\n", "from PIL import ImageDraw, ImageFont\n", "from matplotlib import patches, patheffects\n", "torch.cuda.set_device(0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "torch.backends.cudnn.benchmark=True" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "PATH = Path('data/pascal')\n", "trn_j = json.load((PATH / 'pascal_train2007.json').open())\n", "IMAGES,ANNOTATIONS,CATEGORIES = ['images', 'annotations', 'categories']\n", "FILE_NAME,ID,IMG_ID,CAT_ID,BBOX = 'file_name','id','image_id','category_id','bbox'\n", "\n", "cats = dict((o[ID], o['name']) for o in trn_j[CATEGORIES])\n", "trn_fns = dict((o[ID], o[FILE_NAME]) for o in trn_j[IMAGES])\n", "trn_ids = [o[ID] for o in trn_j[IMAGES]]\n", "\n", "JPEGS = 'VOCdevkit/VOC2007/JPEGImages'\n", "IMG_PATH = PATH/JPEGS" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def get_trn_anno():\n", " trn_anno = collections.defaultdict(lambda:[])\n", " for o in trn_j[ANNOTATIONS]:\n", " if not o['ignore']:\n", " bb = o[BBOX]\n", " bb = np.array([bb[1], bb[0], bb[3]+bb[1]-1, bb[2]+bb[0]-1])\n", " trn_anno[o[IMG_ID]].append((bb,o[CAT_ID]))\n", " return trn_anno\n", "\n", "trn_anno = get_trn_anno()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def show_img(im, figsize=None, ax=None):\n", " if not ax: fig,ax = plt.subplots(figsize=figsize)\n", " ax.imshow(im)\n", " ax.set_xticks(np.linspace(0, 224, 8))\n", " ax.set_yticks(np.linspace(0, 224, 8))\n", " ax.grid()\n", " ax.set_yticklabels([])\n", " ax.set_xticklabels([])\n", " return ax\n", "\n", "def draw_outline(o, lw):\n", " o.set_path_effects([patheffects.Stroke(\n", " linewidth=lw, foreground='black'), patheffects.Normal()])\n", "\n", "def draw_rect(ax, b, color='white'):\n", " patch = ax.add_patch(patches.Rectangle(b[:2], *b[-2:], fill=False, edgecolor=color, lw=2))\n", " draw_outline(patch, 4)\n", "\n", "def draw_text(ax, xy, txt, sz=14, color='white'):\n", " text = ax.text(*xy, txt,\n", " verticalalignment='top', color=color, fontsize=sz, weight='bold')\n", " draw_outline(text, 1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def bb_hw(a): return np.array([a[1],a[0],a[3]-a[1]+1,a[2]-a[0]+1])\n", "\n", "def draw_im(im, ann):\n", " ax = show_img(im, figsize=(16,8))\n", " for b,c in ann:\n", " b = bb_hw(b)\n", " draw_rect(ax, b)\n", " draw_text(ax, b[:2], cats[c], sz=16)\n", "\n", "def draw_idx(i):\n", " im_a = trn_anno[i]\n", " im = open_image(IMG_PATH/trn_fns[i])\n", " draw_im(im, im_a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multi class" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "MC_CSV = PATH/'tmp/mc.csv'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(array([ 96, 155, 269, 350]), 7)]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "trn_anno[12]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mc = [set([cats[p[1]] for p in trn_anno[o]]) for o in trn_ids]\n", "mcs = [' '.join(str(p) for p in o) for o in mc]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame({'fn': [trn_fns[o] for o in trn_ids], 'clas': mcs}, columns=['fn','clas'])\n", "df.to_csv(MC_CSV, index=False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "f_model=resnet34\n", "sz=224\n", "bs=64" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "tfms = tfms_from_model(f_model, sz, crop_type=CropType.NO)\n", "md = ImageClassifierData.from_csv(PATH, JPEGS, MC_CSV, tfms=tfms, bs=bs)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "learn = ConvLearner.pretrained(f_model, md)\n", "learn.opt_fn = optim.Adam" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9ccdb0e1cae54d27b5d85d30a5c37b4f", "version_major": 2, "version_minor": 0 }, "text/html": [ "
Failed to display Jupyter Widget of type HBox
.
\n", " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", " that the widgets JavaScript is still loading. If this message persists, it\n", " likely means that the widgets JavaScript library is either not installed or\n", " not enabled. See the Jupyter\n", " Widgets Documentation for setup instructions.\n", "
\n", "\n", " If you're reading this message in another frontend (for example, a static\n", " rendering on GitHub or NBViewer),\n", " it may mean that your frontend doesn't currently support widgets.\n", "
\n" ], "text/plain": [ "HBox(children=(IntProgress(value=0, description='Epoch', max=1), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "epoch trn_loss val_lossFailed to display Jupyter Widget of type HBox
.
\n", " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", " that the widgets JavaScript is still loading. If this message persists, it\n", " likely means that the widgets JavaScript library is either not installed or\n", " not enabled. See the Jupyter\n", " Widgets Documentation for setup instructions.\n", "
\n", "\n", " If you're reading this message in another frontend (for example, a static\n", " rendering on GitHub or NBViewer),\n", " it may mean that your frontend doesn't currently support widgets.\n", "
\n" ], "text/plain": [ "HBox(children=(IntProgress(value=0, description='Epoch', max=1), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " 81%|█████████████████████████████████████████████████████████▋ | 26/32 [00:22<00:05, 1.15it/s, loss=0.33]" ] }, { "data": { "image/png": "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\n", "text/plain": [ "\n", " | fn | \n", "bbox | \n", "
---|---|---|
0 | \n", "000012.jpg | \n", "96 155 269 350 | \n", "
1 | \n", "000017.jpg | \n", "61 184 198 278 77 89 335 402 | \n", "
2 | \n", "000023.jpg | \n", "229 8 499 244 219 229 499 333 0 1 368 116 1 2 ... | \n", "
3 | \n", "000026.jpg | \n", "124 89 211 336 | \n", "
4 | \n", "000032.jpg | \n", "77 103 182 374 87 132 122 196 179 194 228 212 ... | \n", "