This repository contains a Keras (and TensorFlow Keras) reimplementation of EfficientNet, a lightweight convolutional neural network architecture achieving the state-of-the-art accuracy with an order of magnitude fewer parameters and FLOPS, on both ImageNet and five other commonly used transfer learning datasets.
The codebase is heavily inspired by the TensorFlow implementation.
There was a huge library update on 24th of July 2019. Now efficientnet works with both frameworks: keras
and tensorflow.keras
.
If you have models trained before that date, please use efficientnet of version 0.0.4 to load them. You can roll back using pip install -U efficientnet==0.0.4
or pip install -U git+https://github.com/qubvel/efficientnet/tree/v0.0.4
.
EfficientNets rely on AutoML and compound scaling to achieve superior performance without compromising resource efficiency. The AutoML Mobile framework has helped develop a mobile-size baseline network, EfficientNet-B0, which is then improved by the compound scaling method to obtain EfficientNet-B1 to B7.
EfficientNets achieve state-of-the-art accuracy on ImageNet with an order of magnitude better efficiency:
-
In high-accuracy regime, EfficientNet-B7 achieves the state-of-the-art 84.4% top-1 / 97.1% top-5 accuracy on ImageNet with 66M parameters and 37B FLOPS. At the same time, the model is 8.4x smaller and 6.1x faster on CPU inference than the former leader, Gpipe.
-
In middle-accuracy regime, EfficientNet-B1 is 7.6x smaller and 5.7x faster on CPU inference than ResNet-152, with similar ImageNet accuracy.
-
Compared to the widely used ResNet-50, EfficientNet-B4 improves the top-1 accuracy from 76.3% of ResNet-50 to 82.6% (+6.3%), under similar FLOPS constraints.
- Initializing the model:
# models can be build with Keras or Tensorflow frameworks
# use keras and tfkeras modules respectively
# efficientnet.keras / efficientnet.tfkeras
import efficientnet.keras as efn
model = efn.EfficientNetB0(weights='imagenet') # or weights='noisy-student'
- Loading the pre-trained weights:
# model use some custom objects, so before loading saved model
# import module your network was build with
# e.g. import efficientnet.keras / import efficientnet.tfkeras
import efficientnet.tfkeras
from tensorflow.keras.models import load_model
model = load_model('path/to/model.h5')
See the complete example of loading the model and making an inference in the Jupyter notebook here.
The performance of each model variant using the pre-trained weights converted from checkpoints provided by the authors is as follows:
Architecture | @top1* Imagenet | @top1* Noisy-Student |
---|---|---|
EfficientNetB0 | 0.772 | 0.788 |
EfficientNetB1 | 0.791 | 0.815 |
EfficientNetB2 | 0.802 | 0.824 |
EfficientNetB3 | 0.816 | 0.841 |
EfficientNetB4 | 0.830 | 0.853 |
EfficientNetB5 | 0.837 | 0.861 |
EfficientNetB6 | 0.841 | 0.864 |
EfficientNetB7 | 0.844 | 0.869 |
* - topK accuracy score for converted models (imagenet val
set)
Keras >= 2.2.0
/TensorFlow >= 1.12.0
keras_applications >= 1.0.7
scikit-image
$ pip install -U git+https://github.com/qubvel/efficientnet
PyPI stable release
$ pip install -U efficientnet
PyPI latest release (with keras and tf.keras support)
$ pip install -U --pre efficientnet
- How can I convert the original TensorFlow checkpoints to Keras HDF5?
Pick the target directory (like dist
) and run the converter script from the repo directory as follows:
$ ./scripts/convert_efficientnet.sh --target_dir dist
You can also optionally create the virtual environment with all the dependencies installed by adding --make_venv=true
and operate in a self-destructing temporary location instead of the target directory by setting --tmp_working_dir=true
.
I would like to thanks community members who actively contribute to this repository:
- Sasha Illarionov (@sdll) for preparing automated script for weights conversion
- Björn Barz (@Callidior) for model code adaptation for keras and tensorflow.keras frameworks