{"id":16739399,"url":"https://github.com/james77777778/keras-image-models","last_synced_at":"2025-05-06T20:09:49.465Z","repository":{"id":218067591,"uuid":"740294021","full_name":"james77777778/keras-image-models","owner":"james77777778","description":"A library that includes Keras3 layers, blocks and models with pretrained weights, providing support for transfer learning, feature extraction, and more.","archived":false,"fork":false,"pushed_at":"2024-06-03T07:21:13.000Z","size":333,"stargazers_count":36,"open_issues_count":4,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-10-13T00:50:56.358Z","etag":null,"topics":["deep-learning","imagenet","jax","keras","keras3","model-zoo","pretrained-models","tensorflow","timm","torch"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/james77777778.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-08T03:34:04.000Z","updated_at":"2024-08-01T18:47:04.000Z","dependencies_parsed_at":"2024-05-22T03:28:08.226Z","dependency_job_id":"f515cd54-6739-4bc3-87bd-44b4d1498bec","html_url":"https://github.com/james77777778/keras-image-models","commit_stats":null,"previous_names":["james77777778/kimm","james77777778/keras-image-models"],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/james77777778%2Fkeras-image-models","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/james77777778%2Fkeras-image-models/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/james77777778%2Fkeras-image-models/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/james77777778%2Fkeras-image-models/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/james77777778","download_url":"https://codeload.github.com/james77777778/keras-image-models/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221579961,"owners_count":16846894,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["deep-learning","imagenet","jax","keras","keras3","model-zoo","pretrained-models","tensorflow","timm","torch"],"created_at":"2024-10-13T00:50:50.085Z","updated_at":"2025-05-06T20:09:49.458Z","avatar_url":"https://github.com/james77777778.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- markdownlint-disable MD033 --\u003e\n\u003c!-- markdownlint-disable MD041 --\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg width=\"50%\" src=\"https://github.com/james77777778/kimm/assets/20734616/b21db8f2-307b-4791-b93d-e913e45fb238\" alt=\"KIMM\"\u003e\n\n[![Keras](https://img.shields.io/badge/keras-v3.3.0+-success.svg)](https://github.com/keras-team/keras)\n[![PyPI](https://img.shields.io/pypi/v/kimm)](https://pypi.org/project/kimm/)\n[![Contributions Welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/james77777778/kimm/issues)\n[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/james77777778/keras-image-models/actions.yml?label=tests)](https://github.com/james77777778/keras-image-models/actions/workflows/actions.yml?query=branch%3Amain++)\n[![codecov](https://codecov.io/gh/james77777778/keras-image-models/graph/badge.svg?token=eEha1SR80D)](https://codecov.io/gh/james77777778/keras-image-models)\n\u003c/div\u003e\n\n# Keras Image Models\n\n- [Latest Updates](#latest-updates)\n- [Introduction](#introduction)\n- [Usage](#usage)\n- [Installation](#installation)\n- [Quickstart](#quickstart)\n  - [Image classification with ImageNet weights](#image-classification-using-the-model-pretrained-on-imagenet)\n  - [An end-to-end fine-tuning example: cats vs. dogs dataset](#an-end-to-end-example-fine-tuning-an-image-classification-model-on-a-cats-vs-dogs-dataset)\n  - [Grad-CAM](#grad-cam)\n- [Model Zoo](#model-zoo)\n- [License](#license)\n- [Acknowledgements](#acknowledgements)\n\n## Latest Updates\n\n2024/06/02:\n\n- Add docstrings for all `kimm` models.\n- Merge reparameterizable layers into 1 `ReparameterizableConv2D`\n- Add `GhostNetV3*` from [huawei-noah/Efficient-AI-Backbones](https://github.com/huawei-noah/Efficient-AI-Backbones)\n\n## Introduction\n\n**K**eras **Im**age **M**odels (`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.\n\n**KIMM** is:\n\n- 🚀 A model zoo where almost all models come with **pre-trained weights on ImageNet**.\n- 🧰 Providing APIs to export models to `.tflite` and `.onnx`.\n- 🔧 Supporting the **reparameterization** technique.\n- ✨ Integrated with **feature extraction** capability.\n\n## Usage\n\n- `kimm.list_models`\n- `kimm.models.*.available_feature_keys`\n- `kimm.models.*(...)`\n- `kimm.models.*(..., feature_extractor=True, feature_keys=[...])`\n\n```python\nimport keras\nimport kimm\n\n# List available models\nprint(kimm.list_models(\"mobileone\", weights=\"imagenet\"))\n# ['MobileOneS0', 'MobileOneS1', 'MobileOneS2', 'MobileOneS3']\n\n# Initialize model with pretrained ImageNet weights\n# Note: all `kimm` models expect inputs in the value range of [0, 255] by\n# default if `include_preprocessing=True`\nx = keras.random.uniform([1, 224, 224, 3]) * 255.0\nmodel = kimm.models.MobileOneS0()\ny = model.predict(x)\nprint(y.shape)\n# (1, 1000)\n\n# Print some basic information about the model\nprint(model)\n# \u003cMobileOneS0 name=MobileOneS0, input_shape=(None, None, None, 3),\n# default_size=224, preprocessing_mode=\"imagenet\", feature_extractor=False,\n# feature_keys=None\u003e\n# This information can also be accessed through properties\nprint(model.input_shape, model.default_size, model.preprocessing_mode)\n\n# List available feature keys of the model class\nprint(kimm.models.MobileOneS0.available_feature_keys)\n# ['STEM_S2', 'BLOCK0_S4', 'BLOCK1_S8', 'BLOCK2_S16', 'BLOCK3_S32']\n\n# Enable feature extraction by setting `feature_extractor=True`\n# `feature_keys` can be optionally specified\nfeature_extractor = kimm.models.MobileOneS0(\n    feature_extractor=True, feature_keys=[\"BLOCK2_S16\", \"BLOCK3_S32\"]\n)\nfeatures = feature_extractor.predict(x)\nfor feature_name, feature in features.items():\n    print(feature_name, feature.shape)\n# BLOCK2_S16 (1, 14, 14, 256), BLOCK3_S32 (1, 7, 7, 1024), ...\n```\n\n\u003e [!NOTE]  \n\u003e All models in `kimm` expect inputs in the value range of [0, 255] by default if `include_preprocessing=True`.\n\u003e Some models only accept static inputs. You should explicitly specify the input shape for these models by `input_shape=[*, *, 3]`.\n\n## Advanced Usage\n\n- `kimm.utils.get_reparameterized_model`\n- `kimm.export.export_tflite`\n- `kimm.export.export_onnx`\n\n```python\nimport keras\nimport kimm\nimport numpy as np\n\n# Initialize a reparameterizable model\nx = keras.random.uniform([1, 224, 224, 3]) * 255.0\nmodel = kimm.models.MobileOneS0()\ny = model.predict(x)\n\n# Get reparameterized model by kimm.utils.get_reparameterized_model\nreparameterized_model = kimm.utils.get_reparameterized_model(model)\ny2 = reparameterized_model.predict(x)\nnp.testing.assert_allclose(\n    keras.ops.convert_to_numpy(y), keras.ops.convert_to_numpy(y2), atol=1e-3\n)\n\n# Export model to tflite format\nkimm.export.export_tflite(reparameterized_model, 224, \"model.tflite\")\n\n# Export model to onnx format\n# Note: must be \"channels_first\" format before the exporting\n# kimm.export.export_onnx(reparameterized_model, 224, \"model.onnx\")\n```\n\n## Installation\n\n```bash\npip install keras kimm -U\n```\n\n\u003e [!IMPORTANT]  \n\u003e Make sure you have installed a supported backend for Keras.\n\n## Quickstart\n\n### Image classification using the model pretrained on ImageNet\n\n[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/14WxYgVjlwCIO9MwqPYW-dskbTL2UHsVN?usp=sharing)\n\nUsing `kimm.models.VisionTransformerTiny16`:\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg width=\"50%\" src=\"https://github.com/james77777778/keras-image-models/assets/20734616/7caa4e5e-8561-425b-aaf2-6ae44ac3ea00\" alt=\"african_elephant\"\u003e\n\u003c/div\u003e\n\n```bash\n1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 1s/step\nPredicted: [('n02504458', 'African_elephant', 0.6895825), ('n01871265', 'tusker', 0.17934209), ('n02504013', 'Indian_elephant', 0.12927249)]\n```\n\n### An end-to-end example: fine-tuning an image classification model on a cats vs. dogs dataset\n\n[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1IbqfqG2NKEOKvBOznIPT1kjOdVPfThmd?usp=sharing)\n\nUsing `kimm.models.EfficientNetLiteB0`:\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg width=\"75%\" src=\"https://github.com/james77777778/kimm/assets/20734616/cbfc0773-a3fa-407d-be9a-fba4f19da6d3\" alt=\"kimm_prediction_0\"\u003e\n\n\u003cimg width=\"75%\" src=\"https://github.com/james77777778/kimm/assets/20734616/2eac0831-75bb-4790-a3af-412c3e09cf8f\" alt=\"kimm_prediction_1\"\u003e\n\u003c/div\u003e\n\nReference: [Transfer learning \u0026 fine-tuning (keras.io)](https://keras.io/guides/transfer_learning/#an-endtoend-example-finetuning-an-image-classification-model-on-a-cats-vs-dogs-dataset)\n\n### Grad-CAM\n\n[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1h25VmsYDOLL6BNbRPEVOh1arIgcEoHu6?usp=sharing)\n\nUsing `kimm.models.MobileViTS`:\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg width=\"50%\" src=\"https://github.com/james77777778/kimm/assets/20734616/cb5022a3-aaea-4324-a9cd-3d2e63a0a6b2\" alt=\"grad_cam\"\u003e\n\u003c/div\u003e\n\nReference: [Grad-CAM class activation visualization (keras.io)](https://keras.io/examples/vision/grad_cam/)\n\n## Model Zoo\n\n|Model|Paper|Weights are ported from|API (`kimm.models.*`)|\n|-|-|-|-|\n|ConvMixer|[ICLR 2022 Submission](https://arxiv.org/abs/2201.09792)|`timm`|`ConvMixer*`|\n|ConvNeXt|[CVPR 2022](https://arxiv.org/abs/2201.03545)|`timm`|`ConvNeXt*`|\n|DenseNet|[CVPR 2017](https://arxiv.org/abs/1608.06993)|`timm`|`DenseNet*`|\n|EfficientNet|[ICML 2019](https://arxiv.org/abs/1905.11946)|`timm`|`EfficientNet*`|\n|EfficientNetLite|[ICML 2019](https://arxiv.org/abs/1905.11946)|`timm`|`EfficientNetLite*`|\n|EfficientNetV2|[ICML 2021](https://arxiv.org/abs/2104.00298)|`timm`|`EfficientNetV2*`|\n|GhostNet|[CVPR 2020](https://arxiv.org/abs/1911.11907)|`timm`|`GhostNet*`|\n|GhostNetV2|[NeurIPS 2022](https://arxiv.org/abs/2211.12905)|`timm`|`GhostNetV2*`|\n|GhostNetV3|[arXiv 2024](https://arxiv.org/abs/2404.11202)|`github`|`GhostNetV3*`|\n|HGNet||`timm`|`HGNet*`|\n|HGNetV2||`timm`|`HGNetV2*`|\n|InceptionNeXt|[CVPR 2024](https://arxiv.org/abs/2303.16900)|`timm`|`InceptionNeXt*`|\n|InceptionV3|[CVPR 2016](https://arxiv.org/abs/1512.00567)|`timm`|`InceptionV3`|\n|LCNet|[arXiv 2021](https://arxiv.org/abs/2109.15099)|`timm`|`LCNet*`|\n|MobileNetV2|[CVPR 2018](https://arxiv.org/abs/1801.04381)|`timm`|`MobileNetV2*`|\n|MobileNetV3|[ICCV 2019](https://arxiv.org/abs/1905.02244)|`timm`|`MobileNetV3*`|\n|MobileOne|[CVPR 2023](https://arxiv.org/abs/2206.04040)|`timm`|`MobileOne*`|\n|MobileViT|[ICLR 2022](https://arxiv.org/abs/2110.02178)|`timm`|`MobileViT*`|\n|MobileViTV2|[arXiv 2022](https://arxiv.org/abs/2206.02680)|`timm`|`MobileViTV2*`|\n|RegNet|[CVPR 2020](https://arxiv.org/abs/2003.13678)|`timm`|`RegNet*`|\n|RepVGG|[CVPR 2021](https://arxiv.org/abs/2101.03697)|`timm`|`RepVGG*`|\n|ResNet|[CVPR 2015](https://arxiv.org/abs/1512.03385)|`timm`|`ResNet*`|\n|TinyNet|[NeurIPS 2020](https://arxiv.org/abs/2010.14819)|`timm`|`TinyNet*`|\n|VGG|[ICLR 2015](https://arxiv.org/abs/1409.1556)|`timm`|`VGG*`|\n|ViT|[ICLR 2021](https://arxiv.org/abs/2010.11929)|`timm`|`VisionTransformer*`|\n|Xception|[CVPR 2017](https://arxiv.org/abs/1610.02357)|`keras`|`Xception`|\n\nThe export scripts can be found in `tools/convert_*.py`.\n\n## License\n\nPlease refer to [timm](https://github.com/huggingface/pytorch-image-models#licenses) as this project is built upon it.\n\n### `kimm` Code\n\nThe code here is licensed Apache 2.0.\n\n## Acknowledgements\n\nThanks for these awesome projects that were used in `kimm`\n\n- [https://github.com/keras-team/keras](https://github.com/keras-team/keras)\n- [https://github.com/huggingface/pytorch-image-models](https://github.com/huggingface/pytorch-image-models)\n\n## Citing\n\n### BibTeX\n\n```bash\n@misc{rw2019timm,\n  author = {Ross Wightman},\n  title = {PyTorch Image Models},\n  year = {2019},\n  publisher = {GitHub},\n  journal = {GitHub repository},\n  doi = {10.5281/zenodo.4414861},\n  howpublished = {\\url{https://github.com/rwightman/pytorch-image-models}}\n}\n```\n\n```bash\n@misc{hy2024kimm,\n  author = {Hongyu Chiu},\n  title = {Keras Image Models},\n  year = {2024},\n  publisher = {GitHub},\n  journal = {GitHub repository},\n  howpublished = {\\url{https://github.com/james77777778/kimm}}\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjames77777778%2Fkeras-image-models","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjames77777778%2Fkeras-image-models","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjames77777778%2Fkeras-image-models/lists"}