2024/06/02:
- Add docstrings for all
kimmmodels. - Merge reparameterizable layers into 1
ReparameterizableConv2D - Add
GhostNetV3*from huawei-noah/Efficient-AI-Backbones
Keras Image Models (kimm) is a collection of image models, blocks and layers written in Keras 3. The goal is to offer SOTA models with pretrained weights in a user-friendly manner.
KIMM is:
- 🚀 A model zoo where almost all models come with pre-trained weights on ImageNet.
- 🧰 Providing APIs to export models to
.tfliteand.onnx. - 🔧 Supporting the reparameterization technique.
- ✨ Integrated with feature extraction capability.
kimm.list_modelskimm.models.*.available_feature_keyskimm.models.*(...)kimm.models.*(..., feature_extractor=True, feature_keys=[...])
import keras import kimm # List available models print(kimm.list_models("mobileone", weights="imagenet")) # ['MobileOneS0', 'MobileOneS1', 'MobileOneS2', 'MobileOneS3'] # Initialize model with pretrained ImageNet weights # Note: all `kimm` models expect inputs in the value range of [0, 255] by # default if `include_preprocessing=True` x = keras.random.uniform([1, 224, 224, 3]) * 255.0 model = kimm.models.MobileOneS0() y = model.predict(x) print(y.shape) # (1, 1000) # Print some basic information about the model print(model) # <MobileOneS0 name=MobileOneS0, input_shape=(None, None, None, 3), # default_size=224, preprocessing_mode="imagenet", feature_extractor=False, # feature_keys=None> # This information can also be accessed through properties print(model.input_shape, model.default_size, model.preprocessing_mode) # List available feature keys of the model class print(kimm.models.MobileOneS0.available_feature_keys) # ['STEM_S2', 'BLOCK0_S4', 'BLOCK1_S8', 'BLOCK2_S16', 'BLOCK3_S32'] # Enable feature extraction by setting `feature_extractor=True` # `feature_keys` can be optionally specified feature_extractor = kimm.models.MobileOneS0( feature_extractor=True, feature_keys=["BLOCK2_S16", "BLOCK3_S32"] ) features = feature_extractor.predict(x) for feature_name, feature in features.items(): print(feature_name, feature.shape) # BLOCK2_S16 (1, 14, 14, 256), BLOCK3_S32 (1, 7, 7, 1024), ...Note
All models in kimm expect inputs in the value range of [0, 255] by default if include_preprocessing=True. Some models only accept static inputs. You should explicitly specify the input shape for these models by input_shape=[*, *, 3].
kimm.utils.get_reparameterized_modelkimm.export.export_tflitekimm.export.export_onnx
import keras import kimm import numpy as np # Initialize a reparameterizable model x = keras.random.uniform([1, 224, 224, 3]) * 255.0 model = kimm.models.MobileOneS0() y = model.predict(x) # Get reparameterized model by kimm.utils.get_reparameterized_model reparameterized_model = kimm.utils.get_reparameterized_model(model) y2 = reparameterized_model.predict(x) np.testing.assert_allclose( keras.ops.convert_to_numpy(y), keras.ops.convert_to_numpy(y2), atol=1e-3 ) # Export model to tflite format kimm.export.export_tflite(reparameterized_model, 224, "model.tflite") # Export model to onnx format # Note: must be "channels_first" format before the exporting # kimm.export.export_onnx(reparameterized_model, 224, "model.onnx")pip install keras kimm -UImportant
Make sure you have installed a supported backend for Keras.
Using kimm.models.VisionTransformerTiny16:
1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 1s/step Predicted: [('n02504458', 'African_elephant', 0.6895825), ('n01871265', 'tusker', 0.17934209), ('n02504013', 'Indian_elephant', 0.12927249)]Using kimm.models.EfficientNetLiteB0:
Reference: Transfer learning & fine-tuning (keras.io)
Using kimm.models.MobileViTS:
Reference: Grad-CAM class activation visualization (keras.io)
| Model | Paper | Weights are ported from | API (kimm.models.*) |
|---|---|---|---|
| ConvMixer | ICLR 2022 Submission | timm | ConvMixer* |
| ConvNeXt | CVPR 2022 | timm | ConvNeXt* |
| DenseNet | CVPR 2017 | timm | DenseNet* |
| EfficientNet | ICML 2019 | timm | EfficientNet* |
| EfficientNetLite | ICML 2019 | timm | EfficientNetLite* |
| EfficientNetV2 | ICML 2021 | timm | EfficientNetV2* |
| GhostNet | CVPR 2020 | timm | GhostNet* |
| GhostNetV2 | NeurIPS 2022 | timm | GhostNetV2* |
| GhostNetV3 | arXiv 2024 | github | GhostNetV3* |
| HGNet | timm | HGNet* | |
| HGNetV2 | timm | HGNetV2* | |
| InceptionNeXt | CVPR 2024 | timm | InceptionNeXt* |
| InceptionV3 | CVPR 2016 | timm | InceptionV3 |
| LCNet | arXiv 2021 | timm | LCNet* |
| MobileNetV2 | CVPR 2018 | timm | MobileNetV2* |
| MobileNetV3 | ICCV 2019 | timm | MobileNetV3* |
| MobileOne | CVPR 2023 | timm | MobileOne* |
| MobileViT | ICLR 2022 | timm | MobileViT* |
| MobileViTV2 | arXiv 2022 | timm | MobileViTV2* |
| RegNet | CVPR 2020 | timm | RegNet* |
| RepVGG | CVPR 2021 | timm | RepVGG* |
| ResNet | CVPR 2015 | timm | ResNet* |
| TinyNet | NeurIPS 2020 | timm | TinyNet* |
| VGG | ICLR 2015 | timm | VGG* |
| ViT | ICLR 2021 | timm | VisionTransformer* |
| Xception | CVPR 2017 | keras | Xception |
The export scripts can be found in tools/convert_*.py.
Please refer to timm as this project is built upon it.
The code here is licensed Apache 2.0.
Thanks for these awesome projects that were used in kimm
@misc{rw2019timm, author = {Ross Wightman}, title = {PyTorch Image Models}, year = {2019}, publisher = {GitHub}, journal = {GitHub repository}, doi = {10.5281/zenodo.4414861}, howpublished = {\url{https://github.com/rwightman/pytorch-image-models}} }@misc{hy2024kimm, author = {Hongyu Chiu}, title = {Keras Image Models}, year = {2024}, publisher = {GitHub}, journal = {GitHub repository}, howpublished = {\url{https://github.com/james77777778/kimm}} }



