damccorm commented on code in PR #27034:
URL: https://github.com/apache/beam/pull/27034#discussion_r1243868650


##########
examples/notebooks/beam-ml/image_processing_beam.ipynb:
##########
@@ -0,0 +1,933 @@
+{
+  "cells": [
+    {
+      "cell_type": "code",
+      "source": [
+        "# @title ###### Licensed to the Apache Software Foundation (ASF), 
Version 2.0 (the \"License\")\n",
+        "\n",
+        "# Licensed to the Apache Software Foundation (ASF) under one\n",
+        "# or more contributor license agreements. See the NOTICE file\n",
+        "# distributed with this work for additional information\n",
+        "# regarding copyright ownership. The ASF licenses this file\n",
+        "# to you under the Apache License, Version 2.0 (the\n",
+        "# \"License\"); you may not use this file except in compliance\n",
+        "# with the License. You may obtain a copy of the License at\n",
+        "#\n",
+        "#   http://www.apache.org/licenses/LICENSE-2.0\n";,
+        "#\n",
+        "# Unless required by applicable law or agreed to in writing,\n",
+        "# software distributed under the License is distributed on an\n",
+        "# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n",
+        "# KIND, either express or implied. See the License for the\n",
+        "# specific language governing permissions and limitations\n",
+        "# under the License"
+      ],
+      "metadata": {
+        "id": "NsNImDL8TGM1"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "# Image Processing using Apache Beam\n",

Review Comment:
   Could you please add colab/github links like our other notebooks, for 
example:
   
   
https://github.com/apache/beam/blob/c2de3391bce1165e0e835b1475cfb254382cdad0/examples/notebooks/beam-ml/automatic_model_refresh.ipynb#L52
   
   <img width="526" alt="image" 
src="https://github.com/apache/beam/assets/42773683/ec9a9ad5-b40f-49f1-927a-df0b27059228";>
   
   Note that the links should go to apache/beam master's version of these on 
colab/github even though those links won't exist until the PR is merged



##########
examples/notebooks/beam-ml/image_processing_beam.ipynb:
##########
@@ -0,0 +1,933 @@
+{
+  "cells": [
+    {
+      "cell_type": "code",
+      "source": [
+        "# @title ###### Licensed to the Apache Software Foundation (ASF), 
Version 2.0 (the \"License\")\n",
+        "\n",
+        "# Licensed to the Apache Software Foundation (ASF) under one\n",
+        "# or more contributor license agreements. See the NOTICE file\n",
+        "# distributed with this work for additional information\n",
+        "# regarding copyright ownership. The ASF licenses this file\n",
+        "# to you under the Apache License, Version 2.0 (the\n",
+        "# \"License\"); you may not use this file except in compliance\n",
+        "# with the License. You may obtain a copy of the License at\n",
+        "#\n",
+        "#   http://www.apache.org/licenses/LICENSE-2.0\n";,
+        "#\n",
+        "# Unless required by applicable law or agreed to in writing,\n",
+        "# software distributed under the License is distributed on an\n",
+        "# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n",
+        "# KIND, either express or implied. See the License for the\n",
+        "# specific language governing permissions and limitations\n",
+        "# under the License"
+      ],
+      "metadata": {
+        "id": "NsNImDL8TGM1"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "# Image Processing using Apache Beam\n",
+        "Image Processing is a machine learning technique to read, analyze and 
extract meaningful information from images. It involves multiple steps such as 
applying various preprocessing fuctions, getting predictions from a model, 
storing the predictions in a useful format, etc. Apache Beam is a suitable tool 
to handle these tasks and build a structured workflow. This notebook 
demonstrates the use of Apache Beam in image processing and performs the 
following:\n",
+        "* Import and preprocess the CIFAR-10 dataset\n",
+        "* Train a TensorFlow model to classify images\n",
+        "* Store the model in Google Cloud and create a model handler\n",
+        "* Build a Beam pipeline to:\n",
+        " 1. Create a 
[PCollection]('https://beam.apache.org/documentation/programming-guide/#pcollections')
 of input images\n",
+        " 2. Perform preprocessing 
[transforms]('https://beam.apache.org/documentation/programming-guide/#transforms')\n",
+        " 3. RunInference to get predictions from the previously trained 
model\n",
+        " 4. Store the results\n",
+        "\n",
+        "For more information on using Apache Beam for machine learning, have 
a look at [AI/ML Pipelines using 
Beam]('https://beam.apache.org/documentation/ml/overview/')."
+      ],
+      "metadata": {
+        "id": "SwN0Rj4cJSg5"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "OSZrRmHl9NQY"
+      },
+      "source": [
+        "## Installing Apache Beam"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 1,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/";
+        },
+        "id": "MO7iNmvkBdA5",
+        "outputId": "6c76e29d-3c70-4c3e-aca2-7cc1dcd167a1"
+      },
+      "outputs": [
+        {
+          "output_type": "stream",
+          "name": "stdout",
+          "text": [
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m14.3/14.3 
MB\u001b[0m \u001b[31m28.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m89.7/89.7 
kB\u001b[0m \u001b[31m8.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[?25h  Preparing metadata (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m137.0/137.0 
kB\u001b[0m \u001b[31m15.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m152.0/152.0 
kB\u001b[0m \u001b[31m14.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[?25h  Preparing metadata (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 
MB\u001b[0m \u001b[31m44.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m648.9/648.9 
kB\u001b[0m \u001b[31m46.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.7/2.7 
MB\u001b[0m \u001b[31m84.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[?25h  Preparing metadata (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m283.7/283.7 
kB\u001b[0m \u001b[31m27.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[?25h  Building wheel for crcmod (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "  Building wheel for dill (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "  Building wheel for docopt (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m 
\u001b[32m307.5/307.5 kB\u001b[0m \u001b[31m7.7 MB/s\u001b[0m eta 
\u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m152.8/152.8 
kB\u001b[0m \u001b[31m16.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m138.3/138.3 
kB\u001b[0m \u001b[31m13.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[?25h  Preparing metadata (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m798.7/798.7 
kB\u001b[0m \u001b[31m24.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 
MB\u001b[0m \u001b[31m46.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/2.1 
MB\u001b[0m \u001b[31m60.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[?25h  Building wheel for timeloop (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "\u001b[31mERROR: pip's dependency resolver does not currently 
take into account all the packages that are installed. This behaviour is the 
source of the following dependency conflicts.\n",
+            "google-colab 1.0.0 requires ipykernel==5.5.6, but you have 
ipykernel 6.23.2 which is incompatible.\n",
+            "google-colab 1.0.0 requires ipython==7.34.0, but you have ipython 
8.14.0 which is incompatible.\u001b[0m\u001b[31m\n",
+            "\u001b[0m"
+          ]
+        }
+      ],
+      "source": [
+        "!pip install apache_beam --quiet\n",
+        "!pip install apache-beam[interactive] --quiet"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "45mf7oHu9XbI"
+      },
+      "source": [
+        "## Importing necessary libraries\n",
+        "Here is a brief overview of the uses of each library imported:\n",
+        "* **NumPy**: Multidimensional numpy arrays are used to store images, 
and the library also allows performing various operations on them.\n",
+        "* **Matplotlib**: Displays images stored in numpy array format.\n",
+        "* **TensorFlow**: Trains a machine learning model.\n",
+        "* **TFModelHandlerNumpy**: Defines the configuration used to load/use 
the model that we train. We use `TFModelHandlerNumpy` because the model was 
trained with TensorFlow and takes numpy arrays as input.\n",
+        "* **RunInference**:  Loads the model and obtains predictions as part 
of the Apache Beam pipeline. For more information, see [docs on prediction and 
inference](https://beam.apache.org/documentation/ml/inference-overview/).\n",
+        "* **Apache Beam**: Builds a pipeline for Image Processing."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "z5_PUeZgOygU"
+      },
+      "outputs": [],
+      "source": [
+        "import numpy as np\n",
+        "import matplotlib.pyplot as plt\n",
+        "import tensorflow as tf\n",
+        "from apache_beam.ml.inference.tensorflow_inference import 
TFModelHandlerNumpy\n",
+        "from apache_beam.ml.inference.base import RunInference\n",
+        "import apache_beam as beam"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "x3tSAqP7R2rZ"
+      },
+      "source": [
+        "## CIFAR-10 Dataset\n",
+        "CIFAR-10 is a popular dataset used for multiclass object 
classification.\n",
+        "It has 60,000 images of the following 10 categories:\n",
+        "\n",
+        "* airplane\n",
+        "* automobile\n",
+        "* bird\n",
+        "* cat\n",
+        "* deer\n",
+        "* dog\n",
+        "* frog\n",
+        "* horse\n",
+        "* ship\n",
+        "* truck\n",
+        "\n",
+        "The dataset can be directly imported from the TensorFlow library."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/";
+        },
+        "id": "MqylmjBhPCOW",
+        "outputId": "9d9f5854-80f2-4a4f-a52b-2b81d6295639"
+      },
+      "outputs": [
+        {
+          "output_type": "stream",
+          "name": "stdout",
+          "text": [
+            "Downloading data from 
https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz\n";,
+            "170498071/170498071 [==============================] - 4s 
0us/step\n"
+          ]
+        }
+      ],
+      "source": [
+        "(x_train, y_train), (x_test, y_test) = 
tf.keras.datasets.cifar10.load_data()"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "x_test.shape"
+      ],
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/";
+        },
+        "id": "pfzkgryZUV8P",
+        "outputId": "79bc798f-f93b-4d7b-8783-c5defa6a2322"
+      },
+      "execution_count": null,
+      "outputs": [
+        {
+          "output_type": "execute_result",
+          "data": {
+            "text/plain": [
+              "(10000, 32, 32, 3)"
+            ]
+          },
+          "metadata": {},
+          "execution_count": 4
+        }
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "The labels in y_train and y_test are numeric, with each number 
representing a class. The labels list defined below contains the various 
classes, and their positions in the list represent the corresponding number 
used to refer to them."
+      ],
+      "metadata": {
+        "id": "6hEHIHPsVxw4"
+      }
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "3uImFIBXv0My"
+      },
+      "outputs": [],
+      "source": [
+        "labels = ['Airplane', 'Automobile', 'Bird', 'Cat', 'Deer', 'Dog', 
'Frog', 'Horse','Ship', 'Truck']"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/";,
+          "height": 447
+        },
+        "id": "zeE81PNOcGfZ",
+        "outputId": "d2a08cb5-4fdc-47af-c2b2-5602e7600f09"
+      },
+      "outputs": [
+        {
+          "output_type": "execute_result",
+          "data": {
+            "text/plain": [
+              "<matplotlib.image.AxesImage at 0x7f441be49840>"
+            ]
+          },
+          "metadata": {},
+          "execution_count": 6
+        },
+        {
+          "output_type": "display_data",
+          "data": {
+            "text/plain": [
+              "<Figure size 640x480 with 1 Axes>"
+            ],
+            "image/png": 
"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\n"
+          },
+          "metadata": {}
+        }
+      ],
+      "source": [
+        "plt.imshow(x_train[800])"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/";
+        },
+        "id": "4arvJDYwfsAj",
+        "outputId": "a355a4e2-c1a7-461e-bff9-059daaa6a9f7"
+      },
+      "outputs": [
+        {
+          "output_type": "execute_result",
+          "data": {
+            "text/plain": [
+              "(32, 32, 3)"
+            ]
+          },
+          "metadata": {},
+          "execution_count": 7
+        }
+      ],
+      "source": [
+        "x_train[0].shape"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "ndeZ_RH32Upu"
+      },
+      "source": [
+        "(32, 32, 3) represents an image of size 32x32 in the RGB scale"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Preprocessing"
+      ],
+      "metadata": {
+        "id": "L2pg1uxSXPHn"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "**Standardization** is the process of transforming the pixel values 
of an image to have zero mean and unit variance. This brings the pixel values 
to a similar scale and makes them easier to work with."
+      ],
+      "metadata": {
+        "id": "Hwwm-EHhW0rC"
+      }
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "ZlInmab9MD-N"
+      },
+      "outputs": [],
+      "source": [
+        "x_train = x_train/255.0"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "**Normalization** is the process of scaling the pixel values to a 
specified range, typically between 0 and 1. This improves the consistency of 
images."
+      ],
+      "metadata": {
+        "id": "6GFdU-HZWztg"
+      }
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/";,
+          "height": 447
+        },
+        "id": "TLmsgV9_Wij5",
+        "outputId": "03fb00c5-efb9-421c-ef55-bbd36679dfbe"
+      },
+      "outputs": [
+        {
+          "output_type": "execute_result",
+          "data": {
+            "text/plain": [
+              "<matplotlib.image.AxesImage at 0x7f4412adeb30>"
+            ]
+          },
+          "metadata": {},
+          "execution_count": 9
+        },
+        {
+          "output_type": "display_data",
+          "data": {
+            "text/plain": [
+              "<Figure size 640x480 with 1 Axes>"
+            ],
+            "image/png": 
"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\n"
+          },
+          "metadata": {}
+        }
+      ],
+      "source": [
+        "x_train = (x_train - np.min(x_train)) / (np.max(x_train) - 
np.min(x_train))\n",
+        "plt.imshow(x_train[800])"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "**Grayscale Conversion** refers to the conversion of a colored image 
in RGB scale into a grayscale image. It represents the pixel intensities 
without considering colors, which makes calculations easier."
+      ],
+      "metadata": {
+        "id": "bfgy0Z_gX_lH"
+      }
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "P2oPvZkbfEPo"
+      },
+      "outputs": [],
+      "source": [
+        "grayscale = []\n",
+        "for i in x_train:\n",
+        "  grayImage = 0.07 * i[:,:,2] + 0.72 * i[:,:,1] + 0.21 * i[:,:,0]\n",
+        "  grayscale.append(grayImage)\n",
+        "x_train_gray = np.asarray(grayscale)"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "jzQ2Zulg99NU"
+      },
+      "source": [
+        "## Defining DoFns for Image Preprocessing\n",
+        "\n",
+        
"[DoFn](https://beam.apache.org/releases/typedoc/current/interfaces/transforms_pardo.DoFn)
 stands for \"Do Function\". In Apache Beam, it is a set of operations that can 
be applied to individual elements of a PCollection (a collection of data). It 
is similar to a function in Python, except that it is used in Beam Pipelines to 
apply various transformations. DoFns can be used in various Apache Beam 
transforms, such as ParDo, Map, Filter, and FlatMap."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "cqm-m0cONsZS"
+      },
+      "outputs": [],
+      "source": [
+        "class StandardizeImage(beam.DoFn):\n",
+        "  def process(self, element: np.ndarray):\n",
+        "    element = element/255.0\n",
+        "    return [element]"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "mZhFCgPxPEwm"
+      },
+      "outputs": [],
+      "source": [
+        "class NormalizeImage(beam.DoFn):\n",
+        "  def process(self, element: np.ndarray):\n",
+        "    element = 
(element-element.min())/(element.max()-element.min())\n",
+        "    return [element]"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "gv23KPt5NyXT"
+      },
+      "outputs": [],
+      "source": [
+        "class GrayscaleImage(beam.DoFn):\n",
+        "  def process(self, element: np.ndarray):\n",
+        "    element = 0.07 * element[:,:,2] + 0.72 * element[:,:,1] + 0.21 * 
element[:,:,0]\n",
+        "    return [element]"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "8gz7_SvN-P2L"
+      },
+      "source": [
+        "## Training a Convolutional Neural Network\n",
+        "\n",
+        "A Convolutional Neural Network (CNN) is one of the most popular model 
for image processing. Here is a brief description of the convolutional layers 
used in the model.\n",

Review Comment:
   ```suggestion
           "A Convolutional Neural Network (CNN) is one of the most popular 
model types for image processing. Here is a brief description of the 
convolutional layers used in the model.\n",
   ```



##########
examples/notebooks/beam-ml/image_processing_beam.ipynb:
##########
@@ -0,0 +1,933 @@
+{
+  "cells": [
+    {
+      "cell_type": "code",
+      "source": [
+        "# @title ###### Licensed to the Apache Software Foundation (ASF), 
Version 2.0 (the \"License\")\n",
+        "\n",
+        "# Licensed to the Apache Software Foundation (ASF) under one\n",
+        "# or more contributor license agreements. See the NOTICE file\n",
+        "# distributed with this work for additional information\n",
+        "# regarding copyright ownership. The ASF licenses this file\n",
+        "# to you under the Apache License, Version 2.0 (the\n",
+        "# \"License\"); you may not use this file except in compliance\n",
+        "# with the License. You may obtain a copy of the License at\n",
+        "#\n",
+        "#   http://www.apache.org/licenses/LICENSE-2.0\n";,
+        "#\n",
+        "# Unless required by applicable law or agreed to in writing,\n",
+        "# software distributed under the License is distributed on an\n",
+        "# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n",
+        "# KIND, either express or implied. See the License for the\n",
+        "# specific language governing permissions and limitations\n",
+        "# under the License"
+      ],
+      "metadata": {
+        "id": "NsNImDL8TGM1"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "# Image Processing using Apache Beam\n",
+        "Image Processing is a machine learning technique to read, analyze and 
extract meaningful information from images. It involves multiple steps such as 
applying various preprocessing fuctions, getting predictions from a model, 
storing the predictions in a useful format, etc. Apache Beam is a suitable tool 
to handle these tasks and build a structured workflow. This notebook 
demonstrates the use of Apache Beam in image processing and performs the 
following:\n",
+        "* Import and preprocess the CIFAR-10 dataset\n",
+        "* Train a TensorFlow model to classify images\n",
+        "* Store the model in Google Cloud and create a model handler\n",
+        "* Build a Beam pipeline to:\n",
+        " 1. Create a 
[PCollection]('https://beam.apache.org/documentation/programming-guide/#pcollections')
 of input images\n",
+        " 2. Perform preprocessing 
[transforms]('https://beam.apache.org/documentation/programming-guide/#transforms')\n",
+        " 3. RunInference to get predictions from the previously trained 
model\n",
+        " 4. Store the results\n",
+        "\n",
+        "For more information on using Apache Beam for machine learning, have 
a look at [AI/ML Pipelines using 
Beam]('https://beam.apache.org/documentation/ml/overview/')."
+      ],
+      "metadata": {
+        "id": "SwN0Rj4cJSg5"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "OSZrRmHl9NQY"
+      },
+      "source": [
+        "## Installing Apache Beam"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 1,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/";
+        },
+        "id": "MO7iNmvkBdA5",
+        "outputId": "6c76e29d-3c70-4c3e-aca2-7cc1dcd167a1"
+      },
+      "outputs": [
+        {
+          "output_type": "stream",
+          "name": "stdout",
+          "text": [
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m14.3/14.3 
MB\u001b[0m \u001b[31m28.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m89.7/89.7 
kB\u001b[0m \u001b[31m8.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[?25h  Preparing metadata (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m137.0/137.0 
kB\u001b[0m \u001b[31m15.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m152.0/152.0 
kB\u001b[0m \u001b[31m14.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[?25h  Preparing metadata (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 
MB\u001b[0m \u001b[31m44.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m648.9/648.9 
kB\u001b[0m \u001b[31m46.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.7/2.7 
MB\u001b[0m \u001b[31m84.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[?25h  Preparing metadata (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m283.7/283.7 
kB\u001b[0m \u001b[31m27.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[?25h  Building wheel for crcmod (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "  Building wheel for dill (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "  Building wheel for docopt (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m 
\u001b[32m307.5/307.5 kB\u001b[0m \u001b[31m7.7 MB/s\u001b[0m eta 
\u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m152.8/152.8 
kB\u001b[0m \u001b[31m16.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m138.3/138.3 
kB\u001b[0m \u001b[31m13.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[?25h  Preparing metadata (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m798.7/798.7 
kB\u001b[0m \u001b[31m24.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 
MB\u001b[0m \u001b[31m46.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[2K     
\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/2.1 
MB\u001b[0m \u001b[31m60.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+            "\u001b[?25h  Building wheel for timeloop (setup.py) ... 
\u001b[?25l\u001b[?25hdone\n",
+            "\u001b[31mERROR: pip's dependency resolver does not currently 
take into account all the packages that are installed. This behaviour is the 
source of the following dependency conflicts.\n",
+            "google-colab 1.0.0 requires ipykernel==5.5.6, but you have 
ipykernel 6.23.2 which is incompatible.\n",
+            "google-colab 1.0.0 requires ipython==7.34.0, but you have ipython 
8.14.0 which is incompatible.\u001b[0m\u001b[31m\n",
+            "\u001b[0m"
+          ]
+        }
+      ],
+      "source": [
+        "!pip install apache_beam --quiet\n",
+        "!pip install apache-beam[interactive] --quiet"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "45mf7oHu9XbI"
+      },
+      "source": [
+        "## Importing necessary libraries\n",
+        "Here is a brief overview of the uses of each library imported:\n",
+        "* **NumPy**: Multidimensional numpy arrays are used to store images, 
and the library also allows performing various operations on them.\n",
+        "* **Matplotlib**: Displays images stored in numpy array format.\n",
+        "* **TensorFlow**: Trains a machine learning model.\n",
+        "* **TFModelHandlerNumpy**: Defines the configuration used to load/use 
the model that we train. We use `TFModelHandlerNumpy` because the model was 
trained with TensorFlow and takes numpy arrays as input.\n",
+        "* **RunInference**:  Loads the model and obtains predictions as part 
of the Apache Beam pipeline. For more information, see [docs on prediction and 
inference](https://beam.apache.org/documentation/ml/inference-overview/).\n",
+        "* **Apache Beam**: Builds a pipeline for Image Processing."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "z5_PUeZgOygU"
+      },
+      "outputs": [],
+      "source": [
+        "import numpy as np\n",
+        "import matplotlib.pyplot as plt\n",
+        "import tensorflow as tf\n",
+        "from apache_beam.ml.inference.tensorflow_inference import 
TFModelHandlerNumpy\n",
+        "from apache_beam.ml.inference.base import RunInference\n",
+        "import apache_beam as beam"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "x3tSAqP7R2rZ"
+      },
+      "source": [
+        "## CIFAR-10 Dataset\n",
+        "CIFAR-10 is a popular dataset used for multiclass object 
classification.\n",
+        "It has 60,000 images of the following 10 categories:\n",
+        "\n",
+        "* airplane\n",
+        "* automobile\n",
+        "* bird\n",
+        "* cat\n",
+        "* deer\n",
+        "* dog\n",
+        "* frog\n",
+        "* horse\n",
+        "* ship\n",
+        "* truck\n",
+        "\n",
+        "The dataset can be directly imported from the TensorFlow library."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/";
+        },
+        "id": "MqylmjBhPCOW",
+        "outputId": "9d9f5854-80f2-4a4f-a52b-2b81d6295639"
+      },
+      "outputs": [
+        {
+          "output_type": "stream",
+          "name": "stdout",
+          "text": [
+            "Downloading data from 
https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz\n";,
+            "170498071/170498071 [==============================] - 4s 
0us/step\n"
+          ]
+        }
+      ],
+      "source": [
+        "(x_train, y_train), (x_test, y_test) = 
tf.keras.datasets.cifar10.load_data()"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "x_test.shape"
+      ],
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/";
+        },
+        "id": "pfzkgryZUV8P",
+        "outputId": "79bc798f-f93b-4d7b-8783-c5defa6a2322"
+      },
+      "execution_count": null,
+      "outputs": [
+        {
+          "output_type": "execute_result",
+          "data": {
+            "text/plain": [
+              "(10000, 32, 32, 3)"
+            ]
+          },
+          "metadata": {},
+          "execution_count": 4
+        }
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "The labels in y_train and y_test are numeric, with each number 
representing a class. The labels list defined below contains the various 
classes, and their positions in the list represent the corresponding number 
used to refer to them."
+      ],
+      "metadata": {
+        "id": "6hEHIHPsVxw4"
+      }
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "3uImFIBXv0My"
+      },
+      "outputs": [],
+      "source": [
+        "labels = ['Airplane', 'Automobile', 'Bird', 'Cat', 'Deer', 'Dog', 
'Frog', 'Horse','Ship', 'Truck']"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/";,
+          "height": 447
+        },
+        "id": "zeE81PNOcGfZ",
+        "outputId": "d2a08cb5-4fdc-47af-c2b2-5602e7600f09"
+      },
+      "outputs": [
+        {
+          "output_type": "execute_result",
+          "data": {
+            "text/plain": [
+              "<matplotlib.image.AxesImage at 0x7f441be49840>"
+            ]
+          },
+          "metadata": {},
+          "execution_count": 6
+        },
+        {
+          "output_type": "display_data",
+          "data": {
+            "text/plain": [
+              "<Figure size 640x480 with 1 Axes>"
+            ],
+            "image/png": 
"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\n"
+          },
+          "metadata": {}
+        }
+      ],
+      "source": [
+        "plt.imshow(x_train[800])"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/";
+        },
+        "id": "4arvJDYwfsAj",
+        "outputId": "a355a4e2-c1a7-461e-bff9-059daaa6a9f7"
+      },
+      "outputs": [
+        {
+          "output_type": "execute_result",
+          "data": {
+            "text/plain": [
+              "(32, 32, 3)"
+            ]
+          },
+          "metadata": {},
+          "execution_count": 7
+        }
+      ],
+      "source": [
+        "x_train[0].shape"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "ndeZ_RH32Upu"
+      },
+      "source": [
+        "(32, 32, 3) represents an image of size 32x32 in the RGB scale"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Preprocessing"
+      ],
+      "metadata": {
+        "id": "L2pg1uxSXPHn"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "**Standardization** is the process of transforming the pixel values 
of an image to have zero mean and unit variance. This brings the pixel values 
to a similar scale and makes them easier to work with."
+      ],
+      "metadata": {
+        "id": "Hwwm-EHhW0rC"
+      }
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "ZlInmab9MD-N"
+      },
+      "outputs": [],
+      "source": [
+        "x_train = x_train/255.0"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "**Normalization** is the process of scaling the pixel values to a 
specified range, typically between 0 and 1. This improves the consistency of 
images."
+      ],
+      "metadata": {
+        "id": "6GFdU-HZWztg"
+      }
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/";,
+          "height": 447
+        },
+        "id": "TLmsgV9_Wij5",
+        "outputId": "03fb00c5-efb9-421c-ef55-bbd36679dfbe"
+      },
+      "outputs": [
+        {
+          "output_type": "execute_result",
+          "data": {
+            "text/plain": [
+              "<matplotlib.image.AxesImage at 0x7f4412adeb30>"
+            ]
+          },
+          "metadata": {},
+          "execution_count": 9
+        },
+        {
+          "output_type": "display_data",
+          "data": {
+            "text/plain": [
+              "<Figure size 640x480 with 1 Axes>"
+            ],
+            "image/png": 
"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\n"
+          },
+          "metadata": {}
+        }
+      ],
+      "source": [
+        "x_train = (x_train - np.min(x_train)) / (np.max(x_train) - 
np.min(x_train))\n",
+        "plt.imshow(x_train[800])"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "**Grayscale Conversion** refers to the conversion of a colored image 
in RGB scale into a grayscale image. It represents the pixel intensities 
without considering colors, which makes calculations easier."
+      ],
+      "metadata": {
+        "id": "bfgy0Z_gX_lH"
+      }
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "P2oPvZkbfEPo"
+      },
+      "outputs": [],
+      "source": [
+        "grayscale = []\n",
+        "for i in x_train:\n",
+        "  grayImage = 0.07 * i[:,:,2] + 0.72 * i[:,:,1] + 0.21 * i[:,:,0]\n",
+        "  grayscale.append(grayImage)\n",
+        "x_train_gray = np.asarray(grayscale)"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "jzQ2Zulg99NU"
+      },
+      "source": [
+        "## Defining DoFns for Image Preprocessing\n",
+        "\n",
+        
"[DoFn](https://beam.apache.org/releases/typedoc/current/interfaces/transforms_pardo.DoFn)
 stands for \"Do Function\". In Apache Beam, it is a set of operations that can 
be applied to individual elements of a PCollection (a collection of data). It 
is similar to a function in Python, except that it is used in Beam Pipelines to 
apply various transformations. DoFns can be used in various Apache Beam 
transforms, such as ParDo, Map, Filter, and FlatMap."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "cqm-m0cONsZS"
+      },
+      "outputs": [],
+      "source": [
+        "class StandardizeImage(beam.DoFn):\n",
+        "  def process(self, element: np.ndarray):\n",
+        "    element = element/255.0\n",
+        "    return [element]"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "mZhFCgPxPEwm"
+      },
+      "outputs": [],
+      "source": [
+        "class NormalizeImage(beam.DoFn):\n",
+        "  def process(self, element: np.ndarray):\n",
+        "    element = 
(element-element.min())/(element.max()-element.min())\n",
+        "    return [element]"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "gv23KPt5NyXT"
+      },
+      "outputs": [],
+      "source": [
+        "class GrayscaleImage(beam.DoFn):\n",
+        "  def process(self, element: np.ndarray):\n",
+        "    element = 0.07 * element[:,:,2] + 0.72 * element[:,:,1] + 0.21 * 
element[:,:,0]\n",
+        "    return [element]"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "8gz7_SvN-P2L"
+      },
+      "source": [
+        "## Training a Convolutional Neural Network\n",
+        "\n",
+        "A Convolutional Neural Network (CNN) is one of the most popular model 
for image processing. Here is a brief description of the convolutional layers 
used in the model.\n",
+        "* **Reshape**: Changes the shape of the input data to the desired 
size. <br>\n",

Review Comment:
   The bullet, line break format here creates weird formatting on GitHub. Could 
we just get rid of the `<br>` tags?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to