#ifndef __SINGLEO_COMMON_TYPES_H__
#define __SINGLEO_COMMON_TYPES_H__
+#include <memory>
#include <cstring>
#include <vector>
#include "SingleoLog.h"
{}
virtual ~BaseResultType()
{}
+
+ virtual std::shared_ptr<BaseResultType> clone() = 0;
};
struct OdResultType : public BaseResultType {
OdResultType() : BaseResultType(ResultType::OBJECT_DETECTION)
{}
std::vector<Rect> _rects;
+
+ std::shared_ptr<BaseResultType> clone() override
+ {
+ return std::make_shared<OdResultType>(*this);
+ }
};
struct FdResultType : public BaseResultType {
FdResultType() : BaseResultType(ResultType::FACE_DETECTION)
{}
std::vector<Rect> _rects;
+
+ std::shared_ptr<BaseResultType> clone() override
+ {
+ return std::make_shared<FdResultType>(*this);
+ }
};
struct FldResultType : public BaseResultType {
FldResultType() : BaseResultType(ResultType::FACE_LANDMARK)
{}
std::vector<Point> _points;
+
+ std::shared_ptr<BaseResultType> clone() override
+ {
+ return std::make_shared<FldResultType>(*this);
+ }
};
enum class ServiceType { NONE, AUTO_ZOOM };
if (!_cb)
throw singleo::exception::InvalidOperation("Bridge node callback is not set");
+ _results.clear();
+
+ for (const auto &d : _dependencies)
+ std::copy(d->results().begin(), d->results().end(), std::back_inserter(_results));
+
_cb(this);
}
};
virtual void configure() = 0;
virtual void invoke() = 0;
void setCb(const NodeCb &cb);
- std::vector<std::shared_ptr<BaseResultType> > &getResults();
- void addResult(std::shared_ptr<BaseResultType> result);
- void clearResults();
+ std::vector<std::shared_ptr<BaseResultType> > &results() override;
};
}
void invoke() final
{
+ _results.clear();
+
+ for (auto &d : _dependencies)
+ std::copy(d->results().begin(), d->results().end(), std::back_inserter(_results));
+
if (_cb)
_cb(this);
}
virtual std::shared_ptr<BaseDataType> &getOutput() = 0;
virtual void configure() = 0;
virtual void invoke() = 0;
+ virtual std::vector<std::shared_ptr<BaseResultType> > &results() = 0;
virtual void wait() = 0;
virtual void wakeup() = 0;
};
private:
std::unique_ptr<inference::IInferenceTaskInterface> _task;
std::mutex _resultMutex;
+ std::vector<std::shared_ptr<BaseResultType> > _results;
public:
InferenceNode(std::string name = "inference")
virtual ~InferenceNode() = default;
void setInferenceTask(std::unique_ptr<inference::IInferenceTaskInterface> &&task);
- void lockResult();
- void unlockResult();
void configure() final;
void invoke() final;
- BaseResultType &getTaskResult() final;
+ std::vector<std::shared_ptr<BaseResultType> > &results() final;
};
}
void wakeup() override;
virtual void configure() = 0;
virtual void invoke() = 0;
- virtual BaseResultType &getTaskResult() = 0;
+ virtual std::vector<std::shared_ptr<BaseResultType> > &results() = 0;
};
}
// TODO. implement invoke here.
}
- BaseResultType &getTaskResult()
+ std::vector<std::shared_ptr<BaseResultType> > &results()
{
- // TODO. implement getTaskresult here.
+ // TODO. implement results here.
}
};
return _output;
}
-void CallbackNode::addResult(std::shared_ptr<BaseResultType> result)
-{
- _results.push_back(result);
-}
-
-vector<shared_ptr<BaseResultType> > &CallbackNode::getResults()
+std::vector<std::shared_ptr<BaseResultType> > &CallbackNode::results()
{
return _results;
}
-void CallbackNode::clearResults()
-{
- _results.clear();
-}
-
void CallbackNode::wait()
{
unique_lock<mutex> lock(_mutex);
* limitations under the License.
*/
+#include "SingleoLog.h"
#include "InferenceNode.h"
using namespace std;
_task = move(task);
}
-void InferenceNode::lockResult()
-{
- _resultMutex.lock();
-}
-
-void InferenceNode::unlockResult()
-{
- _resultMutex.unlock();
-}
-
void InferenceNode::configure()
{
_task->configure();
delete input->ptr;
_inputs.clear();
+ _results.clear();
+
+ _resultMutex.lock();
+ _results.push_back(_task->result().clone());
+ _resultMutex.unlock();
}
-BaseResultType &InferenceNode::getTaskResult()
+std::vector<std::shared_ptr<BaseResultType> > &InferenceNode::results()
{
- return _task->result();
+ return _results;
}
}
node->addInput(callbackNode->getOutput());
}
-
- node->invoke();
- node->wakeup();
-
- return;
+ } else {
+ // TODO. consider for mulitple inputs later.
+ node->addInput(_inputs[0]);
}
- // ALl other types of callback nodes are handled here.
- // TODO. Other callback style nodes such as StoreNode, DebugNode and so on will be added later.
- auto callbackNode = dynamic_pointer_cast<CallbackNode>(node);
-
- callbackNode->clearResults();
-
- for (auto &n : node->getDependencies()) {
- auto inferenceNode = dynamic_pointer_cast<InferenceNode>(n);
-
- inferenceNode->lockResult();
-
- auto &result = inferenceNode->getTaskResult();
-
- if (result._type == ResultType::FACE_DETECTION)
- callbackNode->addResult(make_shared<FdResultType>(dynamic_cast<FdResultType &>(result)));
- else if (result._type == ResultType::FACE_LANDMARK)
- callbackNode->addResult(make_shared<FldResultType>(dynamic_cast<FldResultType &>(result)));
- else if (result._type == ResultType::OBJECT_DETECTION)
- callbackNode->addResult(make_shared<OdResultType>(dynamic_cast<OdResultType &>(result)));
-
- inferenceNode->unlockResult();
- }
-
- // TODO. consider for mulitple inputs later.
- node->addInput(_inputs[0]);
node->invoke();
node->wakeup();
}
throw InvalidOperation("Node is not set");
}
- auto lastNode = dynamic_pointer_cast<EndpointNode>(_nodes.back());
-
_results.clear();
- _results = lastNode->getResults();
+ _results = _nodes.back()->results();
return _results;
}
cv::Mat cv_image(cv::Size(newImage.width, newImage.height), CV_MAKETYPE(CV_8U, 3), newImage.ptr);
- auto &results = callbackNode->getResults();
+ auto &results = callbackNode->results();
for (auto r : results) {
ASSERT_EQ(r->_type, ResultType::FACE_DETECTION);
void LastNodeCallback(INode *node)
{
auto callbackNode = dynamic_cast<CallbackNode *>(node);
- auto &results = callbackNode->getResults();
+ auto &results = callbackNode->results();
ASSERT_EQ(results.size(), 2);