资源算法Ultrasound nerve segmentation

Ultrasound nerve segmentation

2019-09-10 | |  92 |   0 |   0

ultrasound-nerve-segmentation

Kaggle ultrasound nerve segmentation challenge using Keras. Read my blog for details and insights.

Install (Ubuntu {14,16}, GPU)

cuDNN required.

Tensorflow backend

  • https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/get_started/os_setup.md

Keras

  • sudo apt-get install libhdf5-dev

  • sudo pip install h5py

  • sudo pip install keras

In ~/.keras/keras.json

{
    "image_dim_ordering": "th",
    "epsilon": 1e-07,
    "floatx": "float32",
    "backend": "tensorflow"
}

Python deps

  • sudo apt-get install python-opencv

  • sudo apt-get install python-sklearn

Prepare

Download the data from https://www.kaggle.com/c/ultrasound-nerve-segmentation/data and place it in input/train and input/test folders respectively.

Run

python data.py

to generate data within input folder. This is a one time only operation,

Training

python train.py

Results will be generated in "results/" folder. results/net.hdf5 - best model

Submission

python submission.py

will generate submission with run length encoding that can directly be uploaded to kaggle.

Model

I used U-net like architecture (http://arxiv.org/abs/1505.04597) with a few tweaks. - Main idea was to use two training heads, one optimizing bce for nerve presence and other optimizing dice for segmentation. During test time simply zero out masks that have probability < 0.5. This was necessary because large number of samples contained no masks, and bce/dice score alone would simply be optimized by outputting all zeros for masks. - Network contains ~8.25 million parameters. Single epoch took 4 minutes on a Titan X with 12 GB memory. - Reduced learning rate by factor of 0.25 when stagnation occurred within last 4 epochs. - Logs are written to 'logs/' folder and monitored via tensorboard. Examined histograms to detect saturation. Note that you need to use fixed set vs generator to get histograms, as of keras 1.1.1 due to a known issue. - Weight regularization prevented convergence (perhaps smaller lambda needed to be used). Used dropout instead to prevent weight saturation (which tended to occur without it) - he_normal weight initialization. - conv with 2 X 2 stride instead of max pooling to downsample, in light of recent results with VAE and GANs. - ELU activation, batchnorm everywhere. - Used 1 X 1 conv instead of dense layers in the spirit of paper - "Striving for simplicity - The all conv net".

Augmentation: - Parallel aug generation on CPU. - random rotation (+/- 5 deg) - random translations (+/- 10 px) - elastic deformation didn't help much. - Larger rotations/translations prevented learning.

Validation: - 10% of the examples, stratified split by mask/no-mask

Visual inspection:

  • utils.examine_generator() can be used to visually inspect augmented samples.

  • utils.inspect_set() can be used to examine test time predictions on train/val set.

  • I am in the process of generalizing layer visualization code. Otherwise, I used various gradient ascent style visualizations to sanity check if the network is learning the right thing.

Credits

Borrowed starter code from https://github.com/jocicmarko/ultrasound-nerve-segmentation/, particularly data prep and submission portion.


上一篇:SEC

下一篇:multi-task

用户评价
全部评价

热门资源

  • Keras-ResNeXt

    Keras ResNeXt Implementation of ResNeXt models...

  • seetafaceJNI

    项目介绍 基于中科院seetaface2进行封装的JAVA...

  • spark-corenlp

    This package wraps Stanford CoreNLP annotators ...

  • capsnet-with-caps...

    CapsNet with capsule-wise convolution Project ...

  • inferno-boilerplate

    This is a very basic boilerplate example for pe...