Register
Login
Resources
Docs Blog Datasets Glossary Case Studies Tutorials & Webinars
Product
Data Engine LLMs Platform Enterprise
Pricing Explore
Connect to our Discord channel

bounding_box.cpp 3.5 KB

You have to be logged in to leave a comment. Sign In
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
  1. #include "bounding_box.hpp"
  2. void nms_average(std::vector<BoundingBox>& bd,
  3. std::vector<BoundingBox>& processedBox,
  4. float overlapped_thresh)
  5. {
  6. std::sort(bd.begin(), bd.end(), sort_by_confidence_reverse);
  7. while (bd.size() != 0)
  8. {
  9. std::vector<int> iddlt(1, 0);
  10. float x11 = bd[0].x;
  11. float y11 = bd[0].y;
  12. float x12 = bd[0].x + bd[0].height;
  13. float y12 = bd[0].y + bd[0].width;
  14. if (bd.size() > 1)
  15. {
  16. for (int j = 1; j < bd.size(); j++)
  17. {
  18. float x21 = bd[j].x;
  19. float y21 = bd[j].y;
  20. float x22 = bd[j].x + bd[j].height;
  21. float y22 = bd[j].y + bd[j].width;
  22. float x_overlap = MAX(0, MIN(x12, x22) - MAX(x11, x21));
  23. float y_overlap = MAX(0, MIN(y12, y22) - MAX(y11, y21));
  24. if (x_overlap * y_overlap > MIN(bd[0].area(), bd[j].area()) * overlapped_thresh)
  25. {
  26. iddlt.push_back(j);
  27. }
  28. }
  29. }
  30. float x_average = 0;
  31. float y_average = 0;
  32. float width = 0;
  33. float height = 0;
  34. float confidence = 0;
  35. for (int i = 0; i < iddlt.size(); i++)
  36. {
  37. x_average += bd[iddlt[i]].x;
  38. y_average += bd[iddlt[i]].y;
  39. width += bd[iddlt[i]].width;
  40. height += bd[iddlt[i]].height;
  41. confidence += bd[iddlt[i]].prob;
  42. }
  43. x_average /= iddlt.size();
  44. y_average /= iddlt.size();
  45. width /= iddlt.size();
  46. height /= iddlt.size();
  47. confidence /= iddlt.size();
  48. processedBox.emplace_back(BoundingBox(y_average, x_average, width, height, confidence));
  49. for (int i = 0; i < iddlt.size(); i++)
  50. {
  51. bd.erase(bd.begin() + iddlt[i] - i);
  52. }
  53. }
  54. }
  55. void nms_max(std::vector<BoundingBox>& bd,
  56. std::vector<BoundingBox>& processedBox,
  57. float overlapped_thresh)
  58. {
  59. std::sort(bd.begin(), bd.end(), sort_by_size);
  60. for (int i = 0; i < bd.size(); i++)
  61. {
  62. int j = 0;
  63. for (; j < processedBox.size(); j++)
  64. {
  65. /* Calculate the overlapped area */
  66. float x11 = bd[i].x;
  67. float y11 = bd[i].y;
  68. float x12 = bd[i].x + bd[i].height;
  69. float y12 = bd[i].y + bd[i].width;
  70. float x21 = processedBox[j].x;
  71. float y21 = processedBox[j].y;
  72. float x22 = processedBox[j].x + processedBox[j].height;
  73. float y22 = processedBox[j].y + processedBox[j].width;
  74. float x_overlap = MAX(0, MIN(x12, x22) - MAX(x11, x21));
  75. float y_overlap = MAX(0, MIN(y12, y22) - MAX(y11, y21));
  76. if (x_overlap * y_overlap > MIN(bd[i].area(), processedBox[j].area()) * overlapped_thresh)
  77. {
  78. if (processedBox[j].prob < bd[i].prob)
  79. {
  80. processedBox[j] = bd[i];
  81. }
  82. break;
  83. }
  84. }
  85. if (j == processedBox.size())
  86. {
  87. processedBox.emplace_back(bd[i]);
  88. }
  89. }
  90. }
  91. bool sort_by_confidence_reverse(const BoundingBox& a, const BoundingBox& b)
  92. {
  93. return a.prob > b.prob;
  94. }
  95. bool sort_by_size(const BoundingBox& a, const BoundingBox& b)
  96. {
  97. return a.area() < b.area();
  98. }
Tip!

Press p or to see the previous file or, n or to see the next file

Comments

Loading...