0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在英特尔AI开发板上用OpenVINO NNCF优化YOLOv7

英特尔物联网 来源:英特尔物联网 2024-01-05 09:29 次阅读

作者:康瑶明英特尔边缘计算创新大使

YOLO代表“You Only Look Once”,它是一种流行的实时物体检测算法系列。最初的YOLO物体检测器于2016年首次发布。从那时起,YOLO的不同版本和变体被提出,每个版本和变体都显着提高了性能和效率。YOLO算法作为one-stage目标检测算法最典型的代表,其基于深度神经网络进行对象的识别和定位,运行速度很快,可以用于实时系统。YOLOv7 是 YOLO 模型系列的下一个演进阶段,在不增加推理成本的情况下,大大提高了实时目标检测精度。

0682d45a-aae9-11ee-8b88-92fbcf53809c.png

项目使用的代码在github开源,来源GitHub。

01准备模型与环境

1.1安装OpenVINO以及nncf包,并且clone yolov7的仓库

%pip install -q "openvino>=2023.2.0" "nncf>=2.5.0"
import sys
from pathlib import Path
sys.path.append("../utils")
from notebook_utils import download_file
# Clone YOLOv7 repo
if not Path('yolov7').exists():
  !git clone https://github.com/WongKinYiu/yolov7
%cd yolov7

左滑查看更多

下图为代码执行后的输出:

06986324-aae9-11ee-8b88-92fbcf53809c.png

1.2下载预训练模型

# Download pre-trained model weights
MODEL_LINK = "https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-tiny.pt"
DATA_DIR = Path("data/")
MODEL_DIR = Path("model/")
MODEL_DIR.mkdir(exist_ok=True)
DATA_DIR.mkdir(exist_ok=True)


download_file(MODEL_LINK, directory=MODEL_DIR, show_progress=True)

左滑查看更多

下图为代码执行后的输出:

06a521ae-aae9-11ee-8b88-92fbcf53809c.png

02使用Pytorch原生推理检查模型

调用推理脚本`ignore detect.py`,输入模型相关信息和推理图片执行推理:

!python -W ignore detect.py --weights model/yolov7-tiny.pt --conf 0.25 --img-size 640 --source inference/images/horses.jpg

左滑查看更多

下图为代码执行后的输出,执行完成后可以看到输出图像尺寸信息以及torch版本,推理设备为CPU。推理结果可以看到识别到5匹马,推理耗时、NMS耗时,结果图片保存路径等信息。

06c70242-aae9-11ee-8b88-92fbcf53809c.png

打开图片查看结果:

image.png

03导出模型为onnx格式

3.1查看`export.py`脚本参数说明

06fdef50-aae9-11ee-8b88-92fbcf53809c.png

3.2输入模型权重文件路径和要导出Detect()层网格,执行脚本生成onnx模型文件并保存

需要说明的是,将整个后处理包含到模型中有助于获得更高性能的结果,但同时会降低模型的灵活性,并且不能保证完全准确,这就是为什么我们只添加--grid 参数来保留原始 pytorch 模型结果格式的原因。

071168e6-aae9-11ee-8b88-92fbcf53809c.png

04转换onnx格式为OpenVINO支持的IR文件

虽然 OpenVINO Runtime直接支持 ONNX 模型,但将它们转换为 IR 格式可以利用 OpenVINO 模型转换的一些API特性。调用模型转换的python API 的`ov.convert_model`可以转换模型。该API返回 OpenVINO 模型类的实例,该实例可在 Python 接口中使用。我们可以使用`ov.save_model` API 接口以 OpenVINO IR 格式保存在设备上,以备使用。

import openvino as ov


model = ov.convert_model('model/yolov7-tiny.onnx')
# serialize model for saving IR
ov.save_model(model, 'model/yolov7-tiny.xml')

左滑查看更多

05验证模型推理

`detect.py` 推理脚本包括预处理步骤、OpenVINO模型的推理以及结果后处理以获得边界框等功能。

左滑查看更多

模型需要RGB通道格式的图像,并在[0, 1] 范围内归一化。要调整图像大小以适合模型大小,请使用`letterbox`方法调整,其中保留了宽度和高度的纵横比。为了保持特定的形状,预处理会自动启用填充。

