From 4973a5e80e34928ce49c626f2b5a1d2086226814 Mon Sep 17 00:00:00 2001 From: Inki Dae Date: Fri, 5 Jul 2024 14:55:09 +0900 Subject: [PATCH] task_manger: fix AutoZoom not working issue Fix an bug that AutoZoom service doesn't work since the patch, "task_manager: introduce _status member in each node" The problem happened when AutoZoom service is performed. AutoZoom service can zoom in or output according to detected results. However, the patch made zoom-in to work even no detected result. As for this, this patch fixes the problem by clearing _results of each node class at top of invoke() function. Change-Id: I4509e6c17bddc84ef377283111e6f0ea02909d65 Signed-off-by: Inki Dae --- services/auto_zoom/include/DataTypes.h | 1 + services/auto_zoom/src/AutoZoom.cpp | 19 +++++++++++++++---- services/task_manager/include/BridgeNode.h | 4 ++-- services/task_manager/include/EndpointNode.h | 3 +-- services/task_manager/src/InferenceNode.cpp | 4 ++-- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/services/auto_zoom/include/DataTypes.h b/services/auto_zoom/include/DataTypes.h index 9918322..8474b53 100644 --- a/services/auto_zoom/include/DataTypes.h +++ b/services/auto_zoom/include/DataTypes.h @@ -32,6 +32,7 @@ enum class AutoZoomResultType { X, Y, WIDTH, HEIGHT }; struct AutoZoomResult : public ServiceBaseResultType { AutoZoomResult() : ServiceBaseResultType(ServiceResultType::AUTO_ZOOM) {} + bool is_valid { false }; unsigned int frame_number {}; unsigned int num_of_objects {}; Rect merged_rect; diff --git a/services/auto_zoom/src/AutoZoom.cpp b/services/auto_zoom/src/AutoZoom.cpp index 2bae39c..8e2f1d5 100644 --- a/services/auto_zoom/src/AutoZoom.cpp +++ b/services/auto_zoom/src/AutoZoom.cpp @@ -264,15 +264,25 @@ void AutoZoom::updateResult(BaseDataType &in_data) AutoZoomResult autozoom_result; for (auto &output : _taskManager->output()) { + if (output->_is_empty) + continue; + if (output->_type != ResultType::OBJECT_DETECTION && output->_type != ResultType::FACE_DETECTION && output->_type != ResultType::FACE_RECOGNITION) throw InvalidParameter("Invalid result type"); + if (output->_type == ResultType::FACE_RECOGNITION) { + auto &frResult = dynamic_cast(*output); + SINGLEO_LOGD("label : %s", frResult._label.c_str()); + continue; + } + if (output->_type == ResultType::OBJECT_DETECTION || output->_type == ResultType::FACE_DETECTION) { vector &rects = dynamic_cast(*output)._rects; autozoom_result.frame_number = output->_frame_number; autozoom_result.num_of_objects = rects.size(); + autozoom_result.is_valid = true; for (size_t idx = 0; idx < rects.size(); ++idx) { SINGLEO_LOGD("%dx%d ~ %dx%d", rects[idx].left, rects[idx].top, rects[idx].right, rects[idx].bottom); @@ -295,13 +305,14 @@ void AutoZoom::updateResult(BaseDataType &in_data) SINGLEO_LOGW("No detected objects."); return; } - - } else if (output->_type == ResultType::FACE_RECOGNITION) { - auto &frResult = dynamic_cast(*output); - SINGLEO_LOGD("label : %s", frResult._label.c_str()); } } + // Do not push detected result to async manager to prevent from trying zooming-in + // if there is no detected objects. + if (!autozoom_result.is_valid) + return; + if (_async_mode) _async_manager->pushOutput(autozoom_result); else diff --git a/services/task_manager/include/BridgeNode.h b/services/task_manager/include/BridgeNode.h index dfa8a18..cdc545e 100644 --- a/services/task_manager/include/BridgeNode.h +++ b/services/task_manager/include/BridgeNode.h @@ -44,6 +44,7 @@ public: if (!_cb) throw singleo::exception::InvalidOperation("Bridge node callback is not set"); + _results.clear(); _status = NodeStatus::INVALID; // If at least one dependency is valid, bridge node is valid. for (auto &dep : this->getDependencies()) { @@ -52,11 +53,10 @@ public: break; } } + if (_status == NodeStatus::INVALID) return; - _results.clear(); - for (const auto &d : _dependencies) std::copy(d->results().begin(), d->results().end(), std::back_inserter(_results)); diff --git a/services/task_manager/include/EndpointNode.h b/services/task_manager/include/EndpointNode.h index 0c30e3a..af13aff 100644 --- a/services/task_manager/include/EndpointNode.h +++ b/services/task_manager/include/EndpointNode.h @@ -40,6 +40,7 @@ public: void invoke() final { + _results.clear(); _status = NodeStatus::INVALID; // If at least one dependency is valid, endpoint node is valid. for (auto &dep : this->getDependencies()) { @@ -51,8 +52,6 @@ public: if (_status == NodeStatus::INVALID) return; - _results.clear(); - for (auto &d : _dependencies) std::copy(d->results().begin(), d->results().end(), std::back_inserter(_results)); diff --git a/services/task_manager/src/InferenceNode.cpp b/services/task_manager/src/InferenceNode.cpp index df367a8..31aae47 100644 --- a/services/task_manager/src/InferenceNode.cpp +++ b/services/task_manager/src/InferenceNode.cpp @@ -40,6 +40,8 @@ void InferenceNode::configure() void InferenceNode::invoke() { + _results.clear(); + if (_status == NodeStatus::INVALID) return; @@ -58,8 +60,6 @@ void InferenceNode::invoke() // Inference request has been completed so release input data. _inputBuffer->release(); - _results.clear(); - _status = NodeStatus::INVALID; if (!_task->result()._is_empty) { _resultMutex.lock(); -- 2.34.1