@@ -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// /
189191void 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+ }
0 commit comments