一、简介
上一节中我们对数据处理部分的图像数据进行了大量的介绍,在SNPE中可以对其进行很多种的操作,接下来我们将继续对SNPE的数据处理进行深入的探讨
二、SNPE数据及预处理
输入图像:
除了转换模型外,SNPE还要求输入图像的格式可能与源框架不同。在Caffe中,图像显示为形状的张量(批处理x通道x高度x宽度),其中宽度是变化最快的尺寸,其次是高度,然后是颜色通道。这意味着第一个颜色通道的所有像素值在内存中是连续的,随后是下一个颜色通道的所有像素值,依此类推。 Caffe在训练过程中使用convert_imageset工具以这种格式准备图像。
在SNPE中,图像必须以形状的张量表示(批处理x高x宽x通道),其中通道是变化最快的尺寸。这意味着单个像素的所有颜色通道的值在内存中是连续的,接着是下一个像素的所有颜色值,依此类推。
如果批次尺寸大于1,则必须将每个批次的各个图像手动手动合并到一个文件中。
有关两个输入图像存储器布局的直观表示,请参见下图,推理过程中使用的通道顺序必须与训练过程中使用的通道顺序相同。 例如,在Caffe中训练的Imagenet模型需要BGR的频道顺序。
Imagenet模型的输入图像
Caffe中的Imagenet模型(例如bvlc_alexnet,bvlc_googlenet等)使用BGR图像(蓝色像素在绿色像素之前在红色像素之前)进行训练。 必须以相同的通道顺序为推理引擎提供像素值。
下图显示了Caffe和SNPE对于bvlc_alexnet模型所需的两种不同的输入图像内存布局。 输入图像尺寸为227x227。
MNIST模型的输入图像
Caffe中的MNIST模型(例如lenet)需要大小为28x28的单通道灰度图像。 请注意,虽然只有一个通道,但在Caffe(1x1x28x28)和SNPE(1x28x28x1)中仍需要4维输入张量。
均值减法
一些Caffe模型(例如bvlc_alexnet)是使用图像训练的,其中从每个输入图像中减去了平均图像。 该平均图像是训练集中所有图像的平均值。 Caffe在训练过程中通过convert_imageset工具生成此平均图像。
对于SNPE,如果您使用的网络经过了均值减法训练后的图像,则在将图像数据写入输入层之前必须手动减去均值图像。如果没有使用均值减法训练您的网络,则无需执行此步骤。
SNPE还可以自动执行均值减法,作为图像预处理的一部分。SNPE SDK在$ SNPE_ROOT / models / alexnet / scripts / create_alexnet_raws.py中包含一个脚本,该脚本可将jpg转换为原始格式,包括AlexNet的均值减法。 SNPE设置章节中的脚本对SDK中提供的示例图像执行此转换。
输出量
在Caffe和SNPE之间,示例的输出保持不变:对于批次中的每个图像,一维张量包含每个类的概率。对于Imagenet模型(例如bvlc_alexnet),这是1000个Imagenet类的大小为1000的张量。如果模型的批次尺寸大于1,则各个输出张量将沿着批次尺寸连接在一起。
多个预处理操作示例
图像预处理操作可以按上述顺序链接。
以下prototxt和转换器选项描述了按顺序进行以下预处理操作的网络:
1、尺寸为800x600的NV21图像被转换为尺寸为800x600的BGR图像
2、800x600 BGR图像按比例缩小为227x227 BGR图像
3、从227x227 BGR图片中减去恒定频道值。 从蓝色通道中减去104,从绿色通道中减去117,从红色通道中减去123。
三、总结
本篇文章中,我们对SNPE输入数据及预处理进行了简单的了解,下面我也将继续对SNPE的相关模块内容进行介绍。