Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
seminar-breakout
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Shashank Suhas
seminar-breakout
Commits
6dfbf89b
You need to sign in or sign up before continuing.
Commit
6dfbf89b
authored
Sep 05, 2016
by
Yuxin Wu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
augmentation
parent
5bf3bc81
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
69 additions
and
10 deletions
+69
-10
tensorpack/dataflow/dataset/bsds500.py
tensorpack/dataflow/dataset/bsds500.py
+5
-4
tensorpack/dataflow/image.py
tensorpack/dataflow/image.py
+4
-4
tensorpack/dataflow/imgaug/geometry.py
tensorpack/dataflow/imgaug/geometry.py
+50
-1
tensorpack/dataflow/imgaug/imgproc.py
tensorpack/dataflow/imgaug/imgproc.py
+10
-1
No files found.
tensorpack/dataflow/dataset/bsds500.py
View file @
6dfbf89b
...
@@ -28,8 +28,8 @@ class BSDS500(RNGDataFlow):
...
@@ -28,8 +28,8 @@ class BSDS500(RNGDataFlow):
Produce (image, label) pair, where image has shape (321, 481, 3) and
Produce (image, label) pair, where image has shape (321, 481, 3) and
ranges in [0,255]. Label is binary and has shape (321, 481).
ranges in [0,255]. Label is binary and has shape (321, 481).
Those pixels annotated as boundaries by
>= 3 annotators are
Those pixels annotated as boundaries by
<=2 annotators are set to 0.
considered positive examples.
This is used in `Holistically-Nested Edge Detection
This is used in `Holistically-Nested Edge Detection
<http://arxiv.org/abs/1504.06375>`_.
<http://arxiv.org/abs/1504.06375>`_.
"""
"""
...
@@ -73,8 +73,9 @@ class BSDS500(RNGDataFlow):
...
@@ -73,8 +73,9 @@ class BSDS500(RNGDataFlow):
gt
=
loadmat
(
gt_file
)[
'groundTruth'
][
0
]
gt
=
loadmat
(
gt_file
)[
'groundTruth'
][
0
]
n_annot
=
gt
.
shape
[
0
]
n_annot
=
gt
.
shape
[
0
]
gt
=
sum
(
gt
[
k
][
'Boundaries'
][
0
][
0
]
for
k
in
range
(
n_annot
))
gt
=
sum
(
gt
[
k
][
'Boundaries'
][
0
][
0
]
for
k
in
range
(
n_annot
))
gt
[
gt
>
3
]
=
3
gt
[
gt
<=
2
]
=
0
gt
=
gt
/
3.0
gt
=
gt
.
astype
(
'float32'
)
gt
/=
np
.
max
(
gt
)
if
gt
.
shape
[
0
]
>
gt
.
shape
[
1
]:
if
gt
.
shape
[
0
]
>
gt
.
shape
[
1
]:
gt
=
gt
.
transpose
()
gt
=
gt
.
transpose
()
assert
gt
.
shape
==
(
IMG_H
,
IMG_W
)
assert
gt
.
shape
==
(
IMG_H
,
IMG_W
)
...
...
tensorpack/dataflow/image.py
View file @
6dfbf89b
...
@@ -9,7 +9,7 @@ from .base import DataFlow, ProxyDataFlow
...
@@ -9,7 +9,7 @@ from .base import DataFlow, ProxyDataFlow
from
.common
import
MapDataComponent
,
MapData
from
.common
import
MapDataComponent
,
MapData
from
.imgaug
import
AugmentorList
from
.imgaug
import
AugmentorList
__all__
=
[
'ImageFromFile'
,
'AugmentImageComponent'
,
'AugmentImage
sTogether
'
]
__all__
=
[
'ImageFromFile'
,
'AugmentImageComponent'
,
'AugmentImage
Components
'
]
class
ImageFromFile
(
DataFlow
):
class
ImageFromFile
(
DataFlow
):
""" Generate rgb images from list of files """
""" Generate rgb images from list of files """
...
@@ -45,7 +45,7 @@ class AugmentImageComponent(MapDataComponent):
...
@@ -45,7 +45,7 @@ class AugmentImageComponent(MapDataComponent):
"""
"""
:param ds: a `DataFlow` instance.
:param ds: a `DataFlow` instance.
:param augmentors: a list of `ImageAugmentor` instance to be applied in order.
:param augmentors: a list of `ImageAugmentor` instance to be applied in order.
:param index: the index of the image component in the produced datapoints by `ds`. default to be 0
:param index: the index
(or list of indices)
of the image component in the produced datapoints by `ds`. default to be 0
"""
"""
self
.
augs
=
AugmentorList
(
augmentors
)
self
.
augs
=
AugmentorList
(
augmentors
)
super
(
AugmentImageComponent
,
self
)
.
__init__
(
super
(
AugmentImageComponent
,
self
)
.
__init__
(
...
@@ -56,7 +56,7 @@ class AugmentImageComponent(MapDataComponent):
...
@@ -56,7 +56,7 @@ class AugmentImageComponent(MapDataComponent):
self
.
augs
.
reset_state
()
self
.
augs
.
reset_state
()
class
AugmentImage
sTogether
(
MapData
):
class
AugmentImage
Components
(
MapData
):
""" Augment a list of images of the same shape, with the same parameters"""
""" Augment a list of images of the same shape, with the same parameters"""
def
__init__
(
self
,
ds
,
augmentors
,
index
=
(
0
,
1
)):
def
__init__
(
self
,
ds
,
augmentors
,
index
=
(
0
,
1
)):
"""
"""
...
@@ -75,7 +75,7 @@ class AugmentImagesTogether(MapData):
...
@@ -75,7 +75,7 @@ class AugmentImagesTogether(MapData):
dp
[
idx
]
=
self
.
augs
.
_augment
(
dp
[
idx
],
prms
)
dp
[
idx
]
=
self
.
augs
.
_augment
(
dp
[
idx
],
prms
)
return
dp
return
dp
super
(
AugmentImage
sTogether
,
self
)
.
__init__
(
ds
,
func
)
super
(
AugmentImage
Components
,
self
)
.
__init__
(
ds
,
func
)
def
reset_state
(
self
):
def
reset_state
(
self
):
self
.
ds
.
reset_state
()
self
.
ds
.
reset_state
()
...
...
tensorpack/dataflow/imgaug/geometry.py
View file @
6dfbf89b
...
@@ -4,10 +4,11 @@
...
@@ -4,10 +4,11 @@
# Author: Yuxin Wu <ppwwyyxxc@gmail.com>
# Author: Yuxin Wu <ppwwyyxxc@gmail.com>
from
.base
import
ImageAugmentor
from
.base
import
ImageAugmentor
import
math
import
cv2
import
cv2
import
numpy
as
np
import
numpy
as
np
__all__
=
[
'Rotation'
]
__all__
=
[
'Rotation'
,
'RotationAndCropValid'
]
class
Rotation
(
ImageAugmentor
):
class
Rotation
(
ImageAugmentor
):
""" Random rotate the image w.r.t a random center"""
""" Random rotate the image w.r.t a random center"""
...
@@ -31,3 +32,51 @@ class Rotation(ImageAugmentor):
...
@@ -31,3 +32,51 @@ class Rotation(ImageAugmentor):
flags
=
self
.
interp
,
borderMode
=
self
.
border
)
flags
=
self
.
interp
,
borderMode
=
self
.
border
)
return
ret
return
ret
class
RotationAndCropValid
(
ImageAugmentor
):
""" Random rotate and crop the largest possible rect without the border
This will produce images of different shapes.
"""
def
__init__
(
self
,
max_deg
,
interp
=
cv2
.
INTER_CUBIC
):
self
.
_init
(
locals
())
def
_get_augment_params
(
self
,
img
):
deg
=
self
.
_rand_range
(
-
self
.
max_deg
,
self
.
max_deg
)
return
deg
def
_augment
(
self
,
img
,
deg
):
center
=
(
img
.
shape
[
1
]
*
0.5
,
img
.
shape
[
0
]
*
0.5
)
rot_m
=
cv2
.
getRotationMatrix2D
(
center
,
deg
,
1
)
ret
=
cv2
.
warpAffine
(
img
,
rot_m
,
img
.
shape
[
1
::
-
1
],
flags
=
self
.
interp
,
borderMode
=
cv2
.
BORDER_CONSTANT
)
neww
,
newh
=
RotationAndCropValid
.
largest_rotated_rect
(
ret
.
shape
[
1
],
ret
.
shape
[
0
],
deg
)
neww
=
min
(
neww
,
ret
.
shape
[
1
])
newh
=
min
(
newh
,
ret
.
shape
[
0
])
newx
=
center
[
0
]
-
neww
*
0.5
newy
=
center
[
1
]
-
newh
*
0.5
#print(ret.shape, deg, newx, newy, neww, newh)
return
ret
[
newy
:
newy
+
newh
,
newx
:
newx
+
neww
]
@
staticmethod
def
largest_rotated_rect
(
w
,
h
,
angle
):
""" http://stackoverflow.com/questions/16702966/rotate-image-and-crop-out-black-borders """
angle
=
angle
/
180.0
*
math
.
pi
if
w
<=
0
or
h
<=
0
:
return
0
,
0
width_is_longer
=
w
>=
h
side_long
,
side_short
=
(
w
,
h
)
if
width_is_longer
else
(
h
,
w
)
# since the solutions for angle, -angle and 180-angle are all the same,
# if suffices to look at the first quadrant and the absolute values of sin,cos:
sin_a
,
cos_a
=
abs
(
math
.
sin
(
angle
)),
abs
(
math
.
cos
(
angle
))
if
side_short
<=
2.
*
sin_a
*
cos_a
*
side_long
:
# half constrained case: two crop corners touch the longer side,
# the other two corners are on the mid-line parallel to the longer line
x
=
0.5
*
side_short
wr
,
hr
=
(
x
/
sin_a
,
x
/
cos_a
)
if
width_is_longer
else
(
x
/
cos_a
,
x
/
sin_a
)
else
:
# fully constrained case: crop touches all 4 sides
cos_2a
=
cos_a
*
cos_a
-
sin_a
*
sin_a
wr
,
hr
=
(
w
*
cos_a
-
h
*
sin_a
)
/
cos_2a
,
(
h
*
cos_a
-
w
*
sin_a
)
/
cos_2a
return
wr
,
hr
tensorpack/dataflow/imgaug/imgproc.py
View file @
6dfbf89b
...
@@ -6,7 +6,8 @@ from .base import ImageAugmentor
...
@@ -6,7 +6,8 @@ from .base import ImageAugmentor
import
numpy
as
np
import
numpy
as
np
import
cv2
import
cv2
__all__
=
[
'Brightness'
,
'Contrast'
,
'MeanVarianceNormalize'
,
'GaussianBlur'
,
'Gamma'
]
__all__
=
[
'Brightness'
,
'Contrast'
,
'MeanVarianceNormalize'
,
'GaussianBlur'
,
'Gamma'
,
'Clip'
]
class
Brightness
(
ImageAugmentor
):
class
Brightness
(
ImageAugmentor
):
"""
"""
...
@@ -102,3 +103,11 @@ class Gamma(ImageAugmentor):
...
@@ -102,3 +103,11 @@ class Gamma(ImageAugmentor):
img
=
cv2
.
LUT
(
img
,
lut
)
.
astype
(
'float32'
)
img
=
cv2
.
LUT
(
img
,
lut
)
.
astype
(
'float32'
)
return
img
return
img
class
Clip
(
ImageAugmentor
):
def
__init__
(
self
,
min
=
0
,
max
=
255
):
assert
delta
>
0
self
.
_init
(
locals
())
def
_augment
(
self
,
img
,
_
):
img
=
np
.
clip
(
img
,
self
.
min
,
self
.
max
)
return
img
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment