diff --git a/introduction.md b/introduction.md index 6873048..b2fa548 100644 --- a/introduction.md +++ b/introduction.md @@ -38,49 +38,34 @@ netrans ``` - 计算机需要满足上面描述的硬件需求 -Netrans为编译好的文件,只需要在系统中添加对应的路径即可直接使用。 - -方案一:需要修改.bashrc文件增加以下行,请注意路径匹配,下行命令中的install_path 需要修改为您实际的安装目录。 - -```shell -export NETRANS_PATH= install_path/netrans/bin -``` - -然后执行 - -```shell -source ~/.bashrc -``` - -方案二:在命令行中直接输入以下行,请注意路径匹配,下行命令中的install_path 需要修改为您实际的安装目录。 - -```shell -export NETRANS_PATH=netrans/bin -``` -如果使用方案二,则每次使用 Nertans 之前都需要执行 export 操作。 - -如果您想使用 Netrans python api , 需要安装 netrans_py。请注意路径匹配,下行命令中的install_path 需要修改为您实际的安装目录。 - +执行以下命令安装 Netrans。 +创建 conda 环境 . ```bash -cd install_path/netrans/netrans_py -pip3 install -e . +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_cli 将工作流程如下: -- 1. 使用 import_model.sh 导入并转换模型到中间模型文件 -- 2. 使用 gen_inputmeta.sh 生成gen_inputmeta文件 -- 3. 使用quantize.sh 量化导入后的中间模型文件 -- 4. 使用export.sh 导出应用部署程序工程,以便部署到硬件。 - -在使用 gen_inputmeta.sh 生成gen_inputmeta文件时,您可能需要根据您预训练模型的数据预处理流程修改生成的inputmeta.yml文件。具体请参考[introduction.md](./introduction.md) - -使用 Netrans_py 的工作流程如下: - -- 1. 始化 Netrans -- 2. 使用 model2nbg 函数实现模型导入、预处理参数配置、量化和导出,生成应用部署程序工程。 +Netrans 工作流程如下: +- 1. 导入并转换模型到中间模型文件 +- 2. 生成 inputmeta 文件 +- 3. 量化模型 +- 4. 导出模型应用部署程序工程,以便部署到硬件。 Netrans 提供 tensorflow、caffe、darknet 和 onnx 的模型转换示例,请参考 examples。 @@ -262,4 +247,4 @@ yolov5s/ ├── 0.jpg # 校准数据 ├── dataset.txt # 指定数据地址的文件 └── yolov5s.onnx # 网络模型 -``` \ No newline at end of file +``` diff --git a/netrans_cli/README.md b/netrans_cli/README.md index 600c5e5..80546a9 100644 --- a/netrans_cli/README.md +++ b/netrans_cli/README.md @@ -5,53 +5,30 @@ netrans_cli 是 netrans 进行模型转换的命令行工具,使用 ntrans_cli 3. 量化模型 4. 导出模型 - -## 安装 - -**注意:准备好的工程目录应符合netrans 要求,且和脚本在用一目录下** - -比如导入一个TensorFlow的lenet模型,那么目录格式应如下: -```bash -. -├── export.sh -├── gen_inputmeta.sh -├── import_model.sh -├── infer.sh -├── lenet -│ ├── 0.jpg -│ ├── dataset.txt -│ ├── inputs_outputs.txt -│ └── lenet.pb -└── quantize.sh -``` - ## netrans_cli 脚本介绍 |脚本|功能|使用| |:---|---|---| -|import_model.sh| 模型导入功能,将模型转换成 pnna 支持的格式| sh import_model.sh model_name| -|gen_inputmeta.sh| 预处理模版生成功能,生成预处理模版,根据模型进行对于的修改| sh gen_inputmeta.sh model_name| -| quantize.sh| 量化功能, 对模型进行量化生成量化参数文件| sh quantize.sh model_name quantize_data_type| -|infer.sh| 推理功能,对模型进行推理|sh infer.sh model_name quantize_data_type
注意:该功能仅用于测试,和开发板上推理结果不完全一致| -|export.sh|导出功能,将量化好的模型导出成 pnna 上可以运行的runtime| sh export.sh model_name quantize_data_type| -|img2dat.sh|图片数据转换成量化后的二进制文件。需要转换的图片名存放在dataset.txt中。需要实先进行 inputmeta 文件生成 和 模型量化。 | sh img2dat.sh model_name quantize_data_type| +|import.sh| 模型导入功能,将模型转换成 pnna 支持的格式| import_model.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| -## 使用 netrans_cli 完成模型转换 -### import.sh 导入模型 +## 数据准备 +对于不同框架下训练的模型,需要准备不同的数据,所有的数据都需要放在同一个文件夹下。 +模型名和文件名需要保持一致。 -使用import.sh脚本进行导入 -- 用法: ./import.sh 以模型文件名命名的模型数据文件夹,例如: - ```shell - $ ./import.sh lenet - ... ... - I End importing tensorflow... - I Dump net to lenet.json - I Save net to lenet.data - I ----------------Error(0),Warning(0)---------------- - SUCCESS +## import.sh 导入模型 + +使用 import.sh 导入模型 +- 用法: import.sh 以模型文件名命名的模型数据文件夹,例如: + ```bash + $ import.sh lenet ``` + "lenet"是文件夹名,也作为模型名和权重文件名。导入会打印相关日志信息,成功后会打印SUCESS。导入后lenet文件夹应该有"lenet.json"和"lenet.data"文件: - ```shell + + ```bash $ ls -lrt lenet total 3396 -rwxr-xr-x 1 hope hope 1727201 Nov 5 2018 lenet.pb @@ -62,18 +39,13 @@ netrans_cli 是 netrans 进行模型转换的命令行工具,使用 ntrans_cli -rw-r--r-- 1 hope hope 1725178 Jun 7 09:21 lenet.data ``` -### gen_inputmeta 生成Inputmeta文件 -在netrans_cli目录下使用inputmeta_gen.sh脚本生成inputmeta文件 -- ./gen_inputmeta.sh 以模型文件名命名的模型数据文件夹,例如: - ```shell - $ ./gen_inputmeta.sh lenet - ... ... - I Namespace(generate='inputmeta', input_meta_output=None, model='lenet.json', separated_database=True, which='generate') - I Load model in lenet.json - I Generate input meta lenet_inputmeta.yml - I ----------------Error(0),Warning(0)---------------- +## config 生成 Inputmeta 文件 +使用 config.sh 生成 inputmeta 文件 +- config.sh 以模型文件名命名的模型数据文件夹,例如: + ```bash + $ config.sh lenet ``` - + inputmeta 文件生成会打印相关日志信息,成功后会打印SUCESS。导入后lenet文件夹应该有 "lenet_inputmeta.yml" 文件: ```shell $ ls -lrt lenet total 3400 @@ -172,67 +144,26 @@ input_meta: 可以根据实际情况对生成的inputmeta文件进行修改。 ### 模型量化 -如果我们训练好的模型的数据类型是float32的,为了使模型以更高的效率在pnna上运行,我们可以对模型进行量化操作,量化操作可能会带来一定程度的精度损失。< -在netrans_cli目录下使用quantize.sh脚本进行量化操作。 +如果我们训练好的模型的数据类型是float32的,为了使模型以更高的效率在pnna上运行,我们可以对模型进行量化操作,量化操作可能会带来一定程度的精度损失。 + +- 在netrans_cli目录下使用quantize.sh脚本进行量化操作。 用法:./quantize.sh 以模型文件名命名的模型数据文件夹 量化类型,例如: -```shell -$ ./quantize.sh lenet uint8 -... ... -I End quantization... -I Dump net quantize tensor table to lenet_asymmetric_affine.quantize -I Save net to lenet.data -I ----------------Error(0),Warning(0)---------------- -SUCCESS - +```bash +$ quantize.sh lenet uint8 ``` 支持的量化类型有:uint8、int8、int16 -### 模型推理 - -在netrans_cli目录下使用infer.sh脚本进行推理 - -- 用法:./infer.sh 以模型文件名命名的模型数据文件夹 数据类型,例如: - - ```shell - $ ./infer.sh lenet uint8 - ... ... - I Build lenet complete. - I Running 1 iterations - I Save tensor ./inf/iter_0_attach_output_out0_0_out0_1_10.tensor - I Save tensor ./inf/iter_0_attach_input_x-input_out0_1_out0_1_28_28_1.tensor - I Iter(0), top(5), tensor(@attach_output/out0_0:out0) : - I 0: 1.0 - I 9: 0.0 - I 8: 0.0 - I 7: 0.0 - I 6: 0.0 - I Check const pool... - I Queue cancelled. - I End infer... - I ----------------Error(0),Warning(0)---------------- - =========== End infer lenet model =========== - - ``` - -推理支持的数据类型:float、uint8、int8、int16,其中使用uint8、int8、int16推理时需要先进行模型量化。 - ### 模型导出 -在netrans_cli目录下使用export.sh脚本进行推理。 +使用 export.sh 进行推理。 -用法:./export.sh 以模型文件名命名的模型数据文件夹 数据类型,例如: +用法:export.sh 以模型文件名命名的模型数据文件夹 数据类型,例如: -```shell -./export.sh lenet uint8 -... ... -I End exporting ovxlib case... -I ----------------Error(0),Warning(0)---------------- -======================================================================= -=========== End Generate lenet ovx C code with type of asymmetric_affine =========== -======================================================================= +```bash +export.sh lenet uint8 ``` 导出支持的数据类型:float、uint8、int8、int16,其中使用uint8、int8、int16导出时需要先进行模型量化。导出的工程会在模型所在的目录下面的wksp目录里。 diff --git a/netrans_py/README.md b/netrans_py/README.md index 7796519..661d345 100644 --- a/netrans_py/README.md +++ b/netrans_py/README.md @@ -7,27 +7,7 @@ netrans_py 支持通过 python api 灵活地将模型转换成pnna 支持的格 3. 量化模型 4. 导出模型 -## 安装 -在使用netrans_py之前,需要安装netrans_py。 -设置环境变量 NETRANS_PATH 并指向该 bin 目录。 -注意: 在该项目中,项目下载目录为 `/home/nudt_dps/netrans`,在您应用的过程中,可以使用 `pwd` 来确认您的项目目录。 - -```bash -export NETRANS_PATH=/home/nudt_dps/netrans/bin -``` -同时设置LD_LIBRARY_PATH(Ubuntu,其他系统根据具体情况设置): - -```bash -export LD_LIBRARY_PATH=/home/nudt_dps/netrans/bin:$LD_LIBRARY_PATH -``` -注意这一步每次使用前都需要执行,或者您可以写入 .bashrc (路径为 `~/.bashrc` )。 - -然后进入目录 netrans_py 进行安装。 -```bash -cd /home/nudt_dps/netrans/netrans_py -pip3 install -e . -``` ## netrans_py api ### Netrans 导入api及创建实例 创建 Netrans @@ -68,17 +48,22 @@ pip3 install -e . 无。 在工程目录下生成 pnna 支持的模型格式,以.json结尾的模型文件和 .data结尾的权重文件。 -### Netrans.gen_inputmeta 预处理配置文件生成 +### Netrans.config 预处理配置文件生成 描述: 将模型转换成 pnna 支持的格式。 代码示例: ```py3 - yolo_netrans.gen_inputmeta() + yolo_netrans.config() ``` 参数: - 无。 + | 参数名 | 类型 | 说明 | +|:---| -- | -- | +|inputmeta| bool,str, [Fasle, True, "inputmeta_filepath"] | 指定 inputmeta, 默认为False。
如果为False,则会生成inputmeta模板,可使用mean、scale、reverse_channel 配合修改常用参数。
如果已有现成的 inputmeta 文件,则可通过该参数进行指定,也可使用True, 则会自动索引 model_name_inputmeta.yml | +|mean| float, int, list | 设置预处理中 normalize 的 mean 参数 | +|scale| float, int, list | 设置预处理中 normalize 的 scale 参数 | +|reverse_channel | bool | 设置预处理中的 reverse_channel 参数 | 输出返回: 无。 @@ -148,7 +133,7 @@ yolo_netrans.model2nbg(quantize_type='uint8', inputmeta=True) ## 使用实例 - ``` + ```py3 from nertans import Netrans model_path = 'example/darknet/yolov4_tiny' netrans_path = "netrans/bin" # 如果进行了export定义申明,这一步可以不用 diff --git a/netrans_py/gen_inputmeta.py b/netrans_py/config.py similarity index 95% rename from netrans_py/gen_inputmeta.py rename to netrans_py/config.py index 68979f9..2ab9c52 100644 --- a/netrans_py/gen_inputmeta.py +++ b/netrans_py/config.py @@ -3,7 +3,7 @@ import os import sys from utils import check_path, AttributeCopier, creat_cla -class InputmetaGen(AttributeCopier): +class Config(AttributeCopier): def __init__(self, source_obj) -> None: super().__init__(source_obj) diff --git a/netrans_py/netrans.py b/netrans_py/netrans.py index d42673c..62fe560 100644 --- a/netrans_py/netrans.py +++ b/netrans_py/netrans.py @@ -7,7 +7,7 @@ import file_model from import_model import ImportModel from quantize import Quantize from export import Export -from gen_inputmeta import InputmetaGen +from config import Config # from utils import check_path import warnings warnings.simplefilter('ignore', yaml.error.UnsafeLoaderWarning) @@ -109,7 +109,7 @@ class Netrans(): func.import_network() def inputmeta_gen(self): - func = InputmetaGen(self) + func = Config(self) func.inputmeta_gen() def quantize(self, quantize_type): diff --git a/quick_start_guide.md b/quick_start_guide.md index 37f260c..289d0e8 100644 --- a/quick_start_guide.md +++ b/quick_start_guide.md @@ -15,7 +15,7 @@ conda create -n netrans python=3.8 -y conda activate netrans ``` -安装 Netrans . +下载 Netrans . ```bash mkdir -p ~/app cd ~/app