blob: 0db03f7ff01b7ef4a932a19c43558a928af2ad00 [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"/>
<title>Real-time Object Detection with MXNet On The Raspberry Pi — 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: ''
};
</script>
<script src="../../_static/jquery-1.11.1.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://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script>
<script type="text/javascript"> jQuery(function() { Search.loadIndex("/searchindex.js"); Search.init();}); </script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new
Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-96378503-1', 'auto');
ga('send', 'pageview');
</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://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> -->
<!-- -->
<link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"/>
</link></link></head>
<body role="document"><!-- Previous Navbar Layout
<div class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="../../" class="navbar-brand">
<img src="http://data.mxnet.io/theme/mxnet.png">
</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul id="navbar" class="navbar navbar-left">
<li> <a href="../../get_started/index.html">Get Started</a> </li>
<li> <a href="../../tutorials/index.html">Tutorials</a> </li>
<li> <a href="../../how_to/index.html">How To</a> </li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="true">Packages <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="../../packages/python/index.html">
Python
</a></li>
<li><a href="../../packages/r/index.html">
R
</a></li>
<li><a href="../../packages/julia/index.html">
Julia
</a></li>
<li><a href="../../packages/c++/index.html">
C++
</a></li>
<li><a href="../../packages/scala/index.html">
Scala
</a></li>
<li><a href="../../packages/perl/index.html">
Perl
</a></li>
</ul>
</li>
<li> <a href="../../system/index.html">System</a> </li>
<li>
<form class="" role="search" action="../../search.html" method="get" autocomplete="off">
<div class="form-group inner-addon left-addon">
<i class="glyphicon glyphicon-search"></i>
<input type="text" name="q" class="form-control" placeholder="Search">
</div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form> </li>
</ul>
<ul id="navbar" class="navbar navbar-right">
<li> <a href="../../index.html"><span class="flag-icon flag-icon-us"></span></a> </li>
<li> <a href="../..//zh/index.html"><span class="flag-icon flag-icon-cn"></span></a> </li>
</ul>
</div>
</div>
</div>
Previous Navbar Layout End -->
<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="http://data.mxnet.io/theme/mxnet.png"/></a>
</h1>
<nav class="nav-bar" id="main-nav">
<a class="main-nav-link" href="../../get_started/install.html">Install</a>
<a class="main-nav-link" href="../../tutorials/index.html">Tutorials</a>
<a class="main-nav-link" href="../../how_to/index.html">How To</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">API <span class="caret"></span></a>
<ul class="dropdown-menu" id="package-dropdown-menu">
<li><a class="main-nav-link" href="../../api/python/index.html">Python</a></li>
<li><a class="main-nav-link" href="../../api/scala/index.html">Scala</a></li>
<li><a class="main-nav-link" href="../../api/r/index.html">R</a></li>
<li><a class="main-nav-link" href="../../api/julia/index.html">Julia</a></li>
<li><a class="main-nav-link" href="../../api/c++/index.html">C++</a></li>
<li><a class="main-nav-link" href="../../api/perl/index.html">Perl</a></li>
</ul>
</span>
<a class="main-nav-link" href="../../architecture/index.html">Architecture</a>
<!-- <a class="main-nav-link" href="../../community/index.html">Community</a> -->
<a class="main-nav-link" href="https://github.com/dmlc/mxnet">Github</a>
<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">Versions(master)<span class="caret"></span></a><ul id="package-dropdown-menu" class="dropdown-menu"><li><a class="main-nav-link" href=http://mxnet.incubator.apache.org/test/>v0.10.14</a></li><li><a class="main-nav-link" href=http://mxnet.incubator.apache.org/test/versions/0.10/index.html>0.10</a></li><li><a class="main-nav-link" href=http://mxnet.incubator.apache.org/test/versions/master/index.html>master</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 dropdown-menu-right" id="burgerMenu">
<li><a href="../../get_started/install.html">Install</a></li>
<li><a href="../../tutorials/index.html">Tutorials</a></li>
<li><a href="../../how_to/index.html">How To</a></li>
<li class="dropdown-submenu">
<a href="#" tabindex="-1">API</a>
<ul class="dropdown-menu">
<li><a href="../../api/python/index.html" tabindex="-1">Python</a>
</li>
<li><a href="../../api/scala/index.html" tabindex="-1">Scala</a>
</li>
<li><a href="../../api/r/index.html" tabindex="-1">R</a>
</li>
<li><a href="../../api/julia/index.html" tabindex="-1">Julia</a>
</li>
<li><a href="../../api/c++/index.html" tabindex="-1">C++</a>
</li>
<li><a href="../../api/perl/index.html" tabindex="-1">Perl</a>
</li>
</ul>
</li>
<li><a href="../../architecture/index.html">Architecture</a></li>
<li><a class="main-nav-link" href="https://github.com/dmlc/mxnet">Github</a></li>
<li id="dropdown-menu-position-anchor-version-mobile" class="dropdown-submenu" style="position: relative"><a href="#" tabindex="-1">Versions(master)</a><ul class="dropdown-menu"><li><a tabindex="-1" href=http://mxnet.incubator.apache.org/test/>v0.10.14</a></li><li><a tabindex="-1" href=http://mxnet.incubator.apache.org/test/versions/0.10/index.html>0.10</a></li><li><a tabindex="-1" href=http://mxnet.incubator.apache.org/test/versions/master/index.html>master</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>
<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="../../how_to/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>
</ul>
</div>
</div>
<div class="content">
<div class="section" id="real-time-object-detection-with-mxnet-on-the-raspberry-pi">
<span id="real-time-object-detection-with-mxnet-on-the-raspberry-pi"></span><h1>Real-time Object Detection with MXNet On The Raspberry Pi<a class="headerlink" href="#real-time-object-detection-with-mxnet-on-the-raspberry-pi" title="Permalink to this headline"></a></h1>
<p>This tutorial shows developers who work with the Raspberry Pi or similar embedded ARM-based devices how to compile MXNet for those devices and run a pretrained deep network model. It also shows how to use AWS IoT to manage and monitor MXNet models running on your devices.</p>
<div class="section" id="what-s-in-this-tutorial">
<span id="what-s-in-this-tutorial"></span><h2>What’s In This Tutorial?<a class="headerlink" href="#what-s-in-this-tutorial" title="Permalink to this headline"></a></h2>
<p>This tutorial shows how to:</p>
<ol class="simple">
<li>Use MXNet to set up a real-time object classifier on a Raspberry Pi 3 device.</li>
<li>Connect the local Raspberry Pi model to the AWS Cloud with AWS IoT to get real-time updates from the device.</li>
</ol>
<div class="section" id="who-s-this-tutorial-for">
<span id="who-s-this-tutorial-for"></span><h3>Who’s This Tutorial For?<a class="headerlink" href="#who-s-this-tutorial-for" title="Permalink to this headline"></a></h3>
<p>It assumes that you are familiar with the Raspbian operating system and the <a class="reference external" href="https://www.raspberrypi.org/">Raspberry Pi ecosystem</a> and are somewhat familiar with machine learning, MXNet, and <a class="reference external" href="https://aws.amazon.com/iot/">AWS IoT</a>. All code is written in Python 2.7.</p>
</div>
<div class="section" id="how-to-use-this-tutorial">
<span id="how-to-use-this-tutorial"></span><h3>How to Use This Tutorial<a class="headerlink" href="#how-to-use-this-tutorial" title="Permalink to this headline"></a></h3>
<p>To follow this tutorial, you must set up your Pi as instructed (preferably from a fresh Raspbian install), and then create the files and run the bash commands described below. All instructions described are can be executed on the Raspberry Pi directly or via SSH.</p>
<p>You will accomplish the following:</p>
<ul class="simple">
<li>Build and Install MXNet with Python bindings on your Raspbian Based Raspberry Pi</li>
<li>Fetch and run a pre-trained MXNet model on your Pi</li>
<li>Create a real-time video analysis application for the Pi</li>
<li>Connect the application to the AWS IoT service</li>
</ul>
</div>
</div>
<div class="section" id="prerequisites">
<span id="prerequisites"></span><h2>Prerequisites<a class="headerlink" href="#prerequisites" title="Permalink to this headline"></a></h2>
<p>To complete this tutorial, you need:</p>
<ul class="simple">
<li>Raspbian Wheezy or later, which can be downloaded <a class="reference external" href="https://www.raspberrypi.org/downloads/raspbian/">here</a>, loaded onto a 8GB+ micro SD card (with at least 4GB+ free)</li>
<li>A <a class="reference external" href="https://www.raspberrypi.org/blog/raspberry-pi-3-on-sale/">Raspberry Pi 3</a> or equivalent Raspberry Pi with 1GB+ of RAM</li>
<li>A <a class="reference external" href="https://www.raspberrypi.org/products/camera-module/">Raspberry Pi Camera Module</a> <a class="reference external" href="http://www.pyimagesearch.com/2015/02/23/install-opencv-and-python-on-your-raspberry-pi-2-and-b/">activated and running with the corresponding Python module</a> (for the real-time video analysis with the deep network model)</li>
<li>An AWS account With AWS IoT enabled and the <a class="reference external" href="https://github.com/aws/aws-iot-device-sdk-python">AWS IoT Python SDK</a> (for remote, real-time managing and monitoring of the model running on the Pi)</li>
<li>The <a class="reference external" href="http://www.pyimagesearch.com/2015/02/23/install-opencv-and-python-on-your-raspberry-pi-2-and-b/">cv2 Python library</a> for the Pi</li>
</ul>
</div>
<div class="section" id="building-mxnet-for-the-pi">
<span id="building-mxnet-for-the-pi"></span><h2>Building MXNet for The Pi<a class="headerlink" href="#building-mxnet-for-the-pi" title="Permalink to this headline"></a></h2>
<p>The first step will be to get MXNet with the Python bindings running on your Raspberry Pi 3. There is a tutorial for that provided on <a class="reference external" href="http://mxnet.io/get_started/raspbian_setup.html">here</a>. In short you will have to download the dependencies, and build the full MXNet library for the Pi with the ARM specific compile flags. Be sure to build the library with open CV as we will be using a model that requires it to process images. Then you will finally the Python bindings. Once this is done you should test that works by opening a python REPL on your Pi and typing the following commands:</p>
<p>The first step is to get MXNet with the Python bindings running on your Raspberry Pi 3. There is a tutorial for that provided <a class="reference external" href="http://mxnet.io/get_started/raspbian_setup.html">here</a>. The linked tutorial walks you through downloading the dependencies, and building the full MXNet library for the Pi with the ARM specific compile flags. Be sure to build the library with open CV as we will be using a model that requires it to process images. Then you will register the Python bindings to MXNet. After this is done you should test that your installation works by opening a python REPL on your Pi and typing the following commands:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>python
>>> import mxnet as mx
</pre></div>
</div>
<p><em>Note: If you are getting memory allocation failed errors at this point (or at any point in this tutorial) it is likely because the full MXNet library takes up a large amount of RAM when loaded. You might want to kill the GUI and other processes that are occupying memory.</em></p>
</div>
<div class="section" id="running-a-pre-trained-inception-model-on-the-pi">
<span id="running-a-pre-trained-inception-model-on-the-pi"></span><h2>Running A Pre-Trained Inception Model on The Pi<a class="headerlink" href="#running-a-pre-trained-inception-model-on-the-pi" title="Permalink to this headline"></a></h2>
<p>We are now ready to load a pre-trained model and run inference on the Pi. We will be using a simple object recognition model trained on the ImageNet data set. The model is called batch normalized Inception network (or Inception_BN for short) and it is found in the MXNet model zoo.</p>
<div class="section" id="getting-the-model">
<span id="getting-the-model"></span><h3>Getting the Model<a class="headerlink" href="#getting-the-model" title="Permalink to this headline"></a></h3>
<p>The first step is to download, unzip, and set up the pre-trained deep network model files that we will be using to classify images. To do this run the following commands in your home directory:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>curl --header <span class="s1">'Host: data.mxnet.io'</span> --header <span class="s1">'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0'</span> --header <span class="s1">'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'</span> --header <span class="s1">'Accept-Language: en-US,en;q=0.5'</span> --header <span class="s1">'Referer: http://data.mxnet.io/models/imagenet/'</span> --header <span class="s1">'Connection: keep-alive'</span> <span class="s1">'http://data.mxnet.io/models/imagenet/inception-bn.tar.gz'</span> -o <span class="s1">'inception-bn.tar.gz'</span> -L
tar -xvzf inception-bn.tar.gz
mv Inception_BN-0039.params Inception_BN-0000.params
</pre></div>
</div>
</div>
<div class="section" id="running-the-model">
<span id="running-the-model"></span><h3>Running the Model<a class="headerlink" href="#running-the-model" title="Permalink to this headline"></a></h3>
<p>The next step is to create a python script to load the model, and run inference on local image files. To do this create a new file in your home directory called inception_predict.py and add the following code to it:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># inception_predict.py</span>
<span class="kn">import</span> <span class="nn">mxnet</span> <span class="kn">as</span> <span class="nn">mx</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">cv2</span><span class="o">,</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">urllib</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">namedtuple</span>
<span class="n">Batch</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s1">'Batch'</span><span class="p">,</span> <span class="p">[</span><span class="s1">'data'</span><span class="p">])</span>
<span class="c1"># Load the symbols for the networks</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'synset.txt'</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">synsets</span> <span class="o">=</span> <span class="p">[</span><span class="n">l</span><span class="o">.</span><span class="n">rstrip</span><span class="p">()</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">f</span><span class="p">]</span>
<span class="c1"># Load the network parameters</span>
<span class="n">sym</span><span class="p">,</span> <span class="n">arg_params</span><span class="p">,</span> <span class="n">aux_params</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">load_checkpoint</span><span class="p">(</span><span class="s1">'Inception_BN'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="c1"># Load the network into an MXNet module and bind the corresponding parameters</span>
<span class="n">mod</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">mod</span><span class="o">.</span><span class="n">Module</span><span class="p">(</span><span class="n">symbol</span><span class="o">=</span><span class="n">sym</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="n">mx</span><span class="o">.</span><span class="n">cpu</span><span class="p">())</span>
<span class="n">mod</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">for_training</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">data_shapes</span><span class="o">=</span><span class="p">[(</span><span class="s1">'data'</span><span class="p">,</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">224</span><span class="p">,</span><span class="mi">224</span><span class="p">))])</span>
<span class="n">mod</span><span class="o">.</span><span class="n">set_params</span><span class="p">(</span><span class="n">arg_params</span><span class="p">,</span> <span class="n">aux_params</span><span class="p">)</span>
<span class="sd">'''</span>
<span class="sd">Function to predict objects by giving the model a pointer to an image file and running a forward pass through the model.</span>
<span class="sd">inputs:</span>
<span class="sd">filename = jpeg file of image to classify objects in</span>
<span class="sd">mod = the module object representing the loaded model</span>
<span class="sd">synsets = the list of symbols representing the model</span>
<span class="sd">N = Optional parameter denoting how many predictions to return (default is top 5)</span>
<span class="sd">outputs:</span>
<span class="sd">python list of top N predicted objects and corresponding probabilities</span>
<span class="sd">'''</span>
<span class="k">def</span> <span class="nf">predict</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">mod</span><span class="p">,</span> <span class="n">synsets</span><span class="p">,</span> <span class="n">N</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
<span class="n">tic</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="n">img</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">cvtColor</span><span class="p">(</span><span class="n">cv2</span><span class="o">.</span><span class="n">imread</span><span class="p">(</span><span class="n">filename</span><span class="p">),</span> <span class="n">cv2</span><span class="o">.</span><span class="n">COLOR_BGR2RGB</span><span class="p">)</span>
<span class="k">if</span> <span class="n">img</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">None</span>
<span class="n">img</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">resize</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="p">(</span><span class="mi">224</span><span class="p">,</span> <span class="mi">224</span><span class="p">))</span>
<span class="n">img</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">swapaxes</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">img</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">swapaxes</span><span class="p">(</span><span class="n">img</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="n">img</span> <span class="o">=</span> <span class="n">img</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">,</span> <span class="p">:]</span>
<span class="k">print</span> <span class="s2">"pre-processed image in "</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span><span class="o">-</span><span class="n">tic</span><span class="p">)</span>
<span class="n">toc</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="n">mod</span><span class="o">.</span><span class="n">forward</span><span class="p">(</span><span class="n">Batch</span><span class="p">([</span><span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">img</span><span class="p">)]))</span>
<span class="n">prob</span> <span class="o">=</span> <span class="n">mod</span><span class="o">.</span><span class="n">get_outputs</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()</span>
<span class="n">prob</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">squeeze</span><span class="p">(</span><span class="n">prob</span><span class="p">)</span>
<span class="k">print</span> <span class="s2">"forward pass in "</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span><span class="o">-</span><span class="n">toc</span><span class="p">)</span>
<span class="n">topN</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="n">prob</span><span class="p">)[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="n">N</span><span class="p">]:</span>
<span class="k">print</span><span class="p">(</span><span class="s1">'probability=</span><span class="si">%f</span><span class="s1">, class=</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span><span class="p">(</span><span class="n">prob</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">synsets</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span>
<span class="n">topN</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">prob</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">synsets</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span>
<span class="k">return</span> <span class="n">topN</span>
<span class="c1"># Code to download an image from the internet and run a prediction on it</span>
<span class="k">def</span> <span class="nf">predict_from_url</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">N</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
<span class="n">filename</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"/"</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">urllib</span><span class="o">.</span><span class="n">urlretrieve</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span>
<span class="n">img</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">imread</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="k">if</span> <span class="n">img</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">print</span> <span class="s2">"Failed to download"</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">predict</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">mod</span><span class="p">,</span> <span class="n">synsets</span><span class="p">,</span> <span class="n">N</span><span class="p">)</span>
<span class="c1"># Code to predict on a local file</span>
<span class="k">def</span> <span class="nf">predict_from_local_file</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">N</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
<span class="k">return</span> <span class="n">predict</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">mod</span><span class="p">,</span> <span class="n">synsets</span><span class="p">,</span> <span class="n">N</span><span class="p">)</span>
</pre></div>
</div>
<p>Now that we have defined inception_predict.py we can test that the model is running correctly. Open a Python REPL in your home directory and enter the following:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>python
>>> import inception_predict
>>> predict_from_url<span class="o">(</span><span class="s2">"http://imgur.com/HzafyBA"</span><span class="o">)</span>
</pre></div>
</div>
<p>This should give a reasonable prediction for the fluffy cow in this <a class="reference external" href="http://imgur.com/HzafyBA">image</a>.</p>
</div>
</div>
<div class="section" id="running-an-inception-on-real-time-video-from-picamera">
<span id="running-an-inception-on-real-time-video-from-picamera"></span><h2>Running an Inception on Real-Time Video From PiCamera<a class="headerlink" href="#running-an-inception-on-real-time-video-from-picamera" title="Permalink to this headline"></a></h2>
<p>We can now move on to using this network for object detection in real-time video from the PiCamera.</p>
<p>Doing this requires sending the images that the camera is capturing to the prediction code that we created in the previous step. To do this, create a new file in your home directory called camera_test.py and add the following code to it:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># camera_test.py</span>
<span class="kn">import</span> <span class="nn">picamera</span>
<span class="kn">import</span> <span class="nn">inception_predict</span>
<span class="c1"># Create camera interface</span>
<span class="n">camera</span> <span class="o">=</span> <span class="n">picamera</span><span class="o">.</span><span class="n">PiCamera</span><span class="p">()</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
<span class="c1"># Take the jpg image from camera</span>
<span class="k">print</span> <span class="s2">"Capturing"</span>
<span class="n">filename</span> <span class="o">=</span> <span class="s1">'/home/pi/cap.jpg'</span>
<span class="c1"># Show quick preview of what's being captured</span>
<span class="n">camera</span><span class="o">.</span><span class="n">start_preview</span><span class="p">()</span>
<span class="n">camera</span><span class="o">.</span><span class="n">capture</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="n">camera</span><span class="o">.</span><span class="n">stop_preview</span><span class="p">()</span>
<span class="c1"># Run inception prediction on image</span>
<span class="k">print</span> <span class="s2">"Predicting"</span>
<span class="n">topn</span> <span class="o">=</span> <span class="n">inception_predict</span><span class="o">.</span><span class="n">predict_from_local_file</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">N</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
<span class="c1"># Print the top N most likely objects in image (default set to 5, change this in the function call above)</span>
<span class="k">print</span> <span class="n">topn</span>
</pre></div>
</div>
<p>You can then run this file by entering the following command:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>python camera_test.py
</pre></div>
</div>
<p>If camera_test.py is working you should see a preview every few seconds of the image that is being captured and fed to the model, as well as predicted classes for objects in the image being written to the terminal.</p>
<p>Try pointing the PiCamera at a few different objects and see what predictions the network comes out with.</p>
</div>
<div class="section" id="connecting-our-model-to-the-aws-cloud">
<span id="connecting-our-model-to-the-aws-cloud"></span><h2>Connecting Our Model To The AWS Cloud<a class="headerlink" href="#connecting-our-model-to-the-aws-cloud" title="Permalink to this headline"></a></h2>
<p>We can now move on to adding the code to send the predictions that this real-time model is making locally to the AWS cloud if certain conditions are met.</p>
<p>The first step is to set up an AWS account if you don’t have one yet. Then go to the <a class="reference external" href="https://us-west-2.console.aws.amazon.com/iotv2/home?region=us-west-2#/thinghub">AWS IoT dashboard</a> and register a new device.</p>
<p>After the device is registered, download and copy the corresponding rootCA, Certificate, and Private key to your home directory. Note the unique endpoint of your device shadow on the AWS IoT Dashboard.</p>
<p>We will now build an application, based off the code in camera_test.py, which will send a message to the cloud whenever a wine bottle is detected in a frame by the PiCamera.</p>
<p>To do this create a new file in your home directory called wine_alerter.py and add the following code to it:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># wine_alerter.py</span>
<span class="kn">import</span> <span class="nn">AWSIoTPythonSDK</span>
<span class="kn">from</span> <span class="nn">AWSIoTPythonSDK.MQTTLib</span> <span class="kn">import</span> <span class="n">AWSIoTMQTTClient</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">getopt</span>
<span class="kn">import</span> <span class="nn">picamera</span>
<span class="kn">import</span> <span class="nn">inception_predict</span>
<span class="c1"># Custom MQTT message callback</span>
<span class="k">def</span> <span class="nf">customCallback</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">userdata</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"Received a new message: "</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"from topic: "</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">topic</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"--------------</span><span class="se">\n\n</span><span class="s2">"</span><span class="p">)</span>
<span class="c1"># Usage</span>
<span class="n">usageInfo</span> <span class="o">=</span> <span class="s2">"""Usage:</span>
<span class="s2"> </span>
<span class="s2">Use certificate based mutual authentication:</span>
<span class="s2">python wine_alerter.py -e <endpoint> -r <rootCAFilePath> -c <certFilePath> -k <privateKeyFilePath></span>
<span class="s2"> </span>
<span class="s2">Use MQTT over WebSocket:</span>
<span class="s2">python wine_alerter.py -e <endpoint> -r <rootCAFilePath> -w</span>
<span class="s2"> </span>
<span class="s2">Type "python wine_alerter.py -h" for available options.</span>
<span class="s2">"""</span>
<span class="c1"># Help info</span>
<span class="n">helpInfo</span> <span class="o">=</span> <span class="s2">"""-e, --endpoint</span>
<span class="s2"> Your AWS IoT custom endpoint</span>
<span class="s2">-r, --rootCA</span>
<span class="s2"> Root CA file path</span>
<span class="s2">-c, --cert</span>
<span class="s2"> Certificate file path</span>
<span class="s2">-k, --key</span>
<span class="s2"> Private key file path</span>
<span class="s2">-w, --websocket</span>
<span class="s2"> Use MQTT over WebSocket</span>
<span class="s2">-h, --help</span>
<span class="s2"> Help information</span>
<span class="s2">"""</span>
<span class="c1"># Read in command-line parameters</span>
<span class="n">useWebsocket</span> <span class="o">=</span> <span class="bp">False</span>
<span class="n">host</span> <span class="o">=</span> <span class="s2">""</span>
<span class="n">rootCAPath</span> <span class="o">=</span> <span class="s2">""</span>
<span class="n">certificatePath</span> <span class="o">=</span> <span class="s2">""</span>
<span class="n">privateKeyPath</span> <span class="o">=</span> <span class="s2">""</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">opts</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="n">getopt</span><span class="o">.</span><span class="n">getopt</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:],</span> <span class="s2">"hwe:k:c:r:"</span><span class="p">,</span> <span class="p">[</span><span class="s2">"help"</span><span class="p">,</span> <span class="s2">"endpoint="</span><span class="p">,</span> <span class="s2">"key="</span><span class="p">,</span><span class="s2">"cert="</span><span class="p">,</span><span class="s2">"rootCA="</span><span class="p">,</span> <span class="s2">"websocket"</span><span class="p">])</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">opts</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">getopt</span><span class="o">.</span><span class="n">GetoptError</span><span class="p">(</span><span class="s2">"No input parameters!"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">opt</span><span class="p">,</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">opts</span><span class="p">:</span>
<span class="k">if</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"-h"</span><span class="p">,</span> <span class="s2">"--help"</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="n">helpInfo</span><span class="p">)</span>
<span class="nb">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="k">if</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"-e"</span><span class="p">,</span> <span class="s2">"--endpoint"</span><span class="p">):</span>
<span class="n">host</span> <span class="o">=</span> <span class="n">arg</span>
<span class="k">if</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"-r"</span><span class="p">,</span> <span class="s2">"--rootCA"</span><span class="p">):</span>
<span class="n">rootCAPath</span> <span class="o">=</span> <span class="n">arg</span>
<span class="k">if</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"-c"</span><span class="p">,</span> <span class="s2">"--cert"</span><span class="p">):</span>
<span class="n">certificatePath</span> <span class="o">=</span> <span class="n">arg</span>
<span class="k">if</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"-k"</span><span class="p">,</span> <span class="s2">"--key"</span><span class="p">):</span>
<span class="n">privateKeyPath</span> <span class="o">=</span> <span class="n">arg</span>
<span class="k">if</span> <span class="n">opt</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"-w"</span><span class="p">,</span> <span class="s2">"--websocket"</span><span class="p">):</span>
<span class="n">useWebsocket</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">except</span> <span class="n">getopt</span><span class="o">.</span><span class="n">GetoptError</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">usageInfo</span><span class="p">)</span>
<span class="nb">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="c1"># Missing configuration notification</span>
<span class="n">missingConfiguration</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">host</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"Missing '-e' or '--endpoint'"</span><span class="p">)</span>
<span class="n">missingConfiguration</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">rootCAPath</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"Missing '-r' or '--rootCA'"</span><span class="p">)</span>
<span class="n">missingConfiguration</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">useWebsocket</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">certificatePath</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"Missing '-c' or '--cert'"</span><span class="p">)</span>
<span class="n">missingConfiguration</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">privateKeyPath</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"Missing '-k' or '--key'"</span><span class="p">)</span>
<span class="n">missingConfiguration</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">if</span> <span class="n">missingConfiguration</span><span class="p">:</span>
<span class="nb">exit</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># Configure logging</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s2">"AWSIoTPythonSDK.core"</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">)</span>
<span class="n">streamHandler</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">StreamHandler</span><span class="p">()</span>
<span class="n">formatter</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">Formatter</span><span class="p">(</span><span class="s1">'</span><span class="si">%(asctime)s</span><span class="s1"> - </span><span class="si">%(name)s</span><span class="s1"> - </span><span class="si">%(levelname)s</span><span class="s1"> - </span><span class="si">%(message)s</span><span class="s1">'</span><span class="p">)</span>
<span class="n">streamHandler</span><span class="o">.</span><span class="n">setFormatter</span><span class="p">(</span><span class="n">formatter</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">streamHandler</span><span class="p">)</span>
<span class="c1"># Init AWSIoTMQTTClient For Publish/Subscribe Communication With Server</span>
<span class="n">myAWSIoTMQTTClient</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">if</span> <span class="n">useWebsocket</span><span class="p">:</span>
<span class="n">myAWSIoTMQTTClient</span> <span class="o">=</span> <span class="n">AWSIoTMQTTClient</span><span class="p">(</span><span class="s2">"basicPubSub"</span><span class="p">,</span> <span class="n">useWebsocket</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">myAWSIoTMQTTClient</span><span class="o">.</span><span class="n">configureEndpoint</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="mi">443</span><span class="p">)</span>
<span class="n">myAWSIoTMQTTClient</span><span class="o">.</span><span class="n">configureCredentials</span><span class="p">(</span><span class="n">rootCAPath</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">myAWSIoTMQTTClient</span> <span class="o">=</span> <span class="n">AWSIoTMQTTClient</span><span class="p">(</span><span class="s2">"basicPubSub"</span><span class="p">)</span>
<span class="n">myAWSIoTMQTTClient</span><span class="o">.</span><span class="n">configureEndpoint</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="mi">8883</span><span class="p">)</span>
<span class="n">myAWSIoTMQTTClient</span><span class="o">.</span><span class="n">configureCredentials</span><span class="p">(</span><span class="n">rootCAPath</span><span class="p">,</span> <span class="n">privateKeyPath</span><span class="p">,</span> <span class="n">certificatePath</span><span class="p">)</span>
<span class="c1"># AWSIoTMQTTClient connection configuration</span>
<span class="n">myAWSIoTMQTTClient</span><span class="o">.</span><span class="n">configureAutoReconnectBackoffTime</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
<span class="n">myAWSIoTMQTTClient</span><span class="o">.</span><span class="n">configureOfflinePublishQueueing</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># Infinite offline Publish queueing</span>
<span class="n">myAWSIoTMQTTClient</span><span class="o">.</span><span class="n">configureDrainingFrequency</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1"># Draining: 2 Hz</span>
<span class="n">myAWSIoTMQTTClient</span><span class="o">.</span><span class="n">configureConnectDisconnectTimeout</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="c1"># 10 sec</span>
<span class="n">myAWSIoTMQTTClient</span><span class="o">.</span><span class="n">configureMQTTOperationTimeout</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="c1"># 5 sec</span>
<span class="c1"># Connect and subscribe to AWS IoT</span>
<span class="n">myAWSIoTMQTTClient</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
<span class="n">myAWSIoTMQTTClient</span><span class="o">.</span><span class="n">subscribe</span><span class="p">(</span><span class="s2">"sdk/test/Python"</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">customCallback</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># Start the Camera and tell the Server we are alive</span>
<span class="k">print</span> <span class="s2">"Running camera"</span>
<span class="n">myAWSIoTMQTTClient</span><span class="o">.</span><span class="n">publish</span><span class="p">(</span><span class="s2">"sdk/test/Python"</span><span class="p">,</span> <span class="s2">"New Message: Starting Camera"</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">camera</span> <span class="o">=</span> <span class="n">picamera</span><span class="o">.</span><span class="n">PiCamera</span><span class="p">()</span>
<span class="c1"># Capture forever (this is a modified version of camera_test.py)</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
<span class="n">filename</span> <span class="o">=</span> <span class="s1">'/home/pi/cap.jpg'</span>
<span class="n">camera</span><span class="o">.</span><span class="n">start_preview</span><span class="p">()</span>
<span class="n">camera</span><span class="o">.</span><span class="n">capture</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="n">camera</span><span class="o">.</span><span class="n">stop_preview</span><span class="p">()</span>
<span class="n">topn</span> <span class="o">=</span> <span class="n">inception_predict</span><span class="o">.</span><span class="n">predict_from_local_file</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">N</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
<span class="c1"># Check if either of the top two predictions are wine related and publish a message if it is</span>
<span class="c1"># you can change 'wine' here to anything you want to alert the server about detecting</span>
<span class="k">if</span> <span class="s1">'wine'</span> <span class="ow">in</span> <span class="n">topn</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="ow">or</span> <span class="s1">'wine'</span> <span class="ow">in</span> <span class="n">topn</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]:</span>
<span class="n">myAWSIoTMQTTClient</span><span class="o">.</span><span class="n">publish</span><span class="p">(</span><span class="s2">"sdk/test/Python"</span><span class="p">,</span> <span class="s2">"New Message: WINE DETECTED!"</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</pre></div>
</div>
<p>You can then run this file by entering the following command</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>python wine_alerter.py -e <endpointURL> -r <rootCAFilePath> -c <certFilePath> -k <privateKeyFilePath>
</pre></div>
</div>
<p>If this is working you should see the same kind of image preview you did with camera_test.py every few seconds, however the console will only print a message now when a wine bottle is detected in the shot (you can edit the bottom lines in the wine_alerter.py code to make this alert for any object label from the <a class="reference external" href="http://image-net.org/index">ImageNet-11k dataset</a> that you specify).</p>
<p>You can open up the activity tab for the thing that you registered on the AWS IoT Dashboard and see the corresponding messages pushed to the server whenever a wine bottle is detected in a camera shot. Even if network connectivity periodically fails, AWS IoT will push updates out to the server when possible, allowing this system to reliably let you know when there is wine around.</p>
</div>
<div class="section" id="summary">
<span id="summary"></span><h2>Summary<a class="headerlink" href="#summary" title="Permalink to this headline"></a></h2>
<p>You now have a Raspberry Pi running a pre-trained MXNet model fully locally. This model is also linked to the cloud via AWS IoT and can reliably alert AWS whenever it sees a wine bottle.</p>
<p>You can now extend this demo to create more interesting applications, such as using AWS IoT to push model updates to your Pi, loading different pre-trained models from the MXNet Model Zoo onto the Pi, or even training full end-to-end models on the Pi.</p>
</div>
</div>
<div class="container">
<div class="footer">
<p> © 2015-2017 DMLC. All rights reserved. </p>
</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="#">Real-time Object Detection with MXNet On The Raspberry Pi</a><ul>
<li><a class="reference internal" href="#what-s-in-this-tutorial">What’s In This Tutorial?</a><ul>
<li><a class="reference internal" href="#who-s-this-tutorial-for">Who’s This Tutorial For?</a></li>
<li><a class="reference internal" href="#how-to-use-this-tutorial">How to Use This Tutorial</a></li>
</ul>
</li>
<li><a class="reference internal" href="#prerequisites">Prerequisites</a></li>
<li><a class="reference internal" href="#building-mxnet-for-the-pi">Building MXNet for The Pi</a></li>
<li><a class="reference internal" href="#running-a-pre-trained-inception-model-on-the-pi">Running A Pre-Trained Inception Model on The Pi</a><ul>
<li><a class="reference internal" href="#getting-the-model">Getting the Model</a></li>
<li><a class="reference internal" href="#running-the-model">Running the Model</a></li>
</ul>
</li>
<li><a class="reference internal" href="#running-an-inception-on-real-time-video-from-picamera">Running an Inception on Real-Time Video From PiCamera</a></li>
<li><a class="reference internal" href="#connecting-our-model-to-the-aws-cloud">Connecting Our Model To The AWS Cloud</a></li>
<li><a class="reference internal" href="#summary">Summary</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div> <!-- pagename != index -->
<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 type="text/javascript">
$('body').ready(function () {
$('body').css('visibility', 'visible');
});
</script>
</div></body>
</html>