forked from Smorodov/Multitarget-tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEmbeddingsCalculator.hpp
More file actions
92 lines (84 loc) · 1.99 KB
/
EmbeddingsCalculator.hpp
File metadata and controls
92 lines (84 loc) · 1.99 KB
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
#pragma once
///
/// \brief The EmbeddingsCalculator class
///
class EmbeddingsCalculator
{
public:
EmbeddingsCalculator() = default;
virtual ~EmbeddingsCalculator() = default;
///
bool Initialize(const std::string& cfgName, const std::string& weightsName, const cv::Size& inputLayer)
{
#ifdef USE_OCV_EMBEDDINGS
m_inputLayer = inputLayer;
#if 1
m_net = cv::dnn::readNet(weightsName, cfgName);
#else
m_net = cv::dnn::readNetFromTensorflow(weightsName, cfgName);
#endif
if (!m_net.empty())
{
m_net.setPreferableBackend(cv::dnn::DNN_BACKEND_INFERENCE_ENGINE);
m_net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
}
return !m_net.empty();
#else
std::cerr << "EmbeddingsCalculator was disabled in CMAKE! Check SetDistances params." << std::endl;
return false;
#endif
}
///
bool IsInitialized() const
{
#ifdef USE_OCV_EMBEDDINGS
return !m_net.empty();
#else
return false;
#endif
}
///
void Calc(const cv::UMat& img, cv::Rect rect, cv::Mat& embedding)
{
#ifdef USE_OCV_EMBEDDINGS
auto Clamp = [](int& v, int& size, int hi) -> int
{
int res = 0;
if (v < 0)
{
res = v;
v = 0;
return res;
}
else if (v + size > hi - 1)
{
res = v;
v = hi - 1 - size;
if (v < 0)
{
size += v;
v = 0;
}
res -= v;
return res;
}
return res;
};
Clamp(rect.x, rect.width, img.cols);
Clamp(rect.y, rect.height, img.rows);
cv::UMat obj;
cv::resize(img(rect), obj, m_inputLayer, 0., 0., cv::INTER_LANCZOS4);
cv::Mat blob = cv::dnn::blobFromImage(obj, 1.0, cv::Size(), cv::Scalar(), false, false);
m_net.setInput(blob);
embedding = m_net.forward();
//std::cout << "embedding: " << embedding.size() << ", chans = " << embedding.channels() << std::endl;
#else
std::cerr << "EmbeddingsCalculator was disabled in CMAKE! Check SetDistances params." << std::endl;
#endif
}
private:
#ifdef USE_OCV_EMBEDDINGS
cv::dnn::Net m_net;
cv::Size m_inputLayer{ 128, 256 };
#endif
};