Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleOCR
提交
fe92c51c
P
PaddleOCR
项目概览
PaddlePaddle
/
PaddleOCR
大约 1 年 前同步成功
通知
1528
Star
32962
Fork
6643
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
108
列表
看板
标记
里程碑
合并请求
7
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleOCR
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
108
Issue
108
列表
看板
标记
里程碑
合并请求
7
合并请求
7
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
fe92c51c
编写于
11月 04, 2021
作者:
W
WenmuZhou
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add refer for some code
上级
9b9b2d60
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
151 addition
and
169 deletion
+151
-169
ppocr/data/imaug/iaa_augment.py
ppocr/data/imaug/iaa_augment.py
+4
-13
ppocr/data/imaug/make_border_map.py
ppocr/data/imaug/make_border_map.py
+4
-0
ppocr/data/imaug/make_pse_gt.py
ppocr/data/imaug/make_pse_gt.py
+22
-8
ppocr/data/imaug/make_shrink_map.py
ppocr/data/imaug/make_shrink_map.py
+4
-0
ppocr/data/imaug/random_crop_data.py
ppocr/data/imaug/random_crop_data.py
+4
-0
ppocr/data/imaug/text_image_aug/augment.py
ppocr/data/imaug/text_image_aug/augment.py
+4
-13
ppocr/data/imaug/text_image_aug/warp_mls.py
ppocr/data/imaug/text_image_aug/warp_mls.py
+4
-13
ppocr/losses/det_pse_loss.py
ppocr/losses/det_pse_loss.py
+4
-13
ppocr/modeling/heads/det_pse_head.py
ppocr/modeling/heads/det_pse_head.py
+10
-21
ppocr/modeling/necks/fpn.py
ppocr/modeling/necks/fpn.py
+63
-38
ppocr/postprocess/pse_postprocess/pse/README.md
ppocr/postprocess/pse_postprocess/pse/README.md
+2
-1
ppocr/postprocess/pse_postprocess/pse_postprocess.py
ppocr/postprocess/pse_postprocess/pse_postprocess.py
+13
-20
ppocr/utils/iou.py
ppocr/utils/iou.py
+9
-16
ppocr/utils/logging.py
ppocr/utils/logging.py
+4
-13
未找到文件。
ppocr/data/imaug/iaa_augment.py
浏览文件 @
fe92c51c
# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
"""
#
This code is refer from:
# Licensed under the Apache License, Version 2.0 (the "License");
https://github.com/WenmuZhou/DBNet.pytorch/blob/master/data_loader/modules/iaa_augment.py
# 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
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
division
from
__future__
import
print_function
from
__future__
import
print_function
...
...
ppocr/data/imaug/make_border_map.py
浏览文件 @
fe92c51c
# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
"""
This code is refer from:
https://github.com/WenmuZhou/DBNet.pytorch/blob/master/data_loader/modules/make_border_map.py
"""
from
__future__
import
absolute_import
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
division
...
...
ppocr/data/imaug/make_pse_gt.py
浏览文件 @
fe92c51c
...
@@ -12,6 +12,7 @@ from shapely.geometry import Polygon
...
@@ -12,6 +12,7 @@ from shapely.geometry import Polygon
__all__
=
[
'MakePseGt'
]
__all__
=
[
'MakePseGt'
]
class
MakePseGt
(
object
):
class
MakePseGt
(
object
):
r
'''
r
'''
Making binary mask from detection data with ICDAR format.
Making binary mask from detection data with ICDAR format.
...
@@ -38,16 +39,20 @@ class MakePseGt(object):
...
@@ -38,16 +39,20 @@ class MakePseGt(object):
text_polys
*=
scale
text_polys
*=
scale
gt_kernels
=
[]
gt_kernels
=
[]
for
i
in
range
(
1
,
self
.
kernel_num
+
1
):
for
i
in
range
(
1
,
self
.
kernel_num
+
1
):
# s1->sn, from big to small
# s1->sn, from big to small
rate
=
1.0
-
(
1.0
-
self
.
min_shrink_ratio
)
/
(
self
.
kernel_num
-
1
)
*
i
rate
=
1.0
-
(
1.0
-
self
.
min_shrink_ratio
)
/
(
self
.
kernel_num
-
1
text_kernel
,
ignore_tags
=
self
.
generate_kernel
(
image
.
shape
[
0
:
2
],
rate
,
text_polys
,
ignore_tags
)
)
*
i
text_kernel
,
ignore_tags
=
self
.
generate_kernel
(
image
.
shape
[
0
:
2
],
rate
,
text_polys
,
ignore_tags
)
gt_kernels
.
append
(
text_kernel
)
gt_kernels
.
append
(
text_kernel
)
training_mask
=
np
.
ones
(
image
.
shape
[
0
:
2
],
dtype
=
'uint8'
)
training_mask
=
np
.
ones
(
image
.
shape
[
0
:
2
],
dtype
=
'uint8'
)
for
i
in
range
(
text_polys
.
shape
[
0
]):
for
i
in
range
(
text_polys
.
shape
[
0
]):
if
ignore_tags
[
i
]:
if
ignore_tags
[
i
]:
cv2
.
fillPoly
(
training_mask
,
text_polys
[
i
].
astype
(
np
.
int32
)[
np
.
newaxis
,
:,
:],
0
)
cv2
.
fillPoly
(
training_mask
,
text_polys
[
i
].
astype
(
np
.
int32
)[
np
.
newaxis
,
:,
:],
0
)
gt_kernels
=
np
.
array
(
gt_kernels
)
gt_kernels
=
np
.
array
(
gt_kernels
)
gt_kernels
[
gt_kernels
>
0
]
=
1
gt_kernels
[
gt_kernels
>
0
]
=
1
...
@@ -59,16 +64,25 @@ class MakePseGt(object):
...
@@ -59,16 +64,25 @@ class MakePseGt(object):
data
[
'mask'
]
=
training_mask
.
astype
(
'float32'
)
data
[
'mask'
]
=
training_mask
.
astype
(
'float32'
)
return
data
return
data
def
generate_kernel
(
self
,
img_size
,
shrink_ratio
,
text_polys
,
ignore_tags
=
None
):
def
generate_kernel
(
self
,
img_size
,
shrink_ratio
,
text_polys
,
ignore_tags
=
None
):
"""
Refer to part of the code:
https://github.com/open-mmlab/mmocr/blob/main/mmocr/datasets/pipelines/textdet_targets/base_textdet_targets.py
"""
h
,
w
=
img_size
h
,
w
=
img_size
text_kernel
=
np
.
zeros
((
h
,
w
),
dtype
=
np
.
float32
)
text_kernel
=
np
.
zeros
((
h
,
w
),
dtype
=
np
.
float32
)
for
i
,
poly
in
enumerate
(
text_polys
):
for
i
,
poly
in
enumerate
(
text_polys
):
polygon
=
Polygon
(
poly
)
polygon
=
Polygon
(
poly
)
distance
=
polygon
.
area
*
(
1
-
shrink_ratio
*
shrink_ratio
)
/
(
polygon
.
length
+
1e-6
)
distance
=
polygon
.
area
*
(
1
-
shrink_ratio
*
shrink_ratio
)
/
(
polygon
.
length
+
1e-6
)
subject
=
[
tuple
(
l
)
for
l
in
poly
]
subject
=
[
tuple
(
l
)
for
l
in
poly
]
pco
=
pyclipper
.
PyclipperOffset
()
pco
=
pyclipper
.
PyclipperOffset
()
pco
.
AddPath
(
subject
,
pyclipper
.
JT_ROUND
,
pco
.
AddPath
(
subject
,
pyclipper
.
JT_ROUND
,
pyclipper
.
ET_CLOSEDPOLYGON
)
pyclipper
.
ET_CLOSEDPOLYGON
)
shrinked
=
np
.
array
(
pco
.
Execute
(
-
distance
))
shrinked
=
np
.
array
(
pco
.
Execute
(
-
distance
))
if
len
(
shrinked
)
==
0
or
shrinked
.
size
==
0
:
if
len
(
shrinked
)
==
0
or
shrinked
.
size
==
0
:
...
...
ppocr/data/imaug/make_shrink_map.py
浏览文件 @
fe92c51c
# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
"""
This code is refer from:
https://github.com/WenmuZhou/DBNet.pytorch/blob/master/data_loader/modules/make_shrink_map.py
"""
from
__future__
import
absolute_import
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
division
...
...
ppocr/data/imaug/random_crop_data.py
浏览文件 @
fe92c51c
# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
"""
This code is refer from:
https://github.com/WenmuZhou/DBNet.pytorch/blob/master/data_loader/modules/random_crop_data.py
"""
from
__future__
import
absolute_import
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
division
...
...
ppocr/data/imaug/text_image_aug/augment.py
浏览文件 @
fe92c51c
# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
"""
#
This code is refer from:
# Licensed under the Apache License, Version 2.0 (the "License");
https://github.com/RubanSeven/Text-Image-Augmentation-python/blob/master/augment.py
# 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.
import
numpy
as
np
import
numpy
as
np
from
.warp_mls
import
WarpMLS
from
.warp_mls
import
WarpMLS
...
...
ppocr/data/imaug/text_image_aug/warp_mls.py
浏览文件 @
fe92c51c
# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
"""
#
This code is refer from:
# Licensed under the Apache License, Version 2.0 (the "License");
https://github.com/RubanSeven/Text-Image-Augmentation-python/blob/master/warp_mls.py
# 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.
import
numpy
as
np
import
numpy
as
np
...
...
ppocr/losses/det_pse_loss.py
浏览文件 @
fe92c51c
# copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve.
"""
#
This code is refer from:
# Licensed under the Apache License, Version 2.0 (the "License");
https://github.com/whai362/PSENet/blob/python3/models/head/psenet_head.py
# 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.
import
paddle
import
paddle
from
paddle
import
nn
from
paddle
import
nn
...
...
ppocr/modeling/heads/det_pse_head.py
浏览文件 @
fe92c51c
# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
"""
#
This code is refer from:
# Licensed under the Apache License, Version 2.0 (the "License");
https://github.com/whai362/PSENet/blob/python3/models/head/psenet_head.py
# 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
paddle
import
nn
from
paddle
import
nn
class
PSEHead
(
nn
.
Layer
):
class
PSEHead
(
nn
.
Layer
):
def
__init__
(
self
,
def
__init__
(
self
,
in_channels
,
hidden_dim
=
256
,
out_channels
=
7
,
**
kwargs
):
in_channels
,
hidden_dim
=
256
,
out_channels
=
7
,
**
kwargs
):
super
(
PSEHead
,
self
).
__init__
()
super
(
PSEHead
,
self
).
__init__
()
self
.
conv1
=
nn
.
Conv2D
(
in_channels
,
hidden_dim
,
kernel_size
=
3
,
stride
=
1
,
padding
=
1
)
self
.
conv1
=
nn
.
Conv2D
(
in_channels
,
hidden_dim
,
kernel_size
=
3
,
stride
=
1
,
padding
=
1
)
self
.
bn1
=
nn
.
BatchNorm2D
(
hidden_dim
)
self
.
bn1
=
nn
.
BatchNorm2D
(
hidden_dim
)
self
.
relu1
=
nn
.
ReLU
()
self
.
relu1
=
nn
.
ReLU
()
self
.
conv2
=
nn
.
Conv2D
(
hidden_dim
,
out_channels
,
kernel_size
=
1
,
stride
=
1
,
padding
=
0
)
self
.
conv2
=
nn
.
Conv2D
(
hidden_dim
,
out_channels
,
kernel_size
=
1
,
stride
=
1
,
padding
=
0
)
def
forward
(
self
,
x
,
**
kwargs
):
def
forward
(
self
,
x
,
**
kwargs
):
out
=
self
.
conv1
(
x
)
out
=
self
.
conv1
(
x
)
...
...
ppocr/modeling/necks/fpn.py
浏览文件 @
fe92c51c
# copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve.
"""
#
This code is refer from:
# Licensed under the Apache License, Version 2.0 (the "License");
https://github.com/whai362/PSENet/blob/python3/models/neck/fpn.py
# 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.
import
paddle.nn
as
nn
import
paddle.nn
as
nn
import
paddle
import
paddle
import
math
import
math
import
paddle.nn.functional
as
F
import
paddle.nn.functional
as
F
class
Conv_BN_ReLU
(
nn
.
Layer
):
class
Conv_BN_ReLU
(
nn
.
Layer
):
def
__init__
(
self
,
in_planes
,
out_planes
,
kernel_size
=
1
,
stride
=
1
,
padding
=
0
):
def
__init__
(
self
,
in_planes
,
out_planes
,
kernel_size
=
1
,
stride
=
1
,
padding
=
0
):
super
(
Conv_BN_ReLU
,
self
).
__init__
()
super
(
Conv_BN_ReLU
,
self
).
__init__
()
self
.
conv
=
nn
.
Conv2D
(
in_planes
,
out_planes
,
kernel_size
=
kernel_size
,
stride
=
stride
,
padding
=
padding
,
self
.
conv
=
nn
.
Conv2D
(
bias_attr
=
False
)
in_planes
,
out_planes
,
kernel_size
=
kernel_size
,
stride
=
stride
,
padding
=
padding
,
bias_attr
=
False
)
self
.
bn
=
nn
.
BatchNorm2D
(
out_planes
,
momentum
=
0.1
)
self
.
bn
=
nn
.
BatchNorm2D
(
out_planes
,
momentum
=
0.1
)
self
.
relu
=
nn
.
ReLU
()
self
.
relu
=
nn
.
ReLU
()
for
m
in
self
.
sublayers
():
for
m
in
self
.
sublayers
():
if
isinstance
(
m
,
nn
.
Conv2D
):
if
isinstance
(
m
,
nn
.
Conv2D
):
n
=
m
.
_kernel_size
[
0
]
*
m
.
_kernel_size
[
1
]
*
m
.
_out_channels
n
=
m
.
_kernel_size
[
0
]
*
m
.
_kernel_size
[
1
]
*
m
.
_out_channels
m
.
weight
=
paddle
.
create_parameter
(
shape
=
m
.
weight
.
shape
,
dtype
=
'float32'
,
default_initializer
=
paddle
.
nn
.
initializer
.
Normal
(
0
,
math
.
sqrt
(
2.
/
n
)))
m
.
weight
=
paddle
.
create_parameter
(
shape
=
m
.
weight
.
shape
,
dtype
=
'float32'
,
default_initializer
=
paddle
.
nn
.
initializer
.
Normal
(
0
,
math
.
sqrt
(
2.
/
n
)))
elif
isinstance
(
m
,
nn
.
BatchNorm2D
):
elif
isinstance
(
m
,
nn
.
BatchNorm2D
):
m
.
weight
=
paddle
.
create_parameter
(
shape
=
m
.
weight
.
shape
,
dtype
=
'float32'
,
default_initializer
=
paddle
.
nn
.
initializer
.
Constant
(
1.0
))
m
.
weight
=
paddle
.
create_parameter
(
m
.
bias
=
paddle
.
create_parameter
(
shape
=
m
.
bias
.
shape
,
dtype
=
'float32'
,
default_initializer
=
paddle
.
nn
.
initializer
.
Constant
(
0.0
))
shape
=
m
.
weight
.
shape
,
dtype
=
'float32'
,
default_initializer
=
paddle
.
nn
.
initializer
.
Constant
(
1.0
))
m
.
bias
=
paddle
.
create_parameter
(
shape
=
m
.
bias
.
shape
,
dtype
=
'float32'
,
default_initializer
=
paddle
.
nn
.
initializer
.
Constant
(
0.0
))
def
forward
(
self
,
x
):
def
forward
(
self
,
x
):
return
self
.
relu
(
self
.
bn
(
self
.
conv
(
x
)))
return
self
.
relu
(
self
.
bn
(
self
.
conv
(
x
)))
class
FPN
(
nn
.
Layer
):
class
FPN
(
nn
.
Layer
):
def
__init__
(
self
,
in_channels
,
out_channels
):
def
__init__
(
self
,
in_channels
,
out_channels
):
super
(
FPN
,
self
).
__init__
()
super
(
FPN
,
self
).
__init__
()
# Top layer
# Top layer
self
.
toplayer_
=
Conv_BN_ReLU
(
in_channels
[
3
],
out_channels
,
kernel_size
=
1
,
stride
=
1
,
padding
=
0
)
self
.
toplayer_
=
Conv_BN_ReLU
(
in_channels
[
3
],
out_channels
,
kernel_size
=
1
,
stride
=
1
,
padding
=
0
)
# Lateral layers
# Lateral layers
self
.
latlayer1_
=
Conv_BN_ReLU
(
in_channels
[
2
],
out_channels
,
kernel_size
=
1
,
stride
=
1
,
padding
=
0
)
self
.
latlayer1_
=
Conv_BN_ReLU
(
in_channels
[
2
],
out_channels
,
kernel_size
=
1
,
stride
=
1
,
padding
=
0
)
self
.
latlayer2_
=
Conv_BN_ReLU
(
in_channels
[
1
],
out_channels
,
kernel_size
=
1
,
stride
=
1
,
padding
=
0
)
self
.
latlayer2_
=
Conv_BN_ReLU
(
in_channels
[
1
],
out_channels
,
kernel_size
=
1
,
stride
=
1
,
padding
=
0
)
self
.
latlayer3_
=
Conv_BN_ReLU
(
in_channels
[
0
],
out_channels
,
kernel_size
=
1
,
stride
=
1
,
padding
=
0
)
self
.
latlayer3_
=
Conv_BN_ReLU
(
in_channels
[
0
],
out_channels
,
kernel_size
=
1
,
stride
=
1
,
padding
=
0
)
# Smooth layers
# Smooth layers
self
.
smooth1_
=
Conv_BN_ReLU
(
out_channels
,
out_channels
,
kernel_size
=
3
,
stride
=
1
,
padding
=
1
)
self
.
smooth1_
=
Conv_BN_ReLU
(
out_channels
,
out_channels
,
kernel_size
=
3
,
stride
=
1
,
padding
=
1
)
self
.
smooth2_
=
Conv_BN_ReLU
(
out_channels
,
out_channels
,
kernel_size
=
3
,
stride
=
1
,
padding
=
1
)
self
.
smooth3_
=
Conv_BN_ReLU
(
out_channels
,
out_channels
,
kernel_size
=
3
,
stride
=
1
,
padding
=
1
)
self
.
smooth2_
=
Conv_BN_ReLU
(
out_channels
,
out_channels
,
kernel_size
=
3
,
stride
=
1
,
padding
=
1
)
self
.
smooth3_
=
Conv_BN_ReLU
(
out_channels
,
out_channels
,
kernel_size
=
3
,
stride
=
1
,
padding
=
1
)
self
.
out_channels
=
out_channels
*
4
self
.
out_channels
=
out_channels
*
4
for
m
in
self
.
sublayers
():
for
m
in
self
.
sublayers
():
if
isinstance
(
m
,
nn
.
Conv2D
):
if
isinstance
(
m
,
nn
.
Conv2D
):
n
=
m
.
_kernel_size
[
0
]
*
m
.
_kernel_size
[
1
]
*
m
.
_out_channels
n
=
m
.
_kernel_size
[
0
]
*
m
.
_kernel_size
[
1
]
*
m
.
_out_channels
m
.
weight
=
paddle
.
create_parameter
(
shape
=
m
.
weight
.
shape
,
dtype
=
'float32'
,
m
.
weight
=
paddle
.
create_parameter
(
default_initializer
=
paddle
.
nn
.
initializer
.
Normal
(
0
,
shape
=
m
.
weight
.
shape
,
math
.
sqrt
(
2.
/
n
)))
dtype
=
'float32'
,
default_initializer
=
paddle
.
nn
.
initializer
.
Normal
(
0
,
math
.
sqrt
(
2.
/
n
)))
elif
isinstance
(
m
,
nn
.
BatchNorm2D
):
elif
isinstance
(
m
,
nn
.
BatchNorm2D
):
m
.
weight
=
paddle
.
create_parameter
(
shape
=
m
.
weight
.
shape
,
dtype
=
'float32'
,
m
.
weight
=
paddle
.
create_parameter
(
default_initializer
=
paddle
.
nn
.
initializer
.
Constant
(
1.0
))
shape
=
m
.
weight
.
shape
,
m
.
bias
=
paddle
.
create_parameter
(
shape
=
m
.
bias
.
shape
,
dtype
=
'float32'
,
dtype
=
'float32'
,
default_initializer
=
paddle
.
nn
.
initializer
.
Constant
(
0.0
))
default_initializer
=
paddle
.
nn
.
initializer
.
Constant
(
1.0
))
m
.
bias
=
paddle
.
create_parameter
(
shape
=
m
.
bias
.
shape
,
dtype
=
'float32'
,
default_initializer
=
paddle
.
nn
.
initializer
.
Constant
(
0.0
))
def
_upsample
(
self
,
x
,
scale
=
1
):
def
_upsample
(
self
,
x
,
scale
=
1
):
return
F
.
upsample
(
x
,
scale_factor
=
scale
,
mode
=
'bilinear'
)
return
F
.
upsample
(
x
,
scale_factor
=
scale
,
mode
=
'bilinear'
)
...
@@ -81,15 +106,15 @@ class FPN(nn.Layer):
...
@@ -81,15 +106,15 @@ class FPN(nn.Layer):
p5
=
self
.
toplayer_
(
f5
)
p5
=
self
.
toplayer_
(
f5
)
f4
=
self
.
latlayer1_
(
f4
)
f4
=
self
.
latlayer1_
(
f4
)
p4
=
self
.
_upsample_add
(
p5
,
f4
,
2
)
p4
=
self
.
_upsample_add
(
p5
,
f4
,
2
)
p4
=
self
.
smooth1_
(
p4
)
p4
=
self
.
smooth1_
(
p4
)
f3
=
self
.
latlayer2_
(
f3
)
f3
=
self
.
latlayer2_
(
f3
)
p3
=
self
.
_upsample_add
(
p4
,
f3
,
2
)
p3
=
self
.
_upsample_add
(
p4
,
f3
,
2
)
p3
=
self
.
smooth2_
(
p3
)
p3
=
self
.
smooth2_
(
p3
)
f2
=
self
.
latlayer3_
(
f2
)
f2
=
self
.
latlayer3_
(
f2
)
p2
=
self
.
_upsample_add
(
p3
,
f2
,
2
)
p2
=
self
.
_upsample_add
(
p3
,
f2
,
2
)
p2
=
self
.
smooth3_
(
p2
)
p2
=
self
.
smooth3_
(
p2
)
p3
=
self
.
_upsample
(
p3
,
2
)
p3
=
self
.
_upsample
(
p3
,
2
)
...
@@ -97,4 +122,4 @@ class FPN(nn.Layer):
...
@@ -97,4 +122,4 @@ class FPN(nn.Layer):
p5
=
self
.
_upsample
(
p5
,
8
)
p5
=
self
.
_upsample
(
p5
,
8
)
fuse
=
paddle
.
concat
([
p2
,
p3
,
p4
,
p5
],
axis
=
1
)
fuse
=
paddle
.
concat
([
p2
,
p3
,
p4
,
p5
],
axis
=
1
)
return
fuse
return
fuse
\ No newline at end of file
ppocr/postprocess/pse_postprocess/pse/README.md
浏览文件 @
fe92c51c
## 编译
## 编译
code from https://github.com/whai362/pan_pp.pytorch
This code is refer from:
https://github.com/whai362/PSENet/blob/python3/models/post_processing/pse
```
python
```
python
python3
setup
.
py
build_ext
--
inplace
python3
setup
.
py
build_ext
--
inplace
```
```
ppocr/postprocess/pse_postprocess/pse_postprocess.py
浏览文件 @
fe92c51c
# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
"""
#
This code is refer from:
# Licensed under the Apache License, Version 2.0 (the "License");
https://github.com/whai362/PSENet/blob/python3/models/head/psenet_head.py
# 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
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
division
...
@@ -47,7 +38,8 @@ class PSEPostProcess(object):
...
@@ -47,7 +38,8 @@ class PSEPostProcess(object):
pred
=
outs_dict
[
'maps'
]
pred
=
outs_dict
[
'maps'
]
if
not
isinstance
(
pred
,
paddle
.
Tensor
):
if
not
isinstance
(
pred
,
paddle
.
Tensor
):
pred
=
paddle
.
to_tensor
(
pred
)
pred
=
paddle
.
to_tensor
(
pred
)
pred
=
F
.
interpolate
(
pred
,
scale_factor
=
4
//
self
.
scale
,
mode
=
'bilinear'
)
pred
=
F
.
interpolate
(
pred
,
scale_factor
=
4
//
self
.
scale
,
mode
=
'bilinear'
)
score
=
F
.
sigmoid
(
pred
[:,
0
,
:,
:])
score
=
F
.
sigmoid
(
pred
[:,
0
,
:,
:])
...
@@ -60,7 +52,9 @@ class PSEPostProcess(object):
...
@@ -60,7 +52,9 @@ class PSEPostProcess(object):
boxes_batch
=
[]
boxes_batch
=
[]
for
batch_index
in
range
(
pred
.
shape
[
0
]):
for
batch_index
in
range
(
pred
.
shape
[
0
]):
boxes
,
scores
=
self
.
boxes_from_bitmap
(
score
[
batch_index
],
kernels
[
batch_index
],
shape_list
[
batch_index
])
boxes
,
scores
=
self
.
boxes_from_bitmap
(
score
[
batch_index
],
kernels
[
batch_index
],
shape_list
[
batch_index
])
boxes_batch
.
append
({
'points'
:
boxes
,
'scores'
:
scores
})
boxes_batch
.
append
({
'points'
:
boxes
,
'scores'
:
scores
})
return
boxes_batch
return
boxes_batch
...
@@ -98,15 +92,14 @@ class PSEPostProcess(object):
...
@@ -98,15 +92,14 @@ class PSEPostProcess(object):
mask
=
np
.
zeros
((
box_height
,
box_width
),
np
.
uint8
)
mask
=
np
.
zeros
((
box_height
,
box_width
),
np
.
uint8
)
mask
[
points
[:,
1
],
points
[:,
0
]]
=
255
mask
[
points
[:,
1
],
points
[:,
0
]]
=
255
contours
,
_
=
cv2
.
findContours
(
mask
,
cv2
.
RETR_EXTERNAL
,
cv2
.
CHAIN_APPROX_SIMPLE
)
contours
,
_
=
cv2
.
findContours
(
mask
,
cv2
.
RETR_EXTERNAL
,
cv2
.
CHAIN_APPROX_SIMPLE
)
bbox
=
np
.
squeeze
(
contours
[
0
],
1
)
bbox
=
np
.
squeeze
(
contours
[
0
],
1
)
else
:
else
:
raise
NotImplementedError
raise
NotImplementedError
bbox
[:,
0
]
=
np
.
clip
(
bbox
[:,
0
]
=
np
.
clip
(
np
.
round
(
bbox
[:,
0
]
/
ratio_w
),
0
,
src_w
)
np
.
round
(
bbox
[:,
0
]
/
ratio_w
),
0
,
src_w
)
bbox
[:,
1
]
=
np
.
clip
(
np
.
round
(
bbox
[:,
1
]
/
ratio_h
),
0
,
src_h
)
bbox
[:,
1
]
=
np
.
clip
(
np
.
round
(
bbox
[:,
1
]
/
ratio_h
),
0
,
src_h
)
boxes
.
append
(
bbox
)
boxes
.
append
(
bbox
)
scores
.
append
(
score_i
)
scores
.
append
(
score_i
)
return
boxes
,
scores
return
boxes
,
scores
ppocr/utils/iou.py
浏览文件 @
fe92c51c
# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
"""
#
This code is refer from:
# Licensed under the Apache License, Version 2.0 (the "License");
https://github.com/whai362/PSENet/blob/python3/models/loss/iou.py
# 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.
import
paddle
import
paddle
EPS
=
1e-6
EPS
=
1e-6
def
iou_single
(
a
,
b
,
mask
,
n_class
):
def
iou_single
(
a
,
b
,
mask
,
n_class
):
valid
=
mask
==
1
valid
=
mask
==
1
a
=
a
.
masked_select
(
valid
)
a
=
a
.
masked_select
(
valid
)
b
=
b
.
masked_select
(
valid
)
b
=
b
.
masked_select
(
valid
)
miou
=
[]
miou
=
[]
for
i
in
range
(
n_class
):
for
i
in
range
(
n_class
):
if
a
.
shape
==
[
0
]
and
a
.
shape
==
b
.
shape
:
if
a
.
shape
==
[
0
]
and
a
.
shape
==
b
.
shape
:
inter
=
paddle
.
to_tensor
(
0.0
)
inter
=
paddle
.
to_tensor
(
0.0
)
union
=
paddle
.
to_tensor
(
0.0
)
union
=
paddle
.
to_tensor
(
0.0
)
else
:
else
:
...
@@ -32,6 +24,7 @@ def iou_single(a, b, mask, n_class):
...
@@ -32,6 +24,7 @@ def iou_single(a, b, mask, n_class):
miou
=
sum
(
miou
)
/
len
(
miou
)
miou
=
sum
(
miou
)
/
len
(
miou
)
return
miou
return
miou
def
iou
(
a
,
b
,
mask
,
n_class
=
2
,
reduce
=
True
):
def
iou
(
a
,
b
,
mask
,
n_class
=
2
,
reduce
=
True
):
batch_size
=
a
.
shape
[
0
]
batch_size
=
a
.
shape
[
0
]
...
@@ -39,10 +32,10 @@ def iou(a, b, mask, n_class=2, reduce=True):
...
@@ -39,10 +32,10 @@ def iou(a, b, mask, n_class=2, reduce=True):
b
=
b
.
reshape
([
batch_size
,
-
1
])
b
=
b
.
reshape
([
batch_size
,
-
1
])
mask
=
mask
.
reshape
([
batch_size
,
-
1
])
mask
=
mask
.
reshape
([
batch_size
,
-
1
])
iou
=
paddle
.
zeros
((
batch_size
,),
dtype
=
'float32'
)
iou
=
paddle
.
zeros
((
batch_size
,
),
dtype
=
'float32'
)
for
i
in
range
(
batch_size
):
for
i
in
range
(
batch_size
):
iou
[
i
]
=
iou_single
(
a
[
i
],
b
[
i
],
mask
[
i
],
n_class
)
iou
[
i
]
=
iou_single
(
a
[
i
],
b
[
i
],
mask
[
i
],
n_class
)
if
reduce
:
if
reduce
:
iou
=
paddle
.
mean
(
iou
)
iou
=
paddle
.
mean
(
iou
)
return
iou
return
iou
\ No newline at end of file
ppocr/utils/logging.py
浏览文件 @
fe92c51c
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
"""
#
This code is refer from:
# Licensed under the Apache License, Version 2.0 (the "License");
https://github.com/WenmuZhou/PytorchOCR/blob/master/torchocr/utils/logging.py
# 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.
import
os
import
os
import
sys
import
sys
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录