mirror of
https://github.com/langchain-ai/langchain.git
synced 2026-10-05 09:25:14 +03:00
partners: add similarity search by image functionality to langchain_chroma partner package (#22982)
- **Description:** This pull request introduces two new methods to the Langchain Chroma partner package that enable similarity search based on image embeddings. These methods enhance the package's functionality by allowing users to search for images similar to a given image URI. Also introduces a notebook to demonstrate it's use. - **Issue:** N/A - **Dependencies:** None - **Twitter handle:** @mrugank9009 --------- Co-authored-by: ccurme <chester.curme@gmail.com>
This commit is contained in:
1 parent
b0aa915dea
commit
66bebeb76a
3 files changed
+778
No files matched your search
@@ -0,0 +1,603 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8c176ef6-e41c-48da-bfa4-76217614bbbc",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Image to Image search Using OpenAI's Open source CLIP Model (Based on Vision Transformer) and ChromaDB"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "93f1418a-4cdd-4866-964e-fd0b4d83d5f8",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### This Cookbook demonstrates A reverse image search or image similarity search, using an input image and some provided images which will be indexed or embedded in ChromaDB"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5939a54c-3198-4ba4-8346-1cc088c473c0",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"##### You can embed text in the same VectorDB space as images, and retreive text and images as well based on input text or image.\n",
|
||||
"##### Following link demonstrates that.\n",
|
||||
"<a> https://python.langchain.com/v0.2/docs/integrations/text_embedding/open_clip/ </a>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "32fbcbfe-92fa-4904-9a24-dd89d9e3865b",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Installs and imports"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "9b997cd5-7703-400d-a6a8-6ee09d37f7b4",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!pip install langchain_experimental"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "3a5078b2-b972-4866-b358-e5b33b129dc4",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!pip install langchain_chroma"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "997c79e6-8a68-4aec-bf4d-1398e5e40389",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import os\n",
|
||||
"\n",
|
||||
"from PIL import Image\n",
|
||||
"from tqdm import tqdm"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "a0118584-57d8-44e6-8129-89362c323141",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Langchain Imports"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "957994c2-b4c0-4728-b6b6-dc580b9a8236",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Import the Chroma class (any one of following works fine)\n",
|
||||
"from langchain_chroma import Chroma\n",
|
||||
"from langchain_experimental.open_clip import OpenCLIPEmbeddings\n",
|
||||
"# from langchain_community.vectorstores import Chroma"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "c2fbc2d8-4754-4155-b223-43528ed609be",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Provide your paths in a list"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "c71b5712-e716-480b-8eef-65ef819ea17b",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### This Cookbook uses data from this Myntra Kaggle dataset :- <a> https://www.kaggle.com/datasets/hiteshsuthar101/myntra-fashion-product-dataset </a>\n",
|
||||
"#### You can directly download images or read the csv and links from it and then download"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"id": "bd314d23-2994-475e-973b-3df7b315e23e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"all_image_uris = [\n",
|
||||
" \"../../../py_ml_env/images_all/b0eb9426-adf2-4802-a6b3-5dbacbc5f2511643971561167KhushalKWomenBlackEthnicMotifsAngrakhaBeadsandStonesKurtawit7.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/17ab2ac8-2e60-422d-9d20-2527415932361640754214931-STRAPPY-SET-IN-ORANGE-WITH-ORGANZA-DUPATTA-5961640754214349-2.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/b8c4f90f-683c-48d2-b8ac-19891a87c0651638428628378KurtaSets1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/d2407657-1f04-4d13-9f52-9e134050489b1625905793495-Nayo-Women-Red-Ethnic-Motifs-Printed-Empire-Pure-Cotton-Kurt-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/30b0017d-7e72-4d40-9633-ef78d01719741575541717470-AHIKA-Women-Black--Green-Printed-Straight-Kurta-990157554171-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/507490f7-c8f9-492c-b3f8-c7e977d1af701654922515416SochWomenRedThreadWorkGeorgetteAnarkaliKurta1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/5fba9594-3301-4881-ba56-d56a44570e831654747998773LibasWomenNavyBluePureCottonFloralPrintKurtawithPalazzosDupa1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/e6b90907-a613-45e1-9b2e-988caaba36581645010770505-Ahalyaa-Women-Beige-Floral-Printed-Regular-Gotta-Patti-Kurta-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/5ea707f4-8491-4d1c-b520-86a1cff4c86e1644841891629-Anouk-Women-Yellow--White-Printed-Kurta-with-Palazzos-706164-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/11b842c5-d9d4-4fee-baa2-0972e3a673641643970773675KhushalKWomenGreenEthnicMotifsPrintedEmpireGottaPattiPureCot7.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/b783aef9-c902-462e-af73-de159bfd011c1565256752191-Libas-Women-Kurta-Sets-2081565256750830-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/bb925efb-80d9-4cb6-838c-df86f1ba3c3e1637570416652-Varanga-Women-Mustard-Yellow-Floral-Yoke-Embroidered-Straigh-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/7d7656e5-e37d-4f61-9407-98bd341ca8f91640261029836KurtaSets1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/43d65352-9853-498e-95a4-be514df0be901559294212152-Vishudh--Straight-Kurta-With-Crop-Palazzo-7041559294209627-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/4a37718e-8942-479c-a7ea-0b074d53ee4b1650456566424AnoukWomenPeach-ColouredYokeDesignMirror-WorkKurtawithTrouse1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/5910af54-3435-40d5-95d4-0ac2daf797f51658319613886-SheWill-Women-Maroon-Ethnic-Yoke-Design-Embroided-Kurta-with-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/d57adb8b-e792-477a-8801-6ea570cd88ef1629800170287VarangaWomenYellowFloralPrintedKeyholeNeckThreadWorkKurta1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/c35d059d-a357-4863-bcb1-eacd8c988fb01572422803188-AHIKA-Women-Kurtas-8841572422802083-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/3a61f2ab-7905-4efc-84e8-df1f74fa08201623409397327-Anouk-Women-Kurtas-1031623409396642-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/3e9c355b-20e6-42d0-8480-7046979f87711658733247220CharuWomenNavyBlueStripedThreadWorkKurta1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/0d391a8b-ea8c-4258-86d5-a99b9f3f34201630040200642-Libas-Women-Kurta-Sets-5941630040199555-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/d6b74d2b-825f-4b34-af01-9d6336045bdb1624612149604-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/07adcdf7-eee1-4077-b55c-f6608caaa6f01647663614971KALINIWomenSeaGreenFloralYokeDesignPleatedPureCottonTopwithS4.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/6bc412bb-3cc6-4def-8833-f5580b0cc06a1617706648250-Indo-Era-Green-Printed-Straight-Kurta-Palazzo-With-Dupatta-S-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/b1bd0687-7533-428d-8258-d29c793fc4541631092430795-Anouk-Women-Kurta-Sets-941631092429795-1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/64e975d5-dbda-4c09-87c0-c5152f9e82c71658736715566TOULINWomenTealFloralAngrakhaKurtiwithPalazzosWithDupatta1.jpg\",\n",
|
||||
" \"../../../py_ml_env/images_all/d1a4cc48-ff90-47ab-ad36-800743e83d641605767381033-Ishin-Womens-Rayon-Red-Bandhani-Print-Embellished-Anarkali-K-1.jpg\",\n",
|
||||
"]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5b2990fe-61e9-4c1d-9a53-cd6d9fcd82a3",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## (Optional) Prepare Metadata to index alongside the image"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "2b39f664-021d-4cea-aa65-bb575220fdbf",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[{'path': '../../../py_ml_env/images_all/b0eb9426-adf2-4802-a6b3-5dbacbc5f2511643971561167KhushalKWomenBlackEthnicMotifsAngrakhaBeadsandStonesKurtawit7.jpg', 'id': 0}, {'path': '../../../py_ml_env/images_all/17ab2ac8-2e60-422d-9d20-2527415932361640754214931-STRAPPY-SET-IN-ORANGE-WITH-ORGANZA-DUPATTA-5961640754214349-2.jpg', 'id': 1}, {'path': '../../../py_ml_env/images_all/b8c4f90f-683c-48d2-b8ac-19891a87c0651638428628378KurtaSets1.jpg', 'id': 2}, {'path': '../../../py_ml_env/images_all/d2407657-1f04-4d13-9f52-9e134050489b1625905793495-Nayo-Women-Red-Ethnic-Motifs-Printed-Empire-Pure-Cotton-Kurt-1.jpg', 'id': 3}, {'path': '../../../py_ml_env/images_all/30b0017d-7e72-4d40-9633-ef78d01719741575541717470-AHIKA-Women-Black--Green-Printed-Straight-Kurta-990157554171-1.jpg', 'id': 4}]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"metadatas = []\n",
|
||||
"for idx, img in enumerate(all_image_uris):\n",
|
||||
" meta_dict = {}\n",
|
||||
" meta_dict[\"path\"] = img\n",
|
||||
" meta_dict[\"id\"] = idx\n",
|
||||
" metadatas.append(meta_dict)\n",
|
||||
"print(metadatas[:5])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "fb468009-38c8-45cf-8847-01dd6308cb62",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Initialize the OpenAI CLIP Model"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"id": "7dab6d45-d3ba-4cf6-9738-737f8d5a8b5d",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# You can use other models like Vit G 14, Vit H 14, Vit B32 etc.\n",
|
||||
"# Vit-L-14 - Larger , but more performant\n",
|
||||
"# ViT-B-32 - Smaller, less performant model\n",
|
||||
"\n",
|
||||
"# model_name = \"ViT-L-14\"\n",
|
||||
"# checkpoint = \"laion2b_s32b_b82k\"\n",
|
||||
"\n",
|
||||
"# Uncomment following to use that model\n",
|
||||
"model_name = \"ViT-B-32\"\n",
|
||||
"checkpoint = \"laion2b_s34b_b79k\"\n",
|
||||
"\n",
|
||||
"clip_embd = OpenCLIPEmbeddings(model_name=model_name, checkpoint=checkpoint)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "9eb658f2-5d03-43f5-8bf0-8fc07feaca14",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Sample test of images"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"id": "8efb9fc3-639a-470e-8178-423b7b54bcac",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Embed images\n",
|
||||
"\n",
|
||||
"img_feat_1 = clip_embd.embed_image([all_image_uris[0]])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d8147e6c-f255-4db9-b63c-e178cc5a625c",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Dimentions of embeddings"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"id": "4c3a0d23-c8be-4e0a-8c31-e9f8a2ffd041",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"512"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"len(img_feat_1[0])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "86bf2d60-57df-44d5-8cff-14e64304d411",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Initialize the Chroma Client, persist_directory is optinal if you want to save the VectorDB to disk and reload it using same code and path"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"id": "35953afc-fb35-4dc9-842c-b756b80f4ec4",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"collection_name = \"chroma_img_collection_1\"\n",
|
||||
"chroma_client = Chroma(\n",
|
||||
" collection_name=collection_name,\n",
|
||||
" embedding_function=clip_embd,\n",
|
||||
" persist_directory=\"./indexed_db\",\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"id": "710edbe8-a37c-4f52-a120-9e7d1f3dd351",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def embed_images(chroma_client, uris, metadatas=[]):\n",
|
||||
" \"\"\"\n",
|
||||
" Function to add images to Chroma client with progress bar.\n",
|
||||
"\n",
|
||||
" Args:\n",
|
||||
" chroma_client: The Chroma client object.\n",
|
||||
" uris (List[str]): List of image file paths.\n",
|
||||
" metadatas (List[dict]): List of metadata dictionaries.\n",
|
||||
" \"\"\"\n",
|
||||
" # Iterate through the uris with a progress bar\n",
|
||||
" success_count = 0\n",
|
||||
" for i in tqdm(range(len(uris)), desc=\"Adding images\"):\n",
|
||||
" uri = uris[i]\n",
|
||||
" metadata = metadatas[i]\n",
|
||||
"\n",
|
||||
" try:\n",
|
||||
" chroma_client.add_images(uris=[uri], metadatas=[metadata])\n",
|
||||
" except Exception as e:\n",
|
||||
" print(f\"Failed to add image {uri} with metadata {metadata}. Error: {e}\")\n",
|
||||
" else:\n",
|
||||
" success_count += 1\n",
|
||||
" # print(f\"Successfully added image {uri} with metadata {metadata}\")\n",
|
||||
"\n",
|
||||
" return success_count"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "9fe96e05-ce8a-4272-a2e9-2ac39d9ae7dc",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Specify your image paths list in this embed_images function call"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"id": "ed8e2663-6da1-454e-b552-18c762c0083d",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Adding images: 100%|████████████████████████████████████████████████████████████████████| 27/27 [00:03<00:00, 7.43it/s]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"27 Images Embedded Successfully\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"success_count = embed_images(chroma_client, uris=all_image_uris, metadatas=metadatas)\n",
|
||||
"if success_count:\n",
|
||||
" print(f\"{success_count} Images Embedded Successfully\")\n",
|
||||
"else:\n",
|
||||
" print(\"No images Embedded\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6e5cd014-db86-4d6b-8399-25cae3da5570",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Helper function to plot retrived similar images"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"id": "223ed942-5e68-4d62-908d-4cc7db1e7880",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import math\n",
|
||||
"\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def plot_images_by_side(image_data):\n",
|
||||
" num_images = len(image_data)\n",
|
||||
" n_col = 2 # Fixed number of columns\n",
|
||||
" n_row = math.ceil(num_images / n_col) # Calculate the number of rows\n",
|
||||
"\n",
|
||||
" # Reduce the size of each figure\n",
|
||||
" fig, axs = plt.subplots(n_row, n_col, figsize=(10, 5 * n_row))\n",
|
||||
" axs = axs.flatten()\n",
|
||||
"\n",
|
||||
" for idx, data in enumerate(image_data):\n",
|
||||
" img_path = data[\"path\"]\n",
|
||||
" score = round(data.get(\"score\", 0), 2)\n",
|
||||
" img = Image.open(img_path)\n",
|
||||
" ax = axs[idx]\n",
|
||||
" ax.imshow(img)\n",
|
||||
" # Assuming similarity is not available in the new data, removed sim_score\n",
|
||||
" ax.title.set_text(f\"\\nProduct ID: {data[\"id\"]}\\n Score: {score}\")\n",
|
||||
" ax.axis(\"off\") # Turn off axis\n",
|
||||
"\n",
|
||||
" # Hide any remaining empty subplots\n",
|
||||
" for i in range(num_images, n_row * n_col):\n",
|
||||
" axs[i].axis(\"off\")\n",
|
||||
"\n",
|
||||
" plt.tight_layout()\n",
|
||||
" plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "ca14bbde-cb91-4bb9-a766-7eecd1f903a6",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Take in input image path, resize that image and display it"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"id": "1d402b25-ba85-4ef1-80bf-628c90c8e4f8",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/jpeg": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<PIL.Image.Image image mode=RGB size=300x400>"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"search_img_path = \"../../../py_ml_env/images_all/0d391a8b-ea8c-4258-86d5-a99b9f3f34201630040200642-Libas-Women-Kurta-Sets-5941630040199555-1.jpg\"\n",
|
||||
"\n",
|
||||
"my_image = Image.open(search_img_path).convert(\"RGB\")\n",
|
||||
"# Resize the image while maintaining the aspect ratio\n",
|
||||
"max_width = 400\n",
|
||||
"max_height = 400\n",
|
||||
"\n",
|
||||
"width, height = my_image.size\n",
|
||||
"aspect_ratio = width / height\n",
|
||||
"\n",
|
||||
"if width > height:\n",
|
||||
" new_width = min(width, max_width)\n",
|
||||
" new_height = int(new_width / aspect_ratio)\n",
|
||||
"else:\n",
|
||||
" new_height = min(height, max_height)\n",
|
||||
" new_width = int(new_height * aspect_ratio)\n",
|
||||
"\n",
|
||||
"my_image_resized = my_image.resize((new_width, new_height), Image.LANCZOS)\n",
|
||||
"\n",
|
||||
"# Display the resized image\n",
|
||||
"my_image_resized"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "f66ee680-27d2-4f53-b0c8-792cb97c98a2",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Perform Image similarity search, get the metadata of K retrieved images and then display similar images"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e4261cae-30e0-435f-a497-0b7f3f11f353",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### We have embeded limited data, we can embed a large number which will have similar images, to get better results"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"id": "ac0c5574-9dc5-4bd9-a5dd-2d34a274684d",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"k = 10\n",
|
||||
"\n",
|
||||
"## This returns a list of Langchain document object, with page_content as the base64 encoded image, this approach uses path from metadata to display images\n",
|
||||
"## We can use that b64 encoded images as well after decoding it\n",
|
||||
"\n",
|
||||
"similar_images = chroma_client.similarity_search_by_image(uri=search_img_path, k=k)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"id": "6c812ea0-e9d3-4539-ae08-30ac4f7cd9da",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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PmmMMeaBBx4wgPnxH//xoXQf+MAHtqlUP/jBD5obb7xxW1s//OEPm+IwO3HihJFSmve85z1GKTWUVms9+H41Vao53v3udxvArK+vD67deOONpc9RBX/yJ39ihBDm//g//o/BtcuXLxvAfPSjH92W/ld+5VcMYB577LEd1WdhYWHxYoHd97bj+brvWbywYU2JXsB461vfysGDB7n++ut5//vfT6vV4lOf+hTHjx8fSve//W//29Dv3//938dxHH7yJ39y6PrP/MzPYIzhD/7gDwbpgG3pfuqnfmrHbf7d3/1dtNb8g3/wD5ByePiVqV6vJnKV6Obm5uDaM888syOpyaVLl/jABz7AzTffzN/9u393cL3X6wEQBMG2PLVabSiNhYWFhcVk2H1vd7gW+57FCxvWlOgFjF/5lV/hjjvuwHVdDh8+zJ133rlt0XFdl+uuu27o2qlTpzh27Ng285W77757cD//lFJy6623DqW78847d9zmp556CiklL3nJS3Zcxl6h3W4D7NqMp9Pp8M53vpPNzU2++MUvDtlg1ut1ILVZHUW/3x9KY2FhYWExGXbf2x2uxb5n8cKGZQxewHjta1/Lq1/96olpgiDYtmheDYyTeiilrnrdO8VDDz3EoUOHmJ+f33EZURTxAz/wAzz44IN8+tOf5p577hm6v2/fPoIg4Pz589vy5teOHTu24/otLCwsXkyw+97ucC32PYsXNqwp0YsQN954I88+++yQKhHS4CX5/fxTa73NW8Hjjz++rcylpSXW1ta2Xc+lMDluvfVWtNY88sgjE9t4tdWrf/7nf85TTz3F93zP9+y4DK01P/zDP8znPvc5fvM3f5M3v/nN29JIKbn33ntLA8Dcd9993HLLLfbgsYWFhcVVht33rt2+Z/HChmUMXoR4+9vfjlKKf//v//3Q9V/+5V9GCMHb3vY2gMHnv/23/3Yo3cc+9rFtZd56662sr6/z4IMPDq6dP3+eT33qU0Ppvv/7vx8pJR/96EfRWg/dMwWXcc1ms3TB3QucOnWKD33oQ/i+z8/93M8N3avqtg3gb/2tv8V//+//nY9//OP8wA/8wNh0733ve7n//vuHmIPHH3+cz3/+87zvfe/b2UNYWFhYWFSG3feu7b5n8cKFNSV6EeJd73oXb3nLW/iFX/gFnnnmGb7lW76Fz3zmM/zf//f/zU/91E8NbCtf/vKX80M/9EN8/OMfZ319nTe84Q187nOf48knn9xW5vvf/37+3t/7e7znPe/hJ3/yJ+l2u/zqr/4qd9xxB1/72tcG6W677TZ+4Rd+gX/4D/8h3/7t384P/MAPEAQB999/P8eOHeOf/tN/CqT+kn/1V3+Vf/SP/hG33XYbhw4dGvirngVf+9rX+OQnP4nWmrW1Ne6//35+53d+ByEEv/7rv87LXvayofRV3bZ97GMf4+Mf/zivf/3raTQafPKTnxy6/573vIdmswnAj//4j/Mf/sN/4B3veAc/+7M/i+d5/NIv/RKHDx/mZ37mZ2Z+JgsLCwuL2WD3vWu771m8gPHcOkWy2AnGRYAcxQc/+EHTbDZL721ubpq/83f+jjl27JjxPM/cfvvt5l/+y3855DrNGGN6vZ75yZ/8SbN//37TbDbNu971LnPmzJnSCJCf+cxnzD333GN83zd33nmn+eQnP7nNbVuO//Sf/pN5xSteYYIgMEtLS+bNb36z+cM//MPB/QsXLph3vOMdZm5uzgBTXbgxxm1b/ue6rtm3b5953eteZ37+53/enDp1qrScqm7bcpd44/5Onjw5lP7MmTPmve99r5mfnzetVsu8853vNCdOnJhaj4WFhYWF3ffK8Hzf9yxemBDGjIT8s7CwsLCwsLCwsLB40cGeMbCwsLCwsLCwsLCwsIyBhYWFhYWFhYWFhYVlDCwsLCwsLCwsLCwssIyBhYWFhYWFhYWFhQWWMbCwsLCwsLCwsLCwwDIGFhYWFhYWFhYWFhZYxsDCwsLCwsLCwsLCAssYWFTA5cuX+dt/+29z1113Ua/XOXToEK997Wv5e3/v79Fut5/r5u0Zzp07xw/+4A+yuLjI/Pw87373u3n66aef62ZZWFhYWFxF2D3OwmILNsCZxUSsrKzwile8go2NDX7kR36Eu+66i+XlZR588EF+7/d+jwcffJCbbrrpuW7mrtFut3nlK1/J+vo6P/MzP4PnefzyL/8yxhgeeOAB9u/f/1w30cLCwsJij2H3OLvHWQzDfa4bYPH8xic+8QlOnz7Nl770Jd7whjcM3dvY2MD3/WvWlk6nQ7PZvCplf/zjH+fEiRN8+ctf5jWveQ0Ab3vb27jnnnv41//6X/NP/sk/uSr1WlhYWFg8d7B7nN3jLIZhTYksJuKpp57CcRy+9Vu/ddu9+fl5arXa0LX77ruPt7/97SwtLdFsNnnZy17Gv/k3/2Yozec//3m+/du/nWazyeLiIu9+97t59NFHh9J85CMfQQjBI488wgc+8AGWlpb4tm/7tsH9T37yk7zqVa+iXq+zb98+3v/+93PmzJmhMrrdLo899hhXrlyZ+py//du/zWte85rBgglw11138V3Line truncated
|
||||
"text/plain": [
|
||||
"<Figure size 1000x2500 with 10 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"similar_image_data_1 = []\n",
|
||||
"for img in similar_images:\n",
|
||||
" # Get metadata from Doc object\n",
|
||||
" similar_image_data_1.append(img.metadata)\n",
|
||||
"plot_images_by_side(similar_image_data_1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "de02016c-3961-457c-8198-160a1ec99af0",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Perform similarity search with image with relevance scores:\n",
|
||||
" We get a list of K tuples like following:\n",
|
||||
" [\n",
|
||||
" (Langchain_Document,score),\n",
|
||||
" (Langchain_Document,score),\n",
|
||||
" Langchain_Document,score)\n",
|
||||
" ]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"id": "ea0b5f77-e6b7-4721-aee6-6aa1ff0d8e29",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"similar_images = chroma_client.similarity_search_by_image_with_relevance_score(\n",
|
||||
" uri=search_img_path, k=k\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 20,
|
||||
"id": "d6400bb7-9a3f-4472-b01a-1cb9246e0a51",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"similar_image_data_2 = []\n",
|
||||
"for img in similar_images:\n",
|
||||
" # Get metadata from Doc object\n",
|
||||
" meta_dict = img[0].metadata\n",
|
||||
" # Add score to it\n",
|
||||
" meta_dict[\"score\"] = img[1]\n",
|
||||
" similar_image_data_2.append(meta_dict)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 21,
|
||||
"id": "294fe7ff-ffba-4386-9c27-d40581fa4c6b",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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A5gf+7EfG0j3zne+c5NK9d3vfrc5cuTIprb+8i//sskPs0ceecRIKc1b3vIWo5QaSKu17n+/kirVDG9+85sNYFZXV/vXjhw5UvgcZfDXf/3XRghh/vf//X/vX7t06ZIBzPvf//5N6X/rt37LAObBBx/cUn0WFhYWzxTYfW8znqr7nsXTG9aU6GmMO+64g71793Lttdfyjne8g0ajwSc/+UkOHz48kO6f/tN/OvD7z/7sz3Ach5/4iZ8YuP4zP/MzGGP41Kc+1U8HbEr33ve+d8tt/pM/+RO01vzSL/0SUg4OvyLV65VEphJdX1/vXztx4sSWpCYXL17kne98JzfccAM/93M/17/e6XQACIJgU55KpTKQxsLCwsJiPOy+tz1cjX3P4ukNa0r0NMZv/dZvcdNNN+G6Lvv37+fmm2/etOi4rss111wzcO3kyZMcOnRok/nKrbfe2r+ffUopOXbs2EC6m2++ecttfuyxx5BS8uxnP3vLZewUms0mwLbNeFqtFm984xtZX1/ni1/84oANZrVaBRKb1WF0u92BNBYWFhYW42H3ve3haux7Fk9vWMbgaYwXv/jFvPCFLxybJgiCTYvmlcAoqYdS6orXvVXce++97Nu3j9nZ2S2XEYYhP/RDP8Q999zDpz/9aW677baB+7t27SIIAs6dO7cpb3bt0KFDW67fwsLC4pkEu+9tD1dj37N4esOaEj0DceTIEZ544okBVSIkwUuy+9mn1nqTt4KHHnpoU5kLCwusrKxsup5JYTIcO3YMrTX333//2DZeafXq3/7t3/LYY4/xfd/3fVsuQ2vNu971Lj7/+c/zB3/wB7zqVa/alEZKye23314YAObOO+/k6NGj9uCxhYWFxRWG3feu3r5n8fSGZQyegXj961+PUorf/M3fHLj+oQ99CCEEr3vd6wD6n//+3//7gXQf/vCHN5V57NgxVldXueeee/rXzp07xyc/+cmBdD/4gz+IlJL3v//9aK0H7pmcy7h6vV644O4ETp48yXve8x583+dnf/ZnB+6VddsG8M//+T/nv/7X/8pHPvIRfuiHfmhkure+9a3cddddA8zBQw89xBe+8AXe9ra3be0hLCwsLCxKw+57V3ffs3j6wpoSPQPxpje9ide85jX84i/+IidOnOA7vuM7+MxnPsN//+//nfe+971928rnPe95/PAP/zAf+chHWF1d5aUvfSmf//znefTRRzeV+Y53vIN/8S/+BW95y1v4iZ/4CdrtNh/96Ee56aab+PrXv95P96xnPYtf/MVf5Fd+5Vd4xStewQ/90A8RBAF33XUXhw4d4l//638NJP6SP/rRj/Krv/qrPOtZz2Lfvn19f9XT4Otf/zof//jH0VqzsrLCXXfdxR//8R8jhOD3f//3ee5znzuQvqzbtg9/+MN85CMf4SUveQm1Wo2Pf/zjA/ff8pa3UK/XAfixH/sxfud3foc3vOEN/K//6/+K53n8xm/8Bvv37+dnfuZnpn4mCwsLC4vpYPe9q7vvWTyN8eQ6RbLYCkZFgBzGu9/9blOv1wvvra+vm5/6qZ8yhw4dMp7nmRtvvNF88IMfHHCdZowxnU7H/MRP/ITZvXu3qdfr5k1vepM5ffp0YQTIz3zmM+a2224zvu+bm2++2Xz84x/f5LYtw//7//6/5vnPf74JgsAsLCyYV73qVeazn/1s//758+fNG97wBjMzM2OAiS7cGOG2LftzXdfs2rXLfNd3fZf5+Z//eXPy5MnCcsq6bctc4o36O378+ED606dPm7e+9a1mdnbWNBoN88Y3vtE88sgjE+uxsLCwsLD7XhGe6vuexdMTwpihkH8WFhYWFhYWFhYWFs842DMGFhYWFhYWFhYWFhaWMbCwsLCwsLCwsLCwsIyBhYWFhYWFhYWFhQWWMbCwsLCwsLCwsLCwwDIGFhYWFhYWFhYWFhZYxsDCwsLCwsLCwsLCAssYWFhYWFhYWFhYWFhgGQML4NKlS/zkT/4kt9xyC9VqlX379vHiF7+Yf/Ev/gXNZvPJbt6O4ezZs7z97W9nfn6e2dlZ3vzmN/P444+Xzv/lL3+Zl7/85dRqNQ4cOMBP/MRPfFv1j4WFhcXTHXY/mw4rKyvs27cPIQSf+MQnBu7dd999vO1tb+Po0aPUajX27NnDK1/5Sv7H//gfO/UYFk9BuE92AyyeXCwtLfHCF76QtbU1fuRHfoRbbrmFxcVF7rnnHj760Y/yT//pP6XRaDzZzdw2ms0mr3nNa1hdXeUXfuEX8DyPD33oQ7zqVa/i7rvvZvfu3WPz33333bz2ta/l1ltv5Td+4zc4c+YMv/7rv84jjzzCpz71qav0FBYWFhYWo2D3s3L7WR6/9Eu/RLvdLrx38uRJ1tfXefe7382hQ4dot9v88R//MT/wAz/Ab//2b/OP//E/3qlHsngq4ckOvWzx5OIDH/iAAcyXvvSlTfdWV1dNp9O5am1pNptXrOx/82/+jQHMV77ylf61Bx54wDiOY37+539+Yv7Xve515uDBg2Z1dbV/7Xd+53cMYD796U9fkTZbWFhYWJSH3c/K7WcZvvWtbxnXdc373/9Line truncated
|
||||
"text/plain": [
|
||||
"<Figure size 1000x2500 with 10 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"plot_images_by_side(similar_image_data_2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5c8917bf-f84b-49f3-ae66-da0e78644139",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## We have successfully implemented an image-to-image search using CLIP and ChromaDB !"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.12"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
@@ -478,6 +478,93 @@ class Chroma(VectorStore):
|
||||
"Consider providing relevance_score_fn to Chroma constructor."
|
||||
)
|
||||
|
||||
def similarity_search_by_image(
|
||||
self,
|
||||
uri: str,
|
||||
k: int = DEFAULT_K,
|
||||
filter: Optional[Dict[str, str]] = None,
|
||||
**kwargs: Any,
|
||||
) -> List[Document]:
|
||||
"""Search for similar images based on the given image URI.
|
||||
|
||||
Args:
|
||||
uri (str): URI of the image to search for.
|
||||
k (int, optional): Number of results to return. Defaults to DEFAULT_K.
|
||||
filter (Optional[Dict[str, str]], optional): Filter by metadata.
|
||||
**kwargs (Any): Additional arguments to pass to function.
|
||||
|
||||
Returns:
|
||||
List of Images most similar to the provided image.
|
||||
Each element in list is a Langchain Document Object.
|
||||
The page content is b64 encoded image, metadata is default or
|
||||
as defined by user.
|
||||
|
||||
Raises:
|
||||
ValueError: If the embedding function does not support image embeddings.
|
||||
"""
|
||||
if self._embedding_function is None or not hasattr(
|
||||
self._embedding_function, "embed_image"
|
||||
):
|
||||
raise ValueError("The embedding function must support image embedding.")
|
||||
|
||||
# Obtain image embedding
|
||||
# Assuming embed_image returns a single embedding
|
||||
image_embedding = self._embedding_function.embed_image(uris=[uri])
|
||||
|
||||
# Perform similarity search based on the obtained embedding
|
||||
results = self.similarity_search_by_vector(
|
||||
embedding=image_embedding,
|
||||
k=k,
|
||||
filter=filter,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
return results
|
||||
|
||||
def similarity_search_by_image_with_relevance_score(
|
||||
self,
|
||||
uri: str,
|
||||
k: int = DEFAULT_K,
|
||||
filter: Optional[Dict[str, str]] = None,
|
||||
**kwargs: Any,
|
||||
) -> List[Tuple[Document, float]]:
|
||||
"""Search for similar images based on the given image URI.
|
||||
|
||||
Args:
|
||||
uri (str): URI of the image to search for.
|
||||
k (int, optional): Number of results to return.
|
||||
Defaults to DEFAULT_K.
|
||||
filter (Optional[Dict[str, str]], optional): Filter by metadata.
|
||||
**kwargs (Any): Additional arguments to pass to function.
|
||||
|
||||
Returns:
|
||||
List[Tuple[Document, float]]: List of tuples containing documents similar
|
||||
to the query image and their similarity scores.
|
||||
0th element in each tuple is a Langchain Document Object.
|
||||
The page content is b64 encoded img, metadata is default or defined by user.
|
||||
|
||||
Raises:
|
||||
ValueError: If the embedding function does not support image embeddings.
|
||||
"""
|
||||
if self._embedding_function is None or not hasattr(
|
||||
self._embedding_function, "embed_image"
|
||||
):
|
||||
raise ValueError("The embedding function must support image embedding.")
|
||||
|
||||
# Obtain image embedding
|
||||
# Assuming embed_image returns a single embedding
|
||||
image_embedding = self._embedding_function.embed_image(uris=[uri])
|
||||
|
||||
# Perform similarity search based on the obtained embedding
|
||||
results = self.similarity_search_by_vector_with_relevance_scores(
|
||||
embedding=image_embedding,
|
||||
k=k,
|
||||
filter=filter,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
return results
|
||||
|
||||
def max_marginal_relevance_search_by_vector(
|
||||
self,
|
||||
embedding: List[float],
|
||||
|
||||
@@ -607,6 +607,94 @@ class Chroma(VectorStore):
|
||||
"Consider providing relevance_score_fn to Chroma constructor."
|
||||
)
|
||||
|
||||
def similarity_search_by_image(
|
||||
self,
|
||||
uri: str,
|
||||
k: int = DEFAULT_K,
|
||||
filter: Optional[Dict[str, str]] = None,
|
||||
**kwargs: Any,
|
||||
) -> List[Document]:
|
||||
"""Search for similar images based on the given image URI.
|
||||
|
||||
Args:
|
||||
uri (str): URI of the image to search for.
|
||||
k (int, optional): Number of results to return. Defaults to DEFAULT_K.
|
||||
filter (Optional[Dict[str, str]], optional): Filter by metadata.
|
||||
**kwargs (Any): Additional arguments to pass to function.
|
||||
|
||||
|
||||
Returns:
|
||||
List of Images most similar to the provided image.
|
||||
Each element in list is a Langchain Document Object.
|
||||
The page content is b64 encoded image, metadata is default or
|
||||
as defined by user.
|
||||
|
||||
Raises:
|
||||
ValueError: If the embedding function does not support image embeddings.
|
||||
"""
|
||||
if self._embedding_function is None or not hasattr(
|
||||
self._embedding_function, "embed_image"
|
||||
):
|
||||
raise ValueError("The embedding function must support image embedding.")
|
||||
|
||||
# Obtain image embedding
|
||||
# Assuming embed_image returns a single embedding
|
||||
image_embedding = self._embedding_function.embed_image(uris=[uri])
|
||||
|
||||
# Perform similarity search based on the obtained embedding
|
||||
results = self.similarity_search_by_vector(
|
||||
embedding=image_embedding,
|
||||
k=k,
|
||||
filter=filter,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
return results
|
||||
|
||||
def similarity_search_by_image_with_relevance_score(
|
||||
self,
|
||||
uri: str,
|
||||
k: int = DEFAULT_K,
|
||||
filter: Optional[Dict[str, str]] = None,
|
||||
**kwargs: Any,
|
||||
) -> List[Tuple[Document, float]]:
|
||||
"""Search for similar images based on the given image URI.
|
||||
|
||||
Args:
|
||||
uri (str): URI of the image to search for.
|
||||
k (int, optional): Number of results to return.
|
||||
Defaults to DEFAULT_K.
|
||||
filter (Optional[Dict[str, str]], optional): Filter by metadata.
|
||||
**kwargs (Any): Additional arguments to pass to function.
|
||||
|
||||
Returns:
|
||||
List[Tuple[Document, float]]: List of tuples containing documents similar
|
||||
to the query image and their similarity scores.
|
||||
0th element in each tuple is a Langchain Document Object.
|
||||
The page content is b64 encoded img, metadata is default or defined by user.
|
||||
|
||||
Raises:
|
||||
ValueError: If the embedding function does not support image embeddings.
|
||||
"""
|
||||
if self._embedding_function is None or not hasattr(
|
||||
self._embedding_function, "embed_image"
|
||||
):
|
||||
raise ValueError("The embedding function must support image embedding.")
|
||||
|
||||
# Obtain image embedding
|
||||
# Assuming embed_image returns a single embedding
|
||||
image_embedding = self._embedding_function.embed_image(uris=[uri])
|
||||
|
||||
# Perform similarity search based on the obtained embedding
|
||||
results = self.similarity_search_by_vector_with_relevance_scores(
|
||||
embedding=image_embedding,
|
||||
k=k,
|
||||
filter=filter,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
return results
|
||||
|
||||
def max_marginal_relevance_search_by_vector(
|
||||
self,
|
||||
embedding: List[float],
|
||||
|
||||
Reference in new issue
Block a user