aboutsummaryrefslogtreecommitdiff
path: root/21.02/python_2pyarmnn_2_r_e_a_d_m_e_8md_source.xhtml
blob: 63fa754bdcd5ae7cf92174d6a269390356df37b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<!-- Copyright (c) 2020 ARM Limited. -->
<!--                                 -->
<!-- SPDX-License-Identifier: MIT    -->
<!--                                 -->
<!-- HTML header for doxygen 1.8.13-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="robots" content="NOINDEX, NOFOLLOW" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>ArmNN: python/pyarmnn/README.md Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
</script><script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="stylesheet.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <img alt="ArmNN" src="Arm_NN_horizontal_blue.png" style="max-width: 10rem; margin-top: .5rem; margin-left 10px"/>
  <td style="padding-left: 0.5em;">
   <div id="projectname">
   &#160;<span id="projectnumber">21.02</span>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('python_2pyarmnn_2_r_e_a_d_m_e_8md.xhtml','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">python/pyarmnn/README.md</div>  </div>
</div><!--header-->
<div class="contents">
<a href="python_2pyarmnn_2_r_e_a_d_m_e_8md.xhtml">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;# PyArmNN</div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;</div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;PyArmNN is a python extension for [Arm NN SDK](https://developer.arm.com/ip-products/processors/machine-learning/arm-nn).</div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;PyArmNN provides interface similar to Arm NN C++ Api.</div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;Before you proceed with the project setup, you will need to checkout and build a corresponding Arm NN version.</div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;PyArmNN is built around public headers from the armnn/include folder of Arm NN. PyArmNN does not implement any computation kernels itself, all operations are</div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;delegated to the Arm NN library.</div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;</div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;The [SWIG](http://www.swig.org/) project is used to generate the Arm NN python shadow classes and C wrapper.</div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;</div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;The following diagram shows the conceptual architecture of this library:</div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;![PyArmNN](./images/pyarmnn.png)</div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;</div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;# Setup development environment</div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;Before, proceeding to the next steps, make sure that:</div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;</div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;1. You have Python 3.6+ installed system-side. The package is not compatible with older Python versions.</div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;2. You have python3.6-dev installed system-side. This contains header files needed to build PyArmNN extension module.</div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;3. In case you build Python from sources manually, make sure that the following libraries are installed and available in you system:</div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;``python3.6-dev build-essential checkinstall libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev``</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;4. Install SWIG 4.x. Only 3.x version is typically available in Linux package managers, so you will have to build it and install it from sources. It can be downloaded from the [SWIG project website](http://www.swig.org/download.html) or from [SWIG GitHub](https://github.com/swig/swig). To install it follow the guide on [SWIG GitHub](https://github.com/swig/swig/wiki/Getting-Started).</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;</div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;## Setup virtual environment</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;Now you can proceed with setting up workspace. It is recommended to create a python virtual environment, so you do not pollute your working folder:</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;```bash</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;python -m venv env</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;source env/bin/activate</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;```</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;You may run into missing python modules such as *wheel*. Make sure to install those using pip:</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;```bash</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;pip install wheel</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;```</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;## Build python distr</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;Python supports source and binary distribution packages.</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;Source distr contains setup.py script that is executed on the users machine during package installation.</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;When preparing binary distr (wheel), setup.py is executed on the build machine and the resulting package contains only the result</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;of the build (generated files and resources, test results etc).</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;In our case, PyArmNN depends on Arm NN installation. Thus, binary distr will be linked with</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;the local build machine libraries and runtime.</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;There are 2 ways to build the python packages. Either directly using the python scripts or using CMake.</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;### CMake build</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;The recommended aproach is to build PyArmNN together with Arm NN by adding the following options to your CMake command:</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;```</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;-DBUILD_PYTHON_SRC=1</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;-DBUILD_PYTHON_WHL=1</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;```</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;This will build either the source package or the wheel or both. Current project headers and build libraries will be used, so there is no need to provide them.</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;SWIG is required to generate the wrappers. If CMake did not find the executable during the configure step or it has found an older version, you may provide it manually:</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;```</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;-DSWIG_EXECUTABLE=&lt;path_to_swig_executable&gt;</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;```</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;After the build finishes, you will find the python packages in `&lt;build_folder&gt;/python/pyarmnn/dist`.</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;### Standalone build</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;PyArmNN can also be built using the provided python scripts only. The advantage of that is that you may use prebuilt Arm NN libraries and it is generally much faster if you do not want to build all the Arm NN libraries.</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;##### 1. Set environment:</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;*ARMNN_INCLUDE* and *ARMNN_LIB* are mandatory and should point to Arm NN includes and libraries against which you will be generating the wrappers. *SWIG_EXECUTABLE* should only be set if you have multiple versions of SWIG installed or you used a custom location for your installation:</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;```bash</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;$ export SWIG_EXECUTABLE=&lt;path_to_swig&gt;</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;$ export ARMNN_INCLUDE=&lt;path_to_armnn_include&gt;</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;$ export ARMNN_LIB=&lt;path_to_armnn_libraries&gt;</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;```</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;##### 2. Clean and build SWIG wrappers:</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;```bash</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;$ python setup.py clean --all</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;$ python swig_generate.py -v</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;$ python setup.py build_ext --inplace</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;```</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;This step will put all generated files under `./src/pyarmnn/_generated` folder and can be used repeatedly to re-generate the wrappers.</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;##### 4. Build the source package</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;```bash</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;$ python setup.py sdist</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;```</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;As the result you will get `./dist/pyarmnn-24.0.0.tar.gz` file. As you can see it is platform independent.</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;##### 5. Build the binary package</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;```bash</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;$ python setup.py bdist_wheel</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;```</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;As the result you will get something like `./dist/pyarmnn-24.0.0-cp36-cp36m-linux_x86_64.whl` file. As you can see it</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160; is platform dependent.</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;# PyArmNN installation</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;PyArmNN can be distributed as a source package or a binary package (wheel).</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;Binary package is platform dependent, the name of the package will indicate the platform it was built for, e.g.:</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;* Linux x86 64bit machine: pyarmnn-24.0.0-cp36-cp36m-*linux_x86_64*.whl</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;* Linux Aarch 64 bit machine: pyarmnn-24.0.0-cp36-cp36m-*linux_aarch64*.whl</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;The source package is platform independent but installation involves compilation of Arm NN python extension. You will need to have g++ compatible with C++ 14 standard and a python development library installed on the build machine.</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;Both of them, source and binary package, require the Arm NN library to be present on the target/build machine.</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;It is strongly suggested to work within a python virtual environment. The further steps assume that the virtual environment was created and activated before running PyArmNN installation commands.</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;PyArmNN also depends on the NumPy python library. It will be automatically downloaded and installed alongside PyArmNN. If your machine does not have access to Python pip repositories you might need to install NumPy in advance by following public instructions: https://scipy.org/install.html</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;## Installing from wheel</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;Make sure that Arm NN binaries and Arm NN dependencies are installed and can be found in one of the system default library locations. You can check default locations by executing the following command:</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;```bash</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;$ gcc --print-search-dirs</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;```</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;Install PyArmNN from binary by pointing to the wheel file:</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;```bash</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;$ pip install /path/to/pyarmnn-24.0.0-cp36-cp36m-linux_aarch64.whl</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;```</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;## Installing from source package</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;Alternatively, you can install from source. This is the more reliable way but requires a little more effort on the users part.</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;While installing from sources, you have the freedom of choosing Arm NN libraries location. Set environment variables *ARMNN_LIB* and *ARMNN_INCLUDE* to point to Arm NN libraries and headers.</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;If you want to use system default locations, just set *ARMNN_INCLUDE* to point to Arm NN headers.</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;```bash</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;$ export  ARMNN_LIB=/path/to/libs</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;$ export  ARMNN_INCLUDE=/path/to/headers</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;```</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;Install PyArmNN as follows:</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;```bash</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;$ pip install /path/to/pyarmnn-24.0.0.tar.gz</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;```</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;If PyArmNN installation script fails to find Arm NN libraries it will raise an error like this</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;`RuntimeError: ArmNN library was not found in (&#39;/usr/lib/gcc/aarch64-linux-gnu/8/&#39;, &lt;...&gt; ,&#39;/lib/&#39;, &#39;/usr/lib/&#39;). Please install ArmNN to one of the standard locations or set correct ARMNN_INCLUDE and ARMNN_LIB env variables.`</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;You can now verify that PyArmNN library is installed and check PyArmNN version using:</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;```bash</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;$ pip show pyarmnn</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;```</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;You can also verify it by running the following and getting output similar to below:</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;```bash</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;$ python -c &quot;import pyarmnn as ann;print(ann.GetVersion())&quot;</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;&#39;24.0.0&#39;</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;```</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;# PyArmNN API overview</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;#### Getting started</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;The easiest way to begin using PyArmNN is by using the Parsers. We will demonstrate how to use them below:</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;Create a parser object and load your model file.</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;```python</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;import pyarmnn as ann</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;import imageio</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;# ONNX, Caffe and TF parsers also exist.</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;parser = ann.ITfLiteParser()</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;network = parser.CreateNetworkFromBinaryFile(&#39;./model.tflite&#39;)</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;```</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;Get the input binding information by using the name of the input layer.</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;```python</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;input_binding_info = parser.GetNetworkInputBindingInfo(0, &#39;model/input&#39;)</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;# Create a runtime object that will perform inference.</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;options = ann.CreationOptions()</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;runtime = ann.IRuntime(options)</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;```</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;Choose preferred backends for execution and optimize the network.</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;```python</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;# Backend choices earlier in the list have higher preference.</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;preferredBackends = [ann.BackendId(&#39;CpuAcc&#39;), ann.BackendId(&#39;CpuRef&#39;)]</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;opt_network, messages = ann.Optimize(network, preferredBackends, runtime.GetDeviceSpec(), ann.OptimizerOptions())</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;# Load the optimized network into the runtime.</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;net_id, _ = runtime.LoadNetwork(opt_network)</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;```</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;Make workload tensors using input and output binding information.</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;```python</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;# Load an image and create an inputTensor for inference.</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;img = imageio.imread(&#39;./image.png&#39;)</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;input_tensors = ann.make_input_tensors([input_binding_info], [img])</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;# Get output binding information for an output layer by using the layer name.</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;output_binding_info = parser.GetNetworkOutputBindingInfo(0, &#39;model/output&#39;)</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;output_tensors = ann.make_output_tensors([output_binding_info])</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;```</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;Perform inference and get the results back into a numpy array.</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;```python</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;runtime.EnqueueWorkload(0, input_tensors, output_tensors)</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;results = ann.workload_tensors_to_ndarray(output_tensors)</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;print(results)</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;```</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;#### Examples</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;To further explore PyArmNN API there are several examples provided in the `/examples` folder for you to explore.</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;##### Image Classification</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;This sample application performs image classification on an image and outputs the &lt;i&gt;Top N&lt;/i&gt; results, listing the classes and probabilities associated with the classified image. All resources are downloaded during execution, so if you do not have access to the internet, you may need to download these manually.</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;Sample scripts are provided for performing image classification with TFLite and ONNX models with `tflite_mobilenetv1_quantized.py` and `onnx_mobilenetv2.py`.</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;##### Object Detection</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;This sample application guides the user and shows how to perform object detection using PyArmNN API. By taking a model and video file or camera feed as input, and running inference on each frame, we are able to interpret the output to draw bounding boxes around detected objects and overlay the corresponding labels and confidence scores.</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;Sample scripts are provided for performing object detection from video file and video stream with `run_video_file.py` and `run_video_stream.py`.</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;## Tox for automation</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;To make things easier *tox* is available for automating individual tasks or running multiple commands at once such as generating wrappers, running unit tests using multiple python versions or generating documentation. To run it use:</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;```bash</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;$ tox &lt;task_name&gt;</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;```</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;See *tox.ini* for the list of tasks. You may also modify it for your own purposes. To dive deeper into tox read through https://tox.readthedocs.io/en/latest/</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;## Running unit-tests</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;Download resources required to run unit tests by executing the script in the scripts folder:</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;```</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;$ python ./scripts/download_test_resources.py</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;```</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;The script will download an archive from the Linaro server and extract it. A folder `test/testdata/shared` will be created. Execute `pytest` from the project root dir:</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;```bash</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;$ python -m pytest test/ -v</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;```</div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;or run tox which will do both:</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;```bash</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;$ tox</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;```</div></div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="python_2pyarmnn_2_r_e_a_d_m_e_8md.xhtml">README.md</a></li>
    <li class="footer">Generated on Thu Feb 25 2021 17:27:54 for ArmNN by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
  </ul>
</div>
</body>
</html>