diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 00000000..a76a177a --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,51 @@ +name: Python Main CI +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + pytest: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ ubuntu-latest, macos-latest ] + env: + OS: ${{ matrix.os }} + PYTHON: '3.7' + + steps: + - uses: actions/checkout@master + - name: Setup Python + uses: actions/setup-python@master + with: + python-version: 3.7 + + - name: Installation + run: | + python --version + pip --version + pip install flit + pip install . + pip install -r requirements/dev.txt + pip list + shell: bash + + - name: Generate coverage report + run: | + pip install -r requirements/test.txt + coverage erase + coverage run -m pytest + coverage report -m + coverage xml + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + file: ./coverage.xml + flags: unittests + env_vars: OS,PYTHON + name: codecov-umbrella + fail_ci_if_error: false diff --git a/Makefile b/Makefile index 8f14d35e..1d9c7717 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,12 @@ docs_serve: test: pytest +coverage: ## Run tests with coverage + coverage erase + coverage run -m pytest + coverage report -m + coverage xml + clean: rm -rf dist find . -type f -name "*.DS_Store" -ls -delete diff --git a/README.md b/README.md index ba319098..bc75655a 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,6 @@ # chitra -[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=aniketmaurya_chitra&metric=alert_status)](https://sonarcloud.io/dashboard?id=aniketmaurya_chitra) -[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=aniketmaurya_chitra&metric=ncloc)](https://sonarcloud.io/dashboard?id=aniketmaurya_chitra) -[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=aniketmaurya_chitra&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=aniketmaurya_chitra) -[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=aniketmaurya_chitra&metric=security_rating)](https://sonarcloud.io/dashboard?id=aniketmaurya_chitra) -[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=aniketmaurya_chitra&metric=reliability_rating)](https://sonarcloud.io/dashboard?id=aniketmaurya_chitra) -[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=aniketmaurya_chitra&metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=aniketmaurya_chitra) +[![CodeFactor](https://www.codefactor.io/repository/github/aniketmaurya/chitra/badge)](https://www.codefactor.io/repository/github/aniketmaurya/chitra) ![GitHub issues](https://img.shields.io/github/issues/aniketmaurya/chitra?style=flat) [![Documentation Status](https://readthedocs.org/projects/chitra/badge/?version=latest)](https://chitra.readthedocs.io/en/latest/?badge=latest) [![Discord](https://img.shields.io/discord/848469007443165184?style=flat)](https://discord.gg/TdnAfDw3kB) diff --git a/chitra/_nbdev.py b/chitra/_nbdev.py deleted file mode 100644 index 1774cf15..00000000 --- a/chitra/_nbdev.py +++ /dev/null @@ -1,63 +0,0 @@ -# AUTOGENERATED BY NBDEV! DO NOT EDIT! - -__all__ = ["index", "modules", "custom_doc_links", "git_url"] - -index = { - "remove_dsstore": "00_core.ipynb", - "get_basename": "04_dataloader.ipynb", - "IMAGENET_LABELS": "00_core.ipynb", - "tf": "01_image.ipynb", - "torch": "01_image.ipynb", - "DATA_FORMATS": "01_image.ipynb", - "DEFAULT_MODE": "01_image.ipynb", - "read_image": "01_image.ipynb", - "resize_image": "01_image.ipynb", - "BoundingBoxes": "01_image.ipynb", - "Chitra": "01_image.ipynb", - "benchmark": "02_datagenerator.ipynb", - "get_filenames": "02_datagenerator.ipynb", - "get_label": "02_datagenerator.ipynb", - "ImageSizeList": "02_datagenerator.ipynb", - "Pipeline": "02_datagenerator.ipynb", - "Dataset": "02_datagenerator.ipynb", - "MODEL_DICT": "03_trainer.ipynb", - "OPT_DICT": "03_trainer.ipynb", - "create_classifier": "03_trainer.ipynb", - "create_cnn": "03_trainer.ipynb", - "Trainer": "03_trainer.ipynb", - "InterpretModel": "03_trainer.ipynb", - "Learner": "03_trainer.ipynb", - "AUTOTUNE": "04_dataloader.ipynb", - "show_batch": "04_dataloader.ipynb", - "Clf": "04_dataloader.ipynb", - "label_color": "05_visualization.ipynb", - "colors": "05_visualization.ipynb", - "draw_box": "05_visualization.ipynb", - "draw_caption": "05_visualization.ipynb", - "draw_boxes": "05_visualization.ipynb", - "draw_detections": "05_visualization.ipynb", - "draw_annotations": "05_visualization.ipynb", - "disable_gpu": "06_tf_utils.ipynb", - "limit_gpu": "06_tf_utils.ipynb", - "gpu_dynamic_mem_growth": "06_tf_utils.ipynb", - "is_installed": "07_import_utils.ipynb", - "INSTALLED_MODULES": "07_import_utils.ipynb", - "pytorch_to_onnx": "08_model_converter.ipynb", - "onnx_to_pytorch": "08_model_converter.ipynb", - "tf2_to_onnx": "08_model_converter.ipynb", - "tf2_to_pytorch": "08_model_converter.ipynb" -} - -modules = [ - "core.py", "image.py", "datagenerator.py", "trainer.py", "dataloader.py", - "visualization.py", "utility/tf_utils.py", "utility/import_utils.py", - "converter/core.py" -] - -doc_url = "https://chitra.aniketmaurya.com/" - -git_url = "https://github.com/aniketmaurya/chitra/tree/master/" - - -def custom_doc_links(name): - return None diff --git a/chitra/dataloader.py b/chitra/dataloader.py index 1b2622f8..2d626111 100644 --- a/chitra/dataloader.py +++ b/chitra/dataloader.py @@ -13,11 +13,9 @@ from .core import remove_dsstore from .tf_image import read_image, resize_image -# Cell AUTOTUNE = tf.data.experimental.AUTOTUNE -# Cell def get_basename(path: tf.string): assert isinstance(path, tf.Tensor) return tf.strings.split(path, os.path.sep)[-1] diff --git a/chitra/image.py b/chitra/image.py index b2c65d10..36c2e0d3 100644 --- a/chitra/image.py +++ b/chitra/image.py @@ -24,7 +24,7 @@ # Cell from typing import Any, List, Optional, Union -DATA_FORMATS = Union[str, Image.Image, np.ndarray, tf.Tensor, torch.Tensor] +DATA_FORMATS = Union[str, Image.Image, np.ndarray, 'tf.Tensor', 'torch.Tensor'] DEFAULT_MODE = os.environ.get("CHITRA_DEFAULT_MODE", "TF") from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage diff --git a/chitra/tf_image.py b/chitra/tf_image.py index e52696b0..55d381b1 100644 --- a/chitra/tf_image.py +++ b/chitra/tf_image.py @@ -2,13 +2,11 @@ __all__ = ['read_image', 'resize_image'] -# Cell from typing import Union import tensorflow as tf -# Cell def read_image(path: str, channels: int = 3): """Reads an image file from the path and return the rgb image in tf.Tensor format.""" img: tf.Tensor = tf.io.read_file(path) diff --git a/chitra/trainer.py b/chitra/trainer.py index 1f0a5e26..853087ba 100644 --- a/chitra/trainer.py +++ b/chitra/trainer.py @@ -36,7 +36,6 @@ OPT_DICT[name.lower()] = func -# Cell @typechecked def _get_base_cnn( base_model: Union[str, Model], diff --git a/docs/index.md b/docs/index.md index 2bd0c3f8..bc75655a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,11 +1,6 @@ # chitra -[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=aniketmaurya_chitra&metric=alert_status)](https://sonarcloud.io/dashboard?id=aniketmaurya_chitra) -[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=aniketmaurya_chitra&metric=ncloc)](https://sonarcloud.io/dashboard?id=aniketmaurya_chitra) -[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=aniketmaurya_chitra&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=aniketmaurya_chitra) -[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=aniketmaurya_chitra&metric=security_rating)](https://sonarcloud.io/dashboard?id=aniketmaurya_chitra) -[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=aniketmaurya_chitra&metric=reliability_rating)](https://sonarcloud.io/dashboard?id=aniketmaurya_chitra) -[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=aniketmaurya_chitra&metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=aniketmaurya_chitra) +[![CodeFactor](https://www.codefactor.io/repository/github/aniketmaurya/chitra/badge)](https://www.codefactor.io/repository/github/aniketmaurya/chitra) ![GitHub issues](https://img.shields.io/github/issues/aniketmaurya/chitra?style=flat) [![Documentation Status](https://readthedocs.org/projects/chitra/badge/?version=latest)](https://chitra.readthedocs.io/en/latest/?badge=latest) [![Discord](https://img.shields.io/discord/848469007443165184?style=flat)](https://discord.gg/TdnAfDw3kB) @@ -330,9 +325,12 @@ from chitra.trainer import create_cnn model = create_cnn('mobilenetv2', num_classes=2) create_api(model, run=True, api_type='image-classification') ``` +
API Docs Preview ![Preview Model Server](https://raw.githubusercontent.com/aniketmaurya/chitra/master/docs/examples/model-server/preview.png) +
+ See [Example Section](https://chitra.readthedocs.io/en/latest/examples/model-server/model-server.html) for detailed explanation! diff --git a/requirements/dev.txt b/requirements/dev.txt new file mode 100644 index 00000000..8844873e --- /dev/null +++ b/requirements/dev.txt @@ -0,0 +1,3 @@ +-r serve.txt +-r tf.txt +-r torch.txt diff --git a/requirements/serve.txt b/requirements/serve.txt index c9b60046..6c302c3d 100644 --- a/requirements/serve.txt +++ b/requirements/serve.txt @@ -1,3 +1,4 @@ fastapi uvicorn pydantic +python-multipart diff --git a/requirements/test.txt b/requirements/test.txt new file mode 100644 index 00000000..49ec960c --- /dev/null +++ b/requirements/test.txt @@ -0,0 +1,2 @@ +pytest +coverage diff --git a/requirements/tf.txt b/requirements/tf.txt index ab473327..14417604 100644 --- a/requirements/tf.txt +++ b/requirements/tf.txt @@ -1,2 +1 @@ tensorflow-serving-api -grpc diff --git a/requirements/torch.txt b/requirements/torch.txt new file mode 100644 index 00000000..ac988bdf --- /dev/null +++ b/requirements/torch.txt @@ -0,0 +1,2 @@ +torch +torchvision diff --git a/tests/test_model_server.py b/tests/test_model_server.py index ce45c42a..2574b70c 100644 --- a/tests/test_model_server.py +++ b/tests/test_model_server.py @@ -1,9 +1,9 @@ from fastapi import FastAPI -from chitra.serve import create_app +from chitra.serve import create_api def test_create_app(): model = lambda x: x + 1 - app = create_app(model) + app = create_api(model) assert isinstance(app, FastAPI)