未验证 提交 9da6f332 编写于 作者: W wangguanzhong 提交者: GitHub

[cherry-pick] add version check (#750)

* cherry-pick add_version_check

* add python version for cornerpool
上级 5a44480f
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
**注意:** **注意:**
- 模型FPS在Tesla V100单卡环境中通过tools/eval.py进行测试 - 模型FPS在Tesla V100单卡环境中通过tools/eval.py进行测试
- CornerNet-Squeeze要求使用PaddlePaddle1.8及以上版本或适当的develop版本
- CornerNet-Squeeze中使用ResNet结构的骨干网络时,加入了FPN结构,骨干网络的输出feature map采用FPN中的P3层输出。 - CornerNet-Squeeze中使用ResNet结构的骨干网络时,加入了FPN结构,骨干网络的输出feature map采用FPN中的P3层输出。
- \*CornerNet-Squeeze-dcn-mixup-cosine是基于原版CornerNet-Squeeze优化效果最好的模型,在ResNet的骨干网络基础上增加mixup预处理和使用cosine_decay - \*CornerNet-Squeeze-dcn-mixup-cosine是基于原版CornerNet-Squeeze优化效果最好的模型,在ResNet的骨干网络基础上增加mixup预处理和使用cosine_decay
- FCOS使用GIoU loss、用location分支预测centerness、左上右下角点偏移量归一化和ground truth中心匹配策略 - FCOS使用GIoU loss、用location分支预测centerness、左上右下角点偏移量归一化和ground truth中心匹配策略
......
import os import os
import paddle.fluid as fluid import paddle.fluid as fluid
use_cpp = False
file_dir = os.path.dirname(os.path.abspath(__file__)) file_dir = os.path.dirname(os.path.abspath(__file__))
fluid.load_op_library(os.path.join(file_dir, 'src/cornerpool_lib.so')) try:
fluid.load_op_library(os.path.join(file_dir, 'src/cornerpool_lib.so'))
use_cpp = True
except:
print(
'Warning: cornerpool_lib.so not found, use python version instead which may drop the inference speed. Compile in ppdet/ext_op at first if you need cpp version.'
)
from paddle.fluid.layer_helper import LayerHelper from paddle.fluid.layer_helper import LayerHelper
...@@ -14,6 +22,19 @@ __all__ = [ ...@@ -14,6 +22,19 @@ __all__ = [
] ]
def cornerpool_op(layer_type, input, name):
helper = LayerHelper(layer_type, input=input, name=name)
dtype = helper.input_dtype()
output = helper.create_variable_for_type_inference(dtype)
max_map = helper.create_variable_for_type_inference(dtype)
helper.append_op(
type=layer_type,
inputs={"X": input},
outputs={"Output": output,
"MaxMap": max_map})
return output
def bottom_pool(input, is_test=False, name=None): def bottom_pool(input, is_test=False, name=None):
""" """
This layer calculates the bottom pooling output based on the input. This layer calculates the bottom pooling output based on the input.
...@@ -34,16 +55,28 @@ def bottom_pool(input, is_test=False, name=None): ...@@ -34,16 +55,28 @@ def bottom_pool(input, is_test=False, name=None):
output = corner_pool.bottom_pool(input) output = corner_pool.bottom_pool(input)
""" """
if is_test: if is_test:
helper = LayerHelper('bottom_pool', **locals()) if use_cpp:
dtype = helper.input_dtype() output = cornerpool_op("bottom_pool", input, name)
output = helper.create_variable_for_type_inference(dtype) return output
max_map = helper.create_variable_for_type_inference(dtype)
helper.append_op( def cond(i, output):
type="bottom_pool", return i < H
inputs={"X": input},
outputs={"Output": output, def body(i, output):
"MaxMap": max_map}) cur = fluid.layers.slice(output, [2], [i], [H])
return output next = fluid.layers.slice(output, [2], [0], [H - i])
max_v = fluid.layers.elementwise_max(cur, next)
orig = fluid.layers.slice(output, [2], [0], [i])
output = fluid.layers.concat([orig, max_v], axis=2)
i = i * 2
return [i, output]
H = fluid.layers.shape(input)[2]
i = fluid.layers.fill_constant(shape=[1], dtype='int32', value=1)
output = input
output = fluid.layers.while_loop(cond, body, [i, output])
return output[-1]
H = input.shape[2] H = input.shape[2]
i = 1 i = 1
output = input output = input
...@@ -77,16 +110,27 @@ def top_pool(input, is_test=False, name=None): ...@@ -77,16 +110,27 @@ def top_pool(input, is_test=False, name=None):
output = corner_pool.top_pool(input) output = corner_pool.top_pool(input)
""" """
if is_test: if is_test:
helper = LayerHelper('top_pool', **locals()) if use_cpp:
dtype = helper.input_dtype() output = cornerpool_op("top_pool", input, name)
output = helper.create_variable_for_type_inference(dtype) return output
max_map = helper.create_variable_for_type_inference(dtype)
helper.append_op( def cond(i, output):
type="top_pool", return i < H
inputs={"X": input},
outputs={"Output": output, def body(i, output):
"MaxMap": max_map}) cur = fluid.layers.slice(output, [2], [0], [H - i])
return output next = fluid.layers.slice(output, [2], [i], [H])
max_v = fluid.layers.elementwise_max(cur, next)
orig = fluid.layers.slice(output, [2], [H - i], [H])
output = fluid.layers.concat([max_v, orig], axis=2)
i = i * 2
return [i, output]
H = fluid.layers.shape(input)[2]
i = fluid.layers.fill_constant(shape=[1], dtype='int32', value=1)
output = input
output = fluid.layers.while_loop(cond, body, [i, output])
return output[-1]
H = input.shape[2] H = input.shape[2]
i = 1 i = 1
...@@ -121,16 +165,27 @@ def right_pool(input, is_test=False, name=None): ...@@ -121,16 +165,27 @@ def right_pool(input, is_test=False, name=None):
output = corner_pool.right_pool(input) output = corner_pool.right_pool(input)
""" """
if is_test: if is_test:
helper = LayerHelper('right_pool', **locals()) if use_cpp:
dtype = helper.input_dtype() output = cornerpool_op("right_pool", input, name)
output = helper.create_variable_for_type_inference(dtype) return output
max_map = helper.create_variable_for_type_inference(dtype)
helper.append_op( def cond(i, output):
type="right_pool", return i < W
inputs={"X": input},
outputs={"Output": output, def body(i, output):
"MaxMap": max_map}) cur = fluid.layers.slice(output, [3], [i], [W])
return output next = fluid.layers.slice(output, [3], [0], [W - i])
max_v = fluid.layers.elementwise_max(cur, next)
orig = fluid.layers.slice(output, [3], [0], [i])
output = fluid.layers.concat([orig, max_v], axis=-1)
i = i * 2
return [i, output]
W = fluid.layers.shape(input)[3]
i = fluid.layers.fill_constant(shape=[1], dtype='int32', value=1)
output = input
output = fluid.layers.while_loop(cond, body, [i, output])
return output[-1]
W = input.shape[3] W = input.shape[3]
i = 1 i = 1
...@@ -165,16 +220,27 @@ def left_pool(input, is_test=False, name=None): ...@@ -165,16 +220,27 @@ def left_pool(input, is_test=False, name=None):
output = corner_pool.left_pool(input) output = corner_pool.left_pool(input)
""" """
if is_test: if is_test:
helper = LayerHelper('left_pool', **locals()) if use_cpp:
dtype = helper.input_dtype() output = cornerpool_op("left_pool", input, name)
output = helper.create_variable_for_type_inference(dtype) return output
max_map = helper.create_variable_for_type_inference(dtype)
helper.append_op( def cond(i, output):
type="left_pool", return i < W
inputs={"X": input},
outputs={"Output": output, def body(i, output):
"MaxMap": max_map}) cur = fluid.layers.slice(output, [3], [0], [W - i])
return output next = fluid.layers.slice(output, [3], [i], [W])
max_v = fluid.layers.elementwise_max(cur, next)
orig = fluid.layers.slice(output, [3], [W - i], [W])
output = fluid.layers.concat([max_v, orig], axis=-1)
i = i * 2
return [i, output]
W = fluid.layers.shape(input)[3]
i = fluid.layers.fill_constant(shape=[1], dtype='int32', value=1)
output = input
output = fluid.layers.while_loop(cond, body, [i, output])
return output[-1]
W = input.shape[3] W = input.shape[3]
i = 1 i = 1
......
...@@ -22,6 +22,7 @@ from paddle import fluid ...@@ -22,6 +22,7 @@ from paddle import fluid
from ppdet.core.workspace import register from ppdet.core.workspace import register
import numpy as np import numpy as np
from ppdet.utils.check import check_version
__all__ = ['CornerNetSqueeze'] __all__ = ['CornerNetSqueeze']
...@@ -48,6 +49,7 @@ class CornerNetSqueeze(object): ...@@ -48,6 +49,7 @@ class CornerNetSqueeze(object):
corner_head='CornerHead', corner_head='CornerHead',
num_classes=80, num_classes=80,
fpn=None): fpn=None):
check_version('1.8.0')
super(CornerNetSqueeze, self).__init__() super(CornerNetSqueeze, self).__init__()
self.backbone = backbone self.backbone = backbone
self.corner_head = corner_head self.corner_head = corner_head
......
...@@ -45,17 +45,17 @@ def check_gpu(use_gpu): ...@@ -45,17 +45,17 @@ def check_gpu(use_gpu):
pass pass
def check_version(): def check_version(version='1.7.0'):
""" """
Log error and exit when the installed version of paddlepaddle is Log error and exit when the installed version of paddlepaddle is
not satisfied. not satisfied.
""" """
err = "PaddlePaddle version 1.6 or higher is required, " \ err = "PaddlePaddle version {} or higher is required, " \
"or a suitable develop version is satisfied as well. \n" \ "or a suitable develop version is satisfied as well. \n" \
"Please make sure the version is good with your code." \ "Please make sure the version is good with your code.".format(version)
try: try:
fluid.require_version('1.7.0') fluid.require_version(version)
except Exception as e: except Exception as e:
logger.error(err) logger.error(err)
sys.exit(1) sys.exit(1)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册