{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Dynamic U-Net" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This module builds a dynamic [U-Net](https://arxiv.org/abs/1505.04597) from any backbone pretrained on ImageNet, automatically inferring the intermediate sizes." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [], "source": [ "from fastai.gen_doc.nbdoc import *\n", "from fastai.vision.models.unet import * " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![U-Net architecture](imgs/u-net-architecture.png)\n", "\n", "This is the original U-Net. The difference here is that the left part is a pretrained model." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class DynamicUnet[source][test]

\n", "\n", "> DynamicUnet(**`encoder`**:[`Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module), **`n_classes`**:`int`, **`blur`**:`bool`=***`False`***, **`blur_final`**=***`True`***, **`self_attention`**:`bool`=***`False`***, **`y_range`**:`OptRange`=***`None`***, **`last_cross`**:`bool`=***`True`***, **`bottle`**:`bool`=***`False`***, **\\*\\*`kwargs`**) :: [`SequentialEx`](/layers.html#SequentialEx)\n", "\n", "
×

Tests found for DynamicUnet:

To run tests please refer to this guide.

\n", "\n", "Create a U-Net from a given architecture. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(DynamicUnet)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This U-Net will sit on top of an `encoder` (that can be a pretrained model) and with a final output of `n_classes`. During the initialization, it uses [`Hooks`](/callbacks.hooks.html#Hooks) to determine the intermediate features sizes by passing a dummy input through the model and create the upward path automatically.\n", "\n", "`blur` is used to avoid checkerboard artifacts at each layer, `blur_final` is specific to the last layer. `self_attention` determines if we use a self attention layer at the third block before the end. If `y_range` is passed, the last activations go through a sigmoid rescaled to that range. `last_cross` determines if we use a cross-connection with the direct input of the model, and in this case `bottle` flags if we use a bottleneck or not for that skip connection." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class UnetBlock[source][test]

\n", "\n", "> UnetBlock(**`up_in_c`**:`int`, **`x_in_c`**:`int`, **`hook`**:[`Hook`](/callbacks.hooks.html#Hook), **`final_div`**:`bool`=***`True`***, **`blur`**:`bool`=***`False`***, **`leaky`**:`float`=***`None`***, **`self_attention`**:`bool`=***`False`***, **\\*\\*`kwargs`**) :: [`Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module)\n", "\n", "
×

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

\n", "\n", "A quasi-UNet block, using `PixelShuffle_ICNR upsampling`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(UnetBlock)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This block receives the output of the last block to be upsampled (size `up_in_c`) and the activations features from an intermediate layer of the `encoder` (size `x_in_c`, this is the lateral connection). The `hook` is set to this intermediate layer to store the output needed for this block. `final_div` determines if we divide the number of features by 2 with the upsampling, `blur` is to avoid checkerboard artifacts. If `leaky` is set, use a leaky ReLU with a slope equals to that parameter instead of a ReLU, and `self_attention` determines if we use a self-attention layer. `kwargs` are passed to [`conv_layer`](/layers.html#conv_layer)." ] }, { "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": [ "

forward[source][test]

\n", "\n", "> forward(**`up_in`**:`Tensor`) → `Tensor`\n", "\n", "
×

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

\n", "\n", "Defines the computation performed at every call. Should be overridden by all subclasses.\n", "\n", ".. note::\n", " Although the recipe for forward pass needs to be defined within\n", " this function, one should call the :class:`Module` instance afterwards\n", " instead of this since the former takes care of running the\n", " registered hooks while the latter silently ignores them. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(UnetBlock.forward)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## New Methods - Please document or move to the undocumented section" ] } ], "metadata": { "jekyll": { "keywords": "fastai", "summary": "Dynamic Unet that can use any pretrained model as a backbone.", "title": "vision.models.unet" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 2 }