towhee
/
7 changed files with 379 additions and 2 deletions
@ -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,56 @@ |
|||||
# image-embedding-pipeline-template |
|
||||
|
# **Template: Image Embedding Pipeline** |
||||
|
|
||||
This is another test repo |
|
||||
|
Authors: |
||||
|
|
||||
|
## Overview |
||||
|
|
||||
|
> <font color=red>**Note:** this is just a **template**, not a runnable pipeline.</font> |
||||
|
|
||||
|
This pipeline **cannot be run**, which is the **template for the image embedding pipeline class** and defines YAML template file for embedding images, as well as the standard inputs and outputs. You can complete the pipeline by filling in the parameters(`init_args`) of the Operator section in [image_embedding_pipeline_template.yaml](./image_embedding_pipeline_template.yaml) and update this README file. FYI, [image-embedding-resnet50](https://hub.towhee.io/towhee/image-embedding-resnet50) is based on this template. |
||||
|
|
||||
|
This pipeline is used to **extract the feature vector of the image**. It first normalizes the image and then uses a model to generate the vector. |
||||
|
|
||||
|
## Interface |
||||
|
|
||||
|
**Input Arguments:** |
||||
|
|
||||
|
- img_tensor: |
||||
|
- the input image to be encoded |
||||
|
- supported types: `PIL.Image` |
||||
|
|
||||
|
**Pipeline Output:** |
||||
|
|
||||
|
The pipeline returns a tuple `Tuple[('cnn', numpy.ndarray)]` containing following fields: |
||||
|
|
||||
|
- feature_vector: |
||||
|
- the embedding of input image |
||||
|
- data type: `numpy.ndarray` |
||||
|
|
||||
|
## How to use |
||||
|
|
||||
|
1. Install [Towhee](https://github.com/towhee-io/towhee) |
||||
|
|
||||
|
```Bash |
||||
|
$ pip3 install towhee |
||||
|
``` |
||||
|
|
||||
|
> You can refer to [Getting Started with Towhee](https://towhee.io/) for more details. If you have any questions, you can [submit an issue to the towhee repository](https://github.com/towhee-io/towhee/issues). |
||||
|
|
||||
|
2. Run it with Towhee |
||||
|
|
||||
|
```Python |
||||
|
>>> from towhee import pipeline |
||||
|
>>> from PIL import Image |
||||
|
|
||||
|
>>> img = Image.open('path/to/your/image') #for example './test.jpg' |
||||
|
>>> embedding_pipeline = pipeline('user/repo_name') #the pipeline repo, such as 'towhee/image-embedding-resnet50' |
||||
|
>>> embedding = embedding_pipeline(img) |
||||
|
``` |
||||
|
|
||||
|
## **How it works** |
||||
|
|
||||
|
This pipeline includes two main operators: [transform image](https://hub.towhee.io/towhee/transform-image-operator-template) and [image embedding](https://hub.towhee.io/towhee/image-embedding-operator-template). The transform image operator will first convert the original image into a normalized format, such as with 512x512 resolutions. Then, the normalized image will be encoded via image embedding operator, and finally we get a feature vector of the given image. |
||||
|
|
||||
|
> Refer [Towhee architecture](https://github.com/towhee-io/towhee#towhee-architecture) for basic concepts in Towhee: pipeline, operator, dataframe. |
||||
|
|
||||
|
 |
||||
|
@ -0,0 +1,3 @@ |
|||||
|
TEST_IMG = './test_data/test.jpg' |
||||
|
DIMENSION = 1000 |
||||
|
REPO_NAME = 'towhee/image-embedding-resnet' |
@ -0,0 +1,93 @@ |
|||||
|
name: 'image_embedding_resnet50' |
||||
|
operators: |
||||
|
- |
||||
|
name: '_start_op' |
||||
|
function: '_start_op' |
||||
|
init_args: |
||||
|
inputs: |
||||
|
- |
||||
|
df: '_start_df' |
||||
|
name: 'img' |
||||
|
col: 0 |
||||
|
outputs: |
||||
|
- |
||||
|
df: 'image' |
||||
|
iter_info: |
||||
|
type: map |
||||
|
- |
||||
|
name: 'preprocessing' |
||||
|
function: 'towhee/image-transform-template' #your transform-image repo name |
||||
|
tag: 'main' #tag to the repo, default is 'main' |
||||
|
init_args: |
||||
|
size: #size of image, such as 256 |
||||
|
inputs: |
||||
|
- |
||||
|
df: 'image' |
||||
|
name: 'img' |
||||
|
col: 0 |
||||
|
outputs: |
||||
|
- |
||||
|
df: 'image_preproc' |
||||
|
iter_info: |
||||
|
type: map |
||||
|
- |
||||
|
name: embedding_model |
||||
|
function: 'towhee/image-embedding-operator-template' #your image-embedding repo name |
||||
|
tag: 'main' #tag to the repo, default is 'main' |
||||
|
init_args: |
||||
|
model_name: #model_name for image-embedding operator, such as 'resnet50' |
||||
|
inputs: |
||||
|
- |
||||
|
df: 'image_preproc' |
||||
|
name: 'img_tensor' |
||||
|
col: 0 |
||||
|
outputs: |
||||
|
- |
||||
|
df: 'embedding' |
||||
|
iter_info: |
||||
|
type: map |
||||
|
- |
||||
|
name: '_end_op' |
||||
|
function: '_end_op' |
||||
|
init_args: |
||||
|
inputs: |
||||
|
- |
||||
|
df: 'embedding' |
||||
|
name: 'feature_vector' |
||||
|
col: 0 |
||||
|
outputs: |
||||
|
- |
||||
|
df: '_end_df' |
||||
|
iter_info: |
||||
|
type: map |
||||
|
dataframes: |
||||
|
- |
||||
|
name: '_start_df' |
||||
|
columns: |
||||
|
- |
||||
|
name: 'img' |
||||
|
vtype: 'PIL.Image' |
||||
|
- |
||||
|
name: 'image' |
||||
|
columns: |
||||
|
- |
||||
|
name: 'img' |
||||
|
vtype: 'PIL.Image' |
||||
|
- |
||||
|
name: 'image_preproc' |
||||
|
columns: |
||||
|
- |
||||
|
name: 'img_transformed' |
||||
|
vtype: 'torch.Tensor' |
||||
|
- |
||||
|
name: 'embedding' |
||||
|
columns: |
||||
|
- |
||||
|
name: 'feature_vector' |
||||
|
vtype: 'numpy.ndarray' |
||||
|
- |
||||
|
name: '_end_df' |
||||
|
columns: |
||||
|
- |
||||
|
name: 'feature_vector' |
||||
|
vtype: 'numpy.ndarray' |
After Width: | Height: | Size: 238 KiB |
After Width: | Height: | Size: 178 KiB |
@ -0,0 +1,19 @@ |
|||||
|
import unittest |
||||
|
from towhee import pipeline |
||||
|
from PIL import Image |
||||
|
from config import DIMENSION, REPO_NAME, TEST_IMG |
||||
|
|
||||
|
|
||||
|
class TestImageEmbeddingPipelineClass(unittest.TestCase): |
||||
|
test_img = Image.open(TEST_IMG) |
||||
|
|
||||
|
def test_image_embedding_resnet50(self): |
||||
|
self.dimension = DIMENSION #the dimension of image embedding |
||||
|
self.repo_name = REPO_NAME |
||||
|
embedding_pipeline = pipeline(self.repo_name) |
||||
|
embedding = embedding_pipeline(self.test_img) |
||||
|
assert (1, self.dimension)==op(img_tensor)[0].shape |
||||
|
|
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
unittest.main() |
Loading…
Reference in new issue