使用OpenVINO的pot组件量化yolo5s模型由FP32到int8

作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处


目录

环境准备

win10的OpenVINO安装

使用OpenVINO将yolo预训练模型转成IR格式

安装accuracy_check

安装pot

查看pot和ac是否安装成功

过程中遇到的问题:

裁剪数据集

数据集和脚本准备 

执行裁剪

 accuracy checker测试精度

准备数据和配置文件

执行命令:

结果:

由FP32量化至int8

准备json文件、模型和数据

pot命令执行

结果:

速度提升效果


环境准备

win10的OpenVINO安装

win10搭建pytorch环境跑通pytorch版本的yolov5_RayChiu757374816的博客-CSDN博客

使用OpenVINO将yolo预训练模型转成IR格式

win10环境yolov5s预训练模型转onnx然后用openvino生成推理加速模型并测试推理_RayChiu757374816的博客-CSDN博客

安装accuracy_check

到OpenVINO安装路径下执行自带安装脚本

cd C:\Program Files (x86)\IntelSWTools\openvino_2020.4.287\deployment_tools\open_model_zoo\tools\accuracy_checker

python setup.py install

安装pot

cd C:\Program Files (x86)\IntelSWTools\openvino_2020.4.287\deployment_tools\tools\post_training_optimization_toolkit

python setup.py install --install-extras

查看pot和ac是否安装成功

accuracy_check -h
pot -h

过程中遇到的问题:

ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject

原因:numpy的问题,我的numpy 19.5的,升级即可:

pip uninstall numpy
pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple numpy

裁剪数据集

数据集和脚本准备 

参考:Cut Datasets — OpenVINO™ documentation

先下载coco数据集:Dataset Preparation Guide — OpenVINO™ documentation

然后准备脚本,放到C盘work目录下:https://raw.githubusercontent.com/aalborov/cut_dataset/38c6dd3948ce4084a52c66e2e83c63eb3fa883e9/cut_dataset.py

然后把数据集解压也放到C盘work目录下。

使用OpenVINO的pot组件量化yolo5s模型由FP32到int8_第1张图片

执行裁剪

python C:/Work/cut_dataset.py --source_images_archive_dir=C:/Work/val2017.zip --source_annotations_archive_dir=C:/Work/annotations_trainval2017.zip --output_size=200 --output_archive_dir=C:/Work/subsets --first_image=10 --dataset_type=coco

使用OpenVINO的pot组件量化yolo5s模型由FP32到int8_第2张图片

 accuracy checker测试精度

准备数据和配置文件

数据和配置文件放到同一个目录下,配置文件yolov5_640_ac.yml为:

models:

  - name: yolo-v5

    launchers:
      - framework: dlsdk
        model:   ./changeModle2/yolov5s_sim.xml
        weights: ./changeModle2/yolov5s_sim.bin
        adapter:
          type: yolo_v5
          anchors: "10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326"
          num: 9
          coords: 4
          classes: 80
          anchor_masks: [[6, 7, 8], [3, 4, 5], [0, 1, 2],  ]
          outputs:
            - Conv_455
            - Conv_504
            - Conv_553

    datasets:
      - name: ms_coco_detection_80_class_without_background
        data_source: val2017
        annotation_conversion:
          converter: mscoco_detection
          annotation_file: instances_val2017.json
          has_background: False
          sort_annotations: True
          use_full_label_map: False
        annotation: mscoco_det_80.pickle
        dataset_meta: mscoco_det_80.json
        preprocessing:
          - type: resize
            size: 640

        postprocessing:
          - type: resize_prediction_boxes
          - type: filter
            apply_to: prediction
            min_confidence: 0.001
            remove_filtered: True
          - type: nms
            overlap: 0.5
          - type: clip_boxes
            apply_to: prediction

        metrics:
          - type: map
            integral: 11point
            ignore_difficult: true
            presenter: print_scalar
          - type: coco_precision
            max_detections: 100
            threshold: 0.5

注意对应一下自己的model和数据路径,yolov5的相关信息就不用改了,因为本次测试就是针对的yolov5。 

执行命令:

accuracy_check -c ./vinoAcDemo/yolov5_640_ac.yml  -s ./vinoAcDemo/ -td CPU

结果:

使用OpenVINO的pot组件量化yolo5s模型由FP32到int8_第3张图片

        非常奇怪呀,我这个模型没有做过多的处理只是将预训练的yolov5模型转为onnx后简化了一下再转为IR文件的,没想到这么低的精度,而且后边量化至int8后测试map还不到5%,不知道啥原因。 

由FP32量化至int8

准备json文件、模型和数据

数据模型还有下边的json配置文件放到同一目录下。 

使用OpenVINO的pot组件量化yolo5s模型由FP32到int8_第4张图片

pot量化命令使用有两种方式,其中常用的一种是依赖于json配置文件的,我们准备一个yolov5s_int8_simple.json

{
    "model": {
        "model_name": "yolov5s_int8_cpu",
        "model": "E:/projects/pyHome/about_yolo/yolov5-master/best.xml",
        "weights": "E:/projects/pyHome/about_yolo/yolov5-master/best.bin"
    },
    "engine": {
        "type": "simplified",
        // you can specify path to directory with images or video file
        // also you can specify template for file names to filter images to load
        // templates are unix style
        //"data_source": "val2017"
    },
    "compression": {
        "target_device": "CPU",
        "algorithms": [
            {
                "name": "DefaultQuantization",
                "params": {
                    "preset": "performance",
                    "stat_subset_size": 128
                }
            }
        ]
    }
}

pot命令执行

pot -c ./yolov5s_int8_simple.json

结果:

使用OpenVINO的pot组件量化yolo5s模型由FP32到int8_第5张图片

速度提升效果

使用OpenVINO的pot组件量化yolo5s模型由FP32到int8_第6张图片

 提升到三倍快了,差不多22fps

参考:OpenVINO 2021r4.1 - 瞎搞YOLOV5 模型转换,INT8量化及C++推理实现_sandmangu的专栏-CSDN博客

【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】 

你可能感兴趣的:(模型压缩和量化,OpenVINO,pot,量化,int8,压缩)