PCIE_FALSR超分辨率图像模型移植与测试

本文档适用于SOPHGO(算能)BM1684-PCIE及对应通用云开发空间,主要内容:

  1. SOPHGO(算能)云平台环境搭建
  2. FALSR模型
  3. 通过BMNNSDK进行FALSR模型转换和量
  4. 部署和测试
  5. 相关链接

1. SOPHGO(算能)云平台环境搭建

1.1. 开通云平台账号

注意:申请开通BM1684-PCIE通用云开发空间

参考:https://cloud.sophgo.com/tpu.pdf

1.2. 开发环境初始化

1.2.1 进入命令行模式,进去默认在/home/sophgo目录

PCIE_FALSR超分辨率图像模型移植与测试_第1张图片 

1.2.2 切换成 root 权限

sudo -i

1.2.3 安装驱动

cd /home/sophgo/bmnnsdk2-bm1684_v2.7.0/scripts
./install_driver_pcie.sh
ls /dev/bm*

如果可以看到以下设备节点,表示驱动安装成功:


1.2.4 加载Docker,并初始化环境

cd /home/sophgo/
apt install unzip
unzip bmnnsdk2-bm1684-ubuntu-docker-py37.zip
cd bmnnsdk2-bm1684-ubuntu-docker-py37/
docker load -i bmnnsdk2-bm1684-ubuntu.docker

1.2.5 通过脚本创建Docker容器

cd /home/sophgo/bmnnsdk2-bm1684_v2.7.0/
# 执行脚本创建Docker容器
./docker_run_bmnnsdk.sh

# 自动进入Docker容器
# 进行环境初始化
cd scripts/

# 更新 pip
/usr/local/bin/python3 -m pip install --upgrade pip

# 安装 nntc
./install_lib.sh nntc

# 安装sophon包
pip3 install /workspace/lib/sail/python3/pcie/py37/sophon-2.7.0-py3-none-any.whl
# 执行脚本 envsetup_pcie.sh 配置环境变量,这一步会安装一些依赖库,并导出环境变量到当前终端
source ./envsetup_pcie.sh

导出的环境变量只对当前终端有效,每次进入容器都需要重新执行一遍,或者可以将这些环境变量写入~/.bashrc,这样每次登录将会自动设置环境变量

1.2.6 Docker 常用命令

# 启动 Docker容器
docker start 

# 查看正在运行的 Docker容器
docker ps

# 进入 Docker 容器 docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it  bash

1.2.7 通过云空间文件系统上传代码等文件

打开云空间文件系统:

PCIE_FALSR超分辨率图像模型移植与测试_第2张图片

上传文件:文件会被存储在服务器的 /tmp 目录下

PCIE_FALSR超分辨率图像模型移植与测试_第3张图片

 

拷贝文件到Docker容器中:

Docker容器的workspace目录被映射到 /home/sophgo/bmnnsdk2-bm1684_v2.7.0/

cp /tmp/<待拷贝文件> /home/sophgo/bmnnsdk2-bm1684_v2.7.0/

注意:本教程后续步骤均在Docker容器中进行

2. FALSR模型

Paper:Fast, Accurate and Lightweight Super-Resolution with Neural Architecture Search

代码仓库链接:Fast, Accurate and Lightweight Super-Resolution models

FALSR是小米AI Lab提出的快速、准确且轻量级的图像超分辨率模型。

应用场景:

  1. 老相片翻新:低分辨率或者有残缺的老照片,可以通过该算法进行图像修复;
  2. 卫星图像遥感:在遥感领域,超分可以复原出更多的图片信息与细节;
  3. 医学影像:在医疗领域,超分可以将低分辨率的扫描图片还原出高清图片,有助于准确发现病灶;

特色优势:

  1. 以极低的成本实现AIOT设备的图片修复功能,从而衍生出各种各样的应用与发明;
  2. 基于BM1684的超分可以轻松部署于云端或者边缘端,方便开发者各种使用需求

Demo演示:将低分辨率的图片转化成高分辨率的图片

3. 模型的转换和量化

3.1 准备模型与数据

3.1.1 准备Demo文件

https://disk.sophgo.vip/sharing/uz7lAkv9c下载FALSR.rar并解压