5.1预处理阶段

对图像进行预处理,以 `np.array` 格式获取图像,使用`letterbox`方法将其调整为特定大小,将色彩空间从 BGR(OpenCV 中的默认值)转换为 RGB,并将数据布局从 HWC 更改为 CHW:

def preprocess_image(img0: np.ndarray):
  # resize
  img = letterbox(img0, auto=False)[0]
  
  # Convert
  img = img.transpose(2, 0, 1)
  img = np.ascontiguousarray(img)
  return img, img0

左滑查看更多

将预处理后的图像转换为张量格式。以 np.array 格式获取图像,其中 unit8 数据在[0, 255] 范围内,并将其转换为浮点数据在[0, 1] 范围内的 torch.Tensor 对象。

def prepare_input_tensor(image: np.ndarray):
  input_tensor = image.astype(np.float32) # uint8 to fp16/32
  input_tensor /= 255.0 # 0 - 255 to 0.0 - 1.0
  
  if input_tensor.ndim == 3:
    input_tensor = np.expand_dims(input_tensor, 0)

左滑查看更多

5.2后处理阶段

模型检测功能核心代码的介绍,使用 NMS 读取图像、对其进行预处理、运行模型推理和后处理结果。

参数:

model(Model):OpenVINO编译的模型。

image_path (Path):输入图片路径。

conf_thres(浮点数,*可选*,0.25):对象过滤的最小置信度

iou_thres(float,*可选*,0.45):在 NMS 中重新复制对象的最小重叠分数

classes (List[int],*optional*, None):用于预测过滤的标签,如果未提供,则将使用所有预测标签

agnostic_nms (bool,*optiona*, False):是否应用与类无关的 NMS 方法

返回:

pred (List):具有(n,6)形状的检测列表,其中 n - 格式为[x1, y1, x2, y2, score, label] 的检测框数

orig_img (np.ndarray):预处理前的图像,可用于结果可视化

input_shape (Tuple[int]):模型输入tensor的形状,可用于输出分辨率

def detect(model: ov.Model, image_path: Path, conf_thres: float = 0.25, iou_thres: float = 0.45, classes: List[int] = None, agnostic_nms: bool = False):
  output_blob = model.output(0)
  img = np.array(Image.open(image_path))
  preprocessed_img, orig_img = preprocess_image(img)
  input_tensor = prepare_input_tensor(preprocessed_img)
  predictions = torch.from_numpy(model(input_tensor)[output_blob])
  pred = non_max_suppression(predictions, conf_thres, iou_thres, classes=classes, agnostic=agnostic_nms)
  return pred, orig_img, input_tensor.shape

左滑查看更多

图像上绘制预测边界框的核心代码实现,

参数:

predictions (np.ndarray):形状为(n,6)的检测列表,其中 n - 检测到的框数,格式为[x1, y1, x2, y2, score, label]

image (np.ndarray):用于框可视化的图像

names (List[str]):数据集中每个类的名称列表

colors (Dict[str, int]):类名和绘图颜色之间的映射

返回:

image (np.ndarray):框可视化结果

def draw_boxes(predictions: np.ndarray, input_shape: Tuple[int], image: np.ndarray, names: List[str], colors: Dict[str, int]):
  if not len(predictions):
    return image
  # Rescale boxes from input size to original image size
  predictions[:, :4] = scale_coords(input_shape[2:], predictions[:, :4], image.shape).round()


  # Write results
  for *xyxy, conf, cls in reversed(predictions):
    label = f'{names[int(cls)]} {conf:.2f}'
    plot_one_box(xyxy, image, label=label, color=colors[names[int(cls)]], line_thickness=1)

左滑查看更多

06选择设备并推理

compiled_model = core.compile_model(model, device.value)
boxes, image, input_shape = detect(compiled_model, 'inference/images/horses.jpg')
image_with_boxes = draw_boxes(boxes[0], input_shape, image, NAMES, COLORS)
# visualize results
Image.fromarray(image_with_boxes)

左滑查看更多

07验证模型准确性

为了评估模型的准确性,需要下载coco数据集以及注释。处理验证数据集并完成评估。评估完成后,下图可以看到准确度是符合要求的:

