{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Create a Learner for inference" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [], "source": [ "from fastai.gen_doc.nbdoc import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this tutorial, we'll see how the same API allows you to create an empty [`DataBunch`](/basic_data.html#DataBunch) for a [`Learner`](/basic_train.html#Learner) at inference time (once you have trained your model) and how to call the `predict` method to get the predictions on a single item." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "
docs_src
folder of the\n",
"fastai repo. We use the saved models from this tutorial to\n",
"have this notebook run quickly.docs_src
folder of the\n",
"fastai repo. We use the saved models from this tutorial to\n",
"have this notebook run quickly.\"\"\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Vision"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To quickly get acces to all the vision functionality inside fastai, we use the usual import statements."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from fastai.vision import *"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### A classification problem"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's begin with our sample of the MNIST dataset."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mnist = untar_data(URLs.MNIST_TINY)\n",
"tfms = get_transforms(do_flip=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's set up with an imagenet structure so we use it to split our training and validation set, then labelling."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data = (ImageItemList.from_folder(mnist)\n",
" .split_by_folder() \n",
" .label_from_folder()\n",
" .add_test_folder('test')\n",
" .transform(tfms, size=32)\n",
" .databunch()\n",
" .normalize(imagenet_stats)) "
]
},
{
"cell_type": "markdown",
"metadata": {
"hide_input": true
},
"source": [
"Now that our data has been properly set up, we can train a model. We already did in the [look at your data tutorial](/tutorial.data.html) so we'll just load our saved results here."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn = create_cnn(data, models.resnet18).load('mini_train')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once everything is ready for inference, we just have to call `learn.export` to save all the information of our [`Learner`](/basic_train.html#Learner) object for inference: the stuff we need in the [`DataBunch`](/basic_data.html#DataBunch) (transforms, classes, normalization...), the model with its weights and all the callbacks our [`Learner`](/basic_train.html#Learner) was using. Everything will be in a file named `export.pkl` in the folder `learn.path`. If you deploy your model on a different machine, this is the file you'll need to copy."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn.export()"
]
},
{
"cell_type": "markdown",
"metadata": {
"hide_input": false
},
"source": [
"To create the [`Learner`](/basic_train.html#Learner) for inference, you'll need to use the [`load_learner`](/basic_train.html#load_learner) function. Note that you don't have to specify anything: it remembers the classes, the transforms you used or the normalization in the data, the model, its weigths... The only argument needed is the folder where the 'export.pkl' file is."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn = load_learner(mnist)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can now get the predictions on any image via `learn.predict`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(Category 3, tensor(0), tensor([0.9494, 0.0506]))"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"img = data.train_ds[0][0]\n",
"learn.predict(img)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It returns a tuple of three things: the object predicted (with the class in this instance), the underlying data (here the corresponding index) and the raw probabilities. You can also do inference on a larger set of data by adding a *test set*. This is done by passing an [`ItemList`](/data_block.html#ItemList) to [`load_learner`](/basic_train.html#load_learner)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn = load_learner(mnist, test=ImageItemList.from_folder(mnist/'test'))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[9.9267e-01, 7.3297e-03],\n",
" [1.3017e-01, 8.6983e-01],\n",
" [8.2184e-01, 1.7816e-01],\n",
" [8.9358e-05, 9.9991e-01],\n",
" [9.9973e-01, 2.6567e-04]])"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"preds,y = learn.get_preds(ds_type=DatasetType.Test)\n",
"preds[:5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### A multi-label problem"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's try these on the planet dataset, which is a little bit different in the sense that each image can have multiple tags (and not just one label)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"planet = untar_data(URLs.PLANET_TINY)\n",
"planet_tfms = get_transforms(flip_vert=True, max_lighting=0.1, max_zoom=1.05, max_warp=0.)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here each images is labelled in a file named `labels.csv`. We have to add [`train`](/train.html#train) as a prefix to the filenames, `.jpg` as a suffix and indicate that the labels are separated by spaces."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data = (ImageItemList.from_csv(planet, 'labels.csv', folder='train', suffix='.jpg')\n",
" .random_split_by_pct()\n",
" .label_from_df(label_delim=' ')\n",
" .transform(planet_tfms, size=128)\n",
" .databunch()\n",
" .normalize(imagenet_stats))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Again, we load the model we saved in [look at your data tutorial](/tutorial.data.html)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn = create_cnn(data, models.resnet18).load('mini_train')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then we can export it before loading it for inference."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn.export()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn = load_learner(planet)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And we get the predictions on any image via `learn.predict`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(MultiCategory agriculture;partly_cloudy;water,\n",
" tensor([1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 1.]),\n",
" tensor([6.2213e-01, 3.1655e-01, 3.6730e-01, 1.0397e-01, 5.3315e-04, 4.6302e-01,\n",
" 1.8985e-01, 9.5472e-02, 3.0821e-01, 9.9055e-01, 3.4830e-01, 1.3109e-01,\n",
" 2.0182e-01, 5.8467e-01]))"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"img = data.train_ds[0][0]\n",
"learn.predict(img)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we can specify a particular threshold to consider the predictions to be correct or not. The default is `0.5`, but we can change it."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(MultiCategory agriculture;artisinal_mine;bare_ground;cloudy;haze;partly_cloudy;primary;water,\n",
" tensor([1., 1., 1., 0., 0., 1., 0., 0., 1., 1., 1., 0., 0., 1.]),\n",
" tensor([6.2213e-01, 3.1655e-01, 3.6730e-01, 1.0397e-01, 5.3315e-04, 4.6302e-01,\n",
" 1.8985e-01, 9.5472e-02, 3.0821e-01, 9.9055e-01, 3.4830e-01, 1.3109e-01,\n",
" 2.0182e-01, 5.8467e-01]))"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"learn.predict(img, thresh=0.3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### A regression example"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the next example, we are going to use the [BIWI head pose](https://data.vision.ee.ethz.ch/cvl/gfanelli/head_pose/head_forest.html#db) dataset. On pictures of persons, we have to find the center of their face. For the fastai docs, we have built a small subsample of the dataset (200 images) and prepared a dictionary for the correspondance filename to center."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"biwi = untar_data(URLs.BIWI_SAMPLE)\n",
"fn2ctr = pickle.load(open(biwi/'centers.pkl', 'rb'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To grab our data, we use this dictionary to label our items. We also use the [`PointsItemList`](/vision.data.html#PointsItemList) class to have the targets be of type [`ImagePoints`](/vision.image.html#ImagePoints) (which will make sure the data augmentation is properly applied to them). When calling [`transform`](/tabular.transform.html#tabular.transform) we make sure to set `tfm_y=True`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data = (PointsItemList.from_folder(biwi)\n",
" .random_split_by_pct(seed=42)\n",
" .label_from_func(lambda o:fn2ctr[o.name])\n",
" .transform(get_transforms(), tfm_y=True, size=(120,160))\n",
" .databunch()\n",
" .normalize(imagenet_stats))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As before, the road to inference is pretty straightforward: load the model we trained before, export the [`Learner`](/basic_train.html#Learner) then load it for production."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn = create_cnn(data, models.resnet18, lin_ftrs=[100], ps=0.05).load('mini_train');"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn.export()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn = load_learner(biwi)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And now we can a prediction on an image."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(ImagePoints (120, 160),\n",
" tensor([[-1.2336e-03, -2.0357e+00]]),\n",
" tensor([-1.2336e-03, -2.0357e+00]))"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"img = data.valid_ds[0][0]\n",
"learn.predict(img)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To visualize the predictions, we can use the [`Image.show`](/vision.image.html#Image.show) method."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"epoch | \n", "train_loss | \n", "valid_loss | \n", "accuracy | \n", "
---|---|---|---|
1 | \n", "0.328325 | \n", "0.367515 | \n", "0.845000 | \n", "