{ "cells": [ { "cell_type": "markdown", "id": "665e6753-9c9c-4a16-98da-68ac9b783bd4", "metadata": {}, "source": [ "# Vision Large Language Models for Counting objects\n", "In this notebook we use OpenAI's LLMs with Vision capabilities to see how well they can count blobs in blobs.tif.\n", "\n", "Note: It is not recommended to use this approach for counting objects in microscopy images. The author of this notebook is not aware of any publication showing that this approach works well." ] }, { "cell_type": "code", "execution_count": 1, "id": "ca2dec04-c412-4421-b427-9eef7128bfac", "metadata": { "tags": [] }, "outputs": [], "source": [ "import openai\n", "import PIL\n", "import stackview\n", "from skimage.io import imread\n", "import pandas as pd\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "e8bc07d1-c208-4a02-8f9a-bd43b3dbc48b", "metadata": {}, "source": [ "We will need some helper functions for assembling a prompt and submitting it to the openai server." ] }, { "cell_type": "code", "execution_count": 2, "id": "a7c92c01-2714-446a-beca-7676b362d6c6", "metadata": { "tags": [] }, "outputs": [], "source": [ "def prompt_with_image(message:str, image, model=\"gpt-4o-2024-05-13\"):\n", " \"\"\"A prompt helper function that sends a text message and an image\n", " to openAI and returns the text response.\n", " \"\"\"\n", " import os\n", " \n", " # convert message in the right format if necessary\n", " if isinstance(message, str):\n", " message = [{\"role\": \"user\", \"content\": message}]\n", " \n", " image_message = image_to_message(image)\n", " \n", " # setup connection to the LLM\n", " client = openai.OpenAI()\n", " \n", " # submit prompt\n", " response = client.chat.completions.create(\n", " model=model,\n", " messages=message + image_message\n", " )\n", " \n", " # extract answer\n", " return response.choices[0].message.content\n", "\n", "\n", "def image_to_message(image):\n", " import base64\n", "\n", " from stackview._image_widget import _img_to_rgb\n", "\n", " rgb_image = _img_to_rgb(image)\n", " byte_stream = numpy_to_bytestream(rgb_image)\n", " base64_image = base64.b64encode(byte_stream).decode('utf-8')\n", "\n", " return [{\"role\": \"user\", \"content\": [{\n", " \"type\": \"image_url\",\n", " \"image_url\": {\n", " \"url\": f\"data:image/jpeg;base64,{base64_image}\"\n", " }\n", "\n", " }]}]\n", "\n", "\n", "def numpy_to_bytestream(data):\n", " \"\"\"Turn a NumPy array into a bytestream\"\"\"\n", " import numpy as np\n", " from PIL import Image\n", " import io\n", "\n", " # Convert the NumPy array to a PIL Image\n", " image = Image.fromarray(data.astype(np.uint8)).convert(\"RGBA\")\n", "\n", " # Create a BytesIO object\n", " bytes_io = io.BytesIO()\n", "\n", " # Save the PIL image to the BytesIO object as a PNG\n", " image.save(bytes_io, format='PNG')\n", "\n", " # return the beginning of the file as a bytestream\n", " bytes_io.seek(0)\n", " return bytes_io.read()" ] }, { "cell_type": "markdown", "id": "5e55fea8-31ae-420f-8056-b41c815145d8", "metadata": {}, "source": [ "This is the example image we will be using." ] }, { "cell_type": "code", "execution_count": 3, "id": "0d1a7583-af96-4494-98bb-4b2a38aacdee", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
shape(254, 256)
dtypeuint8
size63.5 kB
min8
max248
\n", "\n", "
" ], "text/plain": [ "StackViewNDArray([[ 40, 32, 24, ..., 216, 200, 200],\n", " [ 56, 40, 24, ..., 232, 216, 216],\n", " [ 64, 48, 24, ..., 240, 232, 232],\n", " ...,\n", " [ 72, 80, 80, ..., 48, 48, 48],\n", " [ 80, 80, 80, ..., 48, 48, 48],\n", " [ 96, 88, 80, ..., 48, 48, 48]], dtype=uint8)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "image = imread(\"../../data/blobs.tif\")\n", "stackview.insight(image)" ] }, { "cell_type": "markdown", "id": "5be7cd84-b868-48fe-8bdb-413c6b731ff1", "metadata": { "tags": [] }, "source": [ "This is the prompt we submit to the server." ] }, { "cell_type": "code", "execution_count": 4, "id": "7ee44e8a-fe57-42a9-a1eb-9779203d5787", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "'64'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_prompt = \"\"\"\n", "Analyse the following image by counting the bright blobs. Respond with the number only.\n", "\"\"\"\n", "\n", "prompt_with_image(my_prompt, image)" ] }, { "cell_type": "markdown", "id": "c15791ff-5a66-4558-ba77-a8e07ef7f7d9", "metadata": { "tags": [] }, "source": [ "## Benchmarking vision-LLMs\n", "We can run this prompt in a loop for a couple of vision models." ] }, { "cell_type": "code", "execution_count": 5, "id": "18aab908-f13b-4f1d-8b69-6470eb2d9b3f", "metadata": { "tags": [] }, "outputs": [], "source": [ "num_samples = 25\n", "\n", "models = {\n", " \"gpt-4-vision-preview\":[],\n", " \"gpt-4-turbo-2024-04-09\":[], \n", " \"gpt-4o-2024-05-13\":[],\n", "}\n", "for model in models.keys():\n", " samples = []\n", "\n", " while len(samples) < num_samples:\n", " result = prompt_with_image(my_prompt, image)\n", "\n", " try:\n", " samples.append(int(result))\n", " except:\n", " print(\"Error processing result:\", result)\n", " \n", " models[model] = samples\n", "\n", "sampled_models = pd.DataFrame(models)" ] }, { "cell_type": "markdown", "id": "5824ef1f-11b8-43bc-81cd-c04bd3b4d5f9", "metadata": {}, "source": [ "Let's get an overview about samples:" ] }, { "cell_type": "code", "execution_count": 12, "id": "fab684f3-25b1-4035-a327-82906f88c32f", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArcAAAGHCAYAAACqD3pHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACITklEQVR4nOzdd3gUVdsG8Hu2ZtN7QkIglABSQu8lINKLiIoKCiivDUURLKAiRQgCCvhJU1RAaYoKoiACQkKvAemhhZqEQHrder4/lqws6ZBkN8n9u65cyZ45M/NMdmf32TNnzpGEEAJERERERJWAzNYBEBERERGVFia3RERERFRpMLklIiIiokqDyS0RERERVRpMbomIiIio0mByS0RERESVBpNbIiIiIqo0mNwSERERUaXB5JaIiIiIKg0mt0RV0BNPPAGNRoOUlJQC6wwbNgxKpRK3bt3C8uXLIUkSrly5UqL9BAcHY+TIkQ8Va0UlSRKmTJlS4vWuXLkCSZKwfPnyUo/J3sTGxmLKlCk4fvx4nmVTpkyBJEnlHxSAkSNHwtnZuVh1H/Q1nvs8f/755yVel4gKx+SWqAoaNWoUcnJysHr16nyXp6amYv369ejfvz/8/PzQr18/7N+/H9WqVSvRftavX49JkyaVRshUCcXGxmLq1Kn5Jrf/+9//sH///vIPiogqPCa3RFVQnz59EBAQgO+//z7f5WvWrEF2djZGjRoFAPDx8UG7du2gVqtLtJ/mzZujTp06Dx0vVT3Vq1dHu3btbB0GEVVATG6JqiC5XI4RI0bg6NGjOHnyZJ7ly5YtQ7Vq1dCnTx8AyLdbwrFjx9C/f3/4+vpCrVYjICAA/fr1w40bNyx18rtke+3aNTz//POW9R555BF88cUXMJlMljr3XrKdO3cuatWqBWdnZ7Rv3x4HDhwo8vhy492xYwdefvlleHl5wdXVFcOHD0dmZibi4+MxZMgQuLu7o1q1anj33Xeh1+uttpGUlITRo0cjMDAQKpUKtWvXxkcffQStVmtVLy0tzbIPZ2dn9O7dG+fPn883rgsXLmDo0KFWx75w4cIij+f27dt45ZVXEBQUBLVaDR8fH3Ts2BHbt28vct1z587hueeeg5+fH9RqNWrUqIHhw4dbHcepU6fw+OOPw8PDAw4ODmjWrBlWrFiR7//0/q4pERERkCQJERERlrKuXbuicePGOHz4MDp37gxHR0fUrl0bn332meV5joiIQOvWrQEAL774IiRJsurKkV+3hODgYPTv3x9btmxBixYtoNFo0KBBg3y/pO3Zswft27eHg4MDAgMDMWnSJHz77bcl6l5z+vRpdO/eHU5OTvDx8cGbb76JrKysItcrzms8l8lkwowZM1CjRg04ODigVatW+Oeff6zqPMzzT1QVKWwdABHZxksvvYTPPvsM33//PebNm2cpP3PmDA4dOoQJEyZALpfnu25mZiZ69OiBWrVqYeHChfDz80N8fDx27tyJ9PT0Avd5+/ZtdOjQATqdDp9++imCg4Px559/4t1338WlS5ewaNEiq/oLFy5EgwYNMH/+fADApEmT0LdvX8TExMDNza3IY/zf//6HwYMHY+3atTh27Bg+/PBDGAwGREdHY/DgwXjllVewfft2zJo1CwEBARg3bhwAICcnB926dcOlS5cwdepUhIaGYvfu3Zg5cyaOHz+OTZs2AQCEEBg0aBD27duHTz75BK1bt8bevXstXwrudebMGXTo0AE1atTAF198AX9/f/z999946623cOfOHUyePLnA43jhhRcQFRWFGTNmoF69ekhJSUFUVBQSExMLPf5///0XnTp1gre3N6ZNm4aQkBDExcVh48aN0Ol0UKvViI6ORocOHeDr64v/+7//g5eXF1auXImRI0fi1q1beP/994v8P+cnPj4ew4YNw/jx4zF58mSsX78eEydOREBAAIYPH44WLVpg2bJlePHFF/Hxxx+jX79+AMwttkUd0/jx4zFhwgT4+fnh22+/xahRo1C3bl106dIFAHDixAn06NED9erVw4oVK+Do6IglS5Zg5cqVxY5fr9ejb9++ePXVVzFhwgTs27cP06dPx9WrV/HHH38UuF5JX+MLFixAzZo1MX/+fJhMJsyePRt9+vRBZGQk2rdvD+DBn3+iKksQUZUVFhYmvL29hU6ns5SNHz9eABDnz5+3lC1btkwAEDExMUIIIY4cOSIAiA0bNhS6/Zo1a4oRI0ZYHk+YMEEAEAcPHrSq9/rrrwtJkkR0dLQQQoiYmBgBQDRp0kQYDAZLvUOHDgkAYs2aNYXuNzfeMWPGWJUPGjRIABBz5861Km/WrJlo0aKF5fGSJUsEAPHzzz9b1Zs1a5YAILZu3SqEEOKvv/4SAMSXX35pVW/GjBkCgJg8ebKl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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Extract the two columns for comparison\n", "columns_to_plot = sampled_models[models.keys()]\n", "\n", "# Melt the dataframe to prepare for plotting\n", "df_melted = columns_to_plot.melt(var_name='Model', value_name='Blob count')\n", "\n", "# Draw the violin plot\n", "plt.figure(figsize=(8, 4))\n", "sns.violinplot(x='Model', y='Blob count', data=df_melted)\n", "plt.title('Vision models counting blobs')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "809528b3-5167-4a8e-a39b-ee535dccabea", "metadata": {}, "source": [ "These are the results in detail:" ] }, { "cell_type": "code", "execution_count": 13, "id": "98464038-2c40-426e-8219-60399c6220ca", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
gpt-4-vision-previewgpt-4-turbo-2024-04-09gpt-4o-2024-05-13
0565658
1525254
2535469
3485950
4625163
5585455
6565556
7695857
8536050
9507851
10635254
111205665
12566455
13615757
14525646
15645254
16745363
17515752
18524963
19527251
20484751
21525450
22675058
23525648
24655454
\n", "
" ], "text/plain": [ " gpt-4-vision-preview gpt-4-turbo-2024-04-09 gpt-4o-2024-05-13\n", "0 56 56 58\n", "1 52 52 54\n", "2 53 54 69\n", "3 48 59 50\n", "4 62 51 63\n", "5 58 54 55\n", "6 56 55 56\n", "7 69 58 57\n", "8 53 60 50\n", "9 50 78 51\n", "10 63 52 54\n", "11 120 56 65\n", "12 56 64 55\n", "13 61 57 57\n", "14 52 56 46\n", "15 64 52 54\n", "16 74 53 63\n", "17 51 57 52\n", "18 52 49 63\n", "19 52 72 51\n", "20 48 47 51\n", "21 52 54 50\n", "22 67 50 58\n", "23 52 56 48\n", "24 65 54 54" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sampled_models" ] }, { "cell_type": "code", "execution_count": 14, "id": "9c20a386-33ea-4b29-8366-2281566d5f79", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
gpt-4-vision-previewgpt-4-turbo-2024-04-09gpt-4o-2024-05-13
count25.00000025.00000025.000000
mean59.44000056.24000055.360000
std14.3993066.7655995.692685
min48.00000047.00000046.000000
25%52.00000052.00000051.000000
50%56.00000055.00000054.000000
75%63.00000057.00000058.000000
max120.00000078.00000069.000000
\n", "
" ], "text/plain": [ " gpt-4-vision-preview gpt-4-turbo-2024-04-09 gpt-4o-2024-05-13\n", "count 25.000000 25.000000 25.000000\n", "mean 59.440000 56.240000 55.360000\n", "std 14.399306 6.765599 5.692685\n", "min 48.000000 47.000000 46.000000\n", "25% 52.000000 52.000000 51.000000\n", "50% 56.000000 55.000000 54.000000\n", "75% 63.000000 57.000000 58.000000\n", "max 120.000000 78.000000 69.000000" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sampled_models.describe()" ] }, { "cell_type": "code", "execution_count": null, "id": "d73e944c-4048-4f75-bd3c-6efce099c75e", "metadata": {}, "outputs": [], "source": [] } ], "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.9.19" } }, "nbformat": 4, "nbformat_minor": 5 }