074a578c-aae9-11ee-8b88-92fbcf53809c.png

08使用NNCF 训练后量化API 优化模型

NNCF 是 OpenVINO 中的神经网络推理优化提供了一套高级算法,精度下降最小。我们将在训练后模式下使用 8-bit量化来优化 YOLOv7。优化过程包含以下步骤:1)创建用于量化的数据集。2)运行 nncf.quantize 以获取优化的模型。3)使用 openvino.runtime.serialize 函数序列化 OpenVINO IR 模型。

量化变换函数,从数据加载器项中提取和预处理输入数据以进行量化。量化完成后可以验证量化模型推理和验证量化模型的准确性,看是否符合要求。

import nncf 


def transform_fn(data_item):
  img = data_item[0].numpy()
  input_tensor = prepare_input_tensor(img) 
  return input_tensor


quantization_dataset = nncf.Dataset(dataloader, transform_fn)

左滑查看更多

nncf.quantize 函数提供模型量化的接口。它需要OpenVINO模型和量化数据集的实例。

quantized_model = nncf.quantize(model, quantization_dataset, preset=nncf.QuantizationPreset.MIXED)


ov.save_model(quantized_model, 'model/yolov7-tiny_int8.xml')

左滑查看更多

09比较原始模型和量化后模型的性能

量化完成后,我们希望使用 OpenVINO 基准测试工具测量 FP32 和 INT8 模型的推理性能,从而清楚NNCF带来的优化提升。

下图为在AI爱克斯开发板上FP32格式的模型推理,cpu型号为n5105,可以看到吞吐为2.27fps。

075de874-aae9-11ee-8b88-92fbcf53809c.png

下图为量化后 INT8 格式的模型推理,可以看到吞吐为4.89fps。

077f127e-aae9-11ee-8b88-92fbcf53809c.png

总 结

FP32格式的模型推理AI爱克斯开发板上CPU吞吐为2.27fps,量化后 INT8 格式为4.89fps,由此说明了量化的后性能提升很明显,提升至2.15倍,在工程和学习中推荐使用NNCF等OpenVINO工具来优化模型,从而在不损失精度的前提下提高推理性能,更好的服务于场景使用。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 英特尔
    +关注

    关注

    60

    文章

    9429

    浏览量

    168953
  • 检测器
    +关注

    关注

    1

    文章

    811

    浏览量

    47295
  • AI
    AI
    +关注

    关注

    87

    文章

    26484

    浏览量

    264109
  • 开发板
    +关注

    关注

    25

    文章

    4439

    浏览量

    94095
  • OpenVINO
    +关注

    关注

    0

    文章

    59

    浏览量

    91

原文标题:在英特尔 AI 开发板上用OpenVINO™ NNCF 优化 YOLOv7,2.15 倍性能提升 | 开发者实战

