From b974f417ba9caab15ecf30fbf0a78bacc9196682 Mon Sep 17 00:00:00 2001 From: Jael Gu Date: Thu, 29 Dec 2022 16:45:03 +0800 Subject: [PATCH] Update README Signed-off-by: Jael Gu --- README.md | 50 ++++++++++++++++++++++++++++---------- result2.png => result.png | Bin result1.png | Bin 14004 -> 0 bytes 3 files changed, 37 insertions(+), 13 deletions(-) rename result2.png => result.png (100%) delete mode 100644 result1.png diff --git a/README.md b/README.md index 6f8106c..7d09ea7 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@
-## Desription +## Description An image embedding operator generates a vector given an image. This operator extracts features for image top ranked models from @@ -18,22 +18,25 @@ The default pretrained model weights are from [The 1st Place Solution of ISC21 ( Load an image from path './towhee.jpg' and use the pretrained ISC model ('resnet50') to generate an image embedding. - *Write the pipeline in simplified style:* +*Write a same pipeline with explicit inputs/outputs name specifications:* + +- **option 1:** ```python -import towhee +from towhee.dc2 import pipe, ops, DataCollection -( - towhee.glob('./towhee.jpg') - .image_decode() - .image_embedding.isc() - .show() +p = ( + pipe.input('path') + .map('path', 'img', ops.image_decode()) + .map('img', 'vec', ops.image_embedding.isc()) + .output('img', 'vec') ) -``` - -*Write a same pipeline with explicit inputs/outputs name specifications:* +DataCollection(p('towhee.jpeg')).show() +``` + +- **option 2:** ```python import towhee @@ -45,7 +48,6 @@ import towhee .show() ) ``` -
@@ -83,10 +85,32 @@ It uses the pre-trained model specified by model name to generate an image embed The decoded image data in numpy.ndarray. - **Returns:** *numpy.ndarray* The image embedding extracted by model. +
+ +***save_model(format='pytorch', path='default')*** + +Save model to local with specified format. + +**Parameters:** + +***format***: *str* + +​ The format of saved model, defaults to 'pytorch'. + +***path***: *str* + +​ The path where model is saved to. By default, it will save model to the operator directory. + +```python +from towhee import ops + +op = ops.image_embedding.isc().get_op() +op.save_model('onnx', 'test.onnx') +``` + diff --git a/result2.png b/result.png similarity index 100% rename from result2.png rename to result.png diff --git a/result1.png b/result1.png deleted file mode 100644 index 1e02649e59635272eda099916b6a244db8afcfad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14004 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