mirror of
https://github.com/PaddlePaddle/FastDeploy.git
synced 2025-10-06 17:17:14 +08:00

* Add notes for tensors * Optimize some apis * move some warnings * Support build with Paddle2ONNX * Add protobuf support * Fix compile on mac * add clearn package script * Add paddle2onnx code * remove submodule * Add onnx ocde * remove softlink * add onnx code * fix error * Add cmake file * fix patchelf * update paddle2onnx * Delete .gitmodules --------- Co-authored-by: PaddleCI <paddle_ci@example.com> Co-authored-by: pangyoki <pangyoki@126.com> Co-authored-by: jiangjiajun <jiangjiajun@baidu.lcom>
126 lines
4.9 KiB
Python
126 lines
4.9 KiB
Python
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
from __future__ import absolute_import
|
|
|
|
import math
|
|
import numpy as np
|
|
from paddle2onnx.legacy.constant import dtypes
|
|
from paddle2onnx.legacy.op_mapper import OpMapper as op_mapper
|
|
from paddle2onnx.utils import require_fixed_shape
|
|
|
|
|
|
@op_mapper('density_prior_box')
|
|
class DensityPriorBox():
|
|
"""
|
|
In this function, use the attribute to get the prior box, because we do not use
|
|
the image data and feature map, wo could the python code to create the varaible,
|
|
and to create the onnx tensor as output.
|
|
"""
|
|
support_opset_verison_range = (1, 12)
|
|
|
|
@classmethod
|
|
def opset_9(cls, graph, node, **kw):
|
|
clip = bool(node.attr('clip'))
|
|
densities = node.attr('densities')
|
|
fixed_ratios = node.attr('fixed_ratios')
|
|
fixed_sizes = node.attr('fixed_sizes')
|
|
flatten_to_2d = bool(node.attr('flatten_to_2d'))
|
|
offset = node.attr('offset')
|
|
step_h = node.attr('step_h')
|
|
step_w = node.attr('step_w')
|
|
variances = node.attr('variances')
|
|
|
|
input_shape = node.input_shape('Input', 0)
|
|
image_shape = node.input_shape('Image', 0)
|
|
|
|
img_width = image_shape[3]
|
|
img_height = image_shape[2]
|
|
feature_width = input_shape[3]
|
|
feature_height = input_shape[2]
|
|
|
|
assert img_width > 0 and img_height > 0, require_fixed_shape(
|
|
cls.__name__)
|
|
|
|
if step_w == 0.0 or step_h == 0.0:
|
|
step_w = float(img_width / feature_width)
|
|
step_h = float(img_height / feature_height)
|
|
|
|
num_priors = 0
|
|
if len(fixed_sizes) > 0 and len(densities) > 0:
|
|
for density in densities:
|
|
if len(fixed_ratios) > 0:
|
|
num_priors += len(fixed_ratios) * (pow(density, 2))
|
|
|
|
out_dim = (feature_height, feature_width, num_priors, 4)
|
|
out_boxes = np.zeros(out_dim).astype('float32')
|
|
out_var = np.zeros(out_dim).astype('float32')
|
|
step_average = int((step_w + step_h) * 0.5)
|
|
|
|
for h in range(feature_height):
|
|
for w in range(feature_width):
|
|
c_x = (w + offset) * step_w
|
|
c_y = (h + offset) * step_h
|
|
idx = 0
|
|
|
|
for density, fixed_size in zip(densities, fixed_sizes):
|
|
if (len(fixed_ratios) > 0):
|
|
for ar in fixed_ratios:
|
|
shift = int(step_average / density)
|
|
box_width_ratio = fixed_size * math.sqrt(ar)
|
|
box_height_ratio = fixed_size / math.sqrt(ar)
|
|
for di in range(density):
|
|
for dj in range(density):
|
|
c_x_temp = c_x - step_average / 2.0 + shift / 2.0 + dj * shift
|
|
c_y_temp = c_y - step_average / 2.0 + shift / 2.0 + di * shift
|
|
out_boxes[h, w, idx, :] = [
|
|
max((c_x_temp - box_width_ratio / 2.0) /
|
|
img_width, 0),
|
|
max((c_y_temp - box_height_ratio / 2.0)
|
|
/ img_height, 0),
|
|
min((c_x_temp + box_width_ratio / 2.0) /
|
|
img_width, 1),
|
|
min((c_y_temp + box_height_ratio / 2.0)
|
|
/ img_height, 1)
|
|
]
|
|
idx += 1
|
|
|
|
if clip:
|
|
out_boxes = np.clip(out_boxes, 0.0, 1.0)
|
|
# set the variance.
|
|
out_var = np.tile(variances,
|
|
(feature_height, feature_width, num_priors, 1))
|
|
|
|
if flatten_to_2d:
|
|
out_boxes = out_boxes.reshape((-1, 4))
|
|
out_var = out_var.reshape((-1, 4))
|
|
|
|
#make node that
|
|
|
|
node_boxes = graph.make_node(
|
|
'Constant',
|
|
inputs=[],
|
|
outputs=node.output('Boxes'),
|
|
dtype=dtypes.ONNX.FLOAT,
|
|
dims=out_boxes.shape,
|
|
value=out_boxes.flatten().tolist())
|
|
|
|
node_vars = graph.make_node(
|
|
'Constant',
|
|
inputs=[],
|
|
outputs=node.output('Variances'),
|
|
dtype=dtypes.ONNX.FLOAT,
|
|
dims=out_var.shape,
|
|
value=out_var.flatten().tolist())
|