Example #1
0
    def analyze(self, graph: Graph):
        pattern_instance_counter.counter = 0
        apply_pattern(graph, **YOLO_PATTERN, action=pattern_instance_counter)

        flavor = None
        if pattern_instance_counter.counter > 0:
            if pattern_instance_counter.counter == 22:
                flavor = 'YOLOV2Full'
            elif pattern_instance_counter.counter == 8:
                flavor = 'YOLOV2Tiny'
        if flavor is not None:
            message = "Your model looks like YOLOv1 or YOLOv2 Model.\n" \
                      "To generate the IR, provide TensorFlow YOLOv1 or YOLOv2 Model to the Model Optimizer with the following parameters:\n" \
                      "\t--input_model <path_to_model>/<model_name>.pb\n" \
                      "\t--batch 1\n" \
                      "\t--tensorflow_use_custom_operations_config <PYTHON_SITE_PACKAGES>/openvino/tools/mo/front/tf/<yolo_config>.json\n" \
                      "All detailed information about conversion of this model can be found at\n" \
                      "https://docs.openvino.ai/latest/_docs_MO_DG_prepare_model_convert_model_tf_specific_Convert_YOLO_From_Tensorflow.html"
            return {
                'model_type': {
                    'YOLO': get_YOLO_params_by_flavor(flavor)
                }
            }, message
        else:
            return None, None
Example #2
0
def batch_norm_fuse(graph: Graph):
    apply_pattern(
        graph,
        nodes=[('kernel', dict(kind='data')),
               ('conv', dict(kind='op', op='Conv2D')),
               ('conv_output', dict(kind='data')), ('norm', dict(kind='data')),
               ('mul', dict(kind='op', op='Mul')),
               ('mul_output', dict(kind='data'))],
        edges=[
            ('kernel', 'conv', {
                'in': 1
            }),
            ('conv', 'conv_output'),
            (
                'conv_output', 'mul', {
                    'in': 0
                }
            ),  # TODO get rid of explicit input port number, mul is a commutative op
            (
                'norm', 'mul', {
                    'in': 1
                }
            ),  # TODO get rig of explicit input port number, mul is a commutative op
            ('mul', 'mul_output')
        ],
        action=batch_norm_fuse_action)
    return graph
Example #3
0
    def rename_fqs_in_the_end(self, graph: Graph):
        def change_names(_, match):
            fq_node = match['fq']
            input_node = get_node_input(fq_node, 0)
            new_fq_name = copy(input_node.name)
            if 'orig_node_name' in input_node:
                new_fq_name = copy(input_node['orig_node_name'])

            input_node_outputs = get_all_node_outputs(input_node)
            if len(input_node_outputs) > 1 and all(
                [op.type == 'FakeQuantize' for op in input_node_outputs]):
                new_fq_name += '.{}'.format(
                    fq_node.in_port(0).get_source().idx)

            fq_node['orig_fq_name'] = copy(fq_node.name)

            if 'orig_node_name' not in input_node:
                input_node['orig_node_name'] = copy(input_node.name)
                rename_node(input_node, f'{input_node.name}/pre_fq_input')
            rename_node(fq_node, new_fq_name)

        pattern = get_fq_result_pattern()
        apply_pattern(graph,
                      nodes=pattern['nodes'],
                      edges=pattern['edges'],
                      action=change_names)
Example #4
0
def fuse_pad(graph: Graph):
    for op_type in ['Convolution', 'Pooling', 'Deconvolution']:
        apply_pattern(graph,
                      nodes=[('pad_op', dict(kind='op', op='Pad')),
                             ('pad_output', dict(kind='data')),
                             ('op', dict(kind='op', type=op_type))],
                      edges=[('pad_op', 'pad_output'),
                             ('pad_output', 'op', {
                                 'in': 0
                             })],
                      action=pad_op_transform)
Example #5
0
 def mark_ignored_blocks_(patterns):
     for types_list in patterns:
         for pattern in patterns[types_list]:
             if isinstance(pattern, tuple):
                 pattern, check_pattern_fn = pattern
                 mark_fn = partial(self.mark_block_nodes,
                                   check_pattern_fn)
             else:
                 mark_fn = partial(self.mark_block_nodes, None)
             apply_pattern(graph,
                           nodes=pattern['nodes'],
                           edges=pattern['edges'],
                           action=mark_fn)
Example #6
0
    def analyze(self, graph: Graph):
        pattern_instance_counter.counter = 0
        apply_pattern(graph, **RETINANET_PATTERN, action=pattern_instance_counter)

        if pattern_instance_counter.counter > 0:
            result = dict()
            result['mandatory_parameters'] = {'tensorflow_use_custom_operations_config':
                                                  'openvino/tools/mo/front/tf/retinanet.json'}

            message = "Your model looks like TensorFlow RetinaNet Model.\n" \
                      "To generate the IR, provide model to the Model Optimizer with the following parameters:\n" \
                      "\t--input_model <path_to_model>/<model>.pb\n" \
                      "\t--input_shape [1,600,600,3]\n" \
                      "\t--tensorflow_use_custom_operations_config <OPENVINO_INSTALL_DIR>/tools/model_optimizer/openvino/tools/mo/front/tf/retinanet.json\n" \
                      "\t--reverse_input_channels"

            return {'model_type': {'TF_RetinaNet': result}}, message

        return None, None
Example #7
0
 def find_and_replace_pattern(self, graph: Graph):
     apply_pattern(graph, **self.pattern1(), action=self.replace_pattern)  # pylint: disable=no-member
     apply_pattern(graph, **self.pattern2(), action=self.replace_pattern)  # pylint: disable=no-member
Example #8
0
 def find_and_replace_pattern(self, graph: Graph):
     log.info('Enabled GeLU Merger replacement for approximation with Erf')
     apply_pattern(graph, **self.pattern1(), action=self.replace_gelu)
     apply_pattern(graph, **self.pattern2(), action=self.replace_gelu)
     apply_pattern(graph, **self.pattern3(), action=self.replace_gelu)
Example #9
0
 def find_and_replace_pattern(self, graph: Graph):
     log.info('Enabled LayerNorm pattern recognition')
     apply_pattern(graph, **self.pattern1(), action=self.replace_layer_norm)
     apply_pattern(graph, **self.pattern2(), action=self.replace_layer_norm)
Example #10
0
 def find_and_replace_pattern(self, graph: Graph):
     apply_pattern(graph, action=self.replace_sub_graph, **self.pattern())