Skip to main content

[![PyPI version](https://badge.fury.io/py/image-classifiers.svg)](https://badge.fury.io/py/image-classifiers) [![Build Status](https://travis-ci.com/qubvel/classification_models.svg?branch=master)](https://travis-ci.com/qubvel/classification_models)
# Classification models Zoo
Trained on [ImageNet](http://www.image-net.org/) classification models. [Keras](https://keras.io/).

### Architectures:
- [VGG](https://arxiv.org/abs/1409.1556) [16, 19]
- [ResNet](https://arxiv.org/abs/1512.03385) [18, 34, 50, 101, 152]
- [ResNeXt](https://arxiv.org/abs/1611.05431) [50, 101]
- [SE-ResNet](https://arxiv.org/abs/1709.01507) [18, 34, 50, 101, 152]
- [SE-ResNeXt](https://arxiv.org/abs/1709.01507) [50, 101]
- [SE-Net](https://arxiv.org/abs/1709.01507) [154]
- [DenseNet](https://arxiv.org/abs/1608.06993) [121, 169, 201]
- [Inception ResNet V2](https://arxiv.org/abs/1602.07261)
- [Inception V3](http://arxiv.org/abs/1512.00567)
- [Xception](https://arxiv.org/abs/1610.02357)
- [NASNet](https://arxiv.org/abs/1707.07012) [large, mobile]
- [MobileNet](https://arxiv.org/pdf/1704.04861.pdf)
- [MobileNet v2](https://arxiv.org/abs/1801.04381)

### Specification
The top-k accuracy were obtained using center single crop on the
2012 ILSVRC ImageNet validation set and may differ from the original ones.
The input size used was 224x224 (min size 256) for all models except:
- NASNetLarge 331x331 (352)
- InceptionV3 299x299 (324)
- InceptionResNetV2 299x299 (324)
- Xception 299x299 (324)

The inference \*Time was evaluated on 500 batches of size 16.
All models have been tested using same hardware and software.
Time is listed just for comparison of performance.

| Model |Acc@1|Acc@5|Time*|Source|
|-----------------|:---:|:---:|:---:|------|
|vgg16 |70.79|89.74|24.95|[keras](https://github.com/keras-team/keras-applications)|
|vgg19 |70.89|89.69|24.95|[keras](https://github.com/keras-team/keras-applications)|
|resnet18 |68.24|88.49|16.07|[mxnet](https://github.com/Microsoft/MMdnn)|
|resnet34 |72.17|90.74|17.37|[mxnet](https://github.com/Microsoft/MMdnn)|
|resnet50 |74.81|92.38|22.62|[mxnet](https://github.com/Microsoft/MMdnn)|
|resnet101 |76.58|93.10|33.03|[mxnet](https://github.com/Microsoft/MMdnn)|
|resnet152 |76.66|93.08|42.37|[mxnet](https://github.com/Microsoft/MMdnn)|
|resnet50v2 |69.73|89.31|19.56|[keras](https://github.com/keras-team/keras-applications)|
|resnet101v2 |71.93|90.41|28.80|[keras](https://github.com/keras-team/keras-applications)|
|resnet152v2 |72.29|90.61|41.09|[keras](https://github.com/keras-team/keras-applications)|
|resnext50 |77.36|93.48|37.57|[keras](https://github.com/keras-team/keras-applications)|
|resnext101 |78.48|94.00|60.07|[keras](https://github.com/keras-team/keras-applications)|
|densenet121 |74.67|92.04|27.66|[keras](https://github.com/keras-team/keras-applications)|
|densenet169 |75.85|92.93|33.71|[keras](https://github.com/keras-team/keras-applications)|
|densenet201 |77.13|93.43|42.40|[keras](https://github.com/keras-team/keras-applications)|
|inceptionv3 |77.55|93.48|38.94|[keras](https://github.com/keras-team/keras-applications)|
|xception |78.87|94.20|42.18|[keras](https://github.com/keras-team/keras-applications)|
|inceptionresnetv2|80.03|94.89|54.77|[keras](https://github.com/keras-team/keras-applications)|
|seresnet18 |69.41|88.84|20.19|[pytorch](https://github.com/Cadene/pretrained-models.pytorch)|
|seresnet34 |72.60|90.91|22.20|[pytorch](https://github.com/Cadene/pretrained-models.pytorch)|
|seresnet50 |76.44|93.02|23.64|[pytorch](https://github.com/Cadene/pretrained-models.pytorch)|
|seresnet101 |77.92|94.00|32.55|[pytorch](https://github.com/Cadene/pretrained-models.pytorch)|
|seresnet152 |78.34|94.08|47.88|[pytorch](https://github.com/Cadene/pretrained-models.pytorch)|
|seresnext50 |78.74|94.30|38.29|[pytorch](https://github.com/Cadene/pretrained-models.pytorch)|
|seresnext101 |79.88|94.87|62.80|[pytorch](https://github.com/Cadene/pretrained-models.pytorch)|
|senet154 |81.06|95.24|137.36|[pytorch](https://github.com/Cadene/pretrained-models.pytorch)|
|nasnetlarge |**82.12**|**95.72**|116.53|[keras](https://github.com/keras-team/keras-applications)|
|nasnetmobile |74.04|91.54|27.73|[keras](https://github.com/keras-team/keras-applications)|
|mobilenet |70.36|89.39|15.50|[keras](https://github.com/keras-team/keras-applications)|
|mobilenetv2 |71.63|90.35|18.31|[keras](https://github.com/keras-team/keras-applications)|

###### Note
[SE-]ResNeXt and SENet models build with `GroupConvolution` which
is not implemented in Keras/TensorFlow. For correct work of `load_model` function
custom object is used. To be able to load one of these models from file, please,
import `classification_models` before.

### Weights
| Name |Classes | Models |
|-------------------------|:--------:|:---------:|
|'imagenet' |1000 |all models |
|'imagenet11k-place365ch' |11586 |resnet50 |
|'imagenet11k' |11221 |resnet152 |


### Installation

Requirements:
- python >= 3.5
- keras >= 2.1.0
- tensorflow >= 1.9

###### Note
This library does not have TensorFlow in a requirements for installation.
Please, choose suitable version (‘cpu’/’gpu’) and install it manually using
official Guide (https://www.tensorflow.org/install/).

PyPI package:
```bash
$ pip install image-classifiers
```
Latest version:
```bash
$ pip install git+https://github.com/qubvel/classification_models.git
```

### Examples

##### Loading model with `imagenet` weights:

1) Direct way (keras-applications like)
```python
from classification_models.resnet import ResNet18, preprocess_input

model = ResNet18((224, 224, 3), weights='imagenet')
```

2) Using `Classifiers` container
```python
from classification_models import Classifiers

classifier, preprocess_input = Classifiers.get('resnet18')
model = classifier((224, 224, 3), weights='imagenet')
```
This way take one additional line of code, however if you would
like to train several models you do not need to import them directly,
just access everything through `Classifiers`.

You can get all model names using `Classifiers.names()` method.

##### Inference example:

```python
import numpy as np
from skimage.io import imread
from skimage.transfrom import resize
from keras.applications.imagenet_utils import decode_predictions

from classification_models.resnet import ResNet18, preprocess_input

# read and prepare image
x = imread('./imgs/tests/seagull.jpg')
x = resize(x, (224, 224)) * 255 # cast back to 0-255 range
x = preprocess_input(x)
x = np.expand_dims(x, 0)

# load model
model = ResNet18(input_shape=(224,224,3), weights='imagenet', classes=1000)

# processing image
y = model.predict(x)

# result
print(decode_predictions(y))
```

##### Model fine-tuning example:
```python
import keras
from classification_models.resnet import ResNet18, preprocess_input

# prepare your data
X = ...
y = ...

X = preprocess_input(X)

n_classes = 10

# build model
base_model = ResNet18(input_shape=(224,224,3), weights='imagenet', include_top=False)
x = keras.layers.AveragePooling2D((7,7))(base_model.output)
output = keras.layers.Dense(n_classes)(x)
model = keras.models.Model(inputs=[base_model.input], outputs=[output])

# train
model.compile(optimizer='SGD', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(X, y)
```


Metadata

Release files for image-classifiers 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for image-classifiers 0.2.0
File Size Uploaded
image_classifiers-0.2.0.tar.gz 45.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for image-classifiers 0.2.0
File Interpreter ABI Platform
image_classifiers-0.2.0-py2.py3-none-any.whl Python 3, Python 2 none any Details

Total release size: 122.4 kB

Release files / image_classifiers-0.2.0.tar.gz

Download URL image_classifiers-0.2.0.tar.gz
Size 45.9 kB
Tags Source
SHA-256 checksum
How to use checksums
2a0fffb91ea3943a7b7e198c4e207e11a71fd45776cacb3d54852d4f27706242
BLAKE2b-256 checksum
How to use checksums
95b5ad75eb085acb0f4c442fc995c23c752321fe353d69abf6459990139415df
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.12.1 pkginfo/1.5.0.1 requests/2.18.4 setuptools/36.5.0.post20170921 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

Release files / image_classifiers-0.2.0-py2.py3-none-any.whl

Download URL image_classifiers-0.2.0-py2.py3-none-any.whl
Size 76.5 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
89c862834da893ce64bb8728e472df3dbec2cb662d0c12ab29d9a0ff2082df90
BLAKE2b-256 checksum
How to use checksums
de32a1e74e03f74506d1e4b46bb2732ca5a7b18ac52a36b5e3547e63537ce74c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.12.1 pkginfo/1.5.0.1 requests/2.18.4 setuptools/36.5.0.post20170921 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

Release history Release notifications | RSS feed

1.0.0

2 release files

0.2.2

2 release files

0.2.1

2 release files

This release

0.2.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page