本文档适用于SOPHGOBM1684-SE5及对应通用云开发空间,主要内容:
注意:由于SOPHGOSE5微服务器的CPU是基于ARM架构,部分步骤将在基于x86架构CPU的开发环境中完成
初始化开发环境模型转换FALSR模型推理测试(处理后的FALSR项目文件将被拷贝至SOPHGOSE5微服务器上推理测试
初始化开发环境
1准备开发环境
开发环境是指用于模型转换或验证以及程序编译等开发过程的环境,目前只支持x8需要使用我们提供的基于Ubuntu104的docker镜像。
运行环境是具备Sophon设备的平台上实际使用设备进行算法应用部署的环境,有PCIe加速卡、SM5模组、SE5边缘计算盒子等,所有运行环境上的BModel都是一样的,SDK中各模块的接口也是一致的。
开发环境与运行环境可能是统一的,也可能是分离的。
无论使用的产品是SoC模式还是PCIe模式,都需要一台x86主机作为开发环境,模型的转换工作必须在开发环境中完成。
1开发主机准备:
开发主机:一台安装了Ubuntu104/104/20.04的x86主机,运行内存建议12GB以上
# 安装docker
sudo apt-get install docker.io
# docker命令免root权限执行
# 创建docker用户组,若已有docker组会报错,没关系可忽略
sudo groupadd docker
# 将当前用户加入docker组
sudo gpasswd -a ${USER} docker
# 重启docker服务
sudo service docker restart
# 切换当前会话到新group或重新登录重启X会话
newgrp docker
2SDK软件包下载:
下载docker开发镜像
3创建docker开发环境:
加载docker镜像:
docker load -i bmnnsdk2-bm1684-ubuntu-docker-py37/bmnnsdk2-bm1684-
ubuntu.docker
解压缩SDK:
tar zxvf bmnnsdk2_bm1684_v2.7.0_20220531patched/bmnnsdk2-
bm1684_v2.7.0.tar.gz
创建docker容器,SDK将被挂载映射到容器内部供使用:
cd bmnnsdk2-bm1684_v2.7.0
# 若您没有执行前述关于docker命令免root执行的配置操作,需在命令前添加sudo
./docker_run_bmnnsdk.sh
进入docker容器中安装库:
# 进入容器中执行
cd /workspace/scripts/
./install_lib.sh nntc
设置环境变量:
# 配置环境变量,这一步会安装一些依赖库,并导出环境变量到当前终端
# 导出的环境变量只对当前终端有效,每次进入容器都需要重新执行一遍,或者可以将这些环境变量写入
~/.bashrc,这样每次登录将会自动设置环境变量
source envsetup_cmodel.sh
FALSR模型
FALSR是小米AILab提出的快速、准确且轻量级的像超分辨率模型。
应用场景:
老相片翻新:低分辨率或者有残缺的老照片,可以通过该算法进行像修复;卫星像遥感:在遥感领域,超分可以复原出更多的片信息与细节;医学影像:在医疗领域,超分可以将低分辨率的扫描片还原出高清片,有助于准确发现病灶;
特色优势:
以极低的成本实现AIOT设备的片修复功能,从而衍生出各种各样的应用与发明;基于BM1684的超分可以轻松部署于云端或者边缘端,方便开发者各种使用需求;
Demo演示:将低分辨率的片转化成高分辨率的片
模型的转换和量化
1准备模型与数据
1准备Demo文件
2准备模型下载
3准备测试数据
4准备量化集
不量化模型可跳过本节。
执行以下命令,使用bmnett编译生成FP32BModel,如果使用了其他的测试视频请注意修改`gen_fp32_bmodel.sh`中的输入参数shapes与视频长宽保持一致,shapes中第二个shape的长宽是第一个的两倍。
cd scripts
sh ./gen_fp32_bmodel.sh
部分输出:
查看FP32BModel的信息:
# 查看模型信息
bm_model.bin --info falsr_a_fp32.bmodel
bmrt_test --bmodel falsr_a_fp32.bmodel
不量化模型可跳过本节。
INT8BModel的生成需要经历中间格式UModel,即:原始模型→FP32UModel→INT8UModel→INT8BModel。
执行以下命令,将依次调用以下步骤中的脚本,生成INT8BModel:
sh ./gen_int8bmodel.sh
若出现`AssertionError`,可将报错处`assert`语句注释后重新调用脚本
sh ./create_lmdb.sh
执行以下命令,使用`ufw.tools.tf_to_umodel`生成FP32UModel,若不指定-D参数,可以在生成prototxt文件以后修改:
sh ./gen_fp32umodel.sh
上述脚本会在`int8model/`下生成`*_bmnetp_test_fp3prototxt`、`*_bmnetp.fp32umodel`文件,即转换好的FP32UModel。
执行以下命令,使用修改后的FP32UModel文件量化生成INT8UModel:
sh ./gen_int8umodel.sh
上述脚本会在`int8model/`下生成`*_bmnett_deploy_fp32_unique_top.prototxt`、`*_bmnett_deploy_int8_unique_top.prototxt`和`*_bmnett.int8umodel`文件,即转换好的INT8UModel。该操作中对FP32的Model进行量化,将中间层和输出层精度量化为INT8,注意在该模型中YPbPr的输入层对精度较为敏感,对Y和PbPr两个输入层不进行量化。
将`FALSR/tools/int8u_to_bmodel.py`中的`prec`参数注释后,执行以下命令,使用生成的INT8UModel文件生成INT8BModel:
sh ./int8u2bmodel.sh
上述脚本会在`int8model/`下生成`*_intbmodel`,即转换好的INT8BModel,使用`bm_model.bin--info`查看的模型具体信息如下:
FALSR模型部署测试
下载测试数据后,将测试视频放至`data/videos`,转换好的bmodel文件放置于`data/models`。
>已经转换好的bmodel文件可从这里下载,提取码:xtqp
1环境配置
将在处理好的FALSR项目文件,压缩后拷贝至SE5微服务器上:
scp -r /FALSR username@<SE5_IP>:<filepath>
或通过云空间文件系统拷贝:
打开云空间文件系统:
# 设置环境变量
export PATH=$PATH:/system/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/system/lib/:/system/usr/lib/aarch64-
linux-gnu
export PYTHONPATH=$PYTHONPATH:/system/lib
您可能需要安装numpy包,以在Python中使用OpenCV和SAIL:
# 请指定numpy版本为1.17.2
sudo pip3 install numpy==1.17.2
2C++例程部署测试
1SE5平台
对于arm平台SE需要在docker开发容器中使用交叉编译工具链编译生成可执行文件,而后拷贝到Soc目标平台运行。
在docker开发容器中交叉编译
$ cd cpp
$ make -f Makefile.arm # 生成falsr_test.arm
将生成的可执行文件及所需的模型和测试视频文件拷贝到盒子中测试
# 样例,可根据各自情况修改路径
$ ./falsr_test.arm --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/
3Python例程部署测试
Python代码无需编译,无论是x86SC平台还是armSE5平台配置好环境之后就可直接运行。
$ 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模块的注意事项:对于INT8BModel来说,当输入输出为int8时,含有scale,需要在处理时将输入输出乘以相应的scale。使用SAIL接口推理时,当sail.Engine.process接口输入为numpy时,SAIL内部会自动乘以scale,用户无需操作;而输入为Tensor时,需要手动在数据送入推理接口前乘以scale。
4测试结果
拷贝至云空间文件系统后下载至本地查看
测试视频属性:
测试视频第一帧:
导出视频属性:
文章为作者独立观点,不代表股票交易接口观点