diff --git a/docs/how-to-use-and-FAQ/ncnn-load-model.md b/docs/how-to-use-and-FAQ/ncnn-load-model.md index 30169247069c..80c62d710c0e 100644 --- a/docs/how-to-use-and-FAQ/ncnn-load-model.md +++ b/docs/how-to-use-and-FAQ/ncnn-load-model.md @@ -3,6 +3,7 @@ |load from|alexnet.param|alexnet.param.bin|alexnet.bin| |---|---|---|---| |file path|load_param(const char*)|load_param_bin(const char*)|load_model(const char*)| +|file path
(wchar_t for windows)|load_param(const wchar_t*)|load_param_bin(const wchar_t*)|load_model(const wchar_t*)| |file descriptor|load_param(FILE*)|load_param_bin(FILE*)|load_model(FILE*)| |file memory|load_param_mem(const char*)|load_param(const unsigned char*)|load_model(const unsigned char*)| |android asset|load_param(AAsset*)|load_param_bin(AAsset*)|load_model(AAsset*)| diff --git a/python/src/main.cpp b/python/src/main.cpp index b74fea33230a..6b7129ae32c7 100644 --- a/python/src/main.cpp +++ b/python/src/main.cpp @@ -950,11 +950,32 @@ PYBIND11_MODULE(ncnn, m) #if NCNN_STDIO #if NCNN_STRING +#if _WIN32 + .def( + "load_param", [](Net& self, const std::wstring& path) { + return self.load_param(path.c_str()); + }, + py::arg("protopath")) +#else .def("load_param", (int (Net::*)(const char*)) & Net::load_param, py::arg("protopath")) +#endif .def("load_param_mem", (int (Net::*)(const char*)) & Net::load_param_mem, py::arg("mem")) #endif // NCNN_STRING +#if _WIN32 + .def( + "load_param_bin", [](Net& self, const std::wstring& path) { + return self.load_param_bin(path.c_str()); + }, + py::arg("protopath")) + .def( + "load_model", [](Net& self, const std::wstring& path) { + return self.load_model(path.c_str()); + }, + py::arg("modelpath")) +#else .def("load_param_bin", (int (Net::*)(const char*)) & Net::load_param_bin, py::arg("protopath")) .def("load_model", (int (Net::*)(const char*)) & Net::load_model, py::arg("modelpath")) +#endif .def( "load_model_mem", [](Net& net, const char* mem) { const unsigned char* _mem = (const unsigned char*)mem; diff --git a/src/c_api.cpp b/src/c_api.cpp index 3aaba7631a35..55cec7d548f8 100644 --- a/src/c_api.cpp +++ b/src/c_api.cpp @@ -1511,6 +1511,25 @@ int ncnn_net_load_model(ncnn_net_t net, const char* path) { return ((Net*)net->pthis)->load_model(path); } + +#if _WIN32 +#if NCNN_STRING +int ncnn_net_load_param_w(ncnn_net_t net, const wchar_t* path) +{ + return ((Net*)net->pthis)->load_param(path); +} +#endif /* NCNN_STRING */ + +int ncnn_net_load_param_bin_w(ncnn_net_t net, const wchar_t* path) +{ + return ((Net*)net->pthis)->load_param_bin(path); +} + +int ncnn_net_load_model_w(ncnn_net_t net, const wchar_t* path) +{ + return ((Net*)net->pthis)->load_model(path); +} +#endif /* _WIN32 */ #endif /* NCNN_STDIO */ #if NCNN_STDIO diff --git a/src/c_api.h b/src/c_api.h index a42994ca3fe9..48a8c2eb0a72 100644 --- a/src/c_api.h +++ b/src/c_api.h @@ -310,6 +310,13 @@ NCNN_EXPORT int ncnn_net_load_param(ncnn_net_t net, const char* path); #endif /* NCNN_STRING */ NCNN_EXPORT int ncnn_net_load_param_bin(ncnn_net_t net, const char* path); NCNN_EXPORT int ncnn_net_load_model(ncnn_net_t net, const char* path); +#if _WIN32 +#if NCNN_STRING +NCNN_EXPORT int ncnn_net_load_param_w(ncnn_net_t net, const wchar_t* path); +#endif /* NCNN_STRING */ +NCNN_EXPORT int ncnn_net_load_param_bin_w(ncnn_net_t net, const wchar_t* path); +NCNN_EXPORT int ncnn_net_load_model_w(ncnn_net_t net, const wchar_t* path); +#endif /* _WIN32 */ #endif /* NCNN_STDIO */ #if NCNN_STDIO diff --git a/src/net.cpp b/src/net.cpp index 868922b68432..b66da6790284 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1731,6 +1731,22 @@ int Net::load_param(const char* protopath) fclose(fp); return ret; } + +#if _WIN32 +int Net::load_param(const wchar_t* protopath) +{ + FILE* fp = _wfopen(protopath, L"rb"); + if (!fp) + { + NCNN_LOGE("_wfopen %ls failed", protopath); + return -1; + } + + int ret = load_param(fp); + fclose(fp); + return ret; +} +#endif #endif // NCNN_STRING int Net::load_param_bin(FILE* fp) @@ -1753,6 +1769,22 @@ int Net::load_param_bin(const char* protopath) return ret; } +#if _WIN32 +int Net::load_param_bin(const wchar_t* protopath) +{ + FILE* fp = _wfopen(protopath, L"rb"); + if (!fp) + { + NCNN_LOGE("_wfopen %ls failed", protopath); + return -1; + } + + int ret = load_param_bin(fp); + fclose(fp); + return ret; +} +#endif + int Net::load_model(FILE* fp) { DataReaderFromStdio dr(fp); @@ -1772,6 +1804,22 @@ int Net::load_model(const char* modelpath) fclose(fp); return ret; } + +#if _WIN32 +int Net::load_model(const wchar_t* modelpath) +{ + FILE* fp = _wfopen(modelpath, L"rb"); + if (!fp) + { + NCNN_LOGE("_wfopen %ls failed", modelpath); + return -1; + } + + int ret = load_model(fp); + fclose(fp); + return ret; +} +#endif #endif // NCNN_STDIO int Net::load_param(const unsigned char* _mem) diff --git a/src/net.h b/src/net.h index 990712bac479..d17522ced7b4 100644 --- a/src/net.h +++ b/src/net.h @@ -70,6 +70,9 @@ class NCNN_EXPORT Net // return 0 if success int load_param(FILE* fp); int load_param(const char* protopath); +#if _WIN32 + int load_param(const wchar_t* protopath); +#endif // load network structure from in-memory plain param string, must be NULL-terminated // return 0 if success @@ -79,11 +82,17 @@ class NCNN_EXPORT Net // return 0 if success int load_param_bin(FILE* fp); int load_param_bin(const char* protopath); +#if _WIN32 + int load_param_bin(const wchar_t* protopath); +#endif // load network weight data from model file // return 0 if success int load_model(FILE* fp); int load_model(const char* modelpath); +#if _WIN32 + int load_model(const wchar_t* modelpath); +#endif #endif // NCNN_STDIO // load network structure from external memory diff --git a/tests/test_squeezenet.cpp b/tests/test_squeezenet.cpp index 0e6c391dd702..4e28bdb460c4 100644 --- a/tests/test_squeezenet.cpp +++ b/tests/test_squeezenet.cpp @@ -241,8 +241,10 @@ class MyConvolution : public ncnn::Layer support_inplace = impl->support_inplace; support_packing = impl->support_packing; + support_any_packing = impl->support_any_packing; support_vulkan = impl->support_vulkan; support_vulkan_packing = impl->support_vulkan_packing; + support_vulkan_any_packing = impl->support_vulkan_any_packing; support_bf16_storage = impl->support_bf16_storage; support_fp16_storage = impl->support_fp16_storage; support_int8_storage = impl->support_int8_storage; @@ -275,8 +277,10 @@ class MyConvolution : public ncnn::Layer support_inplace = impl->support_inplace; support_packing = impl->support_packing; + support_any_packing = impl->support_any_packing; support_vulkan = impl->support_vulkan; support_vulkan_packing = impl->support_vulkan_packing; + support_vulkan_any_packing = impl->support_vulkan_any_packing; support_bf16_storage = impl->support_bf16_storage; support_fp16_storage = impl->support_fp16_storage; support_int8_storage = impl->support_int8_storage;