Skip to content

Commit 04a8b64

Browse files
committed
Fix bug with embeddings calculation
1 parent 714ae45 commit 04a8b64

4 files changed

Lines changed: 101 additions & 52 deletions

File tree

src/Tracker/Ctracker.cpp

Lines changed: 75 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,15 @@ void CTracker::UpdateTrackingState(const regions_t& regions,
7878
assignments_t assignment(N, -1); // Assignments regions -> tracks
7979

8080
std::vector<RegionEmbedding> regionEmbeddings;
81+
CalcEmbeddins(regionEmbeddings, regions, currFrame);
8182

8283
if (!m_tracks.empty())
8384
{
8485
// Distance matrix between all tracks to all regions
8586
distMatrix_t costMatrix(N * M);
8687
const track_t maxPossibleCost = static_cast<track_t>(currFrame.cols * currFrame.rows);
8788
track_t maxCost = 0;
88-
CreateDistaceMatrix(regions, regionEmbeddings, costMatrix, maxPossibleCost, maxCost, currFrame);
89+
CreateDistaceMatrix(regions, regionEmbeddings, costMatrix, maxPossibleCost, maxCost);
8990

9091
// Solving assignment problem (shortest paths)
9192
m_SPCalculator->Solve(costMatrix, N, M, assignment, maxCost);
@@ -161,6 +162,7 @@ void CTracker::UpdateTrackingState(const regions_t& regions,
161162
if (assignment[i] != -1) // If we have assigned detect, then update using its coordinates,
162163
{
163164
m_tracks[i]->SkippedFrames() = 0;
165+
std::cout << "Update track " << i << " for " << assignment[i] << " region, regionEmbeddings.size = " << regionEmbeddings.size() << std::endl;
164166
if (regionEmbeddings.empty())
165167
m_tracks[i]->Update(regions[assignment[i]],
166168
true, m_settings.m_maxTraceLength,
@@ -187,11 +189,10 @@ void CTracker::UpdateTrackingState(const regions_t& regions,
187189
/// \param maxCost
188190
///
189191
void CTracker::CreateDistaceMatrix(const regions_t& regions,
190-
std::vector<RegionEmbedding>& regionEmbeddings,
192+
const std::vector<RegionEmbedding>& regionEmbeddings,
191193
distMatrix_t& costMatrix,
192194
track_t maxPossibleCost,
193-
track_t& maxCost,
194-
cv::UMat currFrame)
195+
track_t& maxCost)
195196
{
196197
const size_t N = m_tracks.size(); // Tracking objects
197198
maxCost = 0;
@@ -269,29 +270,19 @@ void CTracker::CreateDistaceMatrix(const regions_t& regions,
269270
// Bhatacharia distance between histograms
270271
if (m_settings.m_distType[ind] > 0.0f && ind == tracking::DistHist)
271272
{
272-
if (regionEmbeddings.empty())
273-
regionEmbeddings.resize(regions.size());
274-
dist += m_settings.m_distType[ind] * track->CalcDistHist(reg, regionEmbeddings[j], currFrame);
273+
dist += m_settings.m_distType[ind] * track->CalcDistHist(regionEmbeddings[j]);
275274
}
276275
++ind;
277276

278277
// Cosine distance between embeddings
279-
if (m_settings.m_distType[ind] > 0.0f && ind == tracking::DistFeatureCos)
280-
{
281-
if (regionEmbeddings.empty())
282-
regionEmbeddings.resize(regions.size());
283-
if (regionEmbeddings[j].m_embedding.empty())
284-
{
285-
auto embCalc = m_embCalculators.find(reg.m_type);
286-
if (embCalc != std::end(m_embCalculators))
287-
{
288-
embCalc->second->Calc(currFrame, reg.m_brect, regionEmbeddings[j].m_embedding);
289-
regionEmbeddings[j].m_embDot = regionEmbeddings[j].m_embedding.dot(regionEmbeddings[j].m_embedding);
290-
}
291-
if (reg.m_type == track->LastRegion().m_type)
292-
dist += m_settings.m_distType[ind] * track->CalcCosine(regionEmbeddings[j], currFrame);
293-
}
294-
}
278+
if (m_settings.m_distType[ind] > 0.0f && ind == tracking::DistFeatureCos)
279+
{
280+
if (reg.m_type == track->LastRegion().m_type)
281+
{
282+
std::cout << "CalcCosine: " << TypeConverter::Type2Str(track->LastRegion().m_type) << ", reg = " << reg.m_brect << ", track = " << track->LastRegion().m_brect << std::endl;
283+
dist += m_settings.m_distType[ind] * track->CalcCosine(regionEmbeddings[j]);
284+
}
285+
}
295286
++ind;
296287
assert(ind == tracking::DistsCount);
297288
}
@@ -302,3 +293,64 @@ void CTracker::CreateDistaceMatrix(const regions_t& regions,
302293
}
303294
}
304295
}
296+
297+
///
298+
/// \brief CTracker::CalcEmbeddins
299+
/// \param regionEmbeddings
300+
/// \param regions
301+
/// \param currFrame
302+
///
303+
void CTracker::CalcEmbeddins(std::vector<RegionEmbedding>& regionEmbeddings, const regions_t& regions, cv::UMat currFrame) const
304+
{
305+
if (!regions.empty())
306+
{
307+
regionEmbeddings.resize(regions.size());
308+
// Bhatacharia distance between histograms
309+
if (m_settings.m_distType[tracking::DistHist] > 0.0f)
310+
{
311+
for (size_t j = 0; j < regions.size(); ++j)
312+
{
313+
int bins = 64;
314+
std::vector<int> histSize;
315+
std::vector<float> ranges;
316+
std::vector<int> channels;
317+
318+
for (int i = 0, stop = currFrame.channels(); i < stop; ++i)
319+
{
320+
histSize.push_back(bins);
321+
ranges.push_back(0);
322+
ranges.push_back(255);
323+
channels.push_back(i);
324+
}
325+
326+
std::vector<cv::UMat> regROI = { currFrame(regions[j].m_brect) };
327+
cv::calcHist(regROI, channels, cv::Mat(), regionEmbeddings[j].m_hist, histSize, ranges, false);
328+
cv::normalize(regionEmbeddings[j].m_hist, regionEmbeddings[j].m_hist, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());
329+
}
330+
}
331+
332+
// Cosine distance between embeddings
333+
if (m_settings.m_distType[tracking::DistFeatureCos] > 0.0f)
334+
{
335+
for (size_t j = 0; j < regions.size(); ++j)
336+
{
337+
if (regionEmbeddings[j].m_embedding.empty())
338+
{
339+
std::cout << "Search embCalc for " << TypeConverter::Type2Str(regions[j].m_type) << ": ";
340+
auto embCalc = m_embCalculators.find(regions[j].m_type);
341+
if (embCalc != std::end(m_embCalculators))
342+
{
343+
embCalc->second->Calc(currFrame, regions[j].m_brect, regionEmbeddings[j].m_embedding);
344+
regionEmbeddings[j].m_embDot = regionEmbeddings[j].m_embedding.dot(regionEmbeddings[j].m_embedding);
345+
346+
std::cout << "Founded! m_embedding = " << regionEmbeddings[j].m_embedding.size() << ", m_embDot = " << regionEmbeddings[j].m_embDot << std::endl;
347+
}
348+
else
349+
{
350+
std::cout << "Not found" << std::endl;
351+
}
352+
}
353+
}
354+
}
355+
}
356+
}

src/Tracker/Ctracker.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class CTracker
8888
std::unique_ptr<ShortPathCalculator> m_SPCalculator;
8989
std::map<objtype_t, std::shared_ptr<EmbeddingsCalculator>> m_embCalculators;
9090

91-
void CreateDistaceMatrix(const regions_t& regions, std::vector<RegionEmbedding>& regionEmbeddings, distMatrix_t& costMatrix, track_t maxPossibleCost, track_t& maxCost, cv::UMat currFrame);
91+
void CreateDistaceMatrix(const regions_t& regions, const std::vector<RegionEmbedding>& regionEmbeddings, distMatrix_t& costMatrix, track_t maxPossibleCost, track_t& maxCost);
9292
void UpdateTrackingState(const regions_t& regions, cv::UMat currFrame, float fps);
93+
void CalcEmbeddins(std::vector<RegionEmbedding>& regionEmbeddings, const regions_t& regions, cv::UMat currFrame) const;
9394
};

src/Tracker/track.cpp

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -129,32 +129,13 @@ track_t CTrack::CalcDistJaccard(const CRegion& reg) const
129129

130130
///
131131
/// \brief CTrack::CalcDistHist
132-
/// \param reg
132+
/// \param embedding
133133
/// \return
134134
///
135-
track_t CTrack::CalcDistHist(const CRegion& reg, RegionEmbedding& embedding, cv::UMat currFrame) const
135+
track_t CTrack::CalcDistHist(const RegionEmbedding& embedding) const
136136
{
137137
track_t res = 1;
138138

139-
if (embedding.m_hist.empty())
140-
{
141-
int bins = 64;
142-
std::vector<int> histSize;
143-
std::vector<float> ranges;
144-
std::vector<int> channels;
145-
146-
for (int i = 0, stop = currFrame.channels(); i < stop; ++i)
147-
{
148-
histSize.push_back(bins);
149-
ranges.push_back(0);
150-
ranges.push_back(255);
151-
channels.push_back(i);
152-
}
153-
154-
std::vector<cv::UMat> regROI = { currFrame(reg.m_brect) };
155-
cv::calcHist(regROI, channels, cv::Mat(), embedding.m_hist, histSize, ranges, false);
156-
cv::normalize(embedding.m_hist, embedding.m_hist, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());
157-
}
158139
if (!embedding.m_hist.empty() && !m_regionEmbedding.m_hist.empty())
159140
{
160141
#if (((CV_VERSION_MAJOR == 4) && (CV_VERSION_MINOR < 1)) || (CV_VERSION_MAJOR == 3))
@@ -164,6 +145,12 @@ track_t CTrack::CalcDistHist(const CRegion& reg, RegionEmbedding& embedding, cv:
164145
res = static_cast<track_t>(cv::compareHist(embedding.m_hist, m_regionEmbedding.m_hist, cv::HISTCMP_BHATTACHARYYA));
165146
#endif
166147
}
148+
else
149+
{
150+
assert(0);
151+
CV_Assert(!embedding.m_hist.empty());
152+
CV_Assert(!m_regionEmbedding.m_hist.empty());
153+
}
167154
return res;
168155
}
169156

@@ -172,15 +159,26 @@ track_t CTrack::CalcDistHist(const CRegion& reg, RegionEmbedding& embedding, cv:
172159
/// \param embedding
173160
/// \return
174161
///
175-
track_t CTrack::CalcCosine(RegionEmbedding& embedding, cv::UMat currFrame) const
162+
track_t CTrack::CalcCosine(const RegionEmbedding& embedding) const
176163
{
177164
track_t res = 1;
178165
if (!embedding.m_embedding.empty() && !m_regionEmbedding.m_embedding.empty())
179166
{
180167
double xy = embedding.m_embedding.dot(m_regionEmbedding.m_embedding);
181168
double norm = sqrt(embedding.m_embDot * m_regionEmbedding.m_embDot) + 1e-6;
182-
res = 0.5f * static_cast<float>(1.0 - xy / norm);
169+
//res = 1.f - 0.5f * fabs(static_cast<float>(xy / norm));
170+
res = 0.5f * static_cast<float>(1.0 - xy / norm);
171+
if (res < 0)
172+
res += 1;
173+
//res = static_cast<float>(-xy / norm);
183174
}
175+
else
176+
{
177+
assert(0);
178+
CV_Assert(!embedding.m_embedding.empty());
179+
CV_Assert(!m_regionEmbedding.m_embedding.empty());
180+
}
181+
std::cout << "CalcCosine: " << embedding.m_embedding.size() << " - " << m_regionEmbedding.m_embedding.size() << " = " << res << std::endl;
184182
return res;
185183
}
186184

src/Tracker/track.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -294,19 +294,17 @@ class CTrack
294294
///
295295
/// \brief CalcDistHist
296296
/// Distance from 0 to 1 between objects histogramms on two N and N+1 frames
297-
/// \param reg
298-
/// \param currFrame
297+
/// \param embedding
299298
/// \return
300299
///
301-
track_t CalcDistHist(const CRegion& reg, RegionEmbedding& embedding, cv::UMat currFrame) const;
300+
track_t CalcDistHist(const RegionEmbedding& embedding) const;
302301
///
303302
/// \brief CalcCosine
304303
/// Distance from 0 to 1 between objects embeddings on two N and N+1 frames
305304
/// \param embedding
306-
/// \param currFrame
307305
/// \return
308306
///
309-
track_t CalcCosine(RegionEmbedding& embedding, cv::UMat currFrame) const;
307+
track_t CalcCosine(const RegionEmbedding& embedding) const;
310308

311309
cv::RotatedRect CalcPredictionEllipse(cv::Size_<track_t> minRadius) const;
312310
///

0 commit comments

Comments
 (0)