blob: 608a9c3480823f71350cf5bfbc4055c9f328872b [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "Serializer.hpp"
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00007
8#include "SerializerUtils.hpp"
9
Mike Kelly8c1701a2019-02-11 17:01:27 +000010#include <armnn/ArmNN.hpp>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000011
Mike Kelly8c1701a2019-02-11 17:01:27 +000012#include <iostream>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000013
Derek Lamberti859f9ce2019-12-10 22:05:21 +000014#include <boost/core/ignore_unused.hpp>
Aron Virginas-Tard4f0fea2019-04-09 14:08:06 +010015#include <boost/numeric/conversion/cast.hpp>
16
Mike Kelly8c1701a2019-02-11 17:01:27 +000017#include <flatbuffers/util.h>
18
19using namespace armnn;
20namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000021namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000022
23namespace armnnSerializer
24{
25
Mike Kellyaf484012019-02-20 16:53:11 +000026serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
27{
28 switch (function)
29 {
30 case armnn::ActivationFunction::Sigmoid:
31 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
32 case armnn::ActivationFunction::TanH:
33 return serializer::ActivationFunction::ActivationFunction_TanH;
34 case armnn::ActivationFunction::Linear:
35 return serializer::ActivationFunction::ActivationFunction_Linear;
36 case armnn::ActivationFunction::ReLu:
37 return serializer::ActivationFunction::ActivationFunction_ReLu;
38 case armnn::ActivationFunction::BoundedReLu:
39 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
40 case armnn::ActivationFunction::LeakyReLu:
41 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
42 case armnn::ActivationFunction::Abs:
43 return serializer::ActivationFunction::ActivationFunction_Abs;
44 case armnn::ActivationFunction::Sqrt:
45 return serializer::ActivationFunction::ActivationFunction_Sqrt;
46 case armnn::ActivationFunction::Square:
47 return serializer::ActivationFunction::ActivationFunction_Square;
48 default:
49 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
50 }
51}
52
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010053serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
54{
55 switch (function)
56 {
57 case armnn::ArgMinMaxFunction::Max:
58 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
59 case armnn::ArgMinMaxFunction::Min:
60 default:
61 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
62 }
63}
64
janeil013fec1ea2019-11-07 09:47:20 +000065uint32_t SerializerVisitor::GetSerializedId(armnn::LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000066{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000067 if (m_guidMap.empty())
68 {
janeil013fec1ea2019-11-07 09:47:20 +000069 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000070 }
71 else if (m_guidMap.find(guid) == m_guidMap.end())
72 {
janeil013fec1ea2019-11-07 09:47:20 +000073 ++m_layerId;
74 m_guidMap.insert(std::make_pair(guid, m_layerId));
75
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000076 return m_layerId;
77 }
Saoirse Stewart30211042019-02-18 17:19:16 +000078 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000079}
80
Mike Kelly8c1701a2019-02-11 17:01:27 +000081// Build FlatBuffer for Input Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000082void SerializerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000083{
Derek Lamberti859f9ce2019-12-10 22:05:21 +000084 boost::ignore_unused(name);
85
Mike Kelly8c1701a2019-02-11 17:01:27 +000086 // Create FlatBuffer BaseLayer
87 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
88
89 // Create FlatBuffer BindableBaseLayer
90 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
91 flatBufferInputBaseLayer,
92 id);
janeil013fec1ea2019-11-07 09:47:20 +000093 // Push layer index to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000094 m_inputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +000095
96 // Create the FlatBuffer InputLayer
97 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
98
99 // Add the AnyLayer to the FlatBufferLayers
100 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
101}
102
103// Build FlatBuffer for Output Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000104void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000105{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000106 boost::ignore_unused(name);
107
Mike Kelly8c1701a2019-02-11 17:01:27 +0000108 // Create FlatBuffer BaseLayer
109 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
110
111 // Create FlatBuffer BindableBaseLayer
112 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
113 flatBufferOutputBaseLayer,
114 id);
janeil013fec1ea2019-11-07 09:47:20 +0000115 // Push layer index to outputIds.
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000116 m_outputIds.push_back(GetSerializedId(layer->GetGuid()));
Mike Kelly8c1701a2019-02-11 17:01:27 +0000117
118 // Create the FlatBuffer OutputLayer
119 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
120 // Add the AnyLayer to the FlatBufferLayers
121 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
122}
123
Kevin May868eb142019-09-04 17:29:31 +0100124void SerializerVisitor::VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
125{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000126 boost::ignore_unused(name);
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100127 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
128 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
129
130 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100131}
132
Mike Kellyaf484012019-02-20 16:53:11 +0000133// Build FlatBuffer for Activation Layer
134void SerializerVisitor::VisitActivationLayer(const armnn::IConnectableLayer* layer,
135 const armnn::ActivationDescriptor& descriptor,
136 const char* name)
137{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000138 boost::ignore_unused(name);
139
Mike Kellyaf484012019-02-20 16:53:11 +0000140 // Create FlatBuffer BaseLayer
141 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
142
143 // Create the FlatBuffer ActivationDescriptor
144 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
145 GetFlatBufferActivationFunction(descriptor.m_Function),
146 descriptor.m_A,
147 descriptor.m_B);
148
149 // Create the FlatBuffer ActivationLayer
150 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
151 flatBufferBaseLayer,
152 flatBufferDescriptor);
153
154 // Add the AnyLayer to the FlatBufferLayers
155 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
156}
157
Mike Kelly8c1701a2019-02-11 17:01:27 +0000158// Build FlatBuffer for Addition Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000159void SerializerVisitor::VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000160{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000161 boost::ignore_unused(name);
162
Mike Kelly8c1701a2019-02-11 17:01:27 +0000163 // Create FlatBuffer BaseLayer
164 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
165
166 // Create the FlatBuffer AdditionLayer
167 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
168
169 // Add the AnyLayer to the FlatBufferLayers
170 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
171}
172
Nikhil Rajee391d52019-09-05 17:50:44 +0100173// Build FlatBuffer for ArgMinMax Layer
174void SerializerVisitor::VisitArgMinMaxLayer(const armnn::IConnectableLayer *layer,
175 const armnn::ArgMinMaxDescriptor& descriptor,
176 const char *name)
177{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000178 boost::ignore_unused(name);
179
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100180 // Create FlatBuffer BaseLayer
181 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
182
183 // Create FlatBuffer Descriptor
184 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
185 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
186 descriptor.m_Axis);
187
188 // Create FlatBuffer ArgMinMaxLayer
189 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
190 flatBufferBaseLayer,
191 flatBufferDescriptor);
192
193 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100194}
195
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000196// Build FlatBuffer for BatchToSpaceNd Layer
197void SerializerVisitor::VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
198 const armnn::BatchToSpaceNdDescriptor& descriptor,
199 const char* name)
200{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000201 boost::ignore_unused(name);
202
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000203 // Create FlatBuffer BaseLayer
204 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
205
206 std::vector<unsigned int> crops;
207 crops.reserve(descriptor.m_Crops.size() * 2);
208 for (auto& crop : descriptor.m_Crops)
209 {
210 crops.push_back(crop.first);
211 crops.push_back(crop.second);
212 }
213
214 auto flatBufferDescriptor =
215 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
216 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
217 m_flatBufferBuilder.CreateVector(crops),
218 GetFlatBufferDataLayout(descriptor.m_DataLayout));
219
220 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
221 flatBufferBaseLayer,
222 flatBufferDescriptor);
223
224 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
225}
226
ruoyan018e7fa232019-02-28 15:09:07 +0000227void SerializerVisitor::VisitBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
228 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
229 const armnn::ConstTensor& mean,
230 const armnn::ConstTensor& variance,
231 const armnn::ConstTensor& beta,
232 const armnn::ConstTensor& gamma,
233 const char* name)
234{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000235 boost::ignore_unused(name);
236
ruoyan018e7fa232019-02-28 15:09:07 +0000237 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
238 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
239 m_flatBufferBuilder,
240 batchNormDescriptor.m_Eps,
241 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
242
243 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
244 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
245 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
246 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
247 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
248 fbBatchNormalizationBaseLayer,
249 fbBatchNormalizationDescriptor,
250 fbMeanConstTensorInfo,
251 fbVarianceConstTensorInfo,
252 fbBetaConstTensorInfo,
253 fbGammaConstTensorInfo);
254
255 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
256}
257
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100258void SerializerVisitor::VisitComparisonLayer(const armnn::IConnectableLayer* layer,
259 const armnn::ComparisonDescriptor& descriptor,
260 const char* name)
261{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000262 boost::ignore_unused(name);
263
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100264 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
265 auto fbDescriptor = serializer::CreateComparisonDescriptor(
266 m_flatBufferBuilder,
267 GetFlatBufferComparisonOperation(descriptor.m_Operation));
268
269 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
270 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100271}
272
Conor Kennedy76277882019-02-26 08:29:54 +0000273// Build FlatBuffer for Constant Layer
274void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
275 const armnn::ConstTensor& input,
276 const char* name)
277{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000278 boost::ignore_unused(name);
279
Conor Kennedy76277882019-02-26 08:29:54 +0000280 // Create FlatBuffer BaseLayer
281 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
282
283 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
284
285 // Create the FlatBuffer ConstantLayer
286 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
287 flatBufferConstantBaseLayer,
288 flatBufferConstTensorInfo);
289
290 // Add the AnyLayer to the FlatBufferLayers
291 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
292}
293
Mike Kellya0766c32019-02-19 17:22:07 +0000294// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000295void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
296 const armnn::Convolution2dDescriptor& descriptor,
297 const armnn::ConstTensor& weights,
298 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000299 const char* name)
300{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000301 boost::ignore_unused(name);
302
Mike Kellya0766c32019-02-19 17:22:07 +0000303 // Create FlatBuffer BaseLayer
304 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
305
306 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
307 descriptor.m_PadLeft,
308 descriptor.m_PadRight,
309 descriptor.m_PadTop,
310 descriptor.m_PadBottom,
311 descriptor.m_StrideX,
312 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100313 descriptor.m_DilationX,
314 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000315 descriptor.m_BiasEnabled,
316 GetFlatBufferDataLayout(descriptor.m_DataLayout));
317 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
318 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
319
320 if (biases.has_value())
321 {
322 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
323 }
324
325 // Create the FlatBuffer Convolution2dLayer
326 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
327 flatBufferBaseLayer,
328 flatBufferDescriptor,
329 flatBufferWeightsConstTensorInfo,
330 flatBufferBiasesConstTensorInfo);
331
332 // Add the AnyLayer to the FlatBufferLayers
333 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
334}
335
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100336void SerializerVisitor::VisitDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
337 const armnn::DepthToSpaceDescriptor& descriptor,
338 const char* name)
339{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000340 boost::ignore_unused(name);
341
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100342 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
343 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
344 descriptor.m_BlockSize,
345 GetFlatBufferDataLayout(descriptor.m_DataLayout));
346
347 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
348
349 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100350}
351
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000352void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
353 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
354 const armnn::ConstTensor& weights,
355 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000356 const char* name)
357{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000358 boost::ignore_unused(name);
359
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000360 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
361 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
362 descriptor.m_PadLeft,
363 descriptor.m_PadRight,
364 descriptor.m_PadTop,
365 descriptor.m_PadBottom,
366 descriptor.m_StrideX,
367 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100368 descriptor.m_DilationX,
369 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000370 descriptor.m_BiasEnabled,
371 GetFlatBufferDataLayout(descriptor.m_DataLayout));
372
373 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
374 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
375 if (biases.has_value())
376 {
377 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
378 }
379
380 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
381 fbBaseLayer,
382 fbDescriptor,
383 fbWeightsConstTensorInfo,
384 fbBiasesConstTensorInfo);
385
386 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
387}
388
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000389void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
390 const char* name)
391{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000392 boost::ignore_unused(name);
393
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000394 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
395 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
396
397 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
398}
399
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000400void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
401 const armnn::DetectionPostProcessDescriptor& descriptor,
402 const armnn::ConstTensor& anchors,
403 const char* name)
404{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000405 boost::ignore_unused(name);
406
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000407 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
408 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
409 descriptor.m_MaxDetections,
410 descriptor.m_MaxClassesPerDetection,
411 descriptor.m_DetectionsPerClass,
412 descriptor.m_NmsScoreThreshold,
413 descriptor.m_NmsIouThreshold,
414 descriptor.m_NumClasses,
415 descriptor.m_UseRegularNms,
416 descriptor.m_ScaleX,
417 descriptor.m_ScaleY,
418 descriptor.m_ScaleW,
419 descriptor.m_ScaleH);
420
421 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
422
423 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
424 fbBaseLayer,
425 fbDescriptor,
426 fbAnchorsConstTensorInfo);
427
428 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
429}
430
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000431void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
432{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000433 boost::ignore_unused(name);
434
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000435 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
436 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000437
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000438 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
439}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000440
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000441void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
442{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000443 boost::ignore_unused(name);
444
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000445 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
446 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
447
448 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
449}
450
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000451void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
452{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000453 boost::ignore_unused(name);
454
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000455 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
456 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
457
458 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
459}
460
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000461void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
462{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000463 boost::ignore_unused(name);
464
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000465 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
466 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000467
468 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
469}
470
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000471void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
472{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000473 boost::ignore_unused(name);
474
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000475 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000476 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000477
478 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
479}
480
Kevin Mayce5045a2019-10-02 14:07:47 +0100481void SerializerVisitor::VisitInstanceNormalizationLayer(
482 const armnn::IConnectableLayer* layer,
483 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
484 const char* name)
485{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000486 boost::ignore_unused(name);
487
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100488 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
489 m_flatBufferBuilder,
490 instanceNormalizationDescriptor.m_Gamma,
491 instanceNormalizationDescriptor.m_Beta,
492 instanceNormalizationDescriptor.m_Eps,
493 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
494
495 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
496 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
497
498 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100499}
500
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000501void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
502 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
503 const char* name)
504{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000505 boost::ignore_unused(name);
506
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000507 // Create FlatBuffer BaseLayer
508 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
509
510 // Create the FlatBuffer L2Normalization Descriptor
511 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100512 m_flatBufferBuilder,
513 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
514 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000515
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100516 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000517 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
518
519 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
520}
521
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100522void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
523 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
524 const char* name)
525{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000526 boost::ignore_unused(name);
527
Sadik Armagan26257852019-10-14 13:00:47 +0100528 // Create FlatBuffer BaseLayer
529 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
530
531 // Create the FlatBuffer LogSoftmaxDescriptor
532 auto flatBufferLogSoftmaxDesc =
533 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
534 logSoftmaxDescriptor.m_Beta,
535 logSoftmaxDescriptor.m_Axis);
536
537 // Create the FlatBuffer LogSoftmaxLayer
538 auto flatBufferLogSoftmaxLayer =
539 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
540 flatBufferLogSoftmaxBaseLayer,
541 flatBufferLogSoftmaxDesc);
542
543 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100544}
545
546void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
547 const armnn::LstmDescriptor& descriptor,
548 const armnn::LstmInputParams& params,
549 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000550{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000551 boost::ignore_unused(name);
552
Jim Flynn11af3752019-03-19 17:22:29 +0000553 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
554
555 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
556 m_flatBufferBuilder,
557 descriptor.m_ActivationFunc,
558 descriptor.m_ClippingThresCell,
559 descriptor.m_ClippingThresProj,
560 descriptor.m_CifgEnabled,
561 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100562 descriptor.m_ProjectionEnabled,
563 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000564
565 // Get mandatory input parameters
566 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
567 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
568 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
569 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
570 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
571 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
572 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
573 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
574 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
575
576 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
577 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
578 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
579 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
580 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
581 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
582 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
583 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
584 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100585 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
586 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
587 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
588 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000589
590 if (!descriptor.m_CifgEnabled)
591 {
592 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
593 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
594 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
595 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
596 }
597
598 if (descriptor.m_ProjectionEnabled)
599 {
600 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
601 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
602 }
603
604 if (descriptor.m_PeepholeEnabled)
605 {
606 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
607 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
608 }
609
Jan Eilersf8c62972019-07-17 11:07:49 +0100610 if (descriptor.m_LayerNormEnabled)
611 {
612 if (!descriptor.m_CifgEnabled)
613 {
614 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
615 }
616 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
617 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
618 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
619 }
620
Jim Flynn11af3752019-03-19 17:22:29 +0000621 auto fbLstmParams = serializer::CreateLstmInputParams(
622 m_flatBufferBuilder,
623 inputToForgetWeights,
624 inputToCellWeights,
625 inputToOutputWeights,
626 recurrentToForgetWeights,
627 recurrentToCellWeights,
628 recurrentToOutputWeights,
629 forgetGateBias,
630 cellBias,
631 outputGateBias,
632 inputToInputWeights,
633 recurrentToInputWeights,
634 cellToInputWeights,
635 inputGateBias,
636 projectionWeights,
637 projectionBias,
638 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100639 cellToOutputWeights,
640 inputLayerNormWeights,
641 forgetLayerNormWeights,
642 cellLayerNormWeights,
643 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000644
645 auto fbLstmLayer = serializer::CreateLstmLayer(
646 m_flatBufferBuilder,
647 fbLstmBaseLayer,
648 fbLstmDescriptor,
649 fbLstmParams);
650
651 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
652}
653
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000654void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
655{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000656 boost::ignore_unused(name);
657
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000658 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
659 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
660
661 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
662}
663
664void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
665 const armnn::MeanDescriptor& descriptor,
666 const char* name)
667{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000668 boost::ignore_unused(name);
669
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000670 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
671 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
672 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
673 descriptor.m_KeepDims);
674
675 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
676 fbMeanBaseLayer,
677 fbMeanDescriptor);
678
679 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
680}
681
682void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
683{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000684 boost::ignore_unused(name);
685
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000686 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
687 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
688
689 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
690}
691
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100692void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
693{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000694 boost::ignore_unused(name);
695
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100696 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
697 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
698
699 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
700}
701
Jim Flynnac25a1b2019-02-28 10:40:49 +0000702void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100703 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000704 const char* name)
705{
Jim Flynne242f2d2019-05-22 14:24:13 +0100706 VisitConcatLayer(layer, mergerDescriptor, name);
707}
708
709void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
710 const armnn::ConcatDescriptor& concatDescriptor,
711 const char* name)
712{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000713 boost::ignore_unused(name);
714
Jim Flynne242f2d2019-05-22 14:24:13 +0100715 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000716
717 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100718 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000719 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100720 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000721 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100722 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000723 {
724 origins.push_back(origin[d]);
725 }
726 auto view = m_flatBufferBuilder.CreateVector(origins);
727 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
728 views.push_back(uintVector);
729 }
730
Jim Flynne242f2d2019-05-22 14:24:13 +0100731 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
732 concatDescriptor.GetConcatAxis(),
733 concatDescriptor.GetNumViews(),
734 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000735 m_flatBufferBuilder.CreateVector(views));
736
Jim Flynne242f2d2019-05-22 14:24:13 +0100737 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
738 flatBufferConcatBaseLayer,
739 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000740
Jim Flynne242f2d2019-05-22 14:24:13 +0100741 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000742}
743
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000744void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000745{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000746 boost::ignore_unused(name);
747
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000748 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
749 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
750 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000751
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000752 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000753}
754
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000755void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
756 const armnn::PadDescriptor& padDescriptor,
757 const char* name)
758{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000759 boost::ignore_unused(name);
760
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000761 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
762
763 std::vector<unsigned int> padList;
764 for (auto& p: padDescriptor.m_PadList)
765 {
766 padList.push_back(p.first);
767 padList.push_back(p.second);
768 }
769
770 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100771 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100772 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000773
774 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
775 flatBufferBaseLayer,
776 flatBufferPadDesc);
777
778 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
779}
780
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000781void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
782 const armnn::PermuteDescriptor& permuteDescriptor,
783 const char* name)
784{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000785 boost::ignore_unused(name);
786
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000787 // Create FlatBuffer BaseLayer
788 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
789
790 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100791 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000792 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100793 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000794 }
795
796 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
797 m_flatBufferBuilder.CreateVector(dimMappings));
798
799 // Create the FlatBuffer PermuteLayer
800 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
801 flatBufferPermuteBaseLayer,
802 flatBufferPermuteDesc);
803
804 // Add the AnyLayer to the FlatBufferLayers
805 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
806}
807
Saoirse Stewart263829c2019-02-19 15:54:14 +0000808// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000809void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000810 const armnn::ReshapeDescriptor& reshapeDescriptor,
811 const char* name)
812{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000813 boost::ignore_unused(name);
814
Saoirse Stewart263829c2019-02-19 15:54:14 +0000815 // Create FlatBuffer BaseLayer
816 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
817
818 std::vector<unsigned int> targetShape;
819 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
820 {
821 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
822 }
823
824 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
825 m_flatBufferBuilder.CreateVector(targetShape));
826
827 // Create the FlatBuffer ReshapeLayer
828 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
829 flatBufferReshapeDesc);
830
831 // Add the AnyLayer to the FlatBufferLayers
832 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
833}
834
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000835void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
836 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
837 const char* name)
838{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000839 boost::ignore_unused(name);
840
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000841 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
842
843 auto flatBufferDescriptor =
844 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
845 resizeDescriptor.m_TargetWidth,
846 resizeDescriptor.m_TargetHeight,
847 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
848
849 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
850 flatBufferBaseLayer,
851 flatBufferDescriptor);
852
853 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
854}
855
Teresa Charlina9075df2019-06-27 15:41:57 +0100856void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
857 const armnn::ResizeDescriptor& resizeDescriptor,
858 const char* name)
859{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000860 boost::ignore_unused(name);
861
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100862 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
863
864 auto flatBufferDescriptor =
865 CreateResizeDescriptor(m_flatBufferBuilder,
866 resizeDescriptor.m_TargetHeight,
867 resizeDescriptor.m_TargetWidth,
868 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
869 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
870
871 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
872 flatBufferBaseLayer,
873 flatBufferDescriptor);
874
875 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100876}
877
Sadik Armagan8b42a382019-03-01 14:24:49 +0000878void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
879{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000880 boost::ignore_unused(name);
881
Sadik Armagan8b42a382019-03-01 14:24:49 +0000882 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
883 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
884
885 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
886}
887
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100888void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
889 const armnn::SliceDescriptor& sliceDescriptor,
890 const char* name)
891{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000892 boost::ignore_unused(name);
893
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100894 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
895 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
896 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
897 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
898
899 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
900
901 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100902}
903
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000904// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000905void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
906 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000907 const char* name)
908{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000909 boost::ignore_unused(name);
910
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000911 // Create FlatBuffer BaseLayer
912 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
913
914 // Create the FlatBuffer SoftmaxDescriptor
915 auto flatBufferSoftmaxDesc =
916 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
917
918 // Create the FlatBuffer SoftmaxLayer
919 auto flatBufferSoftmaxLayer =
920 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
921 flatBufferSoftmaxBaseLayer,
922 flatBufferSoftmaxDesc);
923
924 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
925}
926
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000927void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
928 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000929 const char* name)
930{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000931 boost::ignore_unused(name);
932
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000933 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
934 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
935 m_flatBufferBuilder,
936 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
937 pooling2dDescriptor.m_PadLeft,
938 pooling2dDescriptor.m_PadRight,
939 pooling2dDescriptor.m_PadTop,
940 pooling2dDescriptor.m_PadBottom,
941 pooling2dDescriptor.m_PoolWidth,
942 pooling2dDescriptor.m_PoolHeight,
943 pooling2dDescriptor.m_StrideX,
944 pooling2dDescriptor.m_StrideY,
945 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
946 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
947 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
948
949 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
950 fbPooling2dBaseLayer,
951 fbPooling2dDescriptor);
952
953 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
954}
955
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100956void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
957 const char* name)
958{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000959 boost::ignore_unused(name);
960
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100961 // Create FlatBuffer BaseLayer
962 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
963
964 // Create the FlatBuffer AdditionLayer
965 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
966
967 // Add the AnyLayer to the FlatBufferLayers
968 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100969}
970
Derek Lamberti87acb272019-03-27 16:51:31 +0000971void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
972{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000973 boost::ignore_unused(name);
974
Derek Lamberti87acb272019-03-27 16:51:31 +0000975 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
976 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
977 fbQuantizeBaseLayer);
978 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
979}
980
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000981// Build FlatBuffer for FullyConnected Layer
982void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
983 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
984 const armnn::ConstTensor& weights,
985 const armnn::Optional<armnn::ConstTensor>& biases,
986 const char* name)
987{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000988 boost::ignore_unused(name);
989
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000990 // Create FlatBuffer BaseLayer
991 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
992
993 // Create FlatBuffer FullyConnectedDescriptor
994 auto flatBufferDescriptor =
995 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
996 fullyConnectedDescriptor.m_BiasEnabled,
997 fullyConnectedDescriptor.m_TransposeWeightMatrix);
998
999 // Create FlatBuffer weights data
1000 auto flatBufferWeights = CreateConstTensorInfo(weights);
1001
1002 // Create FlatBuffer bias data
1003 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
1004 if (fullyConnectedDescriptor.m_BiasEnabled)
1005 {
1006 flatBufferBiases = CreateConstTensorInfo(biases.value());
1007 }
1008
1009 // Create FlatBuffer FullyConnectedLayer
1010 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1011 flatBufferBaseLayer,
1012 flatBufferDescriptor,
1013 flatBufferWeights,
1014 flatBufferBiases);
1015
1016 // Add created FullyConnectedLayer to the FlatBufferLayers
1017 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1018}
1019
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001020// Build FlatBuffer for SpaceToBatchNd Layer
1021void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
1022 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1023 const char* name)
1024{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001025 boost::ignore_unused(name);
1026
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001027 // Create FlatBuffer BaseLayer
1028 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1029
1030 std::vector<unsigned int> padList;
1031 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1032 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1033 {
1034 padList.push_back(pad.first);
1035 padList.push_back(pad.second);
1036 }
1037
1038 auto flatBufferDescriptor =
1039 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1040 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1041 m_flatBufferBuilder.CreateVector(padList),
1042 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1043
1044 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1045 flatBufferBaseLayer,
1046 flatBufferDescriptor);
1047
1048 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1049}
1050
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001051// Build FlatBuffer for SpaceToDepthLayer
1052void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
1053 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1054 const char* name)
1055{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001056 boost::ignore_unused(name);
1057
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001058 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1059 auto flatBufferDescriptor =
1060 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1061 spaceToDepthDescriptor.m_BlockSize,
1062 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1063
1064 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1065 flatBufferBaseLayer,
1066 flatBufferDescriptor);
1067
1068 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001069}
1070
Jim Flynn18ce3382019-03-08 11:08:30 +00001071// Build FlatBuffer for Splitter Layer
1072void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
1073 const armnn::ViewsDescriptor& viewsDescriptor,
1074 const char* name)
1075{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001076 boost::ignore_unused(name);
1077
Jim Flynn18ce3382019-03-08 11:08:30 +00001078 // Create FlatBuffer ViewOrigins
1079 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1080 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1081
1082 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1083 {
1084 std::vector<uint32_t> viewOrigin;
1085 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1086
1087 // Copy vector
1088 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1089 {
1090 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1091 }
1092
1093 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1094 m_flatBufferBuilder.CreateVector(viewOrigin)));
1095 }
1096
1097 // Create FlatBuffer OriginsDescriptor
1098 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1099 viewsDescriptor.GetOrigins().GetConcatAxis(),
1100 viewsDescriptor.GetOrigins().GetNumViews(),
1101 viewsDescriptor.GetOrigins().GetNumDimensions(),
1102 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1103
1104 // Create FlatBuffer ViewOrigins
1105 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1106 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1107
1108 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1109 {
1110 std::vector<uint32_t> viewSize;
1111 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1112
1113 // Copy vector
1114 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1115 {
1116 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1117 }
1118
1119 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1120 m_flatBufferBuilder.CreateVector(viewSize)));
1121 }
1122
1123 // Create FlatBuffer ViewsDescriptor
1124 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1125 flatBufferOriginDescriptor,
1126 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1127
1128 // Create FlatBuffer BaseLayer
1129 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1130
1131 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1132 flatBufferBaseLayer,
1133 flatBufferViewsDescriptor);
1134
1135 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1136}
1137
Nina Drozd57728782019-02-27 10:53:27 +00001138void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1139 const armnn::NormalizationDescriptor& descriptor,
1140 const char* name)
1141{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001142 boost::ignore_unused(name);
1143
Nina Drozd57728782019-02-27 10:53:27 +00001144 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1145
1146 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1147 m_flatBufferBuilder,
1148 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1149 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1150 descriptor.m_NormSize,
1151 descriptor.m_Alpha,
1152 descriptor.m_Beta,
1153 descriptor.m_K,
1154 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1155
1156 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1157 fbNormalizationBaseLayer,
1158 fbNormalizationDescriptor);
1159
1160 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1161}
1162
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001163void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1164 const armnn::StackDescriptor& stackDescriptor,
1165 const char* name)
1166{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001167 boost::ignore_unused(name);
1168
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001169 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1170
1171 std::vector<unsigned int> inputShape;
1172 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1173 {
1174 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1175 }
1176
1177 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1178 stackDescriptor.m_Axis,
1179 stackDescriptor.m_NumInputs,
1180 m_flatBufferBuilder.CreateVector(inputShape));
1181
1182 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1183 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001184}
1185
Derek Lamberti013c3902019-10-21 10:46:16 +01001186void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1187 const armnn::StandInDescriptor& standInDescriptor,
1188 const char *name)
1189{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001190 boost::ignore_unused(name);
1191
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001192 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1193 standInDescriptor.m_NumInputs,
1194 standInDescriptor.m_NumOutputs);
1195
1196 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1197 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1198
1199 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001200}
1201
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001202void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1203 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1204 const char* name)
1205{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001206 boost::ignore_unused(name);
1207
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001208 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1209
1210 auto flatBufferDescriptor =
1211 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1212 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1213 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1214 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1215 stridedSliceDescriptor.m_BeginMask,
1216 stridedSliceDescriptor.m_EndMask,
1217 stridedSliceDescriptor.m_ShrinkAxisMask,
1218 stridedSliceDescriptor.m_EllipsisMask,
1219 stridedSliceDescriptor.m_NewAxisMask,
1220 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1221
1222 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1223 flatBufferBaseLayer,
1224 flatBufferDescriptor);
1225
1226 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1227}
1228
Conor Kennedyda1f9752019-03-01 14:37:12 +00001229void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1230{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001231 boost::ignore_unused(name);
1232
Conor Kennedyda1f9752019-03-01 14:37:12 +00001233 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1234 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1235
1236 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1237}
1238
Sadik Armaganeff363d2019-04-05 15:25:46 +01001239void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1240{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001241 boost::ignore_unused(name);
1242
Sadik Armaganeff363d2019-04-05 15:25:46 +01001243 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1244 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1245
1246 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1247}
1248
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001249void SerializerVisitor::VisitTransposeConvolution2dLayer(
1250 const armnn::IConnectableLayer* layer,
1251 const armnn::TransposeConvolution2dDescriptor& descriptor,
1252 const armnn::ConstTensor& weights,
1253 const armnn::Optional<armnn::ConstTensor>& biases,
1254 const char* name)
1255{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001256 boost::ignore_unused(name);
1257
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001258 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1259 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1260 descriptor.m_PadLeft,
1261 descriptor.m_PadRight,
1262 descriptor.m_PadTop,
1263 descriptor.m_PadBottom,
1264 descriptor.m_StrideX,
1265 descriptor.m_StrideY,
1266 descriptor.m_BiasEnabled,
1267 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1268
1269 // weights & biases
1270 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1271 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1272 if (biases.has_value())
1273 {
1274 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1275 }
1276
1277 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1278 fbBaseLayer,
1279 fbDescriptor,
1280 fbWeightsConstTensorInfo,
1281 fbBiasesConstTensorInfo);
1282
1283 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001284}
1285
James Conroyee18dc82019-07-17 11:27:46 +01001286void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1287 const armnn::QuantizedLstmInputParams& params,
1288 const char* name)
1289{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001290 boost::ignore_unused(name);
1291
Jan Eilers5b01a892019-07-23 09:47:43 +01001292 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1293
1294 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001295 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1296 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1297 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1298 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001299
Francis Murtaghbb590b42019-08-14 09:51:36 +01001300 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1301 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1302 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1303 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001304
Francis Murtaghbb590b42019-08-14 09:51:36 +01001305 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1306 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1307 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1308 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001309
1310 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1311 m_flatBufferBuilder,
1312 inputToInputWeights,
1313 inputToForgetWeights,
1314 inputToCellWeights,
1315 inputToOutputWeights,
1316 recurrentToInputWeights,
1317 recurrentToForgetWeights,
1318 recurrentToCellWeights,
1319 recurrentToOutputWeights,
1320 inputGateBias,
1321 forgetGateBias,
1322 cellBias,
1323 outputGateBias);
1324
1325 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1326 m_flatBufferBuilder,
1327 fbQuantizedLstmBaseLayer,
1328 fbQuantizedLstmParams);
1329
1330 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001331}
1332
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001333fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001334 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001335{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001336
Sadik Armagandb059fd2019-03-20 12:28:32 +00001337 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1338
Mike Kelly8c1701a2019-02-11 17:01:27 +00001339 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1340 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1341
1342 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001343 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001344 m_flatBufferBuilder.CreateString(layer->GetName()),
1345 layerType,
1346 m_flatBufferBuilder.CreateVector(inputSlots),
1347 m_flatBufferBuilder.CreateVector(outputSlots));
1348}
1349
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001350void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001351{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001352
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001353 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001354 m_serializedLayers.push_back(anyLayer);
1355}
1356
Mike Kellya0766c32019-02-19 17:22:07 +00001357template <typename T>
1358flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1359{
1360 const T* buffer = reinterpret_cast<const T*>(memory);
1361 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1362 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1363 return fbVector;
1364}
1365
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001366flatbuffers::Offset<serializer::ConstTensor>
1367 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001368{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001369 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001370
1371 // Get the dimensions
1372 std::vector<unsigned int> shape;
1373
1374 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1375 {
1376 shape.push_back(tensorInfo.GetShape()[dim]);
1377 }
1378
1379 // Create FlatBuffer TensorInfo
1380 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1381 m_flatBufferBuilder.CreateVector(shape),
1382 GetFlatBufferDataType(tensorInfo.GetDataType()),
1383 tensorInfo.GetQuantizationScale(),
1384 tensorInfo.GetQuantizationOffset());
1385 flatbuffers::Offset<void> fbPayload;
1386
1387 switch (tensorInfo.GetDataType())
1388 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001389 case armnn::DataType::Float32:
1390 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001391 {
1392 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1393 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1394 m_flatBufferBuilder,
1395 fbVector);
1396 fbPayload = flatBuffersData.o;
1397 break;
1398 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001399 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001400 {
1401 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1402 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1403 m_flatBufferBuilder,
1404 fbVector);
1405 fbPayload = flatBuffersData.o;
1406 break;
1407 }
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001408 case armnn::DataType::QuantisedSymm16:
1409 {
1410 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1411 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1412 m_flatBufferBuilder,
1413 fbVector);
1414 fbPayload = flatBuffersData.o;
1415 break;
1416 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001417 case armnn::DataType::QuantisedAsymm8:
1418 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001419 default:
1420 {
1421 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1422 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1423 m_flatBufferBuilder,
1424 fbVector);
1425 fbPayload = flatBuffersData.o;
1426 }
1427 }
1428 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1429 m_flatBufferBuilder,
1430 flatBufferTensorInfo,
1431 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1432 fbPayload);
1433 return flatBufferConstTensor;
1434}
1435
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001436std::vector<fb::Offset<serializer::InputSlot>>
1437 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001438{
Mike Kellya0766c32019-02-19 17:22:07 +00001439 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001440
1441 // Get the InputSlots
1442 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1443 {
1444 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1445
1446 // Get the Connection for the InputSlot
1447 const IOutputSlot* connection = inputSlot.GetConnection();
1448
1449 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001450 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1451 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001452 // Create FlatBuffer InputSlot
1453 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1454 }
1455 return inputSlots;
1456}
1457
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001458std::vector<fb::Offset<serializer::OutputSlot>>
1459 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001460{
1461 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1462
1463 // Get the OutputSlots
1464 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1465 {
1466 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001467 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001468
1469 // Get the dimensions
1470 std::vector<unsigned int> shape;
1471 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1472 {
1473 shape.push_back(tensorInfo.GetShape()[dim]);
1474 }
1475
1476 // Create FlatBuffer TensorInfo
1477 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1478 m_flatBufferBuilder.CreateVector(shape),
1479 GetFlatBufferDataType(tensorInfo.GetDataType()),
1480 tensorInfo.GetQuantizationScale(),
1481 tensorInfo.GetQuantizationOffset());
1482
1483 // Create FlatBuffer Outputslot
1484 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1485 slotIndex,
1486 flatBufferTensorInfo));
1487 }
1488 return outputSlots;
1489}
1490
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001491
1492ISerializer* ISerializer::CreateRaw()
1493{
1494 return new Serializer();
1495}
1496
1497ISerializerPtr ISerializer::Create()
1498{
1499 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1500}
1501
1502void ISerializer::Destroy(ISerializer* serializer)
1503{
1504 delete serializer;
1505}
1506
1507void Serializer::Serialize(const INetwork& inNetwork)
1508{
1509 // Iterate through to network
1510 inNetwork.Accept(m_SerializerVisitor);
1511 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1512
1513 // Create FlatBuffer SerializedGraph
1514 auto serializedGraph = serializer::CreateSerializedGraph(
1515 fbBuilder,
1516 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1517 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
1518 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()));
1519
1520 // Serialize the graph
1521 fbBuilder.Finish(serializedGraph);
1522}
1523
1524bool Serializer::SaveSerializedToStream(std::ostream& stream)
1525{
1526 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1527
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001528 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1529 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001530 return !stream.bad();
1531}
1532
Matteo Martincighec333912019-02-13 15:12:39 +00001533} // namespace armnnSerializer