{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "51c8a899", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting tensorflow\n", " Using cached tensorflow-2.19.0-cp312-cp312-win_amd64.whl.metadata (4.1 kB)\n", "Collecting absl-py>=1.0.0 (from tensorflow)\n", " Using cached absl_py-2.2.2-py3-none-any.whl.metadata (2.6 kB)\n", "Collecting astunparse>=1.6.0 (from tensorflow)\n", " Using cached astunparse-1.6.3-py2.py3-none-any.whl.metadata (4.4 kB)\n", "Collecting flatbuffers>=24.3.25 (from tensorflow)\n", " Downloading flatbuffers-25.2.10-py2.py3-none-any.whl.metadata (875 bytes)\n", "Collecting gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 (from tensorflow)\n", " Using cached gast-0.6.0-py3-none-any.whl.metadata (1.3 kB)\n", "Collecting google-pasta>=0.1.1 (from tensorflow)\n", " Using cached google_pasta-0.2.0-py3-none-any.whl.metadata (814 bytes)\n", "Collecting libclang>=13.0.0 (from tensorflow)\n", " Using cached libclang-18.1.1-py2.py3-none-win_amd64.whl.metadata (5.3 kB)\n", "Collecting opt-einsum>=2.3.2 (from tensorflow)\n", " Using cached opt_einsum-3.4.0-py3-none-any.whl.metadata (6.3 kB)\n", "Requirement already satisfied: packaging in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow) (24.2)\n", "Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<6.0.0dev,>=3.20.3 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow) (5.29.4)\n", "Requirement already satisfied: requests<3,>=2.21.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow) (2.32.3)\n", "Requirement already satisfied: setuptools in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow) (78.1.0)\n", "Requirement already satisfied: six>=1.12.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow) (1.17.0)\n", "Collecting termcolor>=1.1.0 (from tensorflow)\n", " Downloading termcolor-3.1.0-py3-none-any.whl.metadata (6.4 kB)\n", "Requirement already satisfied: typing-extensions>=3.6.6 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow) (4.13.1)\n", "Collecting wrapt>=1.11.0 (from tensorflow)\n", " Using cached wrapt-1.17.2-cp312-cp312-win_amd64.whl.metadata (6.5 kB)\n", "Requirement already satisfied: grpcio<2.0,>=1.24.3 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow) (1.71.0)\n", "Collecting tensorboard~=2.19.0 (from tensorflow)\n", " Using cached tensorboard-2.19.0-py3-none-any.whl.metadata (1.8 kB)\n", "Collecting keras>=3.5.0 (from tensorflow)\n", " Using cached keras-3.9.2-py3-none-any.whl.metadata (6.1 kB)\n", "Requirement already satisfied: numpy<2.2.0,>=1.26.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow) (2.1.1)\n", "Collecting h5py>=3.11.0 (from tensorflow)\n", " Using cached h5py-3.13.0-cp312-cp312-win_amd64.whl.metadata (2.5 kB)\n", "Collecting ml-dtypes<1.0.0,>=0.5.1 (from tensorflow)\n", " Using cached ml_dtypes-0.5.1-cp312-cp312-win_amd64.whl.metadata (22 kB)\n", "Collecting wheel<1.0,>=0.23.0 (from astunparse>=1.6.0->tensorflow)\n", " Using cached wheel-0.45.1-py3-none-any.whl.metadata (2.3 kB)\n", "Collecting rich (from keras>=3.5.0->tensorflow)\n", " Downloading rich-14.0.0-py3-none-any.whl.metadata (18 kB)\n", "Collecting namex (from keras>=3.5.0->tensorflow)\n", " Downloading namex-0.0.9-py3-none-any.whl.metadata (322 bytes)\n", "Collecting optree (from keras>=3.5.0->tensorflow)\n", " Using cached optree-0.15.0-cp312-cp312-win_amd64.whl.metadata (49 kB)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow) (3.4.1)\n", "Requirement already satisfied: idna<4,>=2.5 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow) (3.10)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow) (2.3.0)\n", "Requirement already satisfied: certifi>=2017.4.17 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow) (2025.1.31)\n", "Collecting markdown>=2.6.8 (from tensorboard~=2.19.0->tensorflow)\n", " Using cached markdown-3.8-py3-none-any.whl.metadata (5.1 kB)\n", "Collecting tensorboard-data-server<0.8.0,>=0.7.0 (from tensorboard~=2.19.0->tensorflow)\n", " Using cached tensorboard_data_server-0.7.2-py3-none-any.whl.metadata (1.1 kB)\n", "Collecting werkzeug>=1.0.1 (from tensorboard~=2.19.0->tensorflow)\n", " Using cached werkzeug-3.1.3-py3-none-any.whl.metadata (3.7 kB)\n", "Requirement already satisfied: MarkupSafe>=2.1.1 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from werkzeug>=1.0.1->tensorboard~=2.19.0->tensorflow) (3.0.2)\n", "Collecting markdown-it-py>=2.2.0 (from rich->keras>=3.5.0->tensorflow)\n", " Using cached markdown_it_py-3.0.0-py3-none-any.whl.metadata (6.9 kB)\n", "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from rich->keras>=3.5.0->tensorflow) (2.19.1)\n", "Collecting mdurl~=0.1 (from markdown-it-py>=2.2.0->rich->keras>=3.5.0->tensorflow)\n", " Using cached mdurl-0.1.2-py3-none-any.whl.metadata (1.6 kB)\n", "Using cached tensorflow-2.19.0-cp312-cp312-win_amd64.whl (376.0 MB)\n", "Using cached absl_py-2.2.2-py3-none-any.whl (135 kB)\n", "Using cached astunparse-1.6.3-py2.py3-none-any.whl (12 kB)\n", "Downloading flatbuffers-25.2.10-py2.py3-none-any.whl (30 kB)\n", "Using cached gast-0.6.0-py3-none-any.whl (21 kB)\n", "Using cached google_pasta-0.2.0-py3-none-any.whl (57 kB)\n", "Using cached h5py-3.13.0-cp312-cp312-win_amd64.whl (3.0 MB)\n", "Using cached keras-3.9.2-py3-none-any.whl (1.3 MB)\n", "Using cached libclang-18.1.1-py2.py3-none-win_amd64.whl (26.4 MB)\n", "Using cached ml_dtypes-0.5.1-cp312-cp312-win_amd64.whl (210 kB)\n", "Using cached opt_einsum-3.4.0-py3-none-any.whl (71 kB)\n", "Using cached tensorboard-2.19.0-py3-none-any.whl (5.5 MB)\n", "Downloading termcolor-3.1.0-py3-none-any.whl (7.7 kB)\n", "Using cached wrapt-1.17.2-cp312-cp312-win_amd64.whl (38 kB)\n", "Using cached markdown-3.8-py3-none-any.whl (106 kB)\n", "Using cached tensorboard_data_server-0.7.2-py3-none-any.whl (2.4 kB)\n", "Using cached werkzeug-3.1.3-py3-none-any.whl (224 kB)\n", "Using cached wheel-0.45.1-py3-none-any.whl (72 kB)\n", "Downloading namex-0.0.9-py3-none-any.whl (5.8 kB)\n", "Using cached optree-0.15.0-cp312-cp312-win_amd64.whl (307 kB)\n", "Downloading rich-14.0.0-py3-none-any.whl (243 kB)\n", "Using cached markdown_it_py-3.0.0-py3-none-any.whl (87 kB)\n", "Using cached mdurl-0.1.2-py3-none-any.whl (10.0 kB)\n", "Installing collected packages: namex, libclang, flatbuffers, wrapt, wheel, werkzeug, termcolor, tensorboard-data-server, optree, opt-einsum, ml-dtypes, mdurl, markdown, h5py, google-pasta, gast, absl-py, tensorboard, markdown-it-py, astunparse, rich, keras, tensorflow\n", "Successfully installed absl-py-2.2.2 astunparse-1.6.3 flatbuffers-25.2.10 gast-0.6.0 google-pasta-0.2.0 h5py-3.13.0 keras-3.9.2 libclang-18.1.1 markdown-3.8 markdown-it-py-3.0.0 mdurl-0.1.2 ml-dtypes-0.5.1 namex-0.0.9 opt-einsum-3.4.0 optree-0.15.0 rich-14.0.0 tensorboard-2.19.0 tensorboard-data-server-0.7.2 tensorflow-2.19.0 termcolor-3.1.0 werkzeug-3.1.3 wheel-0.45.1 wrapt-1.17.2\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "[notice] A new release of pip is available: 25.0.1 -> 25.1.1\n", "[notice] To update, run: python.exe -m pip install --upgrade pip\n" ] } ], "source": [ "!pip install tensorflow" ] }, { "cell_type": "code", "execution_count": 2, "id": "48087332", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting tensorflow_hub\n", " Downloading tensorflow_hub-0.16.1-py2.py3-none-any.whl.metadata (1.3 kB)\n", "Requirement already satisfied: numpy>=1.12.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow_hub) (2.1.1)\n", "Requirement already satisfied: protobuf>=3.19.6 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow_hub) (5.29.4)\n", "Collecting tf-keras>=2.14.1 (from tensorflow_hub)\n", " Downloading tf_keras-2.19.0-py3-none-any.whl.metadata (1.8 kB)\n", "Requirement already satisfied: tensorflow<2.20,>=2.19 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tf-keras>=2.14.1->tensorflow_hub) (2.19.0)\n", "Requirement already satisfied: absl-py>=1.0.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (2.2.2)\n", "Requirement already satisfied: astunparse>=1.6.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (1.6.3)\n", "Requirement already satisfied: flatbuffers>=24.3.25 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (25.2.10)\n", "Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (0.6.0)\n", "Requirement already satisfied: google-pasta>=0.1.1 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (0.2.0)\n", "Requirement already satisfied: libclang>=13.0.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (18.1.1)\n", "Requirement already satisfied: opt-einsum>=2.3.2 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (3.4.0)\n", "Requirement already satisfied: packaging in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (24.2)\n", "Requirement already satisfied: requests<3,>=2.21.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (2.32.3)\n", "Requirement already satisfied: setuptools in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (78.1.0)\n", "Requirement already satisfied: six>=1.12.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (1.17.0)\n", "Requirement already satisfied: termcolor>=1.1.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (3.1.0)\n", "Requirement already satisfied: typing-extensions>=3.6.6 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (4.13.1)\n", "Requirement already satisfied: wrapt>=1.11.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (1.17.2)\n", "Requirement already satisfied: grpcio<2.0,>=1.24.3 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (1.71.0)\n", "Requirement already satisfied: tensorboard~=2.19.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (2.19.0)\n", "Requirement already satisfied: keras>=3.5.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (3.9.2)\n", "Requirement already satisfied: h5py>=3.11.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (3.13.0)\n", "Requirement already satisfied: ml-dtypes<1.0.0,>=0.5.1 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (0.5.1)\n", "Requirement already satisfied: wheel<1.0,>=0.23.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from astunparse>=1.6.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (0.45.1)\n", "Requirement already satisfied: rich in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from keras>=3.5.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (14.0.0)\n", "Requirement already satisfied: namex in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from keras>=3.5.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (0.0.9)\n", "Requirement already satisfied: optree in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from keras>=3.5.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (0.15.0)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (3.4.1)\n", "Requirement already satisfied: idna<4,>=2.5 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (3.10)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (2.3.0)\n", "Requirement already satisfied: certifi>=2017.4.17 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (2025.1.31)\n", "Requirement already satisfied: markdown>=2.6.8 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorboard~=2.19.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (3.8)\n", "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorboard~=2.19.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (0.7.2)\n", "Requirement already satisfied: werkzeug>=1.0.1 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from tensorboard~=2.19.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (3.1.3)\n", "Requirement already satisfied: MarkupSafe>=2.1.1 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from werkzeug>=1.0.1->tensorboard~=2.19.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (3.0.2)\n", "Requirement already satisfied: markdown-it-py>=2.2.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from rich->keras>=3.5.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (3.0.0)\n", "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from rich->keras>=3.5.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (2.19.1)\n", "Requirement already satisfied: mdurl~=0.1 in d:\\be project\\foodanalyzer-api\\venv\\lib\\site-packages (from markdown-it-py>=2.2.0->rich->keras>=3.5.0->tensorflow<2.20,>=2.19->tf-keras>=2.14.1->tensorflow_hub) (0.1.2)\n", "Downloading tensorflow_hub-0.16.1-py2.py3-none-any.whl (30 kB)\n", "Downloading tf_keras-2.19.0-py3-none-any.whl (1.7 MB)\n", " ---------------------------------------- 0.0/1.7 MB ? eta -:--:--\n", " ------------------------ --------------- 1.0/1.7 MB 6.3 MB/s eta 0:00:01\n", " ---------------------------------------- 1.7/1.7 MB 5.9 MB/s eta 0:00:00\n", "Installing collected packages: tf-keras, tensorflow_hub\n", "Successfully installed tensorflow_hub-0.16.1 tf-keras-2.19.0\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "[notice] A new release of pip is available: 25.0.1 -> 25.1.1\n", "[notice] To update, run: python.exe -m pip install --upgrade pip\n" ] } ], "source": [ "!pip install tensorflow_hub" ] }, { "cell_type": "code", "execution_count": null, "id": "7c0b03c7", "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow_hub as hub\n", "import numpy as np\n", "from PIL import Image, ImageDraw, ImageFont, ImageOps\n", "import requests\n", "from io import BytesIO" ] }, { "cell_type": "code", "execution_count": null, "id": "c3a51cfb", "metadata": {}, "outputs": [], "source": [ "# Load the model from TF Hub\n", "detector = hub.load(\"https://tfhub.dev/google/openimages_v4/ssd/mobilenet_v2/1\").signatures['default']\n", "\n", "# Classes you care about\n", "TARGET_CLASSES = set([\"Food processor\", \"Fast food\", \"Food\", \"Seafood\", \"Snack\"])\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def load_image_from_url(url, size=(640, 480)):\n", " response = requests.get(url)\n", " img = Image.open(BytesIO(response.content)).convert(\"RGB\")\n", " img = ImageOps.fit(img, size, Image.Resampling.LANCZOS)\n", " return img\n" ] }, { "cell_type": "code", "execution_count": 31, "id": "252c3890", "metadata": {}, "outputs": [], "source": [ "\n", "def run_object_detection(image: Image.Image):\n", " image_np = np.array(image)\n", " # Convert to tensor without specifying dtype\n", " input_tensor = tf.convert_to_tensor(image_np)[tf.newaxis, ...]\n", " # Convert to float32 and normalize to [0,1]\n", " input_tensor = tf.cast(input_tensor, tf.float32) / 255.0\n", " results = detector(input_tensor)\n", " results = {k: v.numpy() for k, v in results.items()}\n", " return results, image_np\n", "\n", "def get_filtered_class_boxes(results):\n", " # for same class, keep the one with the highest score\n", " # and remove duplicates\n", " boxes = []\n", " classes = []\n", " scores = []\n", " \n", " for i in range(len(results[\"detection_scores\"])):\n", " class_name = results[\"detection_class_entities\"][i].decode(\"utf-8\")\n", " box = results[\"detection_boxes\"][i]\n", " score = results[\"detection_scores\"][i]\n", " if class_name in TARGET_CLASSES:\n", " if class_name not in classes:\n", " boxes.append(box)\n", " classes.append(class_name)\n", " scores.append(score)\n", " else:\n", " index = classes.index(class_name)\n", " if score > scores[index]:\n", " boxes[index] = box\n", " classes[index] = class_name\n", " scores[index] = score\n", " return boxes, classes, scores\n" ] }, { "cell_type": "code", "execution_count": 35, "id": "78a3a69e", "metadata": {}, "outputs": [], "source": [ "\n", "def crop_and_save(image_np, boxes, class_names, scores, min_score=0.3):\n", " cropped_images = []\n", " for i in range(len(scores)):\n", " if scores[i] > min_score:\n", " ymin, xmin, ymax, xmax = boxes[i]\n", " im_width, im_height = image_np.shape[1], image_np.shape[0]\n", " (left, right, top, bottom) = (xmin * im_width, xmax * im_width,\n", " ymin * im_height, ymax * im_height)\n", " cropped_image = image_np[int(top):int(bottom), int(left):int(right)]\n", " cropped_images.append((cropped_image, class_names[i], scores[i]))\n", " # Save the cropped image\n", " pil_image = Image.fromarray(cropped_image)\n", " pil_image.save(f\"output/{class_names[i]}_{scores[i]:.2f}.jpg\")\n", " return cropped_images\n", "\n", "def draw_boxes(image_np, boxes, class_names, scores, min_score=0.3):\n", " image_pil = Image.fromarray(image_np)\n", " draw = ImageDraw.Draw(image_pil)\n", " font = ImageFont.load_default()\n", "\n", " for i in range(len(scores)):\n", " label = class_names[i]\n", " print(label, scores[i])\n", " if label in TARGET_CLASSES and scores[i] > min_score:\n", " ymin, xmin, ymax, xmax = boxes[i]\n", " im_width, im_height = image_pil.size\n", " (left, right, top, bottom) = (xmin * im_width, xmax * im_width,\n", " ymin * im_height, ymax * im_height)\n", " draw.rectangle([left, top, right, bottom], outline=\"red\", width=2)\n", " draw.text((left, top), f\"{label}: {scores[i]*100:.1f}%\", fill=\"white\", font=font)\n", " return image_pil" ] }, { "cell_type": "code", "execution_count": 21, "id": "ca9b4269", "metadata": {}, "outputs": [], "source": [ "def detect_and_display(image):\n", " results, image_np = run_object_detection(image)\n", " \n", " final_image = draw_boxes(image_np,\n", " results[\"detection_boxes\"],\n", " results[\"detection_class_entities\"],\n", " results[\"detection_scores\"])\n", " final_image.show()" ] }, { "cell_type": "code", "execution_count": 24, "id": "9c01a9b8", "metadata": {}, "outputs": [], "source": [ "def detect_and_save(image):\n", " results, image_np = run_object_detection(image)\n", " boxes, class_names, scores = get_filtered_class_boxes(results)\n", " cropped_images = crop_and_save(image_np, boxes, class_names, scores,0)\n", " return cropped_images" ] }, { "cell_type": "code", "execution_count": null, "id": "cf36b5e9", "metadata": {}, "outputs": [], "source": [ "detect_and_display(\n", " image = Image.open(\"bv.jpg\").convert(\"RGB\"))" ] }, { "cell_type": "code", "execution_count": 36, "id": "e519e2f9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(array([[[122, 113, 108],\n", " [123, 114, 109],\n", " [123, 114, 109],\n", " ...,\n", " [150, 141, 136],\n", " [150, 141, 136],\n", " [151, 142, 137]],\n", " \n", " [[122, 113, 108],\n", " [123, 114, 109],\n", " [123, 114, 109],\n", " ...,\n", " [150, 141, 136],\n", " [150, 141, 136],\n", " [151, 142, 137]],\n", " \n", " [[122, 113, 108],\n", " [123, 114, 109],\n", " [123, 114, 109],\n", " ...,\n", " [150, 141, 136],\n", " [150, 141, 136],\n", " [151, 142, 137]],\n", " \n", " ...,\n", " \n", " [[ 68, 31, 25],\n", " [ 69, 31, 28],\n", " [ 66, 31, 27],\n", " ...,\n", " [128, 119, 114],\n", " [128, 119, 114],\n", " [126, 117, 112]],\n", " \n", " [[ 64, 29, 23],\n", " [ 64, 29, 25],\n", " [ 62, 28, 26],\n", " ...,\n", " [127, 120, 114],\n", " [126, 119, 113],\n", " [126, 119, 113]],\n", " \n", " [[ 62, 29, 24],\n", " [ 58, 27, 24],\n", " [ 58, 27, 24],\n", " ...,\n", " [125, 118, 112],\n", " [125, 118, 112],\n", " [122, 115, 109]]], dtype=uint8),\n", " 'Snack',\n", " np.float32(0.2383132))]" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "detect_and_save(\n", " image = Image.open(\"bv.jpg\").convert(\"RGB\"))" ] }, { "cell_type": "code", "execution_count": null, "id": "a84975ba", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "venv", "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.12.8" } }, "nbformat": 4, "nbformat_minor": 5 }