towhee
/
11 changed files with 414 additions and 2 deletions
@ -0,0 +1,35 @@ |
|||
# .gitattributes |
|||
|
|||
# Source files |
|||
# ============ |
|||
*.pxd text diff=python |
|||
*.py text diff=python |
|||
*.py3 text diff=python |
|||
*.pyw text diff=python |
|||
*.pyx text diff=python |
|||
*.pyz text diff=python |
|||
*.pyi text diff=python |
|||
|
|||
# Binary files |
|||
# ============ |
|||
*.db binary |
|||
*.p binary |
|||
*.pkl binary |
|||
*.pickle binary |
|||
*.pyc binary export-ignore |
|||
*.pyo binary export-ignore |
|||
*.pyd binary |
|||
|
|||
# Jupyter notebook |
|||
*.ipynb text |
|||
|
|||
# Model files |
|||
*.bin.* filter=lfs diff=lfs merge=lfs -text |
|||
*.lfs.* filter=lfs diff=lfs merge=lfs -text |
|||
*.bin filter=lfs diff=lfs merge=lfs -text |
|||
*.h5 filter=lfs diff=lfs merge=lfs -text |
|||
*.tflite filter=lfs diff=lfs merge=lfs -text |
|||
*.tar.gz filter=lfs diff=lfs merge=lfs -text |
|||
*.ot filter=lfs diff=lfs merge=lfs -text |
|||
*.onnx filter=lfs diff=lfs merge=lfs -text |
|||
*.msgpack filter=lfs diff=lfs merge=lfs -text |
@ -0,0 +1,209 @@ |
|||
### Linux ### |
|||
*~ |
|||
|
|||
# temporary files which can be created if a process still has a handle open of a deleted file |
|||
.fuse_hidden* |
|||
|
|||
# KDE directory preferences |
|||
.directory |
|||
|
|||
# Linux trash folder which might appear on any partition or disk |
|||
.Trash-* |
|||
|
|||
# .nfs files are created when an open file is removed but is still being accessed |
|||
.nfs* |
|||
|
|||
### OSX ### |
|||
# General |
|||
.DS_Store |
|||
.AppleDouble |
|||
.LSOverride |
|||
|
|||
# Icon must end with two \r |
|||
Icon |
|||
|
|||
|
|||
# Thumbnails |
|||
._* |
|||
|
|||
# Files that might appear in the root of a volume |
|||
.DocumentRevisions-V100 |
|||
.fseventsd |
|||
.Spotlight-V100 |
|||
.TemporaryItems |
|||
.Trashes |
|||
.VolumeIcon.icns |
|||
.com.apple.timemachine.donotpresent |
|||
|
|||
# Directories potentially created on remote AFP share |
|||
.AppleDB |
|||
.AppleDesktop |
|||
Network Trash Folder |
|||
Temporary Items |
|||
.apdisk |
|||
|
|||
### Python ### |
|||
# Byte-compiled / optimized / DLL files |
|||
__pycache__/ |
|||
*.py[cod] |
|||
*$py.class |
|||
|
|||
# C extensions |
|||
*.so |
|||
|
|||
# Distribution / packaging |
|||
.Python |
|||
build/ |
|||
develop-eggs/ |
|||
dist/ |
|||
downloads/ |
|||
eggs/ |
|||
.eggs/ |
|||
lib/ |
|||
lib64/ |
|||
parts/ |
|||
sdist/ |
|||
var/ |
|||
wheels/ |
|||
share/python-wheels/ |
|||
*.egg-info/ |
|||
.installed.cfg |
|||
*.egg |
|||
MANIFEST |
|||
|
|||
# PyInstaller |
|||
# Usually these files are written by a python script from a template |
|||
# before PyInstaller builds the exe, so as to inject date/other infos into it. |
|||
*.manifest |
|||
*.spec |
|||
|
|||
# Installer logs |
|||
pip-log.txt |
|||
pip-delete-this-directory.txt |
|||
|
|||
# Unit test / coverage reports |
|||
htmlcov/ |
|||
.tox/ |
|||
.nox/ |
|||
.coverage |
|||
.coverage.* |
|||
.cache |
|||
nosetests.xml |
|||
coverage.xml |
|||
*.cover |
|||
*.py,cover |
|||
.hypothesis/ |
|||
.pytest_cache/ |
|||
cover/ |
|||
|
|||
# Translations |
|||
*.mo |
|||
*.pot |
|||
|
|||
# Django stuff: |
|||
*.log |
|||
local_settings.py |
|||
db.sqlite3 |
|||
db.sqlite3-journal |
|||
|
|||
# Flask stuff: |
|||
instance/ |
|||
.webassets-cache |
|||
|
|||
# Scrapy stuff: |
|||
.scrapy |
|||
|
|||
# Sphinx documentation |
|||
docs/_build/ |
|||
|
|||
# PyBuilder |
|||
.pybuilder/ |
|||
target/ |
|||
|
|||
# Jupyter Notebook |
|||
.ipynb_checkpoints |
|||
|
|||
# IPython |
|||
profile_default/ |
|||
ipython_config.py |
|||
|
|||
# pyenv |
|||
# For a library or package, you might want to ignore these files since the code is |
|||
# intended to run in multiple environments; otherwise, check them in: |
|||
# .python-version |
|||
|
|||
# pipenv |
|||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. |
|||
# However, in case of collaboration, if having platform-specific dependencies or dependencies |
|||
# having no cross-platform support, pipenv may install dependencies that don't work, or not |
|||
# install all needed dependencies. |
|||
#Pipfile.lock |
|||
|
|||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow |
|||
__pypackages__/ |
|||
|
|||
# Celery stuff |
|||
celerybeat-schedule |
|||
celerybeat.pid |
|||
|
|||
# SageMath parsed files |
|||
*.sage.py |
|||
|
|||
# Environments |
|||
.env |
|||
.venv |
|||
env/ |
|||
venv/ |
|||
ENV/ |
|||
env.bak/ |
|||
venv.bak/ |
|||
|
|||
# Spyder project settings |
|||
.spyderproject |
|||
.spyproject |
|||
|
|||
# Rope project settings |
|||
.ropeproject |
|||
|
|||
# mkdocs documentation |
|||
/site |
|||
|
|||
# mypy |
|||
.mypy_cache/ |
|||
.dmypy.json |
|||
dmypy.json |
|||
|
|||
# Pyre type checker |
|||
.pyre/ |
|||
|
|||
# pytype static type analyzer |
|||
.pytype/ |
|||
|
|||
# Cython debug symbols |
|||
cython_debug/ |
|||
|
|||
### Windows ### |
|||
# Windows thumbnail cache files |
|||
Thumbs.db |
|||
Thumbs.db:encryptable |
|||
ehthumbs.db |
|||
ehthumbs_vista.db |
|||
|
|||
# Dump file |
|||
*.stackdump |
|||
|
|||
# Folder config file |
|||
[Dd]esktop.ini |
|||
|
|||
# Recycle Bin used on file shares |
|||
$RECYCLE.BIN/ |
|||
|
|||
# Windows Installer files |
|||
*.cab |
|||
*.msi |
|||
*.msix |
|||
*.msm |
|||
*.msp |
|||
|
|||
# Windows shortcuts |
|||
*.lnk |
@ -1,3 +1,57 @@ |
|||
# image-embedding-operator-template |
|||
# Template: Image Embedding Operator |
|||
|
|||
This is another test repo |
|||
Authors: |
|||
|
|||
## **Overview** |
|||
|
|||
> <font color=red>**Note:** this is just a **template**, not a runnable pipeline.</font> |
|||
|
|||
This **class template for the image embedding operator** defines the image embedding functions, as well as the standard inputs and outputs. You can complete the operator by filling in the function(`__init__`, `__call__` ) in [image_embedding_operator_class.py](http://./image_embedding_operator_class.py) and update this README file. FYI, [image-embedding-resnet50](https://hub.towhee.io/towhee/image-embedding-resnet50) is based on this template. |
|||
|
|||
This Operator generates feature vectors from "someone" model, which is trained on "someone" dataset. |
|||
|
|||
## **Interface** |
|||
|
|||
```python |
|||
__init__(self, model_name: str, framework: str = 'pytorch') |
|||
``` |
|||
|
|||
**Args:** |
|||
|
|||
- model_name: |
|||
- the model name for embedding |
|||
- supported types: `str`, for example 'resnet50' |
|||
|
|||
- framework: |
|||
- the framework of the model |
|||
- supported types: `str`, default is 'pytorch' |
|||
|
|||
```python |
|||
__call__(self, img_tensor: torch.Tensor) |
|||
``` |
|||
|
|||
**Args:** |
|||
|
|||
- img_tensor: |
|||
- the input image tensor |
|||
- supported types: `torch.Tensor` |
|||
|
|||
**Returns:** |
|||
|
|||
The Operator returns a tuple `Tuple[('feature_vector', numpy.ndarray)]` containing following fields: |
|||
|
|||
- feature_vector: |
|||
- the embedding of the image |
|||
- data type: `numpy.ndarray` |
|||
|
|||
## **Requirements** |
|||
|
|||
You can get the required python package by [requirements.txt](https://zilliverse.feishu.cn/docs/requirements.txt). |
|||
|
|||
## **How it works** |
|||
|
|||
The `towhee/image-embedding-operator-template` Operator implements the function of image embedding, which can add to the pipeline. For example, it's the key Operator named embedding_model within [image-embedding-pipeline-template](https://hub.towhee.io/towhee/image-embedding-pipeline-template) pipeline, and it is the red box in the picture below. |
|||
|
|||
 |
|||
|
|||
## **Reference** |
|||
|
@ -0,0 +1,13 @@ |
|||
# Copyright 2021 Zilliz. All rights reserved. |
|||
# |
|||
# Licensed under the Apache License, Version 2.0 (the "License"); |
|||
# you may not use this file except in compliance with the License. |
|||
# You may obtain a copy of the License at |
|||
# |
|||
# http://www.apache.org/licenses/LICENSE-2.0 |
|||
# |
|||
# Unless required by applicable law or agreed to in writing, software |
|||
# distributed under the License is distributed on an "AS IS" BASIS, |
|||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
# See the License for the specific language governing permissions and |
|||
# limitations under the License. |
@ -0,0 +1,3 @@ |
|||
TEST_IMG = './test_data/test.jpg' |
|||
DIMENSION = 1000 |
|||
MODEL_NAME = 'resnet50' |
@ -0,0 +1,53 @@ |
|||
# Copyright 2021 Zilliz. All rights reserved. |
|||
# |
|||
# Licensed under the Apache License, Version 2.0 (the "License"); |
|||
# you may not use this file except in compliance with the License. |
|||
# You may obtain a copy of the License at |
|||
# |
|||
# http://www.apache.org/licenses/LICENSE-2.0 |
|||
# |
|||
# Unless required by applicable law or agreed to in writing, software |
|||
# distributed under the License is distributed on an "AS IS" BASIS, |
|||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
# See the License for the specific language governing permissions and |
|||
# limitations under the License. |
|||
|
|||
|
|||
from typing import NamedTuple |
|||
import numpy |
|||
from towhee.operator import Operator |
|||
|
|||
|
|||
class ImageEmbeddingOperatorTemplate(Operator): |
|||
""" |
|||
An operator class that implements image embedding. |
|||
|
|||
Args: |
|||
model_name (`str`): |
|||
Embedding the image withe the specific model. |
|||
""" |
|||
def __init__(self, model_name: str, framework: str = 'pytorch') -> None: |
|||
""" |
|||
Initialize some parameters and load the model. |
|||
""" |
|||
super().__init__() |
|||
# please define Model class and declare model object, and initialize with the model_name |
|||
# if framework == 'pytorch': |
|||
# from pytorch import Model |
|||
self.model = Model(model_name) |
|||
|
|||
def __call__(self, img_tensor: torch.Tensor) -> NamedTuple('Outputs', [('feature_vector', numpy.ndarray)]): |
|||
""" |
|||
Call it when use this class. |
|||
|
|||
Args: |
|||
img_tensor (`torch.Tensor`): |
|||
The image tensor, you can generate it with TransformImageOperatorClass. |
|||
Returns: |
|||
(`numpy.ndarray`) |
|||
The image embedding. |
|||
""" |
|||
# call model with the img_tensor parameter |
|||
result = self.model(img_tensor) |
|||
Outputs = NamedTuple('Outputs', [('feature_vector', numpy.ndarray)]) |
|||
return Outputs(result) |
@ -0,0 +1,13 @@ |
|||
name: 'image-embedding-operator-template' |
|||
labels: |
|||
recommended_framework: 'pytorch1.2.0' #the recommend framework, such as |
|||
class: 'image-embedding' |
|||
others: 'resnet50' #your model name |
|||
operator: 'towhee/image-embedding-operator-template' #your operator repo name |
|||
init: |
|||
model_name: str |
|||
call: |
|||
input: |
|||
img_tensor: torch.Tensor |
|||
output: |
|||
feature_vector: numpy.ndarray |
After Width: | Height: | Size: 222 KiB |
After Width: | Height: | Size: 178 KiB |
@ -0,0 +1,32 @@ |
|||
import unittest |
|||
from PIL import Image |
|||
from torchvision import transforms |
|||
from image_embedding_operator_template import ImageEmbeddingOperatorTemplate |
|||
from config import DIMENSION, MODEL_NAME, TEST_IMG |
|||
|
|||
|
|||
class TestImageEmbeddingOperatorTemplate(unittest.TestCase): |
|||
""" |
|||
Simple operator test |
|||
""" |
|||
img = Image.open(TEST_IMG) |
|||
tfms = transforms.Compose( |
|||
[ |
|||
transforms.Resize(256), |
|||
transforms.CenterCrop(224), |
|||
transforms.ToTensor(), |
|||
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), |
|||
] |
|||
) |
|||
img_tensor = tfms(img).unsqueeze(0) |
|||
|
|||
def test_image_embedding(self): |
|||
self.model_name = MODEL_NAME |
|||
self.dimension = DIMENSION |
|||
op = ImageEmbeddingOperatorTemplate(self.model_name) |
|||
print("The output shape of operator:", op(self.img_tensor)[0].shape) |
|||
assert (1, self.dimension)==op(self.img_tensor)[0].shape |
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
unittest.main() |
Loading…
Reference in new issue