{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Image summary and visual question answering" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "This notebooks shows how to generate image captions and use the visual question answering with [LAVIS](https://github.com/salesforce/LAVIS). \n", "\n", "The first cell is only run on google colab and installs the [ammico](https://github.com/ssciwr/AMMICO) package.\n", "\n", "After that, we can import `ammico` and read in the files given a folder path." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2023-05-26T09:34:20.124150Z", "iopub.status.busy": "2023-05-26T09:34:20.123919Z", "iopub.status.idle": "2023-05-26T09:34:20.132420Z", "shell.execute_reply": "2023-05-26T09:34:20.131778Z" } }, "outputs": [], "source": [ "# if running on google colab\n", "# flake8-noqa-cell\n", "import os\n", "\n", "if \"google.colab\" in str(get_ipython()):\n", " # update python version\n", " # install setuptools\n", " # %pip install setuptools==61 -qqq\n", " # install ammico\n", " %pip install git+https://github.com/ssciwr/ammico.git -qqq\n", " # mount google drive for data and API key\n", " from google.colab import drive\n", "\n", " drive.mount(\"/content/drive\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2023-05-26T09:34:20.135371Z", "iopub.status.busy": "2023-05-26T09:34:20.134938Z", "iopub.status.idle": "2023-05-26T09:34:31.164137Z", "shell.execute_reply": "2023-05-26T09:34:31.163398Z" }, "tags": [] }, "outputs": [], "source": [ "import ammico\n", "from ammico import utils as mutils\n", "from ammico import display as mdisplay\n", "import ammico.summary as sm" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2023-05-26T09:34:31.168295Z", "iopub.status.busy": "2023-05-26T09:34:31.167332Z", "iopub.status.idle": "2023-05-26T09:34:31.171678Z", "shell.execute_reply": "2023-05-26T09:34:31.170972Z" }, "tags": [] }, "outputs": [], "source": [ "# Here you need to provide the path to your google drive folder\n", "# or local folder containing the images\n", "images = mutils.find_files(\n", " path=\"data/\",\n", " limit=10,\n", ")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2023-05-26T09:34:31.174681Z", "iopub.status.busy": "2023-05-26T09:34:31.174079Z", "iopub.status.idle": "2023-05-26T09:34:31.177445Z", "shell.execute_reply": "2023-05-26T09:34:31.176797Z" }, "tags": [] }, "outputs": [], "source": [ "mydict = mutils.initialize_dict(images)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Create captions for images and directly write to csv" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Here you can choose between two models: \"base\" or \"large\". This will generate the caption for each image and directly put the results in a dataframe. This dataframe can be exported as a csv file.\n", "\n", "The results are written into the columns `const_image_summary` - this will always be the same result (as always the same seed will be used). The column `3_non-deterministic summary` displays three different answers generated with different seeds, these are most likely different when you run the analysis again." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2023-05-26T09:34:31.180851Z", "iopub.status.busy": "2023-05-26T09:34:31.180314Z", "iopub.status.idle": "2023-05-26T09:35:08.210237Z", "shell.execute_reply": "2023-05-26T09:35:08.209403Z" }, "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\r", " 0%| | 0.00/2.50G [00:00\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", "
filenameconst_image_summary3_non-deterministic summary
0data/102730_eng.pngtwo people in blue coats spray disinfection a van[two people in blue robes spraying geranis, tw...
1data/102141_2_eng.pnga collage of images including a corona sign, a...[the corona vaccine is being released from cor...
2data/106349S_por.pnga man wearing a face mask while looking at a c...[a man in a white shirt is on a news desk, a m...
\n", "" ], "text/plain": [ " filename const_image_summary \n", "0 data/102730_eng.png two people in blue coats spray disinfection a van \\\n", "1 data/102141_2_eng.png a collage of images including a corona sign, a... \n", "2 data/106349S_por.png a man wearing a face mask while looking at a c... \n", "\n", " 3_non-deterministic summary \n", "0 [two people in blue robes spraying geranis, tw... \n", "1 [the corona vaccine is being released from cor... \n", "2 [a man in a white shirt is on a news desk, a m... " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(10)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Write the csv file:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2023-05-26T09:35:41.259680Z", "iopub.status.busy": "2023-05-26T09:35:41.259247Z", "iopub.status.idle": "2023-05-26T09:35:41.264127Z", "shell.execute_reply": "2023-05-26T09:35:41.263539Z" } }, "outputs": [], "source": [ "df.to_csv(\"data_out.csv\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Manually inspect the summaries\n", "\n", "To check the analysis, you can inspect the analyzed elements here. Loading the results takes a moment, so please be patient. If you are sure of what you are doing.\n", "\n", "`const_image_summary` - the permanent summarys, which does not change from run to run (analyse_image).\n", "\n", "`3_non-deterministic summary` - 3 different summarys examples that change from run to run (analyse_image). " ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2023-05-26T09:35:41.266914Z", "iopub.status.busy": "2023-05-26T09:35:41.266476Z", "iopub.status.idle": "2023-05-26T09:35:41.292442Z", "shell.execute_reply": "2023-05-26T09:35:41.291849Z" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dash is running on http://127.0.0.1:8055/\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:dash.dash:Dash is running on http://127.0.0.1:8055/\n", "\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "analysis_explorer = mdisplay.AnalysisExplorer(mydict, identify=\"summary\")\n", "analysis_explorer.run_server(port=8055)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Generate answers to free-form questions about images written in natural language. " ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Set the list of questions as a list of strings:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2023-05-26T09:35:41.295577Z", "iopub.status.busy": "2023-05-26T09:35:41.295144Z", "iopub.status.idle": "2023-05-26T09:35:41.298652Z", "shell.execute_reply": "2023-05-26T09:35:41.297666Z" } }, "outputs": [], "source": [ "list_of_questions = [\n", " \"How many persons on the picture?\",\n", " \"Are there any politicians in the picture?\",\n", " \"Does the picture show something from medicine?\",\n", "]" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Explore the analysis using the interface:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2023-05-26T09:35:41.301756Z", "iopub.status.busy": "2023-05-26T09:35:41.301328Z", "iopub.status.idle": "2023-05-26T09:35:41.824478Z", "shell.execute_reply": "2023-05-26T09:35:41.823781Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dash is running on http://127.0.0.1:8055/\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:dash.dash:Dash is running on http://127.0.0.1:8055/\n", "\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "analysis_explorer = mdisplay.AnalysisExplorer(mydict, identify=\"summary\")\n", "analysis_explorer.run_server(port=8055)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Or directly analyze for further processing\n", "Instead of inspecting each of the images, you can also directly carry out the analysis and export the result into a csv. This may take a while depending on how many images you have loaded." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2023-05-26T09:35:41.828140Z", "iopub.status.busy": "2023-05-26T09:35:41.827666Z", "iopub.status.idle": "2023-05-26T09:36:39.251261Z", "shell.execute_reply": "2023-05-26T09:36:39.250458Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\r", " 0%| | 0.00/1.35G [00:00\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", "
filenameconst_image_summary3_non-deterministic summaryHow many persons on the picture?Are there any politicians in the picture?Does the picture show something from medicine?
0data/102730_eng.pngtwo people in blue coats spray disinfection a van[two people in blue robes spraying geranis, tw...2noyes
1data/102141_2_eng.pnga collage of images including a corona sign, a...[the corona vaccine is being released from cor...1noyes
2data/106349S_por.pnga man wearing a face mask while looking at a c...[a man in a white shirt is on a news desk, a m...1yesyes
\n", "" ], "text/plain": [ " filename const_image_summary \n", "0 data/102730_eng.png two people in blue coats spray disinfection a van \\\n", "1 data/102141_2_eng.png a collage of images including a corona sign, a... \n", "2 data/106349S_por.png a man wearing a face mask while looking at a c... \n", "\n", " 3_non-deterministic summary \n", "0 [two people in blue robes spraying geranis, tw... \\\n", "1 [the corona vaccine is being released from cor... \n", "2 [a man in a white shirt is on a news desk, a m... \n", "\n", " How many persons on the picture? Are there any politicians in the picture? \n", "0 2 no \\\n", "1 1 no \n", "2 1 yes \n", "\n", " Does the picture show something from medicine? \n", "0 yes \n", "1 yes \n", "2 yes " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.head(10)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2023-05-26T09:36:39.277136Z", "iopub.status.busy": "2023-05-26T09:36:39.276608Z", "iopub.status.idle": "2023-05-26T09:36:39.281540Z", "shell.execute_reply": "2023-05-26T09:36:39.280961Z" } }, "outputs": [], "source": [ "df2.to_csv(\"data_out2.csv\")" ] }, { "cell_type": "code", "execution_count": null, "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.16" }, "vscode": { "interpreter": { "hash": "f1142466f556ab37fe2d38e2897a16796906208adb09fea90ba58bdf8a56f0ba" } } }, "nbformat": 4, "nbformat_minor": 4 }