| 837 | } |
| 838 | |
| 839 | NodeID GraphBuilder::add_yolo_node(Graph &g, NodeParams params, NodeIdxPair input, ActivationLayerInfo act_info) |
| 840 | { |
| 841 | check_nodeidx_pair(input, g); |
| 842 | |
| 843 | // Get input tensor descriptor |
| 844 | const TensorDescriptor input_tensor_desc = get_tensor_descriptor(g, g.node(input.node_id)->outputs()[0]); |
| 845 | const bool is_nhwc = input_tensor_desc.layout == DataLayout::NHWC; |
| 846 | |
| 847 | // Box format: [Objectness:1][Box:4][Classes:N] |
| 848 | |
| 849 | // Activate objectness and front part of the box |
| 850 | const Coordinates box_start(0, 0, 0); |
| 851 | const Coordinates box_end = is_nhwc ? Coordinates(3, -1, -1) : Coordinates(-1, -1, 3); |
| 852 | NodeID box = g.add_node<SliceLayerNode>(box_start, box_end); |
| 853 | NodeID act_box = g.add_node<ActivationLayerNode>(act_info); |
| 854 | set_node_params(g, box, params); |
| 855 | set_node_params(g, act_box, params); |
| 856 | g.add_connection(input.node_id, input.index, box, 0); |
| 857 | g.add_connection(box, 0, act_box, 0); |
| 858 | |
| 859 | // Immutable part |
| 860 | const Coordinates imm_start = is_nhwc ? Coordinates(3, 0, 0) : Coordinates(0, 0, 3); |
| 861 | const Coordinates imm_end = is_nhwc ? Coordinates(5, -1, -1) : Coordinates(-1, -1, 5); |
| 862 | NodeID imm = g.add_node<SliceLayerNode>(imm_start, imm_end); |
| 863 | set_node_params(g, imm, params); |
| 864 | g.add_connection(input.node_id, input.index, imm, 0); |
| 865 | |
| 866 | // Activation classes and end part of box |
| 867 | const Coordinates cls_start = is_nhwc ? Coordinates(5, 0, 0) : Coordinates(0, 0, 5); |
| 868 | const Coordinates cls_end = Coordinates(-1, -1, -1); |
| 869 | NodeID cls = g.add_node<SliceLayerNode>(cls_start, cls_end); |
| 870 | NodeID cls_act = g.add_node<ActivationLayerNode>(act_info); |
| 871 | set_node_params(g, cls, params); |
| 872 | set_node_params(g, cls_act, params); |
| 873 | g.add_connection(input.node_id, input.index, cls, 0); |
| 874 | g.add_connection(cls, 0, cls_act, 0); |
| 875 | |
| 876 | NodeID concat = |
| 877 | g.add_node<ConcatenateLayerNode>(3, descriptors::ConcatLayerDescriptor(DataLayoutDimension::CHANNEL)); |
| 878 | set_node_params(g, concat, params); |
| 879 | g.add_connection(act_box, 0, concat, 0); |
| 880 | g.add_connection(imm, 0, concat, 1); |
| 881 | g.add_connection(cls_act, 0, concat, 2); |
| 882 | |
| 883 | return concat; |
| 884 | } |
| 885 | } // namespace graph |
| 886 | } // namespace arm_compute |
nothing calls this directly
no test coverage detected