From c85e41271a59bd8f7f9b085c0ee2e49c151afa72 Mon Sep 17 00:00:00 2001 From: xujiao Date: Fri, 18 Apr 2025 15:12:41 +0800 Subject: [PATCH] align cli name to api --- introduction.md | 338 ----------------------------------------- netrans_cli/README.md | 63 ++++---- netrans_cli/example.py | 9 +- netrans_cli/load.sh | 208 +++++++++++++++++++++++++ 4 files changed, 253 insertions(+), 365 deletions(-) delete mode 100644 introduction.md create mode 100755 netrans_cli/load.sh diff --git a/introduction.md b/introduction.md deleted file mode 100644 index 38deab9..0000000 --- a/introduction.md +++ /dev/null @@ -1,338 +0,0 @@ -# 模型转换简介 - -Netrans 是一套运行在unbuntu 20.04上的模型处理工具,提供命令行工具 netrans_cli 和 python api netrans_py, 其核心功能是将模型权重转换成在pnna芯片上运行的 nbg(network binary graph)格式(.nb 为后缀)。 - -Netrans 目录结构如下: - -``` -netrans -├── bin -├── netrans_cli -├── netrans_py -└── examples -``` - -| 目录 | 说明 | -| :--- | --- -| bin | 导入,量化,推理,导出工程等工具的二进制文件 | -| netrans_cli | 导入,量化,推理和导出的一键运行命令行工具 | -| netrans_py | 导入,量化,推理和导出的一键运行python api | -| examples | tensorflow、caffe、darknet 和 onnx 的模型转换示例 | - -注意:运行 Netrans 的计算机应该满足以下要求。 - -|资源|描述| -|:---|---| -| CPU | Intel® Core™ i5-6500 CPU @ 3.2 GHz x4 支持 the Intel® Advanced Vector Extensions.| -| RAM | 至少8GB | -| 硬盘 | 160GB | -| 操作系统 | Ubuntu 20.04 LTS 64-bit with Python 3.8
注意:不推荐使用其他版本| -## 安装 - -- 确保Python 3.8环境配置完成 -- 使用apt安装“build-essential” - - ```shell - sudo apt update - sudo apt install build-essential - ``` -- 计算机需要满足上面描述的硬件需求 - -执行以下命令安装 Netrans。 - -创建 conda 环境 . -```bash -conda create -n netrans python=3.8 -y -conda activate netrans -``` - -下载 Netrans . -```bash -mkdir -p ~/app -cd ~/app -git clone https://gitlink.org.cn/nudt_dsp/netrans.git -``` - -安装 Netrans。 -```bash -cd ~/app/netrans -./setup.sh -``` - -## Netrans 工作流程介绍。 - -Netrans 工作流程如下: -- 1. 导入并转换模型到中间模型文件 -- 2. 生成 inputmeta 文件 -- 3. 量化模型 -- 4. 导出模型应用部署程序工程,以便部署到硬件。 - -Netrans 提供 tensorflow、caffe、darknet 和 onnx 的模型转换示例,请参考 examples。 - -## 模型支持 - -Netrans 支持目前大多数的主流框架。具体如下表 - -|输入支持|描述| -|:---|---| -| caffe|支持所有的Caffe 模型 | -| Tensorflow|支持版本1.4.x, 2.0.x, 2.3.x, 2.6.x, 2.8.x, 2.10.x, 2.12.x 以tf.io.write_graph()保存的模型 | -| ONNX|支持 ONNX 至 1.14.0, opset支持至19 | -| Pytorch | 支持 Pytorch 至 1.5.1 | -| Darknet |支持[官网](https://pjreddie.com/darknet/)列出 darknet 模型| - -注意: Pytorch 动态图的特性,建议将 Pytorch 模型导出成 onnx ,再使用 Netrans 进行转换。 - -## 算子支持 - -### 支持的Caffe算子 - -| | | | -|:---| -- | -- | -absval | innerproduct | reorg -axpy | lrn | roipooling -batchnorm/bn | l2normalizescale | relu -convolution | leakyrelu | reshape -concat | lstm | reverse -convolutiondepthwise | normalize | swish -dropout | poolwithargmax | slice -depthwiseconvolution | premute | scale -deconvolution | prelu | shufflechannel -elu | pooling | softmax -eltwise | priorbox | sigmoid -flatten | proposal | tanh - - -### 持的TensorFlow算子 - -| | | | -|:---| -- | -- | -tf.abs | tf.nn.rnn_cell_GRUCell | tf.negative -tf.add | tf.nn.dynamic_rnn | tf.pad -tf.nn.bias_add | tf.nn.rnn_cell_GRUCell | tf.transpose -tf.add_n | tf.greater | tf.nn.avg_pool -tf.argmin | tf.greater_equal | tf.nn.max_pool -tf.argmax | tf.image.resize_bilinear | tf.reduce_mean -tf.batch_to_space_nd | tf.image.resize_nearest_neighbor | tf.nn.max_pool_with_argmax -tf.nn.batch_normalization | tf.contrib.layers.instance_norm | tf.pow -tf.nn.fused_batchnorm | tf.nn.fused_batch_norm | tf.reduce_mean -tf.cast | tf.stack | tf.reduce_sum -tf.clip_by_value | tf.nn.sigmoid | tf.reverse -tf.concat | tf.signal.frame | tf.reverse_sequence -tf.nn.conv1d | tf.slice | tf.nn.relu -tf.nn.conv2d | tf.nn.softmax | tf.nn.relu6 -tf.nn.depthwise_conv2d | tf.space_to_batch_nd | tf.rsqrt -tf.nn.conv1d | tf.space_to_depth | tf.realdiv -tf.nn.conv3d | tf.nn.local_response_normalization | tf.reshape -tf.image.crop_and_resize | tf.nn.l2_normalize | tf.expand_dims -tf.nn.conv2d_transposed | tf.nn.rnn_cell_LSTMCelltf.nn_dynamic_rnn | tf.squeeze -tf.depth_to_space | tf.rnn_cell.LSTMCell | tf.strided_slice -tf.equal | tf.less | tf.sqrt -tf.exp | tf.less_equal | tf.square -tf.nn.elu | tf.logical_or | tf.subtract -tf.nn.embedding_lookup | tf.logical_add | tf.scatter_nd -tf.maximum | tf.nn.leaky_relu | tf.split -tf.floor | tf.multiply | tf.nn.swish -tf.matmul | tf.nn.moments | tf.tile -tf.floordiv | tf.minimum | tf.nn.tanh -tf.gather_nd | tf.matmul | tf.unstack -tf.gather | tf.batch_matmul | tf.where -tf.nn.embedding_lookup | tf.not_equal | tf.select - -### 支持的ONNX算子 - -| | | | -|:---| -- | -- | -ArgMin | LeakyRelu | ReverseSequence -ArgMax | Less | ReduceMax -Add | LSTM | ReduceMin -Abs | MatMul | ReduceL1 -And | Max | ReduceL2 -BatchNormalization | Min | ReduceLogSum -Clip | MaxPool | ReduceLogSumExp -Cast | AveragePool | ReduceSumSquare -Concat | Globa | Reciprocal -ConvTranspose | lAveragePool | Resize -Conv | GlobalMaxPool | Sum -Div | MaxPool | SpaceToDepth -Dropout | AveragePool | Sqrt -DepthToSpace | Mul | Split -DequantizeLinear | Neg | Slice -Equal | Or | Squeeze -Exp | Prelu | Softmax -Elu | Pad | Sub -Expand | POW | Sigmoid -Floor | QuantizeLinear | Softsign -InstanceNormalization | QLinearMatMul | Softplus -Gemm | QLinearConv | Sin -Gather | Relu | Tile -Greater | Reshape | Transpose -GatherND | Squeeze | Tanh -GRU | Unsqueeze | Upsample -Logsoftmax | Flatten | Where -LRN | ReduceSum | Xor -Log | ReduceMean | | - - -### 支持的Darknet算子 - -| | | | -|:---| -- | -- | -avgpool | maxpool | softmax -batch_normalize | mish | shortcut -connected | region | scale_channels -convolutional | reorg | swish -depthwise_convolutional | relu | upsample -leaky | route | yolo -logistic - -## 数据准备 - -对于不同框架下训练的模型,需要准备不同的数据,所有的数据都需要放在同一个文件夹下。 -模型名和文件名需要保持一致。 - -### caffe -转换 caffe 模型时,模型工程目录应包含以下文件: -- 以 .prototxt 结尾的模型结构定义文件 -- 以 .caffemode 结尾的模型权重文件 -- dataset.txt 包含数据路径的文本文件(支持图像和NPY格式) - -以 lenet_caffe 为例,初始目录为: - -```bash -lenet_caffe/ -├── 0.jpg # 校准数据 -├── dataset.txt # 指定数据地址的文件 -├── lenet_caffe.caffemodel # caffe 模型权重 -└── lenet_caffe.prototxt # caffe 模型结构 -``` - -### tensorflow -转换 tenrsorflow 模型时,模型工程目录应包含以下文件: -- .pb 文件:冻结图模型文件 -- inputs_outputs.txt:输入输出节点定义文件 -- dataset.txt:数据路径配置文件 - -以 lenet 为例,初始目录为: -```bash -lenet/ -├── 0.jpg # 校准数据 -├── dataset.txt # 指定数据地址的文件 -├── inputs_outputs.txt # 输入输出节点定义文件 -└── lenet.pb # 冻结图模型文件 -``` - -### darknet -转换Darknet模型需准备: -- .cfg 文件:网络结构配置文件 -- .weights 文件:训练权重文件 -- .dataset.txt:数据路径配置文件 - -以 yolov4_tiny 为例,初始目录为: -```bash -yolov4_tiny/ -├── 0.jpg # 校准数据 -├── dataset.txt # 指定数据地址的文件 -├── yolov4_tiny.cfg # 网络结构配置文件 -└── yolov4_tiny.weights # 预训练权重文件 -``` - -### onnx -转换ONNX模型需准备: -- .onnx 文件:网络模型 -- dataset.txt:数据路径配置文件 - -以 yolov5s 为例,初始目录为: -```bash -yolov5s/ -├── 0.jpg # 校准数据 -├── dataset.txt # 指定数据地址的文件 -└── yolov5s.onnx # 网络模型 -``` - -## 配置文件 -### Inputmeta.yml - -Inputmeta.yml 是 config 生成的配置文件模版,该文件用于为Netrans中间模型配置输入层数据集合。 -Netrans中的量化、推理、导出和图片转dat的操作都需要用到这个文件。 -Inputmeta.yml文件结构如下: -```yaml -%YAML 1.2 ---- -# !!!This file disallow TABs!!! -# "category" allowed values: "image, undefined" -# "database" allowed types: "H5FS, SQLITE, TEXT, LMDB, NPY, GENERATOR" -# "tensor_name" only support in H5FS database -# "preproc_type" allowed types:"IMAGE_RGB, IMAGE_RGB888_PLANAR, IMAGE_RGB888_PLANAR_SEP, -IMAGE_I420, -# IMAGE_NV12, IMAGE_YUV444, IMAGE_GRAY, IMAGE_BGRA, TENSOR" -input_meta: - databases: - - path: dataset.txt - type: TEXT - ports: - - lid: data_0 - category: image - dtype: float32 - sparse: false - tensor_name: - layout: nhwc - shape: - - 50 - - 224 - - 224 - - 3 - preprocess: - reverse_channel: false - mean: - - 103.94 - - 116.78 - - 123.67 - scale: 0.017 - preproc_node_params: - preproc_type: IMAGE_RGB - add_preproc_node: false - preproc_perm: - - 0 - - 1 - - 2 - - 3 - - lid: label_0 - redirect_to_output: true - category: undefined - tensor_name: - dtype: float32 - shape: - - 1 - - 1 - -``` - -上面示例文件的各个参数解释: - -| 参数 | 说明 | -| :--- | --- -| input_meta | 预处理参数配置申明。 | -| databases | 数据配置,包括设置 path、type 和 ports 。| -| path | 数据集文件的相对(执行目录)或绝对路径。默认为 dataset.txt, 不建议修改。 | -| type | 数据集文件格式,固定为TEXT。 | -| ports | 指向网络中的输入或重定向的输入,目前只支持一个输入,如果网络存在多个输入,请与@ccyh联系。 | -| lid | 输入层的lid | -| category | 输入的类别。将此参数设置为以下值之一:image(图像输入)或 undefined(其他类型的输入)。 | -| dtype | 输入张量的数据类型,用于将数据发送到 pnna 网络的输入端口。支持的数据类型包括 float32 和 quantized。 | -| sparse | 指定网络张量是否以稀疏格式存在。将此参数设置为以下值之一:true(稀疏格式)或 false(压缩格式)。 | -| tensor_name | 留空此参数 | -| layout | 输入张量的格式,使用 nchw 用于 Caffe、Darknet、ONNX 和 PyTorch 模型。使用 nhwc 用于 TensorFlow、TensorFlow Lite 和 Keras 模型。 | -| shape | 此张量的形状。第一维,shape[0],表示每批的输入数量,允许在一次推理操作之前将多个输入发送到网络。如果batch维度设置为0,则需要从命令行指定--batch-size。如果 batch维度设置为大于1的值,则直接使用inputmeta.yml中的batch size并忽略命令行中的--batch-size。 | -| fitting | 保留字段 | -| preprocess | 预处理步骤和顺序。预处理支持下面的四个参数,参数的顺序代表预处理的顺序。 | -| reverse_channel | 指定是否保留通道顺序。将此参数设置为以下值之一:true(保留通道顺序)或 false(不保留通道顺序)。对于 TensorFlow 和 TensorFlow Lite 框架的模型使用 true。 | -| mean | 用于每个通道的均值。 | -| scale | 张量的缩放值。均值和缩放值用于根据公式 (inputTensor - mean) × scale 归一化输入张量。| -| preproc_node_params | 预处理节点参数,在 OVxlib C 项目案例中启用预处理任务 | -| add_preproc_node | 用于处理 OVxlib C 项目案例中预处理节点的插入。[true, false] 中的布尔值,表示通过配置以下参数将预处理层添加到导出的应用程序中。此参数仅在 add_preproc_node 参数设置为 true 时有效。| -| preproc_type | 预处理节点输入类型。 [IMAGE_RGB, IMAGE_RGB888_PLANAR,IMAGE_YUV420, IMAGE_GRAY, IMAGE_BGRA, TENSOR] 中的字符串值 | -| preproc_perm | 预处理节点输入的置换参数。 | -| redirect_to_output | 将database张量重定向到图形输出的特殊属性。如果为该属性设置了一个port,网络构建器将自动为该port生成一个输出层,以便后处理文件可以直接处理来自database的张量。 如果使用网络进行分类,则上例中的lid“input_0”表示输入数据集的标签lid。 请注意,redirect_to_output 必须设置为 true,以便后处理文件可以直接处理来自database的张量。 标签的lid必须与后处理文件中定义的 labels_tensor 的lid相同。 [true, false] 中的布尔值。 指定是否将由张量表示的输入端口的数据直接发送到网络输出。true(直接发送到网络输出)或 false(不直接发送到网络输出)| - -可以根据实际情况对生成的inputmeta文件进行修改。 \ No newline at end of file diff --git a/netrans_cli/README.md b/netrans_cli/README.md index 80546a9..fac7df1 100644 --- a/netrans_cli/README.md +++ b/netrans_cli/README.md @@ -1,29 +1,31 @@ -# 命令行工具 netrans_cli 使用介绍 +# netrans_cli 使用 + netrans_cli 是 netrans 进行模型转换的命令行工具,使用 ntrans_cli 完成模型转换的步骤如下: + 1. 导入模型 2. 生成并修改前处理配置文件 *_inputmeta.yml 3. 量化模型 4. 导出模型 -## netrans_cli 脚本介绍 +## netrans_cli 脚本 |脚本|功能|使用| |:---|---|---| -|import.sh| 模型导入功能,将模型转换成 pnna 支持的格式| import_model.sh model_name| +|load.sh| 模型导入功能,将模型转换成 Pnna 支持的格式| load.sh model_name| |config.sh| 预处理模版生成功能,生成预处理模版,根据模型进行对于的修改| config.sh model_name| |quantize.sh| 量化功能, 对模型进行量化生成量化参数文件| quantize.sh model_name quantize_data_type| -|export.sh|导出功能,将量化好的模型导出成 pnna 上可以运行的runtime| export.sh model_name quantize_data_type| +|export.sh|导出功能,将量化好的模型导出成 Pnna 上可以运行的runtime| export.sh model_name quantize_data_type| -## 数据准备 -对于不同框架下训练的模型,需要准备不同的数据,所有的数据都需要放在同一个文件夹下。 -模型名和文件名需要保持一致。 +对于不同框架下训练的模型,需要准备不同的数据,所有的数据都需要与模型放在同一个文件夹下,模型文件名和文件夹名需要保持一致。 -## import.sh 导入模型 +## load.sh 模型导入 + +使用 load.sh 导入模型 + +- 用法: load.sh 以模型文件名命名的模型数据文件夹,例如: -使用 import.sh 导入模型 -- 用法: import.sh 以模型文件名命名的模型数据文件夹,例如: ```bash - $ import.sh lenet + load.sh lenet ``` "lenet"是文件夹名,也作为模型名和权重文件名。导入会打印相关日志信息,成功后会打印SUCESS。导入后lenet文件夹应该有"lenet.json"和"lenet.data"文件: @@ -39,13 +41,18 @@ netrans_cli 是 netrans 进行模型转换的命令行工具,使用 ntrans_cli -rw-r--r-- 1 hope hope 1725178 Jun 7 09:21 lenet.data ``` -## config 生成 Inputmeta 文件 +## config.sh 预处理配置文件生成 + 使用 config.sh 生成 inputmeta 文件 -- config.sh 以模型文件名命名的模型数据文件夹,例如: + +- config.sh 以模型文件名命名的模型数据文件夹,例如: + ```bash - $ config.sh lenet + config.sh lenet ``` + inputmeta 文件生成会打印相关日志信息,成功后会打印SUCESS。导入后lenet文件夹应该有 "lenet_inputmeta.yml" 文件: + ```shell $ ls -lrt lenet total 3400 @@ -57,11 +64,11 @@ netrans_cli 是 netrans 进行模型转换的命令行工具,使用 ntrans_cli -rw-r--r-- 1 hope hope 1725178 Jun 7 09:21 lenet.data -rw-r--r-- 1 hope hope 948 Jun 7 09:35 lenet_inputmeta.yml ``` + 可以看到,最终生成的是*.yml文件,该文件用于为Netrans中间模型配置输入层数据集合。Netrans中的量化、推理、导出和图片转dat的操作都需要用到这个文件。因此,此步骤不可跳过。 -可以看到,最终生成的是*.yml文件,该文件用于为Netrans中间模型配置输入层数据集合。Netrans中的量化、推理、导出和图片转dat的操作都需要用到这个文件。因此,此步骤不可跳过。 - Inputmeta.yml文件结构如下: + ```yaml %YAML 1.2 --- @@ -111,13 +118,15 @@ input_meta: shape: - 1 - 1 - ``` 上面示例文件的各个参数解释: +```{table} +:widths: 20, 80 +:align: left | 参数 | 说明 | -| :--- | --- +| :--- | --- | | input_meta | 预处理参数配置申明。 | | databases | 数据配置,包括设置 path、type 和 ports 。| | path | 数据集文件的相对(执行目录)或绝对路径。默认为 dataset.txt, 不建议修改。 | @@ -125,7 +134,7 @@ input_meta: | ports | 指向网络中的输入或重定向的输入,目前只支持一个输入,如果网络存在多个输入,请与@ccyh联系。 | | lid | 输入层的lid | | category | 输入的类别。将此参数设置为以下值之一:image(图像输入)或 undefined(其他类型的输入)。 | -| dtype | 输入张量的数据类型,用于将数据发送到 pnna 网络的输入端口。支持的数据类型包括 float32 和 quantized。 | +| dtype | 输入张量的数据类型,用于将数据发送到 Pnna 网络的输入端口。支持的数据类型包括 float32 和 quantized。 | | sparse | 指定网络张量是否以稀疏格式存在。将此参数设置为以下值之一:true(稀疏格式)或 false(压缩格式)。 | | tensor_name | 留空此参数 | | layout | 输入张量的格式,使用 nchw 用于 Caffe、Darknet、ONNX 和 PyTorch 模型。使用 nhwc 用于 TensorFlow、TensorFlow Lite 和 Keras 模型。 | @@ -140,25 +149,27 @@ input_meta: | preproc_type | 预处理节点输入类型。 [IMAGE_RGB, IMAGE_RGB888_PLANAR,IMAGE_YUV420, IMAGE_GRAY, IMAGE_BGRA, TENSOR] 中的字符串值 | | preproc_perm | 预处理节点输入的置换参数。 | | redirect_to_output | 将database张量重定向到图形输出的特殊属性。如果为该属性设置了一个port,网络构建器将自动为该port生成一个输出层,以便后处理文件可以直接处理来自database的张量。 如果使用网络进行分类,则上例中的lid“input_0”表示输入数据集的标签lid。 您可以设置其他名称来表示标签的lid。 请注意,redirect_to_output 必须设置为 true,以便后处理文件可以直接处理来自database的张量。 标签的lid必须与后处理文件中定义的 labels_tensor 的lid相同。 [true, false] 中的布尔值。 指定是否将由张量表示的输入端口的数据直接发送到网络输出。true(直接发送到网络输出)或 false(不直接发送到网络输出)| +``` 可以根据实际情况对生成的inputmeta文件进行修改。 -### 模型量化 -如果我们训练好的模型的数据类型是float32的,为了使模型以更高的效率在pnna上运行,我们可以对模型进行量化操作,量化操作可能会带来一定程度的精度损失。 +## quantize.sh 模型量化 + +如果我们训练好的模型的数据类型是float32的,为了使模型以更高的效率在Pnna上运行,我们可以对模型进行量化操作,量化操作可能会带来一定程度的精度损失。 - 在netrans_cli目录下使用quantize.sh脚本进行量化操作。 用法:./quantize.sh 以模型文件名命名的模型数据文件夹 量化类型,例如: ```bash -$ quantize.sh lenet uint8 +quantize.sh lenet uint8 ``` 支持的量化类型有:uint8、int8、int16 -### 模型导出 +## export.sh 模型导出 -使用 export.sh 进行推理。 +使用 export.sh 导出模型生成nbg文件。 用法:export.sh 以模型文件名命名的模型数据文件夹 数据类型,例如: @@ -174,8 +185,8 @@ ls -lrt lenet/wksp/asymmetric_affine/ -rw-r--r-- 1 hope hope 694912 Jun 7 09:55 network_binary.nb ``` -目前支持将生成的network_binary.nb文件部署到pnna硬件平台。具体部署方法请参阅模型部署相关文档。 +目前支持将生成的network_binary.nb文件部署到Pnna硬件平台。具体部署方法请参阅模型部署相关文档。 -## 使用实例 +## 使用示例 请参照examples,examples 提供 [caffe 模型转换示例](./examples/caffe_model.md),[darknet 模型转换示例](./examples/darknet_model.md),[tensorflow 模型转换示例](./examples/tensorflow_model.md),[onnx 模型转换示例](./examples/onnx_model.md)。 diff --git a/netrans_cli/example.py b/netrans_cli/example.py index 822bfdd..df6b8d1 100755 --- a/netrans_cli/example.py +++ b/netrans_cli/example.py @@ -39,6 +39,12 @@ def main(): default=1.0, help='量化缩放系数(默认:%(default)s)' ) + parser.add_argument( + '-p', '--profile', + action='store_true', # 设置为True当参数存在时 + help='启用性能分析模式(默认:%(default)s)' + ) + # 解析参数 args = parser.parse_args() @@ -49,7 +55,8 @@ def main(): model.model2nbg( quantize_type=args.quantize_type, mean=args.mean, - scale=args.scale + scale=args.scale, + profile=args.profile ) print(f"模型 {args.model_path} 转换成功") except FileNotFoundError: diff --git a/netrans_cli/load.sh b/netrans_cli/load.sh new file mode 100755 index 0000000..bf0b65c --- /dev/null +++ b/netrans_cli/load.sh @@ -0,0 +1,208 @@ +#!/bin/bash + +if [ -z "$NETRANS_PATH" ]; then + echo "Need to set enviroment variable NETRANS_PATH" + exit 1 +fi + +function import_caffe_network() +{ + NAME=$1 + CONVERTCAFFE=$NETRANS_PATH/pnnacc + + CONVERTCAFFE="$CONVERTCAFFE import caffe" + + + if [ -f ${NAME}.json ]; then + echo -e "\033[31m rm ${NAME}.json \033[0m" + rm ${NAME}.json + fi + + if [ -f ${NAME}.data ]; then + echo -e "\033[31m rm ${NAME}.data \033[0m" + rm ${NAME}.data + fi + + echo "=========== Converting $NAME Caffe model ===========" + if [ -f ${NAME}.caffemodel ]; then + cmd="$CONVERTCAFFE \ + --model ${NAME}.prototxt \ + --weights ${NAME}.caffemodel \ + --output-model ${NAME}.json \ + --output-data ${NAME}.data" + else + echo "=========== fake Caffe model data file===========" + cmd="$CONVERTCAFFE \ + --model ${NAME}.prototxt \ + --output-model ${NAME}.json \ + --output-data ${NAME}.data" + fi +} + +function import_tensorflow_network() +{ + NAME=$1 + CONVERTF=$NETRANS_PATH/pnnacc + + CONVERTF="$CONVERTF import tensorflow" + + + if [ -f ${NAME}.json ]; then + echo -e "\033[31m rm ${NAME}.json \033[0m" + rm ${NAME}.json + fi + + if [ -f ${NAME}.data ]; then + echo -e "\033[31m rm ${NAME}.data \033[0m" + rm ${NAME}.data + fi + + echo "=========== Converting $NAME Tensorflow model ===========" + cmd="$CONVERTF \ + --model ${NAME}.pb \ + --output-data ${NAME}.data \ + --output-model ${NAME}.json \ + $(cat inputs_outputs.txt)" +} + +function import_onnx_network() +{ + NAME=$1 + CONVERTONNX=$NETRANS_PATH/pnnacc + CONVERTONNX="$CONVERTONNX import onnx" + + + if [ -f ${NAME}.json ]; then + echo -e "\033[31m rm ${NAME}.json \033[0m" + rm ${NAME}.json + fi + + if [ -f ${NAME}.data ]; then + echo -e "\033[31m rm ${NAME}.data \033[0m" + rm ${NAME}.data + fi + + echo "=========== Converting $NAME ONNX model ===========" + cmd="$CONVERTONNX \ + --model ${NAME}.onnx \ + --output-model ${NAME}.json \ + --output-data ${NAME}.data" +} + +function import_tflite_network() +{ + NAME=$1 + CONVERTTFLITE=$NETRANS_PATH/pnnacc + CONVERTTFLITE="$CONVERTTFLITE import tflite" + + + if [ -f ${NAME}.json ]; then + echo -e "\033[31m rm ${NAME}.json \033[0m" + rm ${NAME}.json + fi + + if [ -f ${NAME}.data ]; then + echo -e "\033[31m rm ${NAME}.data \033[0m" + rm ${NAME}.data + fi + + echo "=========== Converting $NAME TFLite model ===========" + cmd="$CONVERTTFLITE \ + --model ${NAME}.tflite \ + --output-model ${NAME}.json \ + --output-data ${NAME}.data" +} + +function import_darknet_network() +{ + NAME=$1 + CONVERTDARKNET=$NETRANS_PATH/pnnacc + CONVERTDARKNET="$CONVERTDARKNET import darknet" + + + if [ -f ${NAME}.json ]; then + echo -e "\033[31m rm ${NAME}.json \033[0m" + rm ${NAME}.json + fi + + if [ -f ${NAME}.data ]; then + echo -e "\033[31m rm ${NAME}.data \033[0m" + rm ${NAME}.data + fi + + echo "=========== Converting $NAME darknet model ===========" + cmd="$CONVERTDARKNET \ + --model ${NAME}.cfg \ + --weight ${NAME}.weights \ + --output-model ${NAME}.json \ + --output-data ${NAME}.data" +} + +function import_pytorch_network() +{ + NAME=$1 + CONVERTPYTORCH=$NETRANS_PATH/pnnacc + CONVERTPYTORCH="$CONVERTPYTORCH import pytorch" + + + if [ -f ${NAME}.json ]; then + echo -e "\033[31m rm ${NAME}.json \033[0m" + rm ${NAME}.json + fi + + if [ -f ${NAME}.data ]; then + echo -e "\033[31m rm ${NAME}.data \033[0m" + rm ${NAME}.data + fi + + echo "=========== Converting $NAME pytorch model ===========" + cmd="$CONVERTPYTORCH \ + --model ${NAME}.pt \q + --output-model ${NAME}.json \ + --output-data ${NAME}.data \ + $(cat input_size.txt)" +} + +function import_network() +{ + NAME=$(basename "$1") + pushd $1 + + if [ -f ${NAME}.prototxt ]; then + import_caffe_network ${NAME%/} + elif [ -f ${NAME}.pb ]; then + import_tensorflow_network ${NAME%/} + elif [ -f ${NAME}.onnx ]; then + import_onnx_network ${NAME%/} + elif [ -f ${NAME}.tflite ]; then + import_tflite_network ${NAME%/} + elif [ -f ${NAME}.weights ]; then + import_darknet_network ${NAME%/} + elif [ -f ${NAME}.pt ]; then + import_pytorch_network ${NAME%/} + else + echo "=========== can not find suitable model files ===========" + fi + + echo $cmd + eval $cmd + + if [ -f ${NAME}.data -a -f ${NAME}.json ]; then + echo -e "\033[31m SUCCESS \033[0m" + else + echo -e "\033[31m ERROR ! \033[0m" + fi + popd +} + +if [ "$#" -ne 1 ]; then + echo "Input a network name !" + exit -1 +fi + +if [ ! -e "${1%/}" ]; then + echo "Directory ${1%/} does not exist !" + exit -2 +fi + +import_network ${1%/}