OpenVINO 2022.3实战六:NNCF 实现 YOLOv5 模型 INT8 量化

这篇具有很好参考价值的文章主要介绍了OpenVINO 2022.3实战六:NNCF 实现 YOLOv5 模型 INT8 量化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OpenVINO 2022.3实战六:NNCF 实现 YOLOv5 模型 INT8 量化

1 将YOLOv5模型转换为OpenVINO IR

使用OpenVINO模型优化器将YOLOv5模型转换为OpenVINO IR格式,以便在Intel硬件上进行推理。

下载yolov5代码 ultralytics/yolov5

python export.py --weights yolov5s.pt --include onnx

导出模型为onnx模型,接着使用mo导出openvino fp32和fp16模型

import nncf
from openvino.tools import mo
from openvino.runtime import serialize


MODEL_NAME = "yolov5s"
MODEL_PATH = f"weights/yolov5"

onnx_path = f"{MODEL_PATH}/{MODEL_NAME}.onnx"

# fp32 IR model
fp32_path = f"{MODEL_PATH}/FP32_openvino_model/{MODEL_NAME}_fp32.xml"

print(f"Export ONNX to OpenVINO FP32 IR to: {fp32_path}")
model = mo.convert_model(onnx_path)
serialize(model, fp32_path)

# fp16 IR model
fp16_path = f"{MODEL_PATH}/FP16_openvino_model/{MODEL_NAME}_fp16.xml"

print(f"Export ONNX to OpenVINO FP16 IR to: {fp16_path}")
model = mo.convert_model(onnx_path, compress_to_fp16=True)
serialize(model, fp16_path)

2 准备数据集进行量化

将训练数据集准备成可用于量化的格式。

from openvino.yolov5_dataloader import create_dataloader
from openvino.yolov5_general import check_dataset


DATASET_CONFIG = "./data/coco128.yaml"


def create_data_source():
    """
    Creates COCO 2017 validation data loader. The method downloads COCO 2017
    dataset if it does not exist.
    """
    data = check_dataset(DATASET_CONFIG)
    val_dataloader = create_dataloader(
        data["val"], imgsz=640, batch_size=1, stride=32, pad=0.5, workers=1
    )[0]

    return val_dataloader


data_source = create_data_source()

# Define the transformation method. This method should take a data item returned
# per iteration through the `data_source` object and transform it into the model's
# expected input that can be used for the model inference.
def transform_fn(data_item):
    # unpack input images tensor
    images = data_item[0]
    # convert input tensor into float format
    images = images.float()
    # scale input
    images = images / 255
    # convert torch tensor to numpy array
    images = images.cpu().detach().numpy()
    return images

# Wrap framework-specific data source into the `nncf.Dataset` object.
nncf_calibration_dataset = nncf.Dataset(data_source, transform_fn)

3 配置量化管道

配置量化管道,例如选择适当的量化算法和设置目标精度。

在NNCF中,后训练量化管道由nncf.quantize函数(用于DefaultQuantization算法)和nncf.quantize_with_accuracy_control函数(用于AccuracyAwareQuantization算法)表示。量化参数preset, model_type, subset_size, fast_bias_correction, ignored_scope是函数参数。

subset_size = 300
preset = nncf.QuantizationPreset.MIXED

4 执行模型优化

对模型进行针对Intel硬件推理的优化,例如应用后训练量化或修剪技术。

from openvino.runtime import Core
from openvino.runtime import serialize

core = Core()
ov_model = core.read_model(fp32_path)
quantized_model = nncf.quantize(
    ov_model, nncf_calibration_dataset, preset=preset, subset_size=subset_size
)
nncf_int8_path = f"{MODEL_PATH}/NNCF_INT8_openvino_model/{MODEL_NAME}_int8.xml"
serialize(quantized_model, nncf_int8_path)

5 比较FP32, FP16和INT8模型的准确性

在验证数据集上比较FP32和INT8模型的准确性,以确定是否存在由于量化而导致的准确性损失。

from pathlib import Path
from yolov5_val import run as validation_fn


print("Checking the accuracy of the original model:")
fp32_metrics = validation_fn(
    data=DATASET_CONFIG,
    weights=Path(fp32_path).parent,
    batch_size=1,
    workers=1,
    plots=False,
    device="cpu",
    iou_thres=0.65,
)

