diff --git a/examples/graph_ssd_mobilenet.cpp b/examples/graph_ssd_mobilenet.cpp
index 55c9d75..e84a00e 100644
--- a/examples/graph_ssd_mobilenet.cpp
+++ b/examples/graph_ssd_mobilenet.cpp
@@ -41,7 +41,16 @@
     {
         // Add topk option
         keep_topk_opt = cmd_parser.add_option<SimpleOption<int>>("topk", 100);
-        keep_topk_opt->set_help("Top k detections results per image.");
+        keep_topk_opt->set_help("Top k detections results per image. Used for data type F32.");
+        // Add output option
+        detection_boxes_opt = cmd_parser.add_option<SimpleOption<std::string>>("detection_boxes_opt", "");
+        detection_boxes_opt->set_help("Filename containing the reference values for the graph output detection_boxes. Used for data type QASYMM8.");
+        detection_classes_opt = cmd_parser.add_option<SimpleOption<std::string>>("detection_classes_opt", "");
+        detection_classes_opt->set_help("Filename containing the reference values for the output detection_classes. Used for data type QASYMM8.");
+        detection_scores_opt = cmd_parser.add_option<SimpleOption<std::string>>("detection_scores_opt", "");
+        detection_scores_opt->set_help("Filename containing the reference values for the output detection_scores. Used for data type QASYMM8.");
+        num_detections_opt = cmd_parser.add_option<SimpleOption<std::string>>("num_detections_opt", "");
+        num_detections_opt->set_help("Filename containing the reference values for the output num_detections. Used with datatype QASYMM8.");
     }
     GraphSSDMobilenetExample(const GraphSSDMobilenetExample &) = delete;
     GraphSSDMobilenetExample &operator=(const GraphSSDMobilenetExample &) = delete;
@@ -76,8 +85,137 @@
               << common_params.fast_math_hint;
 
         // Create core graph
-        std::string model_path = "/cnn_data/ssd_mobilenet_model/";
+        if(arm_compute::is_data_type_float(common_params.data_type))
+        {
+            create_graph_float(input_descriptor);
+        }
+        else
+        {
+            create_graph_qasymm(input_descriptor);
+        }
 
