diff --git a/README.rst b/README.rst index 71ce91def092132d87082c2bb222eea5d16d8190..9e07a337ae18039439a10e9d747b292d58006dae 100644 --- a/README.rst +++ b/README.rst @@ -155,19 +155,20 @@ PSPNet FPN .. table:: - =========== ===== - Type Names - =========== ===== - VGG ``'vgg16' 'vgg19'`` - ResNet ``'resnet18' 'resnet34' 'resnet50' 'resnet101' 'resnet152'`` - SE-ResNet ``'seresnet18' 'seresnet34' 'seresnet50' 'seresnet101' 'seresnet152'`` - ResNeXt ``'resnext50' 'resnext101'`` - SE-ResNeXt ``'seresnext50' 'seresnext101'`` - SENet154 ``'senet154'`` - DenseNet ``'densenet121' 'densenet169' 'densenet201'`` - Inception ``'inceptionv3' 'inceptionresnetv2'`` - MobileNet ``'mobilenet' 'mobilenetv2'`` - =========== ===== + ============= ===== + Type Names + ============= ===== + VGG ``'vgg16' 'vgg19'`` + ResNet ``'resnet18' 'resnet34' 'resnet50' 'resnet101' 'resnet152'`` + SE-ResNet ``'seresnet18' 'seresnet34' 'seresnet50' 'seresnet101' 'seresnet152'`` + ResNeXt ``'resnext50' 'resnext101'`` + SE-ResNeXt ``'seresnext50' 'seresnext101'`` + SENet154 ``'senet154'`` + DenseNet ``'densenet121' 'densenet169' 'densenet201'`` + Inception ``'inceptionv3' 'inceptionresnetv2'`` + MobileNet ``'mobilenet' 'mobilenetv2'`` + EfficientNet ``'efficientnetb0' 'efficientnetb1' 'efficientnetb2' 'efficientnetb3'`` + ============= ===== .. epigraph:: All backbones have weights trained on 2012 ILSVRC ImageNet dataset (``encoder_weights='imagenet'``). diff --git a/requirements.txt b/requirements.txt index d6e5cc7f82d037658ecc2aa9a6fcfa33f820d2b3..b444226051dcc2b87f1ce6fe510a419d15e80952 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ keras>=2.2.0 -keras_applications>=1.0.7 +keras_applications==1.0.7 scikit-image -image-classifiers==0.2.0 \ No newline at end of file +image-classifiers==0.2.0 +efficientnet>=0.0.3 diff --git a/segmentation_models/backbones/__init__.py b/segmentation_models/backbones/__init__.py index 91bd62fc7eb91f7809e49fd263d8eb1663b09899..d34cc8dd238db4eb5fa9736181627e596f988a19 100644 --- a/segmentation_models/backbones/__init__.py +++ b/segmentation_models/backbones/__init__.py @@ -1,3 +1,4 @@ +import efficientnet as eff from classification_models import Classifiers from classification_models import resnext @@ -14,6 +15,18 @@ Classifiers._models.update({ 'resnext101': [resnext.ResNeXt101, resnext.models.preprocess_input], 'mobilenet': [mbn.MobileNet, mbn.preprocess_input], 'mobilenetv2': [mbn2.MobileNetV2, mbn2.preprocess_input], + + 'efficientnetb0': [eff.EfficientNetB0, eff.preprocess_input], + 'efficientnetb1': [eff.EfficientNetB1, eff.preprocess_input], + 'efficientnetb2': [eff.EfficientNetB2, eff.preprocess_input], + 'efficientnetb3': [eff.EfficientNetB3, eff.preprocess_input], + + # weights are not released +# 'efficientnetb4': [eff.EfficientNetB4, eff.preprocess_input], +# 'efficientnetb5': [eff.EfficientNetB5, eff.preprocess_input], +# 'efficientnetb6': [eff.EfficientNetB6, eff.preprocess_input], +# 'efficientnetb7': [eff.EfficientNetB7, eff.preprocess_input], + }) DEFAULT_FEATURE_LAYERS = { @@ -59,7 +72,19 @@ DEFAULT_FEATURE_LAYERS = { # Mobile Nets 'mobilenet': ('conv_pw_11_relu', 'conv_pw_5_relu', 'conv_pw_3_relu', 'conv_pw_1_relu'), 'mobilenetv2': ('block_13_expand_relu', 'block_6_expand_relu', 'block_3_expand_relu', 'block_1_expand_relu'), - + + # EfficientNets + 'efficientnetb0': (169, 77, 47, 17), + 'efficientnetb1': (246, 122, 76, 30), + 'efficientnetb2': (246, 122, 76, 30), + 'efficientnetb3': (278, 122, 76, 30), + + # weights are not released +# 'efficientnetb4': (342, 154, 92, 30), +# 'efficientnetb5': (419, 199, 121, 43), +# 'efficientnetb6': (483, 231, 137, 43), +# 'efficientnetb7': (592, 276, 166, 56), + } diff --git a/segmentation_models/fpn/model.py b/segmentation_models/fpn/model.py index 3e10ebd809b3f730fbf79fa80750e584c4a281e1..2555278b81f15abbfaa748ffdf9d8fbdc5d9503e 100644 --- a/segmentation_models/fpn/model.py +++ b/segmentation_models/fpn/model.py @@ -11,13 +11,13 @@ old_args_map = { 'interpolation': 'final_interpolation', 'upsample_rates': None, # removed 'last_upsample': None, # removed + 'input_tensor': None, # removed } @legacy_support(old_args_map) def FPN(backbone_name='vgg16', input_shape=(None, None, 3), - input_tensor=None, classes=21, activation='softmax', encoder_weights='imagenet', @@ -61,7 +61,6 @@ def FPN(backbone_name='vgg16', backbone = get_backbone(backbone_name, input_shape=input_shape, - input_tensor=input_tensor, weights=encoder_weights, include_top=False) diff --git a/segmentation_models/linknet/model.py b/segmentation_models/linknet/model.py index 09c6b31b4d728a19c5ebbb67b1ec61d5988ed281..c48c7e8a1e067f7877abeee7ab58748608e18717 100644 --- a/segmentation_models/linknet/model.py +++ b/segmentation_models/linknet/model.py @@ -62,7 +62,6 @@ def Linknet(backbone_name='vgg16', backbone = get_backbone(backbone_name, input_shape=input_shape, - input_tensor=None, weights=encoder_weights, include_top=False) diff --git a/segmentation_models/pspnet/model.py b/segmentation_models/pspnet/model.py index 08f47e1546accc1cb1b38d5f3c04f687fdb716f8..74d0cae30773538db7b9d751d8fbc0ec25c0d992 100644 --- a/segmentation_models/pspnet/model.py +++ b/segmentation_models/pspnet/model.py @@ -84,7 +84,6 @@ def PSPNet(backbone_name='vgg16', backbone = get_backbone(backbone_name, input_shape=input_shape, - input_tensor=None, weights=encoder_weights, include_top=False) diff --git a/segmentation_models/unet/model.py b/segmentation_models/unet/model.py index cbb3b0bdc55d15cf4372dbe53f669ccad85dab87..52e75a49cb989f576baf4bd70b2b9cd09a19f871 100644 --- a/segmentation_models/unet/model.py +++ b/segmentation_models/unet/model.py @@ -58,7 +58,6 @@ def Unet(backbone_name='vgg16', backbone = get_backbone(backbone_name, input_shape=input_shape, - input_tensor=None, weights=encoder_weights, include_top=False)