最近使用

detectron2_backbone 時候遇到一個奇妙的問題

https://github.com/sxhxliang/detectron2_backbone

 

我記得我去年使用 detectron2 + detectron2_backbone 使用的很順利

並且在我的PC端安裝也沒問題

但是到了今年要用時候

我發現原本拿來訓練 detectron2 的環境消失了?!

不僅沒有安裝 detectron2_backbone

也沒有 detectron2

只能重新再安裝

 

結果再度安裝 detectron2 會跑出以下錯誤

 

C:\Users\TEST\Desktop\env\det2_P10\lib\site-packages\torch\include\pybind11\detail/common.h(1080): error C2737: 'pybind11::overload_cast': 'constexpr' 物件必須初始化

 

是在安裝編譯時候的錯誤

但是我對於這錯誤一點印象也沒有

那我去年是怎麼安裝的呢???

天啊~~~ 還是我從頭到尾沒成功過?

但是我有截圖阿~

我還產生了報告阿~

這難道就是傳說中的 曼德拉 效應?

 

然後這錯誤就是需要修改 common.h 這檔案

 

// overload_cast requires variable templates: C++14
# if defined(PYBIND11_CPP14)
#    define PYBIND11_OVERLOAD_CAST 1
/// Syntax sugar for resolving overloaded function pointers:
///  - regular: static_cast<Return (Class::*)(Arg0, Arg1, Arg2)>(&Class::func)
///  - sweet:   overload_cast<Arg0, Arg1, Arg2>(&Class::func)
template <typename... Args>
#    if (defined(_MSC_VER) && _MSC_VER < 1920) /* MSVC 2017 */                                    \
        || (defined(__clang__) && __clang_major__ == 5)
static constexpr detail::overload_cast_impl<Args...> overload_cast = {};
#    else
static constexpr detail::overload_cast_impl<Args...> overload_cast;
#    endif
# endif

雖然說修改 pytorch 檔案好像是一件奇怪的事情

 

但是奇怪的錯誤就是需要用奇怪的方法

 

static constexpr detail::overload_cast_impl<Args...> overload_cast;

改成

 

 

static constexpr detail::overload_cast_impl<Args...> overload_cast = {};

就可以了

 

而且 _MSC_VER 其實是沒有值的

所以他只會用下面的方式宣告參數

但是這樣宣告又是錯誤的

不改 pytorch 檔案我好像也沒有更好方法修正這錯誤了

 

接下來依照官方方法安裝 detectron2_backbone 

https://github.com/sxhxliang/detectron2_backbone/tree/master

 

 

git clone https://github.com/sxhxliang/detectron2_backbone.git
cd detectron2_backbone
python setup.py build develop

 

 

會發現引用 detectron2_backbone 會跳出這錯誤

 

No module named 'detectron2_backbone.layers'

 

結果去看資料夾

C:\Users\TEST\Desktop\env\det2_P10\Lib\site-packages\detectron2_backbone

會發現資料夾裡面只有一個 __init__.py

當然會發生錯誤

但是為什麼安裝沒有複製上去呢?

不管了

直接把 detectron2_backbone 資料夾中的檔案都複製過去就可以正常運作了

以上~

給大家參考囉~