+        // Finalize graph
+        GraphConfig config;
+        config.num_threads = common_params.threads;
+        config.use_tuner   = common_params.enable_tuner;
+        config.tuner_file  = common_params.tuner_file;
+
+        graph.finalize(common_params.target, config);
+
+        return true;
+    }
+    void do_run() override
+    {
+        // Run graph
+        graph.run();
+    }
+
+private:
+    CommandLineParser  cmd_parser;
+    CommonGraphOptions common_opts;
+    SimpleOption<int> *keep_topk_opt{ nullptr };
+    CommonGraphParams  common_params;
+    Stream             graph;
+
+    SimpleOption<std::string> *detection_boxes_opt{ nullptr };
+    SimpleOption<std::string> *detection_classes_opt{ nullptr };
+    SimpleOption<std::string> *detection_scores_opt{ nullptr };
+    SimpleOption<std::string> *num_detections_opt{ nullptr };
+
+    ConcatLayer get_node_A_float(IStream &master_graph, const std::string &data_path, std::string &&param_path,
+                                 unsigned int  conv_filt,
+                                 PadStrideInfo dwc_pad_stride_info, PadStrideInfo conv_pad_stride_info)
+    {
+        const std::string total_path = param_path + "_";
+        SubStream         sg(master_graph);
+
+        sg << DepthwiseConvolutionLayer(
+               3U, 3U,
+               get_weights_accessor(data_path, total_path + "dw_w.npy"),
+               std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
+               dwc_pad_stride_info)
+           .set_name(param_path + "/dw")
+           << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "dw_bn_mean.npy"),
+                                      get_weights_accessor(data_path, total_path + "dw_bn_var.npy"),
+                                      get_weights_accessor(data_path, total_path + "dw_scale_w.npy"),
+                                      get_weights_accessor(data_path, total_path + "dw_scale_b.npy"), 0.00001f)
+           .set_name(param_path + "/dw/bn")
+           << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name(param_path + "dw/relu")
+
+           << ConvolutionLayer(
+               1U, 1U, conv_filt,
+               get_weights_accessor(data_path, total_path + "w.npy"),
+               std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
+               conv_pad_stride_info)
+           .set_name(param_path + "/pw")
+           << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "bn_mean.npy"),
+                                      get_weights_accessor(data_path, total_path + "bn_var.npy"),
+                                      get_weights_accessor(data_path, total_path + "scale_w.npy"),
+                                      get_weights_accessor(data_path, total_path + "scale_b.npy"), 0.00001f)
+           .set_name(param_path + "/pw/bn")
+           << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name(param_path + "pw/relu");
+
+        return ConcatLayer(std::move(sg));
+    }
+
+    ConcatLayer get_node_B_float(IStream &master_graph, const std::string &data_path, std::string &&param_path,
+                                 unsigned int  conv_filt,
+                                 PadStrideInfo conv_pad_stride_info_1, PadStrideInfo conv_pad_stride_info_2)
+    {
+        const std::string total_path = param_path + "_";
+        SubStream         sg(master_graph);
+
+        sg << ConvolutionLayer(
+               1, 1, conv_filt / 2,
+               get_weights_accessor(data_path, total_path + "1_w.npy"),
+               std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
+               conv_pad_stride_info_1)
+           .set_name(total_path + "1/conv")
+           << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "1_bn_mean.npy"),
+                                      get_weights_accessor(data_path, total_path + "1_bn_var.npy"),
+                                      get_weights_accessor(data_path, total_path + "1_scale_w.npy"),
+                                      get_weights_accessor(data_path, total_path + "1_scale_b.npy"), 0.00001f)
+           .set_name(total_path + "1/bn")
+           << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name(total_path + "1/relu");
+
+        sg << ConvolutionLayer(
+               3, 3, conv_filt,
+               get_weights_accessor(data_path, total_path + "2_w.npy"),
+               std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
+               conv_pad_stride_info_2)
+           .set_name(total_path + "2/conv")
+           << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "2_bn_mean.npy"),
+                                      get_weights_accessor(data_path, total_path + "2_bn_var.npy"),
+                                      get_weights_accessor(data_path, total_path + "2_scale_w.npy"),
+                                      get_weights_accessor(data_path, total_path + "2_scale_b.npy"), 0.00001f)
+           .set_name(total_path + "2/bn")
+           << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name(total_path + "2/relu");
+
+        return ConcatLayer(std::move(sg));
+    }
+
+    ConcatLayer get_node_C_float(IStream &master_graph, const std::string &data_path, std::string &&param_path,
+                                 unsigned int conv_filt, PadStrideInfo conv_pad_stride_info)
+    {
+        const std::string total_path = param_path + "_";
+        SubStream         sg(master_graph);
+        sg << ConvolutionLayer(
+               1U, 1U, conv_filt,
+               get_weights_accessor(data_path, total_path + "w.npy"),
+               get_weights_accessor(data_path, total_path + "b.npy"),
+               conv_pad_stride_info)
+           .set_name(param_path + "/conv");
+        if(common_params.data_layout == DataLayout::NCHW)
+        {
+            sg << PermuteLayer(PermutationVector(2U, 0U, 1U), DataLayout::NHWC).set_name(param_path + "/perm");
+        }
+        sg << FlattenLayer().set_name(param_path + "/flat");
+
+        return ConcatLayer(std::move(sg));
+    }
+
+    void create_graph_float(TensorDescriptor &input_descriptor)
+    {
         // Create a preprocessor object
         const std::array<float, 3> mean_rgb{ { 127.5f, 127.5f, 127.5f } };
         std::unique_ptr<IPreprocessor> preprocessor = arm_compute::support::cpp14::make_unique<CaffePreproccessor>(mean_rgb, true, 0.007843f);
@@ -88,7 +226,7 @@
         // Add model path to data path
         if(!data_path.empty())
         {
-            data_path += model_path;
+            data_path += "/cnn_data/ssd_mobilenet_model/";
         }
 
         graph << InputLayer(input_descriptor,
@@ -108,52 +246,52 @@
                 .set_name("conv0/bn")
                 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name("conv0/relu");
 
-        conv_11 << get_node_A(conv_11, data_path, "conv1", 64, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
-        conv_11 << get_node_A(conv_11, data_path, "conv2", 128, PadStrideInfo(2, 2, 1, 1), PadStrideInfo(1, 1, 0, 0));
-        conv_11 << get_node_A(conv_11, data_path, "conv3", 128, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
-        conv_11 << get_node_A(conv_11, data_path, "conv4", 256, PadStrideInfo(2, 2, 1, 1), PadStrideInfo(1, 1, 0, 0));
-        conv_11 << get_node_A(conv_11, data_path, "conv5", 256, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
-        conv_11 << get_node_A(conv_11, data_path, "conv6", 512, PadStrideInfo(2, 2, 1, 1), PadStrideInfo(1, 1, 0, 0));
-        conv_11 << get_node_A(conv_11, data_path, "conv7", 512, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
-        conv_11 << get_node_A(conv_11, data_path, "conv8", 512, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
-        conv_11 << get_node_A(conv_11, data_path, "conv9", 512, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
-        conv_11 << get_node_A(conv_11, data_path, "conv10", 512, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
-        conv_11 << get_node_A(conv_11, data_path, "conv11", 512, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
+        conv_11 << get_node_A_float(conv_11, data_path, "conv1", 64, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
+        conv_11 << get_node_A_float(conv_11, data_path, "conv2", 128, PadStrideInfo(2, 2, 1, 1), PadStrideInfo(1, 1, 0, 0));
+        conv_11 << get_node_A_float(conv_11, data_path, "conv3", 128, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
+        conv_11 << get_node_A_float(conv_11, data_path, "conv4", 256, PadStrideInfo(2, 2, 1, 1), PadStrideInfo(1, 1, 0, 0));
+        conv_11 << get_node_A_float(conv_11, data_path, "conv5", 256, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
+        conv_11 << get_node_A_float(conv_11, data_path, "conv6", 512, PadStrideInfo(2, 2, 1, 1), PadStrideInfo(1, 1, 0, 0));
+        conv_11 << get_node_A_float(conv_11, data_path, "conv7", 512, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
+        conv_11 << get_node_A_float(conv_11, data_path, "conv8", 512, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
+        conv_11 << get_node_A_float(conv_11, data_path, "conv9", 512, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
+        conv_11 << get_node_A_float(conv_11, data_path, "conv10", 512, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
+        conv_11 << get_node_A_float(conv_11, data_path, "conv11", 512, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
 
         SubStream conv_13(conv_11);
-        conv_13 << get_node_A(conv_11, data_path, "conv12", 1024, PadStrideInfo(2, 2, 1, 1), PadStrideInfo(1, 1, 0, 0));
-        conv_13 << get_node_A(conv_13, data_path, "conv13", 1024, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
+        conv_13 << get_node_A_float(conv_11, data_path, "conv12", 1024, PadStrideInfo(2, 2, 1, 1), PadStrideInfo(1, 1, 0, 0));
+        conv_13 << get_node_A_float(conv_13, data_path, "conv13", 1024, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0));
 
         SubStream conv_14(conv_13);
-        conv_14 << get_node_B(conv_13, data_path, "conv14", 512, PadStrideInfo(1, 1, 0, 0), PadStrideInfo(2, 2, 1, 1));
+        conv_14 << get_node_B_float(conv_13, data_path, "conv14", 512, PadStrideInfo(1, 1, 0, 0), PadStrideInfo(2, 2, 1, 1));
 
         SubStream conv_15(conv_14);
-        conv_15 << get_node_B(conv_14, data_path, "conv15", 256, PadStrideInfo(1, 1, 0, 0), PadStrideInfo(2, 2, 1, 1));
+        conv_15 << get_node_B_float(conv_14, data_path, "conv15", 256, PadStrideInfo(1, 1, 0, 0), PadStrideInfo(2, 2, 1, 1));
 
         SubStream conv_16(conv_15);
-        conv_16 << get_node_B(conv_15, data_path, "conv16", 256, PadStrideInfo(1, 1, 0, 0), PadStrideInfo(2, 2, 1, 1));
+        conv_16 << get_node_B_float(conv_15, data_path, "conv16", 256, PadStrideInfo(1, 1, 0, 0), PadStrideInfo(2, 2, 1, 1));
 
         SubStream conv_17(conv_16);
-        conv_17 << get_node_B(conv_16, data_path, "conv17", 128, PadStrideInfo(1, 1, 0, 0), PadStrideInfo(2, 2, 1, 1));
+        conv_17 << get_node_B_float(conv_16, data_path, "conv17", 128, PadStrideInfo(1, 1, 0, 0), PadStrideInfo(2, 2, 1, 1));
 
         //mbox_loc
         SubStream conv_11_mbox_loc(conv_11);
-        conv_11_mbox_loc << get_node_C(conv_11, data_path, "conv11_mbox_loc", 12, PadStrideInfo(1, 1, 0, 0));
+        conv_11_mbox_loc << get_node_C_float(conv_11, data_path, "conv11_mbox_loc", 12, PadStrideInfo(1, 1, 0, 0));
 
         SubStream conv_13_mbox_loc(conv_13);
-        conv_13_mbox_loc << get_node_C(conv_13, data_path, "conv13_mbox_loc", 24, PadStrideInfo(1, 1, 0, 0));
+        conv_13_mbox_loc << get_node_C_float(conv_13, data_path, "conv13_mbox_loc", 24, PadStrideInfo(1, 1, 0, 0));
 
         SubStream conv_14_2_mbox_loc(conv_14);
-        conv_14_2_mbox_loc << get_node_C(conv_14, data_path, "conv14_2_mbox_loc", 24, PadStrideInfo(1, 1, 0, 0));
+        conv_14_2_mbox_loc << get_node_C_float(conv_14, data_path, "conv14_2_mbox_loc", 24, PadStrideInfo(1, 1, 0, 0));
 
         SubStream conv_15_2_mbox_loc(conv_15);
-        conv_15_2_mbox_loc << get_node_C(conv_15, data_path, "conv15_2_mbox_loc", 24, PadStrideInfo(1, 1, 0, 0));
+        conv_15_2_mbox_loc << get_node_C_float(conv_15, data_path, "conv15_2_mbox_loc", 24, PadStrideInfo(1, 1, 0, 0));
 
         SubStream conv_16_2_mbox_loc(conv_16);
-        conv_16_2_mbox_loc << get_node_C(conv_16, data_path, "conv16_2_mbox_loc", 24, PadStrideInfo(1, 1, 0, 0));
+        conv_16_2_mbox_loc << get_node_C_float(conv_16, data_path, "conv16_2_mbox_loc", 24, PadStrideInfo(1, 1, 0, 0));
 
         SubStream conv_17_2_mbox_loc(conv_17);
-        conv_17_2_mbox_loc << get_node_C(conv_17, data_path, "conv17_2_mbox_loc", 24, PadStrideInfo(1, 1, 0, 0));
+        conv_17_2_mbox_loc << get_node_C_float(conv_17, data_path, "conv17_2_mbox_loc", 24, PadStrideInfo(1, 1, 0, 0));
 
         SubStream mbox_loc(graph);
         mbox_loc << ConcatLayer(std::move(conv_11_mbox_loc), std::move(conv_13_mbox_loc), conv_14_2_mbox_loc, std::move(conv_15_2_mbox_loc),
@@ -161,22 +299,22 @@
 
         //mbox_conf
         SubStream conv_11_mbox_conf(conv_11);
-        conv_11_mbox_conf << get_node_C(conv_11, data_path, "conv11_mbox_conf", 63, PadStrideInfo(1, 1, 0, 0));
+        conv_11_mbox_conf << get_node_C_float(conv_11, data_path, "conv11_mbox_conf", 63, PadStrideInfo(1, 1, 0, 0));
 
         SubStream conv_13_mbox_conf(conv_13);
-        conv_13_mbox_conf << get_node_C(conv_13, data_path, "conv13_mbox_conf", 126, PadStrideInfo(1, 1, 0, 0));
+        conv_13_mbox_conf << get_node_C_float(conv_13, data_path, "conv13_mbox_conf", 126, PadStrideInfo(1, 1, 0, 0));
 
         SubStream conv_14_2_mbox_conf(conv_14);
-        conv_14_2_mbox_conf << get_node_C(conv_14, data_path, "conv14_2_mbox_conf", 126, PadStrideInfo(1, 1, 0, 0));
+        conv_14_2_mbox_conf << get_node_C_float(conv_14, data_path, "conv14_2_mbox_conf", 126, PadStrideInfo(1, 1, 0, 0));
 
         SubStream conv_15_2_mbox_conf(conv_15);
-        conv_15_2_mbox_conf << get_node_C(conv_15, data_path, "conv15_2_mbox_conf", 126, PadStrideInfo(1, 1, 0, 0));
+        conv_15_2_mbox_conf << get_node_C_float(conv_15, data_path, "conv15_2_mbox_conf", 126, PadStrideInfo(1, 1, 0, 0));
 
         SubStream conv_16_2_mbox_conf(conv_16);
-        conv_16_2_mbox_conf << get_node_C(conv_16, data_path, "conv16_2_mbox_conf", 126, PadStrideInfo(1, 1, 0, 0));
+        conv_16_2_mbox_conf << get_node_C_float(conv_16, data_path, "conv16_2_mbox_conf", 126, PadStrideInfo(1, 1, 0, 0));
 
         SubStream conv_17_2_mbox_conf(conv_17);
-        conv_17_2_mbox_conf << get_node_C(conv_17, data_path, "conv17_2_mbox_conf", 126, PadStrideInfo(1, 1, 0, 0));
+        conv_17_2_mbox_conf << get_node_C_float(conv_17, data_path, "conv17_2_mbox_conf", 126, PadStrideInfo(1, 1, 0, 0));
 
         SubStream mbox_conf(graph);
         mbox_conf << ConcatLayer(std::move(conv_11_mbox_conf), std::move(conv_13_mbox_conf), std::move(conv_14_2_mbox_conf),
@@ -224,7 +362,8 @@
         SubStream mbox_priorbox(graph);
 
         mbox_priorbox << ConcatLayer(
-                          (common_params.data_layout == DataLayout::NCHW) ? DataLayoutDimension::WIDTH : DataLayoutDimension::CHANNEL,
+                          (common_params.data_layout == DataLayout::NCHW) ? arm_compute::graph::descriptors::ConcatLayerDescriptor(DataLayoutDimension::WIDTH) : arm_compute::graph::descriptors::ConcatLayerDescriptor(
+                              DataLayoutDimension::CHANNEL),
                           std::move(conv_11_mbox_priorbox), std::move(conv_13_mbox_priorbox), std::move(conv_14_2_mbox_priorbox),
                           std::move(conv_15_2_mbox_priorbox), std::move(conv_16_2_mbox_priorbox), std::move(conv_17_2_mbox_priorbox));
 
@@ -240,35 +379,13 @@
         SubStream detection_ouput(mbox_loc);
         detection_ouput << DetectionOutputLayer(std::move(mbox_conf), std::move(mbox_priorbox),
                                                 DetectionOutputLayerInfo(num_classes, share_location, detection_type, keep_top_k, nms_threshold, top_k, label_id_background, conf_thrs));
-        detection_ouput << OutputLayer(get_detection_output_accessor(common_params, { tensor_shape }));
-
-        // Finalize graph
-        GraphConfig config;
-        config.num_threads = common_params.threads;
-        config.use_tuner   = common_params.enable_tuner;
-        config.tuner_mode  = common_params.tuner_mode;
-        config.tuner_file  = common_params.tuner_file;
-
-        graph.finalize(common_params.target, config);
-
-        return true;
-    }
-    void do_run() override
-    {
-        // Run graph
-        graph.run();
+        detection_ouput << OutputLayer(get_detection_output_accessor(common_params, { input_descriptor.shape }));
     }
 
-private:
-    CommandLineParser  cmd_parser;
-    CommonGraphOptions common_opts;
-    SimpleOption<int> *keep_topk_opt{ nullptr };
-    CommonGraphParams  common_params;
-    Stream             graph;
-
-    ConcatLayer get_node_A(IStream &master_graph, const std::string &data_path, std::string &&param_path,
-                           unsigned int  conv_filt,
-                           PadStrideInfo dwc_pad_stride_info, PadStrideInfo conv_pad_stride_info)
+    ConcatLayer get_node_A_qasymm(IStream &master_graph, const std::string &data_path, std::string &&param_path,
+                                  unsigned int  conv_filt,
+                                  PadStrideInfo dwc_pad_stride_info, PadStrideInfo conv_pad_stride_info,
+                                  std::pair<QuantizationInfo, QuantizationInfo> depth_quant_info, std::pair<QuantizationInfo, QuantizationInfo> point_quant_info)
     {
         const std::string total_path = param_path + "_";
         SubStream         sg(master_graph);
@@ -276,70 +393,52 @@
         sg << DepthwiseConvolutionLayer(
                3U, 3U,
                get_weights_accessor(data_path, total_path + "dw_w.npy"),
-               std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
-               dwc_pad_stride_info)
+               get_weights_accessor(data_path, total_path + "dw_b.npy"),
+               dwc_pad_stride_info, 1, depth_quant_info.first, depth_quant_info.second)
            .set_name(param_path + "/dw")
-           << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "dw_bn_mean.npy"),
-                                      get_weights_accessor(data_path, total_path + "dw_bn_var.npy"),
-                                      get_weights_accessor(data_path, total_path + "dw_scale_w.npy"),
-                                      get_weights_accessor(data_path, total_path + "dw_scale_b.npy"), 0.00001f)
-           .set_name(param_path + "/dw/bn")
-           << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name(param_path + "dw/relu")
+           << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::BOUNDED_RELU, 6.f)).set_name(param_path + "/dw/relu6");
 
-           << ConvolutionLayer(
+        sg << ConvolutionLayer(
                1U, 1U, conv_filt,
                get_weights_accessor(data_path, total_path + "w.npy"),
-               std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
-               conv_pad_stride_info)
+               get_weights_accessor(data_path, total_path + "b.npy"),
+               conv_pad_stride_info, 1, point_quant_info.first, point_quant_info.second)
            .set_name(param_path + "/pw")
-           << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "bn_mean.npy"),
-                                      get_weights_accessor(data_path, total_path + "bn_var.npy"),
-                                      get_weights_accessor(data_path, total_path + "scale_w.npy"),
-                                      get_weights_accessor(data_path, total_path + "scale_b.npy"), 0.00001f)
-           .set_name(param_path + "/pw/bn")
-           << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name(param_path + "pw/relu");
+           << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::BOUNDED_RELU, 6.f)).set_name(param_path + "/pw/relu6");
 
         return ConcatLayer(std::move(sg));
     }
 
-    ConcatLayer get_node_B(IStream &master_graph, const std::string &data_path, std::string &&param_path,
-                           unsigned int  conv_filt,
-                           PadStrideInfo conv_pad_stride_info_1, PadStrideInfo conv_pad_stride_info_2)
+    ConcatLayer get_node_B_qasymm(IStream &master_graph, const std::string &data_path, std::string &&param_path,
+                                  unsigned int  conv_filt,
+                                  PadStrideInfo conv_pad_stride_info_1x1, PadStrideInfo conv_pad_stride_info_3x3,
+                                  const std::pair<QuantizationInfo, QuantizationInfo> quant_info_1x1, const std::pair<QuantizationInfo, QuantizationInfo> quant_info_3x3)
     {
         const std::string total_path = param_path + "_";
         SubStream         sg(master_graph);
 
         sg << ConvolutionLayer(
                1, 1, conv_filt / 2,
-               get_weights_accessor(data_path, total_path + "1_w.npy"),
-               std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
-               conv_pad_stride_info_1)
-           .set_name(total_path + "1/conv")
-           << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "1_bn_mean.npy"),
-                                      get_weights_accessor(data_path, total_path + "1_bn_var.npy"),
-                                      get_weights_accessor(data_path, total_path + "1_scale_w.npy"),
-                                      get_weights_accessor(data_path, total_path + "1_scale_b.npy"), 0.00001f)
-           .set_name(total_path + "1/bn")
-           << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name(total_path + "1/relu");
+               get_weights_accessor(data_path, total_path + "1x1_w.npy"),
+               get_weights_accessor(data_path, total_path + "1x1_b.npy"),
+               conv_pad_stride_info_1x1, 1, quant_info_1x1.first, quant_info_1x1.second)
+           .set_name(total_path + "1x1/conv")
+           << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::BOUNDED_RELU, 6.f)).set_name(total_path + "1x1/conv/relu6");
 
         sg << ConvolutionLayer(
                3, 3, conv_filt,
-               get_weights_accessor(data_path, total_path + "2_w.npy"),
-               std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
-               conv_pad_stride_info_2)
-           .set_name(total_path + "2/conv")
-           << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "2_bn_mean.npy"),
-                                      get_weights_accessor(data_path, total_path + "2_bn_var.npy"),
-                                      get_weights_accessor(data_path, total_path + "2_scale_w.npy"),
-                                      get_weights_accessor(data_path, total_path + "2_scale_b.npy"), 0.00001f)
-           .set_name(total_path + "2/bn")
-           << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name(total_path + "2/relu");
+               get_weights_accessor(data_path, total_path + "3x3_w.npy"),
+               get_weights_accessor(data_path, total_path + "3x3_b.npy"),
+               conv_pad_stride_info_3x3, 1, quant_info_3x3.first, quant_info_3x3.second)
+           .set_name(total_path + "3x3/conv")
+           << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::BOUNDED_RELU, 6.f)).set_name(total_path + "3x3/conv/relu6");
 
         return ConcatLayer(std::move(sg));
     }
 
