Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
s920243400
PaddleDetection
提交
ca6a3a89
P
PaddleDetection
项目概览
s920243400
/
PaddleDetection
与 Fork 源项目一致
Fork自
PaddlePaddle / PaddleDetection
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleDetection
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
ca6a3a89
编写于
9月 23, 2020
作者:
W
wangxinxin08
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
trigger pre-commit
上级
096dde95
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
87 addition
and
58 deletion
+87
-58
ppdet/data/transform/operators.py
ppdet/data/transform/operators.py
+87
-58
未找到文件。
ppdet/data/transform/operators.py
浏览文件 @
ca6a3a89
...
...
@@ -40,11 +40,11 @@ from PIL import Image, ImageEnhance, ImageDraw
from
ppdet.core.workspace
import
serializable
from
ppdet.modeling.ops
import
AnchorGrid
from
.op_helper
import
(
satisfy_sample_constraint
,
filter_and_process
,
generate_sample_bbox
,
clip_bbox
,
data_anchor_sampling
,
satisfy_sample_constraint_coverage
,
crop_image_sampling
,
generate_sample_bbox_square
,
bbox_area_sampling
,
is_poly
,
gaussian_radius
,
draw_gaussian
,
transform_bbox
,
clip_bbox
)
from
.op_helper
import
(
satisfy_sample_constraint
,
filter_and_process
,
generate_sample_bbox
,
clip_bbox
,
data_anchor_sampling
,
satisfy_sample_constraint_coverage
,
crop_image_sampling
,
generate_sample_bbox_square
,
bbox_area_sampling
,
is_poly
,
gaussian_radius
,
draw_gaussian
,
transform_bbox
,
clip_bbox
)
logger
=
logging
.
getLogger
(
__name__
)
...
...
@@ -2556,6 +2556,7 @@ class DebugVisibleImage(BaseOperator):
image
.
save
(
save_path
,
quality
=
95
)
return
sample
@
register_op
class
Rotate
(
BaseOperator
):
def
__init__
(
self
,
...
...
@@ -2581,18 +2582,18 @@ class Rotate(BaseOperator):
if
self
.
center
is
None
:
self
.
center
=
(
width
//
2
,
height
//
2
)
M
=
cv2
.
getRotationMatrix2D
(
self
.
center
,
self
.
degree
,
self
.
scale
)
im
=
cv2
.
warpAffine
(
im
,
M
,
(
width
,
height
),
borderValue
=
self
.
border_value
)
im
=
cv2
.
warpAffine
(
im
,
M
,
(
width
,
height
),
borderValue
=
self
.
border_value
)
# rotate bbox
if
bbox
.
shape
[
0
]
>
0
:
new_bbox
,
new_label
=
transform_bbox
(
bbox
,
label
,
M
,
width
,
height
,
self
.
area_thr
)
new_bbox
,
new_label
=
transform_bbox
(
bbox
,
label
,
M
,
width
,
height
,
self
.
area_thr
)
else
:
new_bbox
,
new_label
=
bbox
,
label
sample
[
'image'
]
=
im
sample
[
'gt_bbox'
]
=
new_bbox
.
astype
(
np
.
float32
)
sample
[
'gt_class'
]
=
new_label
.
astype
(
np
.
int32
)
sample
[
'gt_class'
]
=
new_label
.
astype
(
np
.
int32
)
return
sample
...
...
@@ -2618,11 +2619,12 @@ class RandomRotate(BaseOperator):
self
.
center
=
center
self
.
area_thr
=
area_thr
self
.
border_value
=
border_value
def
__call__
(
self
,
sample
,
context
=
None
):
degree
=
random
.
uniform
(
*
self
.
degree
)
scale
=
random
.
uniform
(
1
-
self
.
scale
,
1
+
self
.
scale
)
rotate
=
Rotate
(
degree
,
scale
,
self
.
center
,
self
.
area_thr
,
self
.
border_value
)
rotate
=
Rotate
(
degree
,
scale
,
self
.
center
,
self
.
area_thr
,
self
.
border_value
)
return
rotate
(
sample
,
context
)
...
...
@@ -2651,13 +2653,13 @@ class Shear(BaseOperator):
shear_x
=
math
.
tan
(
self
.
shear
[
0
]
*
math
.
pi
/
180
)
shear_y
=
math
.
tan
(
self
.
shear
[
1
]
*
math
.
pi
/
180
)
M
=
np
.
array
([[
1
,
shear_x
,
0
],
[
shear_y
,
1
,
0
]])
im
=
cv2
.
warpAffine
(
im
,
M
,
(
width
,
height
),
borderValue
=
self
.
border_value
)
im
=
cv2
.
warpAffine
(
im
,
M
,
(
width
,
height
),
borderValue
=
self
.
border_value
)
# shear box
if
bbox
.
shape
[
0
]
>
0
:
new_bbox
,
new_label
=
transform_bbox
(
bbox
,
label
,
M
,
width
,
height
,
self
.
area_thr
)
new_bbox
,
new_label
=
transform_bbox
(
bbox
,
label
,
M
,
width
,
height
,
self
.
area_thr
)
else
:
new_bbox
,
new_label
=
bbox
,
label
sample
[
'image'
]
=
im
...
...
@@ -2689,12 +2691,12 @@ class RandomShear(BaseOperator):
assert
len
(
shear_y
)
==
2
,
'len of shear_y is not equal to 2'
else
:
raise
ValueError
(
'shear_y is not reasonable'
)
self
.
shear_x
=
shear_x
self
.
shear_y
=
shear_y
self
.
area_thr
=
area_thr
self
.
border_value
=
border_value
def
__call__
(
self
,
sample
,
context
=
None
):
shear_x
=
random
.
uniform
(
*
self
.
shear_x
)
shear_y
=
random
.
uniform
(
*
self
.
shear_y
)
...
...
@@ -2712,8 +2714,9 @@ class Translate(BaseOperator):
assert
len
(
translate
)
==
2
,
'len of translate is not equal to 2'
else
:
raise
ValueError
(
'translate is not reasonable'
)
assert
abs
(
translate
[
0
])
<
1
and
abs
(
translate
[
1
])
<
1
,
'translate should be in (-1, 1)'
assert
abs
(
translate
[
0
])
<
1
and
abs
(
translate
[
1
])
<
1
,
'translate should be in (-1, 1)'
self
.
translate
=
translate
self
.
area_thr
=
area_thr
...
...
@@ -2730,24 +2733,21 @@ class Translate(BaseOperator):
translate_y
=
int
(
self
.
translate
[
1
]
*
height
)
dst_cords
=
[
max
(
0
,
translate_y
),
max
(
0
,
translate_x
),
min
(
height
,
translate_y
+
height
),
min
(
width
,
translate_x
+
width
)
max
(
0
,
translate_y
),
max
(
0
,
translate_x
),
min
(
height
,
translate_y
+
height
),
min
(
width
,
translate_x
+
width
)
]
src_cords
=
[
max
(
-
translate_y
,
0
),
max
(
-
translate_x
,
0
),
min
(
-
translate_y
+
height
,
height
),
min
(
-
translate_x
+
width
,
width
)
max
(
-
translate_y
,
0
),
max
(
-
translate_x
,
0
),
min
(
-
translate_y
+
height
,
height
),
min
(
-
translate_x
+
width
,
width
)
]
canvas
=
np
.
ones
(
im
.
shape
,
dtype
=
np
.
uint8
)
*
self
.
border_value
canvas
[
dst_cords
[
0
]:
dst_cords
[
2
],
dst_cords
[
1
]:
dst_cords
[
3
],
:]
=
im
[
src_cords
[
0
]:
src_cords
[
2
],
src_cords
[
1
]:
src_cords
[
3
],
:]
canvas
[
dst_cords
[
0
]:
dst_cords
[
2
],
dst_cords
[
1
]:
dst_cords
[
3
],
:]
=
im
[
src_cords
[
0
]:
src_cords
[
2
],
src_cords
[
1
]:
src_cords
[
3
],
:]
if
bbox
.
shape
[
0
]
>
0
:
new_bbox
=
bbox
+
[
translate_x
,
translate_y
,
translate_x
,
translate_y
]
new_bbox
=
bbox
+
[
translate_x
,
translate_y
,
translate_x
,
translate_y
]
# compute
new_bbox
,
mask
=
clip_bbox
(
new_bbox
,
width
,
height
,
self
.
area_thr
)
new_label
=
label
[
mask
]
...
...
@@ -2782,18 +2782,20 @@ class RandomTranslate(BaseOperator):
assert
len
(
translate_y
)
==
2
,
'len of translate_y is not equal to 2'
else
:
raise
ValueError
(
'translate_y is not reasonable'
)
self
.
translate_x
=
translate_x
self
.
translate_y
=
translate_y
self
.
area_thr
=
area_thr
self
.
border_value
=
border_value
def
__call__
(
self
,
sample
,
context
=
None
):
translate_x
=
random
.
uniform
(
*
self
.
translate_x
)
translate_y
=
random
.
uniform
(
*
self
.
translate_y
)
translate
=
Translate
((
translate_x
,
translate_y
),
self
.
area_thr
,
self
.
border_value
)
translate
=
Translate
((
translate_x
,
translate_y
),
self
.
area_thr
,
self
.
border_value
)
return
translate
(
sample
,
context
)
@
register_op
class
Scale
(
BaseOperator
):
def
__init__
(
self
,
scale
,
area_thr
=
0.25
,
border_value
=
(
114
,
114
,
114
)):
...
...
@@ -2826,7 +2828,9 @@ class Scale(BaseOperator):
canvas
[:
y_lim
,
:
x_lim
,
:]
=
dst_img
[:
y_lim
,
:
x_lim
,
:]
# scale bbox
if
bbox
.
shape
[
0
]
>
0
:
new_bbox
=
bbox
*
[
self
.
scale
[
0
],
self
.
scale
[
1
],
self
.
scale
[
0
],
self
.
scale
[
1
]]
new_bbox
=
bbox
*
[
self
.
scale
[
0
],
self
.
scale
[
1
],
self
.
scale
[
0
],
self
.
scale
[
1
]
]
new_bbox
,
mask
=
clip_bbox
(
new_bbox
,
width
,
height
,
self
.
area_thr
)
new_label
=
label
[
mask
]
else
:
...
...
@@ -2840,7 +2844,11 @@ class Scale(BaseOperator):
@
register_op
class
RandomScale
(
BaseOperator
):
def
__init__
(
self
,
scale_x
,
scale_y
,
area_thr
=
0.25
,
border_value
=
(
114
,
114
,
114
)):
def
__init__
(
self
,
scale_x
,
scale_y
,
area_thr
=
0.25
,
border_value
=
(
114
,
114
,
114
)):
super
(
RandomScale
,
self
).
__init__
()
if
isinstance
(
scale_x
,
(
int
,
float
)):
assert
scale_x
>
0.
,
'scale_x should be great than 0'
...
...
@@ -2857,21 +2865,30 @@ class RandomScale(BaseOperator):
assert
len
(
scale_y
)
==
2
,
'len of scale_y is not equal to 2'
else
:
raise
ValueError
(
'scale_y is not reasonable'
)
self
.
scale_x
=
scale_x
self
.
scale_y
=
scale_y
self
.
area_thr
=
area_thr
self
.
border_value
=
border_value
def
__call__
(
self
,
sample
,
context
=
None
):
scale_x
=
random
.
uniform
(
*
self
.
scale_x
)
scale_y
=
random
.
uniform
(
*
self
.
scale_y
)
scale
=
Scale
((
scale_x
,
scale_y
),
self
.
area_thr
,
self
.
border_value
)
return
scale
(
sample
,
context
)
@
register_op
class
RandomPerspective
(
BaseOperator
):
def
__init__
(
self
,
degree
=
10
,
translate
=
0.1
,
scale
=
0.1
,
shear
=
10
,
perspective
=
0.0
,
border
=
(
0
,
0
),
area_thr
=
0.25
,
border_value
=
(
114
,
114
,
114
)):
def
__init__
(
self
,
degree
=
10
,
translate
=
0.1
,
scale
=
0.1
,
shear
=
10
,
perspective
=
0.0
,
border
=
(
0
,
0
),
area_thr
=
0.25
,
border_value
=
(
114
,
114
,
114
)):
super
(
RandomPerspective
,
self
).
__init__
()
self
.
degree
=
degree
self
.
translate
=
translate
...
...
@@ -2881,7 +2898,7 @@ class RandomPerspective(BaseOperator):
self
.
border
=
border
self
.
area_thr
=
area_thr
self
.
border_value
=
border_value
def
__call__
(
self
,
sample
,
context
=
None
):
im
=
sample
[
'image'
]
bbox
=
sample
[
'gt_bbox'
]
...
...
@@ -2909,38 +2926,50 @@ class RandomPerspective(BaseOperator):
# Shear
S
=
np
.
eye
(
3
)
# shear x (deg)
S
[
0
,
1
]
=
math
.
tan
(
random
.
uniform
(
-
self
.
shear
,
self
.
shear
)
*
math
.
pi
/
180
)
S
[
0
,
1
]
=
math
.
tan
(
random
.
uniform
(
-
self
.
shear
,
self
.
shear
)
*
math
.
pi
/
180
)
# shear y (deg)
S
[
1
,
0
]
=
math
.
tan
(
random
.
uniform
(
-
self
.
shear
,
self
.
shear
)
*
math
.
pi
/
180
)
S
[
1
,
0
]
=
math
.
tan
(
random
.
uniform
(
-
self
.
shear
,
self
.
shear
)
*
math
.
pi
/
180
)
# Translation
T
=
np
.
eye
(
3
)
T
[
0
,
2
]
=
random
.
uniform
(
0.5
-
self
.
translate
,
0.5
+
self
.
translate
)
*
width
T
[
1
,
2
]
=
random
.
uniform
(
0.5
-
self
.
translate
,
0.5
+
self
.
translate
)
*
height
T
[
0
,
2
]
=
random
.
uniform
(
0.5
-
self
.
translate
,
0.5
+
self
.
translate
)
*
width
T
[
1
,
2
]
=
random
.
uniform
(
0.5
-
self
.
translate
,
0.5
+
self
.
translate
)
*
height
# matmul
# M = T @ S @ R @ P @ C
M
=
np
.
eye
(
3
)
for
cM
in
[
T
,
S
,
R
,
P
,
C
]:
M
=
np
.
matmul
(
M
,
cM
)
if
(
self
.
border
[
0
]
!=
0
)
or
(
self
.
border
[
1
]
!=
0
)
or
(
M
!=
np
.
eye
(
3
)).
any
():
if
(
self
.
border
[
0
]
!=
0
)
or
(
self
.
border
[
1
]
!=
0
)
or
(
M
!=
np
.
eye
(
3
)).
any
():
if
self
.
perspective
:
im
=
cv2
.
warpPerspective
(
im
,
M
,
dsize
=
(
width
,
height
),
borderValue
=
self
.
border_value
)
im
=
cv2
.
warpPerspective
(
im
,
M
,
dsize
=
(
width
,
height
),
borderValue
=
self
.
border_value
)
else
:
im
=
cv2
.
warpAffine
(
im
,
M
[:
2
],
dsize
=
(
width
,
height
),
borderValue
=
self
.
border_value
)
im
=
cv2
.
warpAffine
(
im
,
M
[:
2
],
dsize
=
(
width
,
height
),
borderValue
=
self
.
border_value
)
if
bbox
.
shape
[
0
]
>
0
:
new_bbox
,
new_label
=
transform_bbox
(
bbox
,
label
,
M
,
width
,
height
,
area_thr
=
self
.
area_thr
,
perspective
=
self
.
perspective
)
new_bbox
,
new_label
=
transform_bbox
(
bbox
,
label
,
M
,
width
,
height
,
area_thr
=
self
.
area_thr
,
perspective
=
self
.
perspective
)
else
:
new_bbox
,
new_label
=
bbox
,
label
sample
[
'image'
]
=
im
sample
[
'gt_bbox'
]
=
new_bbox
.
astype
(
np
.
float32
)
sample
[
'gt_class'
]
=
new_label
.
astype
(
np
.
int32
)
return
sample
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录