簡體   English   中英

如何使用 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 文檔(用於 dnn 模塊)和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()將導致運行時錯誤。

您可以自由地從相同的配置和 model 文件創建兩個網絡,但我再次無法想象一個用例(由於內部設計優化, forwardAsync()可能會提供更好的性能)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM