blob: b43f26c652a450a8c39b9ae8f9768df5b5977188 [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
Matthew Benthamff130e22020-01-17 11:47:42 +00008#include <armnn/Descriptors.hpp>
9#include <armnn/LstmParams.hpp>
10#include <armnn/QuantizedLstmParams.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>
Mike Kelly8c1701a2019-02-11 17:01:27 +000016#include <flatbuffers/util.h>
17
Matthew Benthamff130e22020-01-17 11:47:42 +000018#include "SerializerUtils.hpp"
19
Mike Kelly8c1701a2019-02-11 17:01:27 +000020using namespace armnn;
21namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000022namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000023
24namespace armnnSerializer
25{
26
Mike Kellyaf484012019-02-20 16:53:11 +000027serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
28{
29 switch (function)
30 {
31 case armnn::ActivationFunction::Sigmoid:
32 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
33 case armnn::ActivationFunction::TanH:
34 return serializer::ActivationFunction::ActivationFunction_TanH;
35 case armnn::ActivationFunction::Linear:
36 return serializer::ActivationFunction::ActivationFunction_Linear;
37 case armnn::ActivationFunction::ReLu:
38 return serializer::ActivationFunction::ActivationFunction_ReLu;
39 case armnn::ActivationFunction::BoundedReLu:
40 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
41 case armnn::ActivationFunction::LeakyReLu:
42 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
43 case armnn::ActivationFunction::Abs:
44 return serializer::ActivationFunction::ActivationFunction_Abs;
45 case armnn::ActivationFunction::Sqrt:
46 return serializer::ActivationFunction::ActivationFunction_Sqrt;
47 case armnn::ActivationFunction::Square:
48 return serializer::ActivationFunction::ActivationFunction_Square;
49 default:
50 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
51 }
52}
53
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010054serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
55{
56 switch (function)
57 {
58 case armnn::ArgMinMaxFunction::Max:
59 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
60 case armnn::ArgMinMaxFunction::Min:
61 default:
62 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
63 }
64}
65
janeil013fec1ea2019-11-07 09:47:20 +000066uint32_t SerializerVisitor::GetSerializedId(armnn::LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000067{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000068 if (m_guidMap.empty())
69 {
janeil013fec1ea2019-11-07 09:47:20 +000070 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000071 }
72 else if (m_guidMap.find(guid) == m_guidMap.end())
73 {
janeil013fec1ea2019-11-07 09:47:20 +000074 ++m_layerId;
75 m_guidMap.insert(std::make_pair(guid, m_layerId));
76
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000077 return m_layerId;
78 }
Saoirse Stewart30211042019-02-18 17:19:16 +000079 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000080}
81
Mike Kelly8c1701a2019-02-11 17:01:27 +000082// Build FlatBuffer for Input Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000083void SerializerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000084{
Derek Lamberti859f9ce2019-12-10 22:05:21 +000085 boost::ignore_unused(name);
86
Mike Kelly8c1701a2019-02-11 17:01:27 +000087 // Create FlatBuffer BaseLayer
88 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
89
90 // Create FlatBuffer BindableBaseLayer
91 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
92 flatBufferInputBaseLayer,
93 id);
Tee Jungaa920c52019-11-05 10:48:25 +000094 // Push layer binding id to outputIds.
95 m_inputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +000096
97 // Create the FlatBuffer InputLayer
98 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
99
100 // Add the AnyLayer to the FlatBufferLayers
101 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
102}
103
104// Build FlatBuffer for Output Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000105void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000106{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000107 boost::ignore_unused(name);
108
Mike Kelly8c1701a2019-02-11 17:01:27 +0000109 // Create FlatBuffer BaseLayer
110 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
111
112 // Create FlatBuffer BindableBaseLayer
113 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
114 flatBufferOutputBaseLayer,
115 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000116 // Push layer binding id to outputIds.
117 m_outputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000118
119 // Create the FlatBuffer OutputLayer
120 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
121 // Add the AnyLayer to the FlatBufferLayers
122 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
123}
124
Kevin May868eb142019-09-04 17:29:31 +0100125void SerializerVisitor::VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
126{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000127 boost::ignore_unused(name);
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100128 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
129 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
130
131 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100132}
133
Mike Kellyaf484012019-02-20 16:53:11 +0000134// Build FlatBuffer for Activation Layer
135void SerializerVisitor::VisitActivationLayer(const armnn::IConnectableLayer* layer,
136 const armnn::ActivationDescriptor& descriptor,
137 const char* name)
138{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000139 boost::ignore_unused(name);
140
Mike Kellyaf484012019-02-20 16:53:11 +0000141 // Create FlatBuffer BaseLayer
142 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
143
144 // Create the FlatBuffer ActivationDescriptor
145 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
146 GetFlatBufferActivationFunction(descriptor.m_Function),
147 descriptor.m_A,
148 descriptor.m_B);
149
150 // Create the FlatBuffer ActivationLayer
151 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
152 flatBufferBaseLayer,
153 flatBufferDescriptor);
154
155 // Add the AnyLayer to the FlatBufferLayers
156 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
157}
158
Mike Kelly8c1701a2019-02-11 17:01:27 +0000159// Build FlatBuffer for Addition Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000160void SerializerVisitor::VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000161{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000162 boost::ignore_unused(name);
163
Mike Kelly8c1701a2019-02-11 17:01:27 +0000164 // Create FlatBuffer BaseLayer
165 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
166
167 // Create the FlatBuffer AdditionLayer
168 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
169
170 // Add the AnyLayer to the FlatBufferLayers
171 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
172}
173
Nikhil Rajee391d52019-09-05 17:50:44 +0100174// Build FlatBuffer for ArgMinMax Layer
175void SerializerVisitor::VisitArgMinMaxLayer(const armnn::IConnectableLayer *layer,
176 const armnn::ArgMinMaxDescriptor& descriptor,
177 const char *name)
178{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000179 boost::ignore_unused(name);
180
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100181 // Create FlatBuffer BaseLayer
182 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
183
184 // Create FlatBuffer Descriptor
185 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
186 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
187 descriptor.m_Axis);
188
189 // Create FlatBuffer ArgMinMaxLayer
190 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
191 flatBufferBaseLayer,
192 flatBufferDescriptor);
193
194 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100195}
196
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000197// Build FlatBuffer for BatchToSpaceNd Layer
198void SerializerVisitor::VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
199 const armnn::BatchToSpaceNdDescriptor& descriptor,
200 const char* name)
201{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000202 boost::ignore_unused(name);
203
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000204 // Create FlatBuffer BaseLayer
205 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
206
207 std::vector<unsigned int> crops;
208 crops.reserve(descriptor.m_Crops.size() * 2);
209 for (auto& crop : descriptor.m_Crops)
210 {
211 crops.push_back(crop.first);
212 crops.push_back(crop.second);
213 }
214
215 auto flatBufferDescriptor =
216 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
217 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
218 m_flatBufferBuilder.CreateVector(crops),
219 GetFlatBufferDataLayout(descriptor.m_DataLayout));
220
221 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
222 flatBufferBaseLayer,
223 flatBufferDescriptor);
224
225 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
226}
227
ruoyan018e7fa232019-02-28 15:09:07 +0000228void SerializerVisitor::VisitBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
229 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
230 const armnn::ConstTensor& mean,
231 const armnn::ConstTensor& variance,
232 const armnn::ConstTensor& beta,
233 const armnn::ConstTensor& gamma,
234 const char* name)
235{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000236 boost::ignore_unused(name);
237
ruoyan018e7fa232019-02-28 15:09:07 +0000238 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
239 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
240 m_flatBufferBuilder,
241 batchNormDescriptor.m_Eps,
242 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
243
244 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
245 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
246 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
247 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
248 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
249 fbBatchNormalizationBaseLayer,
250 fbBatchNormalizationDescriptor,
251 fbMeanConstTensorInfo,
252 fbVarianceConstTensorInfo,
253 fbBetaConstTensorInfo,
254 fbGammaConstTensorInfo);
255
256 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
257}
258
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100259void SerializerVisitor::VisitComparisonLayer(const armnn::IConnectableLayer* layer,
260 const armnn::ComparisonDescriptor& descriptor,
261 const char* name)
262{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000263 boost::ignore_unused(name);
264
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100265 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
266 auto fbDescriptor = serializer::CreateComparisonDescriptor(
267 m_flatBufferBuilder,
268 GetFlatBufferComparisonOperation(descriptor.m_Operation));
269
270 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
271 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100272}
273
Conor Kennedy76277882019-02-26 08:29:54 +0000274// Build FlatBuffer for Constant Layer
275void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
276 const armnn::ConstTensor& input,
277 const char* name)
278{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000279 boost::ignore_unused(name);
280
Conor Kennedy76277882019-02-26 08:29:54 +0000281 // Create FlatBuffer BaseLayer
282 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
283
284 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
285
286 // Create the FlatBuffer ConstantLayer
287 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
288 flatBufferConstantBaseLayer,
289 flatBufferConstTensorInfo);
290
291 // Add the AnyLayer to the FlatBufferLayers
292 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
293}
294
Mike Kellya0766c32019-02-19 17:22:07 +0000295// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000296void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
297 const armnn::Convolution2dDescriptor& descriptor,
298 const armnn::ConstTensor& weights,
299 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000300 const char* name)
301{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000302 boost::ignore_unused(name);
303
Mike Kellya0766c32019-02-19 17:22:07 +0000304 // Create FlatBuffer BaseLayer
305 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
306
307 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
308 descriptor.m_PadLeft,
309 descriptor.m_PadRight,
310 descriptor.m_PadTop,
311 descriptor.m_PadBottom,
312 descriptor.m_StrideX,
313 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100314 descriptor.m_DilationX,
315 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000316 descriptor.m_BiasEnabled,
317 GetFlatBufferDataLayout(descriptor.m_DataLayout));
318 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
319 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
320
321 if (biases.has_value())
322 {
323 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
324 }
325
326 // Create the FlatBuffer Convolution2dLayer
327 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
328 flatBufferBaseLayer,
329 flatBufferDescriptor,
330 flatBufferWeightsConstTensorInfo,
331 flatBufferBiasesConstTensorInfo);
332
333 // Add the AnyLayer to the FlatBufferLayers
334 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
335}
336
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100337void SerializerVisitor::VisitDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
338 const armnn::DepthToSpaceDescriptor& descriptor,
339 const char* name)
340{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000341 boost::ignore_unused(name);
342
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100343 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
344 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
345 descriptor.m_BlockSize,
346 GetFlatBufferDataLayout(descriptor.m_DataLayout));
347
348 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
349
350 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100351}
352
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000353void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
354 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
355 const armnn::ConstTensor& weights,
356 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000357 const char* name)
358{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000359 boost::ignore_unused(name);
360
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000361 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
362 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
363 descriptor.m_PadLeft,
364 descriptor.m_PadRight,
365 descriptor.m_PadTop,
366 descriptor.m_PadBottom,
367 descriptor.m_StrideX,
368 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100369 descriptor.m_DilationX,
370 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000371 descriptor.m_BiasEnabled,
372 GetFlatBufferDataLayout(descriptor.m_DataLayout));
373
374 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
375 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
376 if (biases.has_value())
377 {
378 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
379 }
380
381 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
382 fbBaseLayer,
383 fbDescriptor,
384 fbWeightsConstTensorInfo,
385 fbBiasesConstTensorInfo);
386
387 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
388}
389
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000390void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
391 const char* name)
392{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000393 boost::ignore_unused(name);
394
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000395 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
396 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
397
398 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
399}
400
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000401void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
402 const armnn::DetectionPostProcessDescriptor& descriptor,
403 const armnn::ConstTensor& anchors,
404 const char* name)
405{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000406 boost::ignore_unused(name);
407
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000408 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
409 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
410 descriptor.m_MaxDetections,
411 descriptor.m_MaxClassesPerDetection,
412 descriptor.m_DetectionsPerClass,
413 descriptor.m_NmsScoreThreshold,
414 descriptor.m_NmsIouThreshold,
415 descriptor.m_NumClasses,
416 descriptor.m_UseRegularNms,
417 descriptor.m_ScaleX,
418 descriptor.m_ScaleY,
419 descriptor.m_ScaleW,
420 descriptor.m_ScaleH);
421
422 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
423
424 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
425 fbBaseLayer,
426 fbDescriptor,
427 fbAnchorsConstTensorInfo);
428
429 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
430}
431
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000432void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
433{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000434 boost::ignore_unused(name);
435
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000436 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
437 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000438
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000439 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
440}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000441
josh minor4a3c6102020-01-06 16:40:46 -0600442void SerializerVisitor::VisitElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
443 const armnn::ElementwiseUnaryDescriptor& descriptor,
444 const char* name)
445{
446 boost::ignore_unused(name);
447
448 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
449 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
450 m_flatBufferBuilder,
451 GetFlatBufferUnaryOperation(descriptor.m_Operation));
452
453 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
454 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
455}
456
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000457void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
458{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000459 boost::ignore_unused(name);
460
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000461 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
462 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
463
464 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
465}
466
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000467void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
468{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000469 boost::ignore_unused(name);
470
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000471 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
472 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
473
474 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
475}
476
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000477void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
478{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000479 boost::ignore_unused(name);
480
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000481 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
482 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000483
484 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
485}
486
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000487void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
488{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000489 boost::ignore_unused(name);
490
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000491 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000492 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000493
494 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
495}
496
Kevin Mayce5045a2019-10-02 14:07:47 +0100497void SerializerVisitor::VisitInstanceNormalizationLayer(
498 const armnn::IConnectableLayer* layer,
499 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
500 const char* name)
501{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000502 boost::ignore_unused(name);
503
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100504 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
505 m_flatBufferBuilder,
506 instanceNormalizationDescriptor.m_Gamma,
507 instanceNormalizationDescriptor.m_Beta,
508 instanceNormalizationDescriptor.m_Eps,
509 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
510
511 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
512 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
513
514 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100515}
516
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000517void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
518 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
519 const char* name)
520{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000521 boost::ignore_unused(name);
522
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000523 // Create FlatBuffer BaseLayer
524 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
525
526 // Create the FlatBuffer L2Normalization Descriptor
527 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100528 m_flatBufferBuilder,
529 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
530 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000531
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100532 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000533 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
534
535 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
536}
537
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100538void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
539 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
540 const char* name)
541{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000542 boost::ignore_unused(name);
543
Sadik Armagan26257852019-10-14 13:00:47 +0100544 // Create FlatBuffer BaseLayer
545 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
546
547 // Create the FlatBuffer LogSoftmaxDescriptor
548 auto flatBufferLogSoftmaxDesc =
549 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
550 logSoftmaxDescriptor.m_Beta,
551 logSoftmaxDescriptor.m_Axis);
552
553 // Create the FlatBuffer LogSoftmaxLayer
554 auto flatBufferLogSoftmaxLayer =
555 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
556 flatBufferLogSoftmaxBaseLayer,
557 flatBufferLogSoftmaxDesc);
558
559 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100560}
561
562void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
563 const armnn::LstmDescriptor& descriptor,
564 const armnn::LstmInputParams& params,
565 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000566{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000567 boost::ignore_unused(name);
568
Jim Flynn11af3752019-03-19 17:22:29 +0000569 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
570
571 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
572 m_flatBufferBuilder,
573 descriptor.m_ActivationFunc,
574 descriptor.m_ClippingThresCell,
575 descriptor.m_ClippingThresProj,
576 descriptor.m_CifgEnabled,
577 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100578 descriptor.m_ProjectionEnabled,
579 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000580
581 // Get mandatory input parameters
582 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
583 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
584 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
585 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
586 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
587 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
588 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
589 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
590 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
591
592 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
593 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
594 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
595 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
596 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
597 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
598 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
599 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
600 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100601 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
602 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
603 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
604 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000605
606 if (!descriptor.m_CifgEnabled)
607 {
608 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
609 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
610 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
611 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
612 }
613
614 if (descriptor.m_ProjectionEnabled)
615 {
616 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
617 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
618 }
619
620 if (descriptor.m_PeepholeEnabled)
621 {
622 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
623 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
624 }
625
Jan Eilersf8c62972019-07-17 11:07:49 +0100626 if (descriptor.m_LayerNormEnabled)
627 {
628 if (!descriptor.m_CifgEnabled)
629 {
630 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
631 }
632 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
633 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
634 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
635 }
636
Jim Flynn11af3752019-03-19 17:22:29 +0000637 auto fbLstmParams = serializer::CreateLstmInputParams(
638 m_flatBufferBuilder,
639 inputToForgetWeights,
640 inputToCellWeights,
641 inputToOutputWeights,
642 recurrentToForgetWeights,
643 recurrentToCellWeights,
644 recurrentToOutputWeights,
645 forgetGateBias,
646 cellBias,
647 outputGateBias,
648 inputToInputWeights,
649 recurrentToInputWeights,
650 cellToInputWeights,
651 inputGateBias,
652 projectionWeights,
653 projectionBias,
654 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100655 cellToOutputWeights,
656 inputLayerNormWeights,
657 forgetLayerNormWeights,
658 cellLayerNormWeights,
659 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000660
661 auto fbLstmLayer = serializer::CreateLstmLayer(
662 m_flatBufferBuilder,
663 fbLstmBaseLayer,
664 fbLstmDescriptor,
665 fbLstmParams);
666
667 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
668}
669
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000670void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
671{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000672 boost::ignore_unused(name);
673
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000674 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
675 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
676
677 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
678}
679
680void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
681 const armnn::MeanDescriptor& descriptor,
682 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 fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
687 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
688 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
689 descriptor.m_KeepDims);
690
691 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
692 fbMeanBaseLayer,
693 fbMeanDescriptor);
694
695 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
696}
697
698void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
699{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000700 boost::ignore_unused(name);
701
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000702 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
703 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
704
705 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
706}
707
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100708void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
709{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000710 boost::ignore_unused(name);
711
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100712 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
713 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
714
715 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
716}
717
Jim Flynnac25a1b2019-02-28 10:40:49 +0000718void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100719 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000720 const char* name)
721{
Jim Flynne242f2d2019-05-22 14:24:13 +0100722 VisitConcatLayer(layer, mergerDescriptor, name);
723}
724
725void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
726 const armnn::ConcatDescriptor& concatDescriptor,
727 const char* name)
728{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000729 boost::ignore_unused(name);
730
Jim Flynne242f2d2019-05-22 14:24:13 +0100731 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000732
733 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100734 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000735 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100736 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000737 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100738 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000739 {
740 origins.push_back(origin[d]);
741 }
742 auto view = m_flatBufferBuilder.CreateVector(origins);
743 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
744 views.push_back(uintVector);
745 }
746
Jim Flynne242f2d2019-05-22 14:24:13 +0100747 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
748 concatDescriptor.GetConcatAxis(),
749 concatDescriptor.GetNumViews(),
750 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000751 m_flatBufferBuilder.CreateVector(views));
752
Jim Flynne242f2d2019-05-22 14:24:13 +0100753 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
754 flatBufferConcatBaseLayer,
755 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000756
Jim Flynne242f2d2019-05-22 14:24:13 +0100757 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000758}
759
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000760void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000761{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000762 boost::ignore_unused(name);
763
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000764 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
765 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
766 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000767
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000768 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000769}
770
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000771void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
772 const armnn::PadDescriptor& padDescriptor,
773 const char* name)
774{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000775 boost::ignore_unused(name);
776
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000777 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
778
779 std::vector<unsigned int> padList;
780 for (auto& p: padDescriptor.m_PadList)
781 {
782 padList.push_back(p.first);
783 padList.push_back(p.second);
784 }
785
786 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100787 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100788 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000789
790 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
791 flatBufferBaseLayer,
792 flatBufferPadDesc);
793
794 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
795}
796
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000797void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
798 const armnn::PermuteDescriptor& permuteDescriptor,
799 const char* name)
800{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000801 boost::ignore_unused(name);
802
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000803 // Create FlatBuffer BaseLayer
804 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
805
806 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100807 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000808 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100809 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000810 }
811
812 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
813 m_flatBufferBuilder.CreateVector(dimMappings));
814
815 // Create the FlatBuffer PermuteLayer
816 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
817 flatBufferPermuteBaseLayer,
818 flatBufferPermuteDesc);
819
820 // Add the AnyLayer to the FlatBufferLayers
821 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
822}
823
Saoirse Stewart263829c2019-02-19 15:54:14 +0000824// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000825void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000826 const armnn::ReshapeDescriptor& reshapeDescriptor,
827 const char* name)
828{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000829 boost::ignore_unused(name);
830
Saoirse Stewart263829c2019-02-19 15:54:14 +0000831 // Create FlatBuffer BaseLayer
832 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
833
834 std::vector<unsigned int> targetShape;
835 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
836 {
837 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
838 }
839
840 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
841 m_flatBufferBuilder.CreateVector(targetShape));
842
843 // Create the FlatBuffer ReshapeLayer
844 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
845 flatBufferReshapeDesc);
846
847 // Add the AnyLayer to the FlatBufferLayers
848 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
849}
850
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000851void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
852 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
853 const char* name)
854{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000855 boost::ignore_unused(name);
856
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000857 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
858
859 auto flatBufferDescriptor =
860 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
861 resizeDescriptor.m_TargetWidth,
862 resizeDescriptor.m_TargetHeight,
863 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
864
865 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
866 flatBufferBaseLayer,
867 flatBufferDescriptor);
868
869 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
870}
871
Teresa Charlina9075df2019-06-27 15:41:57 +0100872void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
873 const armnn::ResizeDescriptor& resizeDescriptor,
874 const char* name)
875{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000876 boost::ignore_unused(name);
877
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100878 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
879
880 auto flatBufferDescriptor =
881 CreateResizeDescriptor(m_flatBufferBuilder,
882 resizeDescriptor.m_TargetHeight,
883 resizeDescriptor.m_TargetWidth,
884 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
885 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
886
887 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
888 flatBufferBaseLayer,
889 flatBufferDescriptor);
890
891 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100892}
893
Sadik Armagan8b42a382019-03-01 14:24:49 +0000894void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
895{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000896 boost::ignore_unused(name);
897
Sadik Armagan8b42a382019-03-01 14:24:49 +0000898 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
899 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
900
901 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
902}
903
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100904void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
905 const armnn::SliceDescriptor& sliceDescriptor,
906 const char* name)
907{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000908 boost::ignore_unused(name);
909
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100910 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
911 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
912 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
913 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
914
915 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
916
917 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100918}
919
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000920// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000921void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
922 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000923 const char* name)
924{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000925 boost::ignore_unused(name);
926
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000927 // Create FlatBuffer BaseLayer
928 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
929
930 // Create the FlatBuffer SoftmaxDescriptor
931 auto flatBufferSoftmaxDesc =
932 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
933
934 // Create the FlatBuffer SoftmaxLayer
935 auto flatBufferSoftmaxLayer =
936 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
937 flatBufferSoftmaxBaseLayer,
938 flatBufferSoftmaxDesc);
939
940 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
941}
942
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000943void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
944 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000945 const char* name)
946{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000947 boost::ignore_unused(name);
948
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000949 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
950 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
951 m_flatBufferBuilder,
952 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
953 pooling2dDescriptor.m_PadLeft,
954 pooling2dDescriptor.m_PadRight,
955 pooling2dDescriptor.m_PadTop,
956 pooling2dDescriptor.m_PadBottom,
957 pooling2dDescriptor.m_PoolWidth,
958 pooling2dDescriptor.m_PoolHeight,
959 pooling2dDescriptor.m_StrideX,
960 pooling2dDescriptor.m_StrideY,
961 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
962 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
963 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
964
965 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
966 fbPooling2dBaseLayer,
967 fbPooling2dDescriptor);
968
969 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
970}
971
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100972void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
973 const char* name)
974{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000975 boost::ignore_unused(name);
976
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100977 // Create FlatBuffer BaseLayer
978 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
979
980 // Create the FlatBuffer AdditionLayer
981 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
982
983 // Add the AnyLayer to the FlatBufferLayers
984 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100985}
986
Derek Lamberti87acb272019-03-27 16:51:31 +0000987void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
988{
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000989 boost::ignore_unused(name);
990
Derek Lamberti87acb272019-03-27 16:51:31 +0000991 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
992 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
993 fbQuantizeBaseLayer);
994 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
995}
996
Sadik Armagandbb0c0c2019-02-21 09:01:41 +0000997// Build FlatBuffer for FullyConnected Layer
998void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
999 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
1000 const armnn::ConstTensor& weights,
1001 const armnn::Optional<armnn::ConstTensor>& biases,
1002 const char* name)
1003{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001004 boost::ignore_unused(name);
1005
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001006 // Create FlatBuffer BaseLayer
1007 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1008
1009 // Create FlatBuffer FullyConnectedDescriptor
1010 auto flatBufferDescriptor =
1011 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1012 fullyConnectedDescriptor.m_BiasEnabled,
1013 fullyConnectedDescriptor.m_TransposeWeightMatrix);
1014
1015 // Create FlatBuffer weights data
1016 auto flatBufferWeights = CreateConstTensorInfo(weights);
1017
1018 // Create FlatBuffer bias data
1019 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
1020 if (fullyConnectedDescriptor.m_BiasEnabled)
1021 {
1022 flatBufferBiases = CreateConstTensorInfo(biases.value());
1023 }
1024
1025 // Create FlatBuffer FullyConnectedLayer
1026 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1027 flatBufferBaseLayer,
1028 flatBufferDescriptor,
1029 flatBufferWeights,
1030 flatBufferBiases);
1031
1032 // Add created FullyConnectedLayer to the FlatBufferLayers
1033 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1034}
1035
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001036// Build FlatBuffer for SpaceToBatchNd Layer
1037void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
1038 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1039 const char* name)
1040{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001041 boost::ignore_unused(name);
1042
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001043 // Create FlatBuffer BaseLayer
1044 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1045
1046 std::vector<unsigned int> padList;
1047 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1048 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1049 {
1050 padList.push_back(pad.first);
1051 padList.push_back(pad.second);
1052 }
1053
1054 auto flatBufferDescriptor =
1055 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1056 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1057 m_flatBufferBuilder.CreateVector(padList),
1058 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1059
1060 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1061 flatBufferBaseLayer,
1062 flatBufferDescriptor);
1063
1064 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1065}
1066
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001067// Build FlatBuffer for SpaceToDepthLayer
1068void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
1069 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1070 const char* name)
1071{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001072 boost::ignore_unused(name);
1073
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001074 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1075 auto flatBufferDescriptor =
1076 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1077 spaceToDepthDescriptor.m_BlockSize,
1078 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1079
1080 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1081 flatBufferBaseLayer,
1082 flatBufferDescriptor);
1083
1084 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001085}
1086
Jim Flynn18ce3382019-03-08 11:08:30 +00001087// Build FlatBuffer for Splitter Layer
1088void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
1089 const armnn::ViewsDescriptor& viewsDescriptor,
1090 const char* name)
1091{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001092 boost::ignore_unused(name);
1093
Jim Flynn18ce3382019-03-08 11:08:30 +00001094 // Create FlatBuffer ViewOrigins
1095 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1096 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1097
1098 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1099 {
1100 std::vector<uint32_t> viewOrigin;
1101 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1102
1103 // Copy vector
1104 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1105 {
1106 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1107 }
1108
1109 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1110 m_flatBufferBuilder.CreateVector(viewOrigin)));
1111 }
1112
1113 // Create FlatBuffer OriginsDescriptor
1114 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1115 viewsDescriptor.GetOrigins().GetConcatAxis(),
1116 viewsDescriptor.GetOrigins().GetNumViews(),
1117 viewsDescriptor.GetOrigins().GetNumDimensions(),
1118 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1119
1120 // Create FlatBuffer ViewOrigins
1121 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1122 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1123
1124 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1125 {
1126 std::vector<uint32_t> viewSize;
1127 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1128
1129 // Copy vector
1130 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1131 {
1132 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1133 }
1134
1135 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1136 m_flatBufferBuilder.CreateVector(viewSize)));
1137 }
1138
1139 // Create FlatBuffer ViewsDescriptor
1140 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1141 flatBufferOriginDescriptor,
1142 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1143
1144 // Create FlatBuffer BaseLayer
1145 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1146
1147 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1148 flatBufferBaseLayer,
1149 flatBufferViewsDescriptor);
1150
1151 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1152}
1153
Nina Drozd57728782019-02-27 10:53:27 +00001154void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1155 const armnn::NormalizationDescriptor& descriptor,
1156 const char* name)
1157{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001158 boost::ignore_unused(name);
1159
Nina Drozd57728782019-02-27 10:53:27 +00001160 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1161
1162 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1163 m_flatBufferBuilder,
1164 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1165 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1166 descriptor.m_NormSize,
1167 descriptor.m_Alpha,
1168 descriptor.m_Beta,
1169 descriptor.m_K,
1170 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1171
1172 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1173 fbNormalizationBaseLayer,
1174 fbNormalizationDescriptor);
1175
1176 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1177}
1178
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001179void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1180 const armnn::StackDescriptor& stackDescriptor,
1181 const char* name)
1182{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001183 boost::ignore_unused(name);
1184
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001185 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1186
1187 std::vector<unsigned int> inputShape;
1188 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1189 {
1190 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1191 }
1192
1193 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1194 stackDescriptor.m_Axis,
1195 stackDescriptor.m_NumInputs,
1196 m_flatBufferBuilder.CreateVector(inputShape));
1197
1198 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1199 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001200}
1201
Derek Lamberti013c3902019-10-21 10:46:16 +01001202void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1203 const armnn::StandInDescriptor& standInDescriptor,
1204 const char *name)
1205{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001206 boost::ignore_unused(name);
1207
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001208 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1209 standInDescriptor.m_NumInputs,
1210 standInDescriptor.m_NumOutputs);
1211
1212 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1213 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1214
1215 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001216}
1217
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001218void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1219 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1220 const char* name)
1221{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001222 boost::ignore_unused(name);
1223
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001224 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1225
1226 auto flatBufferDescriptor =
1227 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1228 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1229 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1230 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1231 stridedSliceDescriptor.m_BeginMask,
1232 stridedSliceDescriptor.m_EndMask,
1233 stridedSliceDescriptor.m_ShrinkAxisMask,
1234 stridedSliceDescriptor.m_EllipsisMask,
1235 stridedSliceDescriptor.m_NewAxisMask,
1236 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1237
1238 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1239 flatBufferBaseLayer,
1240 flatBufferDescriptor);
1241
1242 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1243}
1244
Conor Kennedyda1f9752019-03-01 14:37:12 +00001245void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1246{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001247 boost::ignore_unused(name);
1248
Conor Kennedyda1f9752019-03-01 14:37:12 +00001249 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1250 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1251
1252 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1253}
1254
Sadik Armaganeff363d2019-04-05 15:25:46 +01001255void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1256{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001257 boost::ignore_unused(name);
1258
Sadik Armaganeff363d2019-04-05 15:25:46 +01001259 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1260 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1261
1262 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1263}
1264
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001265void SerializerVisitor::VisitTransposeConvolution2dLayer(
1266 const armnn::IConnectableLayer* layer,
1267 const armnn::TransposeConvolution2dDescriptor& descriptor,
1268 const armnn::ConstTensor& weights,
1269 const armnn::Optional<armnn::ConstTensor>& biases,
1270 const char* name)
1271{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001272 boost::ignore_unused(name);
1273
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001274 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1275 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1276 descriptor.m_PadLeft,
1277 descriptor.m_PadRight,
1278 descriptor.m_PadTop,
1279 descriptor.m_PadBottom,
1280 descriptor.m_StrideX,
1281 descriptor.m_StrideY,
1282 descriptor.m_BiasEnabled,
1283 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1284
1285 // weights & biases
1286 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1287 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1288 if (biases.has_value())
1289 {
1290 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1291 }
1292
1293 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1294 fbBaseLayer,
1295 fbDescriptor,
1296 fbWeightsConstTensorInfo,
1297 fbBiasesConstTensorInfo);
1298
1299 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001300}
1301
James Conroyee18dc82019-07-17 11:27:46 +01001302void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1303 const armnn::QuantizedLstmInputParams& params,
1304 const char* name)
1305{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001306 boost::ignore_unused(name);
1307
Jan Eilers5b01a892019-07-23 09:47:43 +01001308 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1309
1310 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001311 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1312 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1313 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1314 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001315
Francis Murtaghbb590b42019-08-14 09:51:36 +01001316 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1317 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1318 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1319 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001320
Francis Murtaghbb590b42019-08-14 09:51:36 +01001321 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1322 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1323 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1324 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001325
1326 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1327 m_flatBufferBuilder,
1328 inputToInputWeights,
1329 inputToForgetWeights,
1330 inputToCellWeights,
1331 inputToOutputWeights,
1332 recurrentToInputWeights,
1333 recurrentToForgetWeights,
1334 recurrentToCellWeights,
1335 recurrentToOutputWeights,
1336 inputGateBias,
1337 forgetGateBias,
1338 cellBias,
1339 outputGateBias);
1340
1341 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1342 m_flatBufferBuilder,
1343 fbQuantizedLstmBaseLayer,
1344 fbQuantizedLstmParams);
1345
1346 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001347}
1348
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001349fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001350 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001351{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001352
Sadik Armagandb059fd2019-03-20 12:28:32 +00001353 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1354
Mike Kelly8c1701a2019-02-11 17:01:27 +00001355 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1356 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1357
1358 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001359 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001360 m_flatBufferBuilder.CreateString(layer->GetName()),
1361 layerType,
1362 m_flatBufferBuilder.CreateVector(inputSlots),
1363 m_flatBufferBuilder.CreateVector(outputSlots));
1364}
1365
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001366void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001367{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001368
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001369 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001370 m_serializedLayers.push_back(anyLayer);
1371}
1372
Mike Kellya0766c32019-02-19 17:22:07 +00001373template <typename T>
1374flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1375{
1376 const T* buffer = reinterpret_cast<const T*>(memory);
1377 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1378 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1379 return fbVector;
1380}
1381
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001382flatbuffers::Offset<serializer::ConstTensor>
1383 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Mike Kellya0766c32019-02-19 17:22:07 +00001384{
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001385 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
Mike Kellya0766c32019-02-19 17:22:07 +00001386
1387 // Get the dimensions
1388 std::vector<unsigned int> shape;
1389
1390 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1391 {
1392 shape.push_back(tensorInfo.GetShape()[dim]);
1393 }
1394
1395 // Create FlatBuffer TensorInfo
1396 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1397 m_flatBufferBuilder.CreateVector(shape),
1398 GetFlatBufferDataType(tensorInfo.GetDataType()),
1399 tensorInfo.GetQuantizationScale(),
1400 tensorInfo.GetQuantizationOffset());
1401 flatbuffers::Offset<void> fbPayload;
1402
1403 switch (tensorInfo.GetDataType())
1404 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001405 case armnn::DataType::Float32:
1406 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001407 {
1408 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1409 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1410 m_flatBufferBuilder,
1411 fbVector);
1412 fbPayload = flatBuffersData.o;
1413 break;
1414 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001415 case armnn::DataType::Float16:
Mike Kellya0766c32019-02-19 17:22:07 +00001416 {
1417 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1418 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1419 m_flatBufferBuilder,
1420 fbVector);
1421 fbPayload = flatBuffersData.o;
1422 break;
1423 }
Derek Lambertif90c56d2020-01-10 17:14:08 +00001424 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001425 {
1426 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1427 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1428 m_flatBufferBuilder,
1429 fbVector);
1430 fbPayload = flatBuffersData.o;
1431 break;
1432 }
Derek Lambertif90c56d2020-01-10 17:14:08 +00001433 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001434 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001435 default:
1436 {
1437 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1438 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1439 m_flatBufferBuilder,
1440 fbVector);
1441 fbPayload = flatBuffersData.o;
1442 }
1443 }
1444 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1445 m_flatBufferBuilder,
1446 flatBufferTensorInfo,
1447 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1448 fbPayload);
1449 return flatBufferConstTensor;
1450}
1451
Tee Jungaa920c52019-11-05 10:48:25 +00001452flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerVisitor::GetVersionTable()
1453{
1454 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1455 serializer::CreateFeatureCompatibilityVersions(
1456 m_flatBufferBuilder,
1457 1 // Binding ids scheme version
1458 );
1459 return versionsTable;
1460}
1461
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001462std::vector<fb::Offset<serializer::InputSlot>>
1463 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001464{
Mike Kellya0766c32019-02-19 17:22:07 +00001465 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001466
1467 // Get the InputSlots
1468 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1469 {
1470 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1471
1472 // Get the Connection for the InputSlot
1473 const IOutputSlot* connection = inputSlot.GetConnection();
1474
1475 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001476 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1477 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001478 // Create FlatBuffer InputSlot
1479 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1480 }
1481 return inputSlots;
1482}
1483
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001484std::vector<fb::Offset<serializer::OutputSlot>>
1485 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001486{
1487 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1488
1489 // Get the OutputSlots
1490 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1491 {
1492 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001493 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001494
1495 // Get the dimensions
1496 std::vector<unsigned int> shape;
1497 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1498 {
1499 shape.push_back(tensorInfo.GetShape()[dim]);
1500 }
1501
1502 // Create FlatBuffer TensorInfo
1503 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1504 m_flatBufferBuilder.CreateVector(shape),
1505 GetFlatBufferDataType(tensorInfo.GetDataType()),
1506 tensorInfo.GetQuantizationScale(),
1507 tensorInfo.GetQuantizationOffset());
1508
1509 // Create FlatBuffer Outputslot
1510 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1511 slotIndex,
1512 flatBufferTensorInfo));
1513 }
1514 return outputSlots;
1515}
1516
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001517
1518ISerializer* ISerializer::CreateRaw()
1519{
1520 return new Serializer();
1521}
1522
1523ISerializerPtr ISerializer::Create()
1524{
1525 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1526}
1527
1528void ISerializer::Destroy(ISerializer* serializer)
1529{
1530 delete serializer;
1531}
1532
1533void Serializer::Serialize(const INetwork& inNetwork)
1534{
1535 // Iterate through to network
1536 inNetwork.Accept(m_SerializerVisitor);
1537 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1538
1539 // Create FlatBuffer SerializedGraph
1540 auto serializedGraph = serializer::CreateSerializedGraph(
1541 fbBuilder,
1542 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1543 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
Tee Jungaa920c52019-11-05 10:48:25 +00001544 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()),
1545 m_SerializerVisitor.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001546
1547 // Serialize the graph
1548 fbBuilder.Finish(serializedGraph);
1549}
1550
1551bool Serializer::SaveSerializedToStream(std::ostream& stream)
1552{
1553 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1554
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001555 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1556 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001557 return !stream.bad();
1558}
1559
Matteo Martincighec333912019-02-13 15:12:39 +00001560} // namespace armnnSerializer