介绍
由于人工智能对人们手工劳动的日益影响,在我们几乎每天都在谈论人工智能。建立AI-enabled软件在短时间内迅速增长。企业和商家相信将可靠和负责任的AI集成到他们的应用程序中以产生更多的收入。将AI集成到应用程序中最具挑战性的部分是在训练模型时使用的模型推理和计算资源。已经存在许多技术来通过使用较少的计算资源在推理过程中优化模型以提高性能。基于这个问题陈述,英特尔推出了OpenVINO Toolkit,这是一个绝对的游戏改变者。OpenVINO是一个用于优化和部署AI推理的开源工具包。
学习目标
在本文中,我们将:
- 了解OpenVINO Toolkit及其在优化和部署AI推理模型方面的目的。
- 探索OpenVINO的实际用例,特别是其在边缘人工智能未来中的重要性。
- 学习如何在Google Colab中使用OpenVINO在图像中实现文本检测项目。
- 了解使用OpenVINO的关键功能和优势,包括其模型兼容性和对硬件加速器的支持以及它如何影响各个行业和应用。
本文是数据科学博客马拉松的一部分。
什么是OpenVINO?
![]()
OpenVINO代表开放的视觉推理和神经网络优化,是由英特尔团队开发的开源工具包,旨在促进深度学习模型的优化。OpenVINO工具包的愿景是通过更高效和更有效的方法在本地、设备上或云中部署您的人工智能深度学习模型。
OpenVINO Toolkit特别有价值,因为它支持许多深度学习框架,包括像TensorFlow、PyTorch、Onnx和Caffe这样流行的框架。您可以使用您喜欢的框架训练模型,然后使用OpenVINO将其转换和优化以在Intel的硬件加速器(如CPU、GPU、FPGA和VPU)上部署。
在推理方面,OpenVINO Toolkit提供了各种模型量化和压缩工具,可以显著减小深度学习模型的大小而不损失推理准确性。
为什么使用OpenVINO?
AI的热潮目前没有减缓的迹象。随着它的流行,显然会开发更多应用程序在本地和设备上运行人工智能应用程序。OpenVINO在以下几个具有挑战性的领域表现出色,这些是选择使用OpenVINO的理想选择的原因:
OpenVINO模型库
OpenVINO提供了一个模型库,包含用于稳定扩散、语音、目标检测等任务的预训练深度学习模型。这些模型可以作为您项目的起点,节省时间和资源。
模型兼容性
OpenVINO支持许多深度学习框架,包括TensorFlow、PyTorch、ONNx和Caffe。这意味着您可以使用您喜欢的框架训练模型,然后使用OpenVINO Toolkit将其转换和优化以进行部署。
高性能
OpenVINO经过优化以实现快速推理,非常适合实时应用程序,如计算机视觉、机器人和物联网设备。它利用FPGA、GPU和TPU等硬件加速来实现高吞吐量和低延迟。
使用Intel OpenVINO的边缘人工智能未来
![]()
AI在边缘计算是最具挑战性的领域。借助OpenVINO的帮助,构建解决硬件限制的优化解决方案不再是不可能的。利用这个工具包,在边缘计算上的AI的未来有可能彻底改变各行各业和应用领域。
让我们来看看OpenVINO是如何工作的,使之适用于边缘计算中的AI。
- 第一步是使用你最喜欢的深度学习框架构建一个模型,并将其转换为OpenVINO核心模型。另一种选择是使用OpenVINO模型库中的预训练模型。
- 模型训练完成后,下一步是压缩。OpenVINO Toolkit提供了一个神经网络压缩框架(NNCF)。
- 模型优化器将预训练模型转换为适用的格式。优化器包含中间表示(IR)数据。IR数据是指经过优化和转换以便与OpenVINO部署一起使用的深度学习模型的中间表示。模型权重以.xml和.bin文件格式存储。
- 在模型部署时,OpenVINO推理引擎可以在目标硬件上加载和使用IR数据,实现各种应用的快速高效推理。
通过这种方法,OpenVINO可以在边缘计算中发挥重要作用。让我们动手完成一个使用OpenVINO Toolkit实现图像中的文本检测的代码项目。
使用OpenVINO Toolkit进行图像中的文本检测
在这个项目的实现中,我们将使用Google Colab作为VoAGI来成功运行应用程序。在这个项目中,我们将使用OpenVINO模型库中的horizontal-text-detection-0001模型。这个预训练模型可以检测输入图像中的水平文本,并返回一个形状为(100,5)的数据blob。这个返回结果的格式类似于(x_min,y_min,x_max,y_max,conf)。
逐步代码实现
安装
!pip install openvino
导入所需库
让我们导入所需的模块来运行这个应用程序。OpenVINO支持一个utils辅助函数,用于从提供的源代码URL下载预训练权重。
import urllib.requestbase = "https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks"utils_file = "/main/notebooks/utils/notebook_utils.py"urllib.request.urlretrieve( url= base + utils_file, filename='notebook_utils.py')from notebook_utils import download_file
您可以验证notebook_utils现在已成功下载,让我们快速导入剩下的模块。
import openvinoimport cv2import matplotlib.pyplot as pltimport numpy as npfrom pathlib import Path
下载权重
初始化下载水平文本检测的IR数据模型权重文件的路径。
base_model_dir = Path("./model").expanduser()model_name = "horizontal-text-detection-0001"model_xml_name = f'{model_name}.xml'model_bin_name = f'{model_name}.bin'model_xml_path = base_model_dir / model_xml_namemodel_bin_path = base_model_dir / model_bin_name
在下面的代码片段中,我们使用三个变量来简化预训练模型权重存在的路径。
model_zoo = "https://storage.openvinotoolkit.org/repositories/open_model_zoo/2022.3/models_bin/1/"algo = "horizontal-text-detection-0001/FP32/"xml_url = "horizontal-text-detection-0001.xml"bin_url = "horizontal-text-detection-0001.bin"model_xml_url = model_zoo+algo+xml_urlmodel_bin_url = model_zoo+algo+bin_urldownload_file(model_xml_url, model_xml_name, base_model_dir)download_file(model_bin_url, model_bin_name, base_model_dir)
![]()
加载模型
OpenVINO提供了一个核心类来与OpenVINO工具包进行交互。核心类提供了各种方法和函数,用于处理模型和执行推理。使用read_model方法并传入model_xml_path来读取模型。在读取模型之后,将模型编译为特定的目标设备。
core = Core()model = core.read_model(model=model_xml_path)compiled_model = core.compile_model(model=model, device_name="CPU")input_layer_ir = compiled_model.input(0)output_layer_ir = compiled_model.output("boxes")
在上面的代码片段中,编译后的模型返回输入图像的形状为(704,704,3),是一个RGB图像,但以PyTorch格式(1,3,704,704)表示,其中1是批处理大小,3是通道数,704是高度和宽度。输出返回(x_min, y_min, x_max, y_max, conf)。现在让我们加载一个输入图像。
![]()
加载图像
模型的权重是[1,3,704,704]。因此,您应该将输入图像调整大小以匹配此形状。在Google Colab或您的代码编辑器中,您可以上传您的输入图像,对于我们的情况,图像文件名为sample_image.jpg。
image = cv2.imread("sample_image.jpg")# N,C,H,W = 批处理大小, 通道数, 高度, 宽度.N, C, H, W = input_layer_ir.shape# 将图像调整大小以满足网络的预期输入尺寸.resized_image = cv2.resize(image, (W, H))# 重新整形为网络的输入形状.input_image = np.expand_dims(resized_image.transpose(2, 0, 1), 0)print("模型权重形状:")print(input_layer_ir.shape)print("调整大小后的图像:")print(input_image.shape)
![]()
显示输入图像。
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.axis("off")
![]()
推理引擎
之前,我们使用模型权重编译了模型。使用编译后的模型对输入图像进行推理。
# 创建推理请求.boxes = compiled_model([input_image])[output_layer_ir]# 删除置信度为零的框.boxes = boxes[~np.all(boxes == 0, axis=1)]
预测
编译后的模型返回带有边界框坐标的框。我们使用cv2模块创建矩形,并使用putText在检测到的文本上方添加置信度。
def detect_text(bgr_image, resized_image, boxes, threshold=0.3, conf_labels=True): # 获取图像形状以计算比例. (real_y, real_x), (resized_y, resized_x) = bgr_image.shape[:2], resized_image.shape[:2] ratio_x, ratio_y = real_x / resized_x, real_y / resized_y # 将图像从BGR格式转换为RGB格式. rgb_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB) # 遍历非零框. for box in boxes: # 从数组的最后一个位置选择一个置信度因子. conf = box[-1] if conf > threshold: (x_min, y_min, x_max, y_max) = [ int(max(corner_position * ratio_y, 10)) if idx % 2 else int(corner_position * ratio_x) for idx, corner_position in enumerate(box[:-1]) ] # 根据位置绘制框,rectangle函数的参数是: # 图像, 起始点, 结束点, 颜色, 厚度. rgb_image = cv2.rectangle(rgb_image, (x_min, y_min), (x_max, y_max),(0,255, 0), 10) # 根据位置和置信度将文本添加到图像中. if conf_labels: rgb_image = cv2.putText( rgb_image, f"{conf:.2f}", (x_min, y_min - 10), cv2.FONT_HERSHEY_SIMPLEX, 4, (255, 0, 0), 8, cv2.LINE_AA, ) return rgb_image
显示输出图像
plt.imshow(detect_text(image, resized_image, boxes));plt.axis("off")
![]()
结论
总之,我们成功地使用OpenVINO Toolkit构建了一个图像中的文本检测项目。Intel团队不断改进该工具包。OpenVINO还支持预训练的生成式AI模型,例如稳定扩散、ControlNet、语音识别等等。
要点
- OpenVINO是一款改变游戏规则的开源工具,可增强您的AI深度学习模型,并在本地、设备上部署应用程序或部署在云中。
- OpenVINO的主要目标是通过各种模型量化和压缩优化深度模型,可以显著减小深度学习模型的大小而不会损失推理准确性。
- 该工具包还支持在GPU、FPGA、ASIC、TPU等硬件加速器上部署AI应用程序。
- 各个行业可以采用OpenVINO,并利用其潜力对边缘AI产生影响。
- 利用模型库预训练模型非常简单,我们仅使用几行代码就实现了图像中的文本检测。
常见问题
本文中显示的媒体不归Analytics Vidhya所有,非作者自行决定使用。