diff --git a/docs/duo/application-development/tpu/tpu-densenet.md b/docs/duo/application-development/tpu/tpu-densenet.md new file mode 100644 index 00000000..fc9d22a0 --- /dev/null +++ b/docs/duo/application-development/tpu/tpu-densenet.md @@ -0,0 +1,7 @@ +--- +sidebar_label: 'Densenet Image Classification' +sidebar_position: 39 +--- + +# Image Classification Based on Densenet + diff --git a/docs/duo/application-development/tpu/tpu-googlenet.md b/docs/duo/application-development/tpu/tpu-googlenet.md new file mode 100644 index 00000000..a0542c19 --- /dev/null +++ b/docs/duo/application-development/tpu/tpu-googlenet.md @@ -0,0 +1,7 @@ +--- +sidebar_label: 'Googlenet Image Classification' +sidebar_position: 37 +--- + +# Image Classification Based on Googlenet + diff --git a/docs/duo/application-development/tpu/tpu-resnet18.md b/docs/duo/application-development/tpu/tpu-resnet18.md new file mode 100644 index 00000000..7d27f891 --- /dev/null +++ b/docs/duo/application-development/tpu/tpu-resnet18.md @@ -0,0 +1,7 @@ +--- +sidebar_label: 'Resnet18 Image Classification' +sidebar_position: 40 +--- + +# Image Classification Based on Resnet18 + diff --git a/docs/duo/application-development/tpu/tpu-squeezenet.md b/docs/duo/application-development/tpu/tpu-squeezenet.md new file mode 100644 index 00000000..d1a3e518 --- /dev/null +++ b/docs/duo/application-development/tpu/tpu-squeezenet.md @@ -0,0 +1,7 @@ +--- +sidebar_label: 'Squeezenet Image Classification' +sidebar_position: 38 +--- + +# Image Classification Based on Squeezenet + diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-densenet.md b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-densenet.md new file mode 100644 index 00000000..006335fd --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-densenet.md @@ -0,0 +1,221 @@ +--- +sidebar_label: '基于Densenet的图像分类' +sidebar_position: 39 +--- + +# 基于 Densenet 的图像分类 + +## 1. 配置 Docker 开发环境 + +参考 [这里](https://milkv.io/zh/docs/duo/application-development/tpu/tpu-docker) 配置好 Docker 开发环境后,再回到这里继续下一步 + +## 2. 在 Docker 中准备工作目录 + +创建并进入 `densenet121` 工作目录,注意是与 `tpu-mlir_*` 同级的目录 +``` +# mkdir densenet121 && cd densenet121 +``` + +获取原始模型 +``` +# wget https://github.com/onnx/models/raw/main/vision/classification/densenet-121/model/densenet-12.tar.gz +``` +将 `densenet-12.tar.gz` 解压 +``` +# tar -zxvf densenet-12.tar.gz +``` +解压后会在当前目录生成 `densenet-12` 文件夹,该文件夹下包含有 `densenet-12.onnx` 模型文件 + +拷贝测试图片: +``` +# cp -rf ${TPUC_ROOT}/regression/dataset/ILSVRC2012/ . +# cp -rf ${TPUC_ROOT}/regression/image/ . +``` +这里的 `${TPUC_ROOT}` 是环境变量,对应 `tpu-mlir_*` 目录,是在前面配置 Docker 开发环境中 `source ./tpu-mlir_*/envsetup.sh` 这一步加载的 + +创建并进入 `work` 工作目录,用于存放编译生成的 MLIR、cvimodel 等文件 +``` +# mkdir work && cd work +``` + +## 3. ONNX 模型转换 + +:::tip +Duo 开发板搭载的是 CV1800B 芯片,该芯片支持 **ONNX 系列** 和 **Caffe 模型**,目前不支持 TFLite 模型。在量化数据类型方面,支持 **BF16 格式的量化** 和 **INT8 格式的非对称量化** +::: + +模型转换步骤如下: +- ONNX 模型转换成 MLIR +- 生成量化需要的校准表 +- MLIR 量化成 INT8 非对称 cvimodel + +### ONNX 模型转换成 MLIR + +本例中的模型是 BGR 输入, `mean` 和 `scale` 分别为 `123.675`,`116.28`,`103.53` 和 `0.0171`,`0.0175`,`0.0174` + +将 ONNX 模型转换为 MLIR 模型的命令如下: +``` +model_transform.py \ + --model_name densenet121 \ + --model_def ../densenet-12/densenet-12.onnx \ + --test_input ../image/cat.jpg \ + --input_shapes [[1,3,224,224]] \ + --resize_dims 256,256 \ + --mean 123.675,116.28,103.53 \ + --scale 0.0171,0.0175,0.0174 \ + --pixel_format rgb \ + --test_result densenet121_top_outputs.npz \ + --mlir densenet121.mlir +``` + +运行成功效果示例 + +![duo](/docs/duo/tpu/duo-tpu-densenet_05.png) + +转成 MLIR 模型后,会生成一个 `densenet121.mlir` 文件,该文件即为 MLIR 模型文件,还会生成一个 `densenet121_in_f32.npz` 文件和一个 `densenet121_top_outputs.npz` 文件,是后续转模型的输入文件 + +![duo](/docs/duo/tpu/duo-tpu-densenet_06.png) + +### MLIR 转 INT8 模型 + +#### 生成量化需要的校准表 + +在转 INT8 模型之前需要先生成校准表,这里用现有的 100 张来自 ILSVRC2012 的图片举例,执行 calibration 命令: +``` +run_calibration.py densenet121.mlir \ + --dataset ../ILSVRC2012 \ + --input_num 100 \ + -o densenet121_cali_table +``` + +运行成功效果示例 + +![duo](/docs/duo/tpu/duo-tpu-densenet_07.png) + +运行完成后会生成名为 `densenet121_cali_table` 的文件, 该文件用于后续编译 INT8 模型的输入文件 + +![duo](/docs/duo/tpu/duo-tpu-densenet_08.png) + +#### MLIR 量化成 INT8 非对称 cvimodel + +将 MLIR 模型转换为 INT8 模型的命令如下: +``` +model_deploy.py \ + --mlir densenet121.mlir \ + --quantize INT8 \ + --calibration_table densenet121_cali_table \ + --chip cv180x \ + --test_input ../image/cat.jpg \ + --test_reference densenet121_top_outputs.npz \ + --compare_all \ + --fuse_preprocess \ + --model densenet121_cv180x_int8_fuse.cvimodel +``` + +运行成功效果示例 + +![duo](/docs/duo/tpu/duo-tpu-densenet_09.png) + +编译完成后, 会生成名为 `densenet121_cv180x_int8_fuse.cvimodel` 的文件 + +![duo](/docs/duo/tpu/duo-tpu-densenet_10.png) + +## 4. 在 Duo 开发板上进行验证 + +### 连接 Duo 开发板 + +根据前面的教程完成 Duo 开发板与电脑的连接,并使用 `mobaxterm` 或 `Xshell` 等工具开启终端操作 Duo 开发板 + +### 获取 cvitek_tpu_sdk + +1. 从 MEGA 下载 + + [下载地址](https://mega.nz/folder/yZghQA4R#aZkbTwJb7Ji5LvAWIuBtag) + + 包名: `cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz` + +2. 从 ftp 服务器下载 + + ``` + sftp://218.17.249.213 + username: cvitek_mlir_2023 + password: 7&2Wd%cu5k + ``` + 如果文件未找到,可以到 backup 目录中找一下,可能更新版本后旧版本的包被放到 backup 目录 + +下载完成后,通过 Windows 终端拷贝到 Docker 中 +``` +docker cp C:\Users\Carbon\Duo-TPU\cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz DuoTPU:/workspace/ +``` + +并在 Docker 中进行解压 +``` +# cd /workspace +# tar -zxvf cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz +``` + +解压完成后会生成`cvitek_tpu_sdk`文件夹 + +### 将开发工具包和模型文件拷贝到开发板上 + +在 duo 开发板的终端中,新建文件目录 `/mnt/tpu/` +``` +# mkdir -p /mnt/tpu && cd /mnt/tpu +``` + +在 Docker 的终端中,将开发工具包和模型文件拷贝到开发板上 +``` +# scp -r /workspace/cvitek_tpu_sdk root@192.168.42.1:/mnt/tpu/ +# scp /workspace/densenet121/work/densenet121_cv180x_int8_fuse.cvimodel root@192.168.42.1:/mnt/tpu/cvitek_tpu_sdk/ +``` + +### 设置环境变量 + +在 Duo 开发板的终端中,进行环境变量的设置 +``` +# cd /mnt/tpu/cvitek_tpu_sdk +# source ./envs_tpu_sdk.sh +``` + +### 进行图像分类测试 + +在 Duo 开发板上,对该图像进行分类 + +![duo](/docs/duo/tpu/duo-tpu-cat.jpg) + +在 Duo 开发板的终端中,使用 `densenet121_cv180x_int8_fuse.cvimodel` 模型进行图像分类: +``` +./samples/bin/cvi_sample_classifier_fused_preprocess \ + ./densenet121_cv180x_int8_fuse.cvimodel \ + ./samples/data/cat.jpg \ + ./samples/data/synset_words.txt +``` + +分类成功结果示例 + +![duo](/docs/duo/tpu/duo-tpu-densenet_11.png) + +## 5. 附录 + +正文涉及到的文件总结如下 + +- TPU-MLIR 模型转换工具:tpu-mlir_v1.3.228-g19ca95e9-20230921.tar.gz +- TPU SDK 开发工具包:cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz +- (附)Sample 测试例程源码:cvitek_tpu_samples.tar.gz +- (附)转换好的 cvimodel 包:cvimodel_samples_cv180x.tar.gz + +正文提到的 TPU 开发所需的包文件可在下面 sftp 站点获取,或者从 [MEGA](https://mega.nz/folder/yZghQA4R#aZkbTwJb7Ji5LvAWIuBtag) 下载 +``` +sftp://218.17.249.213 +user: cvitek_mlir_2023 +password: 7&2Wd%cu5k +``` + +使用 WinSCP 登陆 sftp 站点后的界面 + +![duo](/docs/duo/tpu/duo-tpu-sftp.png) + +注意: +1. sample 目录下的 samples_extra 提供了更多 samples 脚本,但其中 cvimodel 名字已经硬编码在其中,如想使用脚本运行,需要自行修改 cvimodel 名字 +2. 此小节介绍的是使用预编译好的 sample 程序对转换好的 cvimodel 进行部署测试,如果开发者有兴趣对 samples 源码进行编码和交叉编译,请参考官网 [TPU-MLIR文档](https://doc.sophgo.com/sdk-docs/v23.05.01/docs_latest_release/docs/tpu-mlir/quick_start/html/10_cv18xx_guide.html#runtime-sample) 中的第9章《CV18xx芯片使用指南》中的 +第3小节 "编译和运行runtime sample" 内容 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-googlenet.md b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-googlenet.md new file mode 100644 index 00000000..dfae6908 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-googlenet.md @@ -0,0 +1,244 @@ +--- +sidebar_label: '基于Googlenet的图像分类' +sidebar_position: 37 +--- + +# 基于 Googlenet 的图像分类 + +## 1. 配置 Docker 开发环境 + +参考 [这里](https://milkv.io/zh/docs/duo/application-development/tpu/tpu-docker) 配置好 Docker 开发环境后,再回到这里继续下一步 + +## 2. 在 Docker 中准备工作目录 + +创建并进入 `googlenet` 工作目录,注意是与 `tpu-mlir_*` 同级的目录 +``` +# mkdir googlenet && cd googlenet +``` + +获取原始模型 +``` +wget https://github.com/onnx/models/raw/main/vision/classification/inception_and_googlenet/googlenet/model/googlenet-12.onnx +``` + +拷贝测试图片: +``` +# cp -rf ${TPUC_ROOT}/regression/dataset/ILSVRC2012/ . +# cp -rf ${TPUC_ROOT}/regression/image/ . +``` +这里的 `${TPUC_ROOT}` 是环境变量,对应 `tpu-mlir_*` 目录,是在前面配置 Docker 开发环境中 `source ./tpu-mlir_*/envsetup.sh` 这一步加载的 + +创建并进入 `work` 工作目录,用于存放编译生成的 MLIR、cvimodel 等文件 +``` +# mkdir work && cd work +``` + +## 3. ONNX 模型转换 + +:::tip +Duo 开发板搭载的是 CV1800B 芯片,该芯片支持 **ONNX 系列** 和 **Caffe 模型**,目前不支持 TFLite 模型。在量化数据类型方面,支持 **BF16 格式的量化** 和 **INT8 格式的非对称量化** +::: + +### ONNX 模型转换成 MLIR + +本例中的模型是 BGR 输入, `mean` 和 `scale` 分别为 `123.675`,`116.28`,`103.53` 和 `0.0171`,`0.0175`,`0.0174`,模型转换命令如下: +``` +model_transform.py \ + --model_name googlenet \ + --model_def ../googlenet-12.onnx \ + --test_input ../image/cat.jpg \ + --input_shapes [[1,3,224,224]] \ + --resize_dims 256,256 \ + --mean 123.675,116.28,103.53 \ + --scale 0.0171,0.0175,0.0174 \ + --pixel_format rgb \ + --test_result googlenet_top_outputs.npz \ + --mlir googlenet.mlir +``` + +运行成功效果示例 + +![duo](/docs/duo/tpu/duo-tpu-googlenet_05.png) + +转成 MLIR 模型后,会生成一个 `googlenet.mlir` 文件,该文件即为 MLIR 模型文件,还会生成一个 `googlenet_in_f32.npz` 文件和一个 `googlenet_top_outputs.npz` 文件,是后续转模型的输入文件 + +![duo](/docs/duo/tpu/duo-tpu-googlenet_06.png) + +### MLIR 转 BF16 模型 + +将 MLIR 模型转换为 BF16 模型的命令如下 +``` +model_deploy.py \ + --mlir googlenet.mlir \ + --quantize BF16 \ + --chip cv180x \ + --test_input googlenet_in_f32.npz \ + --test_reference googlenet_top_outputs.npz \ + --model googlenet_cv180x_bf16.cvimodel +``` + +运行成功效果示例 + +![duo](/docs/duo/tpu/duo-tpu-googlenet_07.png) + +编译完成后,会生成 `googlenet_cv180x_bf16.cvimodel` 文件 + +![duo](/docs/duo/tpu/duo-tpu-googlenet_08.png) + +### MLIR 转 INT8 模型 + +#### 生成量化需要的校准表 + +运行 `run_calibration.py` 得到校准表,输入数据的数量根据情况准备 100~1000 张左右。 这里用现有的 100 张来自 ILSVRC2012 的图片举例,执行 calibration 命令: +``` +run_calibration.py googlenet.mlir \ + --dataset ../ILSVRC2012 \ + --input_num 100 \ + -o googlenet_cali_table +``` + +运行成功效果示例 + +![duo](/docs/duo/tpu/duo-tpu-googlenet_09.png) + +运行完成后会生成名为 `googlenet_cali_table` 的文件, 该文件用于后续编译 INT8 模型的输入文件 + +![duo](/docs/duo/tpu/duo-tpu-googlenet_10.png) + +#### MLIR 量化成 INT8 非对称 cvimodel + +将 MLIR 模型转换为 INT8 模型的命令如下: +``` +model_deploy.py \ + --mlir googlenet.mlir \ + --quantize INT8 \ + --calibration_table googlenet_cali_table \ + --chip cv180x \ + --test_input ../image/cat.jpg \ + --test_reference googlenet_top_outputs.npz \ + --compare_all \ + --fuse_preprocess \ + --model googlenet_cv180x_int8_fuse.cvimodel +``` + +运行成功效果示例 + +![duo](/docs/duo/tpu/duo-tpu-googlenet_11.png) + +编译完成后, 会生成名为 `googlenet_cv180x_int8_fuse.cvimodel` 的文件 + +![duo](/docs/duo/tpu/duo-tpu-googlenet_12.png) + +## 4. 在 Duo 开发板上进行验证 + +### 连接 Duo 开发板 + +根据前面的教程完成 Duo 开发板与电脑的连接,并使用 `mobaxterm` 或 `Xshell` 等工具开启终端操作 Duo 开发板 + +### 获取 cvitek_tpu_sdk + +1. 从 MEGA 下载 + + [下载地址](https://mega.nz/folder/yZghQA4R#aZkbTwJb7Ji5LvAWIuBtag) + + 包名: `cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz` + +2. 从 ftp 服务器下载 + + ``` + sftp://218.17.249.213 + username: cvitek_mlir_2023 + password: 7&2Wd%cu5k + ``` + 如果文件未找到,可以到 backup 目录中找一下,可能更新版本后旧版本的包被放到 backup 目录 + +下载完成后,通过 Windows 终端拷贝到 Docker 中 +``` +docker cp C:\Users\Carbon\Duo-TPU\cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz DuoTPU:/workspace/ +``` + +并在 Docker 中进行解压 +``` +# cd /workspace +# tar -zxvf cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz +``` + +解压完成后会生成`cvitek_tpu_sdk`文件夹 + +### 将开发工具包和模型文件拷贝到开发板上 + +在 duo 开发板的终端中,新建文件目录 `/mnt/tpu/` +``` +# mkdir -p /mnt/tpu && cd /mnt/tpu +``` + +在 Docker 的终端中,将开发工具包和前面生成的两个模型文件拷贝到开发板上 +``` +# scp -r /workspace/cvitek_tpu_sdk root@192.168.42.1:/mnt/tpu/ +# scp /workspace/googlenet/work/googlenet_cv180x_bf16.cvimodel root@192.168.42.1:/mnt/tpu/cvitek_tpu_sdk/ +# scp /workspace/googlenet/work/googlenet_cv180x_int8_fuse.cvimodel root@192.168.42.1:/mnt/tpu/cvitek_tpu_sdk/ +``` + +### 设置环境变量 + +在 Duo 开发板的终端中,进行环境变量的设置 +``` +# cd /mnt/tpu/cvitek_tpu_sdk +# source ./envs_tpu_sdk.sh +``` + +### 进行图像分类测试 + +在 Duo 开发板上,对该图像进行分类 + +![duo](/docs/duo/tpu/duo-tpu-cat.jpg) + +使用 `googlenet_cv180x_bf16.cvimodel` 模型进行图像分类 +``` +./samples/bin/cvi_sample_classifier_bf16 \ + ./googlenet_cv180x_bf16.cvimodel \ + ./samples/data/cat.jpg \ + ./samples/data/synset_words.txt +``` + +分类成功结果示例 + +![duo](/docs/duo/tpu/duo-tpu-googlenet_13.png) + +使用 `googlenet_cv180x_int8_fuse.cvimodel` 模型进行图像分类 +``` +./samples/bin/cvi_sample_classifier_fused_preprocess \ + ./googlenet_cv180x_int8_fuse.cvimodel \ + ./samples/data/cat.jpg \ + ./samples/data/synset_words.txt +``` + +分类成功结果示例 + +![duo](/docs/duo/tpu/duo-tpu-googlenet_14.png) + + +## 5. 附录 + +正文涉及到的文件总结如下 + +- TPU-MLIR 模型转换工具:tpu-mlir_v1.3.228-g19ca95e9-20230921.tar.gz +- TPU SDK 开发工具包:cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz +- (附)Sample 测试例程源码:cvitek_tpu_samples.tar.gz +- (附)转换好的 cvimodel 包:cvimodel_samples_cv180x.tar.gz + +正文提到的 TPU 开发所需的包文件可在下面 sftp 站点获取,或者从 [MEGA](https://mega.nz/folder/yZghQA4R#aZkbTwJb7Ji5LvAWIuBtag) 下载 +``` +sftp://218.17.249.213 +user: cvitek_mlir_2023 +password: 7&2Wd%cu5k +``` + +使用 WinSCP 登陆 sftp 站点后的界面 + +![duo](/docs/duo/tpu/duo-tpu-sftp.png) + +注意: +1. sample 目录下的 samples_extra 提供了更多 samples 脚本,但其中 cvimodel 名字已经硬编码在其中,如想使用脚本运行,需要自行修改 cvimodel 名字 +2. 此小节介绍的是使用预编译好的 sample 程序对转换好的 cvimodel 进行部署测试,如果开发者有兴趣对 samples 源码进行编码和交叉编译,请参考官网 [TPU-MLIR文档](https://doc.sophgo.com/sdk-docs/v23.05.01/docs_latest_release/docs/tpu-mlir/quick_start/html/10_cv18xx_guide.html#runtime-sample) 中的第9章《CV18xx芯片使用指南》中的 +第3小节 "编译和运行runtime sample" 内容 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-mobilenetv2.md b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-mobilenetv2.md index ba1ef62e..1703393a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-mobilenetv2.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-mobilenetv2.md @@ -1,9 +1,9 @@ --- -sidebar_label: '基于MobileNetV2的的图像分类' +sidebar_label: '基于MobileNetV2的图像分类' sidebar_position: 35 --- -# 基于 MobileNetV2 的的图像分类 +# 基于 MobileNetV2 的图像分类 ## 1. 配置 Docker 开发环境 @@ -11,7 +11,7 @@ sidebar_position: 35 ## 2. 在 Docker 中准备工作目录 -创建并进入 `mobilenet_v2` 工作目录,注意是与`tpu-mlir_*`同级的目录 +创建并进入 `mobilenet_v2` 工作目录,注意是与 `tpu-mlir_*` 同级的目录 ``` # mkdir mobilenet_v2 && cd mobilenet_v2 ``` @@ -25,18 +25,22 @@ git clone https://github.com/shicai/MobileNet-Caffe.git ``` # cp MobileNet-Caffe/mobilenet_v2_deploy.prototxt . # cp MobileNet-Caffe/mobilenet_v2.caffemodel . -# cp -rf $TPUC_ROOT/regression/dataset/ILSVRC2012/ . -# cp -rf $TPUC_ROOT/regression/image/ . +# cp -rf ${TPUC_ROOT}/regression/dataset/ILSVRC2012/ . +# cp -rf ${TPUC_ROOT}/regression/image/ . ``` -这里的`$TPUC_ROOT`是环境变量,对应`tpu-mlir_*`目录,是在前面配置 Docker 开发环境中 `source ./tpu-mlir_*/envsetup.sh` 这一步加载的 +这里的 `${TPUC_ROOT}` 是环境变量,对应 `tpu-mlir_*` 目录,是在前面配置 Docker 开发环境中 `source ./tpu-mlir_*/envsetup.sh` 这一步加载的 -再创建名为 `work` 的工作目录,用于存放编译生成的 `MLIR`、`cvimodel` 等文件 +创建并进入 `work` 工作目录,用于存放编译生成的 `MLIR`、`cvimodel` 等文件 ``` # mkdir work && cd work ``` ## 3. MobileNet-Caffe 模型转换 +:::tip +Duo 开发板搭载的是 CV1800B 芯片,该芯片支持 **ONNX 系列** 和 **Caffe 模型**,目前不支持 TFLite 模型。在量化数据类型方面,支持 **BF16 格式的量化** 和 **INT8 格式的非对称量化** +::: + 模型转换步骤如下: - Caffe 模型转换成 MLIR - 生成量化需要的校准表 @@ -46,7 +50,7 @@ git clone https://github.com/shicai/MobileNet-Caffe.git 模型输入是图片,在转模型之前我们需要了解模型的预处理。如果模型用预处理后的 npz 文件做输入,则不需要考虑预处理。预处理过程用公式表达如下($x$代表输入): $$ y = (x-mean)\times scale $$ -本例中的模型是 BGR 输入, mean 和 scale 分别为 103.94,116.78,123.68 和 0.017,0.017,0.017,模型转换命令如下: +本例中的模型是 BGR 输入, `mean` 和 `scale` 分别为 `103.94`,`116.78`,`123.68` 和 `0.017`,`0.017`,`0.017`,模型转换命令如下: ``` model_transform.py \ --model_name mobilenet_v2 \ @@ -66,11 +70,13 @@ model_transform.py \ ![duo](/docs/duo/tpu/duo-tpu-mobilenetv2_05.png) -转成 mlir 模型后,会生成一个`mobilenet_v2.mlir`文件,该文件即为 mlir 模型文件,还会生成一个`mobilenet_v2_in_f32.npz`文件,该文件是后续转模型的输入文件 +转成 MLIR 模型后,会生成一个 `mobilenet_v2.mlir` 文件,该文件即为 mlir 模型文件,还会生成一个 `mobilenet_v2_in_f32.npz` 文件和一个 `mobilenet_v2_top_outputs.npz` 文件,是后续转模型的输入文件 ![duo](/docs/duo/tpu/duo-tpu-mobilenetv2_06.png) -### 生成量化需要的校准表 +### MLIR 转 INT8 模型 + +#### 生成量化需要的校准表 运行 `run_calibration.py` 得到校准表,输入数据的数量根据情况准备 100~1000 张左右。 这里用现有的 100 张来自 ILSVRC2012 的图片举例,执行 calibration 命令: @@ -89,13 +95,9 @@ run_calibration.py mobilenet_v2.mlir \ ![duo](/docs/duo/tpu/duo-tpu-mobilenetv2_08.png) -### MLIR 量化成 INT8 非对称 cvimodel +#### MLIR 量化成 INT8 非对称 cvimodel -:::tip -Duo 开发板搭载的是 CV1800B 芯片,该芯片支持 **ONNX 系列** 和 **Caffe 模型**,目前不支持 TFLite 模型。在量化数据类型方面,支持 **BF16 格式的量化** 和 **INT8 格式的非对称量化** -::: - -用 `model_deploy.py` 脚本参数使用 `asymmetric` 进行非对称量化 将 MLIR 文件转成 INT8 非对称量化模型: +用 `model_deploy.py` 脚本参数使用 `asymmetric` 进行非对称量化,将 MLIR 文件转成 INT8 非对称量化模型: ``` model_deploy.py \ --mlir mobilenet_v2.mlir \ @@ -117,11 +119,11 @@ model_deploy.py \ ![duo](/docs/duo/tpu/duo-tpu-mobilenetv2_10.png) -## 4. 部署 INT8 cvimodel 到 Duo 开发板验证 +## 4. 在 Duo 开发板上进行验证 ### 连接 Duo 开发板 -根据前面的教程完成duo开发板与电脑的连接,并使用`mobaxterm`或`Xshell`等工具开启终端操作 Duo 开发板 +根据前面的教程完成 Duo 开发板与电脑的连接,并使用 `mobaxterm` 或 `Xshell` 等工具开启终端操作 Duo 开发板 ### 获取 cvitek_tpu_sdk @@ -155,9 +157,9 @@ docker cp C:\Users\Carbon\Duo-TPU\cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz ### 将开发工具包和模型文件拷贝到开发板上 -在 duo 开发板的终端中,新建文件目录 /mnt/tpu/ +在 duo 开发板的终端中,新建文件目录 `/mnt/tpu/` ``` -$ mkdir -p /mnt/tpu && cd /mnt/tpu +# mkdir -p /mnt/tpu && cd /mnt/tpu ``` 在 Docker 的终端中,将开发工具包和模型文件拷贝到开发板上 @@ -176,6 +178,10 @@ $ mkdir -p /mnt/tpu && cd /mnt/tpu ### 进行图像分类测试 +在 Duo 开发板上,对该图像进行分类 + +![duo](/docs/duo/tpu/duo-tpu-cat.jpg) + 进入 samples 目录 ``` @@ -189,7 +195,7 @@ $ mkdir -p /mnt/tpu && cd /mnt/tpu ![duo](/docs/duo/tpu/duo-tpu-mobilenetv2_11.png) -测试 +运行图像分类测试 ``` ./bin/cvi_sample_classifier_fused_preprocess \ ../mobilenet_v2_cv1800_int8_asym.cvimodel \ @@ -201,12 +207,6 @@ $ mkdir -p /mnt/tpu && cd /mnt/tpu ![duo](/docs/duo/tpu/duo-tpu-mobilenetv2_12.png) - -注意: -1. sample 目录下的 samples_extra 提供了更多 samples 脚本,但其中 cvimodel 名字已经硬编码在其中,如想使用脚本运行,需要自行修改 cvimodel 名字 -2. 此小节介绍的是使用预编译好的 sample 程序对转换好的 cvimodel 进行部署测试,如果开发者有兴趣对 samples 源码进行编码和交叉编译,请参考官网 [TPU-MLIR文档](https://doc.sophgo.com/sdk-docs/v23.05.01/docs_latest_release/docs/tpu-mlir/quick_start/html/10_cv18xx_guide.html#runtime-sample) 中的第9章《CV18xx芯片使用指南》中的 -第3小节 "编译和运行runtime sample" 内容 - ## 5. 附录 正文涉及到的文件总结如下 @@ -226,3 +226,8 @@ password: 7&2Wd%cu5k 使用 WinSCP 登陆 sftp 站点后的界面 ![duo](/docs/duo/tpu/duo-tpu-sftp.png) + +注意: +1. sample 目录下的 samples_extra 提供了更多 samples 脚本,但其中 cvimodel 名字已经硬编码在其中,如想使用脚本运行,需要自行修改 cvimodel 名字 +2. 此小节介绍的是使用预编译好的 sample 程序对转换好的 cvimodel 进行部署测试,如果开发者有兴趣对 samples 源码进行编码和交叉编译,请参考官网 [TPU-MLIR文档](https://doc.sophgo.com/sdk-docs/v23.05.01/docs_latest_release/docs/tpu-mlir/quick_start/html/10_cv18xx_guide.html#runtime-sample) 中的第9章《CV18xx芯片使用指南》中的 +第3小节 "编译和运行runtime sample" 内容 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-resnet18.md b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-resnet18.md new file mode 100644 index 00000000..7d2d6a1b --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-resnet18.md @@ -0,0 +1,221 @@ +--- +sidebar_label: '基于Resnet18的图像分类' +sidebar_position: 40 +--- + +# 基于 Resnet18 的图像分类 + +## 1. 配置 Docker 开发环境 + +参考 [这里](https://milkv.io/zh/docs/duo/application-development/tpu/tpu-docker) 配置好 Docker 开发环境后,再回到这里继续下一步 + +## 2. 在 Docker 中准备工作目录 + +创建并进入 `resnet18` 工作目录,注意是与 `tpu-mlir_*` 同级的目录 +``` +# mkdir resnet18 && cd resnet18 +``` + +获取原始模型 +``` +# wget https://github.com/onnx/models/raw/main/vision/classification/resnet/model/resnet18-v1-7.tar.gz +``` +将 `resnet18-v1-7.tar.gz` 解压 +``` +# tar -zxvf resnet18-v1-7.tar.gz +``` +解压后会在当前目录生成 `resnet18-v1-7` 文件夹,该文件夹下包含有 `resnet18-v1-7.onnx` 模型文件 + +拷贝测试图片: +``` +# cp -rf ${TPUC_ROOT}/regression/dataset/ILSVRC2012/ . +# cp -rf ${TPUC_ROOT}/regression/image/ . +``` +这里的 `${TPUC_ROOT}` 是环境变量,对应 `tpu-mlir_*` 目录,是在前面配置 Docker 开发环境中 `source ./tpu-mlir_*/envsetup.sh` 这一步加载的 + +创建并进入 `work` 工作目录,用于存放编译生成的 MLIR、cvimodel 等文件 +``` +# mkdir work && cd work +``` + +## 3. ONNX 模型转换 + +:::tip +Duo 开发板搭载的是 CV1800B 芯片,该芯片支持 **ONNX 系列** 和 **Caffe 模型**,目前不支持 TFLite 模型。在量化数据类型方面,支持 **BF16 格式的量化** 和 **INT8 格式的非对称量化** +::: + +模型转换步骤如下: +- ONNX 模型转换成 MLIR +- 生成量化需要的校准表 +- MLIR 量化成 INT8 非对称 cvimodel + +### ONNX 模型转换成 MLIR + +本例中的模型是 BGR 输入, `mean` 和 `scale` 分别为 `123.675`,`116.28`,`103.53` 和 `0.0171`,`0.0175`,`0.0174` + +将 ONNX 模型转换为 MLIR 模型的命令如下: +``` +model_transform.py \ + --model_name resnet18 \ + --model_def ../resnet18-v1-7/resnet18-v1-7.onnx \ + --test_input ../image/cat.jpg \ + --input_shapes [[1,3,224,224]] \ + --resize_dims 256,256 \ + --mean 123.675,116.28,103.53 \ + --scale 0.0171,0.0175,0.0174 \ + --pixel_format rgb \ + --test_result resnet18_top_outputs.npz \ + --mlir resnet18.mlir +``` + +运行成功效果示例 + +![duo](/docs/duo/tpu/duo-tpu-resnet18_05.png) + +转成 MLIR 模型后,会生成一个 ` resnet18.mlir` 文件,该文件即为 MLIR 模型文件,还会生成一个 `resnet18_in_f32.npz` 文件和一个 `resnet18_top_outputs.npz` 文件,是后续转模型的输入文件 + +![duo](/docs/duo/tpu/duo-tpu-resnet18_06.png) + +### MLIR 转 INT8 模型 + +#### 生成量化需要的校准表 + +在转 INT8 模型之前需要先生成校准表,这里用现有的 100 张来自 ILSVRC2012 的图片举例,执行 calibration 命令: +``` +run_calibration.py resnet18.mlir \ + --dataset ../ILSVRC2012 \ + --input_num 100 \ + -o resnet18_cali_table +``` + +运行成功效果示例 + +![duo](/docs/duo/tpu/duo-tpu-resnet18_07.png) + +运行完成后会生成名为 `resnet18_cali_table` 的文件, 该文件用于后续编译 INT8 模型的输入文件 + +![duo](/docs/duo/tpu/duo-tpu-resnet18_08.png) + +#### MLIR 量化成 INT8 非对称 cvimodel + +将 MLIR 模型转换为 INT8 模型的命令如下: +``` +model_deploy.py \ + --mlir resnet18.mlir \ + --quantize INT8 \ + --calibration_table resnet18_cali_table \ + --chip cv180x \ + --test_input ../image/cat.jpg \ + --test_reference resnet18_top_outputs.npz \ + --compare_all \ + --fuse_preprocess \ + --model resnet18_cv180x_int8_fuse.cvimodel +``` + +运行成功效果示例 + +![duo](/docs/duo/tpu/duo-tpu-resnet18_09.png) + +编译完成后, 会生成名为 `resnet18_cv180x_int8_fuse.cvimodel` 的文件 + +![duo](/docs/duo/tpu/duo-tpu-resnet18_10.png) + +## 4. 在 Duo 开发板上进行验证 + +### 连接 Duo 开发板 + +根据前面的教程完成 Duo 开发板与电脑的连接,并使用 `mobaxterm` 或 `Xshell` 等工具开启终端操作 Duo 开发板 + +### 获取 cvitek_tpu_sdk + +1. 从 MEGA 下载 + + [下载地址](https://mega.nz/folder/yZghQA4R#aZkbTwJb7Ji5LvAWIuBtag) + + 包名: `cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz` + +2. 从 ftp 服务器下载 + + ``` + sftp://218.17.249.213 + username: cvitek_mlir_2023 + password: 7&2Wd%cu5k + ``` + 如果文件未找到,可以到 backup 目录中找一下,可能更新版本后旧版本的包被放到 backup 目录 + +下载完成后,通过 Windows 终端拷贝到 Docker 中 +``` +docker cp C:\Users\Carbon\Duo-TPU\cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz DuoTPU:/workspace/ +``` + +并在 Docker 中进行解压 +``` +# cd /workspace +# tar -zxvf cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz +``` + +解压完成后会生成`cvitek_tpu_sdk`文件夹 + +### 将开发工具包和模型文件拷贝到开发板上 + +在 duo 开发板的终端中,新建文件目录 `/mnt/tpu/` +``` +# mkdir -p /mnt/tpu && cd /mnt/tpu +``` + +在 Docker 的终端中,将开发工具包和模型文件拷贝到开发板上 +``` +# scp -r /workspace/cvitek_tpu_sdk root@192.168.42.1:/mnt/tpu/ +# scp /workspace/resnet18/work/resnet18_cv180x_int8_fuse.cvimodel root@192.168.42.1:/mnt/tpu/cvitek_tpu_sdk/ +``` + +### 设置环境变量 + +在 Duo 开发板的终端中,进行环境变量的设置 +``` +# cd /mnt/tpu/cvitek_tpu_sdk +# source ./envs_tpu_sdk.sh +``` + +### 进行图像分类测试 + +在 Duo 开发板上,对该图像进行分类 + +![duo](/docs/duo/tpu/duo-tpu-cat.jpg) + +在 Duo 开发板的终端中,使用 `resnet18_cv180x_int8_fuse.cvimodel` 模型进行图像分类: +``` +./samples/bin/cvi_sample_classifier_fused_preprocess \ + ./resnet18_cv180x_int8_fuse.cvimodel \ + ./samples/data/cat.jpg \ + ./samples/data/synset_words.txt +``` + +分类成功结果示例 + +![duo](/docs/duo/tpu/duo-tpu-resnet18_11.png) + +## 5. 附录 + +正文涉及到的文件总结如下 + +- TPU-MLIR 模型转换工具:tpu-mlir_v1.3.228-g19ca95e9-20230921.tar.gz +- TPU SDK 开发工具包:cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz +- (附)Sample 测试例程源码:cvitek_tpu_samples.tar.gz +- (附)转换好的 cvimodel 包:cvimodel_samples_cv180x.tar.gz + +正文提到的 TPU 开发所需的包文件可在下面 sftp 站点获取,或者从 [MEGA](https://mega.nz/folder/yZghQA4R#aZkbTwJb7Ji5LvAWIuBtag) 下载 +``` +sftp://218.17.249.213 +user: cvitek_mlir_2023 +password: 7&2Wd%cu5k +``` + +使用 WinSCP 登陆 sftp 站点后的界面 + +![duo](/docs/duo/tpu/duo-tpu-sftp.png) + +注意: +1. sample 目录下的 samples_extra 提供了更多 samples 脚本,但其中 cvimodel 名字已经硬编码在其中,如想使用脚本运行,需要自行修改 cvimodel 名字 +2. 此小节介绍的是使用预编译好的 sample 程序对转换好的 cvimodel 进行部署测试,如果开发者有兴趣对 samples 源码进行编码和交叉编译,请参考官网 [TPU-MLIR文档](https://doc.sophgo.com/sdk-docs/v23.05.01/docs_latest_release/docs/tpu-mlir/quick_start/html/10_cv18xx_guide.html#runtime-sample) 中的第9章《CV18xx芯片使用指南》中的 +第3小节 "编译和运行runtime sample" 内容 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-shufflenetv2.md b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-shufflenetv2.md index 371a5efa..dc18fbdd 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-shufflenetv2.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-shufflenetv2.md @@ -1,5 +1,5 @@ --- -sidebar_label: '基于ShuffleNetV2的的图像分类' +sidebar_label: '基于ShuffleNetV2的图像分类' sidebar_position: 36 --- @@ -11,17 +11,17 @@ sidebar_position: 36 ## 2. 在 Docker 中准备工作目录 -创建并进入 `shufflenet_v2` 工作目录,注意是与`tpu-mlir_*`同级的目录 +创建并进入 `shufflenet_v2` 工作目录,注意是与 `tpu-mlir_*` 同级的目录 ``` # mkdir shufflenet_v2 && cd shufflenet_v2 ``` 拷贝测试图片: ``` -cp -rf ${TPUC_ROOT}/regression/dataset/ILSVRC2012/ . -cp -rf ${TPUC_ROOT}/regression/image/ . +# cp -rf ${TPUC_ROOT}/regression/dataset/ILSVRC2012/ . +# cp -rf ${TPUC_ROOT}/regression/image/ . ``` -这里的`$TPUC_ROOT`是环境变量,对应`tpu-mlir_*`目录,是在前面配置 Docker 开发环境中 `source ./tpu-mlir_*/envsetup.sh` 这一步加载的 +这里的 `${TPUC_ROOT}` 是环境变量,对应 `tpu-mlir_*` 目录,是在前面配置 Docker 开发环境中 `source ./tpu-mlir_*/envsetup.sh` 这一步加载的 创建名为 `export.py` 文件,并在文件中写入如下代码: ``` @@ -50,6 +50,10 @@ python export.py ## 3. ShuffleNetV2-PyTorch 模型转换 +:::tip +Duo 开发板搭载的是 CV1800B 芯片,该芯片支持 **ONNX 系列** 和 **Caffe 模型**,目前不支持 TFLite 模型。在量化数据类型方面,支持 **BF16 格式的量化** 和 **INT8 格式的非对称量化** +::: + 模型转换步骤如下: - PyTorch 模型转换成 MLIR - 生成量化需要的校准表 @@ -59,7 +63,7 @@ python export.py 模型输入是图片,在转模型之前我们需要了解模型的预处理。如果模型用预处理后的 npz 文件做输入,则不需要考虑预处理。预处理过程用公式表达如下($x$代表输入): $$ y = (x-mean)\times scale $$ -本例中的模型是 BGR 输入, mean 和 scale 分别为 103.94,116.78,123.68 和 0.017,0.017,0.017,模型转换命令如下: +本例中的模型是 BGR 输入, `mean` 和 `scale` 分别为 `103.94`,`116.78`,`123.68` 和 `0.017`,`0.017`,`0.017`,模型转换命令如下: ``` model_transform.py \ --model_name shufflenet_v2 \ @@ -78,11 +82,13 @@ model_transform.py \ ![duo](/docs/duo/tpu/duo-tpu-shufflenetv2_06.png) -转成 mlir 模型后,会生成一个`shufflenet_v2.mlir`文件,该文件即为 MLIR 模型文件,还会生成一个`shufflenet_v2_in_f32.npz`文件,该文件是后续转模型的输入文件 +转成 MLIR 模型后,会生成一个 `shufflenet_v2.mlir` 文件,该文件即为 MLIR 模型文件,还会生成一个 `shufflenet_v2_in_f32.npz` 文件和一个 `shufflenet_v2_top_outputs.npz` 文件,是后续转模型的输入文件 ![duo](/docs/duo/tpu/duo-tpu-shufflenetv2_07.png) -### 生成量化需要的校准表 +### MLIR 转 INT8 模型 + +#### 生成量化需要的校准表 运行 `run_calibration.py` 得到校准表,输入数据的数量根据情况准备 100~1000 张左右。 这里用现有的 100 张来自 ILSVRC2012 的图片举例,执行 calibration 命令: ``` @@ -100,11 +106,7 @@ run_calibration.py shufflenet_v2.mlir \ ![duo](/docs/duo/tpu/duo-tpu-shufflenetv2_09.png) -### MLIR 量化成 INT8 非对称 cvimodel - -:::tip -Duo 开发板搭载的是 CV1800B 芯片,该芯片支持 **ONNX 系列** 和 **Caffe 模型**,目前不支持 TFLite 模型。在量化数据类型方面,支持 **BF16 格式的量化** 和 **INT8 格式的非对称量化** -::: +#### MLIR 量化成 INT8 非对称 cvimodel 用 `model_deploy.py` 脚本参数使用 `asymmetric` 进行非对称量化 将 MLIR 文件转成 INT8 非对称量化模型: ``` @@ -129,11 +131,11 @@ model_deploy.py \ ![duo](/docs/duo/tpu/duo-tpu-shufflenetv2_11.png) -## 4. 部署 INT8 cvimodel 到 Duo 开发板验证 +## 4. 在 Duo 开发板上进行验证 ### 连接 Duo 开发板 -根据前面的教程完成duo开发板与电脑的连接,并使用`mobaxterm`或`Xshell`等工具开启终端操作 Duo 开发板 +根据前面的教程完成 Duo 开发板与电脑的连接,并使用 `mobaxterm` 或 `Xshell` 等工具开启终端操作 Duo 开发板 ### 获取 cvitek_tpu_sdk @@ -167,9 +169,9 @@ docker cp C:\Users\Carbon\Duo-TPU\cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz ### 将开发工具包和模型文件拷贝到开发板上 -在 duo 开发板的终端中,新建文件目录 /mnt/tpu/ +在 duo 开发板的终端中,新建文件目录 `/mnt/tpu/` ``` -$ mkdir -p /mnt/tpu && cd /mnt/tpu +# mkdir -p /mnt/tpu && cd /mnt/tpu ``` 在 Docker 的终端中,将开发工具包和模型文件拷贝到开发板上 @@ -188,6 +190,10 @@ $ mkdir -p /mnt/tpu && cd /mnt/tpu ### 进行图像分类测试 +在 Duo 开发板上,对该图像进行分类 + +![duo](/docs/duo/tpu/duo-tpu-cat.jpg) + 进入 samples 目录 ``` @@ -201,7 +207,7 @@ $ mkdir -p /mnt/tpu && cd /mnt/tpu ![duo](/docs/duo/tpu/duo-tpu-shufflenetv2_12.png) -测试 +运行图像分类测试 ``` ./bin/cvi_sample_classifier_fused_preprocess \ ../shufflenet_v2_cv1800_int8_asym.cvimodel \ @@ -213,12 +219,6 @@ $ mkdir -p /mnt/tpu && cd /mnt/tpu ![duo](/docs/duo/tpu/duo-tpu-shufflenetv2_13.png) - -注意: -1. sample 目录下的 samples_extra 提供了更多 samples 脚本,但其中 cvimodel 名字已经硬编码在其中,如想使用脚本运行,需要自行修改 cvimodel 名字 -2. 此小节介绍的是使用预编译好的 sample 程序对转换好的 cvimodel 进行部署测试,如果开发者有兴趣对 samples 源码进行编码和交叉编译,请参考官网 [TPU-MLIR文档](https://doc.sophgo.com/sdk-docs/v23.05.01/docs_latest_release/docs/tpu-mlir/quick_start/html/10_cv18xx_guide.html#runtime-sample) 中的第9章《CV18xx芯片使用指南》中的 -第3小节 "编译和运行runtime sample" 内容 - ## 5. 附录 正文涉及到的文件总结如下 @@ -238,3 +238,8 @@ password: 7&2Wd%cu5k 使用 WinSCP 登陆 sftp 站点后的界面 ![duo](/docs/duo/tpu/duo-tpu-sftp.png) + +注意: +1. sample 目录下的 samples_extra 提供了更多 samples 脚本,但其中 cvimodel 名字已经硬编码在其中,如想使用脚本运行,需要自行修改 cvimodel 名字 +2. 此小节介绍的是使用预编译好的 sample 程序对转换好的 cvimodel 进行部署测试,如果开发者有兴趣对 samples 源码进行编码和交叉编译,请参考官网 [TPU-MLIR文档](https://doc.sophgo.com/sdk-docs/v23.05.01/docs_latest_release/docs/tpu-mlir/quick_start/html/10_cv18xx_guide.html#runtime-sample) 中的第9章《CV18xx芯片使用指南》中的 +第3小节 "编译和运行runtime sample" 内容 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-squeezenet.md b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-squeezenet.md new file mode 100644 index 00000000..98fc7586 --- /dev/null +++ b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-squeezenet.md @@ -0,0 +1,221 @@ +--- +sidebar_label: '基于Squeezenet的图像分类' +sidebar_position: 38 +--- + +# 基于 Squeezenet 的图像分类 + +## 1. 配置 Docker 开发环境 + +参考 [这里](https://milkv.io/zh/docs/duo/application-development/tpu/tpu-docker) 配置好 Docker 开发环境后,再回到这里继续下一步 + +## 2. 在 Docker 中准备工作目录 + +创建并进入 `squeezenet1.1` 工作目录,注意是与 `tpu-mlir_*` 同级的目录 +``` +# mkdir squeezenet1.1 && cd squeezenet1.1 +``` + +获取原始模型 +``` +# wget https://github.com/onnx/models/raw/main/vision/classification/squeezenet/model/squeezenet1.1-7.tar.gz +``` +将 `squeezenet1.1-7.tar.gz` 解压 +``` +# tar -zxvf squeezenet1.1-7.tar.gz +``` +解压后会在当前目录生成 `squeezenet1.1` 文件夹,该文件夹下包含有 `squeezenet1.1.onnx` 模型文件 + +拷贝测试图片: +``` +# cp -rf ${TPUC_ROOT}/regression/dataset/ILSVRC2012/ . +# cp -rf ${TPUC_ROOT}/regression/image/ . +``` +这里的 `${TPUC_ROOT}` 是环境变量,对应 `tpu-mlir_*` 目录,是在前面配置 Docker 开发环境中 `source ./tpu-mlir_*/envsetup.sh` 这一步加载的 + +创建并进入 `work` 工作目录,用于存放编译生成的 MLIR、cvimodel 等文件 +``` +# mkdir work && cd work +``` + +## 3. ONNX 模型转换 + +:::tip +Duo 开发板搭载的是 CV1800B 芯片,该芯片支持 **ONNX 系列** 和 **Caffe 模型**,目前不支持 TFLite 模型。在量化数据类型方面,支持 **BF16 格式的量化** 和 **INT8 格式的非对称量化** +::: + +模型转换步骤如下: +- ONNX 模型转换成 MLIR +- 生成量化需要的校准表 +- MLIR 量化成 INT8 非对称 cvimodel + +### ONNX 模型转换成 MLIR + +本例中的模型是 BGR 输入, `mean` 和 `scale` 分别为 `123.675`,`116.28`,`103.53` 和 `0.0171`,`0.0175`,`0.0174` + +将 ONNX 模型转换为 MLIR 模型的命令如下: +``` +model_transform.py \ + --model_name squeezenet1.1 \ + --model_def ../squeezenet1.1/squeezenet1.1.onnx \ + --test_input ../image/cat.jpg \ + --input_shapes [[1,3,224,224]] \ + --resize_dims 256,256 \ + --mean 123.675,116.28,103.53 \ + --scale 0.0171,0.0175,0.0174 \ + --pixel_format rgb \ + --test_result squeezenet1.1_top_outputs.npz \ + --mlir squeezenet1.1.mlir +``` + +运行成功效果示例 + +![duo](/docs/duo/tpu/duo-tpu-squeezenet_05.png) + +转成 MLIR 模型后,会生成一个 `squeezenet1.1.mlir` 文件,该文件即为 MLIR 模型文件,还会生成一个 `squeezenet1.1_in_f32.npz` 文件和一个 `squeezenet1.1_top_outputs.npz` 文件,是后续转模型的输入文件 + +![duo](/docs/duo/tpu/duo-tpu-squeezenet_06.png) + +### MLIR 转 INT8 模型 + +#### 生成量化需要的校准表 + +在转 INT8 模型之前需要先生成校准表,这里用现有的 100 张来自 ILSVRC2012 的图片举例,执行 calibration 命令: +``` +run_calibration.py squeezenet1.1.mlir \ + --dataset ../ILSVRC2012 \ + --input_num 100 \ + -o squeezenet1.1_cali_table +``` + +运行成功效果示例 + +![duo](/docs/duo/tpu/duo-tpu-squeezenet_07.png) + +运行完成后会生成名为 `shufflenet_v2_cali_table` 的文件, 该文件用于后续编译 INT8 模型的输入文件 + +![duo](/docs/duo/tpu/duo-tpu-squeezenet_08.png) + +#### MLIR 量化成 INT8 非对称 cvimodel + +将 MLIR 模型转换为 INT8 模型的命令如下: +``` +model_deploy.py \ + --mlir squeezenet1.1.mlir \ + --quantize INT8 \ + --calibration_table squeezenet1.1_cali_table \ + --chip cv180x \ + --test_input ../image/cat.jpg \ + --test_reference squeezenet1.1_top_outputs.npz \ + --compare_all \ + --fuse_preprocess \ + --model squeezenet1.1_cv180x_int8_fuse.cvimodel +``` + +运行成功效果示例 + +![duo](/docs/duo/tpu/duo-tpu-squeezenet_09.png) + +编译完成后, 会生成名为 `squeezenet1.1_cv180x_int8_fuse.cvimodel` 的文件 + +![duo](/docs/duo/tpu/duo-tpu-squeezenet_10.png) + +## 4. 在 Duo 开发板上进行验证 + +### 连接 Duo 开发板 + +根据前面的教程完成 Duo 开发板与电脑的连接,并使用 `mobaxterm` 或 `Xshell` 等工具开启终端操作 Duo 开发板 + +### 获取 cvitek_tpu_sdk + +1. 从 MEGA 下载 + + [下载地址](https://mega.nz/folder/yZghQA4R#aZkbTwJb7Ji5LvAWIuBtag) + + 包名: `cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz` + +2. 从 ftp 服务器下载 + + ``` + sftp://218.17.249.213 + username: cvitek_mlir_2023 + password: 7&2Wd%cu5k + ``` + 如果文件未找到,可以到 backup 目录中找一下,可能更新版本后旧版本的包被放到 backup 目录 + +下载完成后,通过 Windows 终端拷贝到 Docker 中 +``` +docker cp C:\Users\Carbon\Duo-TPU\cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz DuoTPU:/workspace/ +``` + +并在 Docker 中进行解压 +``` +# cd /workspace +# tar -zxvf cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz +``` + +解压完成后会生成`cvitek_tpu_sdk`文件夹 + +### 将开发工具包和模型文件拷贝到开发板上 + +在 duo 开发板的终端中,新建文件目录 `/mnt/tpu/` +``` +# mkdir -p /mnt/tpu && cd /mnt/tpu +``` + +在 Docker 的终端中,将开发工具包和模型文件拷贝到开发板上 +``` +# scp -r /workspace/cvitek_tpu_sdk root@192.168.42.1:/mnt/tpu/ +# scp /workspace/squeezenet1.1/work/squeezenet1.1_cv180x_int8_fuse.cvimodel root@192.168.42.1:/mnt/tpu/cvitek_tpu_sdk/ +``` + +### 设置环境变量 + +在 Duo 开发板的终端中,进行环境变量的设置 +``` +# cd /mnt/tpu/cvitek_tpu_sdk +# source ./envs_tpu_sdk.sh +``` + +### 进行图像分类测试 + +在 Duo 开发板上,对该图像进行分类 + +![duo](/docs/duo/tpu/duo-tpu-cat.jpg) + +在 Duo 开发板的终端中,使用 `squeezenet1.1_cv180x_int8_fuse.cvimodel` 模型进行图像分类: +``` +./samples/bin/cvi_sample_classifier_fused_preprocess \ + ./squeezenet1.1_cv180x_int8_fuse.cvimodel \ + ./samples/data/cat.jpg \ + ./samples/data/synset_words.txt +``` + +分类成功结果示例 + +![duo](/docs/duo/tpu/duo-tpu-squeezenet_11.png) + +## 5. 附录 + +正文涉及到的文件总结如下 + +- TPU-MLIR 模型转换工具:tpu-mlir_v1.3.228-g19ca95e9-20230921.tar.gz +- TPU SDK 开发工具包:cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz +- (附)Sample 测试例程源码:cvitek_tpu_samples.tar.gz +- (附)转换好的 cvimodel 包:cvimodel_samples_cv180x.tar.gz + +正文提到的 TPU 开发所需的包文件可在下面 sftp 站点获取,或者从 [MEGA](https://mega.nz/folder/yZghQA4R#aZkbTwJb7Ji5LvAWIuBtag) 下载 +``` +sftp://218.17.249.213 +user: cvitek_mlir_2023 +password: 7&2Wd%cu5k +``` + +使用 WinSCP 登陆 sftp 站点后的界面 + +![duo](/docs/duo/tpu/duo-tpu-sftp.png) + +注意: +1. sample 目录下的 samples_extra 提供了更多 samples 脚本,但其中 cvimodel 名字已经硬编码在其中,如想使用脚本运行,需要自行修改 cvimodel 名字 +2. 此小节介绍的是使用预编译好的 sample 程序对转换好的 cvimodel 进行部署测试,如果开发者有兴趣对 samples 源码进行编码和交叉编译,请参考官网 [TPU-MLIR文档](https://doc.sophgo.com/sdk-docs/v23.05.01/docs_latest_release/docs/tpu-mlir/quick_start/html/10_cv18xx_guide.html#runtime-sample) 中的第9章《CV18xx芯片使用指南》中的 +第3小节 "编译和运行runtime sample" 内容 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-yolov5.md b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-yolov5.md index 1f00690c..1dcf2958 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-yolov5.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/duo/application-development/tpu/tpu-yolov5.md @@ -134,7 +134,7 @@ conda env remove --name ## 3. 在 Docker 中准备工作目录 -创建并进入 `yolov5n_torch` 工作目录,注意是与`tpu-mlir_*`同级的目录,并将模型文件和图片文件都放入该目录下 +创建并进入 `yolov5n_torch` 工作目录,注意是与 `tpu-mlir_*` 同级的目录,并将模型文件和图片文件都放入该目录下 ``` # mkdir yolov5n_torch && cd yolov5n_torch ``` @@ -148,16 +148,24 @@ docker cp /yolov5-master/yolov5n_jit.pt :/workspace/yolov5 docker cp C:\Users\Carbon\Duo-TPU\yolov5-master\yolov5n_jit.pt DuoTPU:/workspace/yolov5n_torch/yolov5n_jit.pt ``` -再回到 Docker 终端下,将图片文件放入 yolov5n_torch/ 目录下并建立 work 目录 +再回到 Docker 终端下,将图片文件放入当前目录(`yolov5n_torch`)下 +``` +# cp -rf ${TPUC_ROOT}/regression/dataset/COCO2017 . +# cp -rf ${TPUC_ROOT}/regression/image . +``` +这里的 `${TPUC_ROOT}` 是环境变量,对应 `tpu-mlir_*` 目录,是在前面配置 Docker 开发环境中 `source ./tpu-mlir_*/envsetup.sh` 这一步加载的 + +创建并进入 `work` 工作目录,用于存放编译生成的 `MLIR`、`cvimodel` 等文件 ``` -# cp -rf $TPUC_ROOT/regression/dataset/COCO2017 . -# cp -rf $TPUC_ROOT/regression/image . # mkdir work && cd work ``` -这里的`$TPUC_ROOT`是环境变量,对应`tpu-mlir_*`目录,是在前面配置 Docker 开发环境中 `source ./tpu-mlir_*/envsetup.sh` 这一步加载的 ## 4. YOLOv5n-TORCH 模型转换 +:::tip +Duo 开发板搭载的是 CV1800B 芯片,该芯片支持 **ONNX 系列** 和 **Caffe 模型**,目前不支持 TFLite 模型。在量化数据类型方面,支持 **BF16 格式的量化** 和 **INT8 格式的非对称量化** +::: + 模型转换步骤如下: - TORCH 模型转换成 MLIR - 生成量化需要的校准表 @@ -165,7 +173,7 @@ docker cp C:\Users\Carbon\Duo-TPU\yolov5-master\yolov5n_jit.pt DuoTPU:/workspace ### TORCH 模型转换成 MLIR -本例中,模型是 RGB 输入,`mean`和`scale`分别为`0,0,0`和`0.0039216,0`.`0039216`,`0.0039216` +本例中,模型是 RGB 输入,`mean`和`scale`分别为 `0,0,0` 和 `0.0039216`,`0.0039216`,`0.0039216` 将 torch 模型转换为mlir模型的命令如下 ``` # model_transform.py \ @@ -185,11 +193,13 @@ docker cp C:\Users\Carbon\Duo-TPU\yolov5-master\yolov5n_jit.pt DuoTPU:/workspace ![duo](/docs/duo/tpu/duo-tpu-yolo5_06.png) -转成 MLIR 模型后,会生成一个`yolov5n.mlir`文件,该文件即为 MLIR 模型文件,还会生成一个`yolov5n_in_f32.npz`文件,该文件是后续转模型的输入文件 +转成 MLIR 模型后,会生成一个 `yolov5n.mlir` 文件,该文件即为 MLIR 模型文件,还会生成一个 `yolov5n_in_f32.npz` 文件和一个 `yolov5n_top_outputs.npz` 文件,是后续转模型的输入文件 ![duo](/docs/duo/tpu/duo-tpu-yolo5_07.png) -### 生成量化需要的校准表 +### MLIR 转 INT8 模型 + +#### 生成量化需要的校准表 在转 INT8 模型之前需要先生成校准表,这里用现有的 100 张来自 COCO2017 的图片举例,执行 calibration ``` @@ -205,11 +215,7 @@ docker cp C:\Users\Carbon\Duo-TPU\yolov5-master\yolov5n_jit.pt DuoTPU:/workspace ![duo](/docs/duo/tpu/duo-tpu-yolo5_09.png) -### MLIR 量化成 INT8 非对称 cvimodel - -:::tip -Duo 开发板搭载的是 CV1800B 芯片,该芯片支持 **ONNX 系列** 和 **Caffe 模型**,目前不支持 TFLite 模型。在量化数据类型方面,支持 **BF16 格式的量化** 和 **INT8 格式的非对称量化** -::: +#### MLIR 量化成 INT8 非对称 cvimodel 将 MLIR 模型转换为 INT8 模型的命令如下 ``` @@ -239,7 +245,7 @@ Duo 开发板搭载的是 CV1800B 芯片,该芯片支持 **ONNX 系列** 和 * ### 连接 Duo 开发板 -根据前面的教程完成duo开发板与电脑的连接,并使用`mobaxterm`或`Xshell`等工具开启终端操作 Duo 开发板 +根据前面的教程完成 Duo 开发板与电脑的连接,并使用 `mobaxterm` 或 `Xshell` 等工具开启终端操作 Duo 开发板 ### 获取 cvitek_tpu_sdk @@ -272,9 +278,9 @@ docker cp C:\Users\Carbon\Duo-TPU\cvitek_tpu_sdk_cv180x_musl_riscv64_rvv.tar.gz ### 将开发工具包和模型文件拷贝到开发板上 -在 duo 开发板的终端中,新建文件目录 /mnt/tpu/ +在 duo 开发板的终端中,新建文件目录 `/mnt/tpu/` ``` -$ mkdir -p /mnt/tpu && cd /mnt/tpu +# mkdir -p /mnt/tpu && cd /mnt/tpu ``` 在 Docker 的终端中,将开发工具包和模型文件拷贝到开发板上 @@ -287,13 +293,17 @@ $ mkdir -p /mnt/tpu && cd /mnt/tpu 在 Duo 开发板的终端中,进行环境变量的设置 ``` -$ cd /mnt/tpu/cvitek_tpu_sdk -$ source ./envs_tpu_sdk.sh +# cd /mnt/tpu/cvitek_tpu_sdk +# source ./envs_tpu_sdk.sh ``` ### 进行目标检测 -在 Duo 开发板的终端中,输入如下命令进行目标检测 +在 Duo 开发板上,对该图像进行目标检测 + +![duo](/docs/duo/tpu/duo-tpu-dog.jpg) + +在 Duo 开发板的终端中,使用 `yolov5n_int8_fuse.cvimodel` 模型进行目标检测 ``` # ./samples/samples_extra/bin/cvi_sample_detector_yolo_v5_fused_preprocess \ ./yolov5n_int8_fuse.cvimodel \ @@ -301,7 +311,7 @@ $ source ./envs_tpu_sdk.sh yolov5n_out.jpg ``` - 检测成功结果示例 +检测成功结果示例 ![duo](/docs/duo/tpu/duo-tpu-yolo5_12.png) @@ -335,3 +345,8 @@ password: 7&2Wd%cu5k 使用 WinSCP 登陆 sftp 站点后的界面 ![duo](/docs/duo/tpu/duo-tpu-sftp.png) + +注意: +1. sample 目录下的 samples_extra 提供了更多 samples 脚本,但其中 cvimodel 名字已经硬编码在其中,如想使用脚本运行,需要自行修改 cvimodel 名字 +2. 此小节介绍的是使用预编译好的 sample 程序对转换好的 cvimodel 进行部署测试,如果开发者有兴趣对 samples 源码进行编码和交叉编译,请参考官网 [TPU-MLIR文档](https://doc.sophgo.com/sdk-docs/v23.05.01/docs_latest_release/docs/tpu-mlir/quick_start/html/10_cv18xx_guide.html#runtime-sample) 中的第9章《CV18xx芯片使用指南》中的 +第3小节 "编译和运行runtime sample" 内容 diff --git a/static/docs/duo/tpu/duo-tpu-cat.jpg b/static/docs/duo/tpu/duo-tpu-cat.jpg new file mode 100755 index 00000000..b4efc6c9 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-cat.jpg differ diff --git a/static/docs/duo/tpu/duo-tpu-densenet_05.png b/static/docs/duo/tpu/duo-tpu-densenet_05.png new file mode 100755 index 00000000..2e87fca1 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-densenet_05.png differ diff --git a/static/docs/duo/tpu/duo-tpu-densenet_06.png b/static/docs/duo/tpu/duo-tpu-densenet_06.png new file mode 100755 index 00000000..afb5c404 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-densenet_06.png differ diff --git a/static/docs/duo/tpu/duo-tpu-densenet_07.png b/static/docs/duo/tpu/duo-tpu-densenet_07.png new file mode 100755 index 00000000..aa8450cd Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-densenet_07.png differ diff --git a/static/docs/duo/tpu/duo-tpu-densenet_08.png b/static/docs/duo/tpu/duo-tpu-densenet_08.png new file mode 100755 index 00000000..b7630000 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-densenet_08.png differ diff --git a/static/docs/duo/tpu/duo-tpu-densenet_09.png b/static/docs/duo/tpu/duo-tpu-densenet_09.png new file mode 100755 index 00000000..873eab46 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-densenet_09.png differ diff --git a/static/docs/duo/tpu/duo-tpu-densenet_10.png b/static/docs/duo/tpu/duo-tpu-densenet_10.png new file mode 100755 index 00000000..fa40b7aa Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-densenet_10.png differ diff --git a/static/docs/duo/tpu/duo-tpu-densenet_11.png b/static/docs/duo/tpu/duo-tpu-densenet_11.png new file mode 100755 index 00000000..7b9dc223 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-densenet_11.png differ diff --git a/static/docs/duo/tpu/duo-tpu-docker_02-en.png b/static/docs/duo/tpu/duo-tpu-docker_02-en.png new file mode 100755 index 00000000..36cfa921 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-docker_02-en.png differ diff --git a/static/docs/duo/tpu/duo-tpu-dog.jpg b/static/docs/duo/tpu/duo-tpu-dog.jpg new file mode 100755 index 00000000..77b03812 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-dog.jpg differ diff --git a/static/docs/duo/tpu/duo-tpu-googlenet_05.png b/static/docs/duo/tpu/duo-tpu-googlenet_05.png new file mode 100755 index 00000000..e92d0f0c Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-googlenet_05.png differ diff --git a/static/docs/duo/tpu/duo-tpu-googlenet_06.png b/static/docs/duo/tpu/duo-tpu-googlenet_06.png new file mode 100755 index 00000000..4aa292b3 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-googlenet_06.png differ diff --git a/static/docs/duo/tpu/duo-tpu-googlenet_07.png b/static/docs/duo/tpu/duo-tpu-googlenet_07.png new file mode 100755 index 00000000..423e7a8f Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-googlenet_07.png differ diff --git a/static/docs/duo/tpu/duo-tpu-googlenet_08.png b/static/docs/duo/tpu/duo-tpu-googlenet_08.png new file mode 100755 index 00000000..b92c3712 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-googlenet_08.png differ diff --git a/static/docs/duo/tpu/duo-tpu-googlenet_09.png b/static/docs/duo/tpu/duo-tpu-googlenet_09.png new file mode 100755 index 00000000..c8d8bae4 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-googlenet_09.png differ diff --git a/static/docs/duo/tpu/duo-tpu-googlenet_10.png b/static/docs/duo/tpu/duo-tpu-googlenet_10.png new file mode 100755 index 00000000..a240fa42 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-googlenet_10.png differ diff --git a/static/docs/duo/tpu/duo-tpu-googlenet_11.png b/static/docs/duo/tpu/duo-tpu-googlenet_11.png new file mode 100755 index 00000000..c55c2f9c Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-googlenet_11.png differ diff --git a/static/docs/duo/tpu/duo-tpu-googlenet_12.png b/static/docs/duo/tpu/duo-tpu-googlenet_12.png new file mode 100755 index 00000000..912ffa31 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-googlenet_12.png differ diff --git a/static/docs/duo/tpu/duo-tpu-googlenet_13.png b/static/docs/duo/tpu/duo-tpu-googlenet_13.png new file mode 100755 index 00000000..b04aa700 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-googlenet_13.png differ diff --git a/static/docs/duo/tpu/duo-tpu-googlenet_14.png b/static/docs/duo/tpu/duo-tpu-googlenet_14.png new file mode 100755 index 00000000..1fd49c48 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-googlenet_14.png differ diff --git a/static/docs/duo/tpu/duo-tpu-resnet18_05.png b/static/docs/duo/tpu/duo-tpu-resnet18_05.png new file mode 100755 index 00000000..01132f44 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-resnet18_05.png differ diff --git a/static/docs/duo/tpu/duo-tpu-resnet18_06.png b/static/docs/duo/tpu/duo-tpu-resnet18_06.png new file mode 100755 index 00000000..cf0140a0 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-resnet18_06.png differ diff --git a/static/docs/duo/tpu/duo-tpu-resnet18_07.png b/static/docs/duo/tpu/duo-tpu-resnet18_07.png new file mode 100755 index 00000000..920b531c Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-resnet18_07.png differ diff --git a/static/docs/duo/tpu/duo-tpu-resnet18_08.png b/static/docs/duo/tpu/duo-tpu-resnet18_08.png new file mode 100755 index 00000000..c425f61b Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-resnet18_08.png differ diff --git a/static/docs/duo/tpu/duo-tpu-resnet18_09.png b/static/docs/duo/tpu/duo-tpu-resnet18_09.png new file mode 100755 index 00000000..3e9762a5 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-resnet18_09.png differ diff --git a/static/docs/duo/tpu/duo-tpu-resnet18_10.png b/static/docs/duo/tpu/duo-tpu-resnet18_10.png new file mode 100755 index 00000000..c3031990 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-resnet18_10.png differ diff --git a/static/docs/duo/tpu/duo-tpu-resnet18_11.png b/static/docs/duo/tpu/duo-tpu-resnet18_11.png new file mode 100755 index 00000000..b4f65bd5 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-resnet18_11.png differ diff --git a/static/docs/duo/tpu/duo-tpu-squeezenet_05.png b/static/docs/duo/tpu/duo-tpu-squeezenet_05.png new file mode 100755 index 00000000..7fa6720d Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-squeezenet_05.png differ diff --git a/static/docs/duo/tpu/duo-tpu-squeezenet_06.png b/static/docs/duo/tpu/duo-tpu-squeezenet_06.png new file mode 100755 index 00000000..1843bf9f Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-squeezenet_06.png differ diff --git a/static/docs/duo/tpu/duo-tpu-squeezenet_07.png b/static/docs/duo/tpu/duo-tpu-squeezenet_07.png new file mode 100755 index 00000000..e2aa4da1 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-squeezenet_07.png differ diff --git a/static/docs/duo/tpu/duo-tpu-squeezenet_08.png b/static/docs/duo/tpu/duo-tpu-squeezenet_08.png new file mode 100755 index 00000000..3d3060a8 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-squeezenet_08.png differ diff --git a/static/docs/duo/tpu/duo-tpu-squeezenet_09.png b/static/docs/duo/tpu/duo-tpu-squeezenet_09.png new file mode 100755 index 00000000..a6cff342 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-squeezenet_09.png differ diff --git a/static/docs/duo/tpu/duo-tpu-squeezenet_10.png b/static/docs/duo/tpu/duo-tpu-squeezenet_10.png new file mode 100755 index 00000000..f3dc74ca Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-squeezenet_10.png differ diff --git a/static/docs/duo/tpu/duo-tpu-squeezenet_11.png b/static/docs/duo/tpu/duo-tpu-squeezenet_11.png new file mode 100755 index 00000000..3bba74d2 Binary files /dev/null and b/static/docs/duo/tpu/duo-tpu-squeezenet_11.png differ