gpt4 book ai didi

c++ - 如何使用 cv::dnn::Net 执行深层复制?

转载 作者:行者123 更新时间:2023-12-01 13:44:34 26 4
gpt4 key购买 nike

我想深拷贝 cv::dnn::Net 的实例:

cv::dnn::Net n1 = cv::dnn::readNetFromONNX("");
cv::dnn::Net n2 = n1;

但据我了解,此类使用隐式共享。而且我在文档中没有找到任何方法来做到这一点。是否有任何可能(例如某些方法 copy())允许完全复制实例?

最佳答案

为了找到您问题的答案,我引用了 OpenCV docs (对于 dnn 模块)和 source .

cv::dnn::Net 没有明确定义的复制或移动构造函数(和复制运算符)。这个类只是接口(interface),唯一的数据成员是:
指向其私有(private)部分的实现的指针。

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; 的方式创建它的拷贝是没有意义的。因为它只是创建了另一个指向相同实现的指针。如果没有这个指向实现的私有(private)指针的任何接口(interface),您几乎无法在不修改源代码的情况下访问它。

你也不能使用 cv::dnn::Model (继承自 cv::dnn::Net 并允许设置输入参数)因为它也只是一个指向实现的指针。

我无法想象需要使用 的用例两个不同的实例 同网 .看起来 OpenCV 开发人员也做了同样的事情。

要在多线程环境中转发网络,您可以调用 cv::dnn::Net::forwardAsync()但它只可能用于英特尔推理引擎后端。尝试调用 cv::dnn::Net::forward()从并发线程将导致运行时错误。

您可以从相同的配置和模型文件中自由地创建两个网络,但我再次无法想象这样的用例( forwardAsync() 由于内部设计优化可能会提供更好的性能)。

关于c++ - 如何使用 cv::dnn::Net 执行深层复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58434675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com