yolox 转换 openvino
yolox 0.1.0
原始图片预处理
mean = (0.485, 0.456, 0.406)
std = (0.229, 0.224, 0.225)
image, ratio = preprocess(origin_img, (h, w), mean, std)
def preprocess(image, input_size, mean, std, swap=(2, 0, 1)):
...
...
image = image[:, :, ::-1]
image /= 255.0
if mean is not None:
image -= mean
if std is not None:
image /= std
image = image.transpose(swap)
image = np.ascontiguousarray(image, dtype=np.float32)
return image, r
原始流程
Openvino 流程
When to Specify Mean and Scale Values
通常神经网络模型是用归一化的输入数据训练的。这意味着输入数据值被转换为特定范围内,例如,[0, 1] 或 [-1, 1]。有时,作为预处理的一部分,从输入数据值中减去平均值(平均图像)。输入数据预处理的实现方式有两种。
输入预处理操作是拓扑的一部分。在这种情况下,使用框架推断拓扑的应用程序不会预处理输入。
输入预处理操作不是拓扑的一部分,预处理是在为模型提供输入数据的应用程序中执行的。
在第一种情况下,模型优化器生成具有所需预处理层的 IR,推理引擎样本可用于推断模型。
在第二种情况下,应向模型优化器提供有关均值/尺度值的信息,以将其嵌入到生成的 IR 中。
模型优化器提供了许多命令行参数来指定它们:
--scale
、--scale_values
、--mean_values、--mean_file
。如果同时指定了均值和比例值,则先减去均值,然后应用比例。输入值除以比例值。
没有确定特定模型的均值/尺度值的通用方法。 以下步骤可以帮助确定它们:
阅读模型文档。 如果需要预处理,文档通常会描述均值/比例值。
打开执行模型的示例脚本/应用程序并跟踪如何读取输入数据并将其传递给框架。
在可视化工具中打开模型并检查对输入数据执行减法或乘法(如 Sub、Mul、ScaleShift、Eltwise 等)的层。 如果存在这样的层,预处理可能是模型的一部分。
When to Specify Input Shapes
在某些情况下,模型的输入数据形状不固定,例如全卷积神经网络。
在这种情况下,TensorFlow* 模型在占位符操作的形状属性中包含
-1
值。 推理引擎不支持未定义大小的输入层,因此如果模型中未定义输入形状,模型优化器将无法转换模型。解决方案是使用
--input
或--input_shape
命令行参数为模型的所有输入提供输入形状,或者如果模型仅包含一个,则使用-b
命令行参数提供批量大小 仅具有未定义批次大小的输入。 在后一种情况下,TensorFlow* 模型的占位符形状如下所示[-1, 224, 224, 3]
。
When to Reverse Input Channels
应用程序的输入数据可以是
RGB
或BRG
颜色输入顺序。例如,
openvino
以BGR
通道顺序加载输入图像。 但是,模型可能会在以相反顺序加载的图像上进行训练(例如,大多数 TensorFlow* 模型都使用RGB
顺序的图像进行训练)。 在这种情况下,使用推理引擎示例的推理结果可能不正确。 解决方案是提供--reverse_input_channels
命令行参数。 使用此参数,模型优化器执行第一次卷积或其他依赖于通道的操作权重修改,使这些操作的输出和图像传递的RGB
通道顺序一样。
When to Specify
--static_shape
Command Line Parameter如果指定了
--static_shape
命令行参数,模型优化器将评估模型中所有操作的形状(形状传播),以获得固定的输入形状。在形状传播过程中,模型优化器评估操作的形状并将它们从计算图中移除。有了这种方法,可以将不同形状的输入的初始模型转换为只用一个固定形状的输入的IR
文件。例如,考虑当一些blob
从4D
的形状[N, C, H, W]
被重塑为形状[N, C, H * W]
的情况。在模型转换过程中,模型优化将输出形状计算为具有[N, C, H * W]
值的恒定1D blob
。因此,如果输入形状改变为其他值[ n,c,H1,W1]
(这对一个完全卷积模型来说是可能的情况),那么重塑层将变得无效。由此产生的中间表征在推理引擎的帮助下将无法调整大小。
转换
mo.py --input_model yolox_nano_320x320-sim.onnx --data_type FP16 --reverse_input_channels --scale_values "[58.395, 57.12 , 57.375]" --mean_values "[123.675, 116.28 , 103.53]"
$MYRIAD_COMPILE -m yolox_nano_320x320-sim.xml -ip U8 -VPU_NUMBER_OF_SHAVES 6 -VPU_NUMBER_OF_CMX_SLICES 6 -o yolox_nano_320x320-sim_openvino_2021.4_6shave.blob
yolox 0.1.1pre & 0.2.0
转换
mo.py --input_model yolox_nano_320x320-sim.onnx --data_type FP16 --reverse_input_channels
$MYRIAD_COMPILE -m yolox_nano_320x320-sim.xml -ip U8 -VPU_NUMBER_OF_SHAVES 6 -VPU_NUMBER_OF_CMX_SLICES 6 -o yolox_nano_320x320-sim_openvino_2021.4_6shave.blob