Skip to content

Commit 366d439

Browse files
committed
DeepSort works with OpenVINO backend and model
1 parent 28a903f commit 366d439

8 files changed

Lines changed: 109 additions & 42 deletions

File tree

example/examples.h

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -680,18 +680,19 @@ class YoloDarknetExample : public VideoExample
680680
std::string pathToModel = "../data/";
681681
#endif
682682
pathToModel = "C:/work/home/mtracker/Multitarget-tracker/data/";
683+
684+
m_trackerSettings.m_embeddings.emplace_back(pathToModel + "open_model_zoo/person-reidentification-retail-0286/FP16-INT8/person-reidentification-retail-0286.xml",
685+
pathToModel + "open_model_zoo/person-reidentification-retail-0286/FP16-INT8/person-reidentification-retail-0286.bin",
686+
cv::Size(128, 256),
687+
std::vector<ObjectTypes>{ ObjectTypes::obj_person });
688+
683689
#if 0
684-
m_trackerSettings.m_embeddingCfgName = ""; // pathToModel + "111.meta";
685-
m_trackerSettings.m_embeddingWeightsName = pathToModel + "mars-small128_1.pb";
686-
#else
687-
#if 0
688-
m_trackerSettings.m_embeddingCfgName = "";
689-
m_trackerSettings.m_embeddingWeightsName = pathToModel + "open_model_zoo/vehicle-reid-0001/osnet_ain_x1_0_vehicle_reid.onnx";
690-
#else
691-
m_trackerSettings.m_embeddingCfgName = pathToModel + "open_model_zoo/person-reidentification-retail-0286/FP32/person-reidentification-retail-0286.xml";
692-
m_trackerSettings.m_embeddingWeightsName = pathToModel + "open_model_zoo/person-reidentification-retail-0286/FP32/person-reidentification-retail-0286.bin";
693-
#endif
690+
m_trackerSettings.m_embeddings.emplace_back("",
691+
pathToModel + "open_model_zoo/vehicle-reid-0001/osnet_ain_x1_0_vehicle_reid.onnx",
692+
cv::Size(208, 208),
693+
std::vector<ObjectTypes>{ ObjectTypes::obj_car, ObjectTypes::obj_bus, ObjectTypes::obj_truck });
694694
#endif
695+
695696
std::array<track_t, tracking::DistsCount> distType{
696697
0.f, // DistCenters
697698
0.f, // DistRects
@@ -709,7 +710,7 @@ class YoloDarknetExample : public VideoExample
709710

710711
m_trackerSettings.m_kalmanType = tracking::KalmanLinear;
711712
m_trackerSettings.m_filterGoal = tracking::FilterRect;
712-
m_trackerSettings.m_lostTrackType = tracking::TrackCSRT; // Use visual objects tracker for collisions resolving. Used if m_filterGoal == tracking::FilterRect
713+
m_trackerSettings.m_lostTrackType = useDeepSORT ? tracking::TrackNone : tracking::TrackCSRT; // Use visual objects tracker for collisions resolving. Used if m_filterGoal == tracking::FilterRect
713714
m_trackerSettings.m_matchType = tracking::MatchHungrian;
714715
m_trackerSettings.m_useAcceleration = false; // Use constant acceleration motion model
715716
m_trackerSettings.m_dt = m_trackerSettings.m_useAcceleration ? 0.05f : 0.4f; // Delta time for Kalman filter

src/Tracker/Ctracker.cpp

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,21 @@ CTracker::CTracker(const TrackerSettings& settings)
2424
assert(spcalc != nullptr);
2525
m_SPCalculator = std::unique_ptr<ShortPathCalculator>(spcalc);
2626

27-
if (!m_settings.m_embeddingWeightsName.empty() && !m_embCalculator.Initialize(m_settings.m_embeddingCfgName, m_settings.m_embeddingWeightsName))
28-
std::cerr << "EmbeddingsCalculator initialization error: " << m_settings.m_embeddingCfgName << ", " << m_settings.m_embeddingWeightsName << std::endl;
27+
for (const auto& embParam : settings.m_embeddings)
28+
{
29+
std::shared_ptr<EmbeddingsCalculator> embCalc = std::make_shared<EmbeddingsCalculator>();
30+
if (!embCalc->Initialize(embParam.m_embeddingCfgName, embParam.m_embeddingWeightsName, embParam.m_inputLayer))
31+
{
32+
std::cerr << "EmbeddingsCalculator initialization error: " << embParam.m_embeddingCfgName << ", " << embParam.m_embeddingWeightsName << std::endl;
33+
}
34+
else
35+
{
36+
for (auto objType : embParam.m_objectTypes)
37+
{
38+
m_embCalculators.try_emplace((objtype_t)objType, embCalc);
39+
}
40+
}
41+
}
2942
}
3043

