Nom*_*ems 6 machine-learning computer-vision keras tensorflow openvino
我已经转换了 Keras 模型以与 OpenVino 一起使用。最初的 Keras 模型使用 sigmoid 返回 0 到 1 范围内的分数进行二元分类。将模型转换为与 OpenVino 一起使用后,两个类别的分数均接近 0.99,但其中一个类别的分数似乎略低。
例如,test1.jpg 和 test2.jpg(来自相反的类别)分别产生 0.00320357 和 0.9999 的分数。
使用 OpenVino,相同的图像分别产生 0.9998982 和 0.9962392 的分数。
编辑* 一种怀疑是输入数组仍然被 OpenVino 模型接受,但在形状上发生了某种改变或“扰乱”,因此永远不会匹配第一类?换句话说,如果你给它输入随机噪声,分数也将始终为 0.9999。也许我必须以某种方式让 OpenVino 模型接受原始形状 (1,180,180,3) 而不是 (1,3,180,180),这样我就不必强制输入与原始模型接受的形状不同?但这很奇怪,因为我在为 openvino 制作 xml 和 bin 时指定了形状:
python3 /opt/intel/openvino_2021/deployment_tools/model_optimizer/mo_tf.py --saved_model_dir /Users/.../Desktop/.../model13 --output_dir /Users/.../Desktop/... --input_shape=\[1,180,180,3]
Run Code Online (Sandbox Code Playgroud)
但是,我从错误消息中得知,推理引擎出于某种未知原因正在期待 (1,3,180,180)。这可能是问题所在吗?另一个怀疑是原始模型的冻结方式有问题。我正在探索不同的方法来冻结原始模型(keras 模型转换为 pb),以防问题与此相关。
我检查以确保 OpenVino 实现中使用了 Sigmoid 激活函数(与 Keras 模型相同的激活),看起来确实如此。那么,为什么这些值不一样呢?任何帮助将非常感激。
OpenVino推理的代码是:
import openvino
from openvino.inference_engine import IECore, IENetwork
from skimage import io
import sys
import numpy as np
import os
def loadNetwork(model_xml, model_bin):
ie = IECore()
network = ie.read_network(model=model_xml, weights=model_bin)
input_placeholder_key = list(network.input_info)[0]
input_placeholder = network.input_info[input_placeholder_key]
output_placeholder_key = list(network.outputs)[0]
output_placeholder = network.outputs[output_placeholder_key]
return network, input_placeholder_key, output_placeholder_key
batch_size = 1
channels = 3
IMG_HEIGHT = 180
IMG_WIDTH = 180
#loadNetwork('saved_model.xml','saved_model.bin')
image_path = 'test.jpg'
def load_source(path_to_image):
image = io.imread(path_to_image)
img = np.resize(image,(180,180))
return img
img_new = load_source('test2.jpg')
#Batch?
def classify(image):
device = 'CPU'
network, input_placeholder_key, output_placeholder_key = loadNetwork('saved_model.xml','saved_model.bin')
ie = IECore()
exec_net = ie.load_network(network=network, device_name=device)
res = exec_net.infer(inputs={input_placeholder_key: image})
print(res)
res = res[output_placeholder_key]
return res
result = classify(img_new)
print(result)
result = result[0]
top_result = np.argmax(result)
print(top_result)
print(result[top_result])
Run Code Online (Sandbox Code Playgroud)
结果:
{'StatefulPartitionedCall/model/dense/Sigmoid': array([[0.9962392]], dtype=float32)}
[[0.9962392]]
0
0.9962392
Run Code Online (Sandbox Code Playgroud)
一般来说,Tensorflow 是唯一具有 NHWC 形状的网络,而大多数其他网络则使用 NCHW。因此,OpenVINO推理引擎满足大多数网络并采用NCHW布局。模型必须转换为 NCHW 布局才能与推理引擎配合使用。
将本机模型格式转换为 IR 涉及模型优化器执行必要的转换以将形状转换为推理引擎所需的布局 (N、C、H、W) 的过程。使用 --input_shape 参数和模型的正确输入形状就足够了。
此外,大多数 TensorFlow 模型都是使用 RGB 顺序的图像进行训练的。在这种情况下,使用推理引擎示例的推理结果可能不正确。默认情况下,推理引擎示例和演示期望输入具有 BGR 通道顺序。如果您训练模型使用 RGB 顺序,则需要在示例或演示应用程序中手动重新排列默认通道顺序,或者使用带有--reverse_input_channels 参数的模型优化器工具重新转换模型。
我建议您通过使用Hello Classification Python 示例推断您的模型来验证这一点,因为这是为测试模型功能而提供的官方示例之一。
您可以参考“ Intel Math Kernel Library for Deep Neural Network ”以获取有关输入形状的更深入解释。
| 归档时间: |
|
| 查看次数: |
546 次 |
| 最近记录: |