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