template<typename _Tp> int set(int i, const _Tp& value)
{ return set(i, &value, sizeof(value)); }
- template<typename _Tp0>
- Kernel& args(const _Tp0& a0)
- {
- set(0, a0); return *this;
- }
-
- template<typename _Tp0, typename _Tp1>
- Kernel& args(const _Tp0& a0, const _Tp1& a1)
- {
- int i = set(0, a0); set(i, a1); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2)
- {
- int i = set(0, a0); i = set(i, a1); set(i, a2); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
- const _Tp3& a3, const _Tp4& a4)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2);
- i = set(i, a3); set(i, a4); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2,
- typename _Tp3, typename _Tp4, typename _Tp5>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
- const _Tp3& a3, const _Tp4& a4, const _Tp5& a5)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2);
- i = set(i, a3); i = set(i, a4); set(i, a5); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3);
- i = set(i, a4); i = set(i, a5); set(i, a6); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3);
- i = set(i, a4); i = set(i, a5); i = set(i, a6); set(i, a7); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
- typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4);
- i = set(i, a5); i = set(i, a6); i = set(i, a7); set(i, a8); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
- typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8, typename _Tp9>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); set(i, a9); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
- typename _Tp8, typename _Tp9, typename _Tp10>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9, const _Tp10& a10)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); set(i, a10); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
- typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); set(i, a11); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
- typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
- const _Tp12& a12)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
- set(i, a12); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
- typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
- typename _Tp13>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
- const _Tp12& a12, const _Tp13& a13)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
- i = set(i, a12); set(i, a13); return *this;
- }
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
- typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
- typename _Tp13, typename _Tp14>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
- const _Tp12& a12, const _Tp13& a13, const _Tp14& a14)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
- i = set(i, a12); i = set(i, a13); set(i, a14); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
- typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
- typename _Tp13, typename _Tp14, typename _Tp15>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
- const _Tp12& a12, const _Tp13& a13, const _Tp14& a14, const _Tp15& a15)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
- i = set(i, a12); i = set(i, a13); i = set(i, a14); set(i, a15); return *this;
- }
+protected:
+ template<typename _Tp0> inline
+ int set_args_(int i, const _Tp0& a0) { return set(i, a0); }
+ template<typename _Tp0, typename... _Tps> inline
+ int set_args_(int i, const _Tp0& a0, const _Tps&... rest_args) { i = set(i, a0); return set_args_(i, rest_args...); }
+public:
+ /** @brief Setup OpenCL Kernel arguments.
+ Avoid direct using of set(i, ...) methods.
+ @code
+ bool ok = kernel
+ .args(
+ srcUMat, dstUMat,
+ (float)some_float_param
+ ).run(ndims, globalSize, localSize);
+ if (!ok) return false;
+ @endcode
+ */
+ template<typename... _Tps> inline
+ Kernel& args(const _Tps&... kernel_args) { set_args_(0, kernel_args...); return *this; }
+ /** @brief Run the OpenCL kernel (globalsize value may be adjusted)
- /** @brief Run the OpenCL kernel.
@param dims the work problem dimensions. It is the length of globalsize and localsize. It can be either 1, 2 or 3.
@param globalsize work items for each dimension. It is not the final globalsize passed to
OpenCL. Each dimension will be adjusted to the nearest integer divisible by the corresponding
void addLayer(LayerParams& layerParams,
const opencv_onnx::NodeProto& node_proto);
+ void expandMid(const std::string& prefix, opencv_onnx::NodeProto& node_proto,
+ const std::string& input, size_t n);
public:
-
- ONNXImporter(Net& net, const char *onnxFile)
- : dstNet(net), dispatch(buildDispatchMap())
- {
- hasDynamicShapes = false;
- CV_Assert(onnxFile);
- CV_LOG_DEBUG(NULL, "DNN/ONNX: processing ONNX model from file: " << onnxFile);
-
- std::fstream input(onnxFile, std::ios::in | std::ios::binary);
- if (!input)
- {
- CV_Error(Error::StsBadArg, cv::format("Can't read ONNX file: %s", onnxFile));
- }
-
- if (!model_proto.ParseFromIstream(&input))
- {
- CV_Error(Error::StsUnsupportedFormat, cv::format("Failed to parse ONNX model: %s", onnxFile));
- }
-
- populateNet();
- }
-
- ONNXImporter(Net& net, const char* buffer, size_t sizeBuffer)
- : dstNet(net), dispatch(buildDispatchMap())
- {
- hasDynamicShapes = false;
- CV_LOG_DEBUG(NULL, "DNN/ONNX: processing in-memory ONNX model (" << sizeBuffer << " bytes)");
-
- struct _Buf : public std::streambuf
- {
- _Buf(const char* buffer, size_t sizeBuffer)
- {
- char* p = const_cast<char*>(buffer);
- setg(p, p, p + sizeBuffer);
- }
- };
-
- _Buf buf(buffer, sizeBuffer);
- std::istream input(&buf);
-
- if (!model_proto.ParseFromIstream(&input))
- CV_Error(Error::StsUnsupportedFormat, "Failed to parse onnx model from in-memory byte array.");
-
- populateNet();
- }
+ ONNXImporter(Net& net, const char *onnxFile);
+ ONNXImporter(Net& net, const char* buffer, size_t sizeBuffer);
void populateNet();
}
}
- copyLP.name = format("%s/copy_%d", prefix.c_str(), j);
+ /** @brief Make N copies of input layer and set them as input to node_proto.
+ * @param prefix prefix of new layers' names
+ * @param node_proto node which will contain all copies as inputs
+ * @param input name of the node to copy
+ * @param n number of copies
+ */
+ void ONNXImporter::expandMid(const std::string& prefix, opencv_onnx::NodeProto& node_proto,
+ const std::string& input, size_t n)
+ {
+ std::vector<std::string> input_names;
+ input_names.reserve(n);
+ for (size_t j = 0; j < n; j++)
+ {
+ LayerParams copyLP;
++ copyLP.name = format("%s/copy_%zu", prefix.c_str(), j);
+ copyLP.type = "Identity";
+ CV_Assert((layer_id.find(copyLP.name) == layer_id.end()) &&
+ "Couldn't copy the node: generated name already exists in the graph.");
+ input_names.push_back(copyLP.name);
+
+ node_proto.set_input(0, input);
+ node_proto.set_output(0, copyLP.name);
+ addLayer(copyLP, node_proto);
+ }
+ node_proto.clear_input();
+ for (size_t i = 0; i < input_names.size(); i++)
+ {
+ node_proto.add_input(input_names[i]);
+ }
+ }
+
void ONNXImporter::addConstant(const std::string& name, const Mat& blob)
{
constBlobs.insert(std::make_pair(name, blob));