OpenVINO 2021r1 超分辨率重建 INT8量化 - Waifu2x

OpenVINO 同时被 2 个专栏收录
22 篇文章 9 订阅
13 篇文章 2 订阅

接下来试试超分的INT8量化, 还是拿waifu2x模型来试验

 

首先毫无意外的掉进坑里了... ...

本来系统里已经装好了OpenVINO 2021r2, 想直接从这个版本开始,先安装accuracy_checker和pot的最新版本

到openvino_2021\deployment_tools\open_model_zoo\tools\accuracy_checker目录下运行

python setup.py install

安装成功,

再到openvino_2021\deployment_tools\tools\post_training_optimization_toolkit的目录下运行相同的安装命令,结果安装失败了,报有个ideep4py的库找不到,看了下openvino_2021\deployment_tools\tools\post_training_optimization_toolkit\setup.py, 看到这么一段

INSTALL_REQUIRES = ['scipy==1.2.1',
                    'jstyleson==0.0.2',
                    'numpy==1.16.3',
                    'pandas==0.24.2',
                    'hyperopt==0.1.2',
                    'addict==2.2.1',
                    'chainer==7.7.0',
                    'ideep4py==2.0.0.post3']

再上这个库的源上看了一眼https://pypi.org/simple/ideep4py/,发现这货根本就没有windows包。难道要我再装个linux版?

万般无奈之际发现我的2020r3是好的,只好一个版本一个版本的回滚,发现OV2021r1的pot安装是不依赖这个ideep4py的

出坑的方法就是: 目前做8bit量化要用OV2021r1,不用OV2021r2!!! 开源项目就这样,等OV2021r3出来以后再看看这个bug有没有解决吧

 

开始正式转INT8模型

1. accuracy_checker

先搞定精度检测,因为pot转换的时候也需要这个工具来对比原始模型和转换后的int8模型的推理精度。

主要的思路来源于这篇文章 OpenVINO 2020的INT8转换工具POT的初体验 因为OpenVINO在open model zoo里带的超分模型single-image-super-resolution-1032是有int8模型的,所以可以参考openvino_2021\deployment_tools\open_model_zoo\tools\accuracy_checker\configs\single-image-super-resolution-1032.yml的写法,自己编一个出来

先写配置文件waifu_FP32_ac_ov2021.yml

models:
  - name: waifu2x

    launchers:
      - framework: dlsdk
        model: noise0_scale2x_model_FP32.xml
        weights: noise0_scale2x_model_FP32.bin

        adapter:
          type: super_resolution
          reverse_channels: True

    datasets:
      - name: super_resolution_x2
        data_source: dataset
        annotation_conversion:
          converter: super_resolution
          data_dir: dataset
          lr_suffix: lr_
          hr_suffix: hr_
        annotation: super_resolution_x2.pickle

        preprocessing:
          - type: auto_resize

        postprocessing:
          - type: resize
            apply_to: prediction
    
        metrics:
          - type: psnr
            scale_border: 4
            presenter: print_vector
          #- type: ssim
          #  presenter: print_vector

这里各个数据段的含义就不解释了,可以参考官方文档 https://docs.openvinotoolkit.org/latest/omz_tools_accuracy_checker_accuracy_checker_adapters_README.html

接下来做个数据集

在放waifu_FP32_ac.yml的目录下新建个目录dataset 这个名字对应yml文件里的datasets段里面的定义


    datasets:
      - name: super_resolution_x2
#data_source填存放数据集的目录
        data_source: dataset
        annotation_conversion:
          converter: super_resolution
#data_dir填存放数据集的目录
          data_dir: dataset
#lr_suffix, hr_suffix放图片的前缀,这里是告诉accuracy_checker, 低分辨率的图片是按照lr_1.png, lr_2.png... 高分辨率图片是按照hr_1.png hr_2.png... 来命名的
          lr_suffix: lr_
          hr_suffix: hr_
        annotation: super_resolution_x2.pickle

制作测试图片集,我的waifu2x模型通过MO转IR的时候定义了input_shape为[640x480], 所以转换的低分辨率图片分辨率为[640x480], 高分辨率图片分辨率为2x,即[1280x960],因为没有原始训练的数据集,只是随便测测,所以只随便找了20张图片转换出了20组

 运行

accuracy_check -c waifu_FP32_ac_ov2021.yml -s ./ -td GPU

输出

PSNR很差,有很多可能,也许是我的数据集不是原始训练集,也可能是我做数据集的时候的缩放顺序不对,或者HR图像的分辨率不对,再或者是yml的某个字段填错了。不过无所谓,至少说明accuracy checker能正常工作了 :)

 

2. POT

AC工作正常了,POT的json配置文件也可以照着相同的思路来一遍,这里我用了最简单的默认量化算法


{
    /* Model parameters */

    "model": {
        "model_name": "noise0_scale2x_model_FP32", // Model name
        "model": "noise0_scale2x_model_FP32.xml", // Path to model (.xml format)
        "weights": "noise0_scale2x_model_FP32.bin" // Path to weights (.bin format)
    },

    /* Parameters of the engine used for model inference */

    "engine": {
        "config": "waifu_FP32_ac_ov2021.yml"
    },

    /* Optimization hyperparameters */

    "compression": {
        "target_device": "GPU", // Target device, the specificity of which will be taken
                                // into account during optimization
        "algorithms": [
            {
                "name": "DefaultQuantization", // Optimization algorithm name
                "params": {
                    "preset": "performance", // Preset [performance, mixed, accuracy] which control the quantization
                                             // mode (symmetric, mixed (weights symmetric and activations asymmetric)
                                             // and fully asymmetric respectively)

                    "stat_subset_size": 20  // Size of subset to calculate activations statistics that can be used
                                             // for quantization parameters calculation
                }
            }
        ]
    }
}

 运行命令

