mirror of
https://github.com/PaddlePaddle/PaddleOCR.git
synced 2025-11-23 05:26:19 +00:00
rename rec_resnet_fpn
This commit is contained in:
parent
97cfef3265
commit
5edb619cdd
@ -27,7 +27,7 @@ Architecture:
|
|||||||
function: ppocr.modeling.architectures.rec_model,RecModel
|
function: ppocr.modeling.architectures.rec_model,RecModel
|
||||||
|
|
||||||
Backbone:
|
Backbone:
|
||||||
function: ppocr.modeling.backbones.rec_resnet50_fpn,ResNet
|
function: ppocr.modeling.backbones.rec_resnet_fpn,ResNet
|
||||||
layers: 50
|
layers: 50
|
||||||
|
|
||||||
Head:
|
Head:
|
||||||
|
|||||||
@ -22,12 +22,12 @@ import paddle
|
|||||||
import paddle.fluid as fluid
|
import paddle.fluid as fluid
|
||||||
from paddle.fluid.param_attr import ParamAttr
|
from paddle.fluid.param_attr import ParamAttr
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
__all__ = ["ResNet", "ResNet18", "ResNet34", "ResNet50", "ResNet101", "ResNet152"]
|
"ResNet", "ResNet18", "ResNet34", "ResNet50", "ResNet101", "ResNet152"
|
||||||
|
]
|
||||||
|
|
||||||
Trainable = True
|
Trainable = True
|
||||||
w_nolr = fluid.ParamAttr(
|
w_nolr = fluid.ParamAttr(trainable=Trainable)
|
||||||
trainable = Trainable)
|
|
||||||
train_parameters = {
|
train_parameters = {
|
||||||
"input_size": [3, 224, 224],
|
"input_size": [3, 224, 224],
|
||||||
"input_mean": [0.485, 0.456, 0.406],
|
"input_mean": [0.485, 0.456, 0.406],
|
||||||
@ -40,12 +40,12 @@ train_parameters = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class ResNet():
|
class ResNet():
|
||||||
def __init__(self, params):
|
def __init__(self, params):
|
||||||
self.layers = params['layers']
|
self.layers = params['layers']
|
||||||
self.params = train_parameters
|
self.params = train_parameters
|
||||||
|
|
||||||
|
|
||||||
def __call__(self, input):
|
def __call__(self, input):
|
||||||
layers = self.layers
|
layers = self.layers
|
||||||
supported_layers = [18, 34, 50, 101, 152]
|
supported_layers = [18, 34, 50, 101, 152]
|
||||||
@ -60,11 +60,16 @@ class ResNet():
|
|||||||
depth = [3, 4, 23, 3]
|
depth = [3, 4, 23, 3]
|
||||||
elif layers == 152:
|
elif layers == 152:
|
||||||
depth = [3, 8, 36, 3]
|
depth = [3, 8, 36, 3]
|
||||||
stride_list = [(2,2),(2,2),(1,1),(1,1)]
|
stride_list = [(2, 2), (2, 2), (1, 1), (1, 1)]
|
||||||
num_filters = [64, 128, 256, 512]
|
num_filters = [64, 128, 256, 512]
|
||||||
|
|
||||||
conv = self.conv_bn_layer(
|
conv = self.conv_bn_layer(
|
||||||
input=input, num_filters=64, filter_size=7, stride=2, act='relu', name="conv1")
|
input=input,
|
||||||
|
num_filters=64,
|
||||||
|
filter_size=7,
|
||||||
|
stride=2,
|
||||||
|
act='relu',
|
||||||
|
name="conv1")
|
||||||
F = []
|
F = []
|
||||||
if layers >= 50:
|
if layers >= 50:
|
||||||
for block in range(len(depth)):
|
for block in range(len(depth)):
|
||||||
@ -79,7 +84,8 @@ class ResNet():
|
|||||||
conv = self.bottleneck_block(
|
conv = self.bottleneck_block(
|
||||||
input=conv,
|
input=conv,
|
||||||
num_filters=num_filters[block],
|
num_filters=num_filters[block],
|
||||||
stride=stride_list[block] if i == 0 else 1, name=conv_name)
|
stride=stride_list[block] if i == 0 else 1,
|
||||||
|
name=conv_name)
|
||||||
F.append(conv)
|
F.append(conv)
|
||||||
else:
|
else:
|
||||||
for block in range(len(depth)):
|
for block in range(len(depth)):
|
||||||
@ -102,20 +108,43 @@ class ResNet():
|
|||||||
base = F[-1]
|
base = F[-1]
|
||||||
for i in [-2, -3]:
|
for i in [-2, -3]:
|
||||||
b, c, w, h = F[i].shape
|
b, c, w, h = F[i].shape
|
||||||
if (w,h) == base.shape[2:]:
|
if (w, h) == base.shape[2:]:
|
||||||
base = base
|
base = base
|
||||||
else:
|
else:
|
||||||
base = fluid.layers.conv2d_transpose( input=base, num_filters=c,filter_size=4, stride=2,
|
base = fluid.layers.conv2d_transpose(
|
||||||
padding=1,act=None,
|
input=base,
|
||||||
|
num_filters=c,
|
||||||
|
filter_size=4,
|
||||||
|
stride=2,
|
||||||
|
padding=1,
|
||||||
|
act=None,
|
||||||
param_attr=w_nolr,
|
param_attr=w_nolr,
|
||||||
bias_attr=w_nolr)
|
bias_attr=w_nolr)
|
||||||
base = fluid.layers.batch_norm(base, act = "relu", param_attr=w_nolr, bias_attr=w_nolr)
|
base = fluid.layers.batch_norm(
|
||||||
|
base, act="relu", param_attr=w_nolr, bias_attr=w_nolr)
|
||||||
base = fluid.layers.concat([base, F[i]], axis=1)
|
base = fluid.layers.concat([base, F[i]], axis=1)
|
||||||
base = fluid.layers.conv2d(base, num_filters=c, filter_size=1, param_attr=w_nolr, bias_attr=w_nolr)
|
base = fluid.layers.conv2d(
|
||||||
base = fluid.layers.conv2d(base, num_filters=c, filter_size=3,padding = 1, param_attr=w_nolr, bias_attr=w_nolr)
|
base,
|
||||||
base = fluid.layers.batch_norm(base, act = "relu", param_attr=w_nolr, bias_attr=w_nolr)
|
num_filters=c,
|
||||||
|
filter_size=1,
|
||||||
|
param_attr=w_nolr,
|
||||||
|
bias_attr=w_nolr)
|
||||||
|
base = fluid.layers.conv2d(
|
||||||
|
base,
|
||||||
|
num_filters=c,
|
||||||
|
filter_size=3,
|
||||||
|
padding=1,
|
||||||
|
param_attr=w_nolr,
|
||||||
|
bias_attr=w_nolr)
|
||||||
|
base = fluid.layers.batch_norm(
|
||||||
|
base, act="relu", param_attr=w_nolr, bias_attr=w_nolr)
|
||||||
|
|
||||||
base = fluid.layers.conv2d(base, num_filters=512, filter_size=1,bias_attr=w_nolr,param_attr=w_nolr)
|
base = fluid.layers.conv2d(
|
||||||
|
base,
|
||||||
|
num_filters=512,
|
||||||
|
filter_size=1,
|
||||||
|
bias_attr=w_nolr,
|
||||||
|
param_attr=w_nolr)
|
||||||
|
|
||||||
return base
|
return base
|
||||||
|
|
||||||
@ -130,13 +159,14 @@ class ResNet():
|
|||||||
conv = fluid.layers.conv2d(
|
conv = fluid.layers.conv2d(
|
||||||
input=input,
|
input=input,
|
||||||
num_filters=num_filters,
|
num_filters=num_filters,
|
||||||
filter_size= 2 if stride==(1,1) else filter_size,
|
filter_size=2 if stride == (1, 1) else filter_size,
|
||||||
dilation = 2 if stride==(1,1) else 1,
|
dilation=2 if stride == (1, 1) else 1,
|
||||||
stride=stride,
|
stride=stride,
|
||||||
padding=(filter_size - 1) // 2,
|
padding=(filter_size - 1) // 2,
|
||||||
groups=groups,
|
groups=groups,
|
||||||
act=None,
|
act=None,
|
||||||
param_attr=ParamAttr(name=name + "_weights",trainable = Trainable),
|
param_attr=ParamAttr(
|
||||||
|
name=name + "_weights", trainable=Trainable),
|
||||||
bias_attr=False,
|
bias_attr=False,
|
||||||
name=name + '.conv2d.output.1')
|
name=name + '.conv2d.output.1')
|
||||||
|
|
||||||
@ -144,18 +174,21 @@ class ResNet():
|
|||||||
bn_name = "bn_" + name
|
bn_name = "bn_" + name
|
||||||
else:
|
else:
|
||||||
bn_name = "bn" + name[3:]
|
bn_name = "bn" + name[3:]
|
||||||
return fluid.layers.batch_norm(input=conv,
|
return fluid.layers.batch_norm(
|
||||||
|
input=conv,
|
||||||
act=act,
|
act=act,
|
||||||
name=bn_name + '.output.1',
|
name=bn_name + '.output.1',
|
||||||
param_attr=ParamAttr(name=bn_name + '_scale',trainable = Trainable),
|
param_attr=ParamAttr(
|
||||||
bias_attr=ParamAttr(bn_name + '_offset',trainable = Trainable),
|
name=bn_name + '_scale', trainable=Trainable),
|
||||||
|
bias_attr=ParamAttr(
|
||||||
|
bn_name + '_offset', trainable=Trainable),
|
||||||
moving_mean_name=bn_name + '_mean',
|
moving_mean_name=bn_name + '_mean',
|
||||||
moving_variance_name=bn_name + '_variance', )
|
moving_variance_name=bn_name + '_variance', )
|
||||||
|
|
||||||
def shortcut(self, input, ch_out, stride, is_first, name):
|
def shortcut(self, input, ch_out, stride, is_first, name):
|
||||||
ch_in = input.shape[1]
|
ch_in = input.shape[1]
|
||||||
if ch_in != ch_out or stride != 1 or is_first == True:
|
if ch_in != ch_out or stride != 1 or is_first == True:
|
||||||
if stride == (1,1):
|
if stride == (1, 1):
|
||||||
return self.conv_bn_layer(input, ch_out, 1, 1, name=name)
|
return self.conv_bn_layer(input, ch_out, 1, 1, name=name)
|
||||||
else: #stride == (2,2)
|
else: #stride == (2,2)
|
||||||
return self.conv_bn_layer(input, ch_out, 1, stride, name=name)
|
return self.conv_bn_layer(input, ch_out, 1, stride, name=name)
|
||||||
@ -165,7 +198,11 @@ class ResNet():
|
|||||||
|
|
||||||
def bottleneck_block(self, input, num_filters, stride, name):
|
def bottleneck_block(self, input, num_filters, stride, name):
|
||||||
conv0 = self.conv_bn_layer(
|
conv0 = self.conv_bn_layer(
|
||||||
input=input, num_filters=num_filters, filter_size=1, act='relu', name=name + "_branch2a")
|
input=input,
|
||||||
|
num_filters=num_filters,
|
||||||
|
filter_size=1,
|
||||||
|
act='relu',
|
||||||
|
name=name + "_branch2a")
|
||||||
conv1 = self.conv_bn_layer(
|
conv1 = self.conv_bn_layer(
|
||||||
input=conv0,
|
input=conv0,
|
||||||
num_filters=num_filters,
|
num_filters=num_filters,
|
||||||
@ -174,16 +211,36 @@ class ResNet():
|
|||||||
act='relu',
|
act='relu',
|
||||||
name=name + "_branch2b")
|
name=name + "_branch2b")
|
||||||
conv2 = self.conv_bn_layer(
|
conv2 = self.conv_bn_layer(
|
||||||
input=conv1, num_filters=num_filters * 4, filter_size=1, act=None, name=name + "_branch2c")
|
input=conv1,
|
||||||
|
num_filters=num_filters * 4,
|
||||||
|
filter_size=1,
|
||||||
|
act=None,
|
||||||
|
name=name + "_branch2c")
|
||||||
|
|
||||||
short = self.shortcut(input, num_filters * 4, stride, is_first=False, name=name + "_branch1")
|
short = self.shortcut(
|
||||||
|
input,
|
||||||
|
num_filters * 4,
|
||||||
|
stride,
|
||||||
|
is_first=False,
|
||||||
|
name=name + "_branch1")
|
||||||
|
|
||||||
return fluid.layers.elementwise_add(x=short, y=conv2, act='relu', name=name + ".add.output.5")
|
return fluid.layers.elementwise_add(
|
||||||
|
x=short, y=conv2, act='relu', name=name + ".add.output.5")
|
||||||
|
|
||||||
def basic_block(self, input, num_filters, stride, is_first, name):
|
def basic_block(self, input, num_filters, stride, is_first, name):
|
||||||
conv0 = self.conv_bn_layer(input=input, num_filters=num_filters, filter_size=3, act='relu', stride=stride,
|
conv0 = self.conv_bn_layer(
|
||||||
|
input=input,
|
||||||
|
num_filters=num_filters,
|
||||||
|
filter_size=3,
|
||||||
|
act='relu',
|
||||||
|
stride=stride,
|
||||||
name=name + "_branch2a")
|
name=name + "_branch2a")
|
||||||
conv1 = self.conv_bn_layer(input=conv0, num_filters=num_filters, filter_size=3, act=None,
|
conv1 = self.conv_bn_layer(
|
||||||
|
input=conv0,
|
||||||
|
num_filters=num_filters,
|
||||||
|
filter_size=3,
|
||||||
|
act=None,
|
||||||
name=name + "_branch2b")
|
name=name + "_branch2b")
|
||||||
short = self.shortcut(input, num_filters, stride, is_first, name=name + "_branch1")
|
short = self.shortcut(
|
||||||
|
input, num_filters, stride, is_first, name=name + "_branch1")
|
||||||
return fluid.layers.elementwise_add(x=short, y=conv1, act='relu')
|
return fluid.layers.elementwise_add(x=short, y=conv1, act='relu')
|
||||||
Loading…
x
Reference in New Issue
Block a user