cv::dnn::Net如何进行深拷贝?
How to perform deep copy with cv::dnn::Net?
我想深度复制 cv::dnn::Net:
的实例
cv::dnn::Net n1 = cv::dnn::readNetFromONNX("");
cv::dnn::Net n2 = n1;
但是这个 class 使用隐式共享,据我所知。而且我没有在文档中找到任何方法来执行此操作。是否有任何可能性(例如某些方法 copy())允许完全复制实例?
为了找到您问题的答案,我参考了 OpenCV docs (for dnn module) and source。
cv::dnn::Net 没有明确定义的复制或移动构造函数(和复制运算符)。这个 class 只是接口,唯一的数据成员是:
指向其私有部分实现的指针。
class CV_EXPORTS_W_SIMPLE Net
{
public:
CV_WRAP Net(); //!< Default constructor.
CV_WRAP ~Net(); //!< Destructor frees the net only if there aren't references to the net anymore.
...
private:
struct Impl;
Ptr<Impl> impl;
};
所以您指出以 cv::dnn::Net n2 = n1;
方式创建它的副本是没有意义的,因为它只是创建另一个指向相同实现的指针。如果没有这个指向实现的私有指针的任何接口,你很难在不修改源代码的情况下访问它。
您也不能使用 cv::dnn::Model
(它继承自 cv::dnn::Net
并允许设置输入参数),因为它也只是一个指向实现的指针。
我无法想象需要使用同一网络的两个不同实例的用例。看起来 OpenCV 开发人员也做了同样的事情。
要在多线程环境中转发网络,您可以调用 cv::dnn::Net::forwardAsync()
,但它只适用于英特尔推理引擎后端。尝试从并发线程调用 cv::dnn::Net::forward()
将导致 运行 时间错误。
而且您可以从相同的配置和模型文件中自由创建两个网络,但我还是无法想象它的用例(并且 forwardAsync()
可能会由于内部设计优化而提供更好的性能)。
我想深度复制 cv::dnn::Net:
的实例cv::dnn::Net n1 = cv::dnn::readNetFromONNX("");
cv::dnn::Net n2 = n1;
但是这个 class 使用隐式共享,据我所知。而且我没有在文档中找到任何方法来执行此操作。是否有任何可能性(例如某些方法 copy())允许完全复制实例?
为了找到您问题的答案,我参考了 OpenCV docs (for dnn module) and source。
cv::dnn::Net 没有明确定义的复制或移动构造函数(和复制运算符)。这个 class 只是接口,唯一的数据成员是: 指向其私有部分实现的指针。
class CV_EXPORTS_W_SIMPLE Net
{
public:
CV_WRAP Net(); //!< Default constructor.
CV_WRAP ~Net(); //!< Destructor frees the net only if there aren't references to the net anymore.
...
private:
struct Impl;
Ptr<Impl> impl;
};
所以您指出以 cv::dnn::Net n2 = n1;
方式创建它的副本是没有意义的,因为它只是创建另一个指向相同实现的指针。如果没有这个指向实现的私有指针的任何接口,你很难在不修改源代码的情况下访问它。
您也不能使用 cv::dnn::Model
(它继承自 cv::dnn::Net
并允许设置输入参数),因为它也只是一个指向实现的指针。
我无法想象需要使用同一网络的两个不同实例的用例。看起来 OpenCV 开发人员也做了同样的事情。
要在多线程环境中转发网络,您可以调用 cv::dnn::Net::forwardAsync()
,但它只适用于英特尔推理引擎后端。尝试从并发线程调用 cv::dnn::Net::forward()
将导致 运行 时间错误。
而且您可以从相同的配置和模型文件中自由创建两个网络,但我还是无法想象它的用例(并且 forwardAsync()
可能会由于内部设计优化而提供更好的性能)。