3144
///
@@ -270,11 +283,15 @@ void CTracker::CreateDistaceMatrix(const regions_t& regions,
270283
regionEmbeddings.resize(regions.size());
271284
if (regionEmbeddings[j].m_embedding.empty())
272285
{
273-
assert(m_embCalculator.IsInitialized());
274-
m_embCalculator.Calc(currFrame, reg.m_brect, regionEmbeddings[j].m_embedding);
275-
regionEmbeddings[j].m_embDot = regionEmbeddings[j].m_embedding.dot(regionEmbeddings[j].m_embedding);
286+
auto embCalc = m_embCalculators.find(reg.m_type);
287+
if (embCalc != std::end(m_embCalculators))
288+
{
289+
embCalc->second->Calc(currFrame, reg.m_brect, regionEmbeddings[j].m_embedding);
290+
regionEmbeddings[j].m_embDot = regionEmbeddings[j].m_embedding.dot(regionEmbeddings[j].m_embedding);
291+
}
292+
if (reg.m_type == track->LastRegion().m_type)
293+
dist += m_settings.m_distType[ind] * track->CalcCosine(regionEmbeddings[j], currFrame);
276294
}
277-
dist += m_settings.m_distType[ind] * track->CalcCosine(reg, regionEmbeddings[j], currFrame);
278295
}
279296
++ind;
280297
assert(ind == tracking::DistsCount);

src/Tracker/Ctracker.h

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,38 @@ struct TrackerSettings
103103
///
104104
std::map<objtype_t, std::set<objtype_t>> m_nearTypes;
105105

106+
///
107+
struct EmbeddingParams
108+
{
109+
///
110+
/// \brief m_embeddingCfgName
111+
/// Neural network config file for embeddings
112+
///
113+
std::string m_embeddingCfgName;
114+
///
115+
/// \brief m_embeddingWeightsName
116+
/// Neural network weights file for embeddings
117+
///
118+
std::string m_embeddingWeightsName;
119+
120+
///
121+
cv::Size m_inputLayer{128, 256};
122+
123+
///
124+
std::vector<ObjectTypes> m_objectTypes;
125+
126+
EmbeddingParams(const std::string& embeddingCfgName, const std::string& embeddingWeightsName,
127+
const cv::Size& inputLayer, const std::vector<ObjectTypes>& objectTypes)
128+
: m_embeddingCfgName(embeddingCfgName),
129+
m_embeddingWeightsName(embeddingWeightsName),
130+
m_inputLayer(inputLayer),
131+
m_objectTypes(objectTypes)
132+
{
133+
assert(!m_objectTypes.empty());
134+
}
135+
};
106136
///
107-
/// \brief m_embeddingCfgName
108-
/// Neural network config file for embeddings
109-
///
110-
std::string m_embeddingCfgName;
111-
///
112-
/// \brief m_embeddingWeightsName
113-
/// Neural network weights file for embeddings
114-
///
115-
std::string m_embeddingWeightsName;
137+
std::vector<EmbeddingParams> m_embeddings;
116138

117139
///
118140
TrackerSettings()
@@ -261,7 +283,7 @@ class CTracker
261283
cv::UMat m_prevFrame;
262284

263285
std::unique_ptr<ShortPathCalculator> m_SPCalculator;
264-
EmbeddingsCalculator m_embCalculator;
286+
std::map<objtype_t, std::shared_ptr<EmbeddingsCalculator>> m_embCalculators;
265287

266288
void CreateDistaceMatrix(const regions_t& regions, std::vector<RegionEmbedding>& regionEmbeddings, distMatrix_t& costMatrix, track_t maxPossibleCost, track_t& maxCost, cv::UMat currFrame);
267289
void UpdateTrackingState(const regions_t& regions, cv::UMat currFrame, float fps);

src/Tracker/EmbeddingsCalculator.hpp

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ class EmbeddingsCalculator
1010
virtual ~EmbeddingsCalculator() = default;
1111

1212
///
13-
bool Initialize(const std::string& cfgName, const std::string& weightsName)
13+
bool Initialize(const std::string& cfgName, const std::string& weightsName, const cv::Size& inputLayer)
1414
{
15+
m_inputLayer = inputLayer;
16+
1517
#if 1
1618
m_net = cv::dnn::readNet(weightsName, cfgName);
1719
#else
@@ -32,19 +34,44 @@ class EmbeddingsCalculator
3234
}
3335