fp32_ap5 = fp32_metrics[0][2]
fp32_ap_full = fp32_metrics[0][3]
print(f"mAP@.5 = {fp32_ap5}")
print(f"mAP@.5:.95 = {fp32_ap_full}")


print("Checking the accuracy of the FP16 model:")
fp16_metrics = validation_fn(
    data=DATASET_CONFIG,
    weights=Path(fp16_path).parent,
    batch_size=1,
    workers=1,
    plots=False,
    device="cpu",
    iou_thres=0.65,
)

fp16_ap5 = fp16_metrics[0][2]
fp16_ap_full = fp16_metrics[0][3]
print(f"mAP@.5 = {fp16_ap5}")
print(f"mAP@.5:.95 = {fp16_ap_full}")


print("Checking the accuracy of the NNCF int8 model:")
int8_metrics = validation_fn(
    data=DATASET_CONFIG,
    weights=Path(nncf_int8_path).parent,
    batch_size=1,
    workers=1,
    plots=False,
    device="cpu",
    iou_thres=0.65,
)

nncf_int8_ap5 = int8_metrics[0][2]
nncf_int8_ap_full = int8_metrics[0][3]
print(f"mAP@.5 = {nncf_int8_ap5}")
print(f"mAP@.5:.95 = {nncf_int8_ap_full}")

输出:

Checking the accuracy of the original model:
mAP@.5 = 0.7064319945599192
mAP@.5:.95 = 0.4716138340017886

Checking the accuracy of the FP16 model:
mAP@.5 = 0.7064771913549115
mAP@.5:.95 = 0.47165677301239517

Checking the accuracy of the NNCF int8 model:
mAP@.5 = 0.6900523281577972
mAP@.5:.95 = 0.45860702355897537

6 比较FP32, FP16和INT8模型的性能

比较FP32, FP16和INT8模型的性能,例如测量推理时间和内存使用情况。

benchmark_app -m weights/yolov5/FP32_openvino_model/yolov5s_fp32.xml  -d CPU -api async -t 15

benchmark_app -m weights/yolov5/FP16_openvino_model/yolov5s_fp16.xml  -d CPU -api async -t 15

benchmark_app -m weights/yolov5/FP32_openvino_model/yolov5s_fp32.xml  -d CPU -api async -t 15

输出:文章来源地址https://www.toymoban.com/news/detail-481897.html

Inference FP32 model (OpenVINO IR) on CPU:
[Step 11/11] Dumping statistics report
[ INFO ] Count:            2504 iterations
[ INFO ] Duration:         15067.63 ms
[ INFO ] Latency:
[ INFO ]    Median:        47.65 ms
[ INFO ]    Average:       47.99 ms
[ INFO ]    Min:           40.73 ms
[ INFO ]    Max:           74.31 ms
[ INFO ] Throughput:   166.18 FPS

Inference FP16 model (OpenVINO IR) on CPU:
[Step 11/11] Dumping statistics report
[ INFO ] Count:            2536 iterations
[ INFO ] Duration:         15069.53 ms
[ INFO ] Latency:
[ INFO ]    Median:        47.11 ms
[ INFO ]    Average:       47.38 ms
[ INFO ]    Min:           38.03 ms
[ INFO ]    Max:           65.95 ms
[ INFO ] Throughput:   168.29 FPS

Inference NNCF INT8 model (OpenVINO IR) on CPU:
[Step 11/11] Dumping statistics report
[ INFO ] Count:            7872 iterations
[ INFO ] Duration:         15113.06 ms
[ INFO ] Latency:
[ INFO ]    Median:        61.17 ms
[ INFO ]    Average:       61.23 ms
[ INFO ]    Min:           52.75 ms
[ INFO ]    Max:           93.93 ms
[ INFO ] Throughput:   520.87 FPS