-    ConcatLayer get_node_C(IStream &master_graph, const std::string &data_path, std::string &&param_path,
-                           unsigned int conv_filt, PadStrideInfo conv_pad_stride_info)
+    ConcatLayer get_node_C_qasymm(IStream &master_graph, const std::string &data_path, std::string &&param_path,
+                                  unsigned int conv_filt, PadStrideInfo               conv_pad_stride_info,
+                                  const std::pair<QuantizationInfo, QuantizationInfo> quant_info, TensorShape reshape_shape)
     {
         const std::string total_path = param_path + "_";
         SubStream         sg(master_graph);
@@ -347,16 +446,257 @@
                1U, 1U, conv_filt,
                get_weights_accessor(data_path, total_path + "w.npy"),
                get_weights_accessor(data_path, total_path + "b.npy"),
-               conv_pad_stride_info)
+               conv_pad_stride_info, 1, quant_info.first, quant_info.second)
            .set_name(param_path + "/conv");
         if(common_params.data_layout == DataLayout::NCHW)
         {
-            sg << PermuteLayer(PermutationVector(2U, 0U, 1U), DataLayout::NHWC).set_name(param_path + "/perm");
+            sg << PermuteLayer(PermutationVector(2U, 0U, 1U), DataLayout::NHWC);
         }
-        sg << FlattenLayer().set_name(param_path + "/flat");
+        sg << ReshapeLayer(reshape_shape).set_name(param_path + "/reshape");
 
         return ConcatLayer(std::move(sg));
     }
+
+    void create_graph_qasymm(TensorDescriptor &input_descriptor)
+    {
+        // Get trainable parameters data path
+        std::string data_path = common_params.data_path;
+
+        // Add model path to data path
+        if(!data_path.empty())
+        {
+            data_path += "/cnn_data/ssd_mobilenet_qasymm8_model/";
+        }
+
+        // Quantization info are saved as pair for each (pointwise/depthwise) convolution layer: <weight_quant_info, output_quant_info>
+        const std::vector<std::pair<QuantizationInfo, QuantizationInfo>> conv_quant_info =
+        {
+            { QuantizationInfo(0.03624850884079933f, 163), QuantizationInfo(0.22219789028167725f, 113) },   // conv0
+            { QuantizationInfo(0.0028752065263688564f, 113), QuantizationInfo(0.05433657020330429f, 128) }, // conv13_2_1_1
+            { QuantizationInfo(0.0014862528769299388f, 125), QuantizationInfo(0.05037643015384674f, 131) }, // conv13_2_3_3
+            { QuantizationInfo(0.00233650766313076f, 113), QuantizationInfo(0.04468846693634987f, 126) },   // conv13_3_1_1
+            { QuantizationInfo(0.002501056529581547f, 120), QuantizationInfo(0.06026708707213402f, 111) },  // conv13_3_3_3
+            { QuantizationInfo(0.002896666992455721f, 121), QuantizationInfo(0.037775348871946335f, 117) }, // conv13_4_1_1
+            { QuantizationInfo(0.0023875406477600336f, 122), QuantizationInfo(0.03881589323282242f, 108) }, // conv13_4_3_3
+            { QuantizationInfo(0.0022081052884459496f, 77), QuantizationInfo(0.025450613349676132f, 125) }, // conv13_5_1_1
+            { QuantizationInfo(0.00604657270014286f, 121), QuantizationInfo(0.033533502370119095f, 109) }   // conv13_5_3_3
+        };
+
+        const std::vector<std::pair<QuantizationInfo, QuantizationInfo>> depth_quant_info =
+        {
+            { QuantizationInfo(0.03408717364072f, 131), QuantizationInfo(0.29286590218544006f, 108) },     // dwsc1
+            { QuantizationInfo(0.027518004179000854f, 107), QuantizationInfo(0.20796941220760345, 117) },  // dwsc2
+            { QuantizationInfo(0.052489638328552246f, 85), QuantizationInfo(0.4303881824016571f, 142) },   // dwsc3
+            { QuantizationInfo(0.016570359468460083f, 79), QuantizationInfo(0.10512150079011917f, 116) },  // dwsc4
+            { QuantizationInfo(0.060739465057849884f, 65), QuantizationInfo(0.15331414341926575f, 94) },   // dwsc5
+            { QuantizationInfo(0.01324534136801958f, 124), QuantizationInfo(0.13010895252227783f, 153) },  // dwsc6
+            { QuantizationInfo(0.032326459884643555f, 124), QuantizationInfo(0.11565316468477249, 156) },  // dwsc7
+            { QuantizationInfo(0.029948478564620018f, 155), QuantizationInfo(0.11413891613483429f, 146) }, // dwsc8
+            { QuantizationInfo(0.028054025024175644f, 129), QuantizationInfo(0.1142905130982399f, 140) },  // dwsc9
+            { QuantizationInfo(0.025204822421073914f, 129), QuantizationInfo(0.14668069779872894f, 149) }, // dwsc10
+            { QuantizationInfo(0.019332280382514f, 110), QuantizationInfo(0.1480235457420349f, 91) },      // dwsc11
+            { QuantizationInfo(0.0319712869822979f, 88), QuantizationInfo(0.10424695909023285f, 117) },    // dwsc12
+            { QuantizationInfo(0.04378943517804146f, 164), QuantizationInfo(0.23176774382591248f, 138) }   // dwsc13
+        };
+
+        const std::vector<std::pair<QuantizationInfo, QuantizationInfo>> point_quant_info =
+        {
+            { QuantizationInfo(0.028777318075299263f, 144), QuantizationInfo(0.2663874328136444f, 121) },  // pw1
+            { QuantizationInfo(0.015796702355146408f, 127), QuantizationInfo(0.1739964485168457f, 111) },  // pw2
+            { QuantizationInfo(0.009349990636110306f, 127), QuantizationInfo(0.1805974692106247f, 104) },  // pw3
+            { QuantizationInfo(0.012920888140797615f, 106), QuantizationInfo(0.1205204650759697f, 100) },  // pw4
+            { QuantizationInfo(0.008119508624076843f, 145), QuantizationInfo(0.12272439152002335f, 97) },  // pw5
+            { QuantizationInfo(0.0070041813887655735f, 115), QuantizationInfo(0.0947074219584465f, 101) }, // pw6
+            { QuantizationInfo(0.004827278666198254f, 115), QuantizationInfo(0.0842885747551918f, 110) },  // pw7
+            { QuantizationInfo(0.004755120258778334f, 128), QuantizationInfo(0.08283159881830215f, 116) }, // pw8
+            { QuantizationInfo(0.007527193054556847f, 142), QuantizationInfo(0.12555131316184998f, 137) }, // pw9
+            { QuantizationInfo(0.006050156895071268f, 109), QuantizationInfo(0.10871313512325287f, 124) }, // pw10
+            { QuantizationInfo(0.00490700313821435f, 127), QuantizationInfo(0.10364262014627457f, 140) },  // pw11
+            { QuantizationInfo(0.006063731852918863, 124), QuantizationInfo(0.11241862177848816f, 125) },  // pw12
+            { QuantizationInfo(0.007901716977357864f, 139), QuantizationInfo(0.49889302253723145f, 141) }  // pw13
+        };
+
+        // Quantization info taken from the TfLite SSD MobileNet example
+        const QuantizationInfo in_quant_info = QuantizationInfo(0.0078125f, 128);
+
+        // Create core graph
+        graph << InputLayer(input_descriptor.set_quantization_info(in_quant_info),
+                            get_weights_accessor(data_path, common_params.image, DataLayout::NHWC));
+        graph << ConvolutionLayer(
+                  3U, 3U, 32U,
+                  get_weights_accessor(data_path, "conv0_w.npy"),
+                  get_weights_accessor(data_path, "conv0_b.npy"),
+                  PadStrideInfo(2U, 2U, 0U, 1U, 0U, 1U, DimensionRoundingType::CEIL), 1, conv_quant_info.at(0).first, conv_quant_info.at(0).second)
+              .set_name("conv0");
+        graph << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::BOUNDED_RELU, 6.f)).set_name("conv0/relu");
+        graph << get_node_A_qasymm(graph, data_path, "conv1", 64U, PadStrideInfo(1U, 1U, 1U, 1U, 1U, 1U, DimensionRoundingType::CEIL), PadStrideInfo(1U, 1U, 0U, 0U), depth_quant_info.at(0),
+                                   point_quant_info.at(0));
+        graph << get_node_A_qasymm(graph, data_path, "conv2", 128U, PadStrideInfo(2U, 2U, 0U, 1U, 0U, 1U, DimensionRoundingType::CEIL), PadStrideInfo(1U, 1U, 0U, 0U), depth_quant_info.at(1),
+                                   point_quant_info.at(1));
+        graph << get_node_A_qasymm(graph, data_path, "conv3", 128U, PadStrideInfo(1U, 1U, 1U, 1U, 1U, 1U, DimensionRoundingType::CEIL), PadStrideInfo(1U, 1U, 0U, 0U), depth_quant_info.at(2),
+                                   point_quant_info.at(2));
+        graph << get_node_A_qasymm(graph, data_path, "conv4", 256U, PadStrideInfo(2U, 2U, 1U, 1U, 1U, 1U, DimensionRoundingType::CEIL), PadStrideInfo(1U, 1U, 0U, 0U), depth_quant_info.at(3),
+                                   point_quant_info.at(3));
+        graph << get_node_A_qasymm(graph, data_path, "conv5", 256U, PadStrideInfo(1U, 1U, 1U, 1U, 1U, 1U, DimensionRoundingType::CEIL), PadStrideInfo(1U, 1U, 0U, 0U), depth_quant_info.at(4),
+                                   point_quant_info.at(4));
+        graph << get_node_A_qasymm(graph, data_path, "conv6", 512U, PadStrideInfo(2U, 2U, 0U, 1U, 0U, 1U, DimensionRoundingType::CEIL), PadStrideInfo(1U, 1U, 0U, 0U), depth_quant_info.at(5),
+                                   point_quant_info.at(5));
+        graph << get_node_A_qasymm(graph, data_path, "conv7", 512U, PadStrideInfo(1U, 1U, 1U, 1U, 1U, 1U, DimensionRoundingType::CEIL), PadStrideInfo(1U, 1U, 0U, 0U), depth_quant_info.at(6),
+                                   point_quant_info.at(6));
+        graph << get_node_A_qasymm(graph, data_path, "conv8", 512U, PadStrideInfo(1U, 1U, 1U, 1U, 1U, 1U, DimensionRoundingType::CEIL), PadStrideInfo(1U, 1U, 0U, 0U), depth_quant_info.at(7),
+                                   point_quant_info.at(7));
+        graph << get_node_A_qasymm(graph, data_path, "conv9", 512U, PadStrideInfo(1U, 1U, 1U, 1U, 1U, 1U, DimensionRoundingType::CEIL), PadStrideInfo(1U, 1U, 0U, 0U), depth_quant_info.at(8),
+                                   point_quant_info.at(8));
+        graph << get_node_A_qasymm(graph, data_path, "conv10", 512U, PadStrideInfo(1U, 1U, 1U, 1U, 1U, 1U, DimensionRoundingType::CEIL), PadStrideInfo(1U, 1U, 0U, 0U), depth_quant_info.at(9),
+                                   point_quant_info.at(9));
+        graph << get_node_A_qasymm(graph, data_path, "conv11", 512U, PadStrideInfo(1U, 1U, 1U, 1U, 1U, 1U, DimensionRoundingType::CEIL), PadStrideInfo(1U, 1U, 0U, 0U), depth_quant_info.at(10),
+                                   point_quant_info.at(10));
+
+        SubStream conv_13(graph);
+        conv_13 << get_node_A_qasymm(graph, data_path, "conv12", 1024U, PadStrideInfo(2U, 2U, 1U, 1U, 1U, 1U, DimensionRoundingType::CEIL), PadStrideInfo(1U, 1U, 0U, 0U), depth_quant_info.at(11),
+                                     point_quant_info.at(11));
+        conv_13 << get_node_A_qasymm(conv_13, data_path, "conv13", 1024U, PadStrideInfo(1U, 1U, 1U, 1U, 1U, 1U, DimensionRoundingType::CEIL), PadStrideInfo(1U, 1U, 0U, 0U), depth_quant_info.at(12),
+                                     point_quant_info.at(12));
+        SubStream conv_14(conv_13);
+        conv_14 << get_node_B_qasymm(conv_13, data_path, "conv13_2", 512U, PadStrideInfo(1U, 1U, 0U, 0U), PadStrideInfo(2U, 2U, 0U, 1U, 0U, 1U, DimensionRoundingType::CEIL), conv_quant_info.at(1),
+                                     conv_quant_info.at(2));
+        SubStream conv_15(conv_14);
+        conv_15 << get_node_B_qasymm(conv_14, data_path, "conv13_3", 256U, PadStrideInfo(1U, 1U, 0U, 0U), PadStrideInfo(2U, 2U, 1U, 1U, 1U, 1U, DimensionRoundingType::CEIL), conv_quant_info.at(3),
+                                     conv_quant_info.at(4));
+        SubStream conv_16(conv_15);
+        conv_16 << get_node_B_qasymm(conv_15, data_path, "conv13_4", 256U, PadStrideInfo(1U, 1U, 0U, 0U), PadStrideInfo(2U, 2U, 1U, 1U, 1U, 1U, DimensionRoundingType::CEIL), conv_quant_info.at(5),
+                                     conv_quant_info.at(6));
+        SubStream conv_17(conv_16);
+        conv_17 << get_node_B_qasymm(conv_16, data_path, "conv13_5", 128U, PadStrideInfo(1U, 1U, 0U, 0U), PadStrideInfo(2U, 2U, 0U, 1U, 0U, 1U, DimensionRoundingType::CEIL), conv_quant_info.at(7),
+                                     conv_quant_info.at(8));
+
+        // box_predictor
+        const std::vector<std::pair<QuantizationInfo, QuantizationInfo>> box_enc_pred_quant_info =
+        {
+            { QuantizationInfo(0.005202020984143019f, 136), QuantizationInfo(0.08655580133199692f, 183) },   // boxpredictor0_bep
+            { QuantizationInfo(0.003121797926723957f, 132), QuantizationInfo(0.03218776360154152f, 140) },   // boxpredictor1_bep
+            { QuantizationInfo(0.002995674265548587f, 130), QuantizationInfo(0.029072262346744537f, 125) },  // boxpredictor2_bep
+            { QuantizationInfo(0.0023131705820560455f, 130), QuantizationInfo(0.026488754898309708f, 127) }, // boxpredictor3_bep
+            { QuantizationInfo(0.0013905081432312727f, 132), QuantizationInfo(0.0199890099465847f, 137) },   // boxpredictor4_bep
+            { QuantizationInfo(0.00216794665902853f, 121), QuantizationInfo(0.019798893481492996f, 151) }    // boxpredictor5_bep
+        };
+
+        const std::vector<TensorShape> box_reshape = // NHWC
+        {
+            TensorShape(4U, 1U, 1083U), // boxpredictor0_bep_reshape
+            TensorShape(4U, 1U, 600U),  // boxpredictor1_bep_reshape
+            TensorShape(4U, 1U, 150U),  // boxpredictor2_bep_reshape
+            TensorShape(4U, 1U, 54U),   // boxpredictor3_bep_reshape
+            TensorShape(4U, 1U, 24U),   // boxpredictor4_bep_reshape
+            TensorShape(4U, 1U, 6U)     // boxpredictor5_bep_reshape
+        };
+
+        SubStream conv_11_box_enc_pre(graph);
+        conv_11_box_enc_pre << get_node_C_qasymm(graph, data_path, "BoxPredictor_0_BEP", 12U, PadStrideInfo(1U, 1U, 0U, 0U), box_enc_pred_quant_info.at(0), box_reshape.at(0));
+
+        SubStream conv_13_box_enc_pre(conv_13);
+        conv_13_box_enc_pre << get_node_C_qasymm(conv_13, data_path, "BoxPredictor_1_BEP", 24U, PadStrideInfo(1U, 1U, 0U, 0U), box_enc_pred_quant_info.at(1), box_reshape.at(1));
+
+        SubStream conv_14_2_box_enc_pre(conv_14);
+        conv_14_2_box_enc_pre << get_node_C_qasymm(conv_14, data_path, "BoxPredictor_2_BEP", 24U, PadStrideInfo(1U, 1U, 0U, 0U), box_enc_pred_quant_info.at(2), box_reshape.at(2));
+
+        SubStream conv_15_2_box_enc_pre(conv_15);
+        conv_15_2_box_enc_pre << get_node_C_qasymm(conv_15, data_path, "BoxPredictor_3_BEP", 24U, PadStrideInfo(1U, 1U, 0U, 0U), box_enc_pred_quant_info.at(3), box_reshape.at(3));
+
+        SubStream conv_16_2_box_enc_pre(conv_16);
+        conv_16_2_box_enc_pre << get_node_C_qasymm(conv_16, data_path, "BoxPredictor_4_BEP", 24U, PadStrideInfo(1U, 1U, 0U, 0U), box_enc_pred_quant_info.at(4), box_reshape.at(4));
+
+        SubStream conv_17_2_box_enc_pre(conv_17);
+        conv_17_2_box_enc_pre << get_node_C_qasymm(conv_17, data_path, "BoxPredictor_5_BEP", 24U, PadStrideInfo(1U, 1U, 0U, 0U), box_enc_pred_quant_info.at(5), box_reshape.at(5));
+
+        SubStream              box_enc_pre(graph);
+        const QuantizationInfo bep_concate_qinfo = QuantizationInfo(0.08655580133199692f, 183);
+        box_enc_pre << ConcatLayer(arm_compute::graph::descriptors::ConcatLayerDescriptor(DataLayoutDimension::HEIGHT, bep_concate_qinfo),
+                                   std::move(conv_11_box_enc_pre), std::move(conv_13_box_enc_pre), conv_14_2_box_enc_pre, std::move(conv_15_2_box_enc_pre),
+                                   std::move(conv_16_2_box_enc_pre), std::move(conv_17_2_box_enc_pre))
+                    .set_name("BoxPredictor/concat");
+        box_enc_pre << ReshapeLayer(TensorShape(4U, 1917U)).set_name("BoxPredictor/reshape");
+
+        // class_predictor
+        const std::vector<std::pair<QuantizationInfo, QuantizationInfo>> class_pred_quant_info =
+        {
+            { QuantizationInfo(0.002744135679677129f, 125), QuantizationInfo(0.05746262148022652f, 234) },   // boxpredictor0_cp
+            { QuantizationInfo(0.0024326108396053314f, 80), QuantizationInfo(0.03764628246426582f, 217) },   // boxpredictor1_cp
+            { QuantizationInfo(0.0013898586621508002f, 141), QuantizationInfo(0.034081317484378815f, 214) }, // boxpredictor2_cp
+            { QuantizationInfo(0.0014176908880472183f, 133), QuantizationInfo(0.033889178186655045f, 215) }, // boxpredictor3_cp
+            { QuantizationInfo(0.001090311910957098f, 125), QuantizationInfo(0.02646234817802906f, 230) },   // boxpredictor4_cp
+            { QuantizationInfo(0.001134163816459477f, 115), QuantizationInfo(0.026926767081022263f, 218) }   // boxpredictor5_cp
+        };
+
+        const std::vector<TensorShape> class_reshape =
+        {
+            TensorShape(91U, 1083U), // boxpredictor0_cp_reshape
+            TensorShape(91U, 600U),  // boxpredictor1_cp_reshape
+            TensorShape(91U, 150U),  // boxpredictor2_cp_reshape
+            TensorShape(91U, 54U),   // boxpredictor3_cp_reshape
+            TensorShape(91U, 24U),   // boxpredictor4_cp_reshape
+            TensorShape(91U, 6U)     // boxpredictor5_cp_reshape
+        };
+
+        SubStream conv_11_class_pre(graph);
+        conv_11_class_pre << get_node_C_qasymm(graph, data_path, "BoxPredictor_0_CP", 273U, PadStrideInfo(1U, 1U, 0U, 0U), class_pred_quant_info.at(0), class_reshape.at(0));
+
+        SubStream conv_13_class_pre(conv_13);
+        conv_13_class_pre << get_node_C_qasymm(conv_13, data_path, "BoxPredictor_1_CP", 546U, PadStrideInfo(1U, 1U, 0U, 0U), class_pred_quant_info.at(1), class_reshape.at(1));
+
+        SubStream conv_14_2_class_pre(conv_14);
+        conv_14_2_class_pre << get_node_C_qasymm(conv_14, data_path, "BoxPredictor_2_CP", 546U, PadStrideInfo(1U, 1U, 0U, 0U), class_pred_quant_info.at(2), class_reshape.at(2));
+
+        SubStream conv_15_2_class_pre(conv_15);
+        conv_15_2_class_pre << get_node_C_qasymm(conv_15, data_path, "BoxPredictor_3_CP", 546U, PadStrideInfo(1U, 1U, 0U, 0U), class_pred_quant_info.at(3), class_reshape.at(3));
+
+        SubStream conv_16_2_class_pre(conv_16);
+        conv_16_2_class_pre << get_node_C_qasymm(conv_16, data_path, "BoxPredictor_4_CP", 546U, PadStrideInfo(1U, 1U, 0U, 0U), class_pred_quant_info.at(4), class_reshape.at(4));
+
+        SubStream conv_17_2_class_pre(conv_17);
+        conv_17_2_class_pre << get_node_C_qasymm(conv_17, data_path, "BoxPredictor_5_CP", 546U, PadStrideInfo(1U, 1U, 0U, 0U), class_pred_quant_info.at(5), class_reshape.at(5));
+
+        const QuantizationInfo cp_concate_qinfo = QuantizationInfo(0.0584389753639698f, 230);
+        SubStream              class_pred(graph);
+        class_pred << ConcatLayer(
+                       arm_compute::graph::descriptors::ConcatLayerDescriptor(DataLayoutDimension::WIDTH, cp_concate_qinfo),
+                       std::move(conv_11_class_pre), std::move(conv_13_class_pre), std::move(conv_14_2_class_pre),
+                       std::move(conv_15_2_class_pre), std::move(conv_16_2_class_pre), std::move(conv_17_2_class_pre))
+                   .set_name("ClassPrediction/concat");
+
+        const QuantizationInfo logistic_out_qinfo = QuantizationInfo(0.00390625f, 0);
+        class_pred << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LOGISTIC), logistic_out_qinfo).set_name("ClassPrediction/logistic");
+
+        const int   max_detections            = 10;
+        const int   max_classes_per_detection = 1;
+        const float nms_score_threshold       = 0.30000001192092896f;
+        const float nms_iou_threshold         = 0.6000000238418579f;
+        const int   num_classes               = 90;
+        const float x_scale                   = 10.f;
+        const float y_scale                   = 10.f;
+        const float h_scale                   = 5.f;
+        const float w_scale                   = 5.f;
+        std::array<float, 4> scales = { y_scale, x_scale, w_scale, h_scale };
+        const QuantizationInfo anchors_qinfo = QuantizationInfo(0.006453060545027256f, 0);
+
+        SubStream detection_ouput(box_enc_pre);
+        detection_ouput << DetectionPostProcessLayer(std::move(class_pred),
+                                                     DetectionPostProcessLayerInfo(max_detections, max_classes_per_detection, nms_score_threshold, nms_iou_threshold, num_classes, scales),
+                                                     get_weights_accessor(data_path, "anchors.npy"), anchors_qinfo)
+                        .set_name("DetectionPostProcess");
+
+        SubStream ouput_0(detection_ouput);
+        ouput_0 << OutputLayer(get_npy_output_accessor(detection_boxes_opt->value(), TensorShape(4U, 10U), DataType::F32), 0);
+
+        SubStream ouput_1(detection_ouput);
+        ouput_1 << OutputLayer(get_npy_output_accessor(detection_classes_opt->value(), TensorShape(10U), DataType::F32), 1);
+
+        SubStream ouput_2(detection_ouput);
+        ouput_2 << OutputLayer(get_npy_output_accessor(detection_scores_opt->value(), TensorShape(10U), DataType::F32), 2);
+
+        SubStream ouput_3(detection_ouput);
+        ouput_3 << OutputLayer(get_npy_output_accessor(num_detections_opt->value(), TensorShape(1U), DataType::F32), 3);
+    }
 };
 
 /** Main program for MobileNetSSD
