[英]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.