You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
langchain/cookbook/img-to_img-search_CLIP_Chro...

604 lines
4.4 MiB
Plaintext

{
"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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
"image/png": "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
"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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
"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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
"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
}