到了这里,关于OpenVINO 2022.3实战六:NNCF 实现 YOLOv5 模型 INT8 量化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++windows+yolov5-6.2+openvino模型部署超详细

    自我记录:代码是根据自己的项目需求,进行了修改,主要是需要检测的图片非常大,目标小,所以对图片进行了分割再检测。下载完配置好环境之后可以直接跑。 我的环境是:windows+vs2019+openvino2022.2+opencv4.5.5+cmake3.14.0 步骤: 1、下载openvino,我用的版本是2022.2 官网网址:

    2024年02月11日
    浏览(41)
  • 无人机上仅使用CPU实时运行Yolov5(OpenVINO实现)(上篇)

    I ntel CPU 在运行 视觉导航 等算法时实时性要优于Nvidia等平台,如Jetson Tx2,NX。而 Nvidia平台 在运行 深度学习算法 方面具有很大优势,两种平台各有利弊。但是,Intel OpenVINO的推出允许NUC平台实时运行深度学习模型,如目前最流行的目标检测程序Yolov5,这样就太好了, 仅使用

    2024年02月10日
    浏览(37)
  • YOLOV5 自动瞄准(OpenVino)(附源码)

    参考文章:基于OpenVINOTM2022.2和蝰蛇峡谷优化并部署YOLOv5模型_openvino 前篇文章:基于YOLOV5的自动瞄准(附代码)_yolov5 自瞄_RedWhiteLuo的博客 之前已经通过Pytroch 调用 NVIDIA GPU 进行推理,但是在实际使用中,独显肯定是最好空闲出来的, 因此我们可以利用闲置的硬件——核显,

    2024年02月08日
    浏览(59)
  • 【OpenVINO™】在 MacOS 上使用 OpenVINO™ C# API 部署 Yolov5

    在 MacOS 上使用 OpenVINO™ C# API 部署 Yolov5 项目介绍 YOLOv5 是革命性的 \\\"单阶段\\\"对象检测模型的第五次迭代,旨在实时提供高速、高精度的结果,是世界上最受欢迎的视觉人工智能模型,代表了Ultralytics对未来视觉人工智能方法的开源研究,融合了数千小时研发中积累的经验教训

    2024年02月19日
    浏览(36)
  • 2022.09.29更新 c++下面部署yolov5实例分割模型(六)

    2023.01.11 更新: 新增加onnxruntime的1.13.x版本支持。 由于onnxruntime从1.12升级到1.13之后,GetOutputName()这个API变成了GetOutputNameAllocated(),坑就出现在这里,新版api的返回值是一个unique_ptr指针,这就意味着他使用一次时候就失效了,所以在循环跑模型的时候基本的第二次都报错

    2024年02月12日
    浏览(37)
  • YOLOv5剪枝✂️| 模型剪枝实战篇

    本篇博文所用代码为开源项目修改得到,且不适合基础太差的同学。 本篇文章主要讲解代码的使用方式,手把手带你实现YOLOv5模型剪枝操作。 0. 环境准备 终端键入:

    2024年02月05日
    浏览(56)
  • 博客3:YOLOv5车牌识别实战教程:模型训练与评估

    摘要:本篇博客将详细介绍如何使用YOLOv5进行车牌识别模型的训练与评估。我们将搭建训练环境、准备数据、配置模型参数、启动训练过程,以及使用验证集评估模型性能。 车牌识别视频 正文: 3.1 搭建训练环境   首先,我们需要搭建YOLOv5的训练环境。YOLOv5使用PyTorch框架,

    2024年02月04日
    浏览(47)
  • 模型实战(11)之win10下Opencv+CUDA部署yolov5、yolov8算法

    测试环境:AMDRH7000+RTX3050+win10+vs2-10+opencv455+cuda11.7 关于opencv470+contrib+cuda的编译,可以详见:Win10下Opencv+CUDA联合编译详细教程 本文代码同时支持 yolov5 、 yolov8 两个模型,详细过程将在文中给出, 完整代码仓库最后给出 其中,yolov8在opencv-DNN + CUDA下的效果如下: 新建VS项目,名

    2024年02月16日
    浏览(43)
  • YOLOv5改进实战 | 更换主干网络Backbone(四)之轻量化模型MobileNetV3

    前言 轻量化网络设计 是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝 :移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。 分组卷积 :将卷积操作分解为若干个较小的卷积操作,并将它们分

    2024年02月07日
    浏览(49)
  • 【目标检测】YOLOv5算法实现(九):模型预测

      本系列文章记录本人硕士阶段YOLO系列目标检测算法自学及其代码实现的过程。其中算法具体实现借鉴于ultralytics YOLO源码Github,删减了源码中部分内容,满足个人科研需求。   本系列文章主要以YOLOv5为例完成算法的实现,后续修改、增加相关模块即可实现其他版本的

    2024年01月21日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包