文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    英特尔® Edison 开发板的各种接口及每个接口的用途

    英特尔® Edison 开发板提供了用于与开发板通信、上传代码、更新开发板固件等操作的广泛功能。参考下图,概览开发板
    发表于 06-06 10:29

    如何在您的英特尔® Edison 开发板更新(刷新)固件

    本部分介绍了如何在您的英特尔® Edison 开发板更新(刷新)固件。Flash Tool Lite 是刷新开发板固件的首选方法。固件是开发板
    发表于 06-15 15:24

    苹果放弃未来iPhone使用英特尔5G基带芯片 精选资料推荐

    腾讯科技讯,7 月 5 日据国外媒体报道,英特尔未来不会再向苹果的 iPhone 智能手机提供基带芯片了。英特尔刚刚确认,公司已经停止开发部分原本计划使用在苹果 iPhone
    发表于 07-23 06:20

    介绍英特尔®分布式OpenVINO™工具包

    性能。 英特尔®OpenlandOpen™管理软件包包括英特尔®深度学习部署工具包(英特尔®DLDT)。适用于Linux *的OpenVINO™工具包的
    发表于 07-26 06:45

    怎么安装适用于Linux *的OpenVINO™工具包的英特尔®发布版?

    怎么安装适用于Linux *的OpenVINO™工具包的英特尔®发布版?
    发表于 09-23 08:33

    yolov7 onnx模型NPU太慢了怎么解决?

    我将 yolov7tiny.pt(yolov7-tiny 模型)转换为具有 uint8 权重的 yolov7tiny.onnx,然后 i.MX 8M Plus NPU
    发表于 04-04 06:13

    无法使用MYRIADOpenVINO trade中运行YOLOv7自定义模型怎么解决?

    无法确定如何将 YOLOv7 模型的重量(.pt 文件)转换为OpenVINO™中间表示 (IR) 并推断有 MYRIAD 的 IR。 分辨率 转换使用此 GitHub* 存储库
    发表于 08-15 08:29

    安装OpenVINO工具套件英特尔Distribution时出现错误的原因?

    安装OpenVINO™工具套件英特尔 Distribution时,出现错误: Python 3.10.0.ECHO is off. Unsupported Python version.
    发表于 08-15 08:14

    AI爱克斯开发板上用OpenVINO™加速YOLOv8分类模型

    本系列文章将在 AI 爱克斯开发板上使用 OpenVINO 开发套件依次部署并测评 YOLOv8 的分类模型、目标检测模型、实例分割模型和人
    的头像 发表于 05-05 11:47 600次阅读
    在<b class='flag-5'>AI</b>爱克斯<b class='flag-5'>开发板</b>上用<b class='flag-5'>OpenVINO</b>™加速<b class='flag-5'>YOLOv</b>8分类模型

    AI爱克斯开发板上用OpenVINO™加速YOLOv8目标检测模型

    《在 AI 爱克斯开发板上用 OpenVINO 加速 YOLOv8 分类模型》介绍了在 AI 爱克斯开发
    的头像 发表于 05-12 09:08 852次阅读
    在<b class='flag-5'>AI</b>爱克斯<b class='flag-5'>开发板</b>上用<b class='flag-5'>OpenVINO</b>™加速<b class='flag-5'>YOLOv</b>8目标检测模型

    AI爱克斯开发板上使用OpenVINO加速YOLOv8目标检测模型

    《在AI爱克斯开发板上用OpenVINO加速YOLOv8分类模型》介绍了在AI爱克斯开发板上使用
    的头像 发表于 05-26 11:03 723次阅读
    <b class='flag-5'>AI</b>爱克斯<b class='flag-5'>开发板</b>上使用<b class='flag-5'>OpenVINO</b>加速<b class='flag-5'>YOLOv</b>8目标检测模型

    AI爱克斯开发板上用OpenVINO™加速YOLOv8-seg实例分割模型

    《在 AI 爱克斯开发板上用 OpenVINO 加速 YOLOv8 目标检测模型》介绍了在 AI 爱克斯
    的头像 发表于 06-05 11:52 606次阅读
    在<b class='flag-5'>AI</b>爱克斯<b class='flag-5'>开发板</b>上用<b class='flag-5'>OpenVINO</b>™加速<b class='flag-5'>YOLOv</b>8-seg实例分割模型

    AI爱克斯开发板上用OpenVINO™加速YOLOv8-seg实例分割模型

    《在 AI 爱克斯开发板上用 OpenVINO 加速 YOLOv8 目标检测模型》介绍了在 AI 爱克斯
    的头像 发表于 06-30 10:43 451次阅读
    在<b class='flag-5'>AI</b>爱克斯<b class='flag-5'>开发板</b>上用<b class='flag-5'>OpenVINO</b>™加速<b class='flag-5'>YOLOv</b>8-seg实例分割模型

    使用OpenVINO优化并部署训练好的YOLOv7模型

    在《英特尔锐炫 显卡+ oneAPI 和 OpenVINO 实现英特尔 视频 AI 计算盒训推一体-上篇》一文中,我们详细介绍基于英特尔
    的头像 发表于 08-25 11:08 927次阅读
    使用<b class='flag-5'>OpenVINO</b><b class='flag-5'>优化</b>并部署训练好的<b class='flag-5'>YOLOv7</b>模型

    基于OpenVINO英特尔开发套件上实现眼部追踪

    本文将以训练一个眼部追踪 AI 小模型为背景,介绍从 Pytorch 自定义网络模型,到使用 OpenVINO NNCF 量化工具优化模型,并部署到
    的头像 发表于 09-18 10:11 440次阅读