pot -c waifu_simplified_mode_ov2021.json

一通CPU风扇狂转之后终于有了结果 (这里手工改了文件名,原来转出来的文件和原模型文件名一样)

用ac检查一下INT8模型的精度

processed in 24.956 seconds
psnr@mean: 13.60Db
psnr@std: 2.99Db

PSNR有下降,不过PSNR并不能表示图像画质,还是要用人眼的主观画质评测来打分,这个是玄学 :P

 

3. Bicubic, FP16 SR, INT8 SR 2X画质对比

祭出OpenVINO 2021r2 C++ 超分辨率重建 Waifu2x里面用到的SR转换程序,改一下模型的名字,得到3种模式的输出

原始图片(测试图片来自网络)

Bicubic的2x放大效果

 Waifu2x 2X FP16 精度放大的效果

 

 Waifu2x 2X INT8 精度放大的效果 

和FP16的模型输出做比对,第一眼没有什么特别明显的差别

 

4. 性能分析

最后看一下性能

前一篇文章, Waifu2X FP16的模型

调用inferRequest_regular.Infer()推理的时间, 在8665U 4核8线程的CPU和 Gen9 24EU的核显上

  • CPU: 1341ms (0.746FPS)
  • GPU: 685ms (1.46FPS)

这次在相同的配置下, Waifu2X INT8模型

  • CPU: 957ms (1.04FPS)
  • GPU: 1228ms (0.81FPS)

 基本符合预期,CPU方面可以通过INT8模型来提升性能, GPU方面因为Gen9不支持INT8计算,所以加载的int8模型会转换成FP32模型来计算,自然性能不如FP16的模型

 

再借来台其他同学的老虎湖(Tiger Lake 1165G7)来试试Gen12 96EU的显卡 :)

INT8模型 GPU: 154ms (6.49FPS)

FP16模型 GPU: 175.38ms (5.7FPS)

 

Gen12集显的性能提升还是很明显的,

Gen12 FP16 VS. Gen9 FP16模型

    5.7/1.46=3.9X

Gen12 INT8 VS. Gen12 FP16 模型

    6..49/5.7=1.14X

 

最后代码奉上,仅供参考

https://gitee.com/tisandman/pot_waifu2x_ov2021

 

 

  • 1
    点赞
  • 8
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

<p> <span></span> </p> <p> 手把手讲授如何搭建成功OpenVINO框架,并且使用预训练模型快速开发超分辨率、道路分割、汽车识别、人脸识别、人体姿态和行人车辆分析。得益于OpenVINO框架的强大能力,这些例子都能够基于CPU达到实时帧率。<br /> 课程的亮点在于在调通Demo的基础上更进一步:一是在讲Demo的时候,对相关领域问题进行分析(比如介绍什么是超分辨率,有什么作用)、预训练模型的来龙去脉(来自那篇论文,用什么训练的)、如何去查看不同模型的输入输出参数、如何编写对应的接口参数进行详细讲解;二是基本上对所有的代码进行重构,也就是能够让例子独立出来,并且给出了带有较详细注释的代码;三是注重实际运用,将Demo进一步和实时视频处理框架融合,形成能够独立运行的程序,方便模型落地部署;四是重难点突出、注重总结归纳,对OpenVINO基本框架,特别是能够提高视频处理速度的异步机制和能够直接部署解决实际问题的骨骼模型着重讲解,帮助学习理解;五是整个课程准备精细,每一课都避免千篇一律,前一课有对后一课的预告,后一课有对前一课的难点回顾,避免学习过程中出现突兀;六是在适当的时候拓展衍生,不仅讲OpenVINO解决图像处理问题,而且还补充图像处理的软硬选择、如何在手机上开发图像处理程序等内容,帮助拓展视野,增强对行业现状的了解。<br /><br /> 基本提纲:<br /> 1、课程综述、环境配置<br /> 2、OpenVINO范例-超分辨率(super_resolution_demo)<br /> 3、OpenVINO范例-道路分割(segmentation_demo)<br /> 4、OpenVINO范例-汽车识别(security_barrier_camera_demo)<br /> 5、OpenVINO范例-人脸识别(interactive_face_detection_demo)<br /> 6、OpenVINO范例-人体姿态分析(human_pose_estimation_demo)<br /> 7、OpenVINO范例-行人车辆分析(pedestrian_tracker_demo)<br /> 8、NCS和GOMFCTEMPLATE<br /> 9、课程小结,资源分享 </p>
<p><span style="color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 16px; background-color: #ffffff;">详细介绍了OpenVINO整体架构、基本组件、核心组件DLDT与IE的使用,OpenVINO对模型加速执行推断的开发流程与步骤、相关SDK API函数如何在C++与Python环境下进行API调用,如何使用预训练模型快速开发图像分类、对象检测、语义分割、实例分割、车牌识别、行人检测、场景文字检测与识别、YOLOv5模型部署加速与推理、表情识别与landmark提取等高实时视频分析程序,使用模型优化器进行模型压缩转换与优化等OpenVINO核心技术演示与代码教学。一步一步教你构建CPU级别可实时的深度学习模型应用程序。部分演示程序截图如下(</span><strong style="color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 16px; background-color: #ffffff;">均基于CPU达到实时帧率,基于OpenVINO2021.02版本录制</strong><span style="color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 16px; background-color: #ffffff;">):</span></p> <p><span style="color: #424242; background-color: #ffffff;"><img src="https://img-bss.csdn.net/201911090640507040.png" alt="" /><br /></span></p>
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值