diff --git a/.github/scripts/test_onnx2ncnn.py b/.github/scripts/test_onnx2ncnn.py index 539304534d..bdc50f315e 100644 --- a/.github/scripts/test_onnx2ncnn.py +++ b/.github/scripts/test_onnx2ncnn.py @@ -33,7 +33,8 @@ def parse_args(): parser = argparse.ArgumentParser( description='MMDeploy onnx2ncnn test tool.') - parser.add_argument('--run', type=bool, help='Execute onnx2ncnn bin.') + parser.add_argument( + '--run', type=bool, help='Execute mmdeploy_onnx2ncnn bin.') parser.add_argument( '--repo-dir', type=str, default='~/', help='mmcls directory.') parser.add_argument( @@ -77,14 +78,16 @@ def run(args): # show processbar os.system(' '.join(download_cmd)) - convert_cmd = ['./onnx2ncnn', filename, 'onnx.param', 'onnx.bin'] + convert_cmd = [ + './mmdeploy_onnx2ncnn', filename, 'onnx.param', 'onnx.bin' + ] subprocess.run(convert_cmd, capture_output=True, check=True) def main(): """test `onnx2ncnn.cpp` - First generate onnx model then convert it with `onnx2ncnn`. + First generate onnx model then convert it with `mmdeploy_onnx2ncnn`. """ args = parse_args() if args.generate_onnx: diff --git a/.github/workflows/backend-ncnn.yml b/.github/workflows/backend-ncnn.yml index d005963586..f5508621e0 100644 --- a/.github/workflows/backend-ncnn.yml +++ b/.github/workflows/backend-ncnn.yml @@ -59,10 +59,10 @@ jobs: mkdir -p build && pushd build export LD_LIBRARY_PATH=/home/runner/work/mmdeploy/mmdeploy/ncnn-20220420/install/lib/:$LD_LIBRARY_PATH cmake -DMMDEPLOY_TARGET_BACKENDS=ncnn -Dncnn_DIR=/home/runner/work/mmdeploy/mmdeploy/ncnn-20220420/install/lib/cmake/ncnn/ .. - make onnx2ncnn -j2 + make mmdeploy_onnx2ncnn -j2 popd - name: Test onnx2ncnn run: | echo $(pwd) - ln -s build/bin/onnx2ncnn ./ + ln -s build/bin/mmdeploy_onnx2ncnn ./ python3 .github/scripts/test_onnx2ncnn.py --run 1 diff --git a/.gitignore b/.gitignore index 78265368e3..0c5d08c9ee 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ __pycache__/ # C extensions *.so onnx2ncnn +mmdeploy_onnx2ncnn # Java classes *.class diff --git a/csrc/mmdeploy/backend_ops/ncnn/onnx2ncnn/CMakeLists.txt b/csrc/mmdeploy/backend_ops/ncnn/onnx2ncnn/CMakeLists.txt index 6901e4fcab..62f9dd42d4 100755 --- a/csrc/mmdeploy/backend_ops/ncnn/onnx2ncnn/CMakeLists.txt +++ b/csrc/mmdeploy/backend_ops/ncnn/onnx2ncnn/CMakeLists.txt @@ -5,15 +5,18 @@ project(onnx2ncnn) find_package(Protobuf) if (PROTOBUF_FOUND) + if (${Protobuf_PROTOC_EXECUTABLE} STREQUAL "") + message(FATAL_ERROR "protoc not found, try `-DProtobuf_PROTOC_EXECUTABLE=/path/to/protoc`") + endif () protobuf_generate_cpp(ONNX_PROTO_SRCS ONNX_PROTO_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/onnx.proto) - add_executable(onnx2ncnn onnx2ncnn.cpp fuse_pass.cpp shape_inference.cpp ${ONNX_PROTO_SRCS} ${ONNX_PROTO_HDRS}) - target_include_directories(onnx2ncnn PRIVATE ${PROTOBUF_INCLUDE_DIR} + add_executable(mmdeploy_onnx2ncnn onnx2ncnn.cpp fuse_pass.cpp shape_inference.cpp ${ONNX_PROTO_SRCS} ${ONNX_PROTO_HDRS}) + target_include_directories(mmdeploy_onnx2ncnn PRIVATE ${PROTOBUF_INCLUDE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) - target_link_libraries(onnx2ncnn PRIVATE ${PROTOBUF_LIBRARIES}) + target_link_libraries(mmdeploy_onnx2ncnn PRIVATE ${PROTOBUF_LIBRARIES}) set(_NCNN_CONVERTER_DIR ${CMAKE_SOURCE_DIR}/mmdeploy/backend/ncnn) - install(TARGETS onnx2ncnn DESTINATION ${_NCNN_CONVERTER_DIR}) + install(TARGETS mmdeploy_onnx2ncnn DESTINATION ${_NCNN_CONVERTER_DIR}) else () message( FATAL_ERROR "Protobuf not found, onnx model convert tool won't be built") diff --git a/docs/en/06-developer-guide/partition_model.md b/docs/en/06-developer-guide/partition_model.md index eadf63766d..3cfd27c1f8 100644 --- a/docs/en/06-developer-guide/partition_model.md +++ b/docs/en/06-developer-guide/partition_model.md @@ -86,4 +86,4 @@ https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_mstrain-608_273e After run the script above, we would have the partitioned onnx file `yolov3.onnx` in the `work-dir`. You can use the visualization tool [netron](https://netron.app/) to check the model structure. -With the partitioned onnx file, you could refer to [useful_tools.md](../useful_tools.md) to do the following procedures such as `onnx2ncnn`, `onnx2tensorrt`. +With the partitioned onnx file, you could refer to [useful_tools.md](../useful_tools.md) to do the following procedures such as `mmdeploy_onnx2ncnn`, `onnx2tensorrt`. diff --git a/docs/zh_cn/04-developer-guide/partition_model.md b/docs/zh_cn/04-developer-guide/partition_model.md index 70843b5e1f..f1d6280fa1 100644 --- a/docs/zh_cn/04-developer-guide/partition_model.md +++ b/docs/zh_cn/04-developer-guide/partition_model.md @@ -82,4 +82,4 @@ https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_mstrain-608_273e --work-dir ./work-dirs/mmdet/yolov3/ort/partition ``` -当得到分段onnx模型之后,我们可以使用mmdeploy提供的其他工具如`onnx2ncnn`, `onnx2tensorrt`来进行后续的模型部署工作。 +当得到分段onnx模型之后,我们可以使用mmdeploy提供的其他工具如`mmdeploy_onnx2ncnn`, `onnx2tensorrt`来进行后续的模型部署工作。 diff --git a/docs/zh_cn/04-developer-guide/support_new_backend.md b/docs/zh_cn/04-developer-guide/support_new_backend.md index b8b1a952b0..689fb3a469 100644 --- a/docs/zh_cn/04-developer-guide/support_new_backend.md +++ b/docs/zh_cn/04-developer-guide/support_new_backend.md @@ -142,7 +142,7 @@ MMDeploy 中的后端必须支持 ONNX,因此后端能直接加载“.onnx” backend_files = [] for onnx_path in onnx_files: create_process( - f'onnx2ncnn with {onnx_path}', + f'mmdeploy_onnx2ncnn with {onnx_path}', target=onnx2ncnn, args=(onnx_path, args.work_dir), kwargs=dict(), diff --git a/mmdeploy/backend/ncnn/init_plugins.py b/mmdeploy/backend/ncnn/init_plugins.py index e04ca294c5..519384be94 100644 --- a/mmdeploy/backend/ncnn/init_plugins.py +++ b/mmdeploy/backend/ncnn/init_plugins.py @@ -18,13 +18,21 @@ def get_ops_path() -> str: def get_onnx2ncnn_path() -> str: - """Get onnx2ncnn path. + """Get mmdeploy_onnx2ncnn path. Returns: - str: A path of onnx2ncnn tool. + str: A path of mmdeploy_onnx2ncnn tool. """ - candidates = ['./onnx2ncnn', './onnx2ncnn.exe'] - return get_file_path(os.path.dirname(__file__), candidates) + candidates = ['./mmdeploy_onnx2ncnn', './mmdeploy_onnx2ncnn.exe'] + onnx2ncnn_path = get_file_path(os.path.dirname(__file__), candidates) + + if onnx2ncnn_path is None or not os.path.exists(onnx2ncnn_path): + onnx2ncnn_path = get_file_path('', candidates) + + if onnx2ncnn_path is None or not os.path.exists(onnx2ncnn_path): + onnx2ncnn_path = shutil.which('mmdeploy_onnx2ncnn') + + return onnx2ncnn_path def get_ncnn2int8_path() -> str: diff --git a/tools/deploy.py b/tools/deploy.py index a1eda321ed..537c7aeec2 100644 --- a/tools/deploy.py +++ b/tools/deploy.py @@ -221,8 +221,8 @@ def main(): if not is_available_ncnn(): logger.error('ncnn support is not available, please make sure \ - 1) `onnx2ncnn` existed in `PATH` 2) python import ncnn success' - ) + 1) `mmdeploy_onnx2ncnn` existed in `PATH` \ + 2) python import ncnn success') exit(1) import mmdeploy.apis.ncnn as ncnn_api diff --git a/tools/onnx2ncnn.py b/tools/onnx2ncnn.py index eb09e86a19..129e869400 100644 --- a/tools/onnx2ncnn.py +++ b/tools/onnx2ncnn.py @@ -27,9 +27,9 @@ def main(): onnx_path = args.onnx_path output_prefix = args.output_prefix - logger.info(f'onnx2ncnn: \n\tonnx_path: {onnx_path} ') + logger.info(f'mmdeploy_onnx2ncnn: \n\tonnx_path: {onnx_path} ') from_onnx(onnx_path, output_prefix) - logger.info('onnx2ncnn success.') + logger.info('mmdeploy_onnx2ncnn success.') if __name__ == '__main__': diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index 1e3125ec75..b84a0daf42 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -126,6 +126,8 @@ def _remove_in_mmdeploy(path): # remove onnx2ncnn and ncnn ext _remove_in_mmdeploy('mmdeploy/backend/ncnn/onnx2ncnn') _remove_in_mmdeploy('mmdeploy/backend/ncnn/onnx2ncnn.exe') + _remove_in_mmdeploy('mmdeploy/backend/ncnn/mmdeploy_onnx2ncnn') + _remove_in_mmdeploy('mmdeploy/backend/ncnn/mmdeploy_onnx2ncnn.exe') ncnn_ext_paths = glob( osp.join(mmdeploy_dir, 'mmdeploy/backend/ncnn/ncnn_ext.*')) for ncnn_ext_path in ncnn_ext_paths: