/EfficientUnet

Keras Implementation of Unet with EfficientNet as encoder

Primary LanguagePythonMIT LicenseMIT

EfficientUnet

Keras Implementation of Unet with EfficientNet as encoder

  • Unet with EfficientNet encoder
    • EfficientNet-B0
    • EfficientNet-B1
    • EfficientNet-B2
    • EfficientNet-B3
    • EfficientNet-B4
    • EfficientNet-B5
    • EfficientNet-B6
    • EfficientNet-B7

Requirements

  1. tensorflow >= 1.13.1
  2. Keras >= 2.2.4 (It will automatically be installed when you install efficientunet)

Special Notice

When I built this, tensorflow 1.13.1 and keras 2.2.4 are the latest. There was no TF2.0. All the functions and the so-called "best practices" I used in this project may be obsolete. Anyway, this library still works. But please keep in mind, this is built before the advent of TF2.0.


Installation

Install efficientunet:

pip install efficientunet

Basic Usage

from efficientunet import *

model = get_efficient_unet_b5((224, 224, 3), pretrained=True, block_type='transpose', concat_input=True)
model.summary()

Useful notes

  1. This library assumes channels_last !

  2. You cannot specify None for input_shape, since the input_shape is heavily used in the code for inferring the architecture. (The EfficientUnets are constructed dynamically)

  3. Since you cannot use None for input_shape, the image size for training process and for inference process have to be the same.
    If you do need to use a different image size for inference, a feasible solution is:

    1. Save the weights of your well-trained model
    2. Create a new model with the desired input shape
    3. Load the weights of your well-trained model into this newly created model
  4. Due to some rounding problem in the decoder path (not a bug, this is a feature 😏), the input shape should be divisible by 32.
    e.g. 224x224 is a suitable size for input images, but 225x225 is not.


Potential issues

  • If you are unable to load the model from the saved HDF5 file, please refer to this issue.
  • Especially this comment can be used as a workaround.

Acknowledgment

  1. Some code snippets of EfficientNet are directly borrowed from this repo.
  2. The links of pretrained weights are borrowed from this repo.