U-NET Example
==============
The U-Net is a convolutional network architecture designed for image
segmentation. This architecture captures context and localization
features precisely and outperforms the traditional convolutional
networks. The U-NET won the ISBI cell tracking challenge 2015. Please
refer `the
website `_
or `paper `_ for more detail. In
this document, we will use biomedical images to train unet network and
demonstrate how to run the U-NET with CANDLE library.
Before Getting Started
~~~~~~~~~~~~~~~~~~~~~~
Please read `CANDLE Library User Guide `_.
This guide explains how to embed your neural
network in CANDLE compliant way. We provide CANDLE compliant unet
example. ``unet.py`` contains base class definition and helper methods,
and ``unet_candle.py`` presents mandatory methods as an example.
.. code:: python
# in unet.py
additional_definitions = None
required = ['activation', 'optimizer', 'batch_size', 'epochs', 'kernel_initializer']
class UNET(candle.Benchmark):
def set_locals(self):
if required is not None:
self.required = set(required)
if additional_definitions is not None:
self.additional_definitions = additional_definitions
.. code:: python
# in unet_candle.py
import unet
import candle_keras as candle
def initialize_parameters():
unet_common = unet.UNET(unet.file_path,
'unet_params.txt',
'keras',
prog='unet_example',
desc='UNET example' )
# Initialize parameters
gParameters = candle.initialize_parameters(unet_common)
return gParameters
.. code:: python
# in unet_candle.py
def run(gParameters): # load data x_train, y_train = unet.load_data()
# example has 420 x 580
model = unet.build_model(420, 580, gParameters['activation'], gParameters['kernel_initializer'])
model.summary()
model.compile(optimizer=gParameters['optimizer'], loss='binary_crossentropy', metrics=['accuracy'])
model_chkpoint = ModelCheckpoint('unet.hdf5', monitor='loss', verbose=1, save_best_only=True)
history = model.fit(x_train, y_train,
batch_size=gParameters['batch_size'],
epochs=gParameters['epochs'],
verbose=1,
validation_split=0.3,
shuffle=True,
callbacks=[model_chkpoint]
)
return history
Download data and pre-process
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Before we start training unet, we need training images. We will use
Kaggle Competition images. Go to `Ultrasound Nerve
Segmentation `_
and download images. You may need an account to download.
Once you download ``train.zip``, unzip it and you will see image files
named like ``x_xx.tif`` ``x_xx.mask.tif``. This is a pair of ultrasound
nerve image and its annotated masks. Here is a pre-processing script.
This basically reads all the images and store as an numpy array in
``imgs_train.npy`` and ``imgs_mask_train.npy`` respectively.
.. code:: python
# pre-process.py
import os
import glob
import numpy as np
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
i = 0
rows = 420
cols = 580
imgs = glob.glob("./train/*_mask.tif")
img_data = np.ndarray((len(imgs), rows, cols, 1), dtype=np.uint8)
img_mask = np.ndarray((len(imgs), rows, cols, 1), dtype=np.uint8)
for img_name in imgs:
img_name = img_name[img_name.rindex("/") + 1:]
img_name = img_name[:img_name.rindex("_")]
img = load_img(os.path.join("./train/", img_name + '.tif'), grayscale = True)
mask = load_img(os.path.join("./train/", img_name + '_mask.tif'), grayscale = True)
img = img_to_array(img)
mask = img_to_array(mask)
img_data[i] = img
img_mask[i] = mask
i += 1
np.save(os.path.join("./npydata/", 'imgs_train.npy'), img_data)
np.save(os.path.join("./npydata/", 'imgs_mask_train.npy'), img_mask)
Running UNET example on Theta
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Once we have data files ready, we need to setup CANDLE framework. You
will need to clone Benchmarks and Supervisor repositories, and modify
some evironmental variables to run. Please read `CANDLE
User Guide `_
for more detail information with regard to workflows that
CANDLE provides. This tutorial will run CANDLE’s UPF workflow.
.. code:: bash
# clone Supervisor
$ git clone https://github.com/ECP-CANDLE/Supervisor.git
$ cd Supervisor
$ git checkout master
# clone Benchmark
$ git clone https://github.com/ECP-CANDLE/Benchmarks.git $ cd Benchmarks
$ git checkout release_01
place nypdata and update file path in ``unet.py``. It is recommended to
use full path (starting from ``/``).
.. code:: python
# Benchmarks/examples/unet/unet.py
import numpy as np
def load_data():
path = 'npydata'
x_train = np.load(os.path.join(path, 'imgs_train.npy'))
y_train = np.load(os.path.join(path, 'imgs_mask_train.npy'))
Step1. Go to workflow directory.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code:: bash
cd $SUPERVISOR/workflows/upf
Step 2. Update ``cfg-sys-1.sh`` to config env variables.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code:: bash
# Uncomment below to use custom python script to run
# Use file name without .py (e.g, my_script.py)
MODEL_PYTHON_SCRIPT=unet_candle
BENCHMARK_DIR=/projects/CSC249ADOA01/hsyoo/candle_lib/Benchmarks/examples/unet/
Step 3. Update ``upf-1.txt``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Each line is a json doc, and you can modify params like below. This
example will run 3 training jobs with varying ``activation`` method and
``optimizer``.
.. code:: json
{"id":"test0", "epoches":1, "activation": "relu", "optimizer": "adam"}
{"id":"test1", "epoches":1, "activation": "sigmoid", "optimizer": "adam"}
{"id":"test2", "epoches":1, "activation": "relu", "optimizer": "sgd"}
Step 4. Submit
^^^^^^^^^^^^^^
.. code:: bash
$ QUEUE=default PROCS=4 WALLTIME=02:00:00 ./test/upf-1.sh theta