Skip to content

Commit 377f3d8

Browse files
committed
Refactoring work with frames queue
1 parent 6651697 commit 377f3d8

4 files changed

Lines changed: 72 additions & 32 deletions

File tree

async_detector/AsyncDetector.cpp

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ AsyncDetector::AsyncDetector(const cv::CommandLineParser& parser)
6464
///
6565
AsyncDetector::~AsyncDetector()
6666
{
67-
6867
}
6968

7069
///
@@ -90,6 +89,8 @@ void AsyncDetector::Process()
9089

9190
for (; !stopFlag;)
9291
{
92+
int64 t1 = cv::getTickCount();
93+
9394
// Show frame after detecting and tracking
9495
frame_ptr processedFrame = m_framesQue.GetFirstProcessedFrame();
9596
if (!processedFrame)
@@ -101,14 +102,17 @@ void AsyncDetector::Process()
101102
int64 t2 = cv::getTickCount();
102103

103104
allTime += t2 - processedFrame->m_dt;
104-
int currTime = cvRound(1000 * (t2 - processedFrame->m_dt) / freq);
105+
int currTime = cvRound(1000 * (t2 - t1) / freq);
105106

106107
DrawData(processedFrame, framesCounter, currTime);
107108

108-
if (!m_outFile.empty() && !writer.isOpened())
109-
writer.open(m_outFile, cv::VideoWriter::fourcc('H', 'F', 'Y', 'U'), m_fps, processedFrame->m_frame.size(), true);
110-
if (writer.isOpened())
111-
writer << processedFrame->m_frame;
109+
if (!m_outFile.empty())
110+
{
111+
if (!writer.isOpened())
112+
writer.open(m_outFile, cv::VideoWriter::fourcc('H', 'F', 'Y', 'U'), m_fps, processedFrame->m_frame.size(), true);
113+
if (writer.isOpened())
114+
writer << processedFrame->m_frame;
115+
}
112116

113117
#ifndef SILENT_WORK
114118
cv::imshow("Video", processedFrame->m_frame);
@@ -216,7 +220,7 @@ void AsyncDetector::DrawData(frame_ptr frameInfo, int framesCounter, int currTim
216220
{
217221
std::cout << "Frame " << framesCounter << ": ";
218222
int id = frameInfo->m_inDetector.load();
219-
if (id > 0)
223+
if (id != FrameInfo::StateNotProcessed)
220224
std::cout << "(" << id << ") detects = " << frameInfo->m_regions.size() << ", ";
221225
std::cout << "tracks = " << frameInfo->m_tracks.size() << ", time = " << currTime << std::endl;
222226
}
@@ -242,6 +246,26 @@ void AsyncDetector::DrawData(frame_ptr frameInfo, int framesCounter, int currTim
242246
cv::Size labelSize = cv::getTextSize(label, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
243247

244248
cv::Rect brect = track.m_rrect.boundingRect();
249+
if (brect.x < 0)
250+
{
251+
brect.width = std::min(brect.width, frameInfo->m_frame.cols - 1);
252+
brect.x = 0;
253+
}
254+
else if (brect.x + brect.width >= frameInfo->m_frame.cols)
255+
{
256+
brect.x = std::max(0, frameInfo->m_frame.cols - brect.width - 1);
257+
brect.width = std::min(brect.width, frameInfo->m_frame.cols - 1);
258+
}
259+
if (brect.y - labelSize.height < 0)
260+
{
261+
brect.height = std::min(brect.height, frameInfo->m_frame.rows - 1);
262+
brect.y = labelSize.height;
263+
}
264+
else if (brect.y + brect.height >= frameInfo->m_frame.rows)
265+
{
266+
brect.y = std::max(0, frameInfo->m_frame.rows - brect.height - 1);
267+
brect.height = std::min(brect.height, frameInfo->m_frame.rows - 1);
268+
}
245269
DrawFilledRect(frameInfo->m_frame, cv::Rect(cv::Point(brect.x, brect.y - labelSize.height), cv::Size(labelSize.width, labelSize.height + baseLine)), cv::Scalar(200, 200, 200), 150);
246270
cv::putText(frameInfo->m_frame, label, brect.tl(), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0));
247271
}
@@ -287,8 +311,8 @@ void AsyncDetector::CaptureThread(std::string fileName, int startFrame, float* f
287311
detectorConfig.emplace("modelConfiguration", pathToModel + "yolov3-tiny.cfg");
288312
detectorConfig.emplace("modelBinary", pathToModel + "yolov3-tiny.weights");
289313
#else
290-
detectorConfig.emplace("modelConfiguration", pathToModel + "yolov3.cfg");
291-
detectorConfig.emplace("modelBinary", pathToModel + "yolov3.weights");
314+
detectorConfig.emplace("modelConfiguration", pathToModel + "yolov4-csp.cfg");
315+
detectorConfig.emplace("modelBinary", pathToModel + "yolov4-csp.weights");
292316
#endif
293317
detectorConfig.emplace("classNames", pathToModel + "coco.names");
294318
detectorConfig.emplace("confidenceThreshold", "0.3");
@@ -312,7 +336,7 @@ void AsyncDetector::CaptureThread(std::string fileName, int startFrame, float* f
312336
trackerSettings.SetDistance(tracking::DistCenters);
313337
trackerSettings.m_kalmanType = tracking::KalmanLinear;
314338
trackerSettings.m_filterGoal = tracking::FilterRect;
315-
trackerSettings.m_lostTrackType = tracking::TrackNone; // Use KCF tracker for collisions resolving. Used if m_filterGoal == tracking::FilterRect
339+
trackerSettings.m_lostTrackType = tracking::TrackCSRT; // Use KCF tracker for collisions resolving. Used if m_filterGoal == tracking::FilterRect
316340
trackerSettings.m_matchType = tracking::MatchHungrian;
317341
trackerSettings.m_dt = 0.2f; // Delta time for Kalman filter
318342
trackerSettings.m_accelNoiseMag = 0.3f; // Accel noise magnitude for Kalman filter
@@ -360,8 +384,8 @@ void AsyncDetector::CaptureThread(std::string fileName, int startFrame, float* f
360384

361385
framesQue->AddNewFrame(frameInfo, 15);
362386

363-
#if 0
364-
std::this_thread::sleep_for(std::chrono::milliseconds(1000 / cvRound(*fps)));
387+
#if 1
388+
std::this_thread::sleep_for(std::chrono::milliseconds(1000 / cvRound(*fps) - 1));
365389
#else
366390
std::this_thread::sleep_for(std::chrono::milliseconds(1));
367391
#endif
@@ -401,7 +425,7 @@ void AsyncDetector::DetectThread(const config_t& config, cv::Mat firstFrame, Fra
401425
const regions_t& regions = detector->GetDetects();
402426
frameInfo->m_regions.assign(regions.begin(), regions.end());
403427

404-
frameInfo->m_inDetector.store(2);
428+
frameInfo->m_inDetector.store(FrameInfo::StateCompleted);
405429
framesQue->Signal(frameInfo->m_dt);
406430
}
407431
}
@@ -423,7 +447,7 @@ void AsyncDetector::TrackingThread(const TrackerSettings& settings, FramesQueue*
423447
tracker->Update(frameInfo->m_regions, frameInfo->m_clFrame, frameInfo->m_fps);
424448

425449
frameInfo->m_tracks = tracker->GetTracks();
426-
frameInfo->m_inTracker.store(2);
450+
frameInfo->m_inTracker.store(FrameInfo::StateCompleted);
427451
framesQue->Signal(frameInfo->m_dt);
428452
}
429453
}

async_detector/AsyncDetector.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,16 @@ struct FrameInfo
2727
float m_fps = 0;
2828
size_t m_frameInd = 0;
2929

30-
std::atomic<int> m_inDetector; // 0 - not in Detector, 1 - detector started processing, 2 - objects was detected
30+
static constexpr int StateNotProcessed = 0;
31+
static constexpr int StateInProcess = 1;
32+
static constexpr int StateCompleted = 2;
33+
static constexpr int StateSkipped = 3;
34+
35+
std::atomic<int> m_inDetector; // 0 - not in Detector, 1 - detector started processing, 2 - objects was detected, 3 - detector skip this frame
3136
std::atomic<int> m_inTracker; // 0 - not in Tracker, 1 - tracker started processing, 2 - objects was tracked
3237

3338
FrameInfo(size_t frameInd)
34-
: m_frameInd(frameInd), m_inDetector(0), m_inTracker(0)
39+
: m_frameInd(frameInd), m_inDetector(StateNotProcessed), m_inTracker(StateNotProcessed)
3540
{
3641
}
3742
};

async_detector/Queue.h

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,11 @@ class FramesQueue
8989
size_t i = 0;
9090
for (auto it : m_que)
9191
{
92-
if (it->m_inDetector.load() && it->m_inTracker.load())
92+
if (it->m_inDetector.load() != FrameInfo::StateNotProcessed && it->m_inTracker.load() != FrameInfo::StateNotProcessed)
9393
std::cout << i << " d" << it->m_inDetector.load() << " t" << it->m_inTracker.load() << "; ";
94-
else if (it->m_inDetector.load())
94+
else if (it->m_inDetector.load() != FrameInfo::StateNotProcessed)
9595
std::cout << i << " d" << it->m_inDetector.load() << "; ";
96-
else if (it->m_inTracker.load())
96+
else if (it->m_inTracker.load() != FrameInfo::StateNotProcessed)
9797
std::cout << i << " t" << it->m_inTracker.load() << "; ";
9898
else
9999
std::cout << i << "; ";
@@ -113,7 +113,7 @@ class FramesQueue
113113
QUE_LOG << "GetLastUndetectedFrame start" << std::endl;
114114
#endif
115115
std::unique_lock<std::mutex> lock(m_mutex);
116-
while (m_que.empty() || m_que.back()->m_inDetector.load())
116+
while (m_que.empty() || m_que.back()->m_inDetector.load() != FrameInfo::StateNotProcessed)
117117
{
118118
if (m_break.load())
119119
break;
@@ -124,10 +124,20 @@ class FramesQueue
124124
if (!m_break.load())
125125
{
126126
frame_ptr frameInfo = m_que.back();
127-
assert(frameInfo->m_inDetector.load() == 0);
128-
assert(frameInfo->m_inTracker.load());
129-
frameInfo->m_inDetector.store(1);
127+
assert(frameInfo->m_inDetector.load() == FrameInfo::StateNotProcessed);
128+
assert(frameInfo->m_inTracker.load() == FrameInfo::StateNotProcessed);
129+
frameInfo->m_inDetector.store(FrameInfo::StateInProcess);
130+
131+
queue_t::reverse_iterator it = m_que.rbegin();
132+
for (++it; it != m_que.rend(); ++it)
133+
{
134+
if ((*it)->m_inDetector.load() == FrameInfo::StateNotProcessed)
135+
(*it)->m_inDetector.store(FrameInfo::StateSkipped);
136+
else
137+
break;
138+
}
130139
#if SHOW_QUE_LOG
140+
PrintQue();
131141
QUE_LOG << "GetLastUndetectedFrame end: " << frameInfo->m_dt << ", frameInd " << frameInfo->m_frameInd << std::endl;
132142
#endif
133143
return frameInfo;
@@ -144,10 +154,11 @@ class FramesQueue
144154
queue_t::iterator res_it = m_que.end();
145155
for (queue_t::iterator it = m_que.begin(); it != m_que.end(); ++it)
146156
{
147-
if ((*it)->m_inDetector.load() == 1)
148-
break;
149-
150-
else if ((*it)->m_inTracker.load() == 0)
157+
if ((*it)->m_inDetector.load() == FrameInfo::StateInProcess || (*it)->m_inDetector.load() == FrameInfo::StateNotProcessed)
158+
{
159+
break;
160+
}
161+
else if ((*it)->m_inTracker.load() == FrameInfo::StateNotProcessed)
151162
{
152163
res_it = it;
153164
break;
@@ -179,9 +190,9 @@ class FramesQueue
179190
if (!m_break.load())
180191
{
181192
frame_ptr frameInfo = *it;
182-
assert(frameInfo->m_inTracker.load() == 0);
183-
assert(frameInfo->m_inDetector.load() != 1);
184-
frameInfo->m_inTracker.store(1);
193+
assert(frameInfo->m_inTracker.load() == FrameInfo::StateNotProcessed);
194+
assert(frameInfo->m_inDetector.load() != FrameInfo::StateInProcess && frameInfo->m_inDetector.load() != FrameInfo::StateNotProcessed);
195+
frameInfo->m_inTracker.store(FrameInfo::StateInProcess);
185196
#if SHOW_QUE_LOG
186197
QUE_LOG << "GetFirstDetectedFrame end: " << frameInfo->m_dt << ", frameInd " << frameInfo->m_frameInd << std::endl;
187198
#endif
@@ -200,7 +211,7 @@ class FramesQueue
200211
QUE_LOG << "GetFirstProcessedFrame start" << std::endl;
201212
#endif
202213
std::unique_lock<std::mutex> lock(m_mutex);
203-
while (m_que.empty() || m_que.front()->m_inTracker.load() != 2)
214+
while (m_que.empty() || m_que.front()->m_inTracker.load() != FrameInfo::StateCompleted)
204215
{
205216
if (m_break.load())
206217
break;

example/examples.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -826,7 +826,7 @@ class YoloTensorRTExample : public VideoExample
826826
config.emplace("modelConfiguration", pathToModel + "yolov4.cfg");
827827
config.emplace("modelBinary", pathToModel + "yolov4.weights");
828828
config.emplace("confidenceThreshold", "0.8");
829-
config.emplace("inference_precison", "FP32");
829+
config.emplace("inference_precison", "FP16");
830830
config.emplace("net_type", "YOLOV4");
831831
config.emplace("maxBatch", "1");
832832
config.emplace("maxCropRatio", "-1");

0 commit comments

Comments
 (0)