| <!--- |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| --> |
| --- |
| layout: page |
| --- |
| <div class="row"> |
| <div class="col-3 docs-side-bar"> |
| |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| |
| |
| |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| |
| <!-- resource-p --> |
| <!-- page --> |
| </ul> |
| </div> |
| <div class="col-9"> |
| <!--- Licensed to the Apache Software Foundation (ASF) under one --> |
| <!--- or more contributor license agreements. See the NOTICE file --> |
| <!--- distributed with this work for additional information --> |
| <!--- regarding copyright ownership. The ASF licenses this file --> |
| <!--- to you under the Apache License, Version 2.0 (the --> |
| <!--- "License"); you may not use this file except in compliance --> |
| <!--- with the License. You may obtain a copy of the License at --> |
| |
| <!--- http://www.apache.org/licenses/LICENSE-2.0 --> |
| |
| <!--- Unless required by applicable law or agreed to in writing, --> |
| <!--- software distributed under the License is distributed on an --> |
| <!--- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY --> |
| <!--- KIND, either express or implied. See the License for the --> |
| <!--- specific language governing permissions and limitations --> |
| <!--- under the License. --> |
| |
| <h1 id="multi-object-detection-using-pre-trained-ssd-model-via-java-inference-apis">Multi Object Detection using pre-trained SSD Model via Java Inference APIs</h1> |
| |
| <p>This tutorial shows how to use MXNet Java Inference APIs to run inference on a pre-trained Single Shot Detector (SSD) Model.</p> |
| |
| <p>The SSD model is trained on the Pascal VOC 2012 dataset. The network is a SSD model built on Resnet50 as the base network to extract image features. The model is trained to detect the following entities (classes): [‘aeroplane’, ‘bicycle’, ‘bird’, ‘boat’, ‘bottle’, ‘bus’, ‘car’, ‘cat’, ‘chair’, ‘cow’, ‘diningtable’, ‘dog’, ‘horse’, ‘motorbike’, ‘person’, ‘pottedplant’, ‘sheep’, ‘sofa’, ‘train’, ‘tvmonitor’]. For more details about the model, you can refer to the <a href="https://github.com/apache/incubator-mxnet/tree/master/example/ssd">MXNet SSD example</a>.</p> |
| |
| <h2 id="prerequisites">Prerequisites</h2> |
| |
| <p>To complete this tutorial, you need the following:</p> |
| <ul> |
| <li><a href="mxnet_java_on_intellij">MXNet Java Setup on IntelliJ IDEA</a> (Optional)</li> |
| <li><a href="https://www.gnu.org/software/wget/">wget</a> To download model artifacts</li> |
| <li>SSD Model artifacts |
| <ul> |
| <li>Use the following script to get the SSD Model files : |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">data_path</span><span class="o">=</span>/tmp/resnet50_ssd |
| <span class="nb">mkdir</span> <span class="nt">-p</span> <span class="s2">"</span><span class="nv">$data_path</span><span class="s2">"</span> |
| wget https://s3.amazonaws.com/model-server/models/resnet50_ssd/resnet50_ssd_model-symbol.json <span class="nt">-P</span> <span class="nv">$data_path</span> |
| wget https://s3.amazonaws.com/model-server/models/resnet50_ssd/resnet50_ssd_model-0000.params <span class="nt">-P</span> <span class="nv">$data_path</span> |
| wget https://s3.amazonaws.com/model-server/models/resnet50_ssd/synset.txt <span class="nt">-P</span> <span class="nv">$data_path</span> |
| </code></pre></div> </div> |
| </li> |
| </ul> |
| </li> |
| <li>Test images : A few sample images to run inference on. |
| <ul> |
| <li>Use the following script to download sample images : |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">image_path</span><span class="o">=</span>/tmp/resnet50_ssd/images |
| <span class="nb">mkdir</span> <span class="nt">-p</span> <span class="s2">"</span><span class="nv">$image_path</span><span class="s2">"</span> |
| <span class="nb">cd</span> <span class="nv">$image_path</span> |
| wget https://cloud.githubusercontent.com/assets/3307514/20012567/cbb60336-a27d-11e6-93ff-cbc3f09f5c9e.jpg <span class="nt">-O</span> dog.jpg |
| wget https://cloud.githubusercontent.com/assets/3307514/20012563/cbb41382-a27d-11e6-92a9-18dab4fd1ad3.jpg <span class="nt">-O</span> person.jpg |
| </code></pre></div> </div> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| |
| <p>Alternately, you can get the entire SSD Model artifacts + images in one single script from the MXNet Repository by running <a href="https://github.com/apache/incubator-mxnet/blob/master/scala-package/examples/scripts/infer/objectdetector/get_ssd_data.sh">get_ssd_data.sh script</a></p> |
| |
| <h2 id="time-to-code">Time to code!</h2> |
| <p>1. Following the <a href="mxnet_java_on_intellij">MXNet Java Setup on IntelliJ IDEA</a> tutorial, in the same project <code class="highlighter-rouge">JavaMXNet</code>, create a new empty class called : <code class="highlighter-rouge">ObjectDetectionTutorial.java</code>.</p> |
| |
| <p>2. In the <code class="highlighter-rouge">main</code> function of <code class="highlighter-rouge">ObjectDetectionTutorial.java</code> define the downloaded model path and the image data paths. This is the same path where we downloaded the model artifacts and images in a previous step.</p> |
| |
| <div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">String</span> <span class="n">modelPathPrefix</span> <span class="o">=</span> <span class="s">"/tmp/resnet50_ssd/resnet50_ssd_model"</span><span class="o">;</span> |
| <span class="nc">String</span> <span class="n">inputImagePath</span> <span class="o">=</span> <span class="s">"/tmp/resnet50_ssd/images/dog.jpg"</span><span class="o">;</span> |
| </code></pre></div></div> |
| |
| <p>3. We can run the inference code in this example on either CPU or GPU (if you have a GPU backed machine) by choosing the appropriate context.</p> |
| |
| <div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> |
| <span class="nc">List</span><span class="o"><</span><span class="nc">Context</span><span class="o">></span> <span class="n">context</span> <span class="o">=</span> <span class="n">getContext</span><span class="o">();</span> |
| <span class="o">...</span> |
| |
| <span class="kd">private</span> <span class="kd">static</span> <span class="nc">List</span><span class="o"><</span><span class="nc">Context</span><span class="o">></span> <span class="nf">getContext</span><span class="o">()</span> <span class="o">{</span> |
| <span class="nc">List</span><span class="o"><</span><span class="nc">Context</span><span class="o">></span> <span class="n">ctx</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o"><>();</span> |
| <span class="n">ctx</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="nc">Context</span><span class="o">.</span><span class="na">cpu</span><span class="o">());</span> <span class="c1">// Choosing CPU Context here</span> |
| |
| <span class="k">return</span> <span class="n">ctx</span><span class="o">;</span> |
| <span class="o">}</span> |
| </code></pre></div></div> |
| |
| <p>4. To provide an input to the model, define the input shape to the model and the Input Data Descriptor (DataDesc) as shown below :</p> |
| |
| <div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">Shape</span> <span class="n">inputShape</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Shape</span><span class="o">(</span><span class="k">new</span> <span class="kt">int</span><span class="o">[]</span> <span class="o">{</span><span class="mi">1</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">512</span><span class="o">,</span> <span class="mi">512</span><span class="o">});</span> |
| <span class="nc">List</span><span class="o"><</span><span class="nc">DataDesc</span><span class="o">></span> <span class="n">inputDescriptors</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o"><</span><span class="nc">DataDesc</span><span class="o">>();</span> |
| <span class="n">inputDescriptors</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="nc">DataDesc</span><span class="o">(</span><span class="s">"data"</span><span class="o">,</span> <span class="n">inputShape</span><span class="o">,</span> <span class="nc">DType</span><span class="o">.</span><span class="na">Float32</span><span class="o">(),</span> <span class="s">"NCHW"</span><span class="o">));</span> |
| </code></pre></div></div> |
| |
| <p>The input shape can be interpreted as follows : The input has a batch size of 1, with 3 RGB channels in the image, and the height and width of the image is 512 each.</p> |
| |
| <p>5. To run an actual inference on the given image, add the following lines to the <code class="highlighter-rouge">ObjectDetectionTutorial.java</code> class :</p> |
| |
| <div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">BufferedImage</span> <span class="n">img</span> <span class="o">=</span> <span class="nc">ObjectDetector</span><span class="o">.</span><span class="na">loadImageFromFile</span><span class="o">(</span><span class="n">inputImagePath</span><span class="o">);</span> |
| <span class="nc">ObjectDetector</span> <span class="n">objDet</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ObjectDetector</span><span class="o">(</span><span class="n">modelPathPrefix</span><span class="o">,</span> <span class="n">inputDescriptors</span><span class="o">,</span> <span class="n">context</span><span class="o">,</span> <span class="mi">0</span><span class="o">);</span> |
| <span class="nc">List</span><span class="o"><</span><span class="nc">List</span><span class="o"><</span><span class="nc">ObjectDetectorOutput</span><span class="o">>></span> <span class="n">output</span> <span class="o">=</span> <span class="n">objDet</span><span class="o">.</span><span class="na">imageObjectDetect</span><span class="o">(</span><span class="n">img</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span> <span class="c1">// Top 3 objects detected will be returned</span> |
| </code></pre></div></div> |
| |
| <p>6. Let’s piece all of the above steps together by showing the final contents of the <code class="highlighter-rouge">ObjectDetectionTutorial.java</code>.</p> |
| |
| <div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">package</span> <span class="nn">mxnet</span><span class="o">;</span> |
| |
| <span class="kn">import</span> <span class="nn">org.apache.mxnet.infer.javaapi.ObjectDetector</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.apache.mxnet.infer.javaapi.ObjectDetectorOutput</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.apache.mxnet.javaapi.Context</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.apache.mxnet.javaapi.DType</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.apache.mxnet.javaapi.DataDesc</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.apache.mxnet.javaapi.Shape</span><span class="o">;</span> |
| |
| <span class="kn">import</span> <span class="nn">java.awt.image.BufferedImage</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">java.util.ArrayList</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">java.util.Arrays</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span> |
| |
| <span class="kd">public</span> <span class="kd">class</span> <span class="nc">ObjectDetectionTutorial</span> <span class="o">{</span> |
| |
| <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span> |
| |
| <span class="nc">String</span> <span class="n">modelPathPrefix</span> <span class="o">=</span> <span class="s">"/tmp/resnet50_ssd/resnet50_ssd_model"</span><span class="o">;</span> |
| |
| <span class="nc">String</span> <span class="n">inputImagePath</span> <span class="o">=</span> <span class="s">"/tmp/resnet50_ssd/images/dog.jpg"</span><span class="o">;</span> |
| |
| <span class="nc">List</span><span class="o"><</span><span class="nc">Context</span><span class="o">></span> <span class="n">context</span> <span class="o">=</span> <span class="n">getContext</span><span class="o">();</span> |
| |
| <span class="nc">Shape</span> <span class="n">inputShape</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Shape</span><span class="o">(</span><span class="k">new</span> <span class="kt">int</span><span class="o">[]</span> <span class="o">{</span><span class="mi">1</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">512</span><span class="o">,</span> <span class="mi">512</span><span class="o">});</span> |
| |
| <span class="nc">List</span><span class="o"><</span><span class="nc">DataDesc</span><span class="o">></span> <span class="n">inputDescriptors</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o"><</span><span class="nc">DataDesc</span><span class="o">>();</span> |
| <span class="n">inputDescriptors</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="nc">DataDesc</span><span class="o">(</span><span class="s">"data"</span><span class="o">,</span> <span class="n">inputShape</span><span class="o">,</span> <span class="nc">DType</span><span class="o">.</span><span class="na">Float32</span><span class="o">(),</span> <span class="s">"NCHW"</span><span class="o">));</span> |
| |
| <span class="nc">BufferedImage</span> <span class="n">img</span> <span class="o">=</span> <span class="nc">ObjectDetector</span><span class="o">.</span><span class="na">loadImageFromFile</span><span class="o">(</span><span class="n">inputImagePath</span><span class="o">);</span> |
| <span class="nc">ObjectDetector</span> <span class="n">objDet</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ObjectDetector</span><span class="o">(</span><span class="n">modelPathPrefix</span><span class="o">,</span> <span class="n">inputDescriptors</span><span class="o">,</span> <span class="n">context</span><span class="o">,</span> <span class="mi">0</span><span class="o">);</span> |
| <span class="nc">List</span><span class="o"><</span><span class="nc">List</span><span class="o"><</span><span class="nc">ObjectDetectorOutput</span><span class="o">>></span> <span class="n">output</span> <span class="o">=</span> <span class="n">objDet</span><span class="o">.</span><span class="na">imageObjectDetect</span><span class="o">(</span><span class="n">img</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span> |
| |
| <span class="n">printOutput</span><span class="o">(</span><span class="n">output</span><span class="o">,</span> <span class="n">inputShape</span><span class="o">);</span> |
| <span class="o">}</span> |
| |
| |
| <span class="kd">private</span> <span class="kd">static</span> <span class="nc">List</span><span class="o"><</span><span class="nc">Context</span><span class="o">></span> <span class="nf">getContext</span><span class="o">()</span> <span class="o">{</span> |
| <span class="nc">List</span><span class="o"><</span><span class="nc">Context</span><span class="o">></span> <span class="n">ctx</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o"><>();</span> |
| <span class="n">ctx</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="nc">Context</span><span class="o">.</span><span class="na">cpu</span><span class="o">());</span> |
| |
| <span class="k">return</span> <span class="n">ctx</span><span class="o">;</span> |
| <span class="o">}</span> |
| |
| <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">printOutput</span><span class="o">(</span><span class="nc">List</span><span class="o"><</span><span class="nc">List</span><span class="o"><</span><span class="nc">ObjectDetectorOutput</span><span class="o">>></span> <span class="n">output</span><span class="o">,</span> <span class="nc">Shape</span> <span class="n">inputShape</span><span class="o">)</span> <span class="o">{</span> |
| |
| <span class="nc">StringBuilder</span> <span class="n">outputStr</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">StringBuilder</span><span class="o">();</span> |
| |
| <span class="kt">int</span> <span class="n">width</span> <span class="o">=</span> <span class="n">inputShape</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">3</span><span class="o">);</span> |
| <span class="kt">int</span> <span class="n">height</span> <span class="o">=</span> <span class="n">inputShape</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">2</span><span class="o">);</span> |
| |
| <span class="k">for</span> <span class="o">(</span><span class="nc">List</span><span class="o"><</span><span class="nc">ObjectDetectorOutput</span><span class="o">></span> <span class="n">ele</span> <span class="o">:</span> <span class="n">output</span><span class="o">)</span> <span class="o">{</span> |
| <span class="k">for</span> <span class="o">(</span><span class="nc">ObjectDetectorOutput</span> <span class="n">i</span> <span class="o">:</span> <span class="n">ele</span><span class="o">)</span> <span class="o">{</span> |
| <span class="n">outputStr</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="s">"Class: "</span> <span class="o">+</span> <span class="n">i</span><span class="o">.</span><span class="na">getClassName</span><span class="o">()</span> <span class="o">+</span> <span class="s">"\n"</span><span class="o">);</span> |
| <span class="n">outputStr</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="s">"Probabilties: "</span> <span class="o">+</span> <span class="n">i</span><span class="o">.</span><span class="na">getProbability</span><span class="o">()</span> <span class="o">+</span> <span class="s">"\n"</span><span class="o">);</span> |
| |
| <span class="nc">List</span><span class="o"><</span><span class="nc">Float</span><span class="o">></span> <span class="n">coord</span> <span class="o">=</span> <span class="nc">Arrays</span><span class="o">.</span><span class="na">asList</span><span class="o">(</span><span class="n">i</span><span class="o">.</span><span class="na">getXMin</span><span class="o">()</span> <span class="o">*</span> <span class="n">width</span><span class="o">,</span> |
| <span class="n">i</span><span class="o">.</span><span class="na">getXMax</span><span class="o">()</span> <span class="o">*</span> <span class="n">height</span><span class="o">,</span> <span class="n">i</span><span class="o">.</span><span class="na">getYMin</span><span class="o">()</span> <span class="o">*</span> <span class="n">width</span><span class="o">,</span> <span class="n">i</span><span class="o">.</span><span class="na">getYMax</span><span class="o">()</span> <span class="o">*</span> <span class="n">height</span><span class="o">);</span> |
| <span class="nc">StringBuilder</span> <span class="n">sb</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">StringBuilder</span><span class="o">();</span> |
| <span class="k">for</span> <span class="o">(</span><span class="kt">float</span> <span class="nl">c:</span> <span class="n">coord</span><span class="o">)</span> <span class="o">{</span> |
| <span class="n">sb</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="s">", "</span><span class="o">).</span><span class="na">append</span><span class="o">(</span><span class="n">c</span><span class="o">);</span> |
| <span class="o">}</span> |
| <span class="n">outputStr</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="s">"Coord:"</span> <span class="o">+</span> <span class="n">sb</span><span class="o">.</span><span class="na">substring</span><span class="o">(</span><span class="mi">2</span><span class="o">)+</span> <span class="s">"\n"</span><span class="o">);</span> |
| <span class="o">}</span> |
| <span class="o">}</span> |
| <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">outputStr</span><span class="o">);</span> |
| |
| <span class="o">}</span> |
| <span class="o">}</span> |
| </code></pre></div></div> |
| |
| <p>7. To compile and run this code, change directories to this project’s root folder, then run the following:</p> |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mvn clean <span class="nb">install </span>dependency:copy-dependencies |
| </code></pre></div></div> |
| |
| <p>The build generates a new jar file in the <code class="highlighter-rouge">target</code> folder called <code class="highlighter-rouge">javaMXNet-1.0-SNAPSHOT.jar</code>.</p> |
| |
| <p>To run the ObjectDetectionTutorial.java use the following command from the project’s root folder.</p> |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>java <span class="nt">-cp</span> <span class="s2">"target/javaMXNet-1.0-SNAPSHOT.jar:target/dependency/*"</span> mxnet.ObjectDetectionTutorial |
| </code></pre></div></div> |
| |
| <p>You should see a similar output being generated for the dog image that we used:</p> |
| <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Class: car |
| Probabilties: 0.99847263 |
| Coord:312.21335, 72.02908, 456.01443, 150.66176 |
| Class: bicycle |
| Probabilties: 0.9047381 |
| Coord:155.9581, 149.96365, 383.83694, 418.94516 |
| Class: dog |
| Probabilties: 0.82268167 |
| Coord:83.82356, 179.14001, 206.63783, 476.78754 |
| </code></pre></div></div> |
| |
| <p><img src="https://cloud.githubusercontent.com/assets/3307514/20012567/cbb60336-a27d-11e6-93ff-cbc3f09f5c9e.jpg" alt="dog_1" /></p> |
| |
| <p>The results returned by the inference call translate into the regions in the image where the model detected objects.</p> |
| |
| <p><img src="https://cloud.githubusercontent.com/assets/3307514/19171063/91ec2792-8be0-11e6-983c-773bd6868fa8.png" alt="dog_2" /></p> |
| |
| <h2 id="next-steps">Next Steps</h2> |
| <p>For more information about MXNet Java resources, see the following:</p> |
| |
| <ul> |
| <li><a href="/versions/master/api/java">Java Inference API</a></li> |
| <li><a href="https://github.com/apache/incubator-mxnet/tree/master/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/infer">Java Inference Examples</a></li> |
| <li><a href="/versions/master/api">MXNet Tutorials Index</a></li> |
| </ul> |
| </div> |
| </div> |