{ "cells": [ { "cell_type": "markdown", "metadata": { "hide_input": true }, "source": [ "## Computer vision data" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [], "source": [ "%matplotlib inline\n", "from fastai.gen_doc.nbdoc import *\n", "from fastai.vision import * " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This module contains the classes that define datasets handling [`Image`](/vision.image.html#Image) objects and their transformations. As usual, we'll start with a quick overview, before we get in to the detailed API docs.\n", "\n", "Before any work can be done a dataset needs to be converted into a [`DataBunch`](/basic_data.html#DataBunch) object, and in the case of the computer vision data - specifically into an [`ImageDataBunch`](/vision.data.html#ImageDataBunch) subclass.\n", "\n", "This is done with the help of [data block API](/data_block.html) and the [`ImageList`](/vision.data.html#ImageList) class and its subclasses.\n", " \n", "However, there is also a group of shortcut methods provided by [`ImageDataBunch`](/vision.data.html#ImageDataBunch) which reduce the multiple stages of the data block API, into a single wrapper method. These shortcuts methods work really well for:\n", "- Imagenet-style of datasets ([`ImageDataBunch.from_folder`](/vision.data.html#ImageDataBunch.from_folder))\n", "- A pandas `DataFrame` with a column of filenames and a column of labels which can be strings for classification, strings separated by a `label_delim` for multi-classification or floats for a regression problem ([`ImageDataBunch.from_df`](/vision.data.html#ImageDataBunch.from_df))\n", "- A csv file with the same format as above ([`ImageDataBunch.from_csv`](/vision.data.html#ImageDataBunch.from_csv))\n", "- A list of filenames and a list of targets ([`ImageDataBunch.from_lists`](/vision.data.html#ImageDataBunch.from_lists))\n", "- A list of filenames and a function to get the target from the filename ([`ImageDataBunch.from_name_func`](/vision.data.html#ImageDataBunch.from_name_func))\n", "- A list of filenames and a regex pattern to get the target from the filename ([`ImageDataBunch.from_name_re`](/vision.data.html#ImageDataBunch.from_name_re))\n", "\n", "In the last five factory methods, a random split is performed between train and validation, in the first one it can be a random split or a separation from a training and a validation folder.\n", "\n", "If you're just starting out you may choose to experiment with these shortcut methods, as they are also used in the first lessons of the fastai deep learning course. However, you can completely skip them and start building your code using the data block API from the very beginning. Internally, these shortcuts use this API anyway.\n", "\n", "The first part of this document is dedicated to the shortcut [`ImageDataBunch`](/vision.data.html#ImageDataBunch) factory methods. Then all the other computer vision data-specific methods that are used with the data block API are presented." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Quickly get your data ready for training" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get you started as easily as possible, the fastai provides two helper functions to create a [`DataBunch`](/basic_data.html#DataBunch) object that you can directly use for training a classifier. To demonstrate them you'll first need to download and untar the file by executing the following cell. This will create a data folder containing an MNIST subset in `data/mnist_sample`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PosixPath('/home/ubuntu/.fastai/data/mnist_sample')" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "path = untar_data(URLs.MNIST_SAMPLE); path" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are a number of ways to create an [`ImageDataBunch`](/vision.data.html#ImageDataBunch). One common approach is to use *Imagenet-style folders* (see a ways down the page below for details) with [`ImageDataBunch.from_folder`](/vision.data.html#ImageDataBunch.from_folder):" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "tfms = get_transforms(do_flip=False)\n", "data = ImageDataBunch.from_folder(path, ds_tfms=tfms, size=24)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here the datasets will be automatically created in the structure of *Imagenet-style folders*. The parameters specified:\n", "- the transforms to apply to the images in `ds_tfms` (here with `do_flip`=False because we don't want to flip numbers),\n", "- the target `size` of our pictures (here 24).\n", "\n", "As with all [`DataBunch`](/basic_data.html#DataBunch) usage, a `train_dl` and a `valid_dl` are created that are of the type PyTorch [`DataLoader`](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader). \n", "\n", "If you want to have a look at a few images inside a batch, you can use [`DataBunch.show_batch`](/basic_data.html#DataBunch.show_batch). The `rows` argument is the number of rows and columns to display." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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0vM333xjxeTWW2/1rOuxded0La90hF2zdoXov5GWch06dPCsB7PpjA/tFjBLfM9Q2hcencFhlrgoZ8KECZ51qz7tztH7/9Zbb3l++OGHPetpFiF4IgWAQDSkABAop6W9lu16zrRO/tXH8XSTaF9//XXPDz30kGddK18eyRPtu3Xr5llH93WUWEctly9f7lknf8+fP99zMU8EHzVqlGe9b4sXL/aso+q6G7mW8zoRWkeCdXaGlnna7TJy5EjPOhPELHFBh3YTsOdB1XXKKad41tk8ZmZjx471/MMf/tCzfo71s6rdbU899ZRnPcs+U3giBYBANKQAECinpb1ud9W2bVvP3//+9z3raL6WiwsWLPCsj+w6+ltRyQfh6ewB3Z1fR4N1nbeWCFrOF/M6erVhwwbPWsJPnjzZs46K6kwK7TpJt1BBZ2386Ec/8qwlX8uWLT0nvxd0gr6+98paz43c00Ub+rkbM2ZMwvf17t3bs86eUYsWLfJ89913e9auN33P6CIR7fLRfSHWr19f9v8A44kUAILRkAJAoJyW9p07d/Y8ePBgz0OGDPGs5ZxOon3jjTc8a0kdMsld1+uaJU681wnguvP+xx9/7Fkn+uuIdKn461//6vmFF17wXOEzwWXUVe//uHHjPF911VWedR8Enc2hB6eZmb366quei22fg0KR7iSEXr16eR49erRnLe21+88sfTmvi2xeeuklz9old91113nW2Rx6iJ6+b3XbTl2bnw5PpAAQiIYUAALltLTXXeR1BE7XZutE7blz53rWkfqKTrxPJ7m012vSEX0dbdZRQS3nc72lWFUwadKklF/XyfO6f4FuQaijoqeffrrnjh07ek43Uq+LObSc17LOLPEQQkr73NFyXrtq9DDLiy++2HP//v0964i6/p6y6HvpzjvvrNjFpqHvF+3mS4cnUgAIREMKAIHydvidjpDrWus333zTs05y37hxY0auQUcC9ZA2s8RD63TNrh5ap6P2mbqmYqAjqkOHDvWsa6d19oOWS2effbZnPbxMS7avvvrKs96Pp59+2rPudo6qQSe868GWWtqnG40vL+0C0L0t9AQM7XrThT66zaN2K+j3fPrpp561G1LxRAoAgWhIASAQDSkABMppH6lObdEjIrQPYsqUKZ515VCmphdpv+iAAQMS/k77bXUDg/fee8/zsmXLPOs0nFKk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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "data.show_batch(rows=3, figsize=(5,5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The second way to define the data for a classifier requires a structure like this:\n", "```\n", "path\\\n", " train\\\n", " test\\\n", " labels.csv\n", "```\n", "where the labels.csv file defines the label(s) of each image in the training set. This is the format you will need to use when each image can have multiple labels. It also works with single labels:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namelabel
0train/3/7463.png0
1train/3/21102.png0
2train/3/31559.png0
3train/3/46882.png0
4train/3/26209.png0
\n", "
" ], "text/plain": [ " name label\n", "0 train/3/7463.png 0\n", "1 train/3/21102.png 0\n", "2 train/3/31559.png 0\n", "3 train/3/46882.png 0\n", "4 train/3/26209.png 0" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_csv(path/'labels.csv').head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can then use [`ImageDataBunch.from_csv`](/vision.data.html#ImageDataBunch.from_csv):" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data = ImageDataBunch.from_csv(path, ds_tfms=tfms, size=28)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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jnQh0DXLssEhNgLotA+ypVm6n/WlJu9nwyWbALIsuw4oARPZkBW8FRjdmbOCsmm6n/WlFu9nI45IAb4JdAdWANcC3+jMN0lapPtZX2rufjbkiFREpJIadUQqIlIx6khFRBKpIxURSaSOVEQkUYcWLcmyrEMyW926dfP2QQcdBMCkSZM8du+99zb5vAMPPLDJ/3/mmWc89vDDD3t75syZAMybN89jb7zxRkWuvVQqZRX5Qh2go+5na2VZ/qvrLElU3c/6sqn7qRGpiEiiDl3+1FF/8eLIZKeddgJgwoQJHnv55ZeB4ojz+OOP9/axxx4LwPDhwz227bbbenvx4sUA3HTTTR77wx/+UJFr1whm82299dYA7Lnnnh47/PDDvb333ns3+firr77q7alTpwIwa9asil+b7md90YhURKSd1GVh5zjKfvvttwG46667PLZmzRoAXn/9dY/dc8893l60aBEAQ4YM8djBBx/s7QMOOACAU045xWNvvfUWAFdddVX6DyBssUX+N3677bbz9iGHHALAcccd5zEbccbP23HHHb1ts4ntt9/eY6tWrfL2+++/D8Bjjz3msfXr16f9ANJQNCIVEUmkjlREJFFdTu2jtWvXAnmCaFNsOh/b8+fndRKef/55b69YsQKAMWPGeOyMM84AYO7cuR576qmnvK2pYuv06dMHgMMOO8xjp512mrf3339/APr16+cxSy7aY5yN2++++y4Au+66q8d69uzpbftacTlcnPqLtEQjUhGRRHU/Ik3x2muvlW2/9NJLAGy11VYe+/znPw8UkyBxFKwRzqbF0eG4ceMAmDhxoscOPfRQb1uicMGCBR6zWUDcNPHkk09622YD06dPL/s9lyxZAugeSdtpRCoikkgdqYhIIk3t2+DDDz8E4J138sMOu3bd8KvcYYcdmsSkeXH95+mnnw7AUUcd5bE333zT21Yz4Xe/+12Tj8e1p3379vX2t7/9bQB6987PVIuJwNiWlsWk3B577OHtfffdt0ks3gdjCeDYXrduXbOx+Nhl+fLlQL5DMcbi/7f1wR1BI1IRkUTqSEVEEmnu2Qa25bBcEYyYOY5TGNm0OG2zNZ9xu+a//vUvb19zzTWFz4N8S7Bt3QX46le/6u2TTz4ZKE4F41bexx9/PO0HaDCjR4/29tixY71tU/v+/ft7zNb9brPNNh6LW7ibK5rU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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "data.show_batch(rows=3, figsize=(5,5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An example of multiclassification can be downloaded with the following cell. It's a sample of the [planet dataset](https://www.google.com/search?q=kaggle+planet&rlz=1C1CHBF_enFR786FR786&oq=kaggle+planet&aqs=chrome..69i57j0.1563j0j7&sourceid=chrome&ie=UTF-8)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "planet = untar_data(URLs.PLANET_SAMPLE)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we open the labels files, we seach that each image has one or more tags, separated by a space." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
image_nametags
0train_21983partly_cloudy primary
1train_9516clear cultivation primary water
2train_12664haze primary
3train_36960clear primary
4train_5302haze primary road
\n", "
" ], "text/plain": [ " image_name tags\n", "0 train_21983 partly_cloudy primary\n", "1 train_9516 clear cultivation primary water\n", "2 train_12664 haze primary\n", "3 train_36960 clear primary\n", "4 train_5302 haze primary road" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv(planet/'labels.csv')\n", "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data = ImageDataBunch.from_csv(planet, folder='train', size=128, suffix='.jpg', label_delim=' ',\n", " ds_tfms=get_transforms(flip_vert=True, max_lighting=0.1, max_zoom=1.05, max_warp=0.))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `show_batch`method will then print all the labels that correspond to each image." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data.show_batch(rows=3, figsize=(10,8), ds_type=DatasetType.Valid)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can find more ways to build an [`ImageDataBunch`](/vision.data.html#ImageDataBunch) without the factory methods in [`data_block`](/data_block.html#data_block)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class ImageDataBunch[source][test]

\n", "\n", "> ImageDataBunch(**`train_dl`**:[`DataLoader`](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader), **`valid_dl`**:[`DataLoader`](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader), **`fix_dl`**:[`DataLoader`](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader)=***`None`***, **`test_dl`**:`Optional`\\[[`DataLoader`](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader)\\]=***`None`***, **`device`**:[`device`](https://pytorch.org/docs/stable/tensor_attributes.html#torch-device)=***`None`***, **`dl_tfms`**:`Optional`\\[`Collection`\\[`Callable`\\]\\]=***`None`***, **`path`**:`PathOrStr`=***`'.'`***, **`collate_fn`**:`Callable`=***`'data_collate'`***, **`no_check`**:`bool`=***`False`***) :: [`DataBunch`](/basic_data.html#DataBunch)\n", "\n", "
×

Tests found for ImageDataBunch:

Some other tests where ImageDataBunch is used:

  • pytest -sv tests/test_vision_data.py::test_clean_tear_down [source]
  • pytest -sv tests/test_vision_data.py::test_denormalize [source]
  • pytest -sv tests/test_vision_data.py::test_from_csv_and_from_df [source]
  • pytest -sv tests/test_vision_data.py::test_from_folder [source]
  • pytest -sv tests/test_vision_data.py::test_from_lists [source]
  • pytest -sv tests/test_vision_data.py::test_from_name_re [source]
  • pytest -sv tests/test_vision_data.py::test_image_resize [source]
  • pytest -sv tests/test_vision_data.py::test_multi_iter [source]
  • pytest -sv tests/test_vision_data.py::test_multi_iter_broken [source]
  • pytest -sv tests/test_vision_data.py::test_normalize [source]
  • pytest -sv tests/test_vision_data.py::test_path_can_be_str_type [source]

To run tests please refer to this guide.

\n", "\n", "DataBunch suitable for computer vision. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageDataBunch)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is the same initialization as a regular [`DataBunch`](/basic_data.html#DataBunch) so you probably don't want to use this directly, but one of the factory methods instead." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Factory methods" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you quickly want to get a [`ImageDataBunch`](/vision.data.html#ImageDataBunch) and train a model, you should process your data to have it in one of the formats the following functions handle. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

from_folder[source][test]

\n", "\n", "> from_folder(**`path`**:`PathOrStr`, **`train`**:`PathOrStr`=***`'train'`***, **`valid`**:`PathOrStr`=***`'valid'`***, **`valid_pct`**=***`None`***, **`classes`**:`Collection`\\[`T_co`\\]=***`None`***, **\\*\\*`kwargs`**:`Any`) → `ImageDataBunch`\n", "\n", "
×

Tests found for from_folder:

  • pytest -sv tests/test_vision_data.py::test_from_folder [source]

Some other tests where from_folder is used:

  • pytest -sv tests/test_vision_data.py::test_camvid [source]
  • pytest -sv tests/test_vision_data.py::test_clean_tear_down [source]
  • pytest -sv tests/test_vision_data.py::test_coco [source]
  • pytest -sv tests/test_vision_data.py::test_coco_pickle [source]
  • pytest -sv tests/test_vision_data.py::test_coco_same_size [source]
  • pytest -sv tests/test_vision_data.py::test_denormalize [source]
  • pytest -sv tests/test_vision_data.py::test_image_resize [source]
  • pytest -sv tests/test_vision_data.py::test_image_to_image_different_tfms [source]
  • pytest -sv tests/test_vision_data.py::test_image_to_image_different_y_size [source]
  • pytest -sv tests/test_vision_data.py::test_multi_iter [source]
  • pytest -sv tests/test_vision_data.py::test_multi_iter_broken [source]
  • pytest -sv tests/test_vision_data.py::test_normalize [source]
  • pytest -sv tests/test_vision_data.py::test_points [source]
  • pytest -sv tests/test_vision_data.py::test_vision_datasets [source]

To run tests please refer to this guide.

\n", "\n", "Create from imagenet style dataset in `path` with `train`,`valid`,`test` subfolders (or provide `valid_pct`). " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageDataBunch.from_folder)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Refer to [`create_from_ll`](#ImageDataBunch.create_from_ll) to see all the `**kwargs` arguments.\n", "\n", "\"*Imagenet-style*\" datasets look something like this (note that the test folder is optional):\n", "\n", "```\n", "path\\\n", " train\\\n", " clas1\\\n", " clas2\\\n", " ...\n", " valid\\\n", " clas1\\\n", " clas2\\\n", " ...\n", " test\\\n", "```\n", "\n", "For example:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data = ImageDataBunch.from_folder(path, ds_tfms=tfms, size=24)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that this (and all factory methods in this section) pass any `kwargs` to [`DataBunch.create`](/basic_data.html#DataBunch.create)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

from_csv[source][test]

\n", "\n", "> from_csv(**`path`**:`PathOrStr`, **`folder`**:`PathOrStr`=***`None`***, **`label_delim`**:`str`=***`None`***, **`csv_labels`**:`PathOrStr`=***`'labels.csv'`***, **`valid_pct`**:`float`=***`0.2`***, **`fn_col`**:`int`=***`0`***, **`label_col`**:`int`=***`1`***, **`suffix`**:`str`=***`''`***, **`delimiter`**:`str`=***`None`***, **`header`**:`Union`\\[`int`, `str`, `NoneType`\\]=***`'infer'`***, **\\*\\*`kwargs`**:`Any`) → `ImageDataBunch`\n", "\n", "
×

Tests found for from_csv:

  • pytest -sv tests/test_vision_data.py::test_from_csv_and_from_df [source]
  • pytest -sv tests/test_vision_data.py::test_path_can_be_str_type [source]

Some other tests where from_csv is used:

  • pytest -sv tests/test_vision_data.py::test_multi [source]

To run tests please refer to this guide.

\n", "\n", "Create from a csv file in `path/csv_labels`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageDataBunch.from_csv)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Refer to [`create_from_ll`](#ImageDataBunch.create_from_ll) to see all the `**kwargs` arguments.\n", "\n", "Create an [`ImageDataBunch`](/vision.data.html#ImageDataBunch) from `path` by splitting the data in `folder` and labelled in a file `csv_labels` between a training and validation set. Use `valid_pct` to indicate the percentage of the total images to use as the validation set. An optional `test` folder contains unlabelled data and `suffix` contains an optional suffix to add to the filenames in `csv_labels` (such as '.jpg'). `fn_col` is the index (or the name) of the the column containing the filenames and `label_col` is the index (indices) (or the name(s)) of the column(s) containing the labels. Use [`header`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html#pandas-read-csv) to specify the format of the csv header, and `delimiter` to specify a non-standard csv-field separator. In case your csv has no header, column parameters can only be specified as indices. If `label_delim` is passed, split what's in the label column according to that separator.\n", "\n", "For example:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data = ImageDataBunch.from_csv(path, ds_tfms=tfms, size=24);" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

from_df[source][test]

\n", "\n", "> from_df(**`path`**:`PathOrStr`, **`df`**:`DataFrame`, **`folder`**:`PathOrStr`=***`None`***, **`label_delim`**:`str`=***`None`***, **`valid_pct`**:`float`=***`0.2`***, **`fn_col`**:`IntsOrStrs`=***`0`***, **`label_col`**:`IntsOrStrs`=***`1`***, **`suffix`**:`str`=***`''`***, **\\*\\*`kwargs`**:`Any`) → `ImageDataBunch`\n", "\n", "
×

Tests found for from_df:

  • pytest -sv tests/test_vision_data.py::test_from_csv_and_from_df [source]

To run tests please refer to this guide.

\n", "\n", "Create from a `DataFrame` `df`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageDataBunch.from_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Refer to [`create_from_ll`](#ImageDataBunch.create_from_ll) to see all the `**kwargs` arguments.\n", "\n", "Same as [`ImageDataBunch.from_csv`](/vision.data.html#ImageDataBunch.from_csv), but passing in a `DataFrame` instead of a csv file. e.g" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namelabel
0train/3/7463.png0
1train/3/21102.png0
2train/3/31559.png0
3train/3/46882.png0
4train/3/26209.png0
\n", "
" ], "text/plain": [ " name label\n", "0 train/3/7463.png 0\n", "1 train/3/21102.png 0\n", "2 train/3/31559.png 0\n", "3 train/3/46882.png 0\n", "4 train/3/26209.png 0" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv(path/'labels.csv', header='infer')\n", "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data = ImageDataBunch.from_df(path, df, ds_tfms=tfms, size=24)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Different datasets are labeled in many different ways. The following methods can help extract the labels from the dataset in a wide variety of situations. The way they are built in fastai is constructive: there are methods which do a lot for you but apply in specific circumstances and there are methods which do less for you but give you more flexibility.\n", "\n", "In this case the hierarchy is:\n", "\n", "1. [`ImageDataBunch.from_name_re`](/vision.data.html#ImageDataBunch.from_name_re): Gets the labels from the filenames using a regular expression\n", "2. [`ImageDataBunch.from_name_func`](/vision.data.html#ImageDataBunch.from_name_func): Gets the labels from the filenames using any function\n", "3. [`ImageDataBunch.from_lists`](/vision.data.html#ImageDataBunch.from_lists): Labels need to be provided as an input in a list" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

from_name_re[source][test]

\n", "\n", "> from_name_re(**`path`**:`PathOrStr`, **`fnames`**:`FilePathList`, **`pat`**:`str`, **`valid_pct`**:`float`=***`0.2`***, **\\*\\*`kwargs`**)\n", "\n", "
×

Tests found for from_name_re:

  • pytest -sv tests/test_vision_data.py::test_from_name_re [source]
  • pytest -sv tests/test_vision_data.py::test_image_resize [source]

To run tests please refer to this guide.

\n", "\n", "Create from list of `fnames` in `path` with re expression `pat`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageDataBunch.from_name_re)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Refer to [`create_from_ll`](#ImageDataBunch.create_from_ll) to see all the `**kwargs` arguments.\n", "\n", "Creates an [`ImageDataBunch`](/vision.data.html#ImageDataBunch) from `fnames`, calling a regular expression (containing one *re group*) on the file names to get the labels, putting aside `valid_pct` for the validation. In the same way as [`ImageDataBunch.from_csv`](/vision.data.html#ImageDataBunch.from_csv), an optional `test` folder contains unlabelled data.\n", "\n", "Our previously created dataframe contains the labels in the filenames so we can leverage it to test this new method. [`ImageDataBunch.from_name_re`](/vision.data.html#ImageDataBunch.from_name_re) needs the exact path of each file so we will append the data path to each filename before creating our [`ImageDataBunch`](/vision.data.html#ImageDataBunch) object." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[PosixPath('/home/ubuntu/.fastai/data/mnist_sample/train/3/7463.png'),\n", " PosixPath('/home/ubuntu/.fastai/data/mnist_sample/train/3/21102.png')]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fn_paths = [path/name for name in df['name']]; fn_paths[:2]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "pat = r\"/(\\d)/\\d+\\.png$\"\n", "data = ImageDataBunch.from_name_re(path, fn_paths, pat=pat, ds_tfms=tfms, size=24)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['3', '7']" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.classes" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

from_name_func[source][test]

\n", "\n", "> from_name_func(**`path`**:`PathOrStr`, **`fnames`**:`FilePathList`, **`label_func`**:`Callable`, **`valid_pct`**:`float`=***`0.2`***, **\\*\\*`kwargs`**)\n", "\n", "
×

No tests found for from_name_func. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Create from list of `fnames` in `path` with `label_func`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageDataBunch.from_name_func)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Refer to [`create_from_ll`](#ImageDataBunch.create_from_ll) to see all the `**kwargs` arguments.\n", "\n", "Works in the same way as [`ImageDataBunch.from_name_re`](/vision.data.html#ImageDataBunch.from_name_re), but instead of a regular expression it expects a function that will determine how to extract the labels from the filenames. (Note that `from_name_re` uses this function in its implementation).\n", "\n", "To test it we could build a function with our previous regex. Let's try another, similar approach to show that the labels can be obtained in a different way." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['3', '7']" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def get_labels(file_path): return '3' if '/3/' in str(file_path) else '7'\n", "data = ImageDataBunch.from_name_func(path, fn_paths, label_func=get_labels, ds_tfms=tfms, size=24)\n", "data.classes" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

from_lists[source][test]

\n", "\n", "> from_lists(**`path`**:`PathOrStr`, **`fnames`**:`FilePathList`, **`labels`**:`StrList`, **`valid_pct`**:`float`=***`0.2`***, **`item_cls`**:`Callable`=***`None`***, **\\*\\*`kwargs`**)\n", "\n", "
×

Tests found for from_lists:

  • pytest -sv tests/test_vision_data.py::test_from_lists [source]

To run tests please refer to this guide.

\n", "\n", "Create from list of `fnames` in `path`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageDataBunch.from_lists)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Refer to [`create_from_ll`](#ImageDataBunch.create_from_ll) to see all the `**kwargs` arguments.\n", "\n", "The most flexible factory function; pass in a list of `labels` that correspond to each of the filenames in `fnames`.\n", "\n", "To show an example we have to build the labels list outside our [`ImageDataBunch`](/vision.data.html#ImageDataBunch) object and give it as an argument when we call `from_lists`. Let's use our previously created function to create our labels list." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['3', '7']" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "labels_ls = list(map(get_labels, fn_paths))\n", "data = ImageDataBunch.from_lists(path, fn_paths, labels=labels_ls, ds_tfms=tfms, size=24)\n", "data.classes" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

create_from_ll[source][test]

\n", "\n", "> create_from_ll(**`lls`**:[`LabelLists`](/data_block.html#LabelLists), **`bs`**:`int`=***`64`***, **`val_bs`**:`int`=***`None`***, **`ds_tfms`**:`Union`\\[`Callable`, `Collection`\\[`Callable`\\], `NoneType`\\]=***`None`***, **`num_workers`**:`int`=***`4`***, **`dl_tfms`**:`Optional`\\[`Collection`\\[`Callable`\\]\\]=***`None`***, **`device`**:[`device`](https://pytorch.org/docs/stable/tensor_attributes.html#torch-device)=***`None`***, **`test`**:`Union`\\[`Path`, `str`, `NoneType`\\]=***`None`***, **`collate_fn`**:`Callable`=***`'data_collate'`***, **`size`**:`int`=***`None`***, **`no_check`**:`bool`=***`False`***, **`resize_method`**:[`ResizeMethod`](/vision.image.html#ResizeMethod)=***`None`***, **`mult`**:`int`=***`None`***, **`padding_mode`**:`str`=***`'reflection'`***, **`mode`**:`str`=***`'bilinear'`***, **`tfm_y`**:`bool`=***`False`***) → `ImageDataBunch`\n", "\n", "
×

No tests found for create_from_ll. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Create an [`ImageDataBunch`](/vision.data.html#ImageDataBunch) from [`LabelLists`](/data_block.html#LabelLists) `lls` with potential `ds_tfms`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageDataBunch.create_from_ll)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `bs`, `num_workers`, `collate_fn` and a potential `test` folder. `ds_tfms` is a tuple of two lists of transforms to be applied to the training and the validation (plus test optionally) set. `tfms` are the transforms to apply to the [`DataLoader`](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader). The `size` and the `kwargs` are passed to the transforms for data augmentation." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

single_from_classes[source][test]

\n", "\n", "> single_from_classes(**`path`**:`PathOrStr`, **`classes`**:`StrList`, **`ds_tfms`**:`Union`\\[`Callable`, `Collection`\\[`Callable`\\]\\]=***`None`***, **\\*\\*`kwargs`**)\n", "\n", "
×

No tests found for single_from_classes. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Create an empty [`ImageDataBunch`](/vision.data.html#ImageDataBunch) in `path` with `classes`. Typically used for inference. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageDataBunch.single_from_classes)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "
Note: This method is deprecated, you should use DataBunch.load_empty now.
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "jekyll_note('This method is deprecated, you should use DataBunch.load_empty now.')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Other methods" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the next few methods we will use another dataset, CIFAR. This is because the second method will get the statistics for our dataset and we want to be able to show different statistics per channel. If we were to use MNIST, these statistics would be the same for every channel. White pixels are [255,255,255] and black pixels are [0,0,0] (or in normalized form [1,1,1] and [0,0,0]) so there is no variance between channels." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PosixPath('/home/ubuntu/.fastai/data/cifar10')" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "path = untar_data(URLs.CIFAR); path" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

channel_view[source][test]

\n", "\n", "> channel_view(**`x`**:`Tensor`) → `Tensor`\n", "\n", "
×

No tests found for channel_view. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Make channel the first axis of `x` and flatten remaining axes " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(channel_view)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data = ImageDataBunch.from_folder(path, ds_tfms=tfms, valid='test', size=24)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def channel_view(x:Tensor)->Tensor:\n", " \"Make channel the first axis of `x` and flatten remaining axes\"\n", " return x.transpose(0,1).contiguous().view(x.shape[1],-1) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This function takes a tensor and flattens all dimensions except the channels, which it keeps as the first axis. This function is used to feed [`ImageDataBunch.batch_stats`](/vision.data.html#ImageDataBunch.batch_stats) so that it can get the pixel statistics of a whole batch.\n", "\n", "Let's take as an example the dimensions our MNIST batches: 128, 3, 24, 24." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "t = torch.Tensor(128, 3, 24, 24)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([128, 3, 24, 24])" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t.size()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "tensor = channel_view(t)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([3, 73728])" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tensor.size()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

batch_stats[source][test]

\n", "\n", "> batch_stats(**`funcs`**:`Collection`\\[`Callable`\\]=***`None`***, **`ds_type`**:[`DatasetType`](/basic_data.html#DatasetType)=***``***) → `Tensor`\n", "\n", "
×

No tests found for batch_stats. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Grab a batch of data and call reduction function `func` per channel " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageDataBunch.batch_stats)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[tensor([0.4928, 0.4767, 0.4671]), tensor([0.2677, 0.2631, 0.2630])]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.batch_stats()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

normalize[source][test]

\n", "\n", "> normalize(**`stats`**:`Collection`\\[`Tensor`\\]=***`None`***, **`do_x`**:`bool`=***`True`***, **`do_y`**:`bool`=***`False`***)\n", "\n", "
×

Tests found for normalize:

  • pytest -sv tests/test_vision_data.py::test_normalize [source]

Some other tests where normalize is used:

  • pytest -sv tests/test_vision_data.py::test_clean_tear_down [source]
  • pytest -sv tests/test_vision_data.py::test_denormalize [source]
  • pytest -sv tests/test_vision_data.py::test_multi_iter [source]

To run tests please refer to this guide.

\n", "\n", "Add normalize transform using `stats` (defaults to `DataBunch.batch_stats`) " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageDataBunch.normalize)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the fast.ai library we have `imagenet_stats`, `cifar_stats` and `mnist_stats` so we can add normalization easily with any of these datasets. Let's see an example with our dataset of choice: MNIST." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ImageDataBunch;\n", "\n", "Train: LabelList\n", "y: CategoryList (50000 items)\n", "[Category truck, Category truck, Category truck, Category truck, Category truck]...\n", "Path: /home/ubuntu/.fastai/data/cifar10\n", "x: ImageList (50000 items)\n", "[Image (3, 32, 32), Image (3, 32, 32), Image (3, 32, 32), Image (3, 32, 32), Image (3, 32, 32)]...\n", "Path: /home/ubuntu/.fastai/data/cifar10;\n", "\n", "Valid: LabelList\n", "y: CategoryList (10000 items)\n", "[Category truck, Category truck, Category truck, Category truck, Category truck]...\n", "Path: /home/ubuntu/.fastai/data/cifar10\n", "x: ImageList (10000 items)\n", "[Image (3, 32, 32), Image (3, 32, 32), Image (3, 32, 32), Image (3, 32, 32), Image (3, 32, 32)]...\n", "Path: /home/ubuntu/.fastai/data/cifar10;\n", "\n", "Test: None" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.normalize(cifar_stats)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[tensor([ 0.0074, -0.0219, 0.0769]), tensor([1.0836, 1.0829, 1.0078])]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.batch_stats()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data normalization" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You may also want to normalize your data, which can be done by using the following functions." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

normalize[source][test]

\n", "\n", "> normalize(**`x`**:`Tensor`, **`mean`**:`FloatTensor`, **`std`**:`FloatTensor`) → `Tensor`\n", "\n", "
×

Tests found for normalize:

Some other tests where normalize is used:

  • pytest -sv tests/test_vision_data.py::test_clean_tear_down [source]
  • pytest -sv tests/test_vision_data.py::test_denormalize [source]
  • pytest -sv tests/test_vision_data.py::test_multi_iter [source]
  • pytest -sv tests/test_vision_data.py::test_normalize [source]

To run tests please refer to this guide.

\n", "\n", "Normalize `x` with `mean` and `std`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(normalize)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

denormalize[source][test]

\n", "\n", "> denormalize(**`x`**:`Tensor`, **`mean`**:`FloatTensor`, **`std`**:`FloatTensor`, **`do_x`**:`bool`=***`True`***) → `Tensor`\n", "\n", "
×

Tests found for denormalize:

  • pytest -sv tests/test_vision_data.py::test_denormalize [source]

To run tests please refer to this guide.

\n", "\n", "Denormalize `x` with `mean` and `std`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(denormalize)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

normalize_funcs[source][test]

\n", "\n", "> normalize_funcs(**`mean`**:`FloatTensor`, **`std`**:`FloatTensor`, **`do_x`**:`bool`=***`True`***, **`do_y`**:`bool`=***`False`***) → `Tuple`\\[`Callable`, `Callable`\\]\n", "\n", "
×

No tests found for normalize_funcs. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Create normalize/denormalize func using `mean` and `std`, can specify `do_y` and `device`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(normalize_funcs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On MNIST the mean and std are 0.1307 and 0.3081 respectively (looked on Google). If you're using a pretrained model, you'll need to use the normalization that was used to train the model. The imagenet norm and denorm functions are stored as constants inside the library named imagenet_norm and imagenet_denorm. If you're training a model on CIFAR-10, you can also use cifar_norm and cifar_denorm.\n", "\n", "You may sometimes see warnings about *clipping input data* when plotting normalized data. That's because even although it's denormalized when plotting automatically, sometimes floating point errors may make some values slightly out or the correct range. You can safely ignore these warnings in this case." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "data = ImageDataBunch.from_folder(untar_data(URLs.MNIST_SAMPLE),\n", " ds_tfms=tfms, size=24)\n", "data.normalize()\n", "data.show_batch(rows=3, figsize=(6,6))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

get_annotations[source][test]

\n", "\n", "> get_annotations(**`fname`**, **`prefix`**=***`None`***)\n", "\n", "
×

Tests found for get_annotations:

Some other tests where get_annotations is used:

  • pytest -sv tests/test_vision_data.py::test_coco [source]
  • pytest -sv tests/test_vision_data.py::test_coco_pickle [source]
  • pytest -sv tests/test_vision_data.py::test_points [source]

To run tests please refer to this guide.

\n", "\n", "Open a COCO style json in `fname` and returns the lists of filenames (with maybe `prefix`) and labelled bboxes. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(get_annotations)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To use this dataset and collate samples into batches, you'll need to following function:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

bb_pad_collate[source][test]

\n", "\n", "> bb_pad_collate(**`samples`**:`BatchSamples`, **`pad_idx`**:`int`=***`0`***) → `Tuple`\\[`FloatTensor`, `Tuple`\\[`LongTensor`, `LongTensor`\\]\\]\n", "\n", "
×

No tests found for bb_pad_collate. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Function that collect `samples` of labelled bboxes and adds padding with `pad_idx`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(bb_pad_collate)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, to apply transformations to [`Image`](/vision.image.html#Image) in a [`Dataset`](https://pytorch.org/docs/stable/data.html#torch.utils.data.Dataset), we use this last class." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ItemList specific to vision" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The vision application adds a few subclasses of [`ItemList`](/data_block.html#ItemList) specific to images." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class ImageList[source][test]

\n", "\n", "> ImageList(**\\*`args`**, **`convert_mode`**=***`'RGB'`***, **`after_open`**:`Callable`=***`None`***, **\\*\\*`kwargs`**) :: [`ItemList`](/data_block.html#ItemList)\n", "\n", "
×

Tests found for ImageList:

Some other tests where ImageList is used:

  • pytest -sv tests/test_vision_data.py::test_image_resize [source]
  • pytest -sv tests/test_vision_data.py::test_multi [source]
  • pytest -sv tests/test_vision_data.py::test_vision_datasets [source]

To run tests please refer to this guide.

\n", "\n", "[`ItemList`](/data_block.html#ItemList) suitable for computer vision. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageList, title_level=3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It inherits from [`ItemList`](/data_block.html#ItemList) and overwrite [`ItemList.get`](/data_block.html#ItemList.get) to call [`open_image`](/vision.image.html#open_image) in order to turn an image file in `Path` object into an [`Image`](/vision.image.html#Image) object. `label_cls` can be specified for the labels, `xtra` contains any extra information (usually in the form of a dataframe) and `processor` is applied to the [`ItemList`](/data_block.html#ItemList) after splitting and labelling." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How [`ImageList.__init__`](/vision.data.html#ImageList.__init__) overwrites on [`ItemList.__init__`](/data_block.html#ItemList.__init__)?\n", "\n", "[`ImageList.__init__`](/vision.data.html#ImageList.__init__) creates additional attributes like `convert_mode`, `after_open`, `c`, `size` upon [`ItemList.__init__`](/data_block.html#ItemList.__init__); and `convert_mode` and `sizes` in particular are necessary to make use of [`ImageList.get`](/vision.data.html#ImageList.get) (which also overwrites on [`ItemList.get`](/data_block.html#ItemList.get)) and [`ImageList.open`](/vision.data.html#ImageList.open)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

from_folder[source][test]

\n", "\n", "> from_folder(**`path`**:`PathOrStr`=***`'.'`***, **`extensions`**:`StrList`=***`None`***, **\\*\\*`kwargs`**) → [`ItemList`](/data_block.html#ItemList)\n", "\n", "
×

Tests found for from_folder:

  • pytest -sv tests/test_vision_data.py::test_vision_datasets [source]
  • pytest -sv tests/test_vision_gan.py::test_gan_datasets [source]

Some other tests where from_folder is used:

  • pytest -sv tests/test_vision_data.py::test_camvid [source]
  • pytest -sv tests/test_vision_data.py::test_clean_tear_down [source]
  • pytest -sv tests/test_vision_data.py::test_coco [source]
  • pytest -sv tests/test_vision_data.py::test_coco_pickle [source]
  • pytest -sv tests/test_vision_data.py::test_coco_same_size [source]
  • pytest -sv tests/test_vision_data.py::test_denormalize [source]
  • pytest -sv tests/test_vision_data.py::test_from_folder [source]
  • pytest -sv tests/test_vision_data.py::test_image_resize [source]
  • pytest -sv tests/test_vision_data.py::test_image_to_image_different_tfms [source]
  • pytest -sv tests/test_vision_data.py::test_image_to_image_different_y_size [source]
  • pytest -sv tests/test_vision_data.py::test_multi_iter [source]
  • pytest -sv tests/test_vision_data.py::test_multi_iter_broken [source]
  • pytest -sv tests/test_vision_data.py::test_normalize [source]
  • pytest -sv tests/test_vision_data.py::test_points [source]

To run tests please refer to this guide.

\n", "\n", "Get the list of files in `path` that have an image suffix. [`recurse`](/core.html#recurse) determines if we search subfolders. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageList.from_folder)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How [`ImageList.from_folder`](/vision.data.html#ImageList.from_folder) overwrites on [`ItemList.from_folder`](/data_block.html#ItemList.from_folder)?\n", "\n", "[`ImageList.from_folder`](/vision.data.html#ImageList.from_folder) adds some constraints on `extensions` upon [`ItemList.from_folder`](/data_block.html#ItemList.from_folder), to work with image files specifically; and can take additional input arguments like `convert_mode` and `after_open` which are not available to [`ItemList`](/data_block.html#ItemList)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

from_df[source][test]

\n", "\n", "> from_df(**`df`**:`DataFrame`, **`path`**:`PathOrStr`, **`cols`**:`IntsOrStrs`=***`0`***, **`folder`**:`PathOrStr`=***`None`***, **`suffix`**:`str`=***`''`***, **\\*\\*`kwargs`**) → `ItemList`\n", "\n", "
×

Tests found for from_df:

Some other tests where from_df is used:

  • pytest -sv tests/test_vision_data.py::test_from_csv_and_from_df [source]

To run tests please refer to this guide.

\n", "\n", "Get the filenames in `cols` of `df` with `folder` in front of them, `suffix` at the end. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageList.from_df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

get_image_files[source][test]

\n", "\n", "> get_image_files(**`c`**:`PathOrStr`, **`check_ext`**:`bool`=***`True`***, **`recurse`**=***`False`***) → `FilePathList`\n", "\n", "
×

Tests found for get_image_files:

Some other tests where get_image_files is used:

  • pytest -sv tests/test_vision_data.py::test_from_name_re [source]
  • pytest -sv tests/test_vision_data.py::test_image_resize [source]

To run tests please refer to this guide.

\n", "\n", "Return list of files in `c` that are images. `check_ext` will filter to `image_extensions`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(get_image_files)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

open[source][test]

\n", "\n", "> open(**`fn`**)\n", "\n", "
×

Tests found for open:

Some other tests where open is used:

  • pytest -sv tests/test_vision_data.py::test_download_images [source]
  • pytest -sv tests/test_vision_data.py::test_verify_image [source]
  • pytest -sv tests/test_vision_data.py::test_verify_images [source]
  • pytest -sv tests/test_vision_data.py::test_vision_pil2tensor [source]
  • pytest -sv tests/test_vision_data.py::test_vision_pil2tensor_16bit [source]

To run tests please refer to this guide.

\n", "\n", "Open image in `fn`, subclass and overwrite for custom behavior. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageList.open)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's get a feel of how `open` is used with the following example." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from fastai.vision import *" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[PosixPath('/Users/Natsume/.fastai/data/planet_tiny/labels.csv'),\n", " PosixPath('/Users/Natsume/.fastai/data/planet_tiny/train')]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "path_data = untar_data(URLs.PLANET_TINY); path_data.ls()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ImageList (200 items)\n", "Image (3, 128, 128),Image (3, 128, 128),Image (3, 128, 128),Image (3, 128, 128),Image (3, 128, 128)\n", "Path: /Users/Natsume/.fastai/data/planet_tiny/train" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "imagelistRGB = ImageList.from_folder(path_data/'train'); imagelistRGB" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`open` takes only one input `fn` as `filename` in the type of `Path` or `String`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PosixPath('/Users/Natsume/.fastai/data/planet_tiny/train/train_34816.jpg')" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "imagelistRGB.items[10]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "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\n", "image/png": "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\n", "text/plain": [ "Image (3, 128, 128)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "imagelistRGB.open(imagelistRGB.items[10])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "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\n", "image/png": "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\n", "text/plain": [ "Image (3, 128, 128)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "imagelistRGB[10]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Image (3, 128, 128)\n" ] } ], "source": [ "print(imagelistRGB[10])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The reason why `imagelistRGB[10]` print out an image, is because behind the scene we have [`ImageList.get`](/vision.data.html#ImageList.get) calls [`ImageList.open`](/vision.data.html#ImageList.open) which calls [`open_image`](/vision.image.html#open_image) which uses ` PIL.Image.open(fn).convert(convert_mode)` to open an image file (how we print the image), and finally turns it into an Image object with shape (3, 128, 128)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Internally, [`ImageList.open`](/vision.data.html#ImageList.open) passes `ImageList.convert_mode` and `ImageList.after_open` to [`open_image`](/vision.image.html#open_image) to adjust the appearance of the Image object. For example, setting `convert_mode` to `L` can make images black and white. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "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\n", "image/png": "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\n", "text/plain": [ "Image (1, 128, 128)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "imagelistRGB.convert_mode = 'L'\n", "imagelistRGB.open(imagelistRGB.items[10])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

show_xys[source][test]

\n", "\n", "> show_xys(**`xs`**, **`ys`**, **`imgsize`**:`int`=***`4`***, **`figsize`**:`Optional`\\[`Tuple`\\[`int`, `int`\\]\\]=***`None`***, **\\*\\*`kwargs`**)\n", "\n", "
×

No tests found for show_xys. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Show the `xs` (inputs) and `ys` (targets) on a figure of `figsize`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageList.show_xys)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

show_xyzs[source][test]

\n", "\n", "> show_xyzs(**`xs`**, **`ys`**, **`zs`**, **`imgsize`**:`int`=***`4`***, **`figsize`**:`Optional`\\[`Tuple`\\[`int`, `int`\\]\\]=***`None`***, **\\*\\*`kwargs`**)\n", "\n", "
×

No tests found for show_xyzs. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Show `xs` (inputs), `ys` (targets) and `zs` (predictions) on a figure of `figsize`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageList.show_xyzs)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class ObjectCategoryList[source][test]

\n", "\n", "> ObjectCategoryList(**`items`**:`Iterator`\\[`T_co`\\], **`classes`**:`Collection`\\[`T_co`\\]=***`None`***, **`label_delim`**:`str`=***`None`***, **`one_hot`**:`bool`=***`False`***, **\\*\\*`kwargs`**) :: [`MultiCategoryList`](/data_block.html#MultiCategoryList)\n", "\n", "
×

No tests found for ObjectCategoryList. To contribute a test please refer to this guide and this discussion.

\n", "\n", "[`ItemList`](/data_block.html#ItemList) for labelled bounding boxes. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ObjectCategoryList, title_level=3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class ObjectItemList[source][test]

\n", "\n", "> ObjectItemList(**\\*`args`**, **`convert_mode`**=***`'RGB'`***, **`after_open`**:`Callable`=***`None`***, **\\*\\*`kwargs`**) :: [`ImageList`](/vision.data.html#ImageList)\n", "\n", "
×

Tests found for ObjectItemList:

  • pytest -sv tests/test_vision_data.py::test_coco [source]
  • pytest -sv tests/test_vision_data.py::test_coco_pickle [source]
  • pytest -sv tests/test_vision_data.py::test_coco_same_size [source]

To run tests please refer to this guide.

\n", "\n", "[`ItemList`](/data_block.html#ItemList) suitable for object detection. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ObjectItemList, title_level=3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class SegmentationItemList[source][test]

\n", "\n", "> SegmentationItemList(**\\*`args`**, **`convert_mode`**=***`'RGB'`***, **`after_open`**:`Callable`=***`None`***, **\\*\\*`kwargs`**) :: [`ImageList`](/vision.data.html#ImageList)\n", "\n", "
×

Tests found for SegmentationItemList:

  • pytest -sv tests/test_vision_data.py::test_camvid [source]

To run tests please refer to this guide.

\n", "\n", "[`ItemList`](/data_block.html#ItemList) suitable for segmentation tasks. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(SegmentationItemList, title_level=3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class SegmentationLabelList[source][test]

\n", "\n", "> SegmentationLabelList(**`items`**:`Iterator`\\[`T_co`\\], **`classes`**:`Collection`\\[`T_co`\\]=***`None`***, **\\*\\*`kwargs`**) :: [`ImageList`](/vision.data.html#ImageList)\n", "\n", "
×

No tests found for SegmentationLabelList. To contribute a test please refer to this guide and this discussion.

\n", "\n", "[`ItemList`](/data_block.html#ItemList) for segmentation masks. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(SegmentationLabelList, title_level=3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class PointsLabelList[source][test]

\n", "\n", "> PointsLabelList(**`items`**:`Iterator`\\[`T_co`\\], **\\*\\*`kwargs`**) :: [`ItemList`](/data_block.html#ItemList)\n", "\n", "
×

No tests found for PointsLabelList. To contribute a test please refer to this guide and this discussion.

\n", "\n", "[`ItemList`](/data_block.html#ItemList) for points. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(PointsLabelList, title_level=3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class PointsItemList[source][test]

\n", "\n", "> PointsItemList(**\\*`args`**, **`convert_mode`**=***`'RGB'`***, **`after_open`**:`Callable`=***`None`***, **\\*\\*`kwargs`**) :: [`ImageList`](/vision.data.html#ImageList)\n", "\n", "
×

Tests found for PointsItemList:

  • pytest -sv tests/test_vision_data.py::test_points [source]

To run tests please refer to this guide.

\n", "\n", "[`ItemList`](/data_block.html#ItemList) for [`Image`](/vision.image.html#Image) to [`ImagePoints`](/vision.image.html#ImagePoints) tasks. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(PointsItemList, title_level=3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class ImageImageList[source][test]

\n", "\n", "> ImageImageList(**\\*`args`**, **`convert_mode`**=***`'RGB'`***, **`after_open`**:`Callable`=***`None`***, **\\*\\*`kwargs`**) :: [`ImageList`](/vision.data.html#ImageList)\n", "\n", "
×

Tests found for ImageImageList:

Some other tests where ImageImageList is used:

  • pytest -sv tests/test_vision_data.py::test_image_to_image_different_tfms [source]
  • pytest -sv tests/test_vision_data.py::test_image_to_image_different_y_size [source]

To run tests please refer to this guide.

\n", "\n", "[`ItemList`](/data_block.html#ItemList) suitable for [`Image`](/vision.image.html#Image) to [`Image`](/vision.image.html#Image) tasks. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageImageList, title_level=3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Building your own dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This module also contains a few helper functions to allow you to build you own dataset for image classification." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

download_images[source][test]

\n", "\n", "> download_images(**`urls`**:`StrList`, **`dest`**:`PathOrStr`, **`max_pics`**:`int`=***`1000`***, **`max_workers`**:`int`=***`8`***, **`timeout`**=***`4`***)\n", "\n", "
×

Tests found for download_images:

  • pytest -sv tests/test_vision_data.py::test_download_images [source]

To run tests please refer to this guide.

\n", "\n", "Download images listed in text file `urls` to path `dest`, at most `max_pics` " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(download_images)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

verify_images[source][test]

\n", "\n", "> verify_images(**`path`**:`PathOrStr`, **`delete`**:`bool`=***`True`***, **`max_workers`**:`int`=***`4`***, **`max_size`**:`int`=***`None`***, **`recurse`**:`bool`=***`False`***, **`dest`**:`PathOrStr`=***`'.'`***, **`n_channels`**:`int`=***`3`***, **`interp`**=***`2`***, **`ext`**:`str`=***`None`***, **`img_format`**:`str`=***`None`***, **`resume`**:`bool`=***`None`***, **\\*\\*`kwargs`**)\n", "\n", "
×

Tests found for verify_images:

  • pytest -sv tests/test_vision_data.py::test_verify_images [source]

To run tests please refer to this guide.

\n", "\n", "Check if the images in `path` aren't broken, maybe resize them and copy it in `dest`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(verify_images)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It will try if every image in this folder can be opened and has `n_channels`. If `n_channels` is 3 – it'll try to convert image to RGB. If `delete=True`, it'll be removed it this fails. If `resume` – it will skip already existent images in `dest`. If `max_size` is specified, image is resized to the same ratio so that both sizes are less than `max_size`, using `interp`. Result is stored in `dest`, `ext` forces an extension type, `img_format` and `kwargs` are passed to PIL.Image.save. Use `max_workers` CPUs." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Undocumented Methods - Methods moved below this line will intentionally be hidden" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

get[source][test]

\n", "\n", "> get(**`i`**)\n", "\n", "
×

No tests found for get. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Subclass if you want to customize how to create item `i` from `self.items`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(PointsItemList.get)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

new[source][test]

\n", "\n", "> new(**`items`**:`Iterator`\\[`T_co`\\], **`processor`**:`Union`\\[[`PreProcessor`](/data_block.html#PreProcessor), `Collection`\\[[`PreProcessor`](/data_block.html#PreProcessor)\\]\\]=***`None`***, **\\*\\*`kwargs`**) → `ItemList`\n", "\n", "
×

No tests found for new. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Create a new [`ItemList`](/data_block.html#ItemList) from `items`, keeping the same attributes. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(SegmentationLabelList.new)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

from_csv[source][test]

\n", "\n", "> from_csv(**`path`**:`PathOrStr`, **`csv_name`**:`str`, **`header`**:`str`=***`'infer'`***, **\\*\\*`kwargs`**) → `ItemList`\n", "\n", "
×

Tests found for from_csv:

  • pytest -sv tests/test_vision_data.py::test_multi [source]

Some other tests where from_csv is used:

  • pytest -sv tests/test_vision_data.py::test_from_csv_and_from_df [source]
  • pytest -sv tests/test_vision_data.py::test_path_can_be_str_type [source]

To run tests please refer to this guide.

\n", "\n", "Get the filenames in `path/csv_name` opened with `header`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageList.from_csv)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

get[source][test]

\n", "\n", "> get(**`i`**)\n", "\n", "
×

No tests found for get. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Subclass if you want to customize how to create item `i` from `self.items`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ObjectCategoryList.get)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

get[source][test]

\n", "\n", "> get(**`i`**)\n", "\n", "
×

No tests found for get. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Subclass if you want to customize how to create item `i` from `self.items`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageList.get)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

reconstruct[source][test]

\n", "\n", "> reconstruct(**`t`**:`Tensor`)\n", "\n", "
×

No tests found for reconstruct. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Reconstruct one of the underlying item for its data `t`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(SegmentationLabelList.reconstruct)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

show_xys[source][test]

\n", "\n", "> show_xys(**`xs`**, **`ys`**, **`imgsize`**:`int`=***`4`***, **`figsize`**:`Optional`\\[`Tuple`\\[`int`, `int`\\]\\]=***`None`***, **\\*\\*`kwargs`**)\n", "\n", "
×

No tests found for show_xys. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Show the `xs` (inputs) and `ys`(targets) on a figure of `figsize`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageImageList.show_xys)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

show_xyzs[source][test]

\n", "\n", "> show_xyzs(**`xs`**, **`ys`**, **`zs`**, **`imgsize`**:`int`=***`4`***, **`figsize`**:`Optional`\\[`Tuple`\\[`int`, `int`\\]\\]=***`None`***, **\\*\\*`kwargs`**)\n", "\n", "
×

No tests found for show_xyzs. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Show `xs` (inputs), `ys` (targets) and `zs` (predictions) on a figure of `figsize`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageImageList.show_xyzs)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

open[source][test]

\n", "\n", "> open(**`fn`**)\n", "\n", "
×

Tests found for open:

Some other tests where open is used:

  • pytest -sv tests/test_vision_data.py::test_download_images [source]
  • pytest -sv tests/test_vision_data.py::test_verify_image [source]
  • pytest -sv tests/test_vision_data.py::test_verify_images [source]
  • pytest -sv tests/test_vision_data.py::test_vision_pil2tensor [source]
  • pytest -sv tests/test_vision_data.py::test_vision_pil2tensor_16bit [source]

To run tests please refer to this guide.

\n", "\n", "Open image in `fn`, subclass and overwrite for custom behavior. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageList.open)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

analyze_pred[source][test]

\n", "\n", "> analyze_pred(**`pred`**:`Tensor`)\n", "\n", "
×

No tests found for analyze_pred. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Called on `pred` before `reconstruct` for additional preprocessing. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(PointsItemList.analyze_pred)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

analyze_pred[source][test]

\n", "\n", "> analyze_pred(**`pred`**, **`thresh`**:`float`=***`0.5`***)\n", "\n", "
×

No tests found for analyze_pred. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Called on `pred` before `reconstruct` for additional preprocessing. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(SegmentationLabelList.analyze_pred)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

reconstruct[source][test]

\n", "\n", "> reconstruct(**`t`**:`Tensor`)\n", "\n", "
×

No tests found for reconstruct. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Reconstruct one of the underlying item for its data `t`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(PointsItemList.reconstruct)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

open[source][test]

\n", "\n", "> open(**`fn`**)\n", "\n", "
×

Tests found for open:

Some other tests where open is used:

  • pytest -sv tests/test_vision_data.py::test_download_images [source]
  • pytest -sv tests/test_vision_data.py::test_verify_image [source]
  • pytest -sv tests/test_vision_data.py::test_verify_images [source]
  • pytest -sv tests/test_vision_data.py::test_vision_pil2tensor [source]
  • pytest -sv tests/test_vision_data.py::test_vision_pil2tensor_16bit [source]

To run tests please refer to this guide.

\n", "\n", "Open image in `fn`, subclass and overwrite for custom behavior. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(SegmentationLabelList.open)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

reconstruct[source][test]

\n", "\n", "> reconstruct(**`t`**:`Tensor`)\n", "\n", "
×

No tests found for reconstruct. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Reconstruct one of the underlying item for its data `t`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ImageList.reconstruct)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

resize_to[source][test]

\n", "\n", "> resize_to(**`img`**, **`targ_sz`**:`int`, **`use_min`**:`bool`=***`False`***)\n", "\n", "
×

No tests found for resize_to. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Size to resize to, to hit `targ_sz` at same aspect ratio, in PIL coords (i.e w*h) " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(resize_to)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

reconstruct[source][test]

\n", "\n", "> reconstruct(**`t`**, **`x`**)\n", "\n", "
×

No tests found for reconstruct. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Reconstruct one of the underlying item for its data `t`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ObjectCategoryList.reconstruct)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

reconstruct[source][test]

\n", "\n", "> reconstruct(**`t`**, **`x`**)\n", "\n", "
×

No tests found for reconstruct. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Reconstruct one of the underlying item for its data `t`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(PointsLabelList.reconstruct)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

analyze_pred[source][test]

\n", "\n", "> analyze_pred(**`pred`**, **`thresh`**:`float`=***`0.5`***)\n", "\n", "
×

No tests found for analyze_pred. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Called on `pred` before `reconstruct` for additional preprocessing. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(PointsLabelList.analyze_pred)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

get[source][test]

\n", "\n", "> get(**`i`**)\n", "\n", "
×

No tests found for get. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Subclass if you want to customize how to create item `i` from `self.items`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(PointsLabelList.get)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## New Methods - Please document or move to the undocumented section" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

analyze_pred[source][test]

\n", "\n", "> analyze_pred(**`pred`**)\n", "\n", "
×

No tests found for analyze_pred. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Called on `pred` before `reconstruct` for additional preprocessing. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ObjectCategoryList.analyze_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "jekyll": { "keywords": "fastai", "summary": "Basic dataset for computer vision and helper function to get a DataBunch", "title": "vision.data" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 2 }