blob: 22545140a817ef8d574ba9f2805b34e1a542157f [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<meta content="Methods of applying data augmentation (Module API)" property="og:title">
<meta content="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/og-logo.png" property="og:image">
<meta content="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/og-logo.png" property="og:image:secure_url">
<meta content="Methods of applying data augmentation (Module API)" property="og:description"/>
<title>Methods of applying data augmentation (Module API) — mxnet documentation</title>
<link crossorigin="anonymous" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" rel="stylesheet"/>
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet"/>
<link href="../../_static/basic.css" rel="stylesheet" type="text/css">
<link href="../../_static/pygments.css" rel="stylesheet" type="text/css">
<link href="../../_static/mxnet.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../',
VERSION: '',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script src="https://code.jquery.com/jquery-1.11.1.min.js" type="text/javascript"></script>
<script src="../../_static/underscore.js" type="text/javascript"></script>
<script src="../../_static/searchtools_custom.js" type="text/javascript"></script>
<script src="../../_static/doctools.js" type="text/javascript"></script>
<script src="../../_static/selectlang.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script>
<script type="text/javascript"> jQuery(function() { Search.loadIndex("/versions/1.3.1/searchindex.js"); Search.init();}); </script>
<!-- -->
<!-- <script type="text/javascript" src="../../_static/jquery.js"></script> -->
<!-- -->
<!-- <script type="text/javascript" src="../../_static/underscore.js"></script> -->
<!-- -->
<!-- <script type="text/javascript" src="../../_static/doctools.js"></script> -->
<!-- -->
<!-- <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> -->
<!-- -->
<link href="../../genindex.html" rel="index" title="Index">
<link href="../../search.html" rel="search" title="Search"/>
<link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"/>
</link></link></link></meta></meta></meta></head>
<body background="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-background-compressed.jpeg" role="document">
<div class="content-block"><div class="navbar navbar-fixed-top">
<div class="container" id="navContainer">
<div class="innder" id="header-inner">
<h1 id="logo-wrap">
<a href="../../" id="logo"><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet_logo.png"/></a>
</h1>
<nav class="nav-bar" id="main-nav">
<a class="main-nav-link" href="/versions/1.3.1/install/index.html">Install</a>
<span id="dropdown-menu-position-anchor">
<a aria-expanded="true" aria-haspopup="true" class="main-nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">Gluon <span class="caret"></span></a>
<ul class="dropdown-menu navbar-menu" id="package-dropdown-menu">
<li><a class="main-nav-link" href="/versions/1.3.1/tutorials/gluon/gluon.html">About</a></li>
<li><a class="main-nav-link" href="https://www.d2l.ai/">Dive into Deep Learning</a></li>
<li><a class="main-nav-link" href="https://gluon-cv.mxnet.io">GluonCV Toolkit</a></li>
<li><a class="main-nav-link" href="https://gluon-nlp.mxnet.io/">GluonNLP Toolkit</a></li>
</ul>
</span>
<span id="dropdown-menu-position-anchor">
<a aria-expanded="true" aria-haspopup="true" class="main-nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">API <span class="caret"></span></a>
<ul class="dropdown-menu navbar-menu" id="package-dropdown-menu">
<li><a class="main-nav-link" href="/versions/1.3.1/api/python/index.html">Python</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/api/c++/index.html">C++</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/api/clojure/index.html">Clojure</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/api/julia/index.html">Julia</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/api/perl/index.html">Perl</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/api/r/index.html">R</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/api/scala/index.html">Scala</a></li>
</ul>
</span>
<span id="dropdown-menu-position-anchor-docs">
<a aria-expanded="true" aria-haspopup="true" class="main-nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">Docs <span class="caret"></span></a>
<ul class="dropdown-menu navbar-menu" id="package-dropdown-menu-docs">
<li><a class="main-nav-link" href="/versions/1.3.1/faq/index.html">FAQ</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/tutorials/index.html">Tutorials</a>
<li><a class="main-nav-link" href="https://github.com/apache/incubator-mxnet/tree/1.3.1/example">Examples</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/architecture/index.html">Architecture</a></li>
<li><a class="main-nav-link" href="https://cwiki.apache.org/confluence/display/MXNET/Apache+MXNet+Home">Developer Wiki</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/model_zoo/index.html">Model Zoo</a></li>
<li><a class="main-nav-link" href="https://github.com/onnx/onnx-mxnet">ONNX</a></li>
</li></ul>
</span>
<span id="dropdown-menu-position-anchor-community">
<a aria-expanded="true" aria-haspopup="true" class="main-nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">Community <span class="caret"></span></a>
<ul class="dropdown-menu navbar-menu" id="package-dropdown-menu-community">
<li><a class="main-nav-link" href="http://discuss.mxnet.io">Forum</a></li>
<li><a class="main-nav-link" href="https://github.com/apache/incubator-mxnet/tree/1.3.1">Github</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/community/contribute.html">Contribute</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/community/ecosystem.html">Ecosystem</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/community/powered_by.html">Powered By</a></li>
</ul>
</span>
<span id="dropdown-menu-position-anchor-version" style="position: relative"><a href="#" class="main-nav-link dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="true">1.3.1<span class="caret"></span></a><ul id="package-dropdown-menu" class="dropdown-menu"><li><a href="/">master</a></li><li><a href="/versions/1.7.0/">1.7.0</a></li><li><a href=/versions/1.6.0/>1.6.0</a></li><li><a href=/versions/1.5.0/>1.5.0</a></li><li><a href=/versions/1.4.1/>1.4.1</a></li><li><a href=/versions/1.3.1/>1.3.1</a></li><li><a href=/versions/1.2.1/>1.2.1</a></li><li><a href=/versions/1.1.0/>1.1.0</a></li><li><a href=/versions/1.0.0/>1.0.0</a></li><li><a href=/versions/0.12.1/>0.12.1</a></li><li><a href=/versions/0.11.0/>0.11.0</a></li></ul></span></nav>
<script> function getRootPath(){ return "../../" } </script>
<div class="burgerIcon dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button"></a>
<ul class="dropdown-menu" id="burgerMenu">
<li><a href="/versions/1.3.1/install/index.html">Install</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/tutorials/index.html">Tutorials</a></li>
<li class="dropdown-submenu dropdown">
<a aria-expanded="true" aria-haspopup="true" class="dropdown-toggle burger-link" data-toggle="dropdown" href="#" tabindex="-1">Gluon</a>
<ul class="dropdown-menu navbar-menu" id="package-dropdown-menu">
<li><a class="main-nav-link" href="/versions/1.3.1/tutorials/gluon/gluon.html">About</a></li>
<li><a class="main-nav-link" href="http://gluon.mxnet.io">The Straight Dope (Tutorials)</a></li>
<li><a class="main-nav-link" href="https://gluon-cv.mxnet.io">GluonCV Toolkit</a></li>
<li><a class="main-nav-link" href="https://gluon-nlp.mxnet.io/">GluonNLP Toolkit</a></li>
</ul>
</li>
<li class="dropdown-submenu">
<a aria-expanded="true" aria-haspopup="true" class="dropdown-toggle burger-link" data-toggle="dropdown" href="#" tabindex="-1">API</a>
<ul class="dropdown-menu">
<li><a class="main-nav-link" href="/versions/1.3.1/api/python/index.html">Python</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/api/c++/index.html">C++</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/api/clojure/index.html">Clojure</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/api/julia/index.html">Julia</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/api/perl/index.html">Perl</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/api/r/index.html">R</a></li>
<li><a class="main-nav-link" href="/versions/1.3.1/api/scala/index.html">Scala</a></li>
</ul>
</li>
<li class="dropdown-submenu">
<a aria-expanded="true" aria-haspopup="true" class="dropdown-toggle burger-link" data-toggle="dropdown" href="#" tabindex="-1">Docs</a>
<ul class="dropdown-menu">
<li><a href="/versions/1.3.1/faq/index.html" tabindex="-1">FAQ</a></li>
<li><a href="/versions/1.3.1/tutorials/index.html" tabindex="-1">Tutorials</a></li>
<li><a href="https://github.com/apache/incubator-mxnet/tree/1.3.1/example" tabindex="-1">Examples</a></li>
<li><a href="/versions/1.3.1/architecture/index.html" tabindex="-1">Architecture</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/MXNET/Apache+MXNet+Home" tabindex="-1">Developer Wiki</a></li>
<li><a href="/versions/1.3.1/model_zoo/index.html" tabindex="-1">Gluon Model Zoo</a></li>
<li><a href="https://github.com/onnx/onnx-mxnet" tabindex="-1">ONNX</a></li>
</ul>
</li>
<li class="dropdown-submenu dropdown">
<a aria-haspopup="true" class="dropdown-toggle burger-link" data-toggle="dropdown" href="#" role="button" tabindex="-1">Community</a>
<ul class="dropdown-menu">
<li><a href="http://discuss.mxnet.io" tabindex="-1">Forum</a></li>
<li><a href="https://github.com/apache/incubator-mxnet/tree/1.3.1" tabindex="-1">Github</a></li>
<li><a href="/versions/1.3.1/community/contribute.html" tabindex="-1">Contribute</a></li>
<li><a href="/versions/1.3.1/community/ecosystem.html" tabindex="-1">Ecosystem</a></li>
<li><a href="/versions/1.3.1/community/powered_by.html" tabindex="-1">Powered By</a></li>
</ul>
</li>
<li id="dropdown-menu-position-anchor-version-mobile" class="dropdown-submenu" style="position: relative"><a href="#" tabindex="-1">1.3.1</a><ul class="dropdown-menu"><li><a tabindex="-1" href=/>master</a></li><li><a tabindex="-1" href=/versions/1.6.0/>1.6.0</a></li><li><a tabindex="-1" href=/versions/1.5.0/>1.5.0</a></li><li><a tabindex="-1" href=/versions/1.4.1/>1.4.1</a></li><li><a tabindex="-1" href=/versions/1.3.1/>1.3.1</a></li><li><a tabindex="-1" href=/versions/1.2.1/>1.2.1</a></li><li><a tabindex="-1" href=/versions/1.1.0/>1.1.0</a></li><li><a tabindex="-1" href=/versions/1.0.0/>1.0.0</a></li><li><a tabindex="-1" href=/versions/0.12.1/>0.12.1</a></li><li><a tabindex="-1" href=/versions/0.11.0/>0.11.0</a></li></ul></li></ul>
</div>
<div class="plusIcon dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button"><span aria-hidden="true" class="glyphicon glyphicon-plus"></span></a>
<ul class="dropdown-menu dropdown-menu-right" id="plusMenu"></ul>
</div>
<div id="search-input-wrap">
<form action="../../search.html" autocomplete="off" class="" method="get" role="search">
<div class="form-group inner-addon left-addon">
<i class="glyphicon glyphicon-search"></i>
<input class="form-control" name="q" placeholder="Search" type="text"/>
</div>
<input name="check_keywords" type="hidden" value="yes">
<input name="area" type="hidden" value="default"/>
</input></form>
<div id="search-preview"></div>
</div>
<div id="searchIcon">
<span aria-hidden="true" class="glyphicon glyphicon-search"></span>
</div>
<!-- <div id="lang-select-wrap"> -->
<!-- <label id="lang-select-label"> -->
<!-- <\!-- <i class="fa fa-globe"></i> -\-> -->
<!-- <span></span> -->
<!-- </label> -->
<!-- <select id="lang-select"> -->
<!-- <option value="en">Eng</option> -->
<!-- <option value="zh">中文</option> -->
<!-- </select> -->
<!-- </div> -->
<!-- <a id="mobile-nav-toggle">
<span class="mobile-nav-toggle-bar"></span>
<span class="mobile-nav-toggle-bar"></span>
<span class="mobile-nav-toggle-bar"></span>
</a> -->
</div>
</div>
</div>
<script type="text/javascript">
$('body').css('background', 'white');
</script>
<div class="container">
<div class="row">
<div aria-label="main navigation" class="sphinxsidebar leftsidebar" role="navigation">
<div class="sphinxsidebarwrapper">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../api/python/index.html">Python Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/r/index.html">R Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/julia/index.html">Julia Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/c++/index.html">C++ Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/scala/index.html">Scala Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/perl/index.html">Perl Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../faq/index.html">HowTo Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../architecture/index.html">System Documents</a></li>
<li class="toctree-l1"><a class="reference internal" href="../index.html">Tutorials</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../community/contribute.html">Community</a></li>
</ul>
</div>
</div>
<div class="content">
<div class="page-tracker"></div>
<div class="section" id="methods-of-applying-data-augmentation-module-api">
<span id="methods-of-applying-data-augmentation-module-api"></span><h1>Methods of applying data augmentation (Module API)<a class="headerlink" href="#methods-of-applying-data-augmentation-module-api" title="Permalink to this headline"></a></h1>
<p>Data Augmentation is a regularization technique that’s used to avoid overfitting when training Machine Learning models. Although the technique can be applied in a variety of domains, it’s very common in Computer Vision. Adjustments are made to the original images in the training dataset before being used in training. Some example adjustments include translating, cropping, scaling, rotating, changing brightness and contrast. We do this to reduce the dependence of the model on spurious characteristics; e.g. training data may only contain faces that fill 1/4 of the image, so the model trained without data augmentation might unhelpfully learn that faces can only be of this size.</p>
<p>In this tutorial we discuss the different interfaces available in MXNet to perform data augmentation if you’re using the Module API. We start by showing a complete example using Module’s <a class="reference external" href="/api/python/image/image.html?highlight=imageiter#mxnet.image.ImageIter"><code class="docutils literal"><span class="pre">ImageIter</span></code></a>, and then unpack the example to gain a greater understanding of the internals. In the process you’ll learn about augmentation functions, <a class="reference external" href="/api/python/image/image.html?highlight=augmen#mxnet.image.Augmenter"><code class="docutils literal"><span class="pre">mxnet.image.Augmenter</span></code></a> classes and Augmenter lists.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="o">%</span><span class="n">matplotlib</span> <span class="n">inline</span>
<span class="kn">import</span> <span class="nn">mxnet</span> <span class="kn">as</span> <span class="nn">mx</span> <span class="c1"># used version '1.0.0' at time of writing</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">matplotlib.pyplot</span> <span class="kn">import</span> <span class="n">imshow</span>
<span class="kn">import</span> <span class="nn">multiprocessing</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="n">mx</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span> <span class="c1"># set seed for repeatability</span>
</pre></div>
</div>
<p>We define a utility function below, that will be used for visualising the augmentations in the tutorial.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">plot_mx_array</span><span class="p">(</span><span class="n">array</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Array expected to be height x width x 3 (channels), and values are floats between 0 and 255.</span>
<span class="sd"> """</span>
<span class="k">assert</span> <span class="n">array</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">"RGB Channel should be last"</span>
<span class="n">imshow</span><span class="p">((</span><span class="n">array</span><span class="o">.</span><span class="n">clip</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">)</span><span class="o">/</span><span class="mi">255</span><span class="p">)</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">())</span>
</pre></div>
</div>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">image_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">"data"</span><span class="p">,</span> <span class="s2">"images"</span><span class="p">)</span>
<span class="n">mx</span><span class="o">.</span><span class="n">test_utils</span><span class="o">.</span><span class="n">download</span><span class="p">(</span><span class="s1">'https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/doc/tutorials/data_aug/inputs/0.jpg'</span><span class="p">,</span> <span class="n">dirname</span><span class="o">=</span><span class="n">image_dir</span><span class="p">)</span>
<span class="n">example_image</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">imread</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">image_dir</span><span class="p">,</span><span class="s2">"0.jpg"</span><span class="p">))</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="s2">"float32"</span><span class="p">)</span>
<span class="n">plot_mx_array</span><span class="p">(</span><span class="n">example_image</span><span class="p">)</span>
</pre></div>
</div>
<p><img alt="png" src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/doc/tutorials/data_aug/outputs/use/output_5_0.png"><!--notebook-skip-line--></img></p>
<div class="section" id="quick-start-using-imageiter">
<span id="quick-start-using-imageiter"></span><h2>Quick start using <a class="reference external" href="/api/python/image/image.html?highlight=imageiter#mxnet.image.ImageIter"><code class="docutils literal"><span class="pre">ImageIter</span></code></a><a class="headerlink" href="#quick-start-using-imageiter" title="Permalink to this headline"></a></h2>
<p>One of the most convenient ways to augment your image data is via arguments of <a class="reference external" href="/api/python/image/image.html?highlight=imageiter#mxnet.image.ImageIter"><code class="docutils literal"><span class="pre">mxnet.image.ImageIter</span></code></a>, but you’ll need to reference the documentation of <a class="reference external" href="/api/python/image/image.html?highlight=createaugmenter#mxnet.image.CreateAugmenter"><code class="docutils literal"><span class="pre">mxnet.image.CreateAugmenter</span></code></a> to see a full list of available options. Under the hood, additional arguments passed to <a class="reference external" href="/api/python/image/image.html?highlight=imageiter#mxnet.image.ImageIter"><code class="docutils literal"><span class="pre">ImageIter</span></code></a> are collected as keyword arguments (<code class="docutils literal"><span class="pre">**kwargs</span></code>), and are passed to <a class="reference external" href="/api/python/image/image.html?highlight=createaugmenter#mxnet.image.CreateAugmenter"><code class="docutils literal"><span class="pre">mxnet.image.CreateAugmenter</span></code></a>. We’ll see this in more detail in the sections below, but <a class="reference external" href="/api/python/image/image.html?highlight=createaugmenter#mxnet.image.CreateAugmenter"><code class="docutils literal"><span class="pre">mxnet.image.CreateAugmenter</span></code></a> creates a list of <a class="reference external" href="/api/python/image/image.html?highlight=augmen#mxnet.image.Augmenter"><code class="docutils literal"><span class="pre">mxnet.image.Augmenter</span></code></a>s corresponding to each type of augmentation (e.g. crop, flip, change of brightness, etc.), and this list will be iterated though and the augmentations applied in turn. Alternatively, you can create this list yourself and pass it to <a class="reference external" href="/api/python/image/image.html?highlight=imageiter#mxnet.image.ImageIter"><code class="docutils literal"><span class="pre">ImageIter</span></code></a> via the <code class="docutils literal"><span class="pre">aug_list</span></code> argument.</p>
<p>We show a simple example of this below, after creating an <code class="docutils literal"><span class="pre">images.lst</span></code> file used by the <a class="reference external" href="/api/python/image/image.html?highlight=imageiter#mxnet.image.ImageIter"><code class="docutils literal"><span class="pre">ImageIter</span></code></a>. Use <a class="reference external" href="https://github.com/apache/incubator-mxnet/blob/master/tools/im2rec.py"><code class="docutils literal"><span class="pre">tools/im2rec.py</span></code></a> to create the <code class="docutils literal"><span class="pre">images.lst</span></code> if you don’t already have this for your data.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">path_to_image</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">"images"</span><span class="p">,</span> <span class="s2">"0.jpg"</span><span class="p">)</span>
<span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">label</span> <span class="o">=</span> <span class="mf">0.</span>
<span class="n">list_file_content</span> <span class="o">=</span> <span class="s2">"{0}</span><span class="se">\t</span><span class="s2">{1:.5f}</span><span class="se">\t</span><span class="s2">{2}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">label</span><span class="p">,</span> <span class="n">path_to_image</span><span class="p">)</span>
<span class="n">path_list_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">image_dir</span><span class="p">,</span> <span class="s2">"images.lst"</span><span class="p">)</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">path_list_file</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">list_file_content</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">training_iter</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">ImageIter</span><span class="p">(</span><span class="n">batch_size</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">data_shape</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">),</span>
<span class="n">path_root</span><span class="o">=</span> <span class="s1">'data'</span><span class="p">,</span> <span class="n">path_imglist</span><span class="o">=</span><span class="n">path_list_file</span><span class="p">,</span>
<span class="n">rand_crop</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">rand_mirror</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">inter_method</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
<span class="n">brightness</span><span class="o">=</span><span class="mf">0.125</span><span class="p">,</span> <span class="n">contrast</span><span class="o">=</span><span class="mf">0.125</span><span class="p">,</span> <span class="n">saturation</span><span class="o">=</span><span class="mf">0.125</span><span class="p">,</span>
<span class="n">pca_noise</span><span class="o">=</span><span class="mf">0.02</span>
<span class="p">)</span>
</pre></div>
</div>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">batch</span> <span class="ow">in</span> <span class="n">training_iter</span><span class="p">:</span>
<span class="k">assert</span> <span class="n">batch</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">shape</span> <span class="o">==</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">batch</span><span class="o">.</span><span class="n">label</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">shape</span> <span class="o">==</span> <span class="p">(</span><span class="mi">1</span><span class="p">,)</span>
<span class="n">sample</span> <span class="o">=</span> <span class="n">batch</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">transpose</span><span class="p">(</span><span class="n">axes</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">])</span>
<span class="n">plot_mx_array</span><span class="p">(</span><span class="n">sample</span><span class="p">)</span>
<span class="k">break</span>
</pre></div>
</div>
<p><img alt="png" src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/doc/tutorials/data_aug/outputs/use/output_28_1.png"/><!--notebook-skip-line--></p>
<p><a class="reference external" href="/api/python/image/image.html?highlight=imagedetiter#mxnet.image.ImageDetIter"><code class="docutils literal"><span class="pre">mxnet.image.ImageDetIter</span></code></a> works similarly (with <a class="reference external" href="/api/python/image/image.html?highlight=createdetaugmenter#mxnet.image.CreateDetAugmenter"><code class="docutils literal"><span class="pre">mxnet.image.CreateDetAugmenter</span></code></a>), but <a class="reference external" href="/api/python/io/io.html?highlight=imagerecorditer#mxnet.io.ImageRecordIter"><code class="docutils literal"><span class="pre">mxnet.io.ImageRecordIter</span></code></a> has a slightly different interface, so reference the documentation <a class="reference external" href="/api/python/io/io.html?highlight=imagerecorditer#mxnet.io.ImageRecordIter">here</a> if you’re using Record IO data format.</p>
</div>
<div class="section" id="manual-augmentation">
<span id="manual-augmentation"></span><h2>Manual Augmentation<a class="headerlink" href="#manual-augmentation" title="Permalink to this headline"></a></h2>
<p>Although the vast majority of cases will be covered using the augmentation arguments of <a class="reference external" href="/api/python/image/image.html?highlight=imageiter#mxnet.image.ImageIter"><code class="docutils literal"><span class="pre">mxnet.image.ImageIter</span></code></a> as we’ve seen above, sometime you’ll want more fine grained control of augmentations. We will now dive into some of the lower level methods for image augmentation, that you can use to manually apply augmentations to images.</p>
<div class="section" id="augmentation-functions">
<span id="augmentation-functions"></span><h3>Augmentation Functions<a class="headerlink" href="#augmentation-functions" title="Permalink to this headline"></a></h3>
<p>MXNet provides a small number of augmentation functions that are quick and easy to use, but they are limited to positional augmentations (such as <a class="reference external" href="/api/python/image/image.html?highlight=random_crop#mxnet.image.random_crop"><code class="docutils literal"><span class="pre">mxnet.image.random_crop</span></code></a> and <a class="reference external" href="/api/python/image/image.html?highlight=random_crop#mxnet.image.resize_short"><code class="docutils literal"><span class="pre">mxnet.image.resize_short</span></code></a> functions) as opposed to color augmentations (such as brightness jitter). Although these functions are easy to apply, the <a class="reference external" href="/api/python/image/image.html?highlight=augmen#mxnet.image.Augmenter"><code class="docutils literal"><span class="pre">mxnet.image.Augmenter</span></code></a> classes are much more comprehensive and just as easy to use, as we’ll see in the next section.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">aug_image</span><span class="p">,</span> <span class="n">crop_box</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">random_crop</span><span class="p">(</span><span class="n">example_image</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">))</span>
<span class="n">plot_mx_array</span><span class="p">(</span><span class="n">aug_image</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">aug_image</span><span class="o">.</span><span class="n">shape</span> <span class="o">==</span> <span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</pre></div>
</div>
<p><img alt="png" src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/doc/tutorials/data_aug/outputs/use/output_16_0.png"/><!--notebook-skip-line--></p>
</div>
<div class="section" id="augmenter-classes">
<span id="augmenter-classes"></span><h3>Augmenter Classes<a class="headerlink" href="#augmenter-classes" title="Permalink to this headline"></a></h3>
<p>You can apply a wide variety of positional and color augmentations with <a class="reference external" href="/api/python/image/image.html?highlight=augmen#mxnet.image.Augmenter"><code class="docutils literal"><span class="pre">mxnet.image.Augmenter</span></code></a> classes, and using them is the recommended approach for applying augmentations manually. After creating an instance of an Augmenter with the required parameters, you can call the Augmenter just as you would a function. Under the hood a <code class="docutils literal"><span class="pre">__call__</span></code> method is defined which applies the augmentation. Augmenters with randomness are randomized each time the Augmenter is called, so calling the same Augmenter twice will give different results on the same input.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">aug</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">RandomCropAug</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">))</span>
<span class="n">aug_image</span> <span class="o">=</span> <span class="n">aug</span><span class="p">(</span><span class="n">example_image</span><span class="p">)</span>
<span class="n">plot_mx_array</span><span class="p">(</span><span class="n">aug_image</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">aug_image</span><span class="o">.</span><span class="n">shape</span> <span class="o">==</span> <span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</pre></div>
</div>
<p><img alt="png" src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/doc/tutorials/data_aug/outputs/use/output_19_0.png"/><!--notebook-skip-line--></p>
</div>
<div class="section" id="augmenter-list">
<span id="augmenter-list"></span><h3>Augmenter list<a class="headerlink" href="#augmenter-list" title="Permalink to this headline"></a></h3>
<p>Very often you’ll want to apply many different types of augmentation to an image. Instead of nesting the calls of Augmenters, a natural structure for handling a large number of Augmenters is a list. You can construct this list manually, or you can use helper functions like <a class="reference external" href="/api/python/image/image.html?highlight=createaugmenter#mxnet.image.CreateAugmenter"><code class="docutils literal"><span class="pre">mxnet.image.CreateAugmenter</span></code></a> to create these lists automatically.</p>
<p>Object detection tasks require the same positional augmentations to be applied to the data and the label, so you should use <a class="reference external" href="/api/python/image/image.html?highlight=createdetaugmenter#mxnet.image.CreateDetAugmenter"><code class="docutils literal"><span class="pre">mxnet.image.CreateDetAugmenter</span></code></a> which handles this case.</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># created manually</span>
<span class="n">aug_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">mx</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">RandomCropAug</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">)),</span> <span class="n">mx</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">BrightnessJitterAug</span><span class="p">(</span><span class="n">brightness</span><span class="o">=</span><span class="mi">1</span><span class="p">)]</span>
<span class="n">aug_image</span> <span class="o">=</span> <span class="n">example_image</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="k">for</span> <span class="n">aug</span> <span class="ow">in</span> <span class="n">aug_list</span><span class="p">:</span>
<span class="n">aug_image</span> <span class="o">=</span> <span class="n">aug</span><span class="p">(</span><span class="n">aug_image</span><span class="p">)</span>
<span class="n">plot_mx_array</span><span class="p">(</span><span class="n">aug_image</span><span class="p">)</span>
<span class="k">assert</span> <span class="nb">all</span><span class="p">([</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">mx</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">Augmenter</span><span class="p">)</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">aug_list</span><span class="p">])</span>
</pre></div>
</div>
<p><img alt="png" src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/doc/tutorials/data_aug/outputs/use/output_22_1.png"/><!--notebook-skip-line--></p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># created automatically</span>
<span class="n">aug_list</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">CreateAugmenter</span><span class="p">(</span><span class="n">data_shape</span><span class="o">=</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">),</span> <span class="n">rand_crop</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span>
<span class="n">rand_mirror</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">mean</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">brightness</span><span class="o">=</span><span class="mf">0.125</span><span class="p">,</span> <span class="n">contrast</span><span class="o">=</span><span class="mf">0.125</span><span class="p">,</span>
<span class="n">saturation</span><span class="o">=</span><span class="mf">0.125</span><span class="p">,</span> <span class="n">pca_noise</span><span class="o">=</span><span class="mf">0.05</span><span class="p">,</span> <span class="n">inter_method</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
<span class="n">aug_image</span> <span class="o">=</span> <span class="n">example_image</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="k">for</span> <span class="n">aug</span> <span class="ow">in</span> <span class="n">aug_list</span><span class="p">:</span>
<span class="n">aug_image</span> <span class="o">=</span> <span class="n">aug</span><span class="p">(</span><span class="n">aug_image</span><span class="p">)</span>
<span class="n">plot_mx_array</span><span class="p">(</span><span class="n">aug_image</span><span class="p">)</span>
<span class="k">assert</span> <span class="nb">all</span><span class="p">([</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">mx</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">Augmenter</span><span class="p">)</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">aug_list</span><span class="p">])</span>
</pre></div>
</div>
<p><img alt="png" src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/doc/tutorials/data_aug/outputs/use/output_23_1.png"/><!--notebook-skip-line--></p>
<p><strong><em>Watch Out!</em></strong> Check some examples that are output after applying all the augmentations. You may find that the augmentation steps are too severe and may actually prevent the model from learning. Some of the augmentation parameters used in this tutorial are set high for demonstration purposes (e.g. <code class="docutils literal"><span class="pre">brightness=1</span></code>); you might want to reduce them if your training error stays too high during training. Some examples of excessive augmentation are shown below:</p>
<p><img alt="Drawing" src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/doc/tutorials/data_aug/outputs/use//severe_aug.png" style="width: 700px;"/></p>
<div class="btn-group" role="group">
<div class="download-btn"><a download="data_augmentation.ipynb" href="data_augmentation.ipynb"><span class="glyphicon glyphicon-download-alt"></span> data_augmentation.ipynb</a></div></div></div>
</div>
</div>
</div>
</div>
<div aria-label="main navigation" class="sphinxsidebar rightsidebar" role="navigation">
<div class="sphinxsidebarwrapper">
<h3><a href="../../index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Methods of applying data augmentation (Module API)</a><ul>
<li><a class="reference internal" href="#quick-start-using-imageiter">Quick start using <code class="docutils literal"><span class="pre">ImageIter</span></code></a></li>
<li><a class="reference internal" href="#manual-augmentation">Manual Augmentation</a><ul>
<li><a class="reference internal" href="#augmentation-functions">Augmentation Functions</a></li>
<li><a class="reference internal" href="#augmenter-classes">Augmenter Classes</a></li>
<li><a class="reference internal" href="#augmenter-list">Augmenter list</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div><div class="footer">
<div class="section-disclaimer">
<div class="container">
<div>
<img height="60" src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/apache_incubator_logo.png"/>
<p>
Apache MXNet is an effort undergoing incubation at The Apache Software Foundation (ASF), <strong>sponsored by the <i>Apache Incubator</i></strong>. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
</p>
<p>
"Copyright © 2017-2018, The Apache Software Foundation
Apache MXNet, MXNet, Apache, the Apache feather, and the Apache MXNet project logo are either registered trademarks or trademarks of the Apache Software Foundation."
</p>
</div>
</div>
</div>
</div> <!-- pagename != index -->
</div>
<script crossorigin="anonymous" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script src="../../_static/js/sidebar.js" type="text/javascript"></script>
<script src="../../_static/js/search.js" type="text/javascript"></script>
<script src="../../_static/js/navbar.js" type="text/javascript"></script>
<script src="../../_static/js/clipboard.min.js" type="text/javascript"></script>
<script src="../../_static/js/copycode.js" type="text/javascript"></script>
<script src="../../_static/js/page.js" type="text/javascript"></script>
<script src="../../_static/js/docversion.js" type="text/javascript"></script>
<script type="text/javascript">
$('body').ready(function () {
$('body').css('visibility', 'visible');
});
</script>
</body>
</html>