aboutsummaryrefslogtreecommitdiff
path: root/21.02/_n_m_s_8cpp_source.xhtml
blob: ebad81cc286b812737e802a09bbcd9414fdcdbbc (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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<!-- 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: tests/TfLiteYoloV3Big-Armnn/NMS.cpp 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('_n_m_s_8cpp_source.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">NMS.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_n_m_s_8cpp.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;<span class="comment">//</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright © 2020 Arm Ltd. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">// SPDX-License-Identifier: MIT</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;</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;<span class="preprocessor">#include &quot;<a class="code" href="_n_m_s_8hpp.xhtml">NMS.hpp</a>&quot;</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;</div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="preprocessor">#include &lt;cmath&gt;</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="preprocessor">#include &lt;cstddef&gt;</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="preprocessor">#include &lt;numeric&gt;</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="preprocessor">#include &lt;ostream&gt;</span></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"><a class="line" href="namespaceyolov3.xhtml">   15</a></span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceyolov3.xhtml">yolov3</a> {</div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="keyword">namespace </span>{<span class="comment"></span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment">/** Number of elements needed to represent a box */</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;constexpr <span class="keywordtype">int</span> box_elements = 4;<span class="comment"></span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment">/** Number of elements needed to represent a confidence factor */</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;constexpr <span class="keywordtype">int</span> confidence_elements = 1;</div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment">/** Calculate Intersection Over Union of two boxes</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * @param[in] box1 First box</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * @param[in] box2 Second box</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> * @return The IoU of the two boxes</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="keywordtype">float</span> iou(<span class="keyword">const</span> <a class="code" href="structyolov3_1_1_box.xhtml">Box</a>&amp; box1, <span class="keyword">const</span> <a class="code" href="structyolov3_1_1_box.xhtml">Box</a>&amp; box2)</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;{</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">float</span> area1 = (box1.<a class="code" href="structyolov3_1_1_box.xhtml#a9c42f51718ed192ed1841a53d2b0e507">xmax</a> - box1.<a class="code" href="structyolov3_1_1_box.xhtml#a058f249a5e6d20724cb0784b40a183e8">xmin</a>) * (box1.<a class="code" href="structyolov3_1_1_box.xhtml#acee1a082369857c7ee64924a0d9bc706">ymax</a> - box1.<a class="code" href="structyolov3_1_1_box.xhtml#a5c6190dc7aa1bd7aafb9592a64f7046d">ymin</a>);</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">float</span> area2 = (box2.<a class="code" href="structyolov3_1_1_box.xhtml#a9c42f51718ed192ed1841a53d2b0e507">xmax</a> - box2.<a class="code" href="structyolov3_1_1_box.xhtml#a058f249a5e6d20724cb0784b40a183e8">xmin</a>) * (box2.<a class="code" href="structyolov3_1_1_box.xhtml#acee1a082369857c7ee64924a0d9bc706">ymax</a> - box2.<a class="code" href="structyolov3_1_1_box.xhtml#a5c6190dc7aa1bd7aafb9592a64f7046d">ymin</a>);</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;    <span class="keywordtype">float</span> overlap;</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;    <span class="keywordflow">if</span> (area1 &lt;= 0 || area2 &lt;= 0)</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;    {</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;        overlap = 0.0f;</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;    <span class="keywordflow">else</span></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;        <span class="keyword">const</span> <span class="keyword">auto</span> y_min_intersection = std::max&lt;float&gt;(box1.<a class="code" href="structyolov3_1_1_box.xhtml#a5c6190dc7aa1bd7aafb9592a64f7046d">ymin</a>, box2.<a class="code" href="structyolov3_1_1_box.xhtml#a5c6190dc7aa1bd7aafb9592a64f7046d">ymin</a>);</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;        <span class="keyword">const</span> <span class="keyword">auto</span> x_min_intersection = std::max&lt;float&gt;(box1.<a class="code" href="structyolov3_1_1_box.xhtml#a058f249a5e6d20724cb0784b40a183e8">xmin</a>, box2.<a class="code" href="structyolov3_1_1_box.xhtml#a058f249a5e6d20724cb0784b40a183e8">xmin</a>);</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;        <span class="keyword">const</span> <span class="keyword">auto</span> y_max_intersection = std::min&lt;float&gt;(box1.<a class="code" href="structyolov3_1_1_box.xhtml#acee1a082369857c7ee64924a0d9bc706">ymax</a>, box2.<a class="code" href="structyolov3_1_1_box.xhtml#acee1a082369857c7ee64924a0d9bc706">ymax</a>);</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;        <span class="keyword">const</span> <span class="keyword">auto</span> x_max_intersection = std::min&lt;float&gt;(box1.<a class="code" href="structyolov3_1_1_box.xhtml#a9c42f51718ed192ed1841a53d2b0e507">xmax</a>, box2.<a class="code" href="structyolov3_1_1_box.xhtml#a9c42f51718ed192ed1841a53d2b0e507">xmax</a>);</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;        <span class="keyword">const</span> <span class="keyword">auto</span> area_intersection =</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;            std::max&lt;float&gt;(y_max_intersection - y_min_intersection, 0.0f) *</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;            std::max&lt;float&gt;(x_max_intersection - x_min_intersection, 0.0f);</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;        overlap = area_intersection / (area1 + area2 - area_intersection);</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;    <span class="keywordflow">return</span> overlap;</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;</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;std::vector&lt;Detection&gt; convert_to_detections(<span class="keyword">const</span> <a class="code" href="structyolov3_1_1_n_m_s_config.xhtml">NMSConfig</a>&amp; config,</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;                                             <span class="keyword">const</span> std::vector&lt;float&gt;&amp; detected_boxes)</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;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> element_step = <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;        box_elements + confidence_elements + config.<a class="code" href="structyolov3_1_1_n_m_s_config.xhtml#ae82414d4f3be497637c3456351a19c03">num_classes</a>);</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;    std::vector&lt;Detection&gt; detections;</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; config.<a class="code" href="structyolov3_1_1_n_m_s_config.xhtml#a69e5cb89b98e22ca17e8a7d3d8aef10a">num_boxes</a>; ++i)</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;    {</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">float</span>* cur_box = &amp;detected_boxes[i * element_step];</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;        <span class="keywordflow">if</span> (cur_box[4] &gt; config.<a class="code" href="structyolov3_1_1_n_m_s_config.xhtml#a4e90aada4569ce7e2b3e41649cfdc3f8">confidence_threshold</a>)</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;            <a class="code" href="structyolov3_1_1_detection.xhtml">Detection</a> det;</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;            det.<a class="code" href="structyolov3_1_1_detection.xhtml#ab19e728e80bc2fc43d8e82c3602f8333">box</a> = {cur_box[0], cur_box[0] + cur_box[2], cur_box[1],</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;                       cur_box[1] + cur_box[3]};</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;            det.<a class="code" href="structyolov3_1_1_detection.xhtml#a058b8558da894ebfbef73d1a9b57deaa">confidence</a> = cur_box[4];</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;            det.<a class="code" href="structyolov3_1_1_detection.xhtml#a1ceea7e0cd778a72b2a6e1ffe886d407">classes</a>.resize(static_cast&lt;size_t&gt;(config.<a class="code" href="structyolov3_1_1_n_m_s_config.xhtml#ae82414d4f3be497637c3456351a19c03">num_classes</a>), 0);</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;            <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> c = 0; c &lt; config.<a class="code" href="structyolov3_1_1_n_m_s_config.xhtml#ae82414d4f3be497637c3456351a19c03">num_classes</a>; ++c)</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;                <span class="keyword">const</span> <span class="keywordtype">float</span> class_prob = det.<a class="code" href="structyolov3_1_1_detection.xhtml#a058b8558da894ebfbef73d1a9b57deaa">confidence</a> * cur_box[5 + c];</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;                <span class="keywordflow">if</span> (class_prob &gt; config.<a class="code" href="structyolov3_1_1_n_m_s_config.xhtml#a4e90aada4569ce7e2b3e41649cfdc3f8">confidence_threshold</a>)</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;                {</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;                    det.<a class="code" href="structyolov3_1_1_detection.xhtml#a1ceea7e0cd778a72b2a6e1ffe886d407">classes</a>[c] = class_prob;</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;                }</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;            }</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;            detections.emplace_back(std::move(det));</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;    <span class="keywordflow">return</span> detections;</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;} <span class="comment">// namespace</span></div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;</div><div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="namespaceyolov3.xhtml#a81be14d2d01feb34d4d9a84f52121ea6">   84</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespaceyolov3.xhtml#a81be14d2d01feb34d4d9a84f52121ea6">compare_detection</a>(<span class="keyword">const</span> <a class="code" href="structyolov3_1_1_detection.xhtml">yolov3::Detection</a>&amp; detection,</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;                       <span class="keyword">const</span> std::vector&lt;float&gt;&amp; expected)</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;    <span class="keywordtype">float</span> tolerance = 0.001f;</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;    <span class="keywordflow">return</span> (std::fabs(detection.<a class="code" href="structyolov3_1_1_detection.xhtml#a1ceea7e0cd778a72b2a6e1ffe886d407">classes</a>[0] - expected[0]) &lt; tolerance  &amp;&amp;</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;            std::fabs(detection.<a class="code" href="structyolov3_1_1_detection.xhtml#ab19e728e80bc2fc43d8e82c3602f8333">box</a>.<a class="code" href="structyolov3_1_1_box.xhtml#a058f249a5e6d20724cb0784b40a183e8">xmin</a>   - expected[1]) &lt; tolerance  &amp;&amp;</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;            std::fabs(detection.<a class="code" href="structyolov3_1_1_detection.xhtml#ab19e728e80bc2fc43d8e82c3602f8333">box</a>.<a class="code" href="structyolov3_1_1_box.xhtml#a5c6190dc7aa1bd7aafb9592a64f7046d">ymin</a>   - expected[2]) &lt; tolerance  &amp;&amp;</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;            std::fabs(detection.<a class="code" href="structyolov3_1_1_detection.xhtml#ab19e728e80bc2fc43d8e82c3602f8333">box</a>.<a class="code" href="structyolov3_1_1_box.xhtml#a9c42f51718ed192ed1841a53d2b0e507">xmax</a>   - expected[3]) &lt; tolerance  &amp;&amp;</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;            std::fabs(detection.<a class="code" href="structyolov3_1_1_detection.xhtml#ab19e728e80bc2fc43d8e82c3602f8333">box</a>.<a class="code" href="structyolov3_1_1_box.xhtml#acee1a082369857c7ee64924a0d9bc706">ymax</a>   - expected[4]) &lt; tolerance  &amp;&amp;</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;            std::fabs(detection.<a class="code" href="structyolov3_1_1_detection.xhtml#a058b8558da894ebfbef73d1a9b57deaa">confidence</a> - expected[5]) &lt; tolerance  );</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;}</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"><a class="line" href="namespaceyolov3.xhtml#a8151de4c14e5e853818753516cb87c26">   96</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespaceyolov3.xhtml#a8151de4c14e5e853818753516cb87c26">print_detection</a>(std::ostream&amp; os,</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;                     <span class="keyword">const</span> std::vector&lt;Detection&gt;&amp; detections)</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;{</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; detection : detections)</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;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> c = 0; c &lt; detection.classes.size(); ++c)</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;        {</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;            <span class="keywordflow">if</span> (detection.classes[c] != 0.0f)</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;            {</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;                os &lt;&lt; c &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; detection.classes[c] &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; detection.box.xmin</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;                   &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; detection.box.ymin &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; detection.box.xmax &lt;&lt; <span class="stringliteral">&quot; &quot;</span></div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;                   &lt;&lt; detection.box.ymax &lt;&lt; std::endl;</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;            }</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;    }</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;}</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"><a class="line" href="namespaceyolov3.xhtml#a7cf18c5c3391effbaf3234792876cd52">  113</a></span>&#160;std::vector&lt;Detection&gt; <a class="code" href="namespaceyolov3.xhtml#a7cf18c5c3391effbaf3234792876cd52">nms</a>(<span class="keyword">const</span> <a class="code" href="structyolov3_1_1_n_m_s_config.xhtml">NMSConfig</a>&amp; config,</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;                           <span class="keyword">const</span> std::vector&lt;float&gt;&amp; detected_boxes) {</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;    <span class="comment">// Get detections that comply with the expected confidence threshold</span></div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;    std::vector&lt;Detection&gt; detections =</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;        convert_to_detections(config, detected_boxes);</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;    <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> num_detections = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(detections.size());</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> c = 0; c &lt; config.<a class="code" href="structyolov3_1_1_n_m_s_config.xhtml#ae82414d4f3be497637c3456351a19c03">num_classes</a>; ++c)</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;    {</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;        <span class="comment">// Sort classes</span></div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;        std::sort(detections.begin(), detections.begin() + <span class="keyword">static_cast&lt;</span>std::ptrdiff_t<span class="keyword">&gt;</span>(num_detections),</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;                  [c](<a class="code" href="structyolov3_1_1_detection.xhtml">Detection</a>&amp; detection1, <a class="code" href="structyolov3_1_1_detection.xhtml">Detection</a>&amp; detection2)</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;                    {</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;                        <span class="keywordflow">return</span> (detection1.<a class="code" href="structyolov3_1_1_detection.xhtml#a1ceea7e0cd778a72b2a6e1ffe886d407">classes</a>[c] - detection2.<a class="code" href="structyolov3_1_1_detection.xhtml#a1ceea7e0cd778a72b2a6e1ffe886d407">classes</a>[c]) &gt; 0;</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;                    });</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;        <span class="comment">// Clear detections with high IoU</span></div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> d = 0; d &lt; num_detections; ++d)</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;            <span class="comment">// Check if class is already cleared/invalidated</span></div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;            <span class="keywordflow">if</span> (detections[d].classes[c] == 0.f)</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;                <span class="keywordflow">continue</span>;</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;</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;            <span class="comment">// Filter out boxes on IoU threshold</span></div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;            <span class="keyword">const</span> <a class="code" href="structyolov3_1_1_box.xhtml">Box</a>&amp; box1 = detections[d].box;</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;            <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> b = d + 1; b &lt; num_detections; ++b)</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;            {</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;                <span class="keyword">const</span> <a class="code" href="structyolov3_1_1_box.xhtml">Box</a>&amp; box2 = detections[b].box;</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;                <span class="keywordflow">if</span> (iou(box1, box2) &gt; config.<a class="code" href="structyolov3_1_1_n_m_s_config.xhtml#a8f299d6494fbe8a199fed9344d10d99b">iou_threshold</a>)</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;                    detections[b].classes[c] = 0.f;</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;                }</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;            }</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;    <span class="keywordflow">return</span> detections;</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;} <span class="comment">// namespace yolov3</span></div><div class="ttc" id="structyolov3_1_1_detection_xhtml_a058b8558da894ebfbef73d1a9b57deaa"><div class="ttname"><a href="structyolov3_1_1_detection.xhtml#a058b8558da894ebfbef73d1a9b57deaa">yolov3::Detection::confidence</a></div><div class="ttdeci">float confidence</div><div class="ttdoc">Confidence of detection. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00031">NMS.hpp:31</a></div></div>
<div class="ttc" id="structyolov3_1_1_box_xhtml_a5c6190dc7aa1bd7aafb9592a64f7046d"><div class="ttname"><a href="structyolov3_1_1_box.xhtml#a5c6190dc7aa1bd7aafb9592a64f7046d">yolov3::Box::ymin</a></div><div class="ttdeci">float ymin</div><div class="ttdoc">Y-pos position of the low left coordinate. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00024">NMS.hpp:24</a></div></div>
<div class="ttc" id="structyolov3_1_1_n_m_s_config_xhtml_a69e5cb89b98e22ca17e8a7d3d8aef10a"><div class="ttname"><a href="structyolov3_1_1_n_m_s_config.xhtml#a69e5cb89b98e22ca17e8a7d3d8aef10a">yolov3::NMSConfig::num_boxes</a></div><div class="ttdeci">unsigned int num_boxes</div><div class="ttdoc">Number of detected boxes. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00015">NMS.hpp:15</a></div></div>
<div class="ttc" id="namespaceyolov3_xhtml"><div class="ttname"><a href="namespaceyolov3.xhtml">yolov3</a></div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8cpp_source.xhtml#l00015">NMS.cpp:15</a></div></div>
<div class="ttc" id="structyolov3_1_1_box_xhtml_a058f249a5e6d20724cb0784b40a183e8"><div class="ttname"><a href="structyolov3_1_1_box.xhtml#a058f249a5e6d20724cb0784b40a183e8">yolov3::Box::xmin</a></div><div class="ttdeci">float xmin</div><div class="ttdoc">X-pos position of the low left coordinate. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00022">NMS.hpp:22</a></div></div>
<div class="ttc" id="structyolov3_1_1_box_xhtml_a9c42f51718ed192ed1841a53d2b0e507"><div class="ttname"><a href="structyolov3_1_1_box.xhtml#a9c42f51718ed192ed1841a53d2b0e507">yolov3::Box::xmax</a></div><div class="ttdeci">float xmax</div><div class="ttdoc">X-pos position of the top right coordinate. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00023">NMS.hpp:23</a></div></div>
<div class="ttc" id="namespaceyolov3_xhtml_a8151de4c14e5e853818753516cb87c26"><div class="ttname"><a href="namespaceyolov3.xhtml#a8151de4c14e5e853818753516cb87c26">yolov3::print_detection</a></div><div class="ttdeci">void print_detection(std::ostream &amp;os, const std::vector&lt; Detection &gt; &amp;detections)</div><div class="ttdoc">Print identified yolo detections. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8cpp_source.xhtml#l00096">NMS.cpp:96</a></div></div>
<div class="ttc" id="structyolov3_1_1_detection_xhtml"><div class="ttname"><a href="structyolov3_1_1_detection.xhtml">yolov3::Detection</a></div><div class="ttdoc">Detection structure. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00029">NMS.hpp:29</a></div></div>
<div class="ttc" id="structyolov3_1_1_detection_xhtml_a1ceea7e0cd778a72b2a6e1ffe886d407"><div class="ttname"><a href="structyolov3_1_1_detection.xhtml#a1ceea7e0cd778a72b2a6e1ffe886d407">yolov3::Detection::classes</a></div><div class="ttdeci">std::vector&lt; float &gt; classes</div><div class="ttdoc">Probability of classes. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00032">NMS.hpp:32</a></div></div>
<div class="ttc" id="structyolov3_1_1_detection_xhtml_ab19e728e80bc2fc43d8e82c3602f8333"><div class="ttname"><a href="structyolov3_1_1_detection.xhtml#ab19e728e80bc2fc43d8e82c3602f8333">yolov3::Detection::box</a></div><div class="ttdeci">Box box</div><div class="ttdoc">Detection box. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00030">NMS.hpp:30</a></div></div>
<div class="ttc" id="structyolov3_1_1_box_xhtml"><div class="ttname"><a href="structyolov3_1_1_box.xhtml">yolov3::Box</a></div><div class="ttdoc">Box representation structure. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00021">NMS.hpp:21</a></div></div>
<div class="ttc" id="structyolov3_1_1_box_xhtml_acee1a082369857c7ee64924a0d9bc706"><div class="ttname"><a href="structyolov3_1_1_box.xhtml#acee1a082369857c7ee64924a0d9bc706">yolov3::Box::ymax</a></div><div class="ttdeci">float ymax</div><div class="ttdoc">Y-pos position of the top right coordinate. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00025">NMS.hpp:25</a></div></div>
<div class="ttc" id="structyolov3_1_1_n_m_s_config_xhtml_a8f299d6494fbe8a199fed9344d10d99b"><div class="ttname"><a href="structyolov3_1_1_n_m_s_config.xhtml#a8f299d6494fbe8a199fed9344d10d99b">yolov3::NMSConfig::iou_threshold</a></div><div class="ttdeci">float iou_threshold</div><div class="ttdoc">Inclusion threshold for Intersection-Over-Union. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00017">NMS.hpp:17</a></div></div>
<div class="ttc" id="namespaceyolov3_xhtml_a7cf18c5c3391effbaf3234792876cd52"><div class="ttname"><a href="namespaceyolov3.xhtml#a7cf18c5c3391effbaf3234792876cd52">yolov3::nms</a></div><div class="ttdeci">std::vector&lt; Detection &gt; nms(const NMSConfig &amp;config, const std::vector&lt; float &gt; &amp;detected_boxes)</div><div class="ttdoc">Perform Non-Maxima Supression on a list of given detections. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8cpp_source.xhtml#l00113">NMS.cpp:113</a></div></div>
<div class="ttc" id="structyolov3_1_1_n_m_s_config_xhtml"><div class="ttname"><a href="structyolov3_1_1_n_m_s_config.xhtml">yolov3::NMSConfig</a></div><div class="ttdoc">Non Maxima Suprresion configuration meta-data. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00013">NMS.hpp:13</a></div></div>
<div class="ttc" id="structyolov3_1_1_n_m_s_config_xhtml_a4e90aada4569ce7e2b3e41649cfdc3f8"><div class="ttname"><a href="structyolov3_1_1_n_m_s_config.xhtml#a4e90aada4569ce7e2b3e41649cfdc3f8">yolov3::NMSConfig::confidence_threshold</a></div><div class="ttdeci">float confidence_threshold</div><div class="ttdoc">Inclusion confidence threshold for a box. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00016">NMS.hpp:16</a></div></div>
<div class="ttc" id="_n_m_s_8hpp_xhtml"><div class="ttname"><a href="_n_m_s_8hpp.xhtml">NMS.hpp</a></div></div>
<div class="ttc" id="namespaceyolov3_xhtml_a81be14d2d01feb34d4d9a84f52121ea6"><div class="ttname"><a href="namespaceyolov3.xhtml#a81be14d2d01feb34d4d9a84f52121ea6">yolov3::compare_detection</a></div><div class="ttdeci">bool compare_detection(const yolov3::Detection &amp;detection, const std::vector&lt; float &gt; &amp;expected)</div><div class="ttdoc">Compare a detection object with a vector of float values. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8cpp_source.xhtml#l00084">NMS.cpp:84</a></div></div>
<div class="ttc" id="structyolov3_1_1_n_m_s_config_xhtml_ae82414d4f3be497637c3456351a19c03"><div class="ttname"><a href="structyolov3_1_1_n_m_s_config.xhtml#ae82414d4f3be497637c3456351a19c03">yolov3::NMSConfig::num_classes</a></div><div class="ttdeci">unsigned int num_classes</div><div class="ttdoc">Number of classes in the detected boxes. </div><div class="ttdef"><b>Definition:</b> <a href="_n_m_s_8hpp_source.xhtml#l00014">NMS.hpp:14</a></div></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="dir_59425e443f801f1f2fd8bbe4959a3ccf.xhtml">tests</a></li><li class="navelem"><a class="el" href="dir_b7046834333ec325d3a0c415e99d3f12.xhtml">TfLiteYoloV3Big-Armnn</a></li><li class="navelem"><a class="el" href="_n_m_s_8cpp.xhtml">NMS.cpp</a></li>
    <li class="footer">Generated on Fri Mar 19 2021 15:26:05 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>