3436
///
35-
void Calc(const cv::UMat& img, const cv::Rect& rect, cv::Mat& embedding)
37+
void Calc(const cv::UMat& img, cv::Rect rect, cv::Mat& embedding)
3638
{
39+
auto Clamp = [](int& v, int& size, int hi) -> int
40+
{
41+
int res = 0;
42+
if (v < 0)
43+
{
44+
res = v;
45+
v = 0;
46+
return res;
47+
}
48+
else if (v + size > hi - 1)
49+
{
50+
res = v;
51+
v = hi - 1 - size;
52+
if (v < 0)
53+
{
54+
size += v;
55+
v = 0;
56+
}
57+
res -= v;
58+
return res;
59+
}
60+
return res;
61+
};
62+
Clamp(rect.x, rect.width, img.cols);
63+
Clamp(rect.y, rect.height, img.rows);
64+
3765
cv::UMat obj;
38-
//cv::resize(img(rect), obj, cv::Size(64, 128), 0., 0., cv::INTER_LINEAR); // mars-small128_1.pb
39-
cv::resize(img(rect), obj, cv::Size(208, 208), 0., 0., cv::INTER_LINEAR); // vehicle-reid-0001
40-
cv::resize(img(rect), obj, cv::Size(128, 256), 0., 0., cv::INTER_LINEAR); // person-reidentification-retail-0277
66+
cv::resize(img(rect), obj, m_inputLayer, 0., 0., cv::INTER_LINEAR);
4167
cv::Mat blob = cv::dnn::blobFromImage(obj, 1.0, cv::Size(), cv::Scalar(), false, false);
4268

4369
m_net.setInput(blob);
4470
embedding = m_net.forward();
45-
std::cout << "embedding: " << embedding.size() << ", chans = " << embedding.channels() << std::endl;
71+
//std::cout << "embedding: " << embedding.size() << ", chans = " << embedding.channels() << std::endl;
4672
}
4773

4874
private:
4975
cv::dnn::Net m_net;
76+
cv::Size m_inputLayer{128, 256};
5077
};

src/Tracker/staple/staple_tracker.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ void STAPLE_TRACKER::getFeatureMap(cv::Mat &im_patch, const char* feature_type,
644644

645645
// out(:,:,1) = single(im_patch)/255 - 0.5;
646646

647-
float alpha = 1. / 255.0f;
647+
float alpha = 1.f / 255.0f;
648648
float betta = 0.5f;
649649

650650
typedef cv::Vec<float, 28> Vecf28;

src/Tracker/staple/staple_tracker.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ struct staple_cfg
2626
const char * feature_type = "fhog"; // "fhog", ""gray""
2727
float inner_padding = 0.2f; // defines inner area used to sample colors from the foreground
2828
float output_sigma_factor = 1/16.0f; // standard deviation for the desired translation filter output
29-
float lambda = 1e-3; // egularization weight
29+
float lambda = 1e-3f; // egularization weight
3030
float learning_rate_cf = 0.01f; // HOG model learning rate
3131
float merge_factor = 0.3f; // fixed interpolation factor - how to linearly combine the two responses
3232
const char * merge_method = "const_factor";

src/Tracker/track.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,16 +169,16 @@ track_t CTrack::CalcDistHist(const CRegion& reg, RegionEmbedding& embedding, cv:
169169

170170
///
171171
/// \brief CTrack::CalcCosine
172-
/// \param reg
172+
/// \param embedding
173173
/// \return
174174
///
175-
track_t CTrack::CalcCosine(const CRegion& reg, RegionEmbedding& embedding, cv::UMat currFrame) const
175+
track_t CTrack::CalcCosine(RegionEmbedding& embedding, cv::UMat currFrame) const
176176
{
177177
track_t res = 1;
178178
if (!embedding.m_embedding.empty() && !m_regionEmbedding.m_embedding.empty())
179179
{
180-
double xy = embedding.m_embedding.dot(m_regionEmbedding.m_embedding);
181-
double norm = sqrt(embedding.m_embDot * m_regionEmbedding.m_embDot) + 1e-6;
180+
double xy = embedding.m_embedding.dot(m_regionEmbedding.m_embedding);
181+
double norm = sqrt(embedding.m_embDot * m_regionEmbedding.m_embDot) + 1e-6;
182182
res = 0.5f * static_cast<float>(1.0 - xy / norm);
183183
}
184184
return res;
@@ -560,7 +560,7 @@ void CTrack::RectUpdate(const CRegion& region,
560560
{
561561
CreateExternalTracker(currFrame.channels());
562562

563-
cv::Rect2d lastRect(brect.x - roiRect.x, brect.y - roiRect.y, brect.width, brect.height);
563+
cv::Rect2d lastRect;
564564
if (m_staticFrame.empty())
565565
{
566566
int dx = 1;//m_predictionRect.width / 8;

src/Tracker/track.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,11 +302,11 @@ class CTrack
302302
///
303303
/// \brief CalcCosine
304304
/// Distance from 0 to 1 between objects embeddings on two N and N+1 frames
305-
/// \param reg
305+
/// \param embedding
306306
/// \param currFrame
307307
/// \return
308308
///
309-
track_t CalcCosine(const CRegion& reg, RegionEmbedding& embedding, cv::UMat currFrame) const;
309+
track_t CalcCosine(RegionEmbedding& embedding, cv::UMat currFrame) const;
310310

311311
cv::RotatedRect CalcPredictionEllipse(cv::Size_<track_t> minRadius) const;
312312
///

0 commit comments

Comments
 (0)