3.1.2 准备模型下载

从FALSR pretrained_model中下载所需要的.pb模型,并将其放入Demo的data/models目录下。
链接中包含了FALSR-A.pb,FALSR-B.pb,FALSR-C.pb三种不同复杂度的模型,我们选择FALSR-A.pb作为演示的模型。

3.1.3 准备测试数据

网盘链接: https://pan.baidu.com/s/1UprVQHwqpgrDYfvwojmcwA?pwd=q94r 提取码: q94r 
将链接中的两个视频下载,并保存至Demo的data/videos目录下

3.1.4 准备量化集

不量化模型可跳过本节。

以Urban100数据集为例,下载FALSR dataset中的Urban100,并将其放入Demo的`data/dataset`目录下。

3.1.5 上传文件至云开发空间

以上文件准备好后,将FALSR压缩并按照[1.2.7](#jump)中的步骤上传至云开发空间,拷贝到Docker容器的workspace目录

3.2 生成FP32 BModel

执行以下命令,使用bmnett编译生成FP32 BModel,如果使用了其他的测试视频请注意修改gen_fp32_bmodel.sh中的输入参数shapes与视频长宽保持一致,shapes中第二个shape的长宽是第一个的两倍。

cd scripts
sh ./gen_fp32_bmodel.sh

部分输出:

PCIE_FALSR超分辨率图像模型移植与测试_第4张图片

 执行完毕后在/data/fp32model目录下会生成falsr_a_fp32.bmodel文件,即转换好的FP32 BModel

查看FP32 BModel的信息:

命令:bm_model.bin --info xxxx.bmodel

# 查看模型信息
bm_model.bin --info falsr_a_fp32.bmodel

PCIE_FALSR超分辨率图像模型移植与测试_第5张图片

命令:bmrt_test --bmodel xxxxxxx.bmodel

bmrt_test --bmodel falsr_a_fp32.bmodel

PCIE_FALSR超分辨率图像模型移植与测试_第6张图片

 

3.3 生成INT8 BModel

不量化模型可跳过本节。

INT8 BModel的生成需要经历中间格式UModel,即:原始模型→FP32 UModel→INT8 UModel→INT8 BModel。

执行以下命令,将依次调用以下步骤中的脚本,生成INT8 BModel:

sh ./gen_int8bmodel.sh

若出现AssertionError,可将报错处assert语句注释后重新调用脚本

3.3.1 生成LMDB

需要将原始量化数据集转换成lmdb格式,供后续校准量化工具Quantization-tools 使用。更详细信息请参考:准备LMDB数据集

需要从数据集图片生成LMDB文件,具体操作参见tools/create_lmdb.py, 相关操作已被封装在 scripts/create_lmdb.sh中,执行如下命令即可:

sh ./create_lmdb.sh

上述脚本会在data/lmdb目录中生成lmdb的文件夹,其中存放着量化好的LMDB文件:data_1.lmdb和data_2.lmdb。若使用了其他的测试视频,请注意根据模型输入要求修改脚本中create_lmdb.sh命令中的resize_width和resize_height等参数。

3.3.2 生成FP32 UModel

执行以下命令,使用ufw.tools.tf_to_umodel生成FP32 UModel,若不指定-D参数,可以在生成prototxt文件以后修改:

sh ./gen_fp32umodel.sh

上述脚本会在int8model/下生成*_bmnetp_test_fp32.prototxt、*_bmnetp.fp32umodel文件,即转换好的FP32 UModel。

3.3.3  生成INT8 UModel

执行以下命令,使用修改后的FP32 UModel文件量化生成INT8 UModel:

sh ./gen_int8umodel.sh

上述脚本会在int8model/下生成*_bmnett_deploy_fp32_unique_top.prototxt、*_bmnett_deploy_int8_unique_top.prototxt和*_bmnett.int8umodel文件,即转换好的INT8 UModel。
该操作中对FP32的Model进行量化,将中间层和输出层精度量化为INT8,注意在该模型中YPbPr的输入层对精度较为敏感,对Y和PbPr两个输入层不进行量化

3.3.4 生成INT8 BModel

将FALSR/tools/int8u_to_bmodel.py中的prec参数注释后,执行以下命令,使用生成的INT8 UModel文件生成INT8 BModel:

sh ./int8u2bmodel.sh

上述脚本会在int8model/下生成*_int8.bmodel,即转换好的INT8 BModel,使用bm_model.bin --info查看的模型具体信息如下:

PCIE_FALSR超分辨率图像模型移植与测试_第7张图片

 

4. 部署测试

下载测试数据后,将测试视频放至data/videos,转换好的bmodel文件放置于data/models。

已经转换好的bmodel文件可从这里下载,提取码:xtqp

4.1 环境配置

4.1.1 x86 SC5

对于x86 SC5平台,程序执行所需的环境变量执行`source envsetup_pcie.sh`时已经配置完成
在运行Python Demo时需要安装SAIL模块,在[1.2.5](#jump)中已安装。

4.2 C++例程部署测试

4.2.1 x86平台SC5

$ cd cpp
$ vim Makefile.pcie

将Makefile.pcie第一行top_dir ?= ../../..修改为top_dir ?= $(REL_TOP)后,保存退出

退出Docker容器添加环境变量,再进入Docker容器执行脚本 envsetup_pcie.sh 配置环境变量

export REL_TOP=/home/sophgo/bmnnsdk2-bm1684_v2.7.0/
  • 编译
$ make -f Makefile.pcie # 生成falsr_test.pcie
  • 测试
# 样例,可根据各自情况修改路径
$ ./falsr_test.pcie --bmodel=../data/fp32bmodel/falsr_a_fp32.bmodel --
video_path=../data/videos/test_270x480.mp4 --
result_path=./out_video_dir/output_test_270x480.mp4 --tpuid=0 --
out_imgs_path=./out_images_dir/

PCIE_FALSR超分辨率图像模型移植与测试_第8张图片

4.3 Python例程部署测试

Python代码无需编译,无论是x86 SC平台还是arm SE5平台配置好环境之后就可直接运行。

$ cd python
$ python3 falsr_scipy.py --bmodel ../data/fp32bmodel/falsr_a_fp32.bmodel --
video_path ../data/videos/test_270x480.mp4 --out_path 
./out_video_dir/output_test_270x480.mp4

使用SAIL模块的注意事项:对于INT8 BModel来说,当输入输出为int8时,含有scale,需要在处理时将输入输出乘以相应的scale。使用SAIL接口推理时,当sail.Engine.process()接口输入为numpy时,SAIL内部会自动乘以scale,用户无需操作;而输入为Tensor时,需要手动在数据送入推理接口前乘以scale。

PCIE_FALSR超分辨率图像模型移植与测试_第9张图片

4.4 测试结果

拷贝至云空间文件系统(/tmp)后下载至本地查看

测试视频(test_270x480)属性:

PCIE_FALSR超分辨率图像模型移植与测试_第10张图片

 

测试视频(test_270x480)第一帧:

PCIE_FALSR超分辨率图像模型移植与测试_第11张图片

 

导出视频(output_test_270x480)属性:

PCIE_FALSR超分辨率图像模型移植与测试_第12张图片

导出视频(output_test_270x480)第一帧:

PCIE_FALSR超分辨率图像模型移植与测试_第13张图片

 

5. 相关链接

样例开源仓库:https://github.com/sophon-ai-algo/examples

BM1684 BMNNSDK文档:https://developer.sophgo.com/site/index/document/6/all.html

编译工具用户开发手册: https://doc.sophgo.com/docs/2.7.0/docs_latest_release/nntc/html/index.html

量化工具用户开发手册: https://doc.sophgo.com/docs/2.7.0/docs_latest_release/calibration-tools/html/index.html

算能量化工具介绍及使用说明:https://www.bilibili.com/video/BV1DA4y1S75p?spm_id_from=333.999.0

官网视频教程:https://developer.sophgo.com/site/index/course/all/all.html

官网文档中心:https://developer.sophgo.com/site/index/document/all/all.html

官网下载中心:https://developer.sophgo.com/site/index/material/all/all.html

官网论坛:https://developer.sophgo.com/forum/view/43.html

你可能感兴趣的:(TPU实战课,docker,ubuntu,python)