我已经将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]
但是,我从错误消息中得知,推理机由于一些未知的原因而期望(1,3,180,180)。这就是问题所在吗?另一种怀疑是原始模型被冻结的方式有问题。我正在探索冻结原始模型( case模型转换为pb)的不同方法,以防问题与此相关。
我检查了一下,以确保Sigmoid激活函数正在OpenVino实现中使用(与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])
其结果是:
{'StatefulPartitionedCall/model/dense/Sigmoid': array([[0.9962392]], dtype=float32)}
[[0.9962392]]
0
0.9962392
发布于 2022-01-04 21:40:16
一般来说,Tensorflow是唯一具有NHWC形状的网络,而其他大多数使用NCHW。因此,OpenVINO推理机能够满足大多数网络的需要,并使用NCHW布局。为了与推理机一起工作,必须将模型转换为NCHW布局。
将本机模型格式转换为IR涉及到模型优化器执行必要的转换以将形状转换为推理机(N、C、H、W)所要求的布局的过程。使用
此外,大多数TensorFlow模型都是按照RGB顺序对图像进行训练的。在这种情况下,使用推理机样本的推理结果可能是不正确的。默认情况下,推理机样本和演示程序期望输入具有BGR通道顺序。如果您培训您的模型使用RGB订单,则需要手动重新安排示例或演示应用程序中的默认通道顺序,或者使用使用通道参数的模型优化工具重新转换您的模型。
我建议您通过使用Hello分类Python示例推断您的模型来验证这一点,因为这是用于测试模型功能的正式示例之一。
您可以参考这个"用于深层神经网络的Intel数学内核库“来更深入地解释输入形状。
https://stackoverflow.com/questions/70546922
复制相似问题