Skip to content

Commit 0aa0437

Browse files
committed
Fixed cosine distance between embeddings
1 parent 6b36daf commit 0aa0437

5 files changed

Lines changed: 35 additions & 20 deletions

File tree

example/examples.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,6 @@ class YoloDarknetExample final : public VideoExample
680680
if (!m_trackerSettingsLoaded)
681681
{
682682
bool useDeepSORT = false;
683-
684683
if (useDeepSORT)
685684
{
686685
#ifdef _WIN32
@@ -689,16 +688,18 @@ class YoloDarknetExample final : public VideoExample
689688
std::string pathToModel = "../data/";
690689
#endif
691690

691+
#if 1
692692
m_trackerSettings.m_embeddings.emplace_back(pathToModel + "open_model_zoo/person-reidentification-retail-0286/FP16-INT8/person-reidentification-retail-0286.xml",
693693
pathToModel + "open_model_zoo/person-reidentification-retail-0286/FP16-INT8/person-reidentification-retail-0286.bin",
694694
cv::Size(128, 256),
695695
std::vector<ObjectTypes>{ ObjectTypes::obj_person });
696+
#endif
696697

697-
#if 1
698+
#if 0
698699
m_trackerSettings.m_embeddings.emplace_back(pathToModel + "open_model_zoo/vehicle-reid-0001/osnet_ain_x1_0_vehicle_reid.xml",
699700
pathToModel + "open_model_zoo/vehicle-reid-0001/osnet_ain_x1_0_vehicle_reid.bin",
700701
cv::Size(208, 208),
701-
std::vector<ObjectTypes>{ ObjectTypes::obj_car, ObjectTypes::obj_bus, ObjectTypes::obj_truck });
702+
std::vector<ObjectTypes>{ ObjectTypes::obj_car, ObjectTypes::obj_bus, ObjectTypes::obj_truck, ObjectTypes::obj_vehicle });
702703
#endif
703704

704705
std::array<track_t, tracking::DistsCount> distType{
@@ -719,11 +720,11 @@ class YoloDarknetExample final : public VideoExample
719720
m_trackerSettings.m_kalmanType = tracking::KalmanLinear;
720721
m_trackerSettings.m_filterGoal = tracking::FilterRect;
721722
m_trackerSettings.m_lostTrackType = useDeepSORT ? tracking::TrackNone : tracking::TrackCSRT; // Use visual objects tracker for collisions resolving. Used if m_filterGoal == tracking::FilterRect
722-
m_trackerSettings.m_matchType = tracking::MatchBipart;
723+
m_trackerSettings.m_matchType = tracking::MatchHungrian;
723724
m_trackerSettings.m_useAcceleration = false; // Use constant acceleration motion model
724725
m_trackerSettings.m_dt = m_trackerSettings.m_useAcceleration ? 0.05f : 0.4f; // Delta time for Kalman filter
725726
m_trackerSettings.m_accelNoiseMag = 0.2f; // Accel noise magnitude for Kalman filter
726-
m_trackerSettings.m_distThres = 0.8f; // Distance threshold between region and object on two frames
727+
m_trackerSettings.m_distThres = useDeepSORT ? 0.7f : 0.8f; // Distance threshold between region and object on two frames
727728
#if 0
728729
m_trackerSettings.m_minAreaRadiusPix = frame.rows / 20.f;
729730
#else

src/Tracker/Ctracker.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ void CTracker::UpdateTrackingState(const regions_t& regions,
344344

345345
// Update Kalman Filters state
346346
const ptrdiff_t stop_i = static_cast<ptrdiff_t>(assignment.size());
347-
#pragma omp parallel for
347+
//#pragma omp parallel for
348348
for (ptrdiff_t i = 0; i < stop_i; ++i)
349349
{
350350
// If track updated less than one time, than filter state is not correct.
@@ -474,8 +474,17 @@ void CTracker::CreateDistaceMatrix(const regions_t& regions,
474474
{
475475
if (reg.m_type == track->LastRegion().m_type)
476476
{
477-
std::cout << "CalcCosine: " << TypeConverter::Type2Str(track->LastRegion().m_type) << ", reg = " << reg.m_brect << ", track = " << track->LastRegion().m_brect << std::endl;
478-
dist += m_settings.m_distType[ind] * track->CalcCosine(regionEmbeddings[j]);
477+
auto resCos = track->CalcCosine(regionEmbeddings[j]);
478+
if (resCos)
479+
{
480+
dist += m_settings.m_distType[ind] * resCos.value();
481+
//std::cout << "CalcCosine: " << TypeConverter::Type2Str(track->LastRegion().m_type) << ", reg = " << reg.m_brect << ", track = " << track->LastRegion().m_brect << ": res = " << resCos.value() << ", dist = " << dist << std::endl;
482+
}
483+
else
484+
{
485+
dist /= m_settings.m_distType[ind];
486+
//std::cout << "CalcCosine: " << TypeConverter::Type2Str(track->LastRegion().m_type) << ", reg = " << reg.m_brect << ", track = " << track->LastRegion().m_brect << ": res = 1, weight = " << m_settings.m_distType[ind] << ", dist = " << dist << std::endl;
487+
}
479488
}
480489
}
481490
++ind;
@@ -531,18 +540,18 @@ void CTracker::CalcEmbeddins(std::vector<RegionEmbedding>& regionEmbeddings, con
531540
{
532541
if (regionEmbeddings[j].m_embedding.empty())
533542
{
534-
std::cout << "Search embCalc for " << TypeConverter::Type2Str(regions[j].m_type) << ": ";
543+
//std::cout << "Search embCalc for " << TypeConverter::Type2Str(regions[j].m_type) << ": ";
535544
auto embCalc = m_embCalculators.find(regions[j].m_type);
536545
if (embCalc != std::end(m_embCalculators))
537546
{
538547
embCalc->second->Calc(currFrame, regions[j].m_brect, regionEmbeddings[j].m_embedding);
539548
regionEmbeddings[j].m_embDot = regionEmbeddings[j].m_embedding.dot(regionEmbeddings[j].m_embedding);
540549

541-
std::cout << "Founded! m_embedding = " << regionEmbeddings[j].m_embedding.size() << ", m_embDot = " << regionEmbeddings[j].m_embDot << std::endl;
550+
//std::cout << "Founded! m_embedding = " << regionEmbeddings[j].m_embedding.size() << ", m_embDot = " << regionEmbeddings[j].m_embDot << std::endl;
542551
}
543552
else
544553
{
545-
std::cout << "Not found" << std::endl;
554+
//std::cout << "Not found" << std::endl;
546555
}
547556
}
548557
}

src/Tracker/EmbeddingsCalculator.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class EmbeddingsCalculator
7373
Clamp(rect.y, rect.height, img.rows);
7474

7575
cv::UMat obj;
76-
cv::resize(img(rect), obj, m_inputLayer, 0., 0., cv::INTER_LINEAR);
76+
cv::resize(img(rect), obj, m_inputLayer, 0., 0., cv::INTER_LANCZOS4);
7777
cv::Mat blob = cv::dnn::blobFromImage(obj, 1.0, cv::Size(), cv::Scalar(), false, false);
7878

7979
m_net.setInput(blob);

src/Tracker/track.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -163,27 +163,31 @@ track_t CTrack::CalcDistHist(const RegionEmbedding& embedding) const
163163
/// \param embedding
164164
/// \return
165165
///
166-
track_t CTrack::CalcCosine(const RegionEmbedding& embedding) const
166+
std::optional<track_t> CTrack::CalcCosine(const RegionEmbedding& embedding) const
167167
{
168168
track_t res = 1;
169169
if (!embedding.m_embedding.empty() && !m_regionEmbedding.m_embedding.empty())
170170
{
171171
double xy = embedding.m_embedding.dot(m_regionEmbedding.m_embedding);
172172
double norm = sqrt(embedding.m_embDot * m_regionEmbedding.m_embDot) + 1e-6;
173-
//res = 1.f - 0.5f * fabs(static_cast<float>(xy / norm));
173+
#if 1
174+
res = 1.f - 0.5f * fabs(static_cast<float>(xy / norm));
175+
#else
174176
res = 0.5f * static_cast<float>(1.0 - xy / norm);
175177
if (res < 0)
176178
res += 1;
177179
//res = static_cast<float>(-xy / norm);
180+
#endif
181+
//std::cout << "CTrack::CalcCosine: " << embedding.m_embedding.size() << " - " << m_regionEmbedding.m_embedding.size() << " = " << res << std::endl;
182+
return res;
178183
}
179184
else
180185
{
181-
assert(0);
182-
CV_Assert(!embedding.m_embedding.empty());
183-
CV_Assert(!m_regionEmbedding.m_embedding.empty());
186+
//assert(0);
187+
//CV_Assert(!embedding.m_embedding.empty());
188+
//CV_Assert(!m_regionEmbedding.m_embedding.empty());
189+
return {};
184190
}
185-
std::cout << "CalcCosine: " << embedding.m_embedding.size() << " - " << m_regionEmbedding.m_embedding.size() << " = " << res << std::endl;
186-
return res;
187191
}
188192

189193
///

src/Tracker/track.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <deque>
55
#include <memory>
66
#include <array>
7+
#include <optional>
78

89
#ifdef USE_OCV_KCF
910
#include <opencv2/tracking.hpp>
@@ -84,7 +85,7 @@ class CTrack
8485
/// \param embedding
8586
/// \return
8687
///
87-
track_t CalcCosine(const RegionEmbedding& embedding) const;
88+
std::optional<track_t> CalcCosine(const RegionEmbedding& embedding) const;
8889

8990
cv::RotatedRect CalcPredictionEllipse(cv::Size_<track_t> minRadius) const;
9091
///

0 commit comments

Comments
 (0)