Commit c1f4adaf authored by Yuxin Wu's avatar Yuxin Wu

update docs on augmentor

parent 12f78b94
...@@ -7,13 +7,13 @@ An augmentor is a part of the DataFlow, so you can always ...@@ -7,13 +7,13 @@ An augmentor is a part of the DataFlow, so you can always
to do whatever operations to your data, rather than writing an augmentor. to do whatever operations to your data, rather than writing an augmentor.
Augmentors just sometimes make things easier. Augmentors just sometimes make things easier.
An augmentor maps images to images. An image augmentor maps an image to an image.
If you have such a mapping function `f` already, you can simply use `imgaug.MapImage(f)` as the If you have such a mapping function `f` already, you can simply use `imgaug.MapImage(f)` as the
augmentor, or use `MapDataComponent(dataflow, f, index)` as the DataFlow. augmentor, or use `MapDataComponent(dataflow, f, index)` as the DataFlow.
In other words, for simple mapping you do not need to write an augmentor. In other words, for simple mapping you do not need to write an augmentor.
An augmentor may do something more than applying a mapping. The interface you will need to implement An augmentor may do something more than just applying a mapping.
is: The interface you will need to implement is:
```python ```python
class MyAug(imgaug.ImageAugmentor): class MyAug(imgaug.ImageAugmentor):
...@@ -23,6 +23,11 @@ class MyAug(imgaug.ImageAugmentor): ...@@ -23,6 +23,11 @@ class MyAug(imgaug.ImageAugmentor):
def _augment(self, img, params): def _augment(self, img, params):
return augmented_img return augmented_img
# optional method
def _augment_coords(self, coords, param):
# coords is a Nx2 floating point array, each row is (x, y)
return augmented_coords
``` ```
It does the following extra things for you: It does the following extra things for you:
...@@ -31,7 +36,8 @@ It does the following extra things for you: ...@@ -31,7 +36,8 @@ It does the following extra things for you:
guaranteed to have different seeds when you use multiprocess prefetch. guaranteed to have different seeds when you use multiprocess prefetch.
In multiprocess settings, you have to use this rng to generate random numbers. In multiprocess settings, you have to use this rng to generate random numbers.
2. Random parameter generation and the actual augmentation is separated. This allows you to apply the 2. The logic of random parameter generation and the actual augmentation is separated in different methods.
This allows you to apply the
same transformation to several images together (with `AugmentImageComponents`), same transformation to several images together (with `AugmentImageComponents`),
which is essential to tasks such as segmentation. which is essential to tasks such as segmentation.
Or apply the same transformations to images plus coordinate labels (with `AugmentImageCoordinates`), Or apply the same transformations to images plus coordinate labels (with `AugmentImageCoordinates`),
......
...@@ -198,8 +198,10 @@ def TFSummaryWriter(*args, **kwargs): ...@@ -198,8 +198,10 @@ def TFSummaryWriter(*args, **kwargs):
class JSONWriter(TrainingMonitor): class JSONWriter(TrainingMonitor):
""" """
Write all scalar data to a json, grouped by their global step. Write all scalar data to a json file under ``logger.LOG_DIR``, grouped by their global step.
It also tries to recover the epoch number during setup, if an existing json file is found at the same place.
""" """
FILENAME = 'stat.json' FILENAME = 'stat.json'
def __new__(cls): def __new__(cls):
......
...@@ -63,6 +63,11 @@ class Augmentor(object): ...@@ -63,6 +63,11 @@ class Augmentor(object):
class ImageAugmentor(Augmentor): class ImageAugmentor(Augmentor):
def _augment_coords(self, coords, param): def _augment_coords(self, coords, param):
"""
By default, keeps coordinates unchanged.
If a subclass changes coordinates but couldn't implement this method,
it should ``raise NotImplementedError()``.
"""
return coords return coords
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment