From 59dcc7e01dc86ad662edee8c2970a365d1d10ef1 Mon Sep 17 00:00:00 2001 From: emish8 Date: Tue, 14 Feb 2023 18:50:05 +0000 Subject: [PATCH 1/4] Project Done --- .../starter (1)-checkpoint.ipynb | 3164 +++++++++++++++++ project/file.png | Bin 0 -> 2851 bytes project/lambda function/classify.py | 30 + project/lambda function/filter.py | 30 + project/lambda function/serializeImageData.py | 36 + project/starter (1).ipynb | 3144 ++++++++++++++++ .../project-2-aws-step-function-exe.JPG | Bin 0 -> 118936 bytes .../project.json | 75 + .../stepfunctions_graph.png | Bin 0 -> 18622 bytes project/test.lst | 200 ++ project/train.lst | 1000 ++++++ 11 files changed, 7679 insertions(+) create mode 100644 project/.ipynb_checkpoints/starter (1)-checkpoint.ipynb create mode 100644 project/file.png create mode 100644 project/lambda function/classify.py create mode 100644 project/lambda function/filter.py create mode 100644 project/lambda function/serializeImageData.py create mode 100644 project/starter (1).ipynb create mode 100644 project/step function (json & screenshot)/project-2-aws-step-function-exe.JPG create mode 100644 project/step function (json & screenshot)/project.json create mode 100644 project/step function (json & screenshot)/stepfunctions_graph.png create mode 100644 project/test.lst create mode 100644 project/train.lst diff --git a/project/.ipynb_checkpoints/starter (1)-checkpoint.ipynb b/project/.ipynb_checkpoints/starter (1)-checkpoint.ipynb new file mode 100644 index 000000000..ddc9ea667 --- /dev/null +++ b/project/.ipynb_checkpoints/starter (1)-checkpoint.ipynb @@ -0,0 +1,3164 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Deploy and monitor a machine learning workflow for Image Classification" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting up this notebook\n", + "\n", + "Notes about the instance size and kernel setup: this notebook has been tested on\n", + "\n", + "1. The `Python 3 (Data Science)` kernel\n", + "2. The `ml.t3.medium` Sagemaker notebook instance\n", + "\n", + "## Data Staging\n", + "\n", + "We'll use a sample dataset called CIFAR to simulate the challenges Scones Unlimited are facing in Image Classification. In order to start working with CIFAR we'll need to:\n", + "\n", + "1. Extract the data from a hosting service\n", + "2. Transform it into a usable shape and format\n", + "3. Load it into a production system\n", + "\n", + "In other words, we're going to do some simple ETL!\n", + "\n", + "### 1. Extract the data from the hosting service\n", + "\n", + "In the cell below, define a function `extract_cifar_data` that extracts python version of the CIFAR-100 dataset. The CIFAR dataaset is open source and generously hosted by the University of Toronto at: https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "def extract_cifar_data(url, filename=\"cifar.tar.gz\"):\n", + " \"\"\"A function for extracting the CIFAR-100 dataset and storing it as a gzipped file\n", + " \n", + " Arguments:\n", + " url -- the URL where the dataset is hosted\n", + " filename -- the full path where the dataset will be written\n", + " \n", + " \"\"\"\n", + " \n", + " # Todo: request the data from the data url\n", + " # Hint: use `requests.get` method\n", + " r = requests.get(url)\n", + " with open(filename, \"wb\") as file_context:\n", + " file_context.write(r.content)\n", + " return" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's test it out! Run the following cell and check whether a new file `cifar.tar.gz` is created in the file explorer." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "extract_cifar_data(\"https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz\") " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Transform the data into a usable shape and format\n", + "\n", + "Clearly, distributing the data as a gzipped archive makes sense for the hosting service! It saves on bandwidth, storage, and it's a widely-used archive format. In fact, it's so widely used that the Python community ships a utility for working with them, `tarfile`, as part of its Standard Library. Execute the following cell to decompress your extracted dataset:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import tarfile\n", + "\n", + "with tarfile.open(\"cifar.tar.gz\", \"r:gz\") as tar:\n", + " tar.extractall()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A new folder `cifar-100-python` should be created, containing `meta`, `test`, and `train` files. These files are `pickles` and the [CIFAR homepage](https://www.cs.toronto.edu/~kriz/cifar.html) provides a simple script that can be used to load them. We've adapted the script below for you to run:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pickle\n", + "\n", + "with open(\"./cifar-100-python/meta\", \"rb\") as f:\n", + " dataset_meta = pickle.load(f, encoding='bytes')\n", + "\n", + "with open(\"./cifar-100-python/test\", \"rb\") as f:\n", + " dataset_test = pickle.load(f, encoding='bytes')\n", + "\n", + "with open(\"./cifar-100-python/train\", \"rb\") as f:\n", + " dataset_train = pickle.load(f, encoding='bytes')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys([b'filenames', b'batch_label', b'fine_labels', b'coarse_labels', b'data'])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Feel free to explore the datasets\n", + "\n", + "dataset_train.keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As documented on the homepage, `b'data'` contains rows of 3073 unsigned integers, representing three channels (red, green, and blue) for one 32x32 pixel image per row." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3072" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "32*32*3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For a simple gut-check, let's transform one of our images. Each 1024 items in a row is a channel (red, green, then blue). Each 32 items in the channel are a row in the 32x32 image. Using python, we can stack these channels into a 32x32x3 array, and save it as a PNG file:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Each 1024 in a row is a channel (red, green, then blue)\n", + "row = dataset_train[b'data'][0]\n", + "red, green, blue = row[0:1024], row[1024:2048], row[2048:]\n", + "\n", + "# Each 32 items in the channel are a row in the 32x32 image\n", + "red = red.reshape(32,32)\n", + "green = green.reshape(32,32)\n", + "blue = blue.reshape(32,32)\n", + "\n", + "# Combine the channels into a 32x32x3 image!\n", + "combined = np.dstack((red,green,blue))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For a more concise version, consider the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# All in one:\n", + "test_image = np.dstack((\n", + " row[0:1024].reshape(32,32),\n", + " row[1024:2048].reshape(32,32),\n", + " row[2048:].reshape(32,32)\n", + "))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.imshow(test_image);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Looks like a cow! Let's check the label. `dataset_meta` contains label names in order, and `dataset_train` has a list of labels for each row." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "19" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_train[b'fine_labels'][0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our image has a label of `19`, so let's see what the 19th item is in the list of label names." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b'cattle'\n" + ] + } + ], + "source": [ + "print(dataset_meta[b'fine_label_names'][19])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ok! 'cattle' sounds about right. By the way, using the previous two lines we can do:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b'cattle'\n" + ] + } + ], + "source": [ + "n = 0\n", + "print(dataset_meta[b'fine_label_names'][dataset_train[b'fine_labels'][n]])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we know how to check labels, is there a way that we can also check file names? `dataset_train` also contains a `b'filenames'` key. Let's see what we have here:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b'bos_taurus_s_000507.png'\n" + ] + } + ], + "source": [ + "print(dataset_train[b'filenames'][0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\"Taurus\" is the name of a subspecies of cattle, so this looks like a pretty reasonable filename. To save an image we can also do:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "plt.imsave(\"file.png\", test_image)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your new PNG file should now appear in the file explorer -- go ahead and pop it open to see!\n", + "\n", + "Now that you know how to reshape the images, save them as files, and capture their filenames and labels, let's just capture all the bicycles and motorcycles and save them. Scones Unlimited can use a model that tells these apart to route delivery drivers automatically.\n", + "\n", + "In the following cell, identify the label numbers for Bicycles and Motorcycles:" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "b'motorcycle'" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_meta[b'fine_label_names'][48]" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "b'bicycle'" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_meta[b'fine_label_names'][8]" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys([b'filenames', b'batch_label', b'fine_labels', b'coarse_labels', b'data'])" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_train.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_train[b'fine_labels'] == 8 " + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys([b'fine_label_names', b'coarse_label_names'])" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_meta.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Motorcycle Label 48: b'motorcycle'\n", + "Bicycle Label 8: b'bicycle'\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "# Todo: Filter the dataset_train and dataset_meta objects to find the label numbers for Bicycle and Motorcycles\n", + "motor_label = dataset_meta[b'fine_label_names'][48]\n", + "bicycle_label = dataset_meta[b'fine_label_names'][8]\n", + "print('Motorcycle Label 48:', dataset_meta[b'fine_label_names'][48])\n", + "print('Bicycle Label 8:', dataset_meta[b'fine_label_names'][8])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Good job! We only need objects with label 8 and 48 -- this drastically simplifies our handling of the data! Below we construct a dataframe for you, and you can safely drop the rows that don't contain observations about bicycles and motorcycles. Fill in the missing lines below to drop all other rows:" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#Construct the dataframe\n", + "df_train = pd.DataFrame({\n", + " \"filenames\": dataset_train[b'filenames'],\n", + " \"labels\": dataset_train[b'fine_labels'],\n", + " \"row\": range(len(dataset_train[b'filenames']))\n", + "})\n", + "\n", + "# Drop all rows from df_train where label is not 8 or 48\n", + "mask_train = (df_train['labels'] == 8) | (df_train['labels'] == 48)\n", + "df_train = df_train[mask_train]\n", + "\n", + "# Decode df_train.filenames so they are regular strings\n", + "df_train[\"filenames\"] = df_train[\"filenames\"].apply(\n", + " lambda x: x.decode(\"utf-8\")\n", + ")\n", + "\n", + "\n", + "df_test = pd.DataFrame({\n", + " \"filenames\": dataset_test[b'filenames'],\n", + " \"labels\": dataset_test[b'fine_labels'],\n", + " \"row\": range(len(dataset_test[b'filenames']))\n", + "})\n", + "\n", + "# Drop all rows from df_test where label is not 8 or 48\n", + "mask_test = (df_test['labels'] == 8) | (df_test['labels'] == 48)\n", + "df_test = df_test[mask_test]\n", + "\n", + "# Decode df_test.filenames so they are regular strings\n", + "df_test[\"filenames\"] = df_test[\"filenames\"].apply(\n", + " lambda x: x.decode(\"utf-8\")\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that the data is filtered for just our classes, we can save all our images." + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "!mkdir ./train\n", + "!mkdir ./test" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the previous sections we introduced you to several key snippets of code:\n", + "\n", + "1. Grabbing the image data:\n", + "\n", + "```python\n", + "dataset_train[b'data'][0]\n", + "```\n", + "\n", + "2. A simple idiom for stacking the image data into the right shape\n", + "\n", + "```python\n", + "import numpy as np\n", + "np.dstack((\n", + " row[0:1024].reshape(32,32),\n", + " row[1024:2048].reshape(32,32),\n", + " row[2048:].reshape(32,32)\n", + "))\n", + "```\n", + "\n", + "3. A simple `matplotlib` utility for saving images\n", + "\n", + "```python\n", + "plt.imsave(path+row['filenames'], target)\n", + "```\n", + "\n", + "Compose these together into a function that saves all the images into the `./test` and `./train` directories. Use the comments in the body of the `save_images` function below to guide your construction of the function:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "filenames\n", + "labels\n", + "row\n" + ] + } + ], + "source": [ + "for index, row in df_train.iterrows():\n", + " name = row[b'filenames']\n", + " path = 'train/'\n", + " data = dataset_train[b'data'][row['row']]\n", + " save_images(data, path, names)" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "8" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_train[b'fine_labels'][16]" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "b'bike_s_000682.png'" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_train[b'filenames'][16]" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "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", + "
filenameslabelsrow
16bike_s_000682.png816
30bike_s_000127.png830
130cycle_s_002598.png8130
152minibike_s_000824.png48152
195motorcycle_s_001856.png48195
............
49578velocipede_s_000010.png849578
49588motorcycle_s_001247.png4849588
49882motorcycle_s_000724.png4849882
49962velocipede_s_001637.png849962
49985motorcycle_s_000291.png4849985
\n", + "

1000 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " filenames labels row\n", + "16 bike_s_000682.png 8 16\n", + "30 bike_s_000127.png 8 30\n", + "130 cycle_s_002598.png 8 130\n", + "152 minibike_s_000824.png 48 152\n", + "195 motorcycle_s_001856.png 48 195\n", + "... ... ... ...\n", + "49578 velocipede_s_000010.png 8 49578\n", + "49588 motorcycle_s_001247.png 48 49588\n", + "49882 motorcycle_s_000724.png 48 49882\n", + "49962 velocipede_s_001637.png 8 49962\n", + "49985 motorcycle_s_000291.png 48 49985\n", + "\n", + "[1000 rows x 3 columns]" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_train" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def save_images(data, path, filename):\n", + " #Grab the image data in row-major form\n", + " img = data\n", + " \n", + " # Consolidated stacking/reshaping from earlier\n", + " target = np.dstack((img[0:1024].reshape(32,32),\n", + " img[1024:2048].reshape(32,32),\n", + " img[2048:].reshape(32,32)\n", + " ))\n", + " \n", + " \n", + " # Save the image\n", + " plt.imsave(path+filename, target)\n", + " \n", + " # Return any signal data you want for debugging\n", + " return True\n", + "\n", + "## TODO: save ALL images using the save_images function\n", + "for index, row in df_train.iterrows():\n", + " name = row['filenames']\n", + " path = 'train/'\n", + " data = dataset_train[b'data'][row['row']]\n", + " save_images(data, path, name)\n", + " \n", + "for index, row in df_test.iterrows():\n", + " name = row['filenames']\n", + " path = 'test/'\n", + " data = dataset_train[b'data'][row['row']]\n", + " save_images(data, path, name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. Load the data\n", + "\n", + "Now we can load the data into S3.\n", + "\n", + "Using the sagemaker SDK grab the current region, execution role, and bucket." + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Default Bucket: udacity-ml-workflow\n", + "AWS Region: us-east-1\n", + "RoleArn: arn:aws:iam::683237399578:role/service-role/AmazonSageMaker-ExecutionRole-20230119T145763\n" + ] + } + ], + "source": [ + "import sagemaker\n", + "from sagemaker import get_execution_role\n", + "\n", + "bucket= \"udacity-ml-workflow\"\n", + "print(\"Default Bucket: {}\".format(bucket))\n", + "\n", + "region = \"us-east-1\"\n", + "print(\"AWS Region: {}\".format(region))\n", + "\n", + "role = get_execution_role()\n", + "print(\"RoleArn: {}\".format(role))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With this data we can easily sync your data up into S3!" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "upload: train/bicycle_s_000017.png to s3://udacity-ml-workflow/train/bicycle_s_000017.png\n", + "upload: train/bicycle_s_000124.png to s3://udacity-ml-workflow/train/bicycle_s_000124.png\n", + "upload: train/bicycle_s_000021.png to s3://udacity-ml-workflow/train/bicycle_s_000021.png\n", + "upload: train/bicycle_s_000039.png to s3://udacity-ml-workflow/train/bicycle_s_000039.png\n", + "upload: train/bicycle_s_000043.png to s3://udacity-ml-workflow/train/bicycle_s_000043.png\n", + "upload: train/bicycle_s_000137.png to s3://udacity-ml-workflow/train/bicycle_s_000137.png\n", + "upload: train/bicycle_s_000149.png to s3://udacity-ml-workflow/train/bicycle_s_000149.png\n", + "upload: train/bicycle_s_000038.png to s3://udacity-ml-workflow/train/bicycle_s_000038.png\n", + "upload: train/bicycle_s_000071.png to s3://udacity-ml-workflow/train/bicycle_s_000071.png\n", + "upload: train/bicycle_s_000156.png to s3://udacity-ml-workflow/train/bicycle_s_000156.png\n", + "upload: train/bicycle_s_000147.png to s3://udacity-ml-workflow/train/bicycle_s_000147.png\n", + "upload: train/bicycle_s_000051.png to s3://udacity-ml-workflow/train/bicycle_s_000051.png\n", + "upload: train/bicycle_s_000282.png to s3://udacity-ml-workflow/train/bicycle_s_000282.png\n", + "upload: train/bicycle_s_000180.png to s3://udacity-ml-workflow/train/bicycle_s_000180.png\n", + "upload: train/bicycle_s_000035.png to s3://udacity-ml-workflow/train/bicycle_s_000035.png\n", + "upload: train/bicycle_s_000243.png to s3://udacity-ml-workflow/train/bicycle_s_000243.png\n", + "upload: train/bicycle_s_000235.png to s3://udacity-ml-workflow/train/bicycle_s_000235.png\n", + "upload: train/bicycle_s_000231.png to s3://udacity-ml-workflow/train/bicycle_s_000231.png\n", + "upload: train/bicycle_s_000099.png to s3://udacity-ml-workflow/train/bicycle_s_000099.png\n", + "upload: train/bicycle_s_000437.png to s3://udacity-ml-workflow/train/bicycle_s_000437.png\n", + "upload: train/bicycle_s_000371.png to s3://udacity-ml-workflow/train/bicycle_s_000371.png\n", + "upload: train/bicycle_s_000392.png to s3://udacity-ml-workflow/train/bicycle_s_000392.png\n", + "upload: train/bicycle_s_000314.png to s3://udacity-ml-workflow/train/bicycle_s_000314.png\n", + "upload: train/bicycle_s_000066.png to s3://udacity-ml-workflow/train/bicycle_s_000066.png\n", + "upload: train/bicycle_s_000467.png to s3://udacity-ml-workflow/train/bicycle_s_000467.png\n", + "upload: train/bicycle_s_000159.png to s3://udacity-ml-workflow/train/bicycle_s_000159.png\n", + "upload: train/bicycle_s_000279.png to s3://udacity-ml-workflow/train/bicycle_s_000279.png\n", + "upload: train/bicycle_s_000399.png to s3://udacity-ml-workflow/train/bicycle_s_000399.png\n", + "upload: train/bicycle_s_000491.png to s3://udacity-ml-workflow/train/bicycle_s_000491.png\n", + "upload: train/bicycle_s_000536.png to s3://udacity-ml-workflow/train/bicycle_s_000536.png\n", + "upload: train/bicycle_s_000546.png to s3://udacity-ml-workflow/train/bicycle_s_000546.png\n", + "upload: train/bicycle_s_000369.png to s3://udacity-ml-workflow/train/bicycle_s_000369.png\n", + "upload: train/bicycle_s_000435.png to s3://udacity-ml-workflow/train/bicycle_s_000435.png\n", + "upload: train/bicycle_s_000396.png to s3://udacity-ml-workflow/train/bicycle_s_000396.png\n", + "upload: train/bicycle_s_000537.png to s3://udacity-ml-workflow/train/bicycle_s_000537.png\n", + "upload: train/bicycle_s_000561.png to s3://udacity-ml-workflow/train/bicycle_s_000561.png\n", + "upload: train/bicycle_s_000408.png to s3://udacity-ml-workflow/train/bicycle_s_000408.png\n", + "upload: train/bicycle_s_000667.png to s3://udacity-ml-workflow/train/bicycle_s_000667.png\n", + "upload: train/bicycle_s_000569.png to s3://udacity-ml-workflow/train/bicycle_s_000569.png\n", + "upload: train/bicycle_s_000723.png to s3://udacity-ml-workflow/train/bicycle_s_000723.png\n", + "upload: train/bicycle_s_000759.png to s3://udacity-ml-workflow/train/bicycle_s_000759.png\n", + "upload: train/bicycle_s_000522.png to s3://udacity-ml-workflow/train/bicycle_s_000522.png\n", + "upload: train/bicycle_s_000775.png to s3://udacity-ml-workflow/train/bicycle_s_000775.png\n", + "upload: train/bicycle_s_000753.png to s3://udacity-ml-workflow/train/bicycle_s_000753.png\n", + "upload: train/bicycle_s_000822.png to s3://udacity-ml-workflow/train/bicycle_s_000822.png\n", + "upload: train/bicycle_s_000782.png to s3://udacity-ml-workflow/train/bicycle_s_000782.png\n", + "upload: train/bicycle_s_000785.png to s3://udacity-ml-workflow/train/bicycle_s_000785.png\n", + "upload: train/bicycle_s_000668.png to s3://udacity-ml-workflow/train/bicycle_s_000668.png\n", + "upload: train/bicycle_s_000781.png to s3://udacity-ml-workflow/train/bicycle_s_000781.png\n", + "upload: train/bicycle_s_000463.png to s3://udacity-ml-workflow/train/bicycle_s_000463.png\n", + "upload: train/bicycle_s_000996.png to s3://udacity-ml-workflow/train/bicycle_s_000996.png\n", + "upload: train/bicycle_s_000986.png to s3://udacity-ml-workflow/train/bicycle_s_000986.png\n", + "upload: train/bicycle_s_001111.png to s3://udacity-ml-workflow/train/bicycle_s_001111.png\n", + "upload: train/bicycle_s_000778.png to s3://udacity-ml-workflow/train/bicycle_s_000778.png\n", + "upload: train/bicycle_s_000774.png to s3://udacity-ml-workflow/train/bicycle_s_000774.png\n", + "upload: train/bicycle_s_001168.png to s3://udacity-ml-workflow/train/bicycle_s_001168.png\n", + "upload: train/bicycle_s_000829.png to s3://udacity-ml-workflow/train/bicycle_s_000829.png\n", + "upload: train/bicycle_s_000951.png to s3://udacity-ml-workflow/train/bicycle_s_000951.png\n", + "upload: train/bicycle_s_000861.png to s3://udacity-ml-workflow/train/bicycle_s_000861.png\n", + "upload: train/bicycle_s_001174.png to s3://udacity-ml-workflow/train/bicycle_s_001174.png\n", + "upload: train/bicycle_s_001002.png to s3://udacity-ml-workflow/train/bicycle_s_001002.png\n", + "upload: train/bicycle_s_001205.png to s3://udacity-ml-workflow/train/bicycle_s_001205.png\n", + "upload: train/bicycle_s_001203.png to s3://udacity-ml-workflow/train/bicycle_s_001203.png\n", + "upload: train/bicycle_s_001228.png to s3://udacity-ml-workflow/train/bicycle_s_001228.png\n", + "upload: train/bicycle_s_001245.png to s3://udacity-ml-workflow/train/bicycle_s_001245.png\n", + "upload: train/bicycle_s_001348.png to s3://udacity-ml-workflow/train/bicycle_s_001348.png\n", + "upload: train/bicycle_s_000978.png to s3://udacity-ml-workflow/train/bicycle_s_000978.png\n", + "upload: train/bicycle_s_001411.png to s3://udacity-ml-workflow/train/bicycle_s_001411.png\n", + "upload: train/bicycle_s_001338.png to s3://udacity-ml-workflow/train/bicycle_s_001338.png\n", + "upload: train/bicycle_s_001388.png to s3://udacity-ml-workflow/train/bicycle_s_001388.png\n", + "upload: train/bicycle_s_001448.png to s3://udacity-ml-workflow/train/bicycle_s_001448.png\n", + "upload: train/bicycle_s_001402.png to s3://udacity-ml-workflow/train/bicycle_s_001402.png\n", + "upload: train/bicycle_s_001452.png to s3://udacity-ml-workflow/train/bicycle_s_001452.png\n", + "upload: train/bicycle_s_001247.png to s3://udacity-ml-workflow/train/bicycle_s_001247.png\n", + "upload: train/bicycle_s_001409.png to s3://udacity-ml-workflow/train/bicycle_s_001409.png\n", + "upload: train/bicycle_s_001554.png to s3://udacity-ml-workflow/train/bicycle_s_001554.png\n", + "upload: train/bicycle_s_001569.png to s3://udacity-ml-workflow/train/bicycle_s_001569.png\n", + "upload: train/bicycle_s_001583.png to s3://udacity-ml-workflow/train/bicycle_s_001583.png\n", + "upload: train/bicycle_s_001470.png to s3://udacity-ml-workflow/train/bicycle_s_001470.png\n", + "upload: train/bicycle_s_001663.png to s3://udacity-ml-workflow/train/bicycle_s_001663.png\n", + "upload: train/bicycle_s_001679.png to s3://udacity-ml-workflow/train/bicycle_s_001679.png\n", + "upload: train/bicycle_s_001681.png to s3://udacity-ml-workflow/train/bicycle_s_001681.png\n", + "upload: train/bicycle_s_001688.png to s3://udacity-ml-workflow/train/bicycle_s_001688.png\n", + "upload: train/bicycle_s_001748.png to s3://udacity-ml-workflow/train/bicycle_s_001748.png\n", + "upload: train/bicycle_s_001642.png to s3://udacity-ml-workflow/train/bicycle_s_001642.png\n", + "upload: train/bicycle_s_001687.png to s3://udacity-ml-workflow/train/bicycle_s_001687.png\n", + "upload: train/bicycle_s_001693.png to s3://udacity-ml-workflow/train/bicycle_s_001693.png\n", + "upload: train/bicycle_s_001757.png to s3://udacity-ml-workflow/train/bicycle_s_001757.png\n", + "upload: train/bicycle_s_001814.png to s3://udacity-ml-workflow/train/bicycle_s_001814.png\n", + "upload: train/bicycle_s_001956.png to s3://udacity-ml-workflow/train/bicycle_s_001956.png\n", + "upload: train/bicycle_s_001904.png to s3://udacity-ml-workflow/train/bicycle_s_001904.png\n", + "upload: train/bicycle_s_002012.png to s3://udacity-ml-workflow/train/bicycle_s_002012.png\n", + "upload: train/bicycle_s_002005.png to s3://udacity-ml-workflow/train/bicycle_s_002005.png\n", + "upload: train/bicycle_s_002029.png to s3://udacity-ml-workflow/train/bicycle_s_002029.png\n", + "upload: train/bicycle_s_001673.png to s3://udacity-ml-workflow/train/bicycle_s_001673.png\n", + "upload: train/bicycle_s_001928.png to s3://udacity-ml-workflow/train/bicycle_s_001928.png\n", + "upload: train/bicycle_s_002129.png to s3://udacity-ml-workflow/train/bicycle_s_002129.png \n", + "upload: train/bicycle_s_002132.png to s3://udacity-ml-workflow/train/bicycle_s_002132.png \n", + "upload: train/bicycle_s_002153.png to s3://udacity-ml-workflow/train/bicycle_s_002153.png \n", + "upload: train/bicycle_s_002049.png to s3://udacity-ml-workflow/train/bicycle_s_002049.png \n", + "upload: train/bicycle_s_002222.png to s3://udacity-ml-workflow/train/bicycle_s_002222.png \n", + "upload: train/bicycle_s_002237.png to s3://udacity-ml-workflow/train/bicycle_s_002237.png \n", + "upload: train/bicycle_s_002100.png to s3://udacity-ml-workflow/train/bicycle_s_002100.png \n", + "upload: train/bicycle_s_002218.png to s3://udacity-ml-workflow/train/bicycle_s_002218.png \n", + "upload: train/bicycle_s_002247.png to s3://udacity-ml-workflow/train/bicycle_s_002247.png \n", + "upload: train/bicycle_s_002258.png to s3://udacity-ml-workflow/train/bicycle_s_002258.png \n", + "upload: train/bicycle_s_002374.png to s3://udacity-ml-workflow/train/bicycle_s_002374.png \n", + "upload: train/bicycle_s_002299.png to s3://udacity-ml-workflow/train/bicycle_s_002299.png\n", + "upload: train/bicycle_s_002400.png to s3://udacity-ml-workflow/train/bicycle_s_002400.png\n", + "upload: train/bicycle_s_002410.png to s3://udacity-ml-workflow/train/bicycle_s_002410.png\n", + "upload: train/bicycle_s_002448.png to s3://udacity-ml-workflow/train/bicycle_s_002448.png\n", + "upload: train/bicycle_s_002338.png to s3://udacity-ml-workflow/train/bicycle_s_002338.png\n", + "upload: train/bicycle_s_002521.png to s3://udacity-ml-workflow/train/bicycle_s_002521.png\n", + "upload: train/bicycle_s_002661.png to s3://udacity-ml-workflow/train/bicycle_s_002661.png\n", + "upload: train/bicycle_s_002624.png to s3://udacity-ml-workflow/train/bicycle_s_002624.png\n", + "upload: train/bicycle_s_002475.png to s3://udacity-ml-workflow/train/bicycle_s_002475.png\n", + "upload: train/bicycle_s_002569.png to s3://udacity-ml-workflow/train/bicycle_s_002569.png\n", + "upload: train/bicycle_s_002711.png to s3://udacity-ml-workflow/train/bicycle_s_002711.png\n", + "upload: train/bicycle_s_002550.png to s3://udacity-ml-workflow/train/bicycle_s_002550.png\n", + "upload: train/bicycle_s_002725.png to s3://udacity-ml-workflow/train/bicycle_s_002725.png\n", + "upload: train/bicycle_s_002436.png to s3://udacity-ml-workflow/train/bicycle_s_002436.png\n", + "upload: train/bicycle_s_002759.png to s3://udacity-ml-workflow/train/bicycle_s_002759.png\n", + "upload: train/bicycle_s_002715.png to s3://udacity-ml-workflow/train/bicycle_s_002715.png\n", + "upload: train/bicycle_s_002729.png to s3://udacity-ml-workflow/train/bicycle_s_002729.png\n", + "upload: train/bicycle_s_002728.png to s3://udacity-ml-workflow/train/bicycle_s_002728.png\n", + "upload: train/bicycle_s_002373.png to s3://udacity-ml-workflow/train/bicycle_s_002373.png\n", + "upload: train/bicycle_s_002762.png to s3://udacity-ml-workflow/train/bicycle_s_002762.png\n", + "upload: train/bike_s_000018.png to s3://udacity-ml-workflow/train/bike_s_000018.png \n", + "upload: train/bike_s_000003.png to s3://udacity-ml-workflow/train/bike_s_000003.png \n", + "upload: train/bike_s_000015.png to s3://udacity-ml-workflow/train/bike_s_000015.png \n", + "upload: train/bike_s_000001.png to s3://udacity-ml-workflow/train/bike_s_000001.png \n", + "upload: train/bike_s_000023.png to s3://udacity-ml-workflow/train/bike_s_000023.png \n", + "upload: train/bicycle_s_002669.png to s3://udacity-ml-workflow/train/bicycle_s_002669.png\n", + "upload: train/bike_s_000005.png to s3://udacity-ml-workflow/train/bike_s_000005.png \n", + "upload: train/bike_s_000025.png to s3://udacity-ml-workflow/train/bike_s_000025.png \n", + "upload: train/bike_s_000034.png to s3://udacity-ml-workflow/train/bike_s_000034.png \n", + "upload: train/bike_s_000035.png to s3://udacity-ml-workflow/train/bike_s_000035.png \n", + "upload: train/bike_s_000062.png to s3://udacity-ml-workflow/train/bike_s_000062.png \n", + "upload: train/bike_s_000026.png to s3://udacity-ml-workflow/train/bike_s_000026.png \n", + "upload: train/bike_s_000121.png to s3://udacity-ml-workflow/train/bike_s_000121.png \n", + "upload: train/bike_s_000021.png to s3://udacity-ml-workflow/train/bike_s_000021.png \n", + "upload: train/bike_s_000040.png to s3://udacity-ml-workflow/train/bike_s_000040.png \n", + "upload: train/bike_s_000127.png to s3://udacity-ml-workflow/train/bike_s_000127.png \n", + "upload: train/bike_s_000111.png to s3://udacity-ml-workflow/train/bike_s_000111.png \n", + "upload: train/bike_s_000154.png to s3://udacity-ml-workflow/train/bike_s_000154.png \n", + "upload: train/bike_s_000162.png to s3://udacity-ml-workflow/train/bike_s_000162.png \n", + "upload: train/bike_s_000129.png to s3://udacity-ml-workflow/train/bike_s_000129.png \n", + "upload: train/bike_s_000051.png to s3://udacity-ml-workflow/train/bike_s_000051.png \n", + "upload: train/bike_s_000256.png to s3://udacity-ml-workflow/train/bike_s_000256.png \n", + "upload: train/bike_s_000024.png to s3://udacity-ml-workflow/train/bike_s_000024.png \n", + "upload: train/bike_s_000164.png to s3://udacity-ml-workflow/train/bike_s_000164.png \n", + "upload: train/bike_s_000204.png to s3://udacity-ml-workflow/train/bike_s_000204.png \n", + "upload: train/bike_s_000299.png to s3://udacity-ml-workflow/train/bike_s_000299.png \n", + "upload: train/bike_s_000237.png to s3://udacity-ml-workflow/train/bike_s_000237.png \n", + "upload: train/bike_s_000302.png to s3://udacity-ml-workflow/train/bike_s_000302.png \n", + "upload: train/bike_s_000304.png to s3://udacity-ml-workflow/train/bike_s_000304.png \n", + "upload: train/bike_s_000336.png to s3://udacity-ml-workflow/train/bike_s_000336.png \n", + "upload: train/bike_s_000390.png to s3://udacity-ml-workflow/train/bike_s_000390.png \n", + "upload: train/bike_s_000397.png to s3://udacity-ml-workflow/train/bike_s_000397.png \n", + "upload: train/bike_s_000392.png to s3://udacity-ml-workflow/train/bike_s_000392.png \n", + "upload: train/bike_s_000516.png to s3://udacity-ml-workflow/train/bike_s_000516.png \n", + "upload: train/bike_s_000364.png to s3://udacity-ml-workflow/train/bike_s_000364.png \n", + "upload: train/bike_s_000545.png to s3://udacity-ml-workflow/train/bike_s_000545.png \n", + "upload: train/bike_s_000474.png to s3://udacity-ml-workflow/train/bike_s_000474.png \n", + "upload: train/bike_s_000522.png to s3://udacity-ml-workflow/train/bike_s_000522.png \n", + "upload: train/bike_s_000544.png to s3://udacity-ml-workflow/train/bike_s_000544.png \n", + "upload: train/bike_s_000555.png to s3://udacity-ml-workflow/train/bike_s_000555.png \n", + "upload: train/bike_s_000593.png to s3://udacity-ml-workflow/train/bike_s_000593.png \n", + "upload: train/bike_s_000657.png to s3://udacity-ml-workflow/train/bike_s_000657.png \n", + "upload: train/bike_s_000628.png to s3://udacity-ml-workflow/train/bike_s_000628.png \n", + "upload: train/bike_s_000682.png to s3://udacity-ml-workflow/train/bike_s_000682.png \n", + "upload: train/bike_s_000506.png to s3://udacity-ml-workflow/train/bike_s_000506.png \n", + "upload: train/bike_s_000722.png to s3://udacity-ml-workflow/train/bike_s_000722.png \n", + "upload: train/bike_s_000934.png to s3://udacity-ml-workflow/train/bike_s_000934.png \n", + "upload: train/bike_s_000990.png to s3://udacity-ml-workflow/train/bike_s_000990.png \n", + "upload: train/bike_s_000855.png to s3://udacity-ml-workflow/train/bike_s_000855.png \n", + "upload: train/bike_s_000679.png to s3://udacity-ml-workflow/train/bike_s_000679.png \n", + "upload: train/bike_s_000926.png to s3://udacity-ml-workflow/train/bike_s_000926.png \n", + "upload: train/bike_s_001027.png to s3://udacity-ml-workflow/train/bike_s_001027.png \n", + "upload: train/bike_s_001072.png to s3://udacity-ml-workflow/train/bike_s_001072.png \n", + "upload: train/bike_s_001078.png to s3://udacity-ml-workflow/train/bike_s_001078.png \n", + "upload: train/bike_s_001116.png to s3://udacity-ml-workflow/train/bike_s_001116.png \n", + "upload: train/bike_s_001131.png to s3://udacity-ml-workflow/train/bike_s_001131.png \n", + "upload: train/bike_s_001200.png to s3://udacity-ml-workflow/train/bike_s_001200.png \n", + "upload: train/bike_s_001113.png to s3://udacity-ml-workflow/train/bike_s_001113.png \n", + "upload: train/bike_s_001093.png to s3://udacity-ml-workflow/train/bike_s_001093.png \n", + "upload: train/bike_s_001260.png to s3://udacity-ml-workflow/train/bike_s_001260.png \n", + "upload: train/bike_s_001320.png to s3://udacity-ml-workflow/train/bike_s_001320.png \n", + "upload: train/bike_s_001375.png to s3://udacity-ml-workflow/train/bike_s_001375.png \n", + "upload: train/bike_s_001414.png to s3://udacity-ml-workflow/train/bike_s_001414.png \n", + "upload: train/bike_s_001226.png to s3://udacity-ml-workflow/train/bike_s_001226.png \n", + "upload: train/bike_s_001462.png to s3://udacity-ml-workflow/train/bike_s_001462.png \n", + "upload: train/bike_s_001380.png to s3://udacity-ml-workflow/train/bike_s_001380.png \n", + "upload: train/bike_s_001418.png to s3://udacity-ml-workflow/train/bike_s_001418.png \n", + "upload: train/bike_s_001517.png to s3://udacity-ml-workflow/train/bike_s_001517.png \n", + "upload: train/bike_s_001572.png to s3://udacity-ml-workflow/train/bike_s_001572.png \n", + "upload: train/bike_s_001415.png to s3://udacity-ml-workflow/train/bike_s_001415.png \n", + "upload: train/bike_s_001592.png to s3://udacity-ml-workflow/train/bike_s_001592.png \n", + "upload: train/bike_s_001519.png to s3://udacity-ml-workflow/train/bike_s_001519.png \n", + "upload: train/bike_s_001761.png to s3://udacity-ml-workflow/train/bike_s_001761.png \n", + "upload: train/bike_s_001739.png to s3://udacity-ml-workflow/train/bike_s_001739.png \n", + "upload: train/bike_s_001683.png to s3://udacity-ml-workflow/train/bike_s_001683.png \n", + "upload: train/bike_s_001839.png to s3://udacity-ml-workflow/train/bike_s_001839.png \n", + "upload: train/bike_s_001613.png to s3://udacity-ml-workflow/train/bike_s_001613.png \n", + "upload: train/bike_s_001847.png to s3://udacity-ml-workflow/train/bike_s_001847.png \n", + "upload: train/bike_s_001679.png to s3://udacity-ml-workflow/train/bike_s_001679.png \n", + "upload: train/bike_s_001882.png to s3://udacity-ml-workflow/train/bike_s_001882.png \n", + "upload: train/bike_s_001827.png to s3://udacity-ml-workflow/train/bike_s_001827.png \n", + "upload: train/bike_s_001877.png to s3://udacity-ml-workflow/train/bike_s_001877.png \n", + "upload: train/bike_s_001767.png to s3://udacity-ml-workflow/train/bike_s_001767.png \n", + "upload: train/bike_s_001980.png to s3://udacity-ml-workflow/train/bike_s_001980.png \n", + "upload: train/bike_s_002024.png to s3://udacity-ml-workflow/train/bike_s_002024.png \n", + "upload: train/bike_s_002033.png to s3://udacity-ml-workflow/train/bike_s_002033.png \n", + "upload: train/bike_s_002042.png to s3://udacity-ml-workflow/train/bike_s_002042.png \n", + "upload: train/bike_s_001876.png to s3://udacity-ml-workflow/train/bike_s_001876.png \n", + "upload: train/bike_s_001897.png to s3://udacity-ml-workflow/train/bike_s_001897.png \n", + "upload: train/bike_s_001915.png to s3://udacity-ml-workflow/train/bike_s_001915.png \n", + "upload: train/bike_s_001945.png to s3://udacity-ml-workflow/train/bike_s_001945.png \n", + "upload: train/bike_s_001928.png to s3://udacity-ml-workflow/train/bike_s_001928.png \n", + "upload: train/bike_s_002047.png to s3://udacity-ml-workflow/train/bike_s_002047.png \n", + "upload: train/bike_s_002109.png to s3://udacity-ml-workflow/train/bike_s_002109.png \n", + "upload: train/bike_s_002098.png to s3://udacity-ml-workflow/train/bike_s_002098.png \n", + "upload: train/bike_s_002090.png to s3://udacity-ml-workflow/train/bike_s_002090.png \n", + "upload: train/bike_s_002164.png to s3://udacity-ml-workflow/train/bike_s_002164.png \n", + "upload: train/bike_s_002118.png to s3://udacity-ml-workflow/train/bike_s_002118.png \n", + "upload: train/bike_s_002215.png to s3://udacity-ml-workflow/train/bike_s_002215.png \n", + "upload: train/bike_s_002139.png to s3://udacity-ml-workflow/train/bike_s_002139.png \n", + "upload: train/bike_s_002203.png to s3://udacity-ml-workflow/train/bike_s_002203.png \n", + "upload: train/bike_s_002222.png to s3://udacity-ml-workflow/train/bike_s_002222.png \n", + "upload: train/bike_s_002288.png to s3://udacity-ml-workflow/train/bike_s_002288.png \n", + "upload: train/bike_s_002277.png to s3://udacity-ml-workflow/train/bike_s_002277.png \n", + "upload: train/cycle_s_000463.png to s3://udacity-ml-workflow/train/cycle_s_000463.png \n", + "upload: train/cycle_s_000492.png to s3://udacity-ml-workflow/train/cycle_s_000492.png \n", + "upload: train/bike_s_002292.png to s3://udacity-ml-workflow/train/bike_s_002292.png \n", + "upload: train/cycle_s_000318.png to s3://udacity-ml-workflow/train/cycle_s_000318.png \n", + "upload: train/cycle_s_000042.png to s3://udacity-ml-workflow/train/cycle_s_000042.png \n", + "upload: train/cycle_s_000639.png to s3://udacity-ml-workflow/train/cycle_s_000639.png \n", + "upload: train/bike_s_002283.png to s3://udacity-ml-workflow/train/bike_s_002283.png \n", + "upload: train/cycle_s_000222.png to s3://udacity-ml-workflow/train/cycle_s_000222.png \n", + "upload: train/cycle_s_000718.png to s3://udacity-ml-workflow/train/cycle_s_000718.png \n", + "upload: train/cycle_s_000666.png to s3://udacity-ml-workflow/train/cycle_s_000666.png \n", + "upload: train/cycle_s_001286.png to s3://udacity-ml-workflow/train/cycle_s_001286.png \n", + "upload: train/cycle_s_000871.png to s3://udacity-ml-workflow/train/cycle_s_000871.png \n", + "upload: train/cycle_s_000583.png to s3://udacity-ml-workflow/train/cycle_s_000583.png \n", + "upload: train/cycle_s_001309.png to s3://udacity-ml-workflow/train/cycle_s_001309.png \n", + "upload: train/cycle_s_001413.png to s3://udacity-ml-workflow/train/cycle_s_001413.png \n", + "upload: train/cycle_s_000899.png to s3://udacity-ml-workflow/train/cycle_s_000899.png \n", + "upload: train/cycle_s_001474.png to s3://udacity-ml-workflow/train/cycle_s_001474.png \n", + "upload: train/cycle_s_001412.png to s3://udacity-ml-workflow/train/cycle_s_001412.png \n", + "upload: train/cycle_s_001477.png to s3://udacity-ml-workflow/train/cycle_s_001477.png \n", + "upload: train/cycle_s_001640.png to s3://udacity-ml-workflow/train/cycle_s_001640.png \n", + "upload: train/cycle_s_001875.png to s3://udacity-ml-workflow/train/cycle_s_001875.png \n", + "upload: train/cycle_s_001472.png to s3://udacity-ml-workflow/train/cycle_s_001472.png \n", + "upload: train/cycle_s_001745.png to s3://udacity-ml-workflow/train/cycle_s_001745.png \n", + "upload: train/cycle_s_001735.png to s3://udacity-ml-workflow/train/cycle_s_001735.png \n", + "upload: train/cycle_s_001976.png to s3://udacity-ml-workflow/train/cycle_s_001976.png \n", + "upload: train/cycle_s_001439.png to s3://udacity-ml-workflow/train/cycle_s_001439.png \n", + "upload: train/cycle_s_001374.png to s3://udacity-ml-workflow/train/cycle_s_001374.png \n", + "upload: train/cycle_s_002015.png to s3://udacity-ml-workflow/train/cycle_s_002015.png \n", + "upload: train/cycle_s_002168.png to s3://udacity-ml-workflow/train/cycle_s_002168.png \n", + "upload: train/cycle_s_002092.png to s3://udacity-ml-workflow/train/cycle_s_002092.png \n", + "upload: train/cycle_s_002053.png to s3://udacity-ml-workflow/train/cycle_s_002053.png \n", + "upload: train/cycle_s_002178.png to s3://udacity-ml-workflow/train/cycle_s_002178.png \n", + "upload: train/cycle_s_002093.png to s3://udacity-ml-workflow/train/cycle_s_002093.png \n", + "upload: train/cycle_s_002659.png to s3://udacity-ml-workflow/train/cycle_s_002659.png \n", + "upload: train/cycle_s_002651.png to s3://udacity-ml-workflow/train/cycle_s_002651.png \n", + "upload: train/cycle_s_002090.png to s3://udacity-ml-workflow/train/cycle_s_002090.png \n", + "upload: train/cycle_s_002399.png to s3://udacity-ml-workflow/train/cycle_s_002399.png \n", + "upload: train/cycle_s_002746.png to s3://udacity-ml-workflow/train/cycle_s_002746.png \n", + "upload: train/cycle_s_002779.png to s3://udacity-ml-workflow/train/cycle_s_002779.png \n", + "upload: train/cycle_s_002503.png to s3://udacity-ml-workflow/train/cycle_s_002503.png \n", + "upload: train/cycle_s_002844.png to s3://udacity-ml-workflow/train/cycle_s_002844.png \n", + "upload: train/cycle_s_002598.png to s3://udacity-ml-workflow/train/cycle_s_002598.png \n", + "upload: train/cycle_s_002638.png to s3://udacity-ml-workflow/train/cycle_s_002638.png \n", + "upload: train/cycle_s_002882.png to s3://udacity-ml-workflow/train/cycle_s_002882.png \n", + "upload: train/cycle_s_002666.png to s3://udacity-ml-workflow/train/cycle_s_002666.png \n", + "upload: train/cycle_s_002904.png to s3://udacity-ml-workflow/train/cycle_s_002904.png \n", + "upload: train/cycle_s_002703.png to s3://udacity-ml-workflow/train/cycle_s_002703.png \n", + "upload: train/cycle_s_003026.png to s3://udacity-ml-workflow/train/cycle_s_003026.png \n", + "upload: train/cycle_s_002978.png to s3://udacity-ml-workflow/train/cycle_s_002978.png \n", + "upload: train/cycle_s_003008.png to s3://udacity-ml-workflow/train/cycle_s_003008.png \n", + "upload: train/cycle_s_003147.png to s3://udacity-ml-workflow/train/cycle_s_003147.png \n", + "upload: train/cycle_s_003006.png to s3://udacity-ml-workflow/train/cycle_s_003006.png \n", + "upload: train/dirt_bike_s_000003.png to s3://udacity-ml-workflow/train/dirt_bike_s_000003.png\n", + "upload: train/cycle_s_003122.png to s3://udacity-ml-workflow/train/cycle_s_003122.png \n", + "upload: train/cycle_s_003162.png to s3://udacity-ml-workflow/train/cycle_s_003162.png \n", + "upload: train/cycle_s_003148.png to s3://udacity-ml-workflow/train/cycle_s_003148.png \n", + "upload: train/dirt_bike_s_000005.png to s3://udacity-ml-workflow/train/dirt_bike_s_000005.png\n", + "upload: train/cycle_s_003043.png to s3://udacity-ml-workflow/train/cycle_s_003043.png \n", + "upload: train/dirt_bike_s_000059.png to s3://udacity-ml-workflow/train/dirt_bike_s_000059.png\n", + "upload: train/dirt_bike_s_000017.png to s3://udacity-ml-workflow/train/dirt_bike_s_000017.png\n", + "upload: train/dirt_bike_s_000134.png to s3://udacity-ml-workflow/train/dirt_bike_s_000134.png\n", + "upload: train/dirt_bike_s_000124.png to s3://udacity-ml-workflow/train/dirt_bike_s_000124.png\n", + "upload: train/dirt_bike_s_000119.png to s3://udacity-ml-workflow/train/dirt_bike_s_000119.png\n", + "upload: train/minibike_s_000011.png to s3://udacity-ml-workflow/train/minibike_s_000011.png\n", + "upload: train/dirt_bike_s_000030.png to s3://udacity-ml-workflow/train/dirt_bike_s_000030.png\n", + "upload: train/minibike_s_000010.png to s3://udacity-ml-workflow/train/minibike_s_000010.png\n", + "upload: train/minibike_s_000035.png to s3://udacity-ml-workflow/train/minibike_s_000035.png\n", + "upload: train/minibike_s_000020.png to s3://udacity-ml-workflow/train/minibike_s_000020.png\n", + "upload: train/minibike_s_000022.png to s3://udacity-ml-workflow/train/minibike_s_000022.png\n", + "upload: train/minibike_s_000064.png to s3://udacity-ml-workflow/train/minibike_s_000064.png\n", + "upload: train/minibike_s_000036.png to s3://udacity-ml-workflow/train/minibike_s_000036.png\n", + "upload: train/minibike_s_000099.png to s3://udacity-ml-workflow/train/minibike_s_000099.png\n", + "upload: train/minibike_s_000108.png to s3://udacity-ml-workflow/train/minibike_s_000108.png\n", + "upload: train/minibike_s_000110.png to s3://udacity-ml-workflow/train/minibike_s_000110.png\n", + "upload: train/minibike_s_000116.png to s3://udacity-ml-workflow/train/minibike_s_000116.png\n", + "upload: train/minibike_s_000127.png to s3://udacity-ml-workflow/train/minibike_s_000127.png\n", + "upload: train/minibike_s_000102.png to s3://udacity-ml-workflow/train/minibike_s_000102.png\n", + "upload: train/minibike_s_000130.png to s3://udacity-ml-workflow/train/minibike_s_000130.png\n", + "upload: train/minibike_s_000146.png to s3://udacity-ml-workflow/train/minibike_s_000146.png\n", + "upload: train/minibike_s_000117.png to s3://udacity-ml-workflow/train/minibike_s_000117.png\n", + "upload: train/minibike_s_000165.png to s3://udacity-ml-workflow/train/minibike_s_000165.png\n", + "upload: train/minibike_s_000149.png to s3://udacity-ml-workflow/train/minibike_s_000149.png\n", + "upload: train/minibike_s_000244.png to s3://udacity-ml-workflow/train/minibike_s_000244.png\n", + "upload: train/minibike_s_000121.png to s3://udacity-ml-workflow/train/minibike_s_000121.png\n", + "upload: train/minibike_s_000293.png to s3://udacity-ml-workflow/train/minibike_s_000293.png\n", + "upload: train/minibike_s_000314.png to s3://udacity-ml-workflow/train/minibike_s_000314.png\n", + "upload: train/minibike_s_000324.png to s3://udacity-ml-workflow/train/minibike_s_000324.png\n", + "upload: train/minibike_s_000350.png to s3://udacity-ml-workflow/train/minibike_s_000350.png\n", + "upload: train/minibike_s_000203.png to s3://udacity-ml-workflow/train/minibike_s_000203.png\n", + "upload: train/minibike_s_000335.png to s3://udacity-ml-workflow/train/minibike_s_000335.png\n", + "upload: train/minibike_s_000340.png to s3://udacity-ml-workflow/train/minibike_s_000340.png\n", + "upload: train/minibike_s_000218.png to s3://udacity-ml-workflow/train/minibike_s_000218.png\n", + "upload: train/minibike_s_000408.png to s3://udacity-ml-workflow/train/minibike_s_000408.png\n", + "upload: train/minibike_s_000392.png to s3://udacity-ml-workflow/train/minibike_s_000392.png\n", + "upload: train/minibike_s_000402.png to s3://udacity-ml-workflow/train/minibike_s_000402.png\n", + "upload: train/minibike_s_000401.png to s3://udacity-ml-workflow/train/minibike_s_000401.png\n", + "upload: train/minibike_s_000429.png to s3://udacity-ml-workflow/train/minibike_s_000429.png\n", + "upload: train/minibike_s_000362.png to s3://udacity-ml-workflow/train/minibike_s_000362.png\n", + "upload: train/minibike_s_000435.png to s3://udacity-ml-workflow/train/minibike_s_000435.png\n", + "upload: train/minibike_s_000427.png to s3://udacity-ml-workflow/train/minibike_s_000427.png\n", + "upload: train/minibike_s_000459.png to s3://udacity-ml-workflow/train/minibike_s_000459.png\n", + "upload: train/minibike_s_000451.png to s3://udacity-ml-workflow/train/minibike_s_000451.png\n", + "upload: train/minibike_s_000485.png to s3://udacity-ml-workflow/train/minibike_s_000485.png\n", + "upload: train/minibike_s_000409.png to s3://udacity-ml-workflow/train/minibike_s_000409.png\n", + "upload: train/minibike_s_000498.png to s3://udacity-ml-workflow/train/minibike_s_000498.png\n", + "upload: train/minibike_s_000434.png to s3://udacity-ml-workflow/train/minibike_s_000434.png\n", + "upload: train/minibike_s_000507.png to s3://udacity-ml-workflow/train/minibike_s_000507.png\n", + "upload: train/minibike_s_000519.png to s3://udacity-ml-workflow/train/minibike_s_000519.png\n", + "upload: train/minibike_s_000520.png to s3://udacity-ml-workflow/train/minibike_s_000520.png\n", + "upload: train/minibike_s_000511.png to s3://udacity-ml-workflow/train/minibike_s_000511.png\n", + "upload: train/minibike_s_000491.png to s3://udacity-ml-workflow/train/minibike_s_000491.png\n", + "upload: train/minibike_s_000527.png to s3://udacity-ml-workflow/train/minibike_s_000527.png\n", + "upload: train/minibike_s_000522.png to s3://udacity-ml-workflow/train/minibike_s_000522.png\n", + "upload: train/minibike_s_000565.png to s3://udacity-ml-workflow/train/minibike_s_000565.png\n", + "upload: train/minibike_s_000518.png to s3://udacity-ml-workflow/train/minibike_s_000518.png\n", + "upload: train/minibike_s_000566.png to s3://udacity-ml-workflow/train/minibike_s_000566.png\n", + "upload: train/minibike_s_000569.png to s3://udacity-ml-workflow/train/minibike_s_000569.png\n", + "upload: train/minibike_s_000567.png to s3://udacity-ml-workflow/train/minibike_s_000567.png\n", + "upload: train/minibike_s_000571.png to s3://udacity-ml-workflow/train/minibike_s_000571.png\n", + "upload: train/minibike_s_000613.png to s3://udacity-ml-workflow/train/minibike_s_000613.png\n", + "upload: train/minibike_s_000568.png to s3://udacity-ml-workflow/train/minibike_s_000568.png\n", + "upload: train/minibike_s_000526.png to s3://udacity-ml-workflow/train/minibike_s_000526.png\n", + "upload: train/minibike_s_000690.png to s3://udacity-ml-workflow/train/minibike_s_000690.png\n", + "upload: train/minibike_s_000570.png to s3://udacity-ml-workflow/train/minibike_s_000570.png\n", + "upload: train/minibike_s_000652.png to s3://udacity-ml-workflow/train/minibike_s_000652.png\n", + "upload: train/minibike_s_000701.png to s3://udacity-ml-workflow/train/minibike_s_000701.png\n", + "upload: train/minibike_s_000709.png to s3://udacity-ml-workflow/train/minibike_s_000709.png\n", + "upload: train/minibike_s_000743.png to s3://udacity-ml-workflow/train/minibike_s_000743.png\n", + "upload: train/minibike_s_000800.png to s3://udacity-ml-workflow/train/minibike_s_000800.png\n", + "upload: train/minibike_s_000738.png to s3://udacity-ml-workflow/train/minibike_s_000738.png\n", + "upload: train/minibike_s_000698.png to s3://udacity-ml-workflow/train/minibike_s_000698.png\n", + "upload: train/minibike_s_000813.png to s3://udacity-ml-workflow/train/minibike_s_000813.png\n", + "upload: train/minibike_s_000654.png to s3://udacity-ml-workflow/train/minibike_s_000654.png\n", + "upload: train/minibike_s_000802.png to s3://udacity-ml-workflow/train/minibike_s_000802.png\n", + "upload: train/minibike_s_000741.png to s3://udacity-ml-workflow/train/minibike_s_000741.png\n", + "upload: train/minibike_s_000824.png to s3://udacity-ml-workflow/train/minibike_s_000824.png\n", + "upload: train/minibike_s_000830.png to s3://udacity-ml-workflow/train/minibike_s_000830.png\n", + "upload: train/minibike_s_000820.png to s3://udacity-ml-workflow/train/minibike_s_000820.png\n", + "upload: train/minibike_s_000831.png to s3://udacity-ml-workflow/train/minibike_s_000831.png\n", + "upload: train/minibike_s_000885.png to s3://udacity-ml-workflow/train/minibike_s_000885.png\n", + "upload: train/minibike_s_000886.png to s3://udacity-ml-workflow/train/minibike_s_000886.png\n", + "upload: train/minibike_s_000967.png to s3://udacity-ml-workflow/train/minibike_s_000967.png\n", + "upload: train/minibike_s_000968.png to s3://udacity-ml-workflow/train/minibike_s_000968.png\n", + "upload: train/minibike_s_001017.png to s3://udacity-ml-workflow/train/minibike_s_001017.png\n", + "upload: train/minibike_s_001072.png to s3://udacity-ml-workflow/train/minibike_s_001072.png\n", + "upload: train/minibike_s_000906.png to s3://udacity-ml-workflow/train/minibike_s_000906.png\n", + "upload: train/minibike_s_000855.png to s3://udacity-ml-workflow/train/minibike_s_000855.png\n", + "upload: train/minibike_s_001016.png to s3://udacity-ml-workflow/train/minibike_s_001016.png\n", + "upload: train/minibike_s_000914.png to s3://udacity-ml-workflow/train/minibike_s_000914.png\n", + "upload: train/minibike_s_001079.png to s3://udacity-ml-workflow/train/minibike_s_001079.png\n", + "upload: train/minibike_s_001094.png to s3://udacity-ml-workflow/train/minibike_s_001094.png\n", + "upload: train/minibike_s_001169.png to s3://udacity-ml-workflow/train/minibike_s_001169.png\n", + "upload: train/minibike_s_001185.png to s3://udacity-ml-workflow/train/minibike_s_001185.png\n", + "upload: train/minibike_s_001177.png to s3://udacity-ml-workflow/train/minibike_s_001177.png\n", + "upload: train/minibike_s_001179.png to s3://udacity-ml-workflow/train/minibike_s_001179.png\n", + "upload: train/minibike_s_001193.png to s3://udacity-ml-workflow/train/minibike_s_001193.png\n", + "upload: train/minibike_s_001168.png to s3://udacity-ml-workflow/train/minibike_s_001168.png\n", + "upload: train/minibike_s_001157.png to s3://udacity-ml-workflow/train/minibike_s_001157.png\n", + "upload: train/minibike_s_001250.png to s3://udacity-ml-workflow/train/minibike_s_001250.png\n", + "upload: train/minibike_s_001191.png to s3://udacity-ml-workflow/train/minibike_s_001191.png\n", + "upload: train/minibike_s_001261.png to s3://udacity-ml-workflow/train/minibike_s_001261.png\n", + "upload: train/minibike_s_001249.png to s3://udacity-ml-workflow/train/minibike_s_001249.png\n", + "upload: train/minibike_s_001270.png to s3://udacity-ml-workflow/train/minibike_s_001270.png\n", + "upload: train/minibike_s_001275.png to s3://udacity-ml-workflow/train/minibike_s_001275.png\n", + "upload: train/minibike_s_001344.png to s3://udacity-ml-workflow/train/minibike_s_001344.png\n", + "upload: train/minibike_s_001294.png to s3://udacity-ml-workflow/train/minibike_s_001294.png\n", + "upload: train/minibike_s_001417.png to s3://udacity-ml-workflow/train/minibike_s_001417.png\n", + "upload: train/minibike_s_001458.png to s3://udacity-ml-workflow/train/minibike_s_001458.png\n", + "upload: train/minibike_s_001348.png to s3://udacity-ml-workflow/train/minibike_s_001348.png\n", + "upload: train/minibike_s_001479.png to s3://udacity-ml-workflow/train/minibike_s_001479.png\n", + "upload: train/minibike_s_001450.png to s3://udacity-ml-workflow/train/minibike_s_001450.png\n", + "upload: train/minibike_s_001345.png to s3://udacity-ml-workflow/train/minibike_s_001345.png\n", + "upload: train/minibike_s_001498.png to s3://udacity-ml-workflow/train/minibike_s_001498.png\n", + "upload: train/minibike_s_001511.png to s3://udacity-ml-workflow/train/minibike_s_001511.png\n", + "upload: train/minibike_s_001496.png to s3://udacity-ml-workflow/train/minibike_s_001496.png\n", + "upload: train/minibike_s_001512.png to s3://udacity-ml-workflow/train/minibike_s_001512.png\n", + "upload: train/minibike_s_001279.png to s3://udacity-ml-workflow/train/minibike_s_001279.png\n", + "upload: train/minibike_s_001506.png to s3://udacity-ml-workflow/train/minibike_s_001506.png\n", + "upload: train/minibike_s_001539.png to s3://udacity-ml-workflow/train/minibike_s_001539.png\n", + "upload: train/minibike_s_001540.png to s3://udacity-ml-workflow/train/minibike_s_001540.png\n", + "upload: train/minibike_s_001366.png to s3://udacity-ml-workflow/train/minibike_s_001366.png\n", + "upload: train/minibike_s_001565.png to s3://udacity-ml-workflow/train/minibike_s_001565.png\n", + "upload: train/minibike_s_001491.png to s3://udacity-ml-workflow/train/minibike_s_001491.png\n", + "upload: train/minibike_s_001546.png to s3://udacity-ml-workflow/train/minibike_s_001546.png\n", + "upload: train/minibike_s_001631.png to s3://udacity-ml-workflow/train/minibike_s_001631.png\n", + "upload: train/minibike_s_001558.png to s3://udacity-ml-workflow/train/minibike_s_001558.png\n", + "upload: train/minibike_s_001639.png to s3://udacity-ml-workflow/train/minibike_s_001639.png\n", + "upload: train/minibike_s_001653.png to s3://udacity-ml-workflow/train/minibike_s_001653.png\n", + "upload: train/minibike_s_001573.png to s3://udacity-ml-workflow/train/minibike_s_001573.png\n", + "upload: train/minibike_s_001597.png to s3://udacity-ml-workflow/train/minibike_s_001597.png\n", + "upload: train/minibike_s_001747.png to s3://udacity-ml-workflow/train/minibike_s_001747.png\n", + "upload: train/minibike_s_001689.png to s3://udacity-ml-workflow/train/minibike_s_001689.png\n", + "upload: train/minibike_s_001575.png to s3://udacity-ml-workflow/train/minibike_s_001575.png\n", + "upload: train/minibike_s_001701.png to s3://udacity-ml-workflow/train/minibike_s_001701.png\n", + "upload: train/minibike_s_001734.png to s3://udacity-ml-workflow/train/minibike_s_001734.png\n", + "upload: train/minibike_s_001638.png to s3://udacity-ml-workflow/train/minibike_s_001638.png\n", + "upload: train/minibike_s_001731.png to s3://udacity-ml-workflow/train/minibike_s_001731.png\n", + "upload: train/minibike_s_001771.png to s3://udacity-ml-workflow/train/minibike_s_001771.png\n", + "upload: train/minibike_s_001691.png to s3://udacity-ml-workflow/train/minibike_s_001691.png\n", + "upload: train/minibike_s_001836.png to s3://udacity-ml-workflow/train/minibike_s_001836.png\n", + "upload: train/minibike_s_001789.png to s3://udacity-ml-workflow/train/minibike_s_001789.png\n", + "upload: train/minibike_s_001863.png to s3://udacity-ml-workflow/train/minibike_s_001863.png\n", + "upload: train/minibike_s_001767.png to s3://udacity-ml-workflow/train/minibike_s_001767.png\n", + "upload: train/minibike_s_001865.png to s3://udacity-ml-workflow/train/minibike_s_001865.png\n", + "upload: train/minibike_s_001829.png to s3://udacity-ml-workflow/train/minibike_s_001829.png\n", + "upload: train/minibike_s_001880.png to s3://udacity-ml-workflow/train/minibike_s_001880.png\n", + "upload: train/minibike_s_001838.png to s3://udacity-ml-workflow/train/minibike_s_001838.png\n", + "upload: train/minibike_s_001885.png to s3://udacity-ml-workflow/train/minibike_s_001885.png\n", + "upload: train/minibike_s_001873.png to s3://udacity-ml-workflow/train/minibike_s_001873.png\n", + "upload: train/minibike_s_001827.png to s3://udacity-ml-workflow/train/minibike_s_001827.png\n", + "upload: train/minibike_s_001881.png to s3://udacity-ml-workflow/train/minibike_s_001881.png\n", + "upload: train/minibike_s_001870.png to s3://udacity-ml-workflow/train/minibike_s_001870.png\n", + "upload: train/minibike_s_001972.png to s3://udacity-ml-workflow/train/minibike_s_001972.png\n", + "upload: train/minibike_s_001969.png to s3://udacity-ml-workflow/train/minibike_s_001969.png\n", + "upload: train/minibike_s_001996.png to s3://udacity-ml-workflow/train/minibike_s_001996.png\n", + "upload: train/minibike_s_002030.png to s3://udacity-ml-workflow/train/minibike_s_002030.png\n", + "upload: train/minibike_s_002009.png to s3://udacity-ml-workflow/train/minibike_s_002009.png\n", + "upload: train/minibike_s_001944.png to s3://udacity-ml-workflow/train/minibike_s_001944.png\n", + "upload: train/minibike_s_002048.png to s3://udacity-ml-workflow/train/minibike_s_002048.png\n", + "upload: train/minibike_s_001921.png to s3://udacity-ml-workflow/train/minibike_s_001921.png\n", + "upload: train/minibike_s_002046.png to s3://udacity-ml-workflow/train/minibike_s_002046.png\n", + "upload: train/minibike_s_002038.png to s3://udacity-ml-workflow/train/minibike_s_002038.png\n", + "upload: train/minibike_s_001917.png to s3://udacity-ml-workflow/train/minibike_s_001917.png\n", + "upload: train/minibike_s_002115.png to s3://udacity-ml-workflow/train/minibike_s_002115.png\n", + "upload: train/minibike_s_002124.png to s3://udacity-ml-workflow/train/minibike_s_002124.png\n", + "upload: train/minibike_s_002130.png to s3://udacity-ml-workflow/train/minibike_s_002130.png\n", + "upload: train/minibike_s_002137.png to s3://udacity-ml-workflow/train/minibike_s_002137.png\n", + "upload: train/minibike_s_002146.png to s3://udacity-ml-workflow/train/minibike_s_002146.png\n", + "upload: train/minibike_s_002186.png to s3://udacity-ml-workflow/train/minibike_s_002186.png\n", + "upload: train/minibike_s_002163.png to s3://udacity-ml-workflow/train/minibike_s_002163.png\n", + "upload: train/minibike_s_002196.png to s3://udacity-ml-workflow/train/minibike_s_002196.png\n", + "upload: train/minibike_s_002182.png to s3://udacity-ml-workflow/train/minibike_s_002182.png\n", + "upload: train/minibike_s_002084.png to s3://udacity-ml-workflow/train/minibike_s_002084.png\n", + "upload: train/minibike_s_002198.png to s3://udacity-ml-workflow/train/minibike_s_002198.png\n", + "upload: train/moped_s_000004.png to s3://udacity-ml-workflow/train/moped_s_000004.png\n", + "upload: train/minibike_s_002176.png to s3://udacity-ml-workflow/train/minibike_s_002176.png\n", + "upload: train/moped_s_000021.png to s3://udacity-ml-workflow/train/moped_s_000021.png\n", + "upload: train/moped_s_000030.png to s3://udacity-ml-workflow/train/moped_s_000030.png\n", + "upload: train/moped_s_000009.png to s3://udacity-ml-workflow/train/moped_s_000009.png\n", + "upload: train/minibike_s_002218.png to s3://udacity-ml-workflow/train/minibike_s_002218.png\n", + "upload: train/minibike_s_002194.png to s3://udacity-ml-workflow/train/minibike_s_002194.png\n", + "upload: train/moped_s_000071.png to s3://udacity-ml-workflow/train/moped_s_000071.png\n", + "upload: train/moped_s_000035.png to s3://udacity-ml-workflow/train/moped_s_000035.png\n", + "upload: train/moped_s_000034.png to s3://udacity-ml-workflow/train/moped_s_000034.png\n", + "upload: train/moped_s_000124.png to s3://udacity-ml-workflow/train/moped_s_000124.png\n", + "upload: train/moped_s_000065.png to s3://udacity-ml-workflow/train/moped_s_000065.png\n", + "upload: train/moped_s_000135.png to s3://udacity-ml-workflow/train/moped_s_000135.png\n", + "upload: train/moped_s_000044.png to s3://udacity-ml-workflow/train/moped_s_000044.png\n", + "upload: train/moped_s_000119.png to s3://udacity-ml-workflow/train/moped_s_000119.png\n", + "upload: train/motorbike_s_000009.png to s3://udacity-ml-workflow/train/motorbike_s_000009.png\n", + "upload: train/motorbike_s_000022.png to s3://udacity-ml-workflow/train/motorbike_s_000022.png\n", + "upload: train/moped_s_000168.png to s3://udacity-ml-workflow/train/moped_s_000168.png\n", + "upload: train/moped_s_000169.png to s3://udacity-ml-workflow/train/moped_s_000169.png\n", + "upload: train/moped_s_000237.png to s3://udacity-ml-workflow/train/moped_s_000237.png\n", + "upload: train/motorbike_s_000035.png to s3://udacity-ml-workflow/train/motorbike_s_000035.png\n", + "upload: train/motorbike_s_000021.png to s3://udacity-ml-workflow/train/motorbike_s_000021.png\n", + "upload: train/motorbike_s_000041.png to s3://udacity-ml-workflow/train/motorbike_s_000041.png\n", + "upload: train/motorbike_s_000106.png to s3://udacity-ml-workflow/train/motorbike_s_000106.png\n", + "upload: train/motorbike_s_000060.png to s3://udacity-ml-workflow/train/motorbike_s_000060.png\n", + "upload: train/motorbike_s_000058.png to s3://udacity-ml-workflow/train/motorbike_s_000058.png\n", + "upload: train/motorbike_s_000117.png to s3://udacity-ml-workflow/train/motorbike_s_000117.png\n", + "upload: train/motorbike_s_000124.png to s3://udacity-ml-workflow/train/motorbike_s_000124.png\n", + "upload: train/motorbike_s_000068.png to s3://udacity-ml-workflow/train/motorbike_s_000068.png\n", + "upload: train/motorbike_s_000134.png to s3://udacity-ml-workflow/train/motorbike_s_000134.png\n", + "upload: train/motorbike_s_000115.png to s3://udacity-ml-workflow/train/motorbike_s_000115.png\n", + "upload: train/motorbike_s_000141.png to s3://udacity-ml-workflow/train/motorbike_s_000141.png\n", + "upload: train/moped_s_000236.png to s3://udacity-ml-workflow/train/moped_s_000236.png\n", + "upload: train/motorbike_s_000172.png to s3://udacity-ml-workflow/train/motorbike_s_000172.png\n", + "upload: train/motorbike_s_000308.png to s3://udacity-ml-workflow/train/motorbike_s_000308.png\n", + "upload: train/motorbike_s_000062.png to s3://udacity-ml-workflow/train/motorbike_s_000062.png\n", + "upload: train/motorbike_s_000225.png to s3://udacity-ml-workflow/train/motorbike_s_000225.png\n", + "upload: train/motorbike_s_000254.png to s3://udacity-ml-workflow/train/motorbike_s_000254.png\n", + "upload: train/motorbike_s_000346.png to s3://udacity-ml-workflow/train/motorbike_s_000346.png\n", + "upload: train/motorbike_s_000331.png to s3://udacity-ml-workflow/train/motorbike_s_000331.png\n", + "upload: train/motorbike_s_000119.png to s3://udacity-ml-workflow/train/motorbike_s_000119.png\n", + "upload: train/motorbike_s_000223.png to s3://udacity-ml-workflow/train/motorbike_s_000223.png\n", + "upload: train/motorbike_s_000221.png to s3://udacity-ml-workflow/train/motorbike_s_000221.png\n", + "upload: train/motorbike_s_000361.png to s3://udacity-ml-workflow/train/motorbike_s_000361.png\n", + "upload: train/motorbike_s_000501.png to s3://udacity-ml-workflow/train/motorbike_s_000501.png\n", + "upload: train/motorbike_s_000362.png to s3://udacity-ml-workflow/train/motorbike_s_000362.png\n", + "upload: train/motorbike_s_000449.png to s3://udacity-ml-workflow/train/motorbike_s_000449.png\n", + "upload: train/motorcycle_s_000001.png to s3://udacity-ml-workflow/train/motorcycle_s_000001.png\n", + "upload: train/motorbike_s_000541.png to s3://udacity-ml-workflow/train/motorbike_s_000541.png\n", + "upload: train/motorbike_s_000463.png to s3://udacity-ml-workflow/train/motorbike_s_000463.png\n", + "upload: train/motorbike_s_000578.png to s3://udacity-ml-workflow/train/motorbike_s_000578.png\n", + "upload: train/motorbike_s_000534.png to s3://udacity-ml-workflow/train/motorbike_s_000534.png\n", + "upload: train/motorcycle_s_000003.png to s3://udacity-ml-workflow/train/motorcycle_s_000003.png\n", + "upload: train/motorcycle_s_000009.png to s3://udacity-ml-workflow/train/motorcycle_s_000009.png\n", + "upload: train/motorbike_s_000427.png to s3://udacity-ml-workflow/train/motorbike_s_000427.png\n", + "upload: train/motorcycle_s_000022.png to s3://udacity-ml-workflow/train/motorcycle_s_000022.png\n", + "upload: train/motorcycle_s_000025.png to s3://udacity-ml-workflow/train/motorcycle_s_000025.png\n", + "upload: train/motorcycle_s_000002.png to s3://udacity-ml-workflow/train/motorcycle_s_000002.png\n", + "upload: train/motorcycle_s_000004.png to s3://udacity-ml-workflow/train/motorcycle_s_000004.png\n", + "upload: train/motorcycle_s_000027.png to s3://udacity-ml-workflow/train/motorcycle_s_000027.png\n", + "upload: train/motorcycle_s_000032.png to s3://udacity-ml-workflow/train/motorcycle_s_000032.png\n", + "upload: train/motorcycle_s_000050.png to s3://udacity-ml-workflow/train/motorcycle_s_000050.png\n", + "upload: train/motorcycle_s_000072.png to s3://udacity-ml-workflow/train/motorcycle_s_000072.png\n", + "upload: train/motorcycle_s_000127.png to s3://udacity-ml-workflow/train/motorcycle_s_000127.png\n", + "upload: train/motorcycle_s_000126.png to s3://udacity-ml-workflow/train/motorcycle_s_000126.png\n", + "upload: train/motorcycle_s_000070.png to s3://udacity-ml-workflow/train/motorcycle_s_000070.png\n", + "upload: train/motorcycle_s_000076.png to s3://udacity-ml-workflow/train/motorcycle_s_000076.png\n", + "upload: train/motorcycle_s_000120.png to s3://udacity-ml-workflow/train/motorcycle_s_000120.png\n", + "upload: train/motorcycle_s_000136.png to s3://udacity-ml-workflow/train/motorcycle_s_000136.png\n", + "upload: train/motorcycle_s_000026.png to s3://udacity-ml-workflow/train/motorcycle_s_000026.png\n", + "upload: train/motorcycle_s_000154.png to s3://udacity-ml-workflow/train/motorcycle_s_000154.png\n", + "upload: train/motorcycle_s_000133.png to s3://udacity-ml-workflow/train/motorcycle_s_000133.png\n", + "upload: train/motorcycle_s_000029.png to s3://udacity-ml-workflow/train/motorcycle_s_000029.png\n", + "upload: train/motorcycle_s_000074.png to s3://udacity-ml-workflow/train/motorcycle_s_000074.png\n", + "upload: train/motorcycle_s_000169.png to s3://udacity-ml-workflow/train/motorcycle_s_000169.png\n", + "upload: train/motorcycle_s_000146.png to s3://udacity-ml-workflow/train/motorcycle_s_000146.png\n", + "upload: train/motorcycle_s_000170.png to s3://udacity-ml-workflow/train/motorcycle_s_000170.png\n", + "upload: train/motorcycle_s_000216.png to s3://udacity-ml-workflow/train/motorcycle_s_000216.png\n", + "upload: train/motorcycle_s_000220.png to s3://udacity-ml-workflow/train/motorcycle_s_000220.png\n", + "upload: train/motorcycle_s_000223.png to s3://udacity-ml-workflow/train/motorcycle_s_000223.png\n", + "upload: train/motorcycle_s_000144.png to s3://udacity-ml-workflow/train/motorcycle_s_000144.png\n", + "upload: train/motorcycle_s_000207.png to s3://udacity-ml-workflow/train/motorcycle_s_000207.png\n", + "upload: train/motorcycle_s_000217.png to s3://udacity-ml-workflow/train/motorcycle_s_000217.png\n", + "upload: train/motorcycle_s_000167.png to s3://udacity-ml-workflow/train/motorcycle_s_000167.png\n", + "upload: train/motorcycle_s_000151.png to s3://udacity-ml-workflow/train/motorcycle_s_000151.png\n", + "upload: train/motorcycle_s_000249.png to s3://udacity-ml-workflow/train/motorcycle_s_000249.png\n", + "upload: train/motorcycle_s_000219.png to s3://udacity-ml-workflow/train/motorcycle_s_000219.png\n", + "upload: train/motorcycle_s_000246.png to s3://udacity-ml-workflow/train/motorcycle_s_000246.png\n", + "upload: train/motorcycle_s_000242.png to s3://udacity-ml-workflow/train/motorcycle_s_000242.png\n", + "upload: train/motorcycle_s_000245.png to s3://udacity-ml-workflow/train/motorcycle_s_000245.png\n", + "upload: train/motorcycle_s_000252.png to s3://udacity-ml-workflow/train/motorcycle_s_000252.png\n", + "upload: train/motorcycle_s_000256.png to s3://udacity-ml-workflow/train/motorcycle_s_000256.png\n", + "upload: train/motorcycle_s_000253.png to s3://udacity-ml-workflow/train/motorcycle_s_000253.png\n", + "upload: train/motorcycle_s_000277.png to s3://udacity-ml-workflow/train/motorcycle_s_000277.png\n", + "upload: train/motorcycle_s_000284.png to s3://udacity-ml-workflow/train/motorcycle_s_000284.png\n", + "upload: train/motorcycle_s_000291.png to s3://udacity-ml-workflow/train/motorcycle_s_000291.png\n", + "upload: train/motorcycle_s_000309.png to s3://udacity-ml-workflow/train/motorcycle_s_000309.png\n", + "upload: train/motorcycle_s_000300.png to s3://udacity-ml-workflow/train/motorcycle_s_000300.png\n", + "upload: train/motorcycle_s_000221.png to s3://udacity-ml-workflow/train/motorcycle_s_000221.png\n", + "upload: train/motorcycle_s_000312.png to s3://udacity-ml-workflow/train/motorcycle_s_000312.png\n", + "upload: train/motorcycle_s_000262.png to s3://udacity-ml-workflow/train/motorcycle_s_000262.png\n", + "upload: train/motorcycle_s_000304.png to s3://udacity-ml-workflow/train/motorcycle_s_000304.png\n", + "upload: train/motorcycle_s_000319.png to s3://udacity-ml-workflow/train/motorcycle_s_000319.png\n", + "upload: train/motorcycle_s_000332.png to s3://udacity-ml-workflow/train/motorcycle_s_000332.png\n", + "upload: train/motorcycle_s_000290.png to s3://udacity-ml-workflow/train/motorcycle_s_000290.png\n", + "upload: train/motorcycle_s_000325.png to s3://udacity-ml-workflow/train/motorcycle_s_000325.png\n", + "upload: train/motorcycle_s_000339.png to s3://udacity-ml-workflow/train/motorcycle_s_000339.png\n", + "upload: train/motorcycle_s_000340.png to s3://udacity-ml-workflow/train/motorcycle_s_000340.png\n", + "upload: train/motorcycle_s_000346.png to s3://udacity-ml-workflow/train/motorcycle_s_000346.png\n", + "upload: train/motorcycle_s_000320.png to s3://udacity-ml-workflow/train/motorcycle_s_000320.png\n", + "upload: train/motorcycle_s_000417.png to s3://udacity-ml-workflow/train/motorcycle_s_000417.png\n", + "upload: train/motorcycle_s_000353.png to s3://udacity-ml-workflow/train/motorcycle_s_000353.png\n", + "upload: train/motorcycle_s_000422.png to s3://udacity-ml-workflow/train/motorcycle_s_000422.png\n", + "upload: train/motorcycle_s_000423.png to s3://udacity-ml-workflow/train/motorcycle_s_000423.png\n", + "upload: train/motorcycle_s_000407.png to s3://udacity-ml-workflow/train/motorcycle_s_000407.png\n", + "upload: train/motorcycle_s_000432.png to s3://udacity-ml-workflow/train/motorcycle_s_000432.png\n", + "upload: train/motorcycle_s_000418.png to s3://udacity-ml-workflow/train/motorcycle_s_000418.png\n", + "upload: train/motorcycle_s_000430.png to s3://udacity-ml-workflow/train/motorcycle_s_000430.png\n", + "upload: train/motorcycle_s_000431.png to s3://udacity-ml-workflow/train/motorcycle_s_000431.png\n", + "upload: train/motorcycle_s_000447.png to s3://udacity-ml-workflow/train/motorcycle_s_000447.png\n", + "upload: train/motorcycle_s_000440.png to s3://udacity-ml-workflow/train/motorcycle_s_000440.png\n", + "upload: train/motorcycle_s_000347.png to s3://udacity-ml-workflow/train/motorcycle_s_000347.png\n", + "upload: train/motorcycle_s_000454.png to s3://udacity-ml-workflow/train/motorcycle_s_000454.png\n", + "upload: train/motorcycle_s_000451.png to s3://udacity-ml-workflow/train/motorcycle_s_000451.png\n", + "upload: train/motorcycle_s_000508.png to s3://udacity-ml-workflow/train/motorcycle_s_000508.png\n", + "upload: train/motorcycle_s_000459.png to s3://udacity-ml-workflow/train/motorcycle_s_000459.png\n", + "upload: train/motorcycle_s_000542.png to s3://udacity-ml-workflow/train/motorcycle_s_000542.png\n", + "upload: train/motorcycle_s_000521.png to s3://udacity-ml-workflow/train/motorcycle_s_000521.png\n", + "upload: train/motorcycle_s_000456.png to s3://udacity-ml-workflow/train/motorcycle_s_000456.png\n", + "upload: train/motorcycle_s_000580.png to s3://udacity-ml-workflow/train/motorcycle_s_000580.png\n", + "upload: train/motorcycle_s_000517.png to s3://udacity-ml-workflow/train/motorcycle_s_000517.png\n", + "upload: train/motorcycle_s_000585.png to s3://udacity-ml-workflow/train/motorcycle_s_000585.png\n", + "upload: train/motorcycle_s_000594.png to s3://udacity-ml-workflow/train/motorcycle_s_000594.png\n", + "upload: train/motorcycle_s_000545.png to s3://udacity-ml-workflow/train/motorcycle_s_000545.png\n", + "upload: train/motorcycle_s_000486.png to s3://udacity-ml-workflow/train/motorcycle_s_000486.png\n", + "upload: train/motorcycle_s_000622.png to s3://udacity-ml-workflow/train/motorcycle_s_000622.png\n", + "upload: train/motorcycle_s_000617.png to s3://udacity-ml-workflow/train/motorcycle_s_000617.png\n", + "upload: train/motorcycle_s_000654.png to s3://udacity-ml-workflow/train/motorcycle_s_000654.png\n", + "upload: train/motorcycle_s_000629.png to s3://udacity-ml-workflow/train/motorcycle_s_000629.png\n", + "upload: train/motorcycle_s_000605.png to s3://udacity-ml-workflow/train/motorcycle_s_000605.png\n", + "upload: train/motorcycle_s_000687.png to s3://udacity-ml-workflow/train/motorcycle_s_000687.png\n", + "upload: train/motorcycle_s_000686.png to s3://udacity-ml-workflow/train/motorcycle_s_000686.png\n", + "upload: train/motorcycle_s_000695.png to s3://udacity-ml-workflow/train/motorcycle_s_000695.png\n", + "upload: train/motorcycle_s_000543.png to s3://udacity-ml-workflow/train/motorcycle_s_000543.png\n", + "upload: train/motorcycle_s_000593.png to s3://udacity-ml-workflow/train/motorcycle_s_000593.png\n", + "upload: train/motorcycle_s_000496.png to s3://udacity-ml-workflow/train/motorcycle_s_000496.png\n", + "upload: train/motorcycle_s_000669.png to s3://udacity-ml-workflow/train/motorcycle_s_000669.png\n", + "upload: train/motorcycle_s_000696.png to s3://udacity-ml-workflow/train/motorcycle_s_000696.png\n", + "upload: train/motorcycle_s_000714.png to s3://udacity-ml-workflow/train/motorcycle_s_000714.png\n", + "upload: train/motorcycle_s_000724.png to s3://udacity-ml-workflow/train/motorcycle_s_000724.png\n", + "upload: train/motorcycle_s_000698.png to s3://udacity-ml-workflow/train/motorcycle_s_000698.png\n", + "upload: train/motorcycle_s_000713.png to s3://udacity-ml-workflow/train/motorcycle_s_000713.png\n", + "upload: train/motorcycle_s_000772.png to s3://udacity-ml-workflow/train/motorcycle_s_000772.png\n", + "upload: train/motorcycle_s_000699.png to s3://udacity-ml-workflow/train/motorcycle_s_000699.png\n", + "upload: train/motorcycle_s_000776.png to s3://udacity-ml-workflow/train/motorcycle_s_000776.png\n", + "upload: train/motorcycle_s_000741.png to s3://udacity-ml-workflow/train/motorcycle_s_000741.png\n", + "upload: train/motorcycle_s_000700.png to s3://udacity-ml-workflow/train/motorcycle_s_000700.png\n", + "upload: train/motorcycle_s_000734.png to s3://udacity-ml-workflow/train/motorcycle_s_000734.png\n", + "upload: train/motorcycle_s_000732.png to s3://udacity-ml-workflow/train/motorcycle_s_000732.png\n", + "upload: train/motorcycle_s_000787.png to s3://udacity-ml-workflow/train/motorcycle_s_000787.png\n", + "upload: train/motorcycle_s_000792.png to s3://udacity-ml-workflow/train/motorcycle_s_000792.png\n", + "upload: train/motorcycle_s_000791.png to s3://udacity-ml-workflow/train/motorcycle_s_000791.png\n", + "upload: train/motorcycle_s_000785.png to s3://udacity-ml-workflow/train/motorcycle_s_000785.png\n", + "upload: train/motorcycle_s_000796.png to s3://udacity-ml-workflow/train/motorcycle_s_000796.png\n", + "upload: train/motorcycle_s_000807.png to s3://udacity-ml-workflow/train/motorcycle_s_000807.png\n", + "upload: train/motorcycle_s_000894.png to s3://udacity-ml-workflow/train/motorcycle_s_000894.png\n", + "upload: train/motorcycle_s_000790.png to s3://udacity-ml-workflow/train/motorcycle_s_000790.png\n", + "upload: train/motorcycle_s_000887.png to s3://udacity-ml-workflow/train/motorcycle_s_000887.png\n", + "upload: train/motorcycle_s_000917.png to s3://udacity-ml-workflow/train/motorcycle_s_000917.png\n", + "upload: train/motorcycle_s_000919.png to s3://udacity-ml-workflow/train/motorcycle_s_000919.png\n", + "upload: train/motorcycle_s_000924.png to s3://udacity-ml-workflow/train/motorcycle_s_000924.png\n", + "upload: train/motorcycle_s_000834.png to s3://udacity-ml-workflow/train/motorcycle_s_000834.png\n", + "upload: train/motorcycle_s_000928.png to s3://udacity-ml-workflow/train/motorcycle_s_000928.png\n", + "upload: train/motorcycle_s_000925.png to s3://udacity-ml-workflow/train/motorcycle_s_000925.png\n", + "upload: train/motorcycle_s_000938.png to s3://udacity-ml-workflow/train/motorcycle_s_000938.png\n", + "upload: train/motorcycle_s_000941.png to s3://udacity-ml-workflow/train/motorcycle_s_000941.png\n", + "upload: train/motorcycle_s_000978.png to s3://udacity-ml-workflow/train/motorcycle_s_000978.png\n", + "upload: train/motorcycle_s_000979.png to s3://udacity-ml-workflow/train/motorcycle_s_000979.png\n", + "upload: train/motorcycle_s_000991.png to s3://udacity-ml-workflow/train/motorcycle_s_000991.png\n", + "upload: train/motorcycle_s_001012.png to s3://udacity-ml-workflow/train/motorcycle_s_001012.png\n", + "upload: train/motorcycle_s_001017.png to s3://udacity-ml-workflow/train/motorcycle_s_001017.png\n", + "upload: train/motorcycle_s_000922.png to s3://udacity-ml-workflow/train/motorcycle_s_000922.png\n", + "upload: train/motorcycle_s_001106.png to s3://udacity-ml-workflow/train/motorcycle_s_001106.png\n", + "upload: train/motorcycle_s_000989.png to s3://udacity-ml-workflow/train/motorcycle_s_000989.png\n", + "upload: train/motorcycle_s_001027.png to s3://udacity-ml-workflow/train/motorcycle_s_001027.png\n", + "upload: train/motorcycle_s_001063.png to s3://udacity-ml-workflow/train/motorcycle_s_001063.png\n", + "upload: train/motorcycle_s_000923.png to s3://udacity-ml-workflow/train/motorcycle_s_000923.png\n", + "upload: train/motorcycle_s_001118.png to s3://udacity-ml-workflow/train/motorcycle_s_001118.png\n", + "upload: train/motorcycle_s_000933.png to s3://udacity-ml-workflow/train/motorcycle_s_000933.png\n", + "upload: train/motorcycle_s_001016.png to s3://udacity-ml-workflow/train/motorcycle_s_001016.png\n", + "upload: train/motorcycle_s_001033.png to s3://udacity-ml-workflow/train/motorcycle_s_001033.png\n", + "upload: train/motorcycle_s_001064.png to s3://udacity-ml-workflow/train/motorcycle_s_001064.png\n", + "upload: train/motorcycle_s_001119.png to s3://udacity-ml-workflow/train/motorcycle_s_001119.png\n", + "upload: train/motorcycle_s_001167.png to s3://udacity-ml-workflow/train/motorcycle_s_001167.png\n", + "upload: train/motorcycle_s_001176.png to s3://udacity-ml-workflow/train/motorcycle_s_001176.png\n", + "upload: train/motorcycle_s_001183.png to s3://udacity-ml-workflow/train/motorcycle_s_001183.png\n", + "upload: train/motorcycle_s_001126.png to s3://udacity-ml-workflow/train/motorcycle_s_001126.png\n", + "upload: train/motorcycle_s_001205.png to s3://udacity-ml-workflow/train/motorcycle_s_001205.png\n", + "upload: train/motorcycle_s_001180.png to s3://udacity-ml-workflow/train/motorcycle_s_001180.png\n", + "upload: train/motorcycle_s_001181.png to s3://udacity-ml-workflow/train/motorcycle_s_001181.png\n", + "upload: train/motorcycle_s_001196.png to s3://udacity-ml-workflow/train/motorcycle_s_001196.png\n", + "upload: train/motorcycle_s_001209.png to s3://udacity-ml-workflow/train/motorcycle_s_001209.png\n", + "upload: train/motorcycle_s_001182.png to s3://udacity-ml-workflow/train/motorcycle_s_001182.png\n", + "upload: train/motorcycle_s_001215.png to s3://udacity-ml-workflow/train/motorcycle_s_001215.png\n", + "upload: train/motorcycle_s_001197.png to s3://udacity-ml-workflow/train/motorcycle_s_001197.png\n", + "upload: train/motorcycle_s_001236.png to s3://udacity-ml-workflow/train/motorcycle_s_001236.png\n", + "upload: train/motorcycle_s_001237.png to s3://udacity-ml-workflow/train/motorcycle_s_001237.png\n", + "upload: train/motorcycle_s_001238.png to s3://udacity-ml-workflow/train/motorcycle_s_001238.png\n", + "upload: train/motorcycle_s_001220.png to s3://udacity-ml-workflow/train/motorcycle_s_001220.png\n", + "upload: train/motorcycle_s_001246.png to s3://udacity-ml-workflow/train/motorcycle_s_001246.png\n", + "upload: train/motorcycle_s_001213.png to s3://udacity-ml-workflow/train/motorcycle_s_001213.png\n", + "upload: train/motorcycle_s_001242.png to s3://udacity-ml-workflow/train/motorcycle_s_001242.png\n", + "upload: train/motorcycle_s_001244.png to s3://udacity-ml-workflow/train/motorcycle_s_001244.png\n", + "upload: train/motorcycle_s_001247.png to s3://udacity-ml-workflow/train/motorcycle_s_001247.png\n", + "upload: train/motorcycle_s_001273.png to s3://udacity-ml-workflow/train/motorcycle_s_001273.png\n", + "upload: train/motorcycle_s_001287.png to s3://udacity-ml-workflow/train/motorcycle_s_001287.png\n", + "upload: train/motorcycle_s_001303.png to s3://udacity-ml-workflow/train/motorcycle_s_001303.png\n", + "upload: train/motorcycle_s_001297.png to s3://udacity-ml-workflow/train/motorcycle_s_001297.png\n", + "upload: train/motorcycle_s_001315.png to s3://udacity-ml-workflow/train/motorcycle_s_001315.png\n", + "upload: train/motorcycle_s_001326.png to s3://udacity-ml-workflow/train/motorcycle_s_001326.png\n", + "upload: train/motorcycle_s_001263.png to s3://udacity-ml-workflow/train/motorcycle_s_001263.png\n", + "upload: train/motorcycle_s_001337.png to s3://udacity-ml-workflow/train/motorcycle_s_001337.png\n", + "upload: train/motorcycle_s_001360.png to s3://udacity-ml-workflow/train/motorcycle_s_001360.png\n", + "upload: train/motorcycle_s_001370.png to s3://udacity-ml-workflow/train/motorcycle_s_001370.png\n", + "upload: train/motorcycle_s_001368.png to s3://udacity-ml-workflow/train/motorcycle_s_001368.png\n", + "upload: train/motorcycle_s_001363.png to s3://udacity-ml-workflow/train/motorcycle_s_001363.png\n", + "upload: train/motorcycle_s_001400.png to s3://udacity-ml-workflow/train/motorcycle_s_001400.png\n", + "upload: train/motorcycle_s_001397.png to s3://udacity-ml-workflow/train/motorcycle_s_001397.png\n", + "upload: train/motorcycle_s_001407.png to s3://udacity-ml-workflow/train/motorcycle_s_001407.png\n", + "upload: train/motorcycle_s_001319.png to s3://udacity-ml-workflow/train/motorcycle_s_001319.png\n", + "upload: train/motorcycle_s_001392.png to s3://udacity-ml-workflow/train/motorcycle_s_001392.png\n", + "upload: train/motorcycle_s_001384.png to s3://udacity-ml-workflow/train/motorcycle_s_001384.png\n", + "upload: train/motorcycle_s_001435.png to s3://udacity-ml-workflow/train/motorcycle_s_001435.png\n", + "upload: train/motorcycle_s_001413.png to s3://udacity-ml-workflow/train/motorcycle_s_001413.png\n", + "upload: train/motorcycle_s_001453.png to s3://udacity-ml-workflow/train/motorcycle_s_001453.png\n", + "upload: train/motorcycle_s_001402.png to s3://udacity-ml-workflow/train/motorcycle_s_001402.png\n", + "upload: train/motorcycle_s_001492.png to s3://udacity-ml-workflow/train/motorcycle_s_001492.png\n", + "upload: train/motorcycle_s_001507.png to s3://udacity-ml-workflow/train/motorcycle_s_001507.png\n", + "upload: train/motorcycle_s_001438.png to s3://udacity-ml-workflow/train/motorcycle_s_001438.png\n", + "upload: train/motorcycle_s_001520.png to s3://udacity-ml-workflow/train/motorcycle_s_001520.png\n", + "upload: train/motorcycle_s_001409.png to s3://udacity-ml-workflow/train/motorcycle_s_001409.png\n", + "upload: train/motorcycle_s_001549.png to s3://udacity-ml-workflow/train/motorcycle_s_001549.png\n", + "upload: train/motorcycle_s_001527.png to s3://udacity-ml-workflow/train/motorcycle_s_001527.png\n", + "upload: train/motorcycle_s_001563.png to s3://udacity-ml-workflow/train/motorcycle_s_001563.png\n", + "upload: train/motorcycle_s_001439.png to s3://udacity-ml-workflow/train/motorcycle_s_001439.png\n", + "upload: train/motorcycle_s_001536.png to s3://udacity-ml-workflow/train/motorcycle_s_001536.png\n", + "upload: train/motorcycle_s_001585.png to s3://udacity-ml-workflow/train/motorcycle_s_001585.png\n", + "upload: train/motorcycle_s_001587.png to s3://udacity-ml-workflow/train/motorcycle_s_001587.png\n", + "upload: train/motorcycle_s_001584.png to s3://udacity-ml-workflow/train/motorcycle_s_001584.png\n", + "upload: train/motorcycle_s_001565.png to s3://udacity-ml-workflow/train/motorcycle_s_001565.png\n", + "upload: train/motorcycle_s_001580.png to s3://udacity-ml-workflow/train/motorcycle_s_001580.png\n", + "upload: train/motorcycle_s_001641.png to s3://udacity-ml-workflow/train/motorcycle_s_001641.png\n", + "upload: train/motorcycle_s_001623.png to s3://udacity-ml-workflow/train/motorcycle_s_001623.png\n", + "upload: train/motorcycle_s_001622.png to s3://udacity-ml-workflow/train/motorcycle_s_001622.png\n", + "upload: train/motorcycle_s_001690.png to s3://udacity-ml-workflow/train/motorcycle_s_001690.png\n", + "upload: train/motorcycle_s_001611.png to s3://udacity-ml-workflow/train/motorcycle_s_001611.png\n", + "upload: train/motorcycle_s_001686.png to s3://udacity-ml-workflow/train/motorcycle_s_001686.png\n", + "upload: train/motorcycle_s_001699.png to s3://udacity-ml-workflow/train/motorcycle_s_001699.png\n", + "upload: train/motorcycle_s_001707.png to s3://udacity-ml-workflow/train/motorcycle_s_001707.png\n", + "upload: train/motorcycle_s_001695.png to s3://udacity-ml-workflow/train/motorcycle_s_001695.png\n", + "upload: train/motorcycle_s_001709.png to s3://udacity-ml-workflow/train/motorcycle_s_001709.png\n", + "upload: train/motorcycle_s_001696.png to s3://udacity-ml-workflow/train/motorcycle_s_001696.png\n", + "upload: train/motorcycle_s_001610.png to s3://udacity-ml-workflow/train/motorcycle_s_001610.png\n", + "upload: train/motorcycle_s_001711.png to s3://udacity-ml-workflow/train/motorcycle_s_001711.png\n", + "upload: train/motorcycle_s_001706.png to s3://udacity-ml-workflow/train/motorcycle_s_001706.png\n", + "upload: train/motorcycle_s_001714.png to s3://udacity-ml-workflow/train/motorcycle_s_001714.png\n", + "upload: train/motorcycle_s_001693.png to s3://udacity-ml-workflow/train/motorcycle_s_001693.png\n", + "upload: train/motorcycle_s_001715.png to s3://udacity-ml-workflow/train/motorcycle_s_001715.png\n", + "upload: train/motorcycle_s_001784.png to s3://udacity-ml-workflow/train/motorcycle_s_001784.png\n", + "upload: train/motorcycle_s_001765.png to s3://udacity-ml-workflow/train/motorcycle_s_001765.png\n", + "upload: train/motorcycle_s_001767.png to s3://udacity-ml-workflow/train/motorcycle_s_001767.png\n", + "upload: train/motorcycle_s_001710.png to s3://udacity-ml-workflow/train/motorcycle_s_001710.png\n", + "upload: train/motorcycle_s_001792.png to s3://udacity-ml-workflow/train/motorcycle_s_001792.png\n", + "upload: train/motorcycle_s_001790.png to s3://udacity-ml-workflow/train/motorcycle_s_001790.png\n", + "upload: train/motorcycle_s_001753.png to s3://udacity-ml-workflow/train/motorcycle_s_001753.png\n", + "upload: train/motorcycle_s_001856.png to s3://udacity-ml-workflow/train/motorcycle_s_001856.png\n", + "upload: train/motorcycle_s_001848.png to s3://udacity-ml-workflow/train/motorcycle_s_001848.png\n", + "upload: train/motorcycle_s_001853.png to s3://udacity-ml-workflow/train/motorcycle_s_001853.png\n", + "upload: train/motorcycle_s_001778.png to s3://udacity-ml-workflow/train/motorcycle_s_001778.png\n", + "upload: train/motorcycle_s_001862.png to s3://udacity-ml-workflow/train/motorcycle_s_001862.png\n", + "upload: train/motorcycle_s_001878.png to s3://udacity-ml-workflow/train/motorcycle_s_001878.png\n", + "upload: train/motorcycle_s_001905.png to s3://udacity-ml-workflow/train/motorcycle_s_001905.png\n", + "upload: train/motorcycle_s_002031.png to s3://udacity-ml-workflow/train/motorcycle_s_002031.png\n", + "upload: train/motorcycle_s_001896.png to s3://udacity-ml-workflow/train/motorcycle_s_001896.png\n", + "upload: train/motorcycle_s_001973.png to s3://udacity-ml-workflow/train/motorcycle_s_001973.png\n", + "upload: train/motorcycle_s_001920.png to s3://udacity-ml-workflow/train/motorcycle_s_001920.png\n", + "upload: train/motorcycle_s_002030.png to s3://udacity-ml-workflow/train/motorcycle_s_002030.png\n", + "upload: train/motorcycle_s_002067.png to s3://udacity-ml-workflow/train/motorcycle_s_002067.png\n", + "upload: train/motorcycle_s_002065.png to s3://udacity-ml-workflow/train/motorcycle_s_002065.png\n", + "upload: train/motorcycle_s_002066.png to s3://udacity-ml-workflow/train/motorcycle_s_002066.png\n", + "upload: train/motorcycle_s_002121.png to s3://udacity-ml-workflow/train/motorcycle_s_002121.png\n", + "upload: train/motorcycle_s_002143.png to s3://udacity-ml-workflow/train/motorcycle_s_002143.png\n", + "upload: train/motorcycle_s_002105.png to s3://udacity-ml-workflow/train/motorcycle_s_002105.png\n", + "upload: train/motorcycle_s_002183.png to s3://udacity-ml-workflow/train/motorcycle_s_002183.png\n", + "upload: train/motorcycle_s_002162.png to s3://udacity-ml-workflow/train/motorcycle_s_002162.png\n", + "upload: train/motorcycle_s_002153.png to s3://udacity-ml-workflow/train/motorcycle_s_002153.png\n", + "upload: train/motorcycle_s_002192.png to s3://udacity-ml-workflow/train/motorcycle_s_002192.png\n", + "upload: train/motorcycle_s_002197.png to s3://udacity-ml-workflow/train/motorcycle_s_002197.png\n", + "upload: train/motorcycle_s_002215.png to s3://udacity-ml-workflow/train/motorcycle_s_002215.png\n", + "upload: train/motorcycle_s_002214.png to s3://udacity-ml-workflow/train/motorcycle_s_002214.png\n", + "upload: train/motorcycle_s_002193.png to s3://udacity-ml-workflow/train/motorcycle_s_002193.png\n", + "upload: train/motorcycle_s_002221.png to s3://udacity-ml-workflow/train/motorcycle_s_002221.png\n", + "upload: train/motorcycle_s_002140.png to s3://udacity-ml-workflow/train/motorcycle_s_002140.png\n", + "upload: train/motorcycle_s_002225.png to s3://udacity-ml-workflow/train/motorcycle_s_002225.png\n", + "upload: train/motorcycle_s_002222.png to s3://udacity-ml-workflow/train/motorcycle_s_002222.png\n", + "upload: train/motorcycle_s_002237.png to s3://udacity-ml-workflow/train/motorcycle_s_002237.png\n", + "upload: train/motorcycle_s_002236.png to s3://udacity-ml-workflow/train/motorcycle_s_002236.png\n", + "upload: train/motorcycle_s_002234.png to s3://udacity-ml-workflow/train/motorcycle_s_002234.png\n", + "upload: train/motorcycle_s_002254.png to s3://udacity-ml-workflow/train/motorcycle_s_002254.png\n", + "upload: train/motorcycle_s_002316.png to s3://udacity-ml-workflow/train/motorcycle_s_002316.png\n", + "upload: train/ordinary_bicycle_s_000008.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000008.png\n", + "upload: train/motorcycle_s_002298.png to s3://udacity-ml-workflow/train/motorcycle_s_002298.png\n", + "upload: train/motorcycle_s_002275.png to s3://udacity-ml-workflow/train/motorcycle_s_002275.png\n", + "upload: train/motorcycle_s_002271.png to s3://udacity-ml-workflow/train/motorcycle_s_002271.png\n", + "upload: train/motorcycle_s_002291.png to s3://udacity-ml-workflow/train/motorcycle_s_002291.png\n", + "upload: train/motorcycle_s_002317.png to s3://udacity-ml-workflow/train/motorcycle_s_002317.png\n", + "upload: train/ordinary_bicycle_s_000022.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000022.png\n", + "upload: train/ordinary_bicycle_s_000031.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000031.png\n", + "upload: train/ordinary_bicycle_s_000016.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000016.png\n", + "upload: train/ordinary_bicycle_s_000023.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000023.png\n", + "upload: train/ordinary_bicycle_s_000029.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000029.png\n", + "upload: train/ordinary_bicycle_s_000049.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000049.png\n", + "upload: train/ordinary_bicycle_s_000011.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000011.png\n", + "upload: train/ordinary_bicycle_s_000035.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000035.png\n", + "upload: train/ordinary_bicycle_s_000056.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000056.png\n", + "upload: train/ordinary_bicycle_s_000060.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000060.png\n", + "upload: train/ordinary_bicycle_s_000097.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000097.png\n", + "upload: train/ordinary_bicycle_s_000066.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000066.png\n", + "upload: train/ordinary_bicycle_s_000095.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000095.png\n", + "upload: train/ordinary_bicycle_s_000098.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000098.png\n", + "upload: train/ordinary_bicycle_s_000096.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000096.png\n", + "upload: train/ordinary_bicycle_s_000101.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000101.png\n", + "upload: train/ordinary_bicycle_s_000099.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000099.png\n", + "upload: train/ordinary_bicycle_s_000036.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000036.png\n", + "upload: train/ordinary_bicycle_s_000102.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000102.png\n", + "upload: train/ordinary_bicycle_s_000100.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000100.png\n", + "upload: train/ordinary_bicycle_s_000125.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000125.png\n", + "upload: train/ordinary_bicycle_s_000112.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000112.png\n", + "upload: train/ordinary_bicycle_s_000155.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000155.png\n", + "upload: train/ordinary_bicycle_s_000104.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000104.png\n", + "upload: train/ordinary_bicycle_s_000161.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000161.png\n", + "upload: train/ordinary_bicycle_s_000167.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000167.png\n", + "upload: train/ordinary_bicycle_s_000201.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000201.png\n", + "upload: train/ordinary_bicycle_s_000154.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000154.png\n", + "upload: train/ordinary_bicycle_s_000110.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000110.png\n", + "upload: train/ordinary_bicycle_s_000216.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000216.png\n", + "upload: train/ordinary_bicycle_s_000205.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000205.png\n", + "upload: train/ordinary_bicycle_s_000218.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000218.png\n", + "upload: train/ordinary_bicycle_s_000274.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000274.png\n", + "upload: train/ordinary_bicycle_s_000277.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000277.png\n", + "upload: train/ordinary_bicycle_s_000286.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000286.png\n", + "upload: train/ordinary_bicycle_s_000280.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000280.png\n", + "upload: train/ordinary_bicycle_s_000107.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000107.png\n", + "upload: train/ordinary_bicycle_s_000265.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000265.png\n", + "upload: train/ordinary_bicycle_s_000157.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000157.png\n", + "upload: train/ordinary_bicycle_s_000308.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000308.png\n", + "upload: train/ordinary_bicycle_s_000269.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000269.png\n", + "upload: train/ordinary_bicycle_s_000297.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000297.png\n", + "upload: train/ordinary_bicycle_s_000324.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000324.png\n", + "upload: train/ordinary_bicycle_s_000355.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000355.png\n", + "upload: train/ordinary_bicycle_s_000387.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000387.png\n", + "upload: train/ordinary_bicycle_s_000432.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000432.png\n", + "upload: train/ordinary_bicycle_s_000426.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000426.png\n", + "upload: train/ordinary_bicycle_s_000298.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000298.png\n", + "upload: train/safety_bicycle_s_000019.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000019.png\n", + "upload: train/safety_bicycle_s_000079.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000079.png\n", + "upload: train/ordinary_bicycle_s_000419.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000419.png\n", + "upload: train/ordinary_bicycle_s_000451.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000451.png\n", + "upload: train/ordinary_bicycle_s_000433.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000433.png\n", + "upload: train/ordinary_bicycle_s_000347.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000347.png\n", + "upload: train/safety_bicycle_s_000092.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000092.png\n", + "upload: train/safety_bicycle_s_000140.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000140.png\n", + "upload: train/safety_bicycle_s_000162.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000162.png\n", + "upload: train/safety_bicycle_s_000167.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000167.png\n", + "upload: train/safety_bicycle_s_000193.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000193.png\n", + "upload: train/safety_bicycle_s_000207.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000207.png\n", + "upload: train/safety_bicycle_s_000239.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000239.png\n", + "upload: train/safety_bicycle_s_000233.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000233.png\n", + "upload: train/safety_bicycle_s_000261.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000261.png\n", + "upload: train/safety_bicycle_s_000125.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000125.png\n", + "upload: train/safety_bicycle_s_000196.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000196.png\n", + "upload: train/safety_bicycle_s_000296.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000296.png\n", + "upload: train/safety_bicycle_s_000322.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000322.png\n", + "upload: train/safety_bicycle_s_000232.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000232.png\n", + "upload: train/safety_bicycle_s_000373.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000373.png\n", + "upload: train/safety_bicycle_s_000255.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000255.png\n", + "upload: train/safety_bicycle_s_000425.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000425.png\n", + "upload: train/safety_bicycle_s_000303.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000303.png\n", + "upload: train/safety_bicycle_s_000532.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000532.png\n", + "upload: train/safety_bicycle_s_000427.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000427.png\n", + "upload: train/safety_bicycle_s_000533.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000533.png\n", + "upload: train/safety_bicycle_s_000348.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000348.png\n", + "upload: train/safety_bicycle_s_000324.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000324.png\n", + "upload: train/safety_bicycle_s_000500.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000500.png\n", + "upload: train/safety_bicycle_s_000660.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000660.png\n", + "upload: train/safety_bicycle_s_000760.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000760.png\n", + "upload: train/safety_bicycle_s_000789.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000789.png\n", + "upload: train/safety_bicycle_s_001026.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001026.png\n", + "upload: train/safety_bicycle_s_000655.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000655.png\n", + "upload: train/safety_bicycle_s_001028.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001028.png\n", + "upload: train/safety_bicycle_s_000568.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000568.png\n", + "upload: train/safety_bicycle_s_000728.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000728.png\n", + "upload: train/safety_bicycle_s_000860.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000860.png\n", + "upload: train/safety_bicycle_s_000359.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000359.png\n", + "upload: train/safety_bicycle_s_001029.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001029.png\n", + "upload: train/safety_bicycle_s_001049.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001049.png\n", + "upload: train/safety_bicycle_s_001085.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001085.png\n", + "upload: train/safety_bicycle_s_001202.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001202.png\n", + "upload: train/safety_bicycle_s_001063.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001063.png\n", + "upload: train/safety_bicycle_s_001109.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001109.png\n", + "upload: train/safety_bicycle_s_001254.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001254.png\n", + "upload: train/safety_bicycle_s_001320.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001320.png\n", + "upload: train/safety_bicycle_s_001303.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001303.png\n", + "upload: train/safety_bicycle_s_001327.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001327.png\n", + "upload: train/safety_bicycle_s_001381.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001381.png\n", + "upload: train/safety_bicycle_s_001570.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001570.png\n", + "upload: train/safety_bicycle_s_001253.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001253.png\n", + "upload: train/safety_bicycle_s_001639.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001639.png\n", + "upload: train/safety_bicycle_s_001113.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001113.png\n", + "upload: train/safety_bicycle_s_001651.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001651.png\n", + "upload: train/safety_bicycle_s_001243.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001243.png\n", + "upload: train/safety_bicycle_s_001608.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001608.png\n", + "upload: train/safety_bicycle_s_001699.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001699.png\n", + "upload: train/safety_bicycle_s_001705.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001705.png\n", + "upload: train/safety_bicycle_s_001240.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001240.png\n", + "upload: train/safety_bicycle_s_001659.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001659.png\n", + "upload: train/safety_bicycle_s_001706.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001706.png\n", + "upload: train/safety_bike_s_000009.png to s3://udacity-ml-workflow/train/safety_bike_s_000009.png\n", + "upload: train/safety_bike_s_000058.png to s3://udacity-ml-workflow/train/safety_bike_s_000058.png\n", + "upload: train/safety_bike_s_000079.png to s3://udacity-ml-workflow/train/safety_bike_s_000079.png\n", + "upload: train/safety_bike_s_000104.png to s3://udacity-ml-workflow/train/safety_bike_s_000104.png\n", + "upload: train/safety_bike_s_000158.png to s3://udacity-ml-workflow/train/safety_bike_s_000158.png\n", + "upload: train/safety_bike_s_000160.png to s3://udacity-ml-workflow/train/safety_bike_s_000160.png\n", + "upload: train/safety_bike_s_000100.png to s3://udacity-ml-workflow/train/safety_bike_s_000100.png\n", + "upload: train/safety_bike_s_000155.png to s3://udacity-ml-workflow/train/safety_bike_s_000155.png\n", + "upload: train/safety_bike_s_000173.png to s3://udacity-ml-workflow/train/safety_bike_s_000173.png\n", + "upload: train/safety_bike_s_000015.png to s3://udacity-ml-workflow/train/safety_bike_s_000015.png\n", + "upload: train/safety_bike_s_000054.png to s3://udacity-ml-workflow/train/safety_bike_s_000054.png\n", + "upload: train/safety_bike_s_000198.png to s3://udacity-ml-workflow/train/safety_bike_s_000198.png\n", + "upload: train/safety_bike_s_000311.png to s3://udacity-ml-workflow/train/safety_bike_s_000311.png\n", + "upload: train/safety_bike_s_000244.png to s3://udacity-ml-workflow/train/safety_bike_s_000244.png\n", + "upload: train/safety_bike_s_000245.png to s3://udacity-ml-workflow/train/safety_bike_s_000245.png\n", + "upload: train/safety_bike_s_000165.png to s3://udacity-ml-workflow/train/safety_bike_s_000165.png\n", + "upload: train/safety_bike_s_000178.png to s3://udacity-ml-workflow/train/safety_bike_s_000178.png\n", + "upload: train/safety_bike_s_000381.png to s3://udacity-ml-workflow/train/safety_bike_s_000381.png\n", + "upload: train/safety_bike_s_000328.png to s3://udacity-ml-workflow/train/safety_bike_s_000328.png\n", + "upload: train/safety_bike_s_000461.png to s3://udacity-ml-workflow/train/safety_bike_s_000461.png\n", + "upload: train/safety_bike_s_000263.png to s3://udacity-ml-workflow/train/safety_bike_s_000263.png\n", + "upload: train/safety_bike_s_000482.png to s3://udacity-ml-workflow/train/safety_bike_s_000482.png\n", + "upload: train/safety_bike_s_000567.png to s3://udacity-ml-workflow/train/safety_bike_s_000567.png\n", + "upload: train/safety_bike_s_000914.png to s3://udacity-ml-workflow/train/safety_bike_s_000914.png\n", + "upload: train/safety_bike_s_000277.png to s3://udacity-ml-workflow/train/safety_bike_s_000277.png\n", + "upload: train/safety_bike_s_000950.png to s3://udacity-ml-workflow/train/safety_bike_s_000950.png\n", + "upload: train/safety_bike_s_000848.png to s3://udacity-ml-workflow/train/safety_bike_s_000848.png\n", + "upload: train/safety_bike_s_000921.png to s3://udacity-ml-workflow/train/safety_bike_s_000921.png\n", + "upload: train/safety_bike_s_000643.png to s3://udacity-ml-workflow/train/safety_bike_s_000643.png\n", + "upload: train/safety_bike_s_000867.png to s3://udacity-ml-workflow/train/safety_bike_s_000867.png\n", + "upload: train/safety_bike_s_000830.png to s3://udacity-ml-workflow/train/safety_bike_s_000830.png\n", + "upload: train/safety_bike_s_000934.png to s3://udacity-ml-workflow/train/safety_bike_s_000934.png\n", + "upload: train/safety_bike_s_000963.png to s3://udacity-ml-workflow/train/safety_bike_s_000963.png\n", + "upload: train/safety_bike_s_001010.png to s3://udacity-ml-workflow/train/safety_bike_s_001010.png\n", + "upload: train/safety_bike_s_001148.png to s3://udacity-ml-workflow/train/safety_bike_s_001148.png\n", + "upload: train/safety_bike_s_001257.png to s3://udacity-ml-workflow/train/safety_bike_s_001257.png\n", + "upload: train/safety_bike_s_001289.png to s3://udacity-ml-workflow/train/safety_bike_s_001289.png\n", + "upload: train/safety_bike_s_001338.png to s3://udacity-ml-workflow/train/safety_bike_s_001338.png\n", + "upload: train/safety_bike_s_000984.png to s3://udacity-ml-workflow/train/safety_bike_s_000984.png\n", + "upload: train/safety_bike_s_001355.png to s3://udacity-ml-workflow/train/safety_bike_s_001355.png\n", + "upload: train/safety_bike_s_000989.png to s3://udacity-ml-workflow/train/safety_bike_s_000989.png\n", + "upload: train/safety_bike_s_001012.png to s3://udacity-ml-workflow/train/safety_bike_s_001012.png\n", + "upload: train/safety_bike_s_001560.png to s3://udacity-ml-workflow/train/safety_bike_s_001560.png\n", + "upload: train/safety_bike_s_001608.png to s3://udacity-ml-workflow/train/safety_bike_s_001608.png\n", + "upload: train/safety_bike_s_001552.png to s3://udacity-ml-workflow/train/safety_bike_s_001552.png\n", + "upload: train/safety_bike_s_001371.png to s3://udacity-ml-workflow/train/safety_bike_s_001371.png\n", + "upload: train/safety_bike_s_001465.png to s3://udacity-ml-workflow/train/safety_bike_s_001465.png\n", + "upload: train/safety_bike_s_001590.png to s3://udacity-ml-workflow/train/safety_bike_s_001590.png\n", + "upload: train/safety_bike_s_001472.png to s3://udacity-ml-workflow/train/safety_bike_s_001472.png\n", + "upload: train/safety_bike_s_001659.png to s3://udacity-ml-workflow/train/safety_bike_s_001659.png\n", + "upload: train/safety_bike_s_001784.png to s3://udacity-ml-workflow/train/safety_bike_s_001784.png\n", + "upload: train/safety_bike_s_001640.png to s3://udacity-ml-workflow/train/safety_bike_s_001640.png\n", + "upload: train/safety_bike_s_001474.png to s3://udacity-ml-workflow/train/safety_bike_s_001474.png\n", + "upload: train/safety_bike_s_001715.png to s3://udacity-ml-workflow/train/safety_bike_s_001715.png\n", + "upload: train/velocipede_s_000010.png to s3://udacity-ml-workflow/train/velocipede_s_000010.png\n", + "upload: train/velocipede_s_000021.png to s3://udacity-ml-workflow/train/velocipede_s_000021.png\n", + "upload: train/trail_bike_s_000016.png to s3://udacity-ml-workflow/train/trail_bike_s_000016.png\n", + "upload: train/velocipede_s_000265.png to s3://udacity-ml-workflow/train/velocipede_s_000265.png\n", + "upload: train/velocipede_s_000282.png to s3://udacity-ml-workflow/train/velocipede_s_000282.png\n", + "upload: train/velocipede_s_000430.png to s3://udacity-ml-workflow/train/velocipede_s_000430.png\n", + "upload: train/velocipede_s_000139.png to s3://udacity-ml-workflow/train/velocipede_s_000139.png\n", + "upload: train/velocipede_s_000049.png to s3://udacity-ml-workflow/train/velocipede_s_000049.png\n", + "upload: train/velocipede_s_000023.png to s3://udacity-ml-workflow/train/velocipede_s_000023.png\n", + "upload: train/velocipede_s_000012.png to s3://udacity-ml-workflow/train/velocipede_s_000012.png\n", + "upload: train/velocipede_s_000358.png to s3://udacity-ml-workflow/train/velocipede_s_000358.png\n", + "upload: train/velocipede_s_000586.png to s3://udacity-ml-workflow/train/velocipede_s_000586.png\n", + "upload: train/velocipede_s_000330.png to s3://udacity-ml-workflow/train/velocipede_s_000330.png\n", + "upload: train/velocipede_s_000807.png to s3://udacity-ml-workflow/train/velocipede_s_000807.png\n", + "upload: train/velocipede_s_000702.png to s3://udacity-ml-workflow/train/velocipede_s_000702.png\n", + "upload: train/velocipede_s_000825.png to s3://udacity-ml-workflow/train/velocipede_s_000825.png\n", + "upload: train/velocipede_s_000949.png to s3://udacity-ml-workflow/train/velocipede_s_000949.png\n", + "upload: train/velocipede_s_000989.png to s3://udacity-ml-workflow/train/velocipede_s_000989.png\n", + "upload: train/velocipede_s_001056.png to s3://udacity-ml-workflow/train/velocipede_s_001056.png\n", + "upload: train/velocipede_s_000670.png to s3://udacity-ml-workflow/train/velocipede_s_000670.png\n", + "upload: train/velocipede_s_001141.png to s3://udacity-ml-workflow/train/velocipede_s_001141.png\n", + "upload: train/velocipede_s_001210.png to s3://udacity-ml-workflow/train/velocipede_s_001210.png\n", + "upload: train/velocipede_s_000485.png to s3://udacity-ml-workflow/train/velocipede_s_000485.png\n", + "upload: train/velocipede_s_000931.png to s3://udacity-ml-workflow/train/velocipede_s_000931.png\n", + "upload: train/velocipede_s_001158.png to s3://udacity-ml-workflow/train/velocipede_s_001158.png\n", + "upload: train/velocipede_s_000659.png to s3://udacity-ml-workflow/train/velocipede_s_000659.png\n", + "upload: train/velocipede_s_001200.png to s3://udacity-ml-workflow/train/velocipede_s_001200.png\n", + "upload: train/velocipede_s_001225.png to s3://udacity-ml-workflow/train/velocipede_s_001225.png\n", + "upload: train/velocipede_s_001222.png to s3://udacity-ml-workflow/train/velocipede_s_001222.png\n", + "upload: train/velocipede_s_001279.png to s3://udacity-ml-workflow/train/velocipede_s_001279.png\n", + "upload: train/velocipede_s_001244.png to s3://udacity-ml-workflow/train/velocipede_s_001244.png\n", + "upload: train/velocipede_s_001298.png to s3://udacity-ml-workflow/train/velocipede_s_001298.png\n", + "upload: train/velocipede_s_001166.png to s3://udacity-ml-workflow/train/velocipede_s_001166.png\n", + "upload: train/velocipede_s_001142.png to s3://udacity-ml-workflow/train/velocipede_s_001142.png\n", + "upload: train/velocipede_s_001278.png to s3://udacity-ml-workflow/train/velocipede_s_001278.png\n", + "upload: train/velocipede_s_001489.png to s3://udacity-ml-workflow/train/velocipede_s_001489.png\n", + "upload: train/velocipede_s_001299.png to s3://udacity-ml-workflow/train/velocipede_s_001299.png\n", + "upload: train/velocipede_s_001358.png to s3://udacity-ml-workflow/train/velocipede_s_001358.png\n", + "upload: train/velocipede_s_001338.png to s3://udacity-ml-workflow/train/velocipede_s_001338.png\n", + "upload: train/velocipede_s_001637.png to s3://udacity-ml-workflow/train/velocipede_s_001637.png\n", + "upload: train/velocipede_s_001361.png to s3://udacity-ml-workflow/train/velocipede_s_001361.png\n", + "upload: train/velocipede_s_001514.png to s3://udacity-ml-workflow/train/velocipede_s_001514.png\n", + "upload: train/velocipede_s_001874.png to s3://udacity-ml-workflow/train/velocipede_s_001874.png\n", + "upload: train/velocipede_s_001880.png to s3://udacity-ml-workflow/train/velocipede_s_001880.png\n", + "upload: train/velocipede_s_001422.png to s3://udacity-ml-workflow/train/velocipede_s_001422.png\n", + "upload: train/velocipede_s_001883.png to s3://udacity-ml-workflow/train/velocipede_s_001883.png\n", + "upload: train/velocipede_s_001870.png to s3://udacity-ml-workflow/train/velocipede_s_001870.png\n", + "upload: train/velocipede_s_001872.png to s3://udacity-ml-workflow/train/velocipede_s_001872.png\n", + "upload: train/velocipede_s_001882.png to s3://udacity-ml-workflow/train/velocipede_s_001882.png\n", + "upload: train/velocipede_s_001935.png to s3://udacity-ml-workflow/train/velocipede_s_001935.png\n", + "upload: train/velocipede_s_001958.png to s3://udacity-ml-workflow/train/velocipede_s_001958.png\n", + "upload: train/velocipede_s_001585.png to s3://udacity-ml-workflow/train/velocipede_s_001585.png\n", + "upload: train/velocipede_s_001920.png to s3://udacity-ml-workflow/train/velocipede_s_001920.png\n", + "upload: train/velocipede_s_001907.png to s3://udacity-ml-workflow/train/velocipede_s_001907.png\n", + "upload: test/bicycle_s_000030.png to s3://udacity-ml-workflow/test/bicycle_s_000030.png\n", + "upload: test/bicycle_s_000977.png to s3://udacity-ml-workflow/test/bicycle_s_000977.png\n", + "upload: test/bicycle_s_000031.png to s3://udacity-ml-workflow/test/bicycle_s_000031.png\n", + "upload: test/bicycle_s_000513.png to s3://udacity-ml-workflow/test/bicycle_s_000513.png\n", + "upload: test/bicycle_s_001107.png to s3://udacity-ml-workflow/test/bicycle_s_001107.png\n", + "upload: test/bicycle_s_000776.png to s3://udacity-ml-workflow/test/bicycle_s_000776.png\n", + "upload: test/bicycle_s_000059.png to s3://udacity-ml-workflow/test/bicycle_s_000059.png\n", + "upload: test/bicycle_s_000479.png to s3://udacity-ml-workflow/test/bicycle_s_000479.png\n", + "upload: test/bicycle_s_001789.png to s3://udacity-ml-workflow/test/bicycle_s_001789.png\n", + "upload: test/bicycle_s_001047.png to s3://udacity-ml-workflow/test/bicycle_s_001047.png\n", + "upload: test/bicycle_s_001102.png to s3://udacity-ml-workflow/test/bicycle_s_001102.png\n", + "upload: test/bicycle_s_001218.png to s3://udacity-ml-workflow/test/bicycle_s_001218.png\n", + "upload: test/bicycle_s_000779.png to s3://udacity-ml-workflow/test/bicycle_s_000779.png\n", + "upload: test/bicycle_s_001804.png to s3://udacity-ml-workflow/test/bicycle_s_001804.png\n", + "upload: test/bike_s_000163.png to s3://udacity-ml-workflow/test/bike_s_000163.png \n", + "upload: test/bicycle_s_000777.png to s3://udacity-ml-workflow/test/bicycle_s_000777.png\n", + "upload: test/bicycle_s_002458.png to s3://udacity-ml-workflow/test/bicycle_s_002458.png\n", + "upload: test/bicycle_s_002735.png to s3://udacity-ml-workflow/test/bicycle_s_002735.png\n", + "upload: test/bike_s_000131.png to s3://udacity-ml-workflow/test/bike_s_000131.png \n", + "upload: test/bike_s_000041.png to s3://udacity-ml-workflow/test/bike_s_000041.png \n", + "upload: test/bike_s_000330.png to s3://udacity-ml-workflow/test/bike_s_000330.png \n", + "upload: test/bike_s_000071.png to s3://udacity-ml-workflow/test/bike_s_000071.png \n", + "upload: test/bike_s_000487.png to s3://udacity-ml-workflow/test/bike_s_000487.png \n", + "upload: test/bike_s_000643.png to s3://udacity-ml-workflow/test/bike_s_000643.png \n", + "upload: test/bike_s_000658.png to s3://udacity-ml-workflow/test/bike_s_000658.png \n", + "upload: test/bike_s_000457.png to s3://udacity-ml-workflow/test/bike_s_000457.png \n", + "upload: test/bike_s_000694.png to s3://udacity-ml-workflow/test/bike_s_000694.png \n", + "upload: test/bike_s_001073.png to s3://udacity-ml-workflow/test/bike_s_001073.png \n", + "upload: test/bike_s_001068.png to s3://udacity-ml-workflow/test/bike_s_001068.png \n", + "upload: test/bike_s_001159.png to s3://udacity-ml-workflow/test/bike_s_001159.png \n", + "upload: test/bike_s_000801.png to s3://udacity-ml-workflow/test/bike_s_000801.png \n", + "upload: test/bike_s_001738.png to s3://udacity-ml-workflow/test/bike_s_001738.png \n", + "upload: test/bike_s_000941.png to s3://udacity-ml-workflow/test/bike_s_000941.png \n", + "upload: test/bike_s_002116.png to s3://udacity-ml-workflow/test/bike_s_002116.png \n", + "upload: test/bike_s_001342.png to s3://udacity-ml-workflow/test/bike_s_001342.png \n", + "upload: test/bike_s_001852.png to s3://udacity-ml-workflow/test/bike_s_001852.png \n", + "upload: test/bike_s_001216.png to s3://udacity-ml-workflow/test/bike_s_001216.png \n", + "upload: test/bike_s_001784.png to s3://udacity-ml-workflow/test/bike_s_001784.png \n", + "upload: test/bike_s_002208.png to s3://udacity-ml-workflow/test/bike_s_002208.png \n", + "upload: test/cycle_s_001044.png to s3://udacity-ml-workflow/test/cycle_s_001044.png \n", + "upload: test/cycle_s_000010.png to s3://udacity-ml-workflow/test/cycle_s_000010.png \n", + "upload: test/cycle_s_000970.png to s3://udacity-ml-workflow/test/cycle_s_000970.png \n", + "upload: test/cycle_s_001214.png to s3://udacity-ml-workflow/test/cycle_s_001214.png \n", + "upload: test/cycle_s_001297.png to s3://udacity-ml-workflow/test/cycle_s_001297.png \n", + "upload: test/cycle_s_000068.png to s3://udacity-ml-workflow/test/cycle_s_000068.png \n", + "upload: test/cycle_s_001306.png to s3://udacity-ml-workflow/test/cycle_s_001306.png \n", + "upload: test/bike_s_002009.png to s3://udacity-ml-workflow/test/bike_s_002009.png \n", + "upload: test/cycle_s_001648.png to s3://udacity-ml-workflow/test/cycle_s_001648.png\n", + "upload: test/cycle_s_002613.png to s3://udacity-ml-workflow/test/cycle_s_002613.png\n", + "upload: test/cycle_s_001915.png to s3://udacity-ml-workflow/test/cycle_s_001915.png\n", + "upload: test/minibike_s_000052.png to s3://udacity-ml-workflow/test/minibike_s_000052.png\n", + "upload: test/cycle_s_002964.png to s3://udacity-ml-workflow/test/cycle_s_002964.png\n", + "upload: test/minibike_s_000055.png to s3://udacity-ml-workflow/test/minibike_s_000055.png\n", + "upload: test/cycle_s_001953.png to s3://udacity-ml-workflow/test/cycle_s_001953.png\n", + "upload: test/minibike_s_000075.png to s3://udacity-ml-workflow/test/minibike_s_000075.png\n", + "upload: test/cycle_s_002661.png to s3://udacity-ml-workflow/test/cycle_s_002661.png\n", + "upload: test/minibike_s_000288.png to s3://udacity-ml-workflow/test/minibike_s_000288.png\n", + "upload: test/cycle_s_002305.png to s3://udacity-ml-workflow/test/cycle_s_002305.png\n", + "upload: test/minibike_s_000254.png to s3://udacity-ml-workflow/test/minibike_s_000254.png\n", + "upload: test/dirt_bike_s_000001.png to s3://udacity-ml-workflow/test/dirt_bike_s_000001.png\n", + "upload: test/minibike_s_000309.png to s3://udacity-ml-workflow/test/minibike_s_000309.png\n", + "upload: test/minibike_s_000792.png to s3://udacity-ml-workflow/test/minibike_s_000792.png\n", + "upload: test/minibike_s_000573.png to s3://udacity-ml-workflow/test/minibike_s_000573.png\n", + "upload: test/minibike_s_000505.png to s3://udacity-ml-workflow/test/minibike_s_000505.png\n", + "upload: test/minibike_s_000398.png to s3://udacity-ml-workflow/test/minibike_s_000398.png\n", + "upload: test/minibike_s_000290.png to s3://udacity-ml-workflow/test/minibike_s_000290.png\n", + "upload: test/minibike_s_000801.png to s3://udacity-ml-workflow/test/minibike_s_000801.png\n", + "upload: test/minibike_s_000497.png to s3://udacity-ml-workflow/test/minibike_s_000497.png\n", + "upload: test/minibike_s_000880.png to s3://udacity-ml-workflow/test/minibike_s_000880.png\n", + "upload: test/minibike_s_000947.png to s3://udacity-ml-workflow/test/minibike_s_000947.png\n", + "upload: test/minibike_s_000828.png to s3://udacity-ml-workflow/test/minibike_s_000828.png\n", + "upload: test/minibike_s_001089.png to s3://udacity-ml-workflow/test/minibike_s_001089.png\n", + "upload: test/minibike_s_001473.png to s3://udacity-ml-workflow/test/minibike_s_001473.png\n", + "upload: test/minibike_s_001441.png to s3://udacity-ml-workflow/test/minibike_s_001441.png\n", + "upload: test/minibike_s_001732.png to s3://udacity-ml-workflow/test/minibike_s_001732.png\n", + "upload: test/minibike_s_001651.png to s3://udacity-ml-workflow/test/minibike_s_001651.png\n", + "upload: test/minibike_s_000913.png to s3://udacity-ml-workflow/test/minibike_s_000913.png\n", + "upload: test/minibike_s_001893.png to s3://udacity-ml-workflow/test/minibike_s_001893.png\n", + "upload: test/minibike_s_001605.png to s3://udacity-ml-workflow/test/minibike_s_001605.png\n", + "upload: test/minibike_s_002230.png to s3://udacity-ml-workflow/test/minibike_s_002230.png\n", + "upload: test/minibike_s_002173.png to s3://udacity-ml-workflow/test/minibike_s_002173.png\n", + "upload: test/minibike_s_002227.png to s3://udacity-ml-workflow/test/minibike_s_002227.png\n", + "upload: test/minibike_s_001547.png to s3://udacity-ml-workflow/test/minibike_s_001547.png\n", + "upload: test/minibike_s_001867.png to s3://udacity-ml-workflow/test/minibike_s_001867.png\n", + "upload: test/motorbike_s_000121.png to s3://udacity-ml-workflow/test/motorbike_s_000121.png\n", + "upload: test/moped_s_000064.png to s3://udacity-ml-workflow/test/moped_s_000064.png\n", + "upload: test/minibike_s_000960.png to s3://udacity-ml-workflow/test/minibike_s_000960.png\n", + "upload: test/moped_s_000007.png to s3://udacity-ml-workflow/test/moped_s_000007.png\n", + "upload: test/moped_s_000306.png to s3://udacity-ml-workflow/test/moped_s_000306.png\n", + "upload: test/motorbike_s_000005.png to s3://udacity-ml-workflow/test/motorbike_s_000005.png\n", + "upload: test/minibike_s_002051.png to s3://udacity-ml-workflow/test/minibike_s_002051.png\n", + "upload: test/motorbike_s_000126.png to s3://udacity-ml-workflow/test/motorbike_s_000126.png\n", + "upload: test/moped_s_000033.png to s3://udacity-ml-workflow/test/moped_s_000033.png\n", + "upload: test/motorbike_s_000324.png to s3://udacity-ml-workflow/test/motorbike_s_000324.png\n", + "upload: test/motorbike_s_000433.png to s3://udacity-ml-workflow/test/motorbike_s_000433.png\n", + "upload: test/motorbike_s_000465.png to s3://udacity-ml-workflow/test/motorbike_s_000465.png\n", + "upload: test/motorbike_s_000629.png to s3://udacity-ml-workflow/test/motorbike_s_000629.png\n", + "upload: test/motorcycle_s_000040.png to s3://udacity-ml-workflow/test/motorcycle_s_000040.png\n", + "upload: test/motorbike_s_000333.png to s3://udacity-ml-workflow/test/motorbike_s_000333.png\n", + "upload: test/motorcycle_s_000007.png to s3://udacity-ml-workflow/test/motorcycle_s_000007.png\n", + "upload: test/motorbike_s_000135.png to s3://udacity-ml-workflow/test/motorbike_s_000135.png\n", + "upload: test/motorcycle_s_000042.png to s3://udacity-ml-workflow/test/motorcycle_s_000042.png\n", + "upload: test/motorcycle_s_000063.png to s3://udacity-ml-workflow/test/motorcycle_s_000063.png\n", + "upload: test/motorcycle_s_000141.png to s3://udacity-ml-workflow/test/motorcycle_s_000141.png\n", + "upload: test/motorcycle_s_000139.png to s3://udacity-ml-workflow/test/motorcycle_s_000139.png\n", + "upload: test/motorcycle_s_000211.png to s3://udacity-ml-workflow/test/motorcycle_s_000211.png\n", + "upload: test/motorcycle_s_000049.png to s3://udacity-ml-workflow/test/motorcycle_s_000049.png\n", + "upload: test/motorcycle_s_000427.png to s3://udacity-ml-workflow/test/motorcycle_s_000427.png\n", + "upload: test/motorcycle_s_000171.png to s3://udacity-ml-workflow/test/motorcycle_s_000171.png\n", + "upload: test/motorcycle_s_000485.png to s3://udacity-ml-workflow/test/motorcycle_s_000485.png\n", + "upload: test/motorcycle_s_000450.png to s3://udacity-ml-workflow/test/motorcycle_s_000450.png\n", + "upload: test/motorcycle_s_000060.png to s3://udacity-ml-workflow/test/motorcycle_s_000060.png\n", + "upload: test/motorcycle_s_000446.png to s3://udacity-ml-workflow/test/motorcycle_s_000446.png\n", + "upload: test/motorcycle_s_000222.png to s3://udacity-ml-workflow/test/motorcycle_s_000222.png\n", + "upload: test/motorcycle_s_000530.png to s3://udacity-ml-workflow/test/motorcycle_s_000530.png\n", + "upload: test/motorcycle_s_000512.png to s3://udacity-ml-workflow/test/motorcycle_s_000512.png\n", + "upload: test/motorcycle_s_000352.png to s3://udacity-ml-workflow/test/motorcycle_s_000352.png\n", + "upload: test/motorcycle_s_000323.png to s3://udacity-ml-workflow/test/motorcycle_s_000323.png\n", + "upload: test/motorcycle_s_000602.png to s3://udacity-ml-workflow/test/motorcycle_s_000602.png\n", + "upload: test/motorcycle_s_000494.png to s3://udacity-ml-workflow/test/motorcycle_s_000494.png\n", + "upload: test/motorcycle_s_000679.png to s3://udacity-ml-workflow/test/motorcycle_s_000679.png\n", + "upload: test/motorcycle_s_000685.png to s3://udacity-ml-workflow/test/motorcycle_s_000685.png\n", + "upload: test/motorcycle_s_000606.png to s3://udacity-ml-workflow/test/motorcycle_s_000606.png\n", + "upload: test/motorcycle_s_000866.png to s3://udacity-ml-workflow/test/motorcycle_s_000866.png\n", + "upload: test/motorcycle_s_000825.png to s3://udacity-ml-workflow/test/motorcycle_s_000825.png\n", + "upload: test/motorcycle_s_001249.png to s3://udacity-ml-workflow/test/motorcycle_s_001249.png\n", + "upload: test/motorcycle_s_000615.png to s3://udacity-ml-workflow/test/motorcycle_s_000615.png\n", + "upload: test/motorcycle_s_000739.png to s3://udacity-ml-workflow/test/motorcycle_s_000739.png\n", + "upload: test/motorcycle_s_001261.png to s3://udacity-ml-workflow/test/motorcycle_s_001261.png\n", + "upload: test/motorcycle_s_000878.png to s3://udacity-ml-workflow/test/motorcycle_s_000878.png\n", + "upload: test/motorcycle_s_000963.png to s3://udacity-ml-workflow/test/motorcycle_s_000963.png\n", + "upload: test/motorcycle_s_000876.png to s3://udacity-ml-workflow/test/motorcycle_s_000876.png\n", + "upload: test/motorcycle_s_001164.png to s3://udacity-ml-workflow/test/motorcycle_s_001164.png\n", + "upload: test/motorcycle_s_000797.png to s3://udacity-ml-workflow/test/motorcycle_s_000797.png\n", + "upload: test/motorcycle_s_001269.png to s3://udacity-ml-workflow/test/motorcycle_s_001269.png\n", + "upload: test/motorcycle_s_001385.png to s3://udacity-ml-workflow/test/motorcycle_s_001385.png\n", + "upload: test/motorcycle_s_001348.png to s3://udacity-ml-workflow/test/motorcycle_s_001348.png\n", + "upload: test/motorcycle_s_001679.png to s3://udacity-ml-workflow/test/motorcycle_s_001679.png\n", + "upload: test/motorcycle_s_001782.png to s3://udacity-ml-workflow/test/motorcycle_s_001782.png\n", + "upload: test/motorcycle_s_001892.png to s3://udacity-ml-workflow/test/motorcycle_s_001892.png\n", + "upload: test/motorcycle_s_001687.png to s3://udacity-ml-workflow/test/motorcycle_s_001687.png\n", + "upload: test/motorcycle_s_001519.png to s3://udacity-ml-workflow/test/motorcycle_s_001519.png\n", + "upload: test/motorcycle_s_001960.png to s3://udacity-ml-workflow/test/motorcycle_s_001960.png\n", + "upload: test/motorcycle_s_001936.png to s3://udacity-ml-workflow/test/motorcycle_s_001936.png\n", + "upload: test/motorcycle_s_001508.png to s3://udacity-ml-workflow/test/motorcycle_s_001508.png\n", + "upload: test/motorcycle_s_001906.png to s3://udacity-ml-workflow/test/motorcycle_s_001906.png\n", + "upload: test/motorcycle_s_001971.png to s3://udacity-ml-workflow/test/motorcycle_s_001971.png\n", + "upload: test/motorcycle_s_002126.png to s3://udacity-ml-workflow/test/motorcycle_s_002126.png\n", + "upload: test/motorcycle_s_002177.png to s3://udacity-ml-workflow/test/motorcycle_s_002177.png\n", + "upload: test/ordinary_bicycle_s_000158.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000158.png\n", + "upload: test/motorcycle_s_002026.png to s3://udacity-ml-workflow/test/motorcycle_s_002026.png\n", + "upload: test/motorcycle_s_001955.png to s3://udacity-ml-workflow/test/motorcycle_s_001955.png\n", + "upload: test/ordinary_bicycle_s_000431.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000431.png\n", + "upload: test/ordinary_bicycle_s_000113.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000113.png\n", + "upload: test/motorcycle_s_002112.png to s3://udacity-ml-workflow/test/motorcycle_s_002112.png\n", + "upload: test/ordinary_bicycle_s_000350.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000350.png\n", + "upload: test/safety_bicycle_s_000315.png to s3://udacity-ml-workflow/test/safety_bicycle_s_000315.png\n", + "upload: test/safety_bicycle_s_001153.png to s3://udacity-ml-workflow/test/safety_bicycle_s_001153.png\n", + "upload: test/ordinary_bicycle_s_000169.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000169.png\n", + "upload: test/safety_bicycle_s_000280.png to s3://udacity-ml-workflow/test/safety_bicycle_s_000280.png\n", + "upload: test/ordinary_bicycle_s_000284.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000284.png\n", + "upload: test/ordinary_bicycle_s_000105.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000105.png\n", + "upload: test/safety_bicycle_s_000235.png to s3://udacity-ml-workflow/test/safety_bicycle_s_000235.png\n", + "upload: test/safety_bicycle_s_001322.png to s3://udacity-ml-workflow/test/safety_bicycle_s_001322.png\n", + "upload: test/ordinary_bicycle_s_000437.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000437.png\n", + "upload: test/safety_bicycle_s_001575.png to s3://udacity-ml-workflow/test/safety_bicycle_s_001575.png\n", + "upload: test/safety_bicycle_s_001286.png to s3://udacity-ml-workflow/test/safety_bicycle_s_001286.png\n", + "upload: test/safety_bike_s_000488.png to s3://udacity-ml-workflow/test/safety_bike_s_000488.png\n", + "upload: test/safety_bike_s_000541.png to s3://udacity-ml-workflow/test/safety_bike_s_000541.png\n", + "upload: test/safety_bike_s_000390.png to s3://udacity-ml-workflow/test/safety_bike_s_000390.png\n", + "upload: test/safety_bike_s_001065.png to s3://udacity-ml-workflow/test/safety_bike_s_001065.png\n", + "upload: test/safety_bike_s_000791.png to s3://udacity-ml-workflow/test/safety_bike_s_000791.png\n", + "upload: test/safety_bike_s_001087.png to s3://udacity-ml-workflow/test/safety_bike_s_001087.png\n", + "upload: test/safety_bike_s_000699.png to s3://udacity-ml-workflow/test/safety_bike_s_000699.png\n", + "upload: test/safety_bike_s_001132.png to s3://udacity-ml-workflow/test/safety_bike_s_001132.png\n", + "upload: test/safety_bike_s_000438.png to s3://udacity-ml-workflow/test/safety_bike_s_000438.png\n", + "upload: test/safety_bike_s_001481.png to s3://udacity-ml-workflow/test/safety_bike_s_001481.png\n", + "upload: test/safety_bike_s_000540.png to s3://udacity-ml-workflow/test/safety_bike_s_000540.png\n", + "upload: test/safety_bike_s_001253.png to s3://udacity-ml-workflow/test/safety_bike_s_001253.png\n", + "upload: test/velocipede_s_000001.png to s3://udacity-ml-workflow/test/velocipede_s_000001.png\n", + "upload: test/safety_bike_s_000192.png to s3://udacity-ml-workflow/test/safety_bike_s_000192.png\n", + "upload: test/safety_bike_s_001088.png to s3://udacity-ml-workflow/test/safety_bike_s_001088.png\n", + "upload: test/velocipede_s_000369.png to s3://udacity-ml-workflow/test/velocipede_s_000369.png\n", + "upload: test/trail_bike_s_000073.png to s3://udacity-ml-workflow/test/trail_bike_s_000073.png\n", + "upload: test/velocipede_s_000106.png to s3://udacity-ml-workflow/test/velocipede_s_000106.png\n", + "upload: test/velocipede_s_000041.png to s3://udacity-ml-workflow/test/velocipede_s_000041.png\n", + "upload: test/velocipede_s_001201.png to s3://udacity-ml-workflow/test/velocipede_s_001201.png\n", + "upload: test/safety_bike_s_001690.png to s3://udacity-ml-workflow/test/safety_bike_s_001690.png\n", + "upload: test/velocipede_s_000863.png to s3://udacity-ml-workflow/test/velocipede_s_000863.png\n", + "upload: test/velocipede_s_001232.png to s3://udacity-ml-workflow/test/velocipede_s_001232.png\n", + "upload: test/velocipede_s_001277.png to s3://udacity-ml-workflow/test/velocipede_s_001277.png\n", + "upload: test/velocipede_s_000292.png to s3://udacity-ml-workflow/test/velocipede_s_000292.png\n", + "upload: test/velocipede_s_001699.png to s3://udacity-ml-workflow/test/velocipede_s_001699.png\n", + "upload: test/velocipede_s_001335.png to s3://udacity-ml-workflow/test/velocipede_s_001335.png\n", + "upload: test/velocipede_s_001633.png to s3://udacity-ml-workflow/test/velocipede_s_001633.png\n", + "upload: test/velocipede_s_001355.png to s3://udacity-ml-workflow/test/velocipede_s_001355.png\n", + "upload: test/velocipede_s_001379.png to s3://udacity-ml-workflow/test/velocipede_s_001379.png\n", + "upload: test/velocipede_s_001790.png to s3://udacity-ml-workflow/test/velocipede_s_001790.png\n", + "upload: test/velocipede_s_001744.png to s3://udacity-ml-workflow/test/velocipede_s_001744.png\n", + "upload: test/velocipede_s_001466.png to s3://udacity-ml-workflow/test/velocipede_s_001466.png\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "os.environ[\"DEFAULT_S3_BUCKET\"] = bucket\n", + "!aws s3 sync ./train s3://${DEFAULT_S3_BUCKET}/train/\n", + "!aws s3 sync ./test s3://${DEFAULT_S3_BUCKET}/test/" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And that's it! You can check the bucket and verify that the items were uploaded.\n", + "\n", + "## Model Training\n", + "\n", + "For Image Classification, Sagemaker [also expects metadata](https://docs.aws.amazon.com/sagemaker/latest/dg/image-classification.html) e.g. in the form of TSV files with labels and filepaths. We can generate these using our Pandas DataFrames from earlier:" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def to_metadata_file(df, prefix):\n", + " df[\"s3_path\"] = df[\"filenames\"]\n", + " df[\"labels\"] = df[\"labels\"].apply(lambda x: 0 if x==8 else 1)\n", + " return df[[\"row\", \"labels\", \"s3_path\"]].to_csv(\n", + " f\"{prefix}.lst\", sep=\"\\t\", index=False, header=False\n", + " )\n", + " \n", + "to_metadata_file(df_train.copy(), \"train\")\n", + "to_metadata_file(df_test.copy(), \"test\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also upload our manifest files:" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import boto3\n", + "bucket = \"udacity-ml-workflow\"\n", + "# Upload files\n", + "boto3.Session().resource('s3').Bucket(\n", + " bucket).Object('train.lst').upload_file('./train.lst')\n", + "boto3.Session().resource('s3').Bucket(\n", + " bucket).Object('test.lst').upload_file('./test.lst')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the `bucket` and `region` info we can get the latest prebuilt container to run our training job, and define an output location on our s3 bucket for the model. Use the `image_uris` function from the SageMaker SDK to retrieve the latest `image-classification` image below:" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Use the image_uris function to retrieve the latest 'image-classification' image \n", + "algo_image = sagemaker.image_uris.retrieve('image-classification', region=region)\n", + "s3_output_location = f\"s3://{bucket}/models/image_model\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We're ready to create an estimator! Create an estimator `img_classifier_model` that uses one instance of `ml.p3.2xlarge`. Ensure that y ou use the output location we defined above - we'll be referring to that later!" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "img_classifier_model=sagemaker.estimator.Estimator(\n", + " ## TODO: define your estimator options \n", + " role=role,\n", + " instance_count = 1,\n", + " instance_type= 'ml.p3.2xlarge',\n", + " volume_size=5,\n", + " output_path=s3_output_location,\n", + " sagemaker_session=sagemaker.Session(),\n", + " image_uri = algo_image\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1000" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'811284229777.dkr.ecr.us-east-1.amazonaws.com/image-classification:1'" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "algo_image" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also set a few key hyperparameters and define the inputs for our model:" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "img_classifier_model.set_hyperparameters(\n", + " image_shape= \"3,32,32\", # TODO: Fill in\n", + " num_classes=2, # TODO: Fill in\n", + " num_training_samples=1000 # TODO: fill in\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `image-classification` image uses four input channels with very specific input parameters. For convenience, we've provided them below:" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sagemaker.debugger import Rule, rule_configs\n", + "from sagemaker.session import TrainingInput\n", + "model_inputs = {\n", + " \"train\": sagemaker.inputs.TrainingInput(\n", + " s3_data=f\"s3://{bucket}/train/\",\n", + " content_type=\"application/x-image\"\n", + " ),\n", + " \"validation\": sagemaker.inputs.TrainingInput(\n", + " s3_data=f\"s3://{bucket}/test/\",\n", + " content_type=\"application/x-image\"\n", + " ),\n", + " \"train_lst\": sagemaker.inputs.TrainingInput(\n", + " s3_data=f\"s3://{bucket}/train.lst\",\n", + " content_type=\"application/x-image\"\n", + " ),\n", + " \"validation_lst\": sagemaker.inputs.TrainingInput(\n", + " s3_data=f\"s3://{bucket}/test.lst\",\n", + " content_type=\"application/x-image\"\n", + " )\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Great, now we can train the model using the model_inputs. In the cell below, call the `fit` method on our model,:" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-02-14 13:09:33 Starting - Starting the training job...\n", + "2023-02-14 13:09:58 Starting - Preparing the instances for trainingProfilerReport-1676380173: InProgress\n", + ".........\n", + "2023-02-14 13:11:17 Downloading - Downloading input data...\n", + "2023-02-14 13:11:57 Training - Downloading the training image...............\n", + "2023-02-14 13:14:32 Training - Training image download completed. Training in progress....\u001b[34mDocker entrypoint called with argument(s): train\u001b[0m\n", + "\u001b[34mRunning default environment configuration script\u001b[0m\n", + "\u001b[34mNvidia gpu devices, drivers and cuda toolkit versions (only available on hosts with GPU):\u001b[0m\n", + "\u001b[34mTue Feb 14 13:14:59 2023 \u001b[0m\n", + "\u001b[34m+-----------------------------------------------------------------------------+\u001b[0m\n", + "\u001b[34m| NVIDIA-SMI 515.65.07 Driver Version: 515.65.07 CUDA Version: 11.7 |\u001b[0m\n", + "\u001b[34m|-------------------------------+----------------------+----------------------+\u001b[0m\n", + "\u001b[34m| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\u001b[0m\n", + "\u001b[34m| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\u001b[0m\n", + "\u001b[34m| | | MIG M. |\u001b[0m\n", + "\u001b[34m|===============================+======================+======================|\u001b[0m\n", + "\u001b[34m| 0 Tesla V100-SXM2... On | 00000000:00:1E.0 Off | 0 |\u001b[0m\n", + "\u001b[34m| N/A 42C P0 23W / 300W | 0MiB / 16384MiB | 0% Default |\u001b[0m\n", + "\u001b[34m| | | N/A |\u001b[0m\n", + "\u001b[34m+-------------------------------+----------------------+----------------------+\n", + " \u001b[0m\n", + "\u001b[34m+-----------------------------------------------------------------------------+\u001b[0m\n", + "\u001b[34m| Processes: |\u001b[0m\n", + "\u001b[34m| GPU GI CI PID Type Process name GPU Memory |\u001b[0m\n", + "\u001b[34m| ID ID Usage |\u001b[0m\n", + "\u001b[34m|=============================================================================|\u001b[0m\n", + "\u001b[34m| No running processes found |\u001b[0m\n", + "\u001b[34m+-----------------------------------------------------------------------------+\u001b[0m\n", + "\u001b[34mChecking for nvidia driver and cuda compatibility.\u001b[0m\n", + "\u001b[34mCUDA Compatibility driver provided.\u001b[0m\n", + "\u001b[34mProceeding with compatibility check between driver, cuda-toolkit and cuda-compat.\u001b[0m\n", + "\u001b[34mDetected cuda-toolkit version: 11.1.\u001b[0m\n", + "\u001b[34mDetected cuda-compat version: 455.32.00.\u001b[0m\n", + "\u001b[34mDetected Nvidia driver version: 515.65.07.\u001b[0m\n", + "\u001b[34mNvidia driver compatible with cuda-toolkit. Disabling cuda-compat.\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:03 INFO 140622489470784] Reading default configuration from /opt/amazon/lib/python3.7/site-packages/image_classification/default-input.json: {'use_pretrained_model': 0, 'num_layers': 152, 'epochs': 30, 'learning_rate': 0.1, 'lr_scheduler_factor': 0.1, 'optimizer': 'sgd', 'momentum': 0, 'weight_decay': 0.0001, 'beta_1': 0.9, 'beta_2': 0.999, 'eps': 1e-08, 'gamma': 0.9, 'mini_batch_size': 32, 'image_shape': '3,224,224', 'precision_dtype': 'float32'}\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:03 INFO 140622489470784] Merging with provided configuration from /opt/ml/input/config/hyperparameters.json: {'image_shape': '3,32,32', 'num_classes': '2', 'num_training_samples': '1000'}\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:03 INFO 140622489470784] Final configuration: {'use_pretrained_model': 0, 'num_layers': 152, 'epochs': 30, 'learning_rate': 0.1, 'lr_scheduler_factor': 0.1, 'optimizer': 'sgd', 'momentum': 0, 'weight_decay': 0.0001, 'beta_1': 0.9, 'beta_2': 0.999, 'eps': 1e-08, 'gamma': 0.9, 'mini_batch_size': 32, 'image_shape': '3,32,32', 'precision_dtype': 'float32', 'num_classes': '2', 'num_training_samples': '1000'}\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:03 INFO 140622489470784] Searching for .lst files in /opt/ml/input/data/train_lst.\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:03 INFO 140622489470784] Creating record files for train.lst\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] Done creating record files...\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] Searching for .lst files in /opt/ml/input/data/validation_lst.\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] Creating record files for test.lst\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] Done creating record files...\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] use_pretrained_model: 0\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] multi_label: 0\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] Performing random weight initialization\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] ---- Parameters ----\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] num_layers: 152\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] data type: \u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] epochs: 30\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] optimizer: sgd\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] momentum: 0.9\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] weight_decay: 0.0001\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] learning_rate: 0.1\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] num_training_samples: 1000\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] mini_batch_size: 32\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] image_shape: 3,32,32\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] num_classes: 2\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] augmentation_type: None\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] kv_store: device\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] checkpoint_frequency not set, will store the best model\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] --------------------\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:04 INFO 140622489470784] Setting number of threads: 7\u001b[0m\n", + "\u001b[34m[13:15:08] /opt/brazil-pkg-cache/packages/AIAlgorithmsMXNet/AIAlgorithmsMXNet-1.4.x_ecl_Cuda_11.1.x.38.0/AL2_x86_64/generic-flavor/src/src/operator/nn/./cudnn/./cudnn_algoreg-inl.h:97: Running performance tests to find the best convolution algorithm, this can take a while... (setting env variable MXNET_CUDNN_AUTOTUNE_DEFAULT to 0 to disable)\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:13 INFO 140622489470784] Epoch[0] Batch [20]#011Speed: 121.736 samples/sec#011accuracy=0.584821\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:15 INFO 140622489470784] Epoch[0] Train-accuracy=0.626008\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:15 INFO 140622489470784] Epoch[0] Time cost=6.944\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:15 INFO 140622489470784] Epoch[0] Validation-accuracy=0.484375\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:15 INFO 140622489470784] Storing the best model with validation accuracy: 0.484375\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:16 INFO 140622489470784] Saved checkpoint to \"/opt/ml/model/image-classification-0001.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:19 INFO 140622489470784] Epoch[1] Batch [20]#011Speed: 184.679 samples/sec#011accuracy=0.630952\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:21 INFO 140622489470784] Epoch[1] Train-accuracy=0.623992\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:21 INFO 140622489470784] Epoch[1] Time cost=5.127\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:21 INFO 140622489470784] Epoch[1] Validation-accuracy=0.510417\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:22 INFO 140622489470784] Storing the best model with validation accuracy: 0.510417\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:22 INFO 140622489470784] Saved checkpoint to \"/opt/ml/model/image-classification-0002.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:26 INFO 140622489470784] Epoch[2] Batch [20]#011Speed: 188.476 samples/sec#011accuracy=0.654762\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:27 INFO 140622489470784] Epoch[2] Train-accuracy=0.650202\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:27 INFO 140622489470784] Epoch[2] Time cost=5.053\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:28 INFO 140622489470784] Epoch[2] Validation-accuracy=0.531250\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:28 INFO 140622489470784] Storing the best model with validation accuracy: 0.531250\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:28 INFO 140622489470784] Saved checkpoint to \"/opt/ml/model/image-classification-0003.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:32 INFO 140622489470784] Epoch[3] Batch [20]#011Speed: 188.318 samples/sec#011accuracy=0.714286\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:33 INFO 140622489470784] Epoch[3] Train-accuracy=0.734879\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:33 INFO 140622489470784] Epoch[3] Time cost=5.066\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:34 INFO 140622489470784] Epoch[3] Validation-accuracy=0.522321\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:38 INFO 140622489470784] Epoch[4] Batch [20]#011Speed: 185.520 samples/sec#011accuracy=0.767857\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:40 INFO 140622489470784] Epoch[4] Train-accuracy=0.773185\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:40 INFO 140622489470784] Epoch[4] Time cost=5.139\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:40 INFO 140622489470784] Epoch[4] Validation-accuracy=0.520833\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:44 INFO 140622489470784] Epoch[5] Batch [20]#011Speed: 187.837 samples/sec#011accuracy=0.784226\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:46 INFO 140622489470784] Epoch[5] Train-accuracy=0.770161\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:46 INFO 140622489470784] Epoch[5] Time cost=5.065\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:46 INFO 140622489470784] Epoch[5] Validation-accuracy=0.479167\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:50 INFO 140622489470784] Epoch[6] Batch [20]#011Speed: 188.098 samples/sec#011accuracy=0.827381\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:52 INFO 140622489470784] Epoch[6] Train-accuracy=0.808468\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:52 INFO 140622489470784] Epoch[6] Time cost=5.088\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:52 INFO 140622489470784] Epoch[6] Validation-accuracy=0.520833\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:56 INFO 140622489470784] Epoch[7] Batch [20]#011Speed: 186.858 samples/sec#011accuracy=0.818452\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:58 INFO 140622489470784] Epoch[7] Train-accuracy=0.807460\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:58 INFO 140622489470784] Epoch[7] Time cost=5.106\u001b[0m\n", + "\u001b[34m[02/14/2023 13:15:58 INFO 140622489470784] Epoch[7] Validation-accuracy=0.513393\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:02 INFO 140622489470784] Epoch[8] Batch [20]#011Speed: 184.425 samples/sec#011accuracy=0.824405\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:04 INFO 140622489470784] Epoch[8] Train-accuracy=0.824597\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:04 INFO 140622489470784] Epoch[8] Time cost=5.189\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:04 INFO 140622489470784] Epoch[8] Validation-accuracy=0.526042\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:08 INFO 140622489470784] Epoch[9] Batch [20]#011Speed: 188.382 samples/sec#011accuracy=0.839286\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:10 INFO 140622489470784] Epoch[9] Train-accuracy=0.832661\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:10 INFO 140622489470784] Epoch[9] Time cost=5.085\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:10 INFO 140622489470784] Epoch[9] Validation-accuracy=0.536458\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:11 INFO 140622489470784] Storing the best model with validation accuracy: 0.536458\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:11 INFO 140622489470784] Saved checkpoint to \"/opt/ml/model/image-classification-0010.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:14 INFO 140622489470784] Epoch[10] Batch [20]#011Speed: 188.170 samples/sec#011accuracy=0.831845\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:16 INFO 140622489470784] Epoch[10] Train-accuracy=0.825605\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:16 INFO 140622489470784] Epoch[10] Time cost=5.084\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:17 INFO 140622489470784] Epoch[10] Validation-accuracy=0.541667\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:17 INFO 140622489470784] Storing the best model with validation accuracy: 0.541667\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:17 INFO 140622489470784] Saved checkpoint to \"/opt/ml/model/image-classification-0011.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:21 INFO 140622489470784] Epoch[11] Batch [20]#011Speed: 188.872 samples/sec#011accuracy=0.840774\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:22 INFO 140622489470784] Epoch[11] Train-accuracy=0.833669\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:22 INFO 140622489470784] Epoch[11] Time cost=5.063\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:23 INFO 140622489470784] Epoch[11] Validation-accuracy=0.549107\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:23 INFO 140622489470784] Storing the best model with validation accuracy: 0.549107\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:24 INFO 140622489470784] Saved checkpoint to \"/opt/ml/model/image-classification-0012.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:27 INFO 140622489470784] Epoch[12] Batch [20]#011Speed: 186.059 samples/sec#011accuracy=0.869048\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:29 INFO 140622489470784] Epoch[12] Train-accuracy=0.868952\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:29 INFO 140622489470784] Epoch[12] Time cost=5.105\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:29 INFO 140622489470784] Epoch[12] Validation-accuracy=0.557292\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:29 INFO 140622489470784] Storing the best model with validation accuracy: 0.557292\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:30 INFO 140622489470784] Saved checkpoint to \"/opt/ml/model/image-classification-0013.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:33 INFO 140622489470784] Epoch[13] Batch [20]#011Speed: 187.817 samples/sec#011accuracy=0.858631\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:35 INFO 140622489470784] Epoch[13] Train-accuracy=0.866935\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:35 INFO 140622489470784] Epoch[13] Time cost=5.072\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:35 INFO 140622489470784] Epoch[13] Validation-accuracy=0.494792\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:39 INFO 140622489470784] Epoch[14] Batch [20]#011Speed: 188.960 samples/sec#011accuracy=0.882440\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:41 INFO 140622489470784] Epoch[14] Train-accuracy=0.886089\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:41 INFO 140622489470784] Epoch[14] Time cost=5.070\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:41 INFO 140622489470784] Epoch[14] Validation-accuracy=0.531250\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:45 INFO 140622489470784] Epoch[15] Batch [20]#011Speed: 188.289 samples/sec#011accuracy=0.909226\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:47 INFO 140622489470784] Epoch[15] Train-accuracy=0.900202\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:47 INFO 140622489470784] Epoch[15] Time cost=5.058\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:47 INFO 140622489470784] Epoch[15] Validation-accuracy=0.562500\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:48 INFO 140622489470784] Storing the best model with validation accuracy: 0.562500\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:48 INFO 140622489470784] Saved checkpoint to \"/opt/ml/model/image-classification-0016.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:52 INFO 140622489470784] Epoch[16] Batch [20]#011Speed: 188.204 samples/sec#011accuracy=0.901786\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:53 INFO 140622489470784] Epoch[16] Train-accuracy=0.883065\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:53 INFO 140622489470784] Epoch[16] Time cost=5.065\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:54 INFO 140622489470784] Epoch[16] Validation-accuracy=0.541667\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:58 INFO 140622489470784] Epoch[17] Batch [20]#011Speed: 188.836 samples/sec#011accuracy=0.925595\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:59 INFO 140622489470784] Epoch[17] Train-accuracy=0.924395\u001b[0m\n", + "\u001b[34m[02/14/2023 13:16:59 INFO 140622489470784] Epoch[17] Time cost=5.067\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:00 INFO 140622489470784] Epoch[17] Validation-accuracy=0.494792\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:04 INFO 140622489470784] Epoch[18] Batch [20]#011Speed: 182.995 samples/sec#011accuracy=0.858631\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:05 INFO 140622489470784] Epoch[18] Train-accuracy=0.871976\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:05 INFO 140622489470784] Epoch[18] Time cost=5.178\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:06 INFO 140622489470784] Epoch[18] Validation-accuracy=0.552083\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:10 INFO 140622489470784] Epoch[19] Batch [20]#011Speed: 189.019 samples/sec#011accuracy=0.936012\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:11 INFO 140622489470784] Epoch[19] Train-accuracy=0.927419\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:11 INFO 140622489470784] Epoch[19] Time cost=5.053\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:12 INFO 140622489470784] Epoch[19] Validation-accuracy=0.558036\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:16 INFO 140622489470784] Epoch[20] Batch [20]#011Speed: 188.366 samples/sec#011accuracy=0.924107\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:17 INFO 140622489470784] Epoch[20] Train-accuracy=0.919355\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:17 INFO 140622489470784] Epoch[20] Time cost=5.073\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:18 INFO 140622489470784] Epoch[20] Validation-accuracy=0.536458\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:22 INFO 140622489470784] Epoch[21] Batch [20]#011Speed: 188.032 samples/sec#011accuracy=0.952381\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:23 INFO 140622489470784] Epoch[21] Train-accuracy=0.947581\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:23 INFO 140622489470784] Epoch[21] Time cost=5.079\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:24 INFO 140622489470784] Epoch[21] Validation-accuracy=0.541667\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:28 INFO 140622489470784] Epoch[22] Batch [20]#011Speed: 185.304 samples/sec#011accuracy=0.927083\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:30 INFO 140622489470784] Epoch[22] Train-accuracy=0.920363\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:30 INFO 140622489470784] Epoch[22] Time cost=5.122\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:30 INFO 140622489470784] Epoch[22] Validation-accuracy=0.567708\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:30 INFO 140622489470784] Storing the best model with validation accuracy: 0.567708\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:31 INFO 140622489470784] Saved checkpoint to \"/opt/ml/model/image-classification-0023.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:34 INFO 140622489470784] Epoch[23] Batch [20]#011Speed: 189.240 samples/sec#011accuracy=0.953869\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:36 INFO 140622489470784] Epoch[23] Train-accuracy=0.943548\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:36 INFO 140622489470784] Epoch[23] Time cost=5.045\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:36 INFO 140622489470784] Epoch[23] Validation-accuracy=0.571429\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:37 INFO 140622489470784] Storing the best model with validation accuracy: 0.571429\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:37 INFO 140622489470784] Saved checkpoint to \"/opt/ml/model/image-classification-0024.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:40 INFO 140622489470784] Epoch[24] Batch [20]#011Speed: 189.041 samples/sec#011accuracy=0.925595\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:42 INFO 140622489470784] Epoch[24] Train-accuracy=0.924395\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:42 INFO 140622489470784] Epoch[24] Time cost=5.054\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:42 INFO 140622489470784] Epoch[24] Validation-accuracy=0.520833\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:46 INFO 140622489470784] Epoch[25] Batch [20]#011Speed: 189.755 samples/sec#011accuracy=0.953869\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:48 INFO 140622489470784] Epoch[25] Train-accuracy=0.955645\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:48 INFO 140622489470784] Epoch[25] Time cost=5.045\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:49 INFO 140622489470784] Epoch[25] Validation-accuracy=0.531250\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:52 INFO 140622489470784] Epoch[26] Batch [20]#011Speed: 187.638 samples/sec#011accuracy=0.931548\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:54 INFO 140622489470784] Epoch[26] Train-accuracy=0.945565\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:54 INFO 140622489470784] Epoch[26] Time cost=5.087\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:55 INFO 140622489470784] Epoch[26] Validation-accuracy=0.531250\u001b[0m\n", + "\u001b[34m[02/14/2023 13:17:58 INFO 140622489470784] Epoch[27] Batch [20]#011Speed: 187.239 samples/sec#011accuracy=0.976190\u001b[0m\n", + "\u001b[34m[02/14/2023 13:18:00 INFO 140622489470784] Epoch[27] Train-accuracy=0.969758\u001b[0m\n", + "\u001b[34m[02/14/2023 13:18:00 INFO 140622489470784] Epoch[27] Time cost=5.104\u001b[0m\n", + "\u001b[34m[02/14/2023 13:18:01 INFO 140622489470784] Epoch[27] Validation-accuracy=0.553571\u001b[0m\n", + "\u001b[34m[02/14/2023 13:18:05 INFO 140622489470784] Epoch[28] Batch [20]#011Speed: 182.670 samples/sec#011accuracy=0.968750\u001b[0m\n", + "\u001b[34m[02/14/2023 13:18:06 INFO 140622489470784] Epoch[28] Train-accuracy=0.965726\u001b[0m\n", + "\u001b[34m[02/14/2023 13:18:06 INFO 140622489470784] Epoch[28] Time cost=5.176\u001b[0m\n", + "\u001b[34m[02/14/2023 13:18:07 INFO 140622489470784] Epoch[28] Validation-accuracy=0.562500\u001b[0m\n", + "\n", + "2023-02-14 13:18:19 Uploading - Uploading generated training model\u001b[34m[02/14/2023 13:18:11 INFO 140622489470784] Epoch[29] Batch [20]#011Speed: 189.095 samples/sec#011accuracy=0.979167\u001b[0m\n", + "\u001b[34m[02/14/2023 13:18:12 INFO 140622489470784] Epoch[29] Train-accuracy=0.974798\u001b[0m\n", + "\u001b[34m[02/14/2023 13:18:12 INFO 140622489470784] Epoch[29] Time cost=5.050\u001b[0m\n", + "\u001b[34m[02/14/2023 13:18:13 INFO 140622489470784] Epoch[29] Validation-accuracy=0.531250\u001b[0m\n", + "\n", + "2023-02-14 13:18:54 Completed - Training job completed\n", + "Training seconds: 458\n", + "Billable seconds: 458\n" + ] + } + ], + "source": [ + "## TODO: train your model\n", + "img_classifier_model.fit(model_inputs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If all goes well, you'll end up with a model topping out above `.8` validation accuracy. With only 1000 training samples in the CIFAR dataset, that's pretty good. We could definitely pursue data augmentation & gathering more samples to help us improve further, but for now let's proceed to deploy our model.\n", + "\n", + "### Getting ready to deploy\n", + "\n", + "To begin with, let's configure Model Monitor to track our deployment. We'll define a `DataCaptureConfig` below:" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sagemaker.model_monitor import DataCaptureConfig\n", + "\n", + "data_capture_config = DataCaptureConfig(\n", + " ## TODO: Set config options\n", + " enable_capture=True,\n", + " sampling_percentage=100,\n", + " destination_s3_uri=f\"s3://{bucket}/data_capture\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note the `destination_s3_uri` parameter: At the end of the project, we can explore the `data_capture` directory in S3 to find crucial data about the inputs and outputs Model Monitor has observed on our model endpoint over time.\n", + "\n", + "With that done, deploy your model on a single `ml.m5.xlarge` instance with the data capture config attached:" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-------!image-classification-2023-02-14-13-25-18-287\n" + ] + } + ], + "source": [ + "deployment = img_classifier_model.deploy(\n", + " ## TODO: fill in deployment options\n", + " data_capture_config=data_capture_config,\n", + " initial_instance_count=1, \n", + " instance_type='ml.m5.xlarge',\n", + " \n", + " )\n", + "\n", + "endpoint = deployment.endpoint_name\n", + "print(endpoint)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note the endpoint name for later as well.\n", + "\n", + "Next, instantiate a Predictor:" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sagemaker.predictor import Predictor\n", + "predictor = Predictor('image-classification-2023-02-14-13-25-18-287') ## TODO: fill in" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the code snippet below we are going to prepare one of your saved images for prediction. Use the predictor to process the `payload`." + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sagemaker.serializers import IdentitySerializer\n", + "import base64\n", + "import json\n", + "predictor.serializer = IdentitySerializer(\"image/png\")\n", + "with open(\"./test/bicycle_s_001789.png\", \"rb\") as f:\n", + " payload = f.read()\n", + "\n", + " \n", + "inference = predictor.predict(payload)## TODO: Process the payload with your predictor" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your `inference` object is an array of two values, the predicted probability value for each of your classes (bicycle and motorcycle respectively.) So, for example, a value of `b'[0.91, 0.09]'` indicates the probability of being a bike is 91% and being a motorcycle is 9%." + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b'[0.9987309575080872, 0.001269030850380659]'\n" + ] + } + ], + "source": [ + "print(inference)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "### Draft Lambdas and Step Function Workflow\n", + "\n", + "Your operations team uses Step Functions to orchestrate serverless workflows. One of the nice things about Step Functions is that [workflows can call other workflows](https://docs.aws.amazon.com/step-functions/latest/dg/connect-stepfunctions.html), so the team can easily plug your workflow into the broader production architecture for Scones Unlimited.\n", + "\n", + "In this next stage you're going to write and deploy three Lambda functions, and then use the Step Functions visual editor to chain them together! Our functions are going to work with a simple data object:\n", + "\n", + "```python\n", + "{\n", + " \"inferences\": [], # Output of predictor.predict\n", + " \"s3_key\": \"\", # Source data S3 key\n", + " \"s3_bucket\": \"\", # Source data S3 bucket\n", + " \"image_data\": \"\" # base64 encoded string containing the image data\n", + "}\n", + "```\n", + "\n", + "A good test object that you can use for Lambda tests and Step Function executions, throughout the next section, might look like this:\n", + "\n", + "```python\n", + "{\n", + " \"image_data\": \"\",\n", + " \"s3_bucket\": MY_BUCKET_NAME, # Fill in with your bucket\n", + " \"s3_key\": \"test/bicycle_s_000513.png\"\n", + "}\n", + "```\n", + "\n", + "Using these fields, your functions can read and write the necessary data to execute your workflow. Let's start with the first function. Your first Lambda function will copy an object from S3, base64 encode it, and then return it to the step function as `image_data` in an event.\n", + "\n", + "Go to the Lambda dashboard and create a new Lambda function with a descriptive name like \"serializeImageData\" and select thr 'Python 3.8' runtime. Add the same permissions as the SageMaker role you created earlier. (Reminder: you do this in the Configuration tab under \"Permissions\"). Once you're ready, use the starter code below to craft your Lambda handler:\n", + "\n", + "```python\n", + "import json\n", + "import boto3\n", + "import base64\n", + "\n", + "s3 = boto3.client('s3')\n", + "\n", + "def lambda_handler(event, context):\n", + " \"\"\"A function to serialize target data from S3\"\"\"\n", + " \n", + " # Get the s3 address from the Step Function event input\n", + " key = ## TODO: fill in\n", + " bucket = ## TODO: fill in\n", + " \n", + " # Download the data from s3 to /tmp/image.png\n", + " ## TODO: fill in\n", + " \n", + " # We read the data from a file\n", + " with open(\"/tmp/image.png\", \"rb\") as f:\n", + " image_data = base64.b64encode(f.read())\n", + "\n", + " # Pass the data back to the Step Function\n", + " print(\"Event:\", event.keys())\n", + " return {\n", + " 'statusCode': 200,\n", + " 'body': {\n", + " \"image_data\": image_data,\n", + " \"s3_bucket\": bucket,\n", + " \"s3_key\": key,\n", + " \"inferences\": []\n", + " }\n", + " }\n", + "```\n", + "\n", + "The next function is responsible for the classification part - we're going to take the image output from the previous function, decode it, and then pass inferences back to the the Step Function.\n", + "\n", + "Because this Lambda will have runtime dependencies (i.e. the SageMaker SDK) you'll need to package them in your function. *Key reading:* https://docs.aws.amazon.com/lambda/latest/dg/python-package-create.html#python-package-create-with-dependency\n", + "\n", + "Create a new Lambda function with the same rights and a descriptive name, then fill in the starter code below for your classifier Lambda.\n", + "\n", + "```python\n", + "import json\n", + "import sagemaker\n", + "import base64\n", + "from sagemaker.serializers import IdentitySerializer\n", + "\n", + "# Fill this in with the name of your deployed model\n", + "ENDPOINT = ## TODO: fill in\n", + "\n", + "def lambda_handler(event, context):\n", + "\n", + " # Decode the image data\n", + " image = base64.b64decode(## TODO: fill in)\n", + "\n", + " # Instantiate a Predictor\n", + " predictor = ## TODO: fill in\n", + "\n", + " # For this model the IdentitySerializer needs to be \"image/png\"\n", + " predictor.serializer = IdentitySerializer(\"image/png\")\n", + " \n", + " # Make a prediction:\n", + " inferences = ## TODO: fill in\n", + " \n", + " # We return the data back to the Step Function \n", + " event[\"inferences\"] = inferences.decode('utf-8')\n", + " return {\n", + " 'statusCode': 200,\n", + " 'body': json.dumps(event)\n", + " }\n", + "```\n", + "\n", + "Finally, we need to filter low-confidence inferences. Define a threshold between 1.00 and 0.000 for your model: what is reasonble for you? If the model predicts at `.70` for it's highest confidence label, do we want to pass that inference along to downstream systems? Make one last Lambda function and tee up the same permissions:\n", + "\n", + "```python\n", + "import json\n", + "\n", + "\n", + "THRESHOLD = .93\n", + "\n", + "\n", + "def lambda_handler(event, context):\n", + " \n", + " # Grab the inferences from the event\n", + " inferences = ## TODO: fill in\n", + " \n", + " # Check if any values in our inferences are above THRESHOLD\n", + " meets_threshold = ## TODO: fill in\n", + " \n", + " # If our threshold is met, pass our data back out of the\n", + " # Step Function, else, end the Step Function with an error\n", + " if meets_threshold:\n", + " pass\n", + " else:\n", + " raise(\"THRESHOLD_CONFIDENCE_NOT_MET\")\n", + "\n", + " return {\n", + " 'statusCode': 200,\n", + " 'body': json.dumps(event)\n", + " }\n", + "```\n", + "Once you have tested the lambda functions, save the code for each lambda function in a python script called 'lambda.py'.\n", + "\n", + "With your lambdas in place, you can use the Step Functions visual editor to construct a workflow that chains them together. In the Step Functions console you'll have the option to author a Standard step function *Visually*.\n", + "\n", + "When the visual editor opens, you'll have many options to add transitions in your workflow. We're going to keep it simple and have just one: to inbc83d5eb0be10e316708b03ecf7fcc5fvoke Lambda functions. Add three of them chained together. For each one, you'll be able to select the Lambda functions you just created in the proper order, filter inputs and outputs, and give them descriptive names.\n", + "\n", + "Make sure that you:\n", + "\n", + "1. Are properly filtering the inputs and outputs of your invokations (e.g. `$.body`)\n", + "2. Take care to remove the error handling from the last function - it's supposed to \"fail loudly\" for your operations colleagues!\n", + "\n", + "Take a screenshot of your working step function in action and export the step function as JSON for your submission package." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Great! Now you can use the files in `./test` as test files for our workflow. Depending on our threshold, our workflow should reliably pass predictions about images from `./test` on to downstream systems, while erroring out for inferences below our confidence threshold!\n", + "\n", + "### Testing and Evaluation\n", + "\n", + "Do several step function invokations using data from the `./test` folder. This process should give you confidence that the workflow both *succeeds* AND *fails* as expected. In addition, SageMaker Model Monitor will generate recordings of your data and inferences which we can visualize.\n", + "\n", + "Here's a function that can help you generate test inputs for your invokations:" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'{\"image_data\": \"\", \"s3_bucket\": \"udacity-ml-workflow\", \"s3_key\": \"test/ordinary_bicycle_s_000431.png\"}'" + ] + }, + "execution_count": 132, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import random\n", + "import boto3\n", + "import json\n", + "\n", + "\n", + "def generate_test_case():\n", + " # Setup s3 in boto3\n", + " s3 = boto3.resource('s3')\n", + " \n", + " # Randomly pick from sfn or test folders in our bucket\n", + " objects = s3.Bucket(bucket).objects.filter(Prefix=\"test\")\n", + " \n", + " # Grab any random object key from that folder!\n", + " obj = random.choice([x.key for x in objects])\n", + " \n", + " return json.dumps({\n", + " \"image_data\": \"\",\n", + " \"s3_bucket\": bucket,\n", + " \"s3_key\": obj\n", + " })\n", + "generate_test_case()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the Step Function dashboard for your new function, you can create new executions and copy in the generated test cases. Do several executions so that you can generate data you can evaluate and visualize.\n", + "\n", + "Once you've done several executions, let's visualize the record of our inferences. Pull in the JSONLines data from your inferences like so:" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sagemaker.s3 import S3Downloader\n", + "\n", + "# In S3 your data will be saved to a datetime-aware path\n", + "# Find a path related to a datetime you're interested in\n", + "data_path = \"s3://udacity-ml-workflow/data_capture/image-classification-2023-02-14-13-25-18-287/AllTraffic/2023/02/14/13/42-58-655-83d904b7-a5b0-4a0f-93d7-60d194497d27.jsonl\"## TODO: fill in the path to your captured data\n", + "\n", + "S3Downloader.download(data_path, \"captured_data\")\n", + "\n", + "# Feel free to repeat this multiple times and pull in more data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The data are in JSONLines format, where multiple valid JSON objects are stacked on top of eachother in a single `jsonl` file. We'll import an open-source library, `jsonlines` that was purpose built for parsing this format." + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Keyring is skipped due to an exception: 'keyring.backends'\n", + "Requirement already satisfied: jsonlines in /opt/conda/lib/python3.7/site-packages (3.1.0)\n", + "Requirement already satisfied: typing-extensions in /opt/conda/lib/python3.7/site-packages (from jsonlines) (4.4.0)\n", + "Requirement already satisfied: attrs>=19.2.0 in /opt/conda/lib/python3.7/site-packages (from jsonlines) (22.1.0)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip available: \u001b[0m\u001b[31;49m22.3.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.0\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install jsonlines\n", + "import jsonlines" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can extract the data from each of the source files:" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "# List the file names we downloaded\n", + "file_handles = os.listdir(\"./captured_data\")\n", + "\n", + "# Dump all the data into an array\n", + "json_data = []\n", + "for jsonl in file_handles:\n", + " with jsonlines.open(f\"./captured_data/{jsonl}\") as f:\n", + " json_data.append(f.read())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The data should now be a list of dictionaries, with significant nesting. We'll give you an example of some code that grabs data out of the objects and visualizes it:" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "([0.9987309575080872, 0.001269030850380659], '2023-02-14T13:42:58Z')" + ] + }, + "execution_count": 138, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Define how we'll get our data\n", + "def simple_getter(obj):\n", + " inferences = obj[\"captureData\"][\"endpointOutput\"][\"data\"]\n", + " timestamp = obj[\"eventMetadata\"][\"inferenceTime\"]\n", + " return json.loads(inferences), timestamp\n", + "\n", + "simple_getter(json_data[0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, here's an example of a visualization you can build with this data. In this last part, you will take some time and build your own - the captured data has the input images, the resulting inferences, and the timestamps." + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'captureData': {'endpointInput': {'observedContentType': 'image/png',\n", + " 'mode': 'INPUT',\n", + " 'data': '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',\n", + " 'encoding': 'BASE64'},\n", + " 'endpointOutput': {'observedContentType': 'application/json',\n", + " 'mode': 'OUTPUT',\n", + " 'data': '[0.9987309575080872, 0.001269030850380659]',\n", + " 'encoding': 'JSON'}},\n", + " 'eventMetadata': {'eventId': '57ba9915-6477-481e-886e-f2e8baf84035',\n", + " 'inferenceTime': '2023-02-14T13:42:58Z'},\n", + " 'eventVersion': '0'}" + ] + }, + "execution_count": 147, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "obj" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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iMwotoCvUStuJnGny6RFpjO73U5MdDQer1eLkmTGi42J+cxdHyF/hioiIjIdKFBFREQsoEAVERGxgAJVRETEAgpUERERCyhQRURELKBAFRERsYACVURExAIKVBEREQsoUEVERCygQBUREbGAAlVERMQCClQRERELKFBFREQsoEAVERGxgAJVRETEAgpUERERCyhQRURELKBAFRERsYACVURExAIKVBEREQsoUEVERCygQBUREbGAAlVERMQCClQRERELKFBFREQsoEAVERGxgAJVRETEAgpUERERCyhQRURELKBAFRERsYACVURExAIKVBEREQsoUEVERCygQBUREbGAAlVERMQCClQRERELKFBFREQsoEAVERGxgAJVRETEAgpUERERCzhD3YFr9lXUsOvwGfq9PjJTEnhh80ryZ6dN2jYQMNhxqIpPqi7R5xkkLSmO5x5dRmFu1l1fU0RE5F48EDPUiuo6Xt91lG1rivnebz1FXnYqP3htFz393knbv7O/kgOV5/nyY6X8xbefZf3S+fzwjb00tHXf9TVFRETuxQMRqLuPnGXNQ/msXVJARnI8L24pJSE2iv2VtZO2P3L6EtvWFFGUl0VKQgwPL1vAopxMdh85e9fXFBERuRchv+XrDwRoaO3msbKiCccX5mRyuanjFucYuJyOCcdcTicXG9vv+ppj/gD+QCD42TRNAGw2Gzab7fMNSmSasNvtE76KzESmaQYz4bOEPFC9vhEM0yQ2OmLC8dioCAa8Q5OeMz4brSZvdjopCTHU1LVy6nxDcMB3c80dh6p4r/xU8LPb5eSvfvspYqKjFagy40VFRoa6CyIhY5omAx7PbduFPFCv+XRkmaZ588GrXtxcyk/eP8hf/vBtbEBKQgyrS/I5dOrCXV9z6+piNpUWTmg7NjqCx+tVoMqMZbfbiYqMZNDnwzCMUHdHJCTuZHYKD0CgRke6sdts9H9q5ujxDRMbFTHpOTFR4fzOCxsZ8/vx+kaIj4nk7b3HSY6PuetrupyOCbeRrwXqnU71RaYzwzAUqCK3EfIHI06Hg9kZSZyra5lw/FxdCzlZqZ95rsvpJCE2CsMwOVFTT0lB9j1fU0RE5G6EfIYKsKm0kFfeKWdORjI5WSmUnzhPb/8g65fOB+CVd8uJj4nk2UeWAVDX3Emfx0dWWiJ9Hh/by09imiZbyhbf8TVFRESs9EAE6vJF8/D6Rnjv45MMeIfITEngO1/ZRFJcNAA9/V5ufIw55g/wzv5Kuno9uMNcLM7L4utPrSMy3H3H1xQREbGSLeBr1APCSdzpqi6R6cxutxMTHY3H69UzVJnxYmNiPnORasifoYqIiEwHClQRERELKFBFREQsoEAVERGxgAJVRETEAgpUERERCyhQRURELKBAFRERsYACVURExAIKVBEREQsoUEVERCygQBUREbGAAlVERMQCClQRERELKFBFREQsoEAVERGxgAJVRETEAgpUERERCyhQRURELKBAFRERsYACVURExAIKVBEREQsoUEVERCygQBUREbGAAlVERMQCClQRERELKFBFREQsoEAVERGxgAJVRETEAgpUERERCyhQRURELKBAFRERsYACVURExAIKVBEREQsoUEVERCygQBUREbGAAlVERMQCClQRERELKFBFREQsoEAVERGxgAJVRETEAgpUERERCzhD3QGAfRU17Dp8hn6vj8yUBF7YvJL82Wm3bP/R0bMcOF5Lz8Ag0RFuliycy7OPLMXlHB9OwDDYfuAkR89cZmBwiLjoCMqK89i2tgS7zXa/hiUiIjNIyAO1orqO13cd5aWtq8jNTqW8spYfvLaLv/j2MyTGRd/U/siZS7y95zgvP7mWnKwUOnoG+NGvPgbgxc0rAdh56DQHKmv52pfWkpEST31rNz/e/jHh7jA2rlx0X8cnIiIzQ8gDdfeRs6x5KJ+1SwoAeHFLKdWXW9hfWcuzjyy7qf3lpk5ys9NYuTgHgOT4GFYU5nClpTPYpq65k5KC2RTlZwfbVJyto6G165b9GPMH8AcCwc+GYQT/26ZZrcxQNpsN0zSx2Wz6OZAZyzTN4NfP+jkIaaD6AwEaWrt5rKxowvGFOZlcbuqY9Jy87FSOnrlEXXMn82al0Nnr4czFJlYV5wbb5GancqCylvbuftKS4mhq7+FiU3twBjuZHYeqeK/8VPBzbGQ43/vNx4Hr/zNFZppAIMCAxxPqbohMCSENVK9vBMM0iY2OmHA8NiqCAe/QpOesKMzB6xvhv/34A0xMDMNk/dL5bF1dHGzzWFkRQyNj/OUP38Zmt2EaJk9vWMqKwpxb9mXr6mI2lRYGPxuGgdPhwOV06DdzmbGGRkb50++/zt989wUi3GGh7o5ISNzppCrkt3wBPh1XpmnefPCq2vpWPjh4ipe2rmLerPFnqL/YdZT3yk/xxLoSYPy57NHTl/jGM+vJTEmgsb2H13cdJS4mkrLivEmv63KOh6eIXGez2RgZ8+uWr8xod/p3P6SBGh3pxm6z0f+p2ajHN0xsVMSk5/xq/wlKi3KDz1xnpSYwOubnJ+8fYtvaYuw2G299VMFjq4uCM9JZqQn09HvZcajqloEqIiJyL0K6D9XpcDA7I4lzdS0Tjp+rayEnK3XSc0bHAjf9tmC3X/18dVo+6p+kjc2GHoWKiMgXJeS3fDeVFvLKO+XMyUgmJyuF8hPn6e0fZP3S+QC88m458TGRwRW/RflZfHSkmuy0xKu3fD28u/8ExfnZ2O32YJsPDlaRGBtFRko8jW097D56ltUl+SEbp8hU5HQ4eGJdCU6HHoeI3E7IA3X5onl4fSO89/FJBrxDZKYk8J2vbCLp6h7Unn4vN042H19bgg0b7+4/QZ/HR3RkOMX52Ty9YUmwzVe2rOLd/ZW8uuMwHt8wcdGRrFsyP/iMVUTujMvp4Evrl9y+oYhgC/gadSNURETkHqmWr4iIiAUUqCIiIhZQoIqIiFhAgSoiImIBBarIDOb1DXPgeA29A4Oh7orIlBfybTMiEhpv76ngw0/OALB04dzQdkZkGlCgiswwh05d4I3dx0hLjGVVcR5N7T04HY7bvppKRD6bAlVkhqhv6eJH2z+m3zvEUw8vZcPyBew8dJqm9h7C3a5Qd09kylOgiswAl5s6+PH2gyyYl8Fzjy4nzDX+o3/uSgtzM5MBMEwTu2aoIndNgSoyjQUCBg6HnTmZyfyHl7cRHRkOjL/v1zBNRkf9pCTEAihMRe6RAlVkGjpZW8/BkxeIiQynYE46SxfOJToyPDgLtdvtGIEA7T0DpCbGAOgZqsg90rYZkWnENzzC//nlfn76wSekJ8cxMubn1Z2Hqb7cDEychbZ29hEwDDJTEjBNkxuLeg+PjN3nnotMfQpUkWnkUmMHLZ19/PFvPM7zG1fwzec2kBAbRUNbz01tu/sHcbuchLtd2Gw27DYbXX0e/unNvXz4yWkCASMEIxCZunTLV2QauHYrt+pCI5HhYUS4w4LfS0uMZVFOJmN+Py7n9R/55o4eoiLcxEZFMOYP8KsDJ9hztJr82elsWlWIw6Hft0U+DwWqyBR19lITu46c5eUn15IYGwVATlYqx6rr+PDwGWanJ/Hu/hP0e3109nqIDA9j48pCliyYA0B3n5f5czI4fPoSb350jKhwN3/wa4+Rl50WymGJTFkKVJEpprvfy49/9TGXmjp4fG1JMEwByorz8AwO4/EN8drOw6wuyefhZQsYGh7lg4NV7D9eQ0ZKPOlJcXT2ebjY0E6428Wzjy5n/dL5IRyVyNSnQBWZQvYcq+b1D4+ysiiX//J7LxAbFRH8nmEY2O12tpQtpvpyMxca2tlcupioSDdJcdGsKMzh5zsPEwiMb5mJjgjnqQ1L2bamOIQjEpk+FKgiU4Q/EOByUyeZqQm8uHklURFuqi40Mjg0QkJMJAvmZQbbnq9vI8IdRkxUePCYYRo4HA5cTgd2m41vPLMel9MRiqGITEsKVJEpwDBNnA4H65fO54ODVfx4+0EGh4YZHBrF6bDT2tVHYe4snt6wjMyUeBbMzWDnodPsq6ghZ1YK3f1e3vroOA/Nn01i3PgtYoWpiLVsAV+jeftmIhIq127lXvPLvZUcP1dHUV4WW8qKsNlgcGiEf3h1F8sWzeOJdSVEuMN486NjHD59iahwN6NjfjavWswjKxaGcCQi05sCVeQBNFnVooBh4LDb6egZ4GJjO8X52cFSggA7D51mf2UNf/aNLwWP93l8dPd7mZuZjMOubTAiXyT9hIk8IGqvtHKytp727n78gQAwPjvt7B3gr//lHRpauwFITYxl5eKcCXV5AdKT4+jtH2R49HqVo/iYSHKzUhWmIveBnqGKhFhrVx8/3n6QPo+P6Ag33qERyopyeWrDUux2O3HRkQwOj3K5uZO5mcnYbDacjuvPP+12O4ZhcKK2npVFuSTHx4RwNCIzl275ioTQpaYOfr7zCHMzk3ly/UMEAgaHTl3kZG09L21bRc6sVGD81m18TOSEcw3TpL6lC7vNxjv7K+nq8/LS1lUsvGG1r4jcP5qhioSIYZr0DgySnZ7ItjXFwT2lRXlZHD59ERvXn6F+OkwBRkbGeP/jU9S3drFgXibfeu4RvShcJIQUqCL3UW19K36/wYK5GTgcdrLSEimYkz6hQENqYiyjY/5Jz29o7cY7NMyCuRlEhIfx+NoSIiPcpCXG3q8hiMgtaKWCyH1yoqaev/vJTt4rP0nPgBeA9KQ4YqMixl+fZo4/fbnY2I7Dbic9Oe6maxw+c4kfvLabPo8PgHmzUhSmIg8IBarIF8y4GpQOu5358zJobO+hsqY+uJIXwGazBbfJnG9oY25mMhHusGDIXrN1dREvbF5JYlz0/RuAiNwRBarIF+zaS71r6ltZsWgez29cwYefnKG5o3dCu2vB29DWTU7W+GKkgGGw/cBJ6lu6AIiNilBxBpEHlAJV5At2LSjDnE4MEzYsX4DDbudw1SUA+r3jt2/tNhuDQyN09nhYMDeDEzX1/Nk/vM4nVRdxuVQmUORBp0VJIl+AG8sFXpuh1jV3BFfrfuPpdXz/tV1cbu7Ebrfx3a9sJiI8jOrLzfQMDPLDN/YyMDjE8xuX8/CyBSEbh4jcOQWqiEVuLBd4Y+1dwxh/XVpkuJvC3FkA1FxpAxO6+z18+/lHiQgPA8A3PF7sfunCOTz36PL7PwgRuWsKVJF7cPpCIwODQ2SnJZGaFEt4mAvTNGlo7ebnu47y3a9sHt8bahj0Dw6xvfwkNXUtxEZF8OKWlfziw6N093vJMVJw2O0UzEnnb37vhQk1ekVkalCgityF+tYufvLeIXzDo8REheMZHGbpwrk8v3F5cMVuU3sP5+paWLJgDr7hUSLCXFxq7GBL2WJWl+QT4Q7jYmM7r+86SsHsNBLjoslIjg/10ETkLqn0oMjndKKmntd3H2XZwnk8vqaYsUCAfcfOce5KK996bgMJsVEYpklnr2fCHtErLV0kxEQSFxOJYZrYbTZGx/xUVNexuiQ/hCMSESsoUEU+p7rmTprae1i5OIcwlxObzcbuI2dp6ezj5SfX3PF1roWqiEwPClSRz2nM75/wxpeK6jp+9sEnpCfFMTczmcLcLApzZwVX+l5u7iA8zEVmSkKIey4iXyTtQxW5hdauPv75rX2cvdQMXH/vqMvpDIbp7iNneX3XUR5ZsZCVi3PxDo3wg9d20efxYbfbGRkd4/3yKv73Lz4K2ThE5P7QoiSRTzFNk/3Ha9h56DS+kVGGhkcpzJ2F3W4Pbo259rWsOI/SxbnERI2vyi0rzqWpvYd9Fed45pFluMNcbF1TRFN7T4hHJSJfNM1QRW7Q2evBHwhQfbmF9csW8PzGFfR7feyrOAfAtecj1/abRoaHERMVHqyG1OcdYnhkjITYqOA187LT2LBc5QJFpjvNUEWAU+cb+On7n1BalMPzG1ewqbSQ2RlJGIZBc0cvB09eYPmieURHhk9YTBQs5GCzYZgmp2obSE6ICRZwEJGZQ4EqM1pPv5cf/epjGtq62VS6mMfXFgNQMCc92KY4P5uG1i52HDrNv9u0YsL5Y/4AjW3dtHX3s6+iBq9vmJe2lZEcH3NfxyEioadAlRnJMAxe23mE8spa3G4Xf/v7XybMNfHH4dpMNH92GoW5WVRU17FycQ6z05OCK3j9gQB1LZ1Unqtnce4sntqwNEQjEpFQ07YZmXF2HjrNBweryExNoGB2GmcuNrFtbQnLFs6dUNQertfnrW/t4p19lUS4w/jmcxvoHRhkdMxPWlIcnsFhwlwO3GGuEI5KREJNM1SZUUbH/FTXtfDilpWsLslnYHCIXo+Pj45WU5yfjcvpmFDk/trXORnJPDR/DnuPneNHv/qYI2cusbIwh689tS64wldEZjat8pVpz+sb5mcffMLJ2gbCXE5+/6XNwVJ/sVERPFQwm7ExP7uPnAWur+T9NLvNRltXH2cuNfHi5lK+9tS6+zQCEZkKNEOVaW/nJ2cor6zFMzjM/LnpRLjDMAwjWMR+/tx0Ljd3cOzsZVYUziM5PmbCSl7DNPnV/hPsOHSaDSsW8uLmlcGZq4jINZqhyrTX3NHDwpxMfCOjHDp1ESAYpgCR4W6K87OJinCz4+BpgAk1du02G/PnpPPXv/s8X95SqjAVkUkpUGXaChgGY/4AkeFhbFtTTEJsJFUXGmnt6sNms2EYBubVggw5WakU5WVzsamd8/VtwPVSgwAL5mWSFBcdknGIyNSgQJVp5VrFIgCH3Y7L6aC9e4CE2ChWLJpHIBDg1PkG/IEAHt9wsIygw25ncV4WqQmxvLWnAmDCal8RkdvRM1SZ8sora8FmY92Sgpteh9be3Y/NZiMpLprk+Bhq69sorzzPO3sreWHLSjYsXxg8JzMlnpKCbLy+EQzTxAa6vSsid0yBKlNWQ1s3b+4+xvn6NubPzWBuRhLZ6UkTtr1EuMOIjnRjs9k4c7GJT05dZNTvJ292GuuXzsd+dYYKBIvda2YqIndD/3LIlGQYBqcvNBETFc5L28oYGhnjRG3D+MzyhpCsb+2iqb2Hv/239/jXt/ezsXQRW1YtxjRNKqqvBK8XrMmrMBWRu6QZqkxJdrudJQtms2Akg9ysVNq6+7nQ0EZNXQuLcmZhAjbGCzJER4aTmhjL155aR2piLD39Xmrr26g638DSBXNuKjkoInI3VHpQpoX2ngH+7d1ystMSeeaRpUSGu4OzVM/gMNFR4ROer15u6iAzNYFwlQsUEYvo/pY8sEzzzn7XM0yTtMRYliyYQ31rN6cvNAHX95rGRkcEw/TGbTIKUxGxkgJVHkjDI2MEbtgHeuN2mBuPw/WQXL90PlERYZy+2EhXnweAls7eCedr1a6IfFF0y1ceKKZp8vruY1xp7iTM5SQnK5Wtq4sIczkJBAwcDnuwXdWFRkoKZgME3xJTUV3HrsNnycsef67a0NrNn3/rGRWwF5EvnGao8sC40NDGX/3zO9Q1d7J51WKS42M4UVPPL/ceBwiGaXllLX/0d69RWVOPb3gEuL46d/6cDPq9PvYcrcZus/Gnv/klhamI3Bda3igPhNExP8fPXSFnVgpffqyUMJeTkoJsdh05y9lLzQwNjxIRHsbeY+d4a08FL21dxaqi3AnbXGqutPL3P91JZmoC33xuA7lZqSEckYjMNApUCZkbCzAEAgbzMlNIS4ojzOUcf9uL3Y5hmIyMjuF2jy8g2rB8AaVFOUSGu2+63pyMJL782Co2LF9wX8chIgIKVAmRDw5W0efxkZoYw9qHCogID6O0KPd6A9MEm42pG2auAAAHi0lEQVThkVGS4qKDFY1sNtukYWqYJhHuMIWpiISMAlXuq/bufv7pzb3YbDay0xN5/+Mqjp+r58l1D7EoJ/P6e0ivzlyvtHRRlJ992+t+uoaviMj9pkCV++rMpSbcLid/+PI2nA4HvuER/vH1PXx09CwJsZFkJMcHQ3VgcIiWrj6e27gcGN/y0tk7QEpCbHBVr4jIg0L/Isl9EzAMmtt7iY4Mx2G3Y5omkeFuHisrYmTUz76KGuD6bPNcXQtREW7mZCTT0tnHf/9/H/Cf/+VdRsf8ClMReeBohir3jcNux28Y+APGhNejLc7L4lJTB7VXWrnU1BFcndva2U9qQixv76lg1+GzLC+cx79/caNq74rIA0m/5st9YVytbrTmoXxqrrTS3NF7dRXv+PHi/GxGxvy0dPYFzzl9sZHTFxq50NjBf/z6k3zj6fVEuMNC0n8RkdvRr/pimeHRsQn1cW/cFnOtHFfOrBTyslN5a08Ff/DVx4LfnzcrBdM0gyUDh0fGWFWUS1pSHMV3sChJRCTUFKhyz/yBAG/sPkZbVz/hbhfLF81j2cK52Gy2YLlAx9XZ6NDwGF9av4S//9mH7D9ew7ql87EBI6NjuJxOoiLGt8SEu11sXrU4tAMTEfkcFKhyTw6fvsTbeypIS4pjdUk+h09fZM/RaiLcLgpzs4LlAvccq+atjyr4tcdXU1acxxPrSth+4CT1LV2UFudSdb4Rz+AQhTmzQjwiEZG7o0CVu9be3U/V+Qa2lC1m48pCAPJnp/FfX9keXIU7NDzKz3Yc5nx9G7/++Opg8YbH15YQ4Q7j+Lkr/OLDo9htNr753AZmpSaEbDwiIvdCb5uRuzY4NEJHzwBpSbHB6kUNbd38cu9xnlz/EHMyknHY7dQ1d5KeHBdcUBQs3sD4c9bufi/J8TEhG4eIiBUUqHLHjp+7QmR4GJnJ8cTFRN70/Vd3HKb8RC2zUhLo9QwyJyOZbWuKyctOUyEGEZn2FKhyW4dPX+LNj46RFBdNd5+XtKRYNq4sZMmCORNmm//69n7KivPIy06lqaOXPUer6R0Y5I+/9kSIRyAi8sXTM1S5pYBhsK+ihvITtTyzYSmlRbnUt3ZTXlnLxyfPszgvC5fTQcAwcNjt/OYz64PbYHKzUjl7qZmOngH6PD7iJ5nRiohMJ7oHJ7c0OurH6xtmVVEuZSX5OB0OcrNSyUiOZ3hkLFiU4VoZQdsNBeoNw6Crz8PsjCSFqYjMCJqhygStXX2kJsTicNiJCA9j2cK5ZKbEY7fZgrd3E+OiGB3zB7fEAMEwHR3zMzg0wvbyk9S3dvHVbWUANwWuiMh0o0AVYHzB0ZsfHcPlcOB0Olj7UAEPL5tPVloiMHFl7pmLTWSnJeJ0OCYsNjpRU8/5hjaOV9eRnhzP7764idTEWACFqYhMewpUoaauhbf3VLBl1WIyUxKorW/lzY+OMeYPsH7ZfMLDXNgYn2X6AwGaOnrZcrWK0Y0rd9OS4ujq8/CNp9ezYF5miEYjIhIaCtQZ7Npt2EtNnUS4w1i7pACnw0HBnHT8AYPj564QExVOWXFecIY5ODTK8MgYc2elANDeM8D+4zW8uHklmSnxZKbEh3JIIiIho0VJM9i1kGzt6iUlIQanw0EgML7QaGtZEbFR4VRdaKSn3xs8p6auhYTYKOKiI/j5h0f4T//0Nr39gwQCBqapHVgiMnNphjqDVF9u4fSFRpITYsiZlcK8q7PM+XMzeWP30fHtLw47gYBBRHgYywvn8eEnZ2ho6yYxLhrTNKm62ERLZy/f+8EbxEVH8Ce/8QRzMpNDPDIRkdDTDHUG6Pf4+F8/380r7x5gcHiEQ6cu8P1XP6SuuROAgtlpRLjDeK/8FADm1ZetlS7OZXTMT3PH+DtKx/wBxsb8uF1OXtq6ij//1jMKUxGRqzRDneZGx/y8ve847jAnf/K1J4I1c//m/27nQGUt82alEBcdyfql8/ngYBVrlxSQGBsVXNWbmhBLW/d4oIa5nMEavSIiMpFmqNNcmMuJy+GgrDiP5PgYAleLMRTnZ9HW1YdpmoS7XaxcnMPs9CT+5c29dPV5sNts9A4M0usZZOmCucHrKUxFRCanWr4zwLWXfMP1lb2vvHMAl9PJrz+xOtiud2CQ//nTnYz5A8zNSKaupZOUhBh+69mHiYtWtSMRkc+iW74zwGQVjbr7B1ldkgeMF20ASIiN4jtf3kRDWzdXWrooKchmVXHe/e+wiMgUpECdgTp7PXT09Adf5m232fAHAtgdDlITY0lNjGX5onkh7qWIyNSiZ6gzyLV9opca23GHuYLPQ7cfOMkvPjzKwOBQKLsnIjKlaYY6g1y73VvX0sWSBXOovtzCT98/xKjfz9efWkdsVESIeygiMnUpUGeYMb+f6svNdPV62HO0mi+tX8Jjq4tC3S0RkSlPgTrDuJxOkuKjWTgvkxc2r8Dl1F8BEREraNvMDHTjK9dERMQa+ld1BlKYiohYT/+yioiIWECBKiIiYgEFqoiIiAUUqCIiIhZQoIqIiFhAgSoiImIBBaqIiIgFFKgiIiIWUKCKiIhYQIEqIiJigf8P0IeIbHxeoYUAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Populate the data for the x and y axis\n", + "x = []\n", + "y = []\n", + "for obj in json_data:\n", + " inference, timestamp = simple_getter(obj)\n", + " \n", + " y.append(max(inference))\n", + " x.append(timestamp)\n", + "\n", + "# Todo: here is an visualization example, take some time to build another visual that helps monitor the result\n", + "# Plot the data\n", + "plt.figure(figsize=(5,5))\n", + "plt.scatter(x, y, c=['r' if k<.94 else 'b' for k in y ])\n", + "plt.axhline(y=0.94, color='g', linestyle='--')\n", + "plt.ylim(bottom=.88)\n", + "\n", + "# Add labels\n", + "plt.ylabel(\"Confidence\")\n", + "plt.suptitle(\"Observed Recent Inferences\", size=14)\n", + "plt.title(\"Pictured with confidence threshold for production use\", size=10)\n", + "\n", + "# Give it some pizzaz!\n", + "plt.style.use(\"Solarize_Light2\")\n", + "plt.gcf().autofmt_xdate()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Congratulations!\n", + "\n", + "You've reached the end of the project. In this project you created an event-drivent ML workflow that can be incorporated into the Scones Unlimited production architecture. You used the SageMaker Estimator API to deploy your SageMaker Model and Endpoint, and you used AWS Lambda and Step Functions to orchestrate your ML workflow. Using SageMaker Model Monitor, you instrumented and observed your Endpoint, and at the end of the project you built a visualization to help stakeholders understand the performance of the Endpoint over time. If you're up for it, you can even go further with these stretch goals:\n", + "\n", + "* Extend your workflow to incorporate more classes: the CIFAR dataset includes other vehicles that Scones Unlimited can identify with this model.\n", + "* Modify your event driven workflow: can you rewrite your Lambda functions so that the workflow can process multiple image inputs in parallel? Can the Step Function \"fan out\" to accomodate this new workflow?\n", + "* Consider the test data generator we provided for you. Can we use it to create a \"dummy data\" generator, to simulate a continuous stream of input data? Or a big paralell load of data?\n", + "* What if we want to get notified every time our step function errors out? Can we use the Step Functions visual editor in conjunction with a service like SNS to accomplish this? Try it out!\n", + "\n", + "\n" + ] + } + ], + "metadata": { + "instance_type": "ml.t3.medium", + "kernelspec": { + "display_name": "Python 3 (Data Science)", + "language": "python", + "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-east-1:081325390199:image/datascience-1.0" + }, + "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.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/project/file.png b/project/file.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d88d98c43926e79951c6dc918bf0e6f2cebf69 GIT binary patch literal 2851 zcmV+;3*7XHP)s>%ap#6S`QfeR?09uCg=RUI6ZWsEWWs!L5d+27{&2Oo3e z>))i+p8cO8K&%vDG+<}@5zTgm{r%680KbYss{$(@5}xhw-aCI!7^eKmx4#X>ptS)3 z28&!9jywAdMu&6`Hre^SM=%~DexAs(tpE4MvJjTSQXwYkQqdXx&IzX{r}WNxsG>k% zVPRp6K{}ADg!Z{MP8mAg<7Y4Mf8Gu-dP*_ukpvOOtuS+b2`qtSG(s1QI|uB3`ZJzB z+Cm7Iac7?&egE%hF0Js!n>Rqt&>sa%qZ88f3{!-h4R#ogdKfK!IRLHbJ=x;yqnpHo zfRjvc@y1)c@XBilNAh6v0iV409%1Kz@!2Vk^ho>1y!X95E`Q~1e)G4#Mmo(Hp6#)7 z=lh%TSiFdEac3lJGQ@Bcf}Solk;{LOd&navOHa-mtF zB?>BzMA;5IkB_cm%vyC8aqf9i%l!giegW|dXCoyGFTFw@jo9A*jCjx`^GZB^{D?_4 zLFR^We?ZW#;IAz*9uB#`cS1LFsnzT3Ke@;4LCOoW4z6PuO%1jA5}o4%X38zxR{I&i zGGM+aYW;j9EelH<9M9+cm)`^jIv?L+d1-}yPjUbDCzNEuY|Z7Z8*lRKuUz3Tzw;f! zB*XE1Oc4@KV!V|$+N7MGjgifBSd}^MZEh2Mw8i3u3ka>B71YKMPg8QE(EK-|uwZ-8 zqvQEZFJ5EyE5FB;*WaMu>ysxF{_vY`@kihK2JtlGY@*1FjW7yVLapLcY0MGWE$nlb zF!faqyCEt`$c6*nd*>bGG|%u|mvJ0%>&|Uvs#RXS`ZBdr8Knx2y2t$J<_~zfzt1$u z@Rrso!j!YUJ)$sTV|@jQVib(Yv`wKjIt~%W!S-GHgCVD9JxXqcN_|STQK2SnO46`0 z+dx>-W*kM_`S@e@J4bxJx65JY7_AM#xX<0YH|gv?pzRsWj*`G2B#%wg|93LO? z`Gbdq{Vw%(8&&vJG@NhNFe1a!8e14_+oH&G;%I~|U6d}6VHEHm@Be`I(k#<7WpC#M zOBg=5e~V8y?_(jcksznM^|kBFH(L~O#u>dy#2`|l(DgG$OMX4OyXtb2br@If3 z(lFni#X{qkY`*?GZ}Z}n3#jSG%(o0Hi>u7FYFt>k#OmAZKYPNw zZI}@nqYc8+Sh~Ozio!sa=SXEy6bbVEJO4^iC|1|!xcA>ZFAB60)MSkx-+aX8 z=SS3P4J;u^vnl=20Bt0u*&-YcNwOHrvT$7&*L6wK6zMt$AtbxK$cloP{Zd4pH4mzk}%xb^-mg5ijwP;`&ZFqJmy;sz)S=_@?xkW6BV}n;BnbBr z4WEWHiza*4bEAmD2wT`-3zP-+Z~bxWFLIF)7YWA1R7x5lG@c`o!lmTbu`O_hfj`?LURA~fCC>cx|eCy z>MYGKA#_1nw&*)&oTo-f)+tqLsMsf0IaxX-&kEuw!SiY~n+wS0bI(&08et2PB;#x} zVH|c@Sz93XT+(ntwOXa!ZsRy*F02hGSABN2Z9G{)ENU9(W{9E?TTR)x`aF6|krzI` zS4IgV$S{mLy2G7 zBPa2ILL0*96x%9eSuN_d7IA!vBONShGf5-D<1tYbf;Jd!VLKLDPY_tBI6&H(NjxRY z`dIY}RwZH5%gBwQV9GQZlbf8w&JibP1Ll@Wn7BaZ$qbX|46O>XEWj0t;nSG$Ep&h3ix}>h#I70aBJ|G-o*KoMHJvtq)Cksp?K0P1T|;hfcd*dZ zs+#do5QZ67t}U^?*5>edms+if$qnVo44zYEebu7X@=4Q}(I_AoYDBAn$!&!22_`)< zHDMHVnVFRFj35;gJXa8en#n{^Kkwqt*{EvDe*r$-$I)}qaA5!d002ovPDHLkV1jF} BXutpf literal 0 HcmV?d00001 diff --git a/project/lambda function/classify.py b/project/lambda function/classify.py new file mode 100644 index 000000000..396634d4e --- /dev/null +++ b/project/lambda function/classify.py @@ -0,0 +1,30 @@ +import json +import sagemaker +import base64 +from sagemaker.serializers import IdentitySerializer +from sagemaker.predictor import Predictor + +# Fill this in with the name of your deployed model +ENDPOINT = 'image-classification-2023-02-14-13-25-18-287' ## TODO: fill in + +def lambda_handler(event, context): + + # Decode the image data + image = base64.b64decode(## TODO: fill in) + + # Instantiate a Predictor + ## TODO: fill in + predictor = Predictor('image-classification-2023-02-14-13-25-18-287') + + # For this model the IdentitySerializer needs to be "image/png" + predictor.serializer = IdentitySerializer("image/png") + + # Make a prediction: + inferences = predictor.predict(predictor.serializer) ## TODO: fill in + + # We return the data back to the Step Function + event["inferences"] = inferences.decode('utf-8') + return { + 'statusCode': 200, + 'body': json.dumps(event) + } \ No newline at end of file diff --git a/project/lambda function/filter.py b/project/lambda function/filter.py new file mode 100644 index 000000000..46e7ed136 --- /dev/null +++ b/project/lambda function/filter.py @@ -0,0 +1,30 @@ +import json + +THRESHOLD = .93 + + +def lambda_handler(event, context): + + # Grab the inferences from the event + inferences = event["inferences"] ## TODO: fill in + + # Check if any values in our inferences are above THRESHOLD + meets_threshold = (inferences>THRESHOLD) ## TODO: fill in + + # If our threshold is met, pass our data back out of the + # Step Function, else, end the Step Function with an error + if meets_threshold: + pass + else: + raise("THRESHOLD_CONFIDENCE_NOT_MET") + + return { + 'statusCode': 200, + 'body': json.dumps(event) + } +def lambda_handler(event, context): + # TODO implement + return { + 'statusCode': 200, + 'body': json.dumps('Hello from Lambda!') + } diff --git a/project/lambda function/serializeImageData.py b/project/lambda function/serializeImageData.py new file mode 100644 index 000000000..e77bba4cb --- /dev/null +++ b/project/lambda function/serializeImageData.py @@ -0,0 +1,36 @@ +import json +import boto3 +import base64 + +s3 = boto3.client('s3') + +def lambda_handler(event, context): + """A function to serialize target data from S3""" + + # Get the s3 address from the Step Function event input + key = event["s3_key"] ## TODO: fill in + bucket =event["s3_bucket"] ## TODO: fill in + + # Download the data from s3 to /tmp/image.png + ## TODO: fill in + + input_object = event['image_data'] + file_name = '/tmp/image.png' + s3.download_file(bucket, input_object, file_name) + + # We read the data from a file + with open("/tmp/image.png", "rb") as f: + image_data = base64.b64encode(f.read()) + + # Pass the data back to the Step Function + print("Event:", event.keys()) + return { + 'statusCode': 200, + 'body': { + "image_data": image_data, + "s3_bucket": bucket, + "s3_key": key, + "inferences": [] + } + } + \ No newline at end of file diff --git a/project/starter (1).ipynb b/project/starter (1).ipynb new file mode 100644 index 000000000..9879638d7 --- /dev/null +++ b/project/starter (1).ipynb @@ -0,0 +1,3144 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Deploy and monitor a machine learning workflow for Image Classification" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting up this notebook\n", + "\n", + "Notes about the instance size and kernel setup: this notebook has been tested on\n", + "\n", + "1. The `Python 3 (Data Science)` kernel\n", + "2. The `ml.t3.medium` Sagemaker notebook instance\n", + "\n", + "## Data Staging\n", + "\n", + "We'll use a sample dataset called CIFAR to simulate the challenges Scones Unlimited are facing in Image Classification. In order to start working with CIFAR we'll need to:\n", + "\n", + "1. Extract the data from a hosting service\n", + "2. Transform it into a usable shape and format\n", + "3. Load it into a production system\n", + "\n", + "In other words, we're going to do some simple ETL!\n", + "\n", + "### 1. Extract the data from the hosting service\n", + "\n", + "In the cell below, define a function `extract_cifar_data` that extracts python version of the CIFAR-100 dataset. The CIFAR dataaset is open source and generously hosted by the University of Toronto at: https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "def extract_cifar_data(url, filename=\"cifar.tar.gz\"):\n", + " \"\"\"A function for extracting the CIFAR-100 dataset and storing it as a gzipped file\n", + " \n", + " Arguments:\n", + " url -- the URL where the dataset is hosted\n", + " filename -- the full path where the dataset will be written\n", + " \n", + " \"\"\"\n", + " \n", + " # Todo: request the data from the data url\n", + " # Hint: use `requests.get` method\n", + " r = requests.get(url)\n", + " with open(filename, \"wb\") as file_context:\n", + " file_context.write(r.content)\n", + " return" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's test it out! Run the following cell and check whether a new file `cifar.tar.gz` is created in the file explorer." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "extract_cifar_data(\"https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz\") " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Transform the data into a usable shape and format\n", + "\n", + "Clearly, distributing the data as a gzipped archive makes sense for the hosting service! It saves on bandwidth, storage, and it's a widely-used archive format. In fact, it's so widely used that the Python community ships a utility for working with them, `tarfile`, as part of its Standard Library. Execute the following cell to decompress your extracted dataset:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import tarfile\n", + "\n", + "with tarfile.open(\"cifar.tar.gz\", \"r:gz\") as tar:\n", + " tar.extractall()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A new folder `cifar-100-python` should be created, containing `meta`, `test`, and `train` files. These files are `pickles` and the [CIFAR homepage](https://www.cs.toronto.edu/~kriz/cifar.html) provides a simple script that can be used to load them. We've adapted the script below for you to run:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pickle\n", + "\n", + "with open(\"./cifar-100-python/meta\", \"rb\") as f:\n", + " dataset_meta = pickle.load(f, encoding='bytes')\n", + "\n", + "with open(\"./cifar-100-python/test\", \"rb\") as f:\n", + " dataset_test = pickle.load(f, encoding='bytes')\n", + "\n", + "with open(\"./cifar-100-python/train\", \"rb\") as f:\n", + " dataset_train = pickle.load(f, encoding='bytes')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys([b'filenames', b'batch_label', b'fine_labels', b'coarse_labels', b'data'])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Feel free to explore the datasets\n", + "\n", + "dataset_train.keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As documented on the homepage, `b'data'` contains rows of 3073 unsigned integers, representing three channels (red, green, and blue) for one 32x32 pixel image per row." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3072" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "32*32*3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For a simple gut-check, let's transform one of our images. Each 1024 items in a row is a channel (red, green, then blue). Each 32 items in the channel are a row in the 32x32 image. Using python, we can stack these channels into a 32x32x3 array, and save it as a PNG file:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Each 1024 in a row is a channel (red, green, then blue)\n", + "row = dataset_train[b'data'][0]\n", + "red, green, blue = row[0:1024], row[1024:2048], row[2048:]\n", + "\n", + "# Each 32 items in the channel are a row in the 32x32 image\n", + "red = red.reshape(32,32)\n", + "green = green.reshape(32,32)\n", + "blue = blue.reshape(32,32)\n", + "\n", + "# Combine the channels into a 32x32x3 image!\n", + "combined = np.dstack((red,green,blue))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For a more concise version, consider the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# All in one:\n", + "test_image = np.dstack((\n", + " row[0:1024].reshape(32,32),\n", + " row[1024:2048].reshape(32,32),\n", + " row[2048:].reshape(32,32)\n", + "))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.imshow(test_image);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Looks like a cow! Let's check the label. `dataset_meta` contains label names in order, and `dataset_train` has a list of labels for each row." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "19" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_train[b'fine_labels'][0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our image has a label of `19`, so let's see what the 19th item is in the list of label names." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b'cattle'\n" + ] + } + ], + "source": [ + "print(dataset_meta[b'fine_label_names'][19])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ok! 'cattle' sounds about right. By the way, using the previous two lines we can do:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b'cattle'\n" + ] + } + ], + "source": [ + "n = 0\n", + "print(dataset_meta[b'fine_label_names'][dataset_train[b'fine_labels'][n]])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we know how to check labels, is there a way that we can also check file names? `dataset_train` also contains a `b'filenames'` key. Let's see what we have here:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b'bos_taurus_s_000507.png'\n" + ] + } + ], + "source": [ + "print(dataset_train[b'filenames'][0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\"Taurus\" is the name of a subspecies of cattle, so this looks like a pretty reasonable filename. To save an image we can also do:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "plt.imsave(\"file.png\", test_image)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your new PNG file should now appear in the file explorer -- go ahead and pop it open to see!\n", + "\n", + "Now that you know how to reshape the images, save them as files, and capture their filenames and labels, let's just capture all the bicycles and motorcycles and save them. Scones Unlimited can use a model that tells these apart to route delivery drivers automatically.\n", + "\n", + "In the following cell, identify the label numbers for Bicycles and Motorcycles:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "b'motorcycle'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_meta[b'fine_label_names'][48]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "b'bicycle'" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_meta[b'fine_label_names'][8]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys([b'filenames', b'batch_label', b'fine_labels', b'coarse_labels', b'data'])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_train.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_train[b'fine_labels'] == 8 " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys([b'fine_label_names', b'coarse_label_names'])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_meta.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Motorcycle Label 48: b'motorcycle'\n", + "Bicycle Label 8: b'bicycle'\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "# Todo: Filter the dataset_train and dataset_meta objects to find the label numbers for Bicycle and Motorcycles\n", + "motor_label = dataset_meta[b'fine_label_names'][48]\n", + "bicycle_label = dataset_meta[b'fine_label_names'][8]\n", + "print('Motorcycle Label 48:', dataset_meta[b'fine_label_names'][48])\n", + "print('Bicycle Label 8:', dataset_meta[b'fine_label_names'][8])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Good job! We only need objects with label 8 and 48 -- this drastically simplifies our handling of the data! Below we construct a dataframe for you, and you can safely drop the rows that don't contain observations about bicycles and motorcycles. Fill in the missing lines below to drop all other rows:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#Construct the dataframe\n", + "df_train = pd.DataFrame({\n", + " \"filenames\": dataset_train[b'filenames'],\n", + " \"labels\": dataset_train[b'fine_labels'],\n", + " \"row\": range(len(dataset_train[b'filenames']))\n", + "})\n", + "\n", + "# Drop all rows from df_train where label is not 8 or 48\n", + "mask_train = (df_train['labels'] == 8) | (df_train['labels'] == 48)\n", + "df_train = df_train[mask_train]\n", + "\n", + "# Decode df_train.filenames so they are regular strings\n", + "df_train[\"filenames\"] = df_train[\"filenames\"].apply(\n", + " lambda x: x.decode(\"utf-8\")\n", + ")\n", + "\n", + "\n", + "df_test = pd.DataFrame({\n", + " \"filenames\": dataset_test[b'filenames'],\n", + " \"labels\": dataset_test[b'fine_labels'],\n", + " \"row\": range(len(dataset_test[b'filenames']))\n", + "})\n", + "\n", + "# Drop all rows from df_test where label is not 8 or 48\n", + "mask_test = (df_test['labels'] == 8) | (df_test['labels'] == 48)\n", + "df_test = df_test[mask_test]\n", + "\n", + "# Decode df_test.filenames so they are regular strings\n", + "df_test[\"filenames\"] = df_test[\"filenames\"].apply(\n", + " lambda x: x.decode(\"utf-8\")\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that the data is filtered for just our classes, we can save all our images." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "!mkdir ./train\n", + "!mkdir ./test" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the previous sections we introduced you to several key snippets of code:\n", + "\n", + "1. Grabbing the image data:\n", + "\n", + "```python\n", + "dataset_train[b'data'][0]\n", + "```\n", + "\n", + "2. A simple idiom for stacking the image data into the right shape\n", + "\n", + "```python\n", + "import numpy as np\n", + "np.dstack((\n", + " row[0:1024].reshape(32,32),\n", + " row[1024:2048].reshape(32,32),\n", + " row[2048:].reshape(32,32)\n", + "))\n", + "```\n", + "\n", + "3. A simple `matplotlib` utility for saving images\n", + "\n", + "```python\n", + "plt.imsave(path+row['filenames'], target)\n", + "```\n", + "\n", + "Compose these together into a function that saves all the images into the `./test` and `./train` directories. Use the comments in the body of the `save_images` function below to guide your construction of the function:\n" + ] + }, + { + "cell_type": "raw", + "metadata": { + "tags": [] + }, + "source": [ + "for index, row in df_train.iterrows():\n", + " name = row[b'filenames']\n", + " path = 'train/'\n", + " data = dataset_train[b'data'][row['row']]\n", + " save_images(data, path, names)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "8" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_train[b'fine_labels'][16]" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "b'bike_s_000682.png'" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_train[b'filenames'][16]" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "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", + "
filenameslabelsrow
16bike_s_000682.png816
30bike_s_000127.png830
130cycle_s_002598.png8130
152minibike_s_000824.png48152
195motorcycle_s_001856.png48195
............
49578velocipede_s_000010.png849578
49588motorcycle_s_001247.png4849588
49882motorcycle_s_000724.png4849882
49962velocipede_s_001637.png849962
49985motorcycle_s_000291.png4849985
\n", + "

1000 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " filenames labels row\n", + "16 bike_s_000682.png 8 16\n", + "30 bike_s_000127.png 8 30\n", + "130 cycle_s_002598.png 8 130\n", + "152 minibike_s_000824.png 48 152\n", + "195 motorcycle_s_001856.png 48 195\n", + "... ... ... ...\n", + "49578 velocipede_s_000010.png 8 49578\n", + "49588 motorcycle_s_001247.png 48 49588\n", + "49882 motorcycle_s_000724.png 48 49882\n", + "49962 velocipede_s_001637.png 8 49962\n", + "49985 motorcycle_s_000291.png 48 49985\n", + "\n", + "[1000 rows x 3 columns]" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_train" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def save_images(data, path, filename):\n", + " #Grab the image data in row-major form\n", + " img = data\n", + " \n", + " # Consolidated stacking/reshaping from earlier\n", + " target = np.dstack((img[0:1024].reshape(32,32),\n", + " img[1024:2048].reshape(32,32),\n", + " img[2048:].reshape(32,32)\n", + " ))\n", + " \n", + " \n", + " # Save the image\n", + " plt.imsave(path+filename, target)\n", + " \n", + " # Return any signal data you want for debugging\n", + " return True\n", + "\n", + "## TODO: save ALL images using the save_images function\n", + "for index, row in df_train.iterrows():\n", + " name = row['filenames']\n", + " path = 'train/'\n", + " data = dataset_train[b'data'][row['row']]\n", + " save_images(data, path, name)\n", + " \n", + "for index, row in df_test.iterrows():\n", + " name = row['filenames']\n", + " path = 'test/'\n", + " data = dataset_train[b'data'][row['row']]\n", + " save_images(data, path, name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. Load the data\n", + "\n", + "Now we can load the data into S3.\n", + "\n", + "Using the sagemaker SDK grab the current region, execution role, and bucket." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Default Bucket: udacity-ml-workflow\n", + "AWS Region: us-east-1\n", + "RoleArn: arn:aws:iam::683237399578:role/service-role/AmazonSageMaker-ExecutionRole-20230119T145763\n" + ] + } + ], + "source": [ + "import sagemaker\n", + "from sagemaker import get_execution_role\n", + "\n", + "bucket= \"udacity-ml-workflow\"\n", + "print(\"Default Bucket: {}\".format(bucket))\n", + "\n", + "region = \"us-east-1\"\n", + "print(\"AWS Region: {}\".format(region))\n", + "\n", + "role = get_execution_role()\n", + "print(\"RoleArn: {}\".format(role))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With this data we can easily sync your data up into S3!" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "upload: train/bicycle_s_000017.png to s3://udacity-ml-workflow/train/bicycle_s_000017.png\n", + "upload: train/bicycle_s_000099.png to s3://udacity-ml-workflow/train/bicycle_s_000099.png\n", + "upload: train/bicycle_s_000137.png to s3://udacity-ml-workflow/train/bicycle_s_000137.png\n", + "upload: train/bicycle_s_000038.png to s3://udacity-ml-workflow/train/bicycle_s_000038.png\n", + "upload: train/bicycle_s_000021.png to s3://udacity-ml-workflow/train/bicycle_s_000021.png\n", + "upload: train/bicycle_s_000035.png to s3://udacity-ml-workflow/train/bicycle_s_000035.png\n", + "upload: train/bicycle_s_000124.png to s3://udacity-ml-workflow/train/bicycle_s_000124.png\n", + "upload: train/bicycle_s_000149.png to s3://udacity-ml-workflow/train/bicycle_s_000149.png\n", + "upload: train/bicycle_s_000147.png to s3://udacity-ml-workflow/train/bicycle_s_000147.png\n", + "upload: train/bicycle_s_000039.png to s3://udacity-ml-workflow/train/bicycle_s_000039.png\n", + "upload: train/bicycle_s_000156.png to s3://udacity-ml-workflow/train/bicycle_s_000156.png\n", + "upload: train/bicycle_s_000043.png to s3://udacity-ml-workflow/train/bicycle_s_000043.png\n", + "upload: train/bicycle_s_000231.png to s3://udacity-ml-workflow/train/bicycle_s_000231.png\n", + "upload: train/bicycle_s_000235.png to s3://udacity-ml-workflow/train/bicycle_s_000235.png\n", + "upload: train/bicycle_s_000066.png to s3://udacity-ml-workflow/train/bicycle_s_000066.png\n", + "upload: train/bicycle_s_000159.png to s3://udacity-ml-workflow/train/bicycle_s_000159.png\n", + "upload: train/bicycle_s_000180.png to s3://udacity-ml-workflow/train/bicycle_s_000180.png\n", + "upload: train/bicycle_s_000243.png to s3://udacity-ml-workflow/train/bicycle_s_000243.png\n", + "upload: train/bicycle_s_000051.png to s3://udacity-ml-workflow/train/bicycle_s_000051.png\n", + "upload: train/bicycle_s_000279.png to s3://udacity-ml-workflow/train/bicycle_s_000279.png\n", + "upload: train/bicycle_s_000371.png to s3://udacity-ml-workflow/train/bicycle_s_000371.png\n", + "upload: train/bicycle_s_000282.png to s3://udacity-ml-workflow/train/bicycle_s_000282.png\n", + "upload: train/bicycle_s_000369.png to s3://udacity-ml-workflow/train/bicycle_s_000369.png\n", + "upload: train/bicycle_s_000392.png to s3://udacity-ml-workflow/train/bicycle_s_000392.png\n", + "upload: train/bicycle_s_000071.png to s3://udacity-ml-workflow/train/bicycle_s_000071.png\n", + "upload: train/bicycle_s_000437.png to s3://udacity-ml-workflow/train/bicycle_s_000437.png\n", + "upload: train/bicycle_s_000399.png to s3://udacity-ml-workflow/train/bicycle_s_000399.png\n", + "upload: train/bicycle_s_000408.png to s3://udacity-ml-workflow/train/bicycle_s_000408.png\n", + "upload: train/bicycle_s_000435.png to s3://udacity-ml-workflow/train/bicycle_s_000435.png\n", + "upload: train/bicycle_s_000522.png to s3://udacity-ml-workflow/train/bicycle_s_000522.png\n", + "upload: train/bicycle_s_000396.png to s3://udacity-ml-workflow/train/bicycle_s_000396.png\n", + "upload: train/bicycle_s_000467.png to s3://udacity-ml-workflow/train/bicycle_s_000467.png\n", + "upload: train/bicycle_s_000491.png to s3://udacity-ml-workflow/train/bicycle_s_000491.png\n", + "upload: train/bicycle_s_000314.png to s3://udacity-ml-workflow/train/bicycle_s_000314.png\n", + "upload: train/bicycle_s_000463.png to s3://udacity-ml-workflow/train/bicycle_s_000463.png\n", + "upload: train/bicycle_s_000537.png to s3://udacity-ml-workflow/train/bicycle_s_000537.png\n", + "upload: train/bicycle_s_000536.png to s3://udacity-ml-workflow/train/bicycle_s_000536.png\n", + "upload: train/bicycle_s_000546.png to s3://udacity-ml-workflow/train/bicycle_s_000546.png\n", + "upload: train/bicycle_s_000569.png to s3://udacity-ml-workflow/train/bicycle_s_000569.png\n", + "upload: train/bicycle_s_000561.png to s3://udacity-ml-workflow/train/bicycle_s_000561.png\n", + "upload: train/bicycle_s_000668.png to s3://udacity-ml-workflow/train/bicycle_s_000668.png\n", + "upload: train/bicycle_s_000667.png to s3://udacity-ml-workflow/train/bicycle_s_000667.png\n", + "upload: train/bicycle_s_000723.png to s3://udacity-ml-workflow/train/bicycle_s_000723.png\n", + "upload: train/bicycle_s_000753.png to s3://udacity-ml-workflow/train/bicycle_s_000753.png\n", + "upload: train/bicycle_s_000759.png to s3://udacity-ml-workflow/train/bicycle_s_000759.png\n", + "upload: train/bicycle_s_000775.png to s3://udacity-ml-workflow/train/bicycle_s_000775.png\n", + "upload: train/bicycle_s_000829.png to s3://udacity-ml-workflow/train/bicycle_s_000829.png\n", + "upload: train/bicycle_s_000782.png to s3://udacity-ml-workflow/train/bicycle_s_000782.png\n", + "upload: train/bicycle_s_000778.png to s3://udacity-ml-workflow/train/bicycle_s_000778.png\n", + "upload: train/bicycle_s_000951.png to s3://udacity-ml-workflow/train/bicycle_s_000951.png\n", + "upload: train/bicycle_s_000785.png to s3://udacity-ml-workflow/train/bicycle_s_000785.png\n", + "upload: train/bicycle_s_000774.png to s3://udacity-ml-workflow/train/bicycle_s_000774.png\n", + "upload: train/bicycle_s_000822.png to s3://udacity-ml-workflow/train/bicycle_s_000822.png\n", + "upload: train/bicycle_s_000978.png to s3://udacity-ml-workflow/train/bicycle_s_000978.png\n", + "upload: train/bicycle_s_000986.png to s3://udacity-ml-workflow/train/bicycle_s_000986.png\n", + "upload: train/bicycle_s_000861.png to s3://udacity-ml-workflow/train/bicycle_s_000861.png\n", + "upload: train/bicycle_s_000781.png to s3://udacity-ml-workflow/train/bicycle_s_000781.png\n", + "upload: train/bicycle_s_001168.png to s3://udacity-ml-workflow/train/bicycle_s_001168.png\n", + "upload: train/bicycle_s_000996.png to s3://udacity-ml-workflow/train/bicycle_s_000996.png\n", + "upload: train/bicycle_s_001111.png to s3://udacity-ml-workflow/train/bicycle_s_001111.png\n", + "upload: train/bicycle_s_001002.png to s3://udacity-ml-workflow/train/bicycle_s_001002.png\n", + "upload: train/bicycle_s_001174.png to s3://udacity-ml-workflow/train/bicycle_s_001174.png\n", + "upload: train/bicycle_s_001245.png to s3://udacity-ml-workflow/train/bicycle_s_001245.png\n", + "upload: train/bicycle_s_001228.png to s3://udacity-ml-workflow/train/bicycle_s_001228.png\n", + "upload: train/bicycle_s_001388.png to s3://udacity-ml-workflow/train/bicycle_s_001388.png\n", + "upload: train/bicycle_s_001348.png to s3://udacity-ml-workflow/train/bicycle_s_001348.png\n", + "upload: train/bicycle_s_001247.png to s3://udacity-ml-workflow/train/bicycle_s_001247.png\n", + "upload: train/bicycle_s_001205.png to s3://udacity-ml-workflow/train/bicycle_s_001205.png\n", + "upload: train/bicycle_s_001402.png to s3://udacity-ml-workflow/train/bicycle_s_001402.png\n", + "upload: train/bicycle_s_001338.png to s3://udacity-ml-workflow/train/bicycle_s_001338.png\n", + "upload: train/bicycle_s_001203.png to s3://udacity-ml-workflow/train/bicycle_s_001203.png\n", + "upload: train/bicycle_s_001411.png to s3://udacity-ml-workflow/train/bicycle_s_001411.png\n", + "upload: train/bicycle_s_001452.png to s3://udacity-ml-workflow/train/bicycle_s_001452.png\n", + "upload: train/bicycle_s_001470.png to s3://udacity-ml-workflow/train/bicycle_s_001470.png\n", + "upload: train/bicycle_s_001448.png to s3://udacity-ml-workflow/train/bicycle_s_001448.png\n", + "upload: train/bicycle_s_001409.png to s3://udacity-ml-workflow/train/bicycle_s_001409.png\n", + "upload: train/bicycle_s_001554.png to s3://udacity-ml-workflow/train/bicycle_s_001554.png\n", + "upload: train/bicycle_s_001663.png to s3://udacity-ml-workflow/train/bicycle_s_001663.png\n", + "upload: train/bicycle_s_001583.png to s3://udacity-ml-workflow/train/bicycle_s_001583.png\n", + "upload: train/bicycle_s_001688.png to s3://udacity-ml-workflow/train/bicycle_s_001688.png\n", + "upload: train/bicycle_s_001687.png to s3://udacity-ml-workflow/train/bicycle_s_001687.png\n", + "upload: train/bicycle_s_001693.png to s3://udacity-ml-workflow/train/bicycle_s_001693.png\n", + "upload: train/bicycle_s_001679.png to s3://udacity-ml-workflow/train/bicycle_s_001679.png\n", + "upload: train/bicycle_s_001673.png to s3://udacity-ml-workflow/train/bicycle_s_001673.png\n", + "upload: train/bicycle_s_001748.png to s3://udacity-ml-workflow/train/bicycle_s_001748.png\n", + "upload: train/bicycle_s_001642.png to s3://udacity-ml-workflow/train/bicycle_s_001642.png\n", + "upload: train/bicycle_s_001681.png to s3://udacity-ml-workflow/train/bicycle_s_001681.png\n", + "upload: train/bicycle_s_001757.png to s3://udacity-ml-workflow/train/bicycle_s_001757.png\n", + "upload: train/bicycle_s_001569.png to s3://udacity-ml-workflow/train/bicycle_s_001569.png\n", + "upload: train/bicycle_s_001956.png to s3://udacity-ml-workflow/train/bicycle_s_001956.png\n", + "upload: train/bicycle_s_001814.png to s3://udacity-ml-workflow/train/bicycle_s_001814.png\n", + "upload: train/bicycle_s_002029.png to s3://udacity-ml-workflow/train/bicycle_s_002029.png\n", + "upload: train/bicycle_s_002012.png to s3://udacity-ml-workflow/train/bicycle_s_002012.png\n", + "upload: train/bicycle_s_001904.png to s3://udacity-ml-workflow/train/bicycle_s_001904.png\n", + "upload: train/bicycle_s_002100.png to s3://udacity-ml-workflow/train/bicycle_s_002100.png\n", + "upload: train/bicycle_s_002005.png to s3://udacity-ml-workflow/train/bicycle_s_002005.png\n", + "upload: train/bicycle_s_001928.png to s3://udacity-ml-workflow/train/bicycle_s_001928.png\n", + "upload: train/bicycle_s_002049.png to s3://udacity-ml-workflow/train/bicycle_s_002049.png\n", + "upload: train/bicycle_s_002129.png to s3://udacity-ml-workflow/train/bicycle_s_002129.png\n", + "upload: train/bicycle_s_002132.png to s3://udacity-ml-workflow/train/bicycle_s_002132.png\n", + "upload: train/bicycle_s_002218.png to s3://udacity-ml-workflow/train/bicycle_s_002218.png\n", + "upload: train/bicycle_s_002222.png to s3://udacity-ml-workflow/train/bicycle_s_002222.png\n", + "upload: train/bicycle_s_002153.png to s3://udacity-ml-workflow/train/bicycle_s_002153.png\n", + "upload: train/bicycle_s_002258.png to s3://udacity-ml-workflow/train/bicycle_s_002258.png\n", + "upload: train/bicycle_s_002247.png to s3://udacity-ml-workflow/train/bicycle_s_002247.png\n", + "upload: train/bicycle_s_002373.png to s3://udacity-ml-workflow/train/bicycle_s_002373.png\n", + "upload: train/bicycle_s_002299.png to s3://udacity-ml-workflow/train/bicycle_s_002299.png\n", + "upload: train/bicycle_s_002338.png to s3://udacity-ml-workflow/train/bicycle_s_002338.png\n", + "upload: train/bicycle_s_002374.png to s3://udacity-ml-workflow/train/bicycle_s_002374.png\n", + "upload: train/bicycle_s_002400.png to s3://udacity-ml-workflow/train/bicycle_s_002400.png\n", + "upload: train/bicycle_s_002237.png to s3://udacity-ml-workflow/train/bicycle_s_002237.png\n", + "upload: train/bicycle_s_002436.png to s3://udacity-ml-workflow/train/bicycle_s_002436.png\n", + "upload: train/bicycle_s_002448.png to s3://udacity-ml-workflow/train/bicycle_s_002448.png\n", + "upload: train/bicycle_s_002410.png to s3://udacity-ml-workflow/train/bicycle_s_002410.png\n", + "upload: train/bicycle_s_002475.png to s3://udacity-ml-workflow/train/bicycle_s_002475.png\n", + "upload: train/bicycle_s_002550.png to s3://udacity-ml-workflow/train/bicycle_s_002550.png\n", + "upload: train/bicycle_s_002661.png to s3://udacity-ml-workflow/train/bicycle_s_002661.png\n", + "upload: train/bicycle_s_002569.png to s3://udacity-ml-workflow/train/bicycle_s_002569.png\n", + "upload: train/bicycle_s_002711.png to s3://udacity-ml-workflow/train/bicycle_s_002711.png\n", + "upload: train/bicycle_s_002669.png to s3://udacity-ml-workflow/train/bicycle_s_002669.png\n", + "upload: train/bicycle_s_002715.png to s3://udacity-ml-workflow/train/bicycle_s_002715.png\n", + "upload: train/bicycle_s_002521.png to s3://udacity-ml-workflow/train/bicycle_s_002521.png\n", + "upload: train/bicycle_s_002725.png to s3://udacity-ml-workflow/train/bicycle_s_002725.png\n", + "upload: train/bicycle_s_002624.png to s3://udacity-ml-workflow/train/bicycle_s_002624.png\n", + "upload: train/bicycle_s_002729.png to s3://udacity-ml-workflow/train/bicycle_s_002729.png\n", + "upload: train/bicycle_s_002728.png to s3://udacity-ml-workflow/train/bicycle_s_002728.png\n", + "upload: train/bike_s_000001.png to s3://udacity-ml-workflow/train/bike_s_000001.png \n", + "upload: train/bicycle_s_002759.png to s3://udacity-ml-workflow/train/bicycle_s_002759.png\n", + "upload: train/bike_s_000015.png to s3://udacity-ml-workflow/train/bike_s_000015.png \n", + "upload: train/bike_s_000021.png to s3://udacity-ml-workflow/train/bike_s_000021.png \n", + "upload: train/bike_s_000018.png to s3://udacity-ml-workflow/train/bike_s_000018.png \n", + "upload: train/bike_s_000023.png to s3://udacity-ml-workflow/train/bike_s_000023.png \n", + "upload: train/bike_s_000005.png to s3://udacity-ml-workflow/train/bike_s_000005.png \n", + "upload: train/bicycle_s_002762.png to s3://udacity-ml-workflow/train/bicycle_s_002762.png\n", + "upload: train/bike_s_000025.png to s3://udacity-ml-workflow/train/bike_s_000025.png \n", + "upload: train/bike_s_000003.png to s3://udacity-ml-workflow/train/bike_s_000003.png \n", + "upload: train/bike_s_000026.png to s3://udacity-ml-workflow/train/bike_s_000026.png \n", + "upload: train/bike_s_000034.png to s3://udacity-ml-workflow/train/bike_s_000034.png \n", + "upload: train/bike_s_000024.png to s3://udacity-ml-workflow/train/bike_s_000024.png \n", + "upload: train/bike_s_000111.png to s3://udacity-ml-workflow/train/bike_s_000111.png \n", + "upload: train/bike_s_000062.png to s3://udacity-ml-workflow/train/bike_s_000062.png \n", + "upload: train/bike_s_000121.png to s3://udacity-ml-workflow/train/bike_s_000121.png \n", + "upload: train/bike_s_000127.png to s3://udacity-ml-workflow/train/bike_s_000127.png \n", + "upload: train/bike_s_000040.png to s3://udacity-ml-workflow/train/bike_s_000040.png \n", + "upload: train/bike_s_000162.png to s3://udacity-ml-workflow/train/bike_s_000162.png \n", + "upload: train/bike_s_000051.png to s3://udacity-ml-workflow/train/bike_s_000051.png \n", + "upload: train/bike_s_000129.png to s3://udacity-ml-workflow/train/bike_s_000129.png \n", + "upload: train/bike_s_000154.png to s3://udacity-ml-workflow/train/bike_s_000154.png \n", + "upload: train/bike_s_000237.png to s3://udacity-ml-workflow/train/bike_s_000237.png \n", + "upload: train/bike_s_000204.png to s3://udacity-ml-workflow/train/bike_s_000204.png \n", + "upload: train/bike_s_000035.png to s3://udacity-ml-workflow/train/bike_s_000035.png \n", + "upload: train/bike_s_000164.png to s3://udacity-ml-workflow/train/bike_s_000164.png \n", + "upload: train/bike_s_000256.png to s3://udacity-ml-workflow/train/bike_s_000256.png \n", + "upload: train/bike_s_000304.png to s3://udacity-ml-workflow/train/bike_s_000304.png \n", + "upload: train/bike_s_000392.png to s3://udacity-ml-workflow/train/bike_s_000392.png \n", + "upload: train/bike_s_000364.png to s3://udacity-ml-workflow/train/bike_s_000364.png \n", + "upload: train/bike_s_000390.png to s3://udacity-ml-workflow/train/bike_s_000390.png \n", + "upload: train/bike_s_000302.png to s3://udacity-ml-workflow/train/bike_s_000302.png \n", + "upload: train/bike_s_000474.png to s3://udacity-ml-workflow/train/bike_s_000474.png \n", + "upload: train/bike_s_000336.png to s3://udacity-ml-workflow/train/bike_s_000336.png \n", + "upload: train/bike_s_000506.png to s3://udacity-ml-workflow/train/bike_s_000506.png \n", + "upload: train/bike_s_000516.png to s3://udacity-ml-workflow/train/bike_s_000516.png \n", + "upload: train/bike_s_000299.png to s3://udacity-ml-workflow/train/bike_s_000299.png \n", + "upload: train/bike_s_000522.png to s3://udacity-ml-workflow/train/bike_s_000522.png \n", + "upload: train/bike_s_000545.png to s3://udacity-ml-workflow/train/bike_s_000545.png \n", + "upload: train/bike_s_000544.png to s3://udacity-ml-workflow/train/bike_s_000544.png \n", + "upload: train/bike_s_000555.png to s3://udacity-ml-workflow/train/bike_s_000555.png \n", + "upload: train/bike_s_000397.png to s3://udacity-ml-workflow/train/bike_s_000397.png \n", + "upload: train/bike_s_000593.png to s3://udacity-ml-workflow/train/bike_s_000593.png \n", + "upload: train/bike_s_000657.png to s3://udacity-ml-workflow/train/bike_s_000657.png \n", + "upload: train/bike_s_000628.png to s3://udacity-ml-workflow/train/bike_s_000628.png \n", + "upload: train/bike_s_000679.png to s3://udacity-ml-workflow/train/bike_s_000679.png \n", + "upload: train/bike_s_000682.png to s3://udacity-ml-workflow/train/bike_s_000682.png \n", + "upload: train/bike_s_000855.png to s3://udacity-ml-workflow/train/bike_s_000855.png \n", + "upload: train/bike_s_000722.png to s3://udacity-ml-workflow/train/bike_s_000722.png \n", + "upload: train/bike_s_000926.png to s3://udacity-ml-workflow/train/bike_s_000926.png \n", + "upload: train/bike_s_000934.png to s3://udacity-ml-workflow/train/bike_s_000934.png \n", + "upload: train/bike_s_001027.png to s3://udacity-ml-workflow/train/bike_s_001027.png \n", + "upload: train/bike_s_001078.png to s3://udacity-ml-workflow/train/bike_s_001078.png \n", + "upload: train/bike_s_001072.png to s3://udacity-ml-workflow/train/bike_s_001072.png \n", + "upload: train/bike_s_001093.png to s3://udacity-ml-workflow/train/bike_s_001093.png \n", + "upload: train/bike_s_000990.png to s3://udacity-ml-workflow/train/bike_s_000990.png \n", + "upload: train/bike_s_001113.png to s3://udacity-ml-workflow/train/bike_s_001113.png \n", + "upload: train/bike_s_001131.png to s3://udacity-ml-workflow/train/bike_s_001131.png \n", + "upload: train/bike_s_001200.png to s3://udacity-ml-workflow/train/bike_s_001200.png \n", + "upload: train/bike_s_001226.png to s3://udacity-ml-workflow/train/bike_s_001226.png \n", + "upload: train/bike_s_001415.png to s3://udacity-ml-workflow/train/bike_s_001415.png \n", + "upload: train/bike_s_001320.png to s3://udacity-ml-workflow/train/bike_s_001320.png \n", + "upload: train/bike_s_001260.png to s3://udacity-ml-workflow/train/bike_s_001260.png \n", + "upload: train/bike_s_001418.png to s3://udacity-ml-workflow/train/bike_s_001418.png \n", + "upload: train/bike_s_001375.png to s3://udacity-ml-workflow/train/bike_s_001375.png \n", + "upload: train/bike_s_001517.png to s3://udacity-ml-workflow/train/bike_s_001517.png \n", + "upload: train/bike_s_001519.png to s3://udacity-ml-workflow/train/bike_s_001519.png \n", + "upload: train/bike_s_001592.png to s3://udacity-ml-workflow/train/bike_s_001592.png \n", + "upload: train/bike_s_001572.png to s3://udacity-ml-workflow/train/bike_s_001572.png \n", + "upload: train/bike_s_001116.png to s3://udacity-ml-workflow/train/bike_s_001116.png \n", + "upload: train/bike_s_001679.png to s3://udacity-ml-workflow/train/bike_s_001679.png \n", + "upload: train/bike_s_001683.png to s3://udacity-ml-workflow/train/bike_s_001683.png \n", + "upload: train/bike_s_001839.png to s3://udacity-ml-workflow/train/bike_s_001839.png \n", + "upload: train/bike_s_001739.png to s3://udacity-ml-workflow/train/bike_s_001739.png \n", + "upload: train/bike_s_001767.png to s3://udacity-ml-workflow/train/bike_s_001767.png \n", + "upload: train/bike_s_001380.png to s3://udacity-ml-workflow/train/bike_s_001380.png \n", + "upload: train/bike_s_001462.png to s3://udacity-ml-workflow/train/bike_s_001462.png \n", + "upload: train/bike_s_001827.png to s3://udacity-ml-workflow/train/bike_s_001827.png \n", + "upload: train/bike_s_001613.png to s3://udacity-ml-workflow/train/bike_s_001613.png \n", + "upload: train/bike_s_001761.png to s3://udacity-ml-workflow/train/bike_s_001761.png \n", + "upload: train/bike_s_001847.png to s3://udacity-ml-workflow/train/bike_s_001847.png \n", + "upload: train/bike_s_001414.png to s3://udacity-ml-workflow/train/bike_s_001414.png \n", + "upload: train/bike_s_001928.png to s3://udacity-ml-workflow/train/bike_s_001928.png \n", + "upload: train/bike_s_001876.png to s3://udacity-ml-workflow/train/bike_s_001876.png \n", + "upload: train/bike_s_001897.png to s3://udacity-ml-workflow/train/bike_s_001897.png \n", + "upload: train/bike_s_001877.png to s3://udacity-ml-workflow/train/bike_s_001877.png \n", + "upload: train/bike_s_001980.png to s3://udacity-ml-workflow/train/bike_s_001980.png \n", + "upload: train/bike_s_001945.png to s3://udacity-ml-workflow/train/bike_s_001945.png \n", + "upload: train/bike_s_002024.png to s3://udacity-ml-workflow/train/bike_s_002024.png \n", + "upload: train/bike_s_002033.png to s3://udacity-ml-workflow/train/bike_s_002033.png \n", + "upload: train/bike_s_002047.png to s3://udacity-ml-workflow/train/bike_s_002047.png \n", + "upload: train/bike_s_001915.png to s3://udacity-ml-workflow/train/bike_s_001915.png \n", + "upload: train/bike_s_002090.png to s3://udacity-ml-workflow/train/bike_s_002090.png \n", + "upload: train/bike_s_002042.png to s3://udacity-ml-workflow/train/bike_s_002042.png \n", + "upload: train/bike_s_002118.png to s3://udacity-ml-workflow/train/bike_s_002118.png \n", + "upload: train/bike_s_002098.png to s3://udacity-ml-workflow/train/bike_s_002098.png \n", + "upload: train/bike_s_002139.png to s3://udacity-ml-workflow/train/bike_s_002139.png \n", + "upload: train/bike_s_001882.png to s3://udacity-ml-workflow/train/bike_s_001882.png \n", + "upload: train/bike_s_002277.png to s3://udacity-ml-workflow/train/bike_s_002277.png \n", + "upload: train/bike_s_002164.png to s3://udacity-ml-workflow/train/bike_s_002164.png \n", + "upload: train/bike_s_002203.png to s3://udacity-ml-workflow/train/bike_s_002203.png \n", + "upload: train/bike_s_002109.png to s3://udacity-ml-workflow/train/bike_s_002109.png \n", + "upload: train/bike_s_002283.png to s3://udacity-ml-workflow/train/bike_s_002283.png \n", + "upload: train/bike_s_002288.png to s3://udacity-ml-workflow/train/bike_s_002288.png \n", + "upload: train/cycle_s_000042.png to s3://udacity-ml-workflow/train/cycle_s_000042.png \n", + "upload: train/bike_s_002292.png to s3://udacity-ml-workflow/train/bike_s_002292.png \n", + "upload: train/cycle_s_000492.png to s3://udacity-ml-workflow/train/cycle_s_000492.png \n", + "upload: train/cycle_s_000463.png to s3://udacity-ml-workflow/train/cycle_s_000463.png \n", + "upload: train/cycle_s_000583.png to s3://udacity-ml-workflow/train/cycle_s_000583.png \n", + "upload: train/cycle_s_000718.png to s3://udacity-ml-workflow/train/cycle_s_000718.png \n", + "upload: train/cycle_s_000639.png to s3://udacity-ml-workflow/train/cycle_s_000639.png \n", + "upload: train/bike_s_002215.png to s3://udacity-ml-workflow/train/bike_s_002215.png \n", + "upload: train/bike_s_002222.png to s3://udacity-ml-workflow/train/bike_s_002222.png \n", + "upload: train/cycle_s_000222.png to s3://udacity-ml-workflow/train/cycle_s_000222.png \n", + "upload: train/cycle_s_001286.png to s3://udacity-ml-workflow/train/cycle_s_001286.png \n", + "upload: train/cycle_s_000871.png to s3://udacity-ml-workflow/train/cycle_s_000871.png \n", + "upload: train/cycle_s_001309.png to s3://udacity-ml-workflow/train/cycle_s_001309.png \n", + "upload: train/cycle_s_000899.png to s3://udacity-ml-workflow/train/cycle_s_000899.png \n", + "upload: train/cycle_s_000318.png to s3://udacity-ml-workflow/train/cycle_s_000318.png \n", + "upload: train/cycle_s_000666.png to s3://udacity-ml-workflow/train/cycle_s_000666.png \n", + "upload: train/cycle_s_001413.png to s3://udacity-ml-workflow/train/cycle_s_001413.png \n", + "upload: train/cycle_s_001439.png to s3://udacity-ml-workflow/train/cycle_s_001439.png \n", + "upload: train/cycle_s_001412.png to s3://udacity-ml-workflow/train/cycle_s_001412.png \n", + "upload: train/cycle_s_001474.png to s3://udacity-ml-workflow/train/cycle_s_001474.png \n", + "upload: train/cycle_s_001477.png to s3://udacity-ml-workflow/train/cycle_s_001477.png \n", + "upload: train/cycle_s_001745.png to s3://udacity-ml-workflow/train/cycle_s_001745.png \n", + "upload: train/cycle_s_001374.png to s3://udacity-ml-workflow/train/cycle_s_001374.png \n", + "upload: train/cycle_s_001640.png to s3://udacity-ml-workflow/train/cycle_s_001640.png \n", + "upload: train/cycle_s_001875.png to s3://udacity-ml-workflow/train/cycle_s_001875.png \n", + "upload: train/cycle_s_002015.png to s3://udacity-ml-workflow/train/cycle_s_002015.png \n", + "upload: train/cycle_s_001472.png to s3://udacity-ml-workflow/train/cycle_s_001472.png \n", + "upload: train/cycle_s_001976.png to s3://udacity-ml-workflow/train/cycle_s_001976.png \n", + "upload: train/cycle_s_001735.png to s3://udacity-ml-workflow/train/cycle_s_001735.png \n", + "upload: train/cycle_s_002093.png to s3://udacity-ml-workflow/train/cycle_s_002093.png \n", + "upload: train/cycle_s_002092.png to s3://udacity-ml-workflow/train/cycle_s_002092.png \n", + "upload: train/cycle_s_002090.png to s3://udacity-ml-workflow/train/cycle_s_002090.png \n", + "upload: train/cycle_s_002053.png to s3://udacity-ml-workflow/train/cycle_s_002053.png \n", + "upload: train/cycle_s_002168.png to s3://udacity-ml-workflow/train/cycle_s_002168.png \n", + "upload: train/cycle_s_002399.png to s3://udacity-ml-workflow/train/cycle_s_002399.png \n", + "upload: train/cycle_s_002659.png to s3://udacity-ml-workflow/train/cycle_s_002659.png \n", + "upload: train/cycle_s_002503.png to s3://udacity-ml-workflow/train/cycle_s_002503.png \n", + "upload: train/cycle_s_002178.png to s3://udacity-ml-workflow/train/cycle_s_002178.png \n", + "upload: train/cycle_s_002651.png to s3://udacity-ml-workflow/train/cycle_s_002651.png \n", + "upload: train/cycle_s_002666.png to s3://udacity-ml-workflow/train/cycle_s_002666.png \n", + "upload: train/cycle_s_002638.png to s3://udacity-ml-workflow/train/cycle_s_002638.png \n", + "upload: train/cycle_s_002703.png to s3://udacity-ml-workflow/train/cycle_s_002703.png \n", + "upload: train/cycle_s_002904.png to s3://udacity-ml-workflow/train/cycle_s_002904.png \n", + "upload: train/cycle_s_002882.png to s3://udacity-ml-workflow/train/cycle_s_002882.png \n", + "upload: train/cycle_s_002779.png to s3://udacity-ml-workflow/train/cycle_s_002779.png \n", + "upload: train/cycle_s_002598.png to s3://udacity-ml-workflow/train/cycle_s_002598.png \n", + "upload: train/cycle_s_002746.png to s3://udacity-ml-workflow/train/cycle_s_002746.png \n", + "upload: train/cycle_s_002978.png to s3://udacity-ml-workflow/train/cycle_s_002978.png \n", + "upload: train/cycle_s_002844.png to s3://udacity-ml-workflow/train/cycle_s_002844.png \n", + "upload: train/cycle_s_003008.png to s3://udacity-ml-workflow/train/cycle_s_003008.png \n", + "upload: train/cycle_s_003006.png to s3://udacity-ml-workflow/train/cycle_s_003006.png \n", + "upload: train/cycle_s_003026.png to s3://udacity-ml-workflow/train/cycle_s_003026.png \n", + "upload: train/cycle_s_003147.png to s3://udacity-ml-workflow/train/cycle_s_003147.png \n", + "upload: train/cycle_s_003043.png to s3://udacity-ml-workflow/train/cycle_s_003043.png \n", + "upload: train/cycle_s_003162.png to s3://udacity-ml-workflow/train/cycle_s_003162.png \n", + "upload: train/dirt_bike_s_000003.png to s3://udacity-ml-workflow/train/dirt_bike_s_000003.png\n", + "upload: train/cycle_s_003148.png to s3://udacity-ml-workflow/train/cycle_s_003148.png \n", + "upload: train/dirt_bike_s_000005.png to s3://udacity-ml-workflow/train/dirt_bike_s_000005.png\n", + "upload: train/cycle_s_003122.png to s3://udacity-ml-workflow/train/cycle_s_003122.png \n", + "upload: train/dirt_bike_s_000030.png to s3://udacity-ml-workflow/train/dirt_bike_s_000030.png\n", + "upload: train/dirt_bike_s_000059.png to s3://udacity-ml-workflow/train/dirt_bike_s_000059.png\n", + "upload: train/dirt_bike_s_000119.png to s3://udacity-ml-workflow/train/dirt_bike_s_000119.png\n", + "upload: train/dirt_bike_s_000134.png to s3://udacity-ml-workflow/train/dirt_bike_s_000134.png\n", + "upload: train/dirt_bike_s_000124.png to s3://udacity-ml-workflow/train/dirt_bike_s_000124.png\n", + "upload: train/minibike_s_000010.png to s3://udacity-ml-workflow/train/minibike_s_000010.png\n", + "upload: train/dirt_bike_s_000017.png to s3://udacity-ml-workflow/train/dirt_bike_s_000017.png\n", + "upload: train/minibike_s_000035.png to s3://udacity-ml-workflow/train/minibike_s_000035.png\n", + "upload: train/minibike_s_000011.png to s3://udacity-ml-workflow/train/minibike_s_000011.png\n", + "upload: train/minibike_s_000099.png to s3://udacity-ml-workflow/train/minibike_s_000099.png\n", + "upload: train/minibike_s_000064.png to s3://udacity-ml-workflow/train/minibike_s_000064.png\n", + "upload: train/minibike_s_000108.png to s3://udacity-ml-workflow/train/minibike_s_000108.png\n", + "upload: train/minibike_s_000022.png to s3://udacity-ml-workflow/train/minibike_s_000022.png\n", + "upload: train/minibike_s_000110.png to s3://udacity-ml-workflow/train/minibike_s_000110.png\n", + "upload: train/minibike_s_000102.png to s3://udacity-ml-workflow/train/minibike_s_000102.png\n", + "upload: train/minibike_s_000116.png to s3://udacity-ml-workflow/train/minibike_s_000116.png\n", + "upload: train/minibike_s_000036.png to s3://udacity-ml-workflow/train/minibike_s_000036.png\n", + "upload: train/minibike_s_000117.png to s3://udacity-ml-workflow/train/minibike_s_000117.png\n", + "upload: train/minibike_s_000020.png to s3://udacity-ml-workflow/train/minibike_s_000020.png\n", + "upload: train/minibike_s_000127.png to s3://udacity-ml-workflow/train/minibike_s_000127.png\n", + "upload: train/minibike_s_000130.png to s3://udacity-ml-workflow/train/minibike_s_000130.png\n", + "upload: train/minibike_s_000165.png to s3://udacity-ml-workflow/train/minibike_s_000165.png\n", + "upload: train/minibike_s_000149.png to s3://udacity-ml-workflow/train/minibike_s_000149.png\n", + "upload: train/minibike_s_000146.png to s3://udacity-ml-workflow/train/minibike_s_000146.png\n", + "upload: train/minibike_s_000203.png to s3://udacity-ml-workflow/train/minibike_s_000203.png\n", + "upload: train/minibike_s_000218.png to s3://udacity-ml-workflow/train/minibike_s_000218.png\n", + "upload: train/minibike_s_000293.png to s3://udacity-ml-workflow/train/minibike_s_000293.png\n", + "upload: train/minibike_s_000244.png to s3://udacity-ml-workflow/train/minibike_s_000244.png\n", + "upload: train/minibike_s_000314.png to s3://udacity-ml-workflow/train/minibike_s_000314.png\n", + "upload: train/minibike_s_000121.png to s3://udacity-ml-workflow/train/minibike_s_000121.png\n", + "upload: train/minibike_s_000324.png to s3://udacity-ml-workflow/train/minibike_s_000324.png\n", + "upload: train/minibike_s_000335.png to s3://udacity-ml-workflow/train/minibike_s_000335.png\n", + "upload: train/minibike_s_000350.png to s3://udacity-ml-workflow/train/minibike_s_000350.png\n", + "upload: train/minibike_s_000362.png to s3://udacity-ml-workflow/train/minibike_s_000362.png\n", + "upload: train/minibike_s_000402.png to s3://udacity-ml-workflow/train/minibike_s_000402.png\n", + "upload: train/minibike_s_000392.png to s3://udacity-ml-workflow/train/minibike_s_000392.png\n", + "upload: train/minibike_s_000427.png to s3://udacity-ml-workflow/train/minibike_s_000427.png\n", + "upload: train/minibike_s_000401.png to s3://udacity-ml-workflow/train/minibike_s_000401.png\n", + "upload: train/minibike_s_000429.png to s3://udacity-ml-workflow/train/minibike_s_000429.png\n", + "upload: train/minibike_s_000435.png to s3://udacity-ml-workflow/train/minibike_s_000435.png\n", + "upload: train/minibike_s_000408.png to s3://udacity-ml-workflow/train/minibike_s_000408.png\n", + "upload: train/minibike_s_000451.png to s3://udacity-ml-workflow/train/minibike_s_000451.png\n", + "upload: train/minibike_s_000459.png to s3://udacity-ml-workflow/train/minibike_s_000459.png\n", + "upload: train/minibike_s_000485.png to s3://udacity-ml-workflow/train/minibike_s_000485.png\n", + "upload: train/minibike_s_000507.png to s3://udacity-ml-workflow/train/minibike_s_000507.png\n", + "upload: train/minibike_s_000491.png to s3://udacity-ml-workflow/train/minibike_s_000491.png\n", + "upload: train/minibike_s_000434.png to s3://udacity-ml-workflow/train/minibike_s_000434.png\n", + "upload: train/minibike_s_000498.png to s3://udacity-ml-workflow/train/minibike_s_000498.png\n", + "upload: train/minibike_s_000409.png to s3://udacity-ml-workflow/train/minibike_s_000409.png\n", + "upload: train/minibike_s_000518.png to s3://udacity-ml-workflow/train/minibike_s_000518.png\n", + "upload: train/minibike_s_000340.png to s3://udacity-ml-workflow/train/minibike_s_000340.png\n", + "upload: train/minibike_s_000520.png to s3://udacity-ml-workflow/train/minibike_s_000520.png\n", + "upload: train/minibike_s_000511.png to s3://udacity-ml-workflow/train/minibike_s_000511.png\n", + "upload: train/minibike_s_000519.png to s3://udacity-ml-workflow/train/minibike_s_000519.png\n", + "upload: train/minibike_s_000565.png to s3://udacity-ml-workflow/train/minibike_s_000565.png\n", + "upload: train/minibike_s_000526.png to s3://udacity-ml-workflow/train/minibike_s_000526.png\n", + "upload: train/minibike_s_000567.png to s3://udacity-ml-workflow/train/minibike_s_000567.png\n", + "upload: train/minibike_s_000522.png to s3://udacity-ml-workflow/train/minibike_s_000522.png\n", + "upload: train/minibike_s_000569.png to s3://udacity-ml-workflow/train/minibike_s_000569.png\n", + "upload: train/minibike_s_000527.png to s3://udacity-ml-workflow/train/minibike_s_000527.png\n", + "upload: train/minibike_s_000568.png to s3://udacity-ml-workflow/train/minibike_s_000568.png\n", + "upload: train/minibike_s_000571.png to s3://udacity-ml-workflow/train/minibike_s_000571.png\n", + "upload: train/minibike_s_000570.png to s3://udacity-ml-workflow/train/minibike_s_000570.png\n", + "upload: train/minibike_s_000654.png to s3://udacity-ml-workflow/train/minibike_s_000654.png\n", + "upload: train/minibike_s_000566.png to s3://udacity-ml-workflow/train/minibike_s_000566.png\n", + "upload: train/minibike_s_000690.png to s3://udacity-ml-workflow/train/minibike_s_000690.png\n", + "upload: train/minibike_s_000652.png to s3://udacity-ml-workflow/train/minibike_s_000652.png\n", + "upload: train/minibike_s_000613.png to s3://udacity-ml-workflow/train/minibike_s_000613.png\n", + "upload: train/minibike_s_000738.png to s3://udacity-ml-workflow/train/minibike_s_000738.png\n", + "upload: train/minibike_s_000698.png to s3://udacity-ml-workflow/train/minibike_s_000698.png\n", + "upload: train/minibike_s_000709.png to s3://udacity-ml-workflow/train/minibike_s_000709.png\n", + "upload: train/minibike_s_000701.png to s3://udacity-ml-workflow/train/minibike_s_000701.png\n", + "upload: train/minibike_s_000802.png to s3://udacity-ml-workflow/train/minibike_s_000802.png\n", + "upload: train/minibike_s_000741.png to s3://udacity-ml-workflow/train/minibike_s_000741.png\n", + "upload: train/minibike_s_000800.png to s3://udacity-ml-workflow/train/minibike_s_000800.png\n", + "upload: train/minibike_s_000743.png to s3://udacity-ml-workflow/train/minibike_s_000743.png\n", + "upload: train/minibike_s_000830.png to s3://udacity-ml-workflow/train/minibike_s_000830.png\n", + "upload: train/minibike_s_000824.png to s3://udacity-ml-workflow/train/minibike_s_000824.png\n", + "upload: train/minibike_s_000906.png to s3://udacity-ml-workflow/train/minibike_s_000906.png\n", + "upload: train/minibike_s_000886.png to s3://udacity-ml-workflow/train/minibike_s_000886.png\n", + "upload: train/minibike_s_000820.png to s3://udacity-ml-workflow/train/minibike_s_000820.png\n", + "upload: train/minibike_s_000813.png to s3://udacity-ml-workflow/train/minibike_s_000813.png\n", + "upload: train/minibike_s_000855.png to s3://udacity-ml-workflow/train/minibike_s_000855.png\n", + "upload: train/minibike_s_000885.png to s3://udacity-ml-workflow/train/minibike_s_000885.png\n", + "upload: train/minibike_s_000914.png to s3://udacity-ml-workflow/train/minibike_s_000914.png\n", + "upload: train/minibike_s_000831.png to s3://udacity-ml-workflow/train/minibike_s_000831.png\n", + "upload: train/minibike_s_000967.png to s3://udacity-ml-workflow/train/minibike_s_000967.png\n", + "upload: train/minibike_s_001016.png to s3://udacity-ml-workflow/train/minibike_s_001016.png\n", + "upload: train/minibike_s_001017.png to s3://udacity-ml-workflow/train/minibike_s_001017.png\n", + "upload: train/minibike_s_001072.png to s3://udacity-ml-workflow/train/minibike_s_001072.png\n", + "upload: train/minibike_s_001157.png to s3://udacity-ml-workflow/train/minibike_s_001157.png\n", + "upload: train/minibike_s_001094.png to s3://udacity-ml-workflow/train/minibike_s_001094.png\n", + "upload: train/minibike_s_001168.png to s3://udacity-ml-workflow/train/minibike_s_001168.png\n", + "upload: train/minibike_s_001177.png to s3://udacity-ml-workflow/train/minibike_s_001177.png\n", + "upload: train/minibike_s_000968.png to s3://udacity-ml-workflow/train/minibike_s_000968.png\n", + "upload: train/minibike_s_001169.png to s3://udacity-ml-workflow/train/minibike_s_001169.png\n", + "upload: train/minibike_s_001179.png to s3://udacity-ml-workflow/train/minibike_s_001179.png\n", + "upload: train/minibike_s_001191.png to s3://udacity-ml-workflow/train/minibike_s_001191.png\n", + "upload: train/minibike_s_001193.png to s3://udacity-ml-workflow/train/minibike_s_001193.png\n", + "upload: train/minibike_s_001250.png to s3://udacity-ml-workflow/train/minibike_s_001250.png\n", + "upload: train/minibike_s_001261.png to s3://udacity-ml-workflow/train/minibike_s_001261.png\n", + "upload: train/minibike_s_001185.png to s3://udacity-ml-workflow/train/minibike_s_001185.png\n", + "upload: train/minibike_s_001249.png to s3://udacity-ml-workflow/train/minibike_s_001249.png\n", + "upload: train/minibike_s_001079.png to s3://udacity-ml-workflow/train/minibike_s_001079.png\n", + "upload: train/minibike_s_001279.png to s3://udacity-ml-workflow/train/minibike_s_001279.png\n", + "upload: train/minibike_s_001270.png to s3://udacity-ml-workflow/train/minibike_s_001270.png\n", + "upload: train/minibike_s_001348.png to s3://udacity-ml-workflow/train/minibike_s_001348.png\n", + "upload: train/minibike_s_001345.png to s3://udacity-ml-workflow/train/minibike_s_001345.png\n", + "upload: train/minibike_s_001344.png to s3://udacity-ml-workflow/train/minibike_s_001344.png\n", + "upload: train/minibike_s_001366.png to s3://udacity-ml-workflow/train/minibike_s_001366.png\n", + "upload: train/minibike_s_001294.png to s3://udacity-ml-workflow/train/minibike_s_001294.png\n", + "upload: train/minibike_s_001458.png to s3://udacity-ml-workflow/train/minibike_s_001458.png\n", + "upload: train/minibike_s_001450.png to s3://udacity-ml-workflow/train/minibike_s_001450.png\n", + "upload: train/minibike_s_001275.png to s3://udacity-ml-workflow/train/minibike_s_001275.png\n", + "upload: train/minibike_s_001506.png to s3://udacity-ml-workflow/train/minibike_s_001506.png\n", + "upload: train/minibike_s_001496.png to s3://udacity-ml-workflow/train/minibike_s_001496.png\n", + "upload: train/minibike_s_001491.png to s3://udacity-ml-workflow/train/minibike_s_001491.png\n", + "upload: train/minibike_s_001511.png to s3://udacity-ml-workflow/train/minibike_s_001511.png\n", + "upload: train/minibike_s_001512.png to s3://udacity-ml-workflow/train/minibike_s_001512.png\n", + "upload: train/minibike_s_001498.png to s3://udacity-ml-workflow/train/minibike_s_001498.png\n", + "upload: train/minibike_s_001479.png to s3://udacity-ml-workflow/train/minibike_s_001479.png\n", + "upload: train/minibike_s_001539.png to s3://udacity-ml-workflow/train/minibike_s_001539.png\n", + "upload: train/minibike_s_001558.png to s3://udacity-ml-workflow/train/minibike_s_001558.png\n", + "upload: train/minibike_s_001540.png to s3://udacity-ml-workflow/train/minibike_s_001540.png\n", + "upload: train/minibike_s_001546.png to s3://udacity-ml-workflow/train/minibike_s_001546.png\n", + "upload: train/minibike_s_001565.png to s3://udacity-ml-workflow/train/minibike_s_001565.png\n", + "upload: train/minibike_s_001597.png to s3://udacity-ml-workflow/train/minibike_s_001597.png\n", + "upload: train/minibike_s_001573.png to s3://udacity-ml-workflow/train/minibike_s_001573.png\n", + "upload: train/minibike_s_001417.png to s3://udacity-ml-workflow/train/minibike_s_001417.png\n", + "upload: train/minibike_s_001575.png to s3://udacity-ml-workflow/train/minibike_s_001575.png\n", + "upload: train/minibike_s_001638.png to s3://udacity-ml-workflow/train/minibike_s_001638.png\n", + "upload: train/minibike_s_001639.png to s3://udacity-ml-workflow/train/minibike_s_001639.png\n", + "upload: train/minibike_s_001631.png to s3://udacity-ml-workflow/train/minibike_s_001631.png\n", + "upload: train/minibike_s_001653.png to s3://udacity-ml-workflow/train/minibike_s_001653.png\n", + "upload: train/minibike_s_001689.png to s3://udacity-ml-workflow/train/minibike_s_001689.png\n", + "upload: train/minibike_s_001734.png to s3://udacity-ml-workflow/train/minibike_s_001734.png\n", + "upload: train/minibike_s_001701.png to s3://udacity-ml-workflow/train/minibike_s_001701.png\n", + "upload: train/minibike_s_001747.png to s3://udacity-ml-workflow/train/minibike_s_001747.png\n", + "upload: train/minibike_s_001731.png to s3://udacity-ml-workflow/train/minibike_s_001731.png\n", + "upload: train/minibike_s_001771.png to s3://udacity-ml-workflow/train/minibike_s_001771.png\n", + "upload: train/minibike_s_001767.png to s3://udacity-ml-workflow/train/minibike_s_001767.png\n", + "upload: train/minibike_s_001789.png to s3://udacity-ml-workflow/train/minibike_s_001789.png\n", + "upload: train/minibike_s_001691.png to s3://udacity-ml-workflow/train/minibike_s_001691.png\n", + "upload: train/minibike_s_001829.png to s3://udacity-ml-workflow/train/minibike_s_001829.png\n", + "upload: train/minibike_s_001827.png to s3://udacity-ml-workflow/train/minibike_s_001827.png\n", + "upload: train/minibike_s_001838.png to s3://udacity-ml-workflow/train/minibike_s_001838.png\n", + "upload: train/minibike_s_001863.png to s3://udacity-ml-workflow/train/minibike_s_001863.png\n", + "upload: train/minibike_s_001870.png to s3://udacity-ml-workflow/train/minibike_s_001870.png\n", + "upload: train/minibike_s_001865.png to s3://udacity-ml-workflow/train/minibike_s_001865.png\n", + "upload: train/minibike_s_001873.png to s3://udacity-ml-workflow/train/minibike_s_001873.png\n", + "upload: train/minibike_s_001836.png to s3://udacity-ml-workflow/train/minibike_s_001836.png\n", + "upload: train/minibike_s_001885.png to s3://udacity-ml-workflow/train/minibike_s_001885.png\n", + "upload: train/minibike_s_001881.png to s3://udacity-ml-workflow/train/minibike_s_001881.png\n", + "upload: train/minibike_s_001921.png to s3://udacity-ml-workflow/train/minibike_s_001921.png\n", + "upload: train/minibike_s_001880.png to s3://udacity-ml-workflow/train/minibike_s_001880.png\n", + "upload: train/minibike_s_001944.png to s3://udacity-ml-workflow/train/minibike_s_001944.png\n", + "upload: train/minibike_s_001969.png to s3://udacity-ml-workflow/train/minibike_s_001969.png\n", + "upload: train/minibike_s_001996.png to s3://udacity-ml-workflow/train/minibike_s_001996.png\n", + "upload: train/minibike_s_001917.png to s3://udacity-ml-workflow/train/minibike_s_001917.png\n", + "upload: train/minibike_s_002038.png to s3://udacity-ml-workflow/train/minibike_s_002038.png\n", + "upload: train/minibike_s_002030.png to s3://udacity-ml-workflow/train/minibike_s_002030.png\n", + "upload: train/minibike_s_002046.png to s3://udacity-ml-workflow/train/minibike_s_002046.png\n", + "upload: train/minibike_s_002009.png to s3://udacity-ml-workflow/train/minibike_s_002009.png\n", + "upload: train/minibike_s_002115.png to s3://udacity-ml-workflow/train/minibike_s_002115.png\n", + "upload: train/minibike_s_002124.png to s3://udacity-ml-workflow/train/minibike_s_002124.png\n", + "upload: train/minibike_s_002130.png to s3://udacity-ml-workflow/train/minibike_s_002130.png\n", + "upload: train/minibike_s_001972.png to s3://udacity-ml-workflow/train/minibike_s_001972.png\n", + "upload: train/minibike_s_002146.png to s3://udacity-ml-workflow/train/minibike_s_002146.png\n", + "upload: train/minibike_s_002163.png to s3://udacity-ml-workflow/train/minibike_s_002163.png\n", + "upload: train/minibike_s_002084.png to s3://udacity-ml-workflow/train/minibike_s_002084.png\n", + "upload: train/minibike_s_002137.png to s3://udacity-ml-workflow/train/minibike_s_002137.png\n", + "upload: train/minibike_s_002176.png to s3://udacity-ml-workflow/train/minibike_s_002176.png\n", + "upload: train/minibike_s_002182.png to s3://udacity-ml-workflow/train/minibike_s_002182.png\n", + "upload: train/minibike_s_002194.png to s3://udacity-ml-workflow/train/minibike_s_002194.png\n", + "upload: train/minibike_s_002196.png to s3://udacity-ml-workflow/train/minibike_s_002196.png\n", + "upload: train/minibike_s_002048.png to s3://udacity-ml-workflow/train/minibike_s_002048.png\n", + "upload: train/minibike_s_002198.png to s3://udacity-ml-workflow/train/minibike_s_002198.png\n", + "upload: train/minibike_s_002218.png to s3://udacity-ml-workflow/train/minibike_s_002218.png\n", + "upload: train/moped_s_000030.png to s3://udacity-ml-workflow/train/moped_s_000030.png\n", + "upload: train/moped_s_000004.png to s3://udacity-ml-workflow/train/moped_s_000004.png\n", + "upload: train/moped_s_000034.png to s3://udacity-ml-workflow/train/moped_s_000034.png\n", + "upload: train/minibike_s_002186.png to s3://udacity-ml-workflow/train/minibike_s_002186.png\n", + "upload: train/moped_s_000021.png to s3://udacity-ml-workflow/train/moped_s_000021.png\n", + "upload: train/moped_s_000071.png to s3://udacity-ml-workflow/train/moped_s_000071.png\n", + "upload: train/moped_s_000035.png to s3://udacity-ml-workflow/train/moped_s_000035.png\n", + "upload: train/moped_s_000009.png to s3://udacity-ml-workflow/train/moped_s_000009.png\n", + "upload: train/moped_s_000044.png to s3://udacity-ml-workflow/train/moped_s_000044.png\n", + "upload: train/moped_s_000124.png to s3://udacity-ml-workflow/train/moped_s_000124.png\n", + "upload: train/moped_s_000065.png to s3://udacity-ml-workflow/train/moped_s_000065.png\n", + "upload: train/moped_s_000169.png to s3://udacity-ml-workflow/train/moped_s_000169.png\n", + "upload: train/moped_s_000119.png to s3://udacity-ml-workflow/train/moped_s_000119.png\n", + "upload: train/moped_s_000236.png to s3://udacity-ml-workflow/train/moped_s_000236.png\n", + "upload: train/moped_s_000168.png to s3://udacity-ml-workflow/train/moped_s_000168.png\n", + "upload: train/moped_s_000237.png to s3://udacity-ml-workflow/train/moped_s_000237.png\n", + "upload: train/motorbike_s_000009.png to s3://udacity-ml-workflow/train/motorbike_s_000009.png\n", + "upload: train/motorbike_s_000021.png to s3://udacity-ml-workflow/train/motorbike_s_000021.png\n", + "upload: train/motorbike_s_000035.png to s3://udacity-ml-workflow/train/motorbike_s_000035.png\n", + "upload: train/motorbike_s_000022.png to s3://udacity-ml-workflow/train/motorbike_s_000022.png\n", + "upload: train/moped_s_000135.png to s3://udacity-ml-workflow/train/moped_s_000135.png\n", + "upload: train/motorbike_s_000106.png to s3://udacity-ml-workflow/train/motorbike_s_000106.png\n", + "upload: train/motorbike_s_000041.png to s3://udacity-ml-workflow/train/motorbike_s_000041.png\n", + "upload: train/motorbike_s_000115.png to s3://udacity-ml-workflow/train/motorbike_s_000115.png\n", + "upload: train/motorbike_s_000058.png to s3://udacity-ml-workflow/train/motorbike_s_000058.png\n", + "upload: train/motorbike_s_000060.png to s3://udacity-ml-workflow/train/motorbike_s_000060.png\n", + "upload: train/motorbike_s_000068.png to s3://udacity-ml-workflow/train/motorbike_s_000068.png\n", + "upload: train/motorbike_s_000117.png to s3://udacity-ml-workflow/train/motorbike_s_000117.png\n", + "upload: train/motorbike_s_000124.png to s3://udacity-ml-workflow/train/motorbike_s_000124.png\n", + "upload: train/motorbike_s_000134.png to s3://udacity-ml-workflow/train/motorbike_s_000134.png\n", + "upload: train/motorbike_s_000223.png to s3://udacity-ml-workflow/train/motorbike_s_000223.png\n", + "upload: train/motorbike_s_000119.png to s3://udacity-ml-workflow/train/motorbike_s_000119.png\n", + "upload: train/motorbike_s_000225.png to s3://udacity-ml-workflow/train/motorbike_s_000225.png\n", + "upload: train/motorbike_s_000221.png to s3://udacity-ml-workflow/train/motorbike_s_000221.png\n", + "upload: train/motorbike_s_000141.png to s3://udacity-ml-workflow/train/motorbike_s_000141.png\n", + "upload: train/motorbike_s_000308.png to s3://udacity-ml-workflow/train/motorbike_s_000308.png\n", + "upload: train/motorbike_s_000254.png to s3://udacity-ml-workflow/train/motorbike_s_000254.png\n", + "upload: train/motorbike_s_000346.png to s3://udacity-ml-workflow/train/motorbike_s_000346.png\n", + "upload: train/motorbike_s_000331.png to s3://udacity-ml-workflow/train/motorbike_s_000331.png\n", + "upload: train/motorbike_s_000062.png to s3://udacity-ml-workflow/train/motorbike_s_000062.png\n", + "upload: train/motorbike_s_000172.png to s3://udacity-ml-workflow/train/motorbike_s_000172.png\n", + "upload: train/motorbike_s_000449.png to s3://udacity-ml-workflow/train/motorbike_s_000449.png\n", + "upload: train/motorbike_s_000463.png to s3://udacity-ml-workflow/train/motorbike_s_000463.png\n", + "upload: train/motorbike_s_000501.png to s3://udacity-ml-workflow/train/motorbike_s_000501.png\n", + "upload: train/motorbike_s_000541.png to s3://udacity-ml-workflow/train/motorbike_s_000541.png\n", + "upload: train/motorbike_s_000362.png to s3://udacity-ml-workflow/train/motorbike_s_000362.png\n", + "upload: train/motorbike_s_000578.png to s3://udacity-ml-workflow/train/motorbike_s_000578.png\n", + "upload: train/motorcycle_s_000001.png to s3://udacity-ml-workflow/train/motorcycle_s_000001.png\n", + "upload: train/motorbike_s_000427.png to s3://udacity-ml-workflow/train/motorbike_s_000427.png\n", + "upload: train/motorbike_s_000361.png to s3://udacity-ml-workflow/train/motorbike_s_000361.png\n", + "upload: train/motorbike_s_000534.png to s3://udacity-ml-workflow/train/motorbike_s_000534.png\n", + "upload: train/motorcycle_s_000004.png to s3://udacity-ml-workflow/train/motorcycle_s_000004.png\n", + "upload: train/motorcycle_s_000002.png to s3://udacity-ml-workflow/train/motorcycle_s_000002.png\n", + "upload: train/motorcycle_s_000009.png to s3://udacity-ml-workflow/train/motorcycle_s_000009.png\n", + "upload: train/motorcycle_s_000026.png to s3://udacity-ml-workflow/train/motorcycle_s_000026.png\n", + "upload: train/motorcycle_s_000025.png to s3://udacity-ml-workflow/train/motorcycle_s_000025.png\n", + "upload: train/motorcycle_s_000022.png to s3://udacity-ml-workflow/train/motorcycle_s_000022.png\n", + "upload: train/motorcycle_s_000003.png to s3://udacity-ml-workflow/train/motorcycle_s_000003.png\n", + "upload: train/motorcycle_s_000032.png to s3://udacity-ml-workflow/train/motorcycle_s_000032.png\n", + "upload: train/motorcycle_s_000029.png to s3://udacity-ml-workflow/train/motorcycle_s_000029.png\n", + "upload: train/motorcycle_s_000027.png to s3://udacity-ml-workflow/train/motorcycle_s_000027.png\n", + "upload: train/motorcycle_s_000070.png to s3://udacity-ml-workflow/train/motorcycle_s_000070.png\n", + "upload: train/motorcycle_s_000072.png to s3://udacity-ml-workflow/train/motorcycle_s_000072.png\n", + "upload: train/motorcycle_s_000076.png to s3://udacity-ml-workflow/train/motorcycle_s_000076.png\n", + "upload: train/motorcycle_s_000127.png to s3://udacity-ml-workflow/train/motorcycle_s_000127.png\n", + "upload: train/motorcycle_s_000120.png to s3://udacity-ml-workflow/train/motorcycle_s_000120.png\n", + "upload: train/motorcycle_s_000050.png to s3://udacity-ml-workflow/train/motorcycle_s_000050.png\n", + "upload: train/motorcycle_s_000126.png to s3://udacity-ml-workflow/train/motorcycle_s_000126.png\n", + "upload: train/motorcycle_s_000133.png to s3://udacity-ml-workflow/train/motorcycle_s_000133.png\n", + "upload: train/motorcycle_s_000151.png to s3://udacity-ml-workflow/train/motorcycle_s_000151.png\n", + "upload: train/motorcycle_s_000154.png to s3://udacity-ml-workflow/train/motorcycle_s_000154.png\n", + "upload: train/motorcycle_s_000146.png to s3://udacity-ml-workflow/train/motorcycle_s_000146.png\n", + "upload: train/motorcycle_s_000169.png to s3://udacity-ml-workflow/train/motorcycle_s_000169.png\n", + "upload: train/motorcycle_s_000136.png to s3://udacity-ml-workflow/train/motorcycle_s_000136.png\n", + "upload: train/motorcycle_s_000074.png to s3://udacity-ml-workflow/train/motorcycle_s_000074.png\n", + "upload: train/motorcycle_s_000207.png to s3://udacity-ml-workflow/train/motorcycle_s_000207.png\n", + "upload: train/motorcycle_s_000217.png to s3://udacity-ml-workflow/train/motorcycle_s_000217.png\n", + "upload: train/motorcycle_s_000220.png to s3://udacity-ml-workflow/train/motorcycle_s_000220.png\n", + "upload: train/motorcycle_s_000221.png to s3://udacity-ml-workflow/train/motorcycle_s_000221.png\n", + "upload: train/motorcycle_s_000216.png to s3://udacity-ml-workflow/train/motorcycle_s_000216.png\n", + "upload: train/motorcycle_s_000144.png to s3://udacity-ml-workflow/train/motorcycle_s_000144.png\n", + "upload: train/motorcycle_s_000223.png to s3://udacity-ml-workflow/train/motorcycle_s_000223.png\n", + "upload: train/motorcycle_s_000167.png to s3://udacity-ml-workflow/train/motorcycle_s_000167.png\n", + "upload: train/motorcycle_s_000170.png to s3://udacity-ml-workflow/train/motorcycle_s_000170.png\n", + "upload: train/motorcycle_s_000245.png to s3://udacity-ml-workflow/train/motorcycle_s_000245.png\n", + "upload: train/motorcycle_s_000246.png to s3://udacity-ml-workflow/train/motorcycle_s_000246.png\n", + "upload: train/motorcycle_s_000252.png to s3://udacity-ml-workflow/train/motorcycle_s_000252.png\n", + "upload: train/motorcycle_s_000219.png to s3://udacity-ml-workflow/train/motorcycle_s_000219.png\n", + "upload: train/motorcycle_s_000242.png to s3://udacity-ml-workflow/train/motorcycle_s_000242.png\n", + "upload: train/motorcycle_s_000249.png to s3://udacity-ml-workflow/train/motorcycle_s_000249.png\n", + "upload: train/motorcycle_s_000256.png to s3://udacity-ml-workflow/train/motorcycle_s_000256.png\n", + "upload: train/motorcycle_s_000253.png to s3://udacity-ml-workflow/train/motorcycle_s_000253.png\n", + "upload: train/motorcycle_s_000291.png to s3://udacity-ml-workflow/train/motorcycle_s_000291.png\n", + "upload: train/motorcycle_s_000262.png to s3://udacity-ml-workflow/train/motorcycle_s_000262.png\n", + "upload: train/motorcycle_s_000290.png to s3://udacity-ml-workflow/train/motorcycle_s_000290.png\n", + "upload: train/motorcycle_s_000300.png to s3://udacity-ml-workflow/train/motorcycle_s_000300.png\n", + "upload: train/motorcycle_s_000309.png to s3://udacity-ml-workflow/train/motorcycle_s_000309.png\n", + "upload: train/motorcycle_s_000319.png to s3://udacity-ml-workflow/train/motorcycle_s_000319.png\n", + "upload: train/motorcycle_s_000284.png to s3://udacity-ml-workflow/train/motorcycle_s_000284.png\n", + "upload: train/motorcycle_s_000304.png to s3://udacity-ml-workflow/train/motorcycle_s_000304.png\n", + "upload: train/motorcycle_s_000312.png to s3://udacity-ml-workflow/train/motorcycle_s_000312.png\n", + "upload: train/motorcycle_s_000325.png to s3://udacity-ml-workflow/train/motorcycle_s_000325.png\n", + "upload: train/motorcycle_s_000277.png to s3://udacity-ml-workflow/train/motorcycle_s_000277.png\n", + "upload: train/motorcycle_s_000339.png to s3://udacity-ml-workflow/train/motorcycle_s_000339.png\n", + "upload: train/motorcycle_s_000346.png to s3://udacity-ml-workflow/train/motorcycle_s_000346.png\n", + "upload: train/motorcycle_s_000417.png to s3://udacity-ml-workflow/train/motorcycle_s_000417.png\n", + "upload: train/motorcycle_s_000353.png to s3://udacity-ml-workflow/train/motorcycle_s_000353.png\n", + "upload: train/motorcycle_s_000332.png to s3://udacity-ml-workflow/train/motorcycle_s_000332.png\n", + "upload: train/motorcycle_s_000347.png to s3://udacity-ml-workflow/train/motorcycle_s_000347.png\n", + "upload: train/motorcycle_s_000320.png to s3://udacity-ml-workflow/train/motorcycle_s_000320.png\n", + "upload: train/motorcycle_s_000418.png to s3://udacity-ml-workflow/train/motorcycle_s_000418.png\n", + "upload: train/motorcycle_s_000423.png to s3://udacity-ml-workflow/train/motorcycle_s_000423.png\n", + "upload: train/motorcycle_s_000430.png to s3://udacity-ml-workflow/train/motorcycle_s_000430.png\n", + "upload: train/motorcycle_s_000422.png to s3://udacity-ml-workflow/train/motorcycle_s_000422.png\n", + "upload: train/motorcycle_s_000407.png to s3://udacity-ml-workflow/train/motorcycle_s_000407.png\n", + "upload: train/motorcycle_s_000340.png to s3://udacity-ml-workflow/train/motorcycle_s_000340.png\n", + "upload: train/motorcycle_s_000447.png to s3://udacity-ml-workflow/train/motorcycle_s_000447.png\n", + "upload: train/motorcycle_s_000486.png to s3://udacity-ml-workflow/train/motorcycle_s_000486.png\n", + "upload: train/motorcycle_s_000440.png to s3://udacity-ml-workflow/train/motorcycle_s_000440.png\n", + "upload: train/motorcycle_s_000431.png to s3://udacity-ml-workflow/train/motorcycle_s_000431.png\n", + "upload: train/motorcycle_s_000496.png to s3://udacity-ml-workflow/train/motorcycle_s_000496.png\n", + "upload: train/motorcycle_s_000456.png to s3://udacity-ml-workflow/train/motorcycle_s_000456.png\n", + "upload: train/motorcycle_s_000517.png to s3://udacity-ml-workflow/train/motorcycle_s_000517.png\n", + "upload: train/motorcycle_s_000521.png to s3://udacity-ml-workflow/train/motorcycle_s_000521.png\n", + "upload: train/motorcycle_s_000454.png to s3://udacity-ml-workflow/train/motorcycle_s_000454.png\n", + "upload: train/motorcycle_s_000459.png to s3://udacity-ml-workflow/train/motorcycle_s_000459.png\n", + "upload: train/motorcycle_s_000451.png to s3://udacity-ml-workflow/train/motorcycle_s_000451.png\n", + "upload: train/motorcycle_s_000432.png to s3://udacity-ml-workflow/train/motorcycle_s_000432.png\n", + "upload: train/motorcycle_s_000508.png to s3://udacity-ml-workflow/train/motorcycle_s_000508.png\n", + "upload: train/motorcycle_s_000545.png to s3://udacity-ml-workflow/train/motorcycle_s_000545.png\n", + "upload: train/motorcycle_s_000542.png to s3://udacity-ml-workflow/train/motorcycle_s_000542.png\n", + "upload: train/motorcycle_s_000543.png to s3://udacity-ml-workflow/train/motorcycle_s_000543.png\n", + "upload: train/motorcycle_s_000622.png to s3://udacity-ml-workflow/train/motorcycle_s_000622.png\n", + "upload: train/motorcycle_s_000617.png to s3://udacity-ml-workflow/train/motorcycle_s_000617.png\n", + "upload: train/motorcycle_s_000585.png to s3://udacity-ml-workflow/train/motorcycle_s_000585.png\n", + "upload: train/motorcycle_s_000629.png to s3://udacity-ml-workflow/train/motorcycle_s_000629.png\n", + "upload: train/motorcycle_s_000605.png to s3://udacity-ml-workflow/train/motorcycle_s_000605.png\n", + "upload: train/motorcycle_s_000580.png to s3://udacity-ml-workflow/train/motorcycle_s_000580.png\n", + "upload: train/motorcycle_s_000594.png to s3://udacity-ml-workflow/train/motorcycle_s_000594.png\n", + "upload: train/motorcycle_s_000593.png to s3://udacity-ml-workflow/train/motorcycle_s_000593.png\n", + "upload: train/motorcycle_s_000687.png to s3://udacity-ml-workflow/train/motorcycle_s_000687.png\n", + "upload: train/motorcycle_s_000669.png to s3://udacity-ml-workflow/train/motorcycle_s_000669.png\n", + "upload: train/motorcycle_s_000686.png to s3://udacity-ml-workflow/train/motorcycle_s_000686.png\n", + "upload: train/motorcycle_s_000695.png to s3://udacity-ml-workflow/train/motorcycle_s_000695.png\n", + "upload: train/motorcycle_s_000698.png to s3://udacity-ml-workflow/train/motorcycle_s_000698.png\n", + "upload: train/motorcycle_s_000699.png to s3://udacity-ml-workflow/train/motorcycle_s_000699.png\n", + "upload: train/motorcycle_s_000696.png to s3://udacity-ml-workflow/train/motorcycle_s_000696.png\n", + "upload: train/motorcycle_s_000713.png to s3://udacity-ml-workflow/train/motorcycle_s_000713.png\n", + "upload: train/motorcycle_s_000732.png to s3://udacity-ml-workflow/train/motorcycle_s_000732.png\n", + "upload: train/motorcycle_s_000724.png to s3://udacity-ml-workflow/train/motorcycle_s_000724.png\n", + "upload: train/motorcycle_s_000734.png to s3://udacity-ml-workflow/train/motorcycle_s_000734.png\n", + "upload: train/motorcycle_s_000776.png to s3://udacity-ml-workflow/train/motorcycle_s_000776.png\n", + "upload: train/motorcycle_s_000714.png to s3://udacity-ml-workflow/train/motorcycle_s_000714.png\n", + "upload: train/motorcycle_s_000654.png to s3://udacity-ml-workflow/train/motorcycle_s_000654.png\n", + "upload: train/motorcycle_s_000741.png to s3://udacity-ml-workflow/train/motorcycle_s_000741.png\n", + "upload: train/motorcycle_s_000700.png to s3://udacity-ml-workflow/train/motorcycle_s_000700.png\n", + "upload: train/motorcycle_s_000772.png to s3://udacity-ml-workflow/train/motorcycle_s_000772.png\n", + "upload: train/motorcycle_s_000787.png to s3://udacity-ml-workflow/train/motorcycle_s_000787.png\n", + "upload: train/motorcycle_s_000790.png to s3://udacity-ml-workflow/train/motorcycle_s_000790.png\n", + "upload: train/motorcycle_s_000792.png to s3://udacity-ml-workflow/train/motorcycle_s_000792.png\n", + "upload: train/motorcycle_s_000785.png to s3://udacity-ml-workflow/train/motorcycle_s_000785.png\n", + "upload: train/motorcycle_s_000894.png to s3://udacity-ml-workflow/train/motorcycle_s_000894.png\n", + "upload: train/motorcycle_s_000834.png to s3://udacity-ml-workflow/train/motorcycle_s_000834.png\n", + "upload: train/motorcycle_s_000917.png to s3://udacity-ml-workflow/train/motorcycle_s_000917.png\n", + "upload: train/motorcycle_s_000791.png to s3://udacity-ml-workflow/train/motorcycle_s_000791.png\n", + "upload: train/motorcycle_s_000887.png to s3://udacity-ml-workflow/train/motorcycle_s_000887.png\n", + "upload: train/motorcycle_s_000796.png to s3://udacity-ml-workflow/train/motorcycle_s_000796.png\n", + "upload: train/motorcycle_s_000922.png to s3://udacity-ml-workflow/train/motorcycle_s_000922.png\n", + "upload: train/motorcycle_s_000807.png to s3://udacity-ml-workflow/train/motorcycle_s_000807.png\n", + "upload: train/motorcycle_s_000919.png to s3://udacity-ml-workflow/train/motorcycle_s_000919.png\n", + "upload: train/motorcycle_s_000938.png to s3://udacity-ml-workflow/train/motorcycle_s_000938.png\n", + "upload: train/motorcycle_s_000923.png to s3://udacity-ml-workflow/train/motorcycle_s_000923.png\n", + "upload: train/motorcycle_s_000924.png to s3://udacity-ml-workflow/train/motorcycle_s_000924.png\n", + "upload: train/motorcycle_s_000941.png to s3://udacity-ml-workflow/train/motorcycle_s_000941.png\n", + "upload: train/motorcycle_s_000933.png to s3://udacity-ml-workflow/train/motorcycle_s_000933.png\n", + "upload: train/motorcycle_s_000979.png to s3://udacity-ml-workflow/train/motorcycle_s_000979.png\n", + "upload: train/motorcycle_s_000978.png to s3://udacity-ml-workflow/train/motorcycle_s_000978.png\n", + "upload: train/motorcycle_s_000989.png to s3://udacity-ml-workflow/train/motorcycle_s_000989.png\n", + "upload: train/motorcycle_s_000925.png to s3://udacity-ml-workflow/train/motorcycle_s_000925.png\n", + "upload: train/motorcycle_s_001012.png to s3://udacity-ml-workflow/train/motorcycle_s_001012.png\n", + "upload: train/motorcycle_s_000991.png to s3://udacity-ml-workflow/train/motorcycle_s_000991.png\n", + "upload: train/motorcycle_s_000928.png to s3://udacity-ml-workflow/train/motorcycle_s_000928.png\n", + "upload: train/motorcycle_s_001016.png to s3://udacity-ml-workflow/train/motorcycle_s_001016.png\n", + "upload: train/motorcycle_s_001064.png to s3://udacity-ml-workflow/train/motorcycle_s_001064.png\n", + "upload: train/motorcycle_s_001033.png to s3://udacity-ml-workflow/train/motorcycle_s_001033.png\n", + "upload: train/motorcycle_s_001106.png to s3://udacity-ml-workflow/train/motorcycle_s_001106.png\n", + "upload: train/motorcycle_s_001118.png to s3://udacity-ml-workflow/train/motorcycle_s_001118.png\n", + "upload: train/motorcycle_s_001027.png to s3://udacity-ml-workflow/train/motorcycle_s_001027.png\n", + "upload: train/motorcycle_s_001017.png to s3://udacity-ml-workflow/train/motorcycle_s_001017.png\n", + "upload: train/motorcycle_s_001063.png to s3://udacity-ml-workflow/train/motorcycle_s_001063.png\n", + "upload: train/motorcycle_s_001119.png to s3://udacity-ml-workflow/train/motorcycle_s_001119.png\n", + "upload: train/motorcycle_s_001126.png to s3://udacity-ml-workflow/train/motorcycle_s_001126.png\n", + "upload: train/motorcycle_s_001167.png to s3://udacity-ml-workflow/train/motorcycle_s_001167.png\n", + "upload: train/motorcycle_s_001176.png to s3://udacity-ml-workflow/train/motorcycle_s_001176.png\n", + "upload: train/motorcycle_s_001197.png to s3://udacity-ml-workflow/train/motorcycle_s_001197.png\n", + "upload: train/motorcycle_s_001205.png to s3://udacity-ml-workflow/train/motorcycle_s_001205.png\n", + "upload: train/motorcycle_s_001181.png to s3://udacity-ml-workflow/train/motorcycle_s_001181.png\n", + "upload: train/motorcycle_s_001180.png to s3://udacity-ml-workflow/train/motorcycle_s_001180.png\n", + "upload: train/motorcycle_s_001196.png to s3://udacity-ml-workflow/train/motorcycle_s_001196.png\n", + "upload: train/motorcycle_s_001183.png to s3://udacity-ml-workflow/train/motorcycle_s_001183.png\n", + "upload: train/motorcycle_s_001213.png to s3://udacity-ml-workflow/train/motorcycle_s_001213.png\n", + "upload: train/motorcycle_s_001236.png to s3://udacity-ml-workflow/train/motorcycle_s_001236.png\n", + "upload: train/motorcycle_s_001237.png to s3://udacity-ml-workflow/train/motorcycle_s_001237.png\n", + "upload: train/motorcycle_s_001182.png to s3://udacity-ml-workflow/train/motorcycle_s_001182.png\n", + "upload: train/motorcycle_s_001238.png to s3://udacity-ml-workflow/train/motorcycle_s_001238.png\n", + "upload: train/motorcycle_s_001220.png to s3://udacity-ml-workflow/train/motorcycle_s_001220.png\n", + "upload: train/motorcycle_s_001209.png to s3://udacity-ml-workflow/train/motorcycle_s_001209.png\n", + "upload: train/motorcycle_s_001215.png to s3://udacity-ml-workflow/train/motorcycle_s_001215.png\n", + "upload: train/motorcycle_s_001247.png to s3://udacity-ml-workflow/train/motorcycle_s_001247.png\n", + "upload: train/motorcycle_s_001246.png to s3://udacity-ml-workflow/train/motorcycle_s_001246.png\n", + "upload: train/motorcycle_s_001263.png to s3://udacity-ml-workflow/train/motorcycle_s_001263.png\n", + "upload: train/motorcycle_s_001244.png to s3://udacity-ml-workflow/train/motorcycle_s_001244.png\n", + "upload: train/motorcycle_s_001242.png to s3://udacity-ml-workflow/train/motorcycle_s_001242.png\n", + "upload: train/motorcycle_s_001273.png to s3://udacity-ml-workflow/train/motorcycle_s_001273.png\n", + "upload: train/motorcycle_s_001287.png to s3://udacity-ml-workflow/train/motorcycle_s_001287.png\n", + "upload: train/motorcycle_s_001297.png to s3://udacity-ml-workflow/train/motorcycle_s_001297.png\n", + "upload: train/motorcycle_s_001315.png to s3://udacity-ml-workflow/train/motorcycle_s_001315.png\n", + "upload: train/motorcycle_s_001337.png to s3://udacity-ml-workflow/train/motorcycle_s_001337.png\n", + "upload: train/motorcycle_s_001326.png to s3://udacity-ml-workflow/train/motorcycle_s_001326.png\n", + "upload: train/motorcycle_s_001319.png to s3://udacity-ml-workflow/train/motorcycle_s_001319.png\n", + "upload: train/motorcycle_s_001303.png to s3://udacity-ml-workflow/train/motorcycle_s_001303.png\n", + "upload: train/motorcycle_s_001360.png to s3://udacity-ml-workflow/train/motorcycle_s_001360.png\n", + "upload: train/motorcycle_s_001368.png to s3://udacity-ml-workflow/train/motorcycle_s_001368.png\n", + "upload: train/motorcycle_s_001363.png to s3://udacity-ml-workflow/train/motorcycle_s_001363.png\n", + "upload: train/motorcycle_s_001370.png to s3://udacity-ml-workflow/train/motorcycle_s_001370.png\n", + "upload: train/motorcycle_s_001407.png to s3://udacity-ml-workflow/train/motorcycle_s_001407.png\n", + "upload: train/motorcycle_s_001409.png to s3://udacity-ml-workflow/train/motorcycle_s_001409.png\n", + "upload: train/motorcycle_s_001402.png to s3://udacity-ml-workflow/train/motorcycle_s_001402.png\n", + "upload: train/motorcycle_s_001435.png to s3://udacity-ml-workflow/train/motorcycle_s_001435.png\n", + "upload: train/motorcycle_s_001413.png to s3://udacity-ml-workflow/train/motorcycle_s_001413.png\n", + "upload: train/motorcycle_s_001384.png to s3://udacity-ml-workflow/train/motorcycle_s_001384.png\n", + "upload: train/motorcycle_s_001397.png to s3://udacity-ml-workflow/train/motorcycle_s_001397.png\n", + "upload: train/motorcycle_s_001439.png to s3://udacity-ml-workflow/train/motorcycle_s_001439.png\n", + "upload: train/motorcycle_s_001453.png to s3://udacity-ml-workflow/train/motorcycle_s_001453.png\n", + "upload: train/motorcycle_s_001400.png to s3://udacity-ml-workflow/train/motorcycle_s_001400.png\n", + "upload: train/motorcycle_s_001392.png to s3://udacity-ml-workflow/train/motorcycle_s_001392.png\n", + "upload: train/motorcycle_s_001492.png to s3://udacity-ml-workflow/train/motorcycle_s_001492.png\n", + "upload: train/motorcycle_s_001507.png to s3://udacity-ml-workflow/train/motorcycle_s_001507.png\n", + "upload: train/motorcycle_s_001520.png to s3://udacity-ml-workflow/train/motorcycle_s_001520.png\n", + "upload: train/motorcycle_s_001438.png to s3://udacity-ml-workflow/train/motorcycle_s_001438.png\n", + "upload: train/motorcycle_s_001536.png to s3://udacity-ml-workflow/train/motorcycle_s_001536.png\n", + "upload: train/motorcycle_s_001584.png to s3://udacity-ml-workflow/train/motorcycle_s_001584.png\n", + "upload: train/motorcycle_s_001549.png to s3://udacity-ml-workflow/train/motorcycle_s_001549.png\n", + "upload: train/motorcycle_s_001580.png to s3://udacity-ml-workflow/train/motorcycle_s_001580.png\n", + "upload: train/motorcycle_s_001610.png to s3://udacity-ml-workflow/train/motorcycle_s_001610.png\n", + "upload: train/motorcycle_s_001527.png to s3://udacity-ml-workflow/train/motorcycle_s_001527.png\n", + "upload: train/motorcycle_s_001563.png to s3://udacity-ml-workflow/train/motorcycle_s_001563.png\n", + "upload: train/motorcycle_s_001565.png to s3://udacity-ml-workflow/train/motorcycle_s_001565.png\n", + "upload: train/motorcycle_s_001585.png to s3://udacity-ml-workflow/train/motorcycle_s_001585.png\n", + "upload: train/motorcycle_s_001587.png to s3://udacity-ml-workflow/train/motorcycle_s_001587.png\n", + "upload: train/motorcycle_s_001623.png to s3://udacity-ml-workflow/train/motorcycle_s_001623.png\n", + "upload: train/motorcycle_s_001641.png to s3://udacity-ml-workflow/train/motorcycle_s_001641.png\n", + "upload: train/motorcycle_s_001622.png to s3://udacity-ml-workflow/train/motorcycle_s_001622.png\n", + "upload: train/motorcycle_s_001696.png to s3://udacity-ml-workflow/train/motorcycle_s_001696.png\n", + "upload: train/motorcycle_s_001695.png to s3://udacity-ml-workflow/train/motorcycle_s_001695.png\n", + "upload: train/motorcycle_s_001686.png to s3://udacity-ml-workflow/train/motorcycle_s_001686.png\n", + "upload: train/motorcycle_s_001690.png to s3://udacity-ml-workflow/train/motorcycle_s_001690.png\n", + "upload: train/motorcycle_s_001611.png to s3://udacity-ml-workflow/train/motorcycle_s_001611.png\n", + "upload: train/motorcycle_s_001706.png to s3://udacity-ml-workflow/train/motorcycle_s_001706.png\n", + "upload: train/motorcycle_s_001693.png to s3://udacity-ml-workflow/train/motorcycle_s_001693.png\n", + "upload: train/motorcycle_s_001711.png to s3://udacity-ml-workflow/train/motorcycle_s_001711.png\n", + "upload: train/motorcycle_s_001699.png to s3://udacity-ml-workflow/train/motorcycle_s_001699.png\n", + "upload: train/motorcycle_s_001709.png to s3://udacity-ml-workflow/train/motorcycle_s_001709.png\n", + "upload: train/motorcycle_s_001715.png to s3://udacity-ml-workflow/train/motorcycle_s_001715.png\n", + "upload: train/motorcycle_s_001707.png to s3://udacity-ml-workflow/train/motorcycle_s_001707.png\n", + "upload: train/motorcycle_s_001767.png to s3://udacity-ml-workflow/train/motorcycle_s_001767.png\n", + "upload: train/motorcycle_s_001714.png to s3://udacity-ml-workflow/train/motorcycle_s_001714.png\n", + "upload: train/motorcycle_s_001710.png to s3://udacity-ml-workflow/train/motorcycle_s_001710.png\n", + "upload: train/motorcycle_s_001765.png to s3://udacity-ml-workflow/train/motorcycle_s_001765.png\n", + "upload: train/motorcycle_s_001792.png to s3://udacity-ml-workflow/train/motorcycle_s_001792.png\n", + "upload: train/motorcycle_s_001778.png to s3://udacity-ml-workflow/train/motorcycle_s_001778.png\n", + "upload: train/motorcycle_s_001853.png to s3://udacity-ml-workflow/train/motorcycle_s_001853.png\n", + "upload: train/motorcycle_s_001905.png to s3://udacity-ml-workflow/train/motorcycle_s_001905.png\n", + "upload: train/motorcycle_s_001856.png to s3://udacity-ml-workflow/train/motorcycle_s_001856.png\n", + "upload: train/motorcycle_s_001790.png to s3://udacity-ml-workflow/train/motorcycle_s_001790.png\n", + "upload: train/motorcycle_s_001753.png to s3://udacity-ml-workflow/train/motorcycle_s_001753.png\n", + "upload: train/motorcycle_s_001848.png to s3://udacity-ml-workflow/train/motorcycle_s_001848.png\n", + "upload: train/motorcycle_s_001784.png to s3://udacity-ml-workflow/train/motorcycle_s_001784.png\n", + "upload: train/motorcycle_s_001920.png to s3://udacity-ml-workflow/train/motorcycle_s_001920.png\n", + "upload: train/motorcycle_s_001862.png to s3://udacity-ml-workflow/train/motorcycle_s_001862.png\n", + "upload: train/motorcycle_s_001896.png to s3://udacity-ml-workflow/train/motorcycle_s_001896.png\n", + "upload: train/motorcycle_s_001973.png to s3://udacity-ml-workflow/train/motorcycle_s_001973.png\n", + "upload: train/motorcycle_s_001878.png to s3://udacity-ml-workflow/train/motorcycle_s_001878.png\n", + "upload: train/motorcycle_s_002065.png to s3://udacity-ml-workflow/train/motorcycle_s_002065.png\n", + "upload: train/motorcycle_s_002067.png to s3://udacity-ml-workflow/train/motorcycle_s_002067.png\n", + "upload: train/motorcycle_s_002105.png to s3://udacity-ml-workflow/train/motorcycle_s_002105.png\n", + "upload: train/motorcycle_s_002030.png to s3://udacity-ml-workflow/train/motorcycle_s_002030.png\n", + "upload: train/motorcycle_s_002143.png to s3://udacity-ml-workflow/train/motorcycle_s_002143.png\n", + "upload: train/motorcycle_s_002153.png to s3://udacity-ml-workflow/train/motorcycle_s_002153.png\n", + "upload: train/motorcycle_s_002183.png to s3://udacity-ml-workflow/train/motorcycle_s_002183.png\n", + "upload: train/motorcycle_s_002121.png to s3://udacity-ml-workflow/train/motorcycle_s_002121.png\n", + "upload: train/motorcycle_s_002031.png to s3://udacity-ml-workflow/train/motorcycle_s_002031.png\n", + "upload: train/motorcycle_s_002140.png to s3://udacity-ml-workflow/train/motorcycle_s_002140.png\n", + "upload: train/motorcycle_s_002162.png to s3://udacity-ml-workflow/train/motorcycle_s_002162.png\n", + "upload: train/motorcycle_s_002192.png to s3://udacity-ml-workflow/train/motorcycle_s_002192.png\n", + "upload: train/motorcycle_s_002193.png to s3://udacity-ml-workflow/train/motorcycle_s_002193.png\n", + "upload: train/motorcycle_s_002214.png to s3://udacity-ml-workflow/train/motorcycle_s_002214.png\n", + "upload: train/motorcycle_s_002197.png to s3://udacity-ml-workflow/train/motorcycle_s_002197.png\n", + "upload: train/motorcycle_s_002066.png to s3://udacity-ml-workflow/train/motorcycle_s_002066.png\n", + "upload: train/motorcycle_s_002221.png to s3://udacity-ml-workflow/train/motorcycle_s_002221.png\n", + "upload: train/motorcycle_s_002225.png to s3://udacity-ml-workflow/train/motorcycle_s_002225.png\n", + "upload: train/motorcycle_s_002222.png to s3://udacity-ml-workflow/train/motorcycle_s_002222.png\n", + "upload: train/motorcycle_s_002237.png to s3://udacity-ml-workflow/train/motorcycle_s_002237.png\n", + "upload: train/motorcycle_s_002215.png to s3://udacity-ml-workflow/train/motorcycle_s_002215.png\n", + "upload: train/motorcycle_s_002254.png to s3://udacity-ml-workflow/train/motorcycle_s_002254.png\n", + "upload: train/motorcycle_s_002234.png to s3://udacity-ml-workflow/train/motorcycle_s_002234.png\n", + "upload: train/motorcycle_s_002236.png to s3://udacity-ml-workflow/train/motorcycle_s_002236.png\n", + "upload: train/motorcycle_s_002271.png to s3://udacity-ml-workflow/train/motorcycle_s_002271.png\n", + "upload: train/motorcycle_s_002275.png to s3://udacity-ml-workflow/train/motorcycle_s_002275.png\n", + "upload: train/motorcycle_s_002316.png to s3://udacity-ml-workflow/train/motorcycle_s_002316.png\n", + "upload: train/motorcycle_s_002291.png to s3://udacity-ml-workflow/train/motorcycle_s_002291.png\n", + "upload: train/motorcycle_s_002317.png to s3://udacity-ml-workflow/train/motorcycle_s_002317.png\n", + "upload: train/motorcycle_s_002298.png to s3://udacity-ml-workflow/train/motorcycle_s_002298.png\n", + "upload: train/ordinary_bicycle_s_000022.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000022.png\n", + "upload: train/ordinary_bicycle_s_000008.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000008.png\n", + "upload: train/ordinary_bicycle_s_000023.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000023.png\n", + "upload: train/ordinary_bicycle_s_000016.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000016.png\n", + "upload: train/ordinary_bicycle_s_000031.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000031.png\n", + "upload: train/ordinary_bicycle_s_000035.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000035.png\n", + "upload: train/ordinary_bicycle_s_000029.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000029.png\n", + "upload: train/ordinary_bicycle_s_000011.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000011.png\n", + "upload: train/ordinary_bicycle_s_000049.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000049.png\n", + "upload: train/ordinary_bicycle_s_000056.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000056.png\n", + "upload: train/ordinary_bicycle_s_000036.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000036.png\n", + "upload: train/ordinary_bicycle_s_000060.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000060.png\n", + "upload: train/ordinary_bicycle_s_000066.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000066.png\n", + "upload: train/ordinary_bicycle_s_000096.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000096.png\n", + "upload: train/ordinary_bicycle_s_000099.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000099.png\n", + "upload: train/ordinary_bicycle_s_000097.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000097.png\n", + "upload: train/ordinary_bicycle_s_000095.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000095.png\n", + "upload: train/ordinary_bicycle_s_000102.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000102.png\n", + "upload: train/ordinary_bicycle_s_000101.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000101.png\n", + "upload: train/ordinary_bicycle_s_000104.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000104.png\n", + "upload: train/ordinary_bicycle_s_000100.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000100.png\n", + "upload: train/ordinary_bicycle_s_000107.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000107.png\n", + "upload: train/ordinary_bicycle_s_000112.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000112.png\n", + "upload: train/ordinary_bicycle_s_000098.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000098.png\n", + "upload: train/ordinary_bicycle_s_000110.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000110.png\n", + "upload: train/ordinary_bicycle_s_000155.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000155.png\n", + "upload: train/ordinary_bicycle_s_000201.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000201.png\n", + "upload: train/ordinary_bicycle_s_000205.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000205.png\n", + "upload: train/ordinary_bicycle_s_000154.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000154.png\n", + "upload: train/ordinary_bicycle_s_000218.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000218.png\n", + "upload: train/ordinary_bicycle_s_000167.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000167.png\n", + "upload: train/ordinary_bicycle_s_000125.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000125.png\n", + "upload: train/ordinary_bicycle_s_000265.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000265.png\n", + "upload: train/ordinary_bicycle_s_000274.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000274.png\n", + "upload: train/ordinary_bicycle_s_000269.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000269.png\n", + "upload: train/ordinary_bicycle_s_000216.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000216.png\n", + "upload: train/ordinary_bicycle_s_000286.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000286.png\n", + "upload: train/ordinary_bicycle_s_000280.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000280.png\n", + "upload: train/ordinary_bicycle_s_000297.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000297.png\n", + "upload: train/ordinary_bicycle_s_000298.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000298.png\n", + "upload: train/ordinary_bicycle_s_000277.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000277.png\n", + "upload: train/ordinary_bicycle_s_000308.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000308.png\n", + "upload: train/ordinary_bicycle_s_000347.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000347.png\n", + "upload: train/ordinary_bicycle_s_000324.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000324.png\n", + "upload: train/ordinary_bicycle_s_000355.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000355.png\n", + "upload: train/ordinary_bicycle_s_000419.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000419.png\n", + "upload: train/ordinary_bicycle_s_000157.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000157.png\n", + "upload: train/ordinary_bicycle_s_000426.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000426.png\n", + "upload: train/ordinary_bicycle_s_000451.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000451.png\n", + "upload: train/ordinary_bicycle_s_000433.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000433.png\n", + "upload: train/safety_bicycle_s_000092.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000092.png\n", + "upload: train/ordinary_bicycle_s_000387.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000387.png\n", + "upload: train/ordinary_bicycle_s_000432.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000432.png\n", + "upload: train/safety_bicycle_s_000079.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000079.png\n", + "upload: train/safety_bicycle_s_000125.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000125.png\n", + "upload: train/safety_bicycle_s_000162.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000162.png\n", + "upload: train/safety_bicycle_s_000140.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000140.png\n", + "upload: train/safety_bicycle_s_000193.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000193.png\n", + "upload: train/safety_bicycle_s_000207.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000207.png\n", + "upload: train/safety_bicycle_s_000019.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000019.png\n", + "upload: train/safety_bicycle_s_000233.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000233.png\n", + "upload: train/safety_bicycle_s_000167.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000167.png\n", + "upload: train/safety_bicycle_s_000255.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000255.png\n", + "upload: train/safety_bicycle_s_000232.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000232.png\n", + "upload: train/safety_bicycle_s_000296.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000296.png\n", + "upload: train/safety_bicycle_s_000322.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000322.png\n", + "upload: train/safety_bicycle_s_000239.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000239.png\n", + "upload: train/safety_bicycle_s_000303.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000303.png\n", + "upload: train/safety_bicycle_s_000196.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000196.png\n", + "upload: train/safety_bicycle_s_000261.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000261.png\n", + "upload: train/safety_bicycle_s_000324.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000324.png\n", + "upload: train/safety_bicycle_s_000373.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000373.png\n", + "upload: train/safety_bicycle_s_000359.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000359.png\n", + "upload: train/safety_bicycle_s_000500.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000500.png\n", + "upload: train/safety_bicycle_s_000568.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000568.png\n", + "upload: train/safety_bicycle_s_000427.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000427.png\n", + "upload: train/safety_bicycle_s_000533.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000533.png\n", + "upload: train/safety_bicycle_s_000655.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000655.png\n", + "upload: train/safety_bicycle_s_000348.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000348.png\n", + "upload: train/safety_bicycle_s_000532.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000532.png\n", + "upload: train/safety_bicycle_s_000660.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000660.png\n", + "upload: train/safety_bicycle_s_000789.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000789.png\n", + "upload: train/safety_bicycle_s_000728.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000728.png\n", + "upload: train/safety_bicycle_s_000760.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000760.png\n", + "upload: train/safety_bicycle_s_000425.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000425.png\n", + "upload: train/safety_bicycle_s_001026.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001026.png\n", + "upload: train/safety_bicycle_s_000860.png to s3://udacity-ml-workflow/train/safety_bicycle_s_000860.png\n", + "upload: train/safety_bicycle_s_001049.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001049.png\n", + "upload: train/safety_bicycle_s_001028.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001028.png\n", + "upload: train/safety_bicycle_s_001063.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001063.png\n", + "upload: train/safety_bicycle_s_001029.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001029.png\n", + "upload: train/safety_bicycle_s_001202.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001202.png\n", + "upload: train/safety_bicycle_s_001113.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001113.png\n", + "upload: train/ordinary_bicycle_s_000161.png to s3://udacity-ml-workflow/train/ordinary_bicycle_s_000161.png\n", + "upload: train/safety_bicycle_s_001109.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001109.png\n", + "upload: train/safety_bicycle_s_001253.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001253.png\n", + "upload: train/safety_bicycle_s_001254.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001254.png\n", + "upload: train/safety_bicycle_s_001327.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001327.png\n", + "upload: train/safety_bicycle_s_001085.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001085.png\n", + "upload: train/safety_bicycle_s_001303.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001303.png\n", + "upload: train/safety_bicycle_s_001243.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001243.png\n", + "upload: train/safety_bicycle_s_001381.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001381.png\n", + "upload: train/safety_bicycle_s_001320.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001320.png\n", + "upload: train/safety_bicycle_s_001570.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001570.png\n", + "upload: train/safety_bicycle_s_001240.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001240.png\n", + "upload: train/safety_bicycle_s_001659.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001659.png\n", + "upload: train/safety_bicycle_s_001639.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001639.png\n", + "upload: train/safety_bicycle_s_001608.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001608.png\n", + "upload: train/safety_bicycle_s_001705.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001705.png\n", + "upload: train/safety_bike_s_000054.png to s3://udacity-ml-workflow/train/safety_bike_s_000054.png\n", + "upload: train/safety_bicycle_s_001651.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001651.png\n", + "upload: train/safety_bike_s_000058.png to s3://udacity-ml-workflow/train/safety_bike_s_000058.png\n", + "upload: train/safety_bicycle_s_001699.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001699.png\n", + "upload: train/safety_bike_s_000100.png to s3://udacity-ml-workflow/train/safety_bike_s_000100.png\n", + "upload: train/safety_bike_s_000015.png to s3://udacity-ml-workflow/train/safety_bike_s_000015.png\n", + "upload: train/safety_bicycle_s_001706.png to s3://udacity-ml-workflow/train/safety_bicycle_s_001706.png\n", + "upload: train/safety_bike_s_000104.png to s3://udacity-ml-workflow/train/safety_bike_s_000104.png\n", + "upload: train/safety_bike_s_000155.png to s3://udacity-ml-workflow/train/safety_bike_s_000155.png\n", + "upload: train/safety_bike_s_000165.png to s3://udacity-ml-workflow/train/safety_bike_s_000165.png\n", + "upload: train/safety_bike_s_000009.png to s3://udacity-ml-workflow/train/safety_bike_s_000009.png\n", + "upload: train/safety_bike_s_000160.png to s3://udacity-ml-workflow/train/safety_bike_s_000160.png\n", + "upload: train/safety_bike_s_000079.png to s3://udacity-ml-workflow/train/safety_bike_s_000079.png\n", + "upload: train/safety_bike_s_000158.png to s3://udacity-ml-workflow/train/safety_bike_s_000158.png\n", + "upload: train/safety_bike_s_000178.png to s3://udacity-ml-workflow/train/safety_bike_s_000178.png\n", + "upload: train/safety_bike_s_000198.png to s3://udacity-ml-workflow/train/safety_bike_s_000198.png\n", + "upload: train/safety_bike_s_000263.png to s3://udacity-ml-workflow/train/safety_bike_s_000263.png\n", + "upload: train/safety_bike_s_000277.png to s3://udacity-ml-workflow/train/safety_bike_s_000277.png\n", + "upload: train/safety_bike_s_000381.png to s3://udacity-ml-workflow/train/safety_bike_s_000381.png\n", + "upload: train/safety_bike_s_000244.png to s3://udacity-ml-workflow/train/safety_bike_s_000244.png\n", + "upload: train/safety_bike_s_000328.png to s3://udacity-ml-workflow/train/safety_bike_s_000328.png\n", + "upload: train/safety_bike_s_000311.png to s3://udacity-ml-workflow/train/safety_bike_s_000311.png\n", + "upload: train/safety_bike_s_000482.png to s3://udacity-ml-workflow/train/safety_bike_s_000482.png\n", + "upload: train/safety_bike_s_000567.png to s3://udacity-ml-workflow/train/safety_bike_s_000567.png\n", + "upload: train/safety_bike_s_000245.png to s3://udacity-ml-workflow/train/safety_bike_s_000245.png\n", + "upload: train/safety_bike_s_000830.png to s3://udacity-ml-workflow/train/safety_bike_s_000830.png\n", + "upload: train/safety_bike_s_000643.png to s3://udacity-ml-workflow/train/safety_bike_s_000643.png\n", + "upload: train/safety_bike_s_000848.png to s3://udacity-ml-workflow/train/safety_bike_s_000848.png\n", + "upload: train/safety_bike_s_000173.png to s3://udacity-ml-workflow/train/safety_bike_s_000173.png\n", + "upload: train/safety_bike_s_000461.png to s3://udacity-ml-workflow/train/safety_bike_s_000461.png\n", + "upload: train/safety_bike_s_000914.png to s3://udacity-ml-workflow/train/safety_bike_s_000914.png\n", + "upload: train/safety_bike_s_000934.png to s3://udacity-ml-workflow/train/safety_bike_s_000934.png\n", + "upload: train/safety_bike_s_000867.png to s3://udacity-ml-workflow/train/safety_bike_s_000867.png\n", + "upload: train/safety_bike_s_000989.png to s3://udacity-ml-workflow/train/safety_bike_s_000989.png\n", + "upload: train/safety_bike_s_000921.png to s3://udacity-ml-workflow/train/safety_bike_s_000921.png\n", + "upload: train/safety_bike_s_001010.png to s3://udacity-ml-workflow/train/safety_bike_s_001010.png\n", + "upload: train/safety_bike_s_000984.png to s3://udacity-ml-workflow/train/safety_bike_s_000984.png\n", + "upload: train/safety_bike_s_000950.png to s3://udacity-ml-workflow/train/safety_bike_s_000950.png\n", + "upload: train/safety_bike_s_001148.png to s3://udacity-ml-workflow/train/safety_bike_s_001148.png\n", + "upload: train/safety_bike_s_001289.png to s3://udacity-ml-workflow/train/safety_bike_s_001289.png\n", + "upload: train/safety_bike_s_001012.png to s3://udacity-ml-workflow/train/safety_bike_s_001012.png\n", + "upload: train/safety_bike_s_001338.png to s3://udacity-ml-workflow/train/safety_bike_s_001338.png\n", + "upload: train/safety_bike_s_001355.png to s3://udacity-ml-workflow/train/safety_bike_s_001355.png\n", + "upload: train/safety_bike_s_001371.png to s3://udacity-ml-workflow/train/safety_bike_s_001371.png\n", + "upload: train/safety_bike_s_001465.png to s3://udacity-ml-workflow/train/safety_bike_s_001465.png\n", + "upload: train/safety_bike_s_001472.png to s3://udacity-ml-workflow/train/safety_bike_s_001472.png\n", + "upload: train/safety_bike_s_000963.png to s3://udacity-ml-workflow/train/safety_bike_s_000963.png\n", + "upload: train/safety_bike_s_001552.png to s3://udacity-ml-workflow/train/safety_bike_s_001552.png\n", + "upload: train/safety_bike_s_001560.png to s3://udacity-ml-workflow/train/safety_bike_s_001560.png\n", + "upload: train/safety_bike_s_001640.png to s3://udacity-ml-workflow/train/safety_bike_s_001640.png\n", + "upload: train/safety_bike_s_001474.png to s3://udacity-ml-workflow/train/safety_bike_s_001474.png\n", + "upload: train/safety_bike_s_001257.png to s3://udacity-ml-workflow/train/safety_bike_s_001257.png\n", + "upload: train/safety_bike_s_001608.png to s3://udacity-ml-workflow/train/safety_bike_s_001608.png\n", + "upload: train/safety_bike_s_001590.png to s3://udacity-ml-workflow/train/safety_bike_s_001590.png\n", + "upload: train/trail_bike_s_000016.png to s3://udacity-ml-workflow/train/trail_bike_s_000016.png\n", + "upload: train/velocipede_s_000010.png to s3://udacity-ml-workflow/train/velocipede_s_000010.png\n", + "upload: train/safety_bike_s_001659.png to s3://udacity-ml-workflow/train/safety_bike_s_001659.png\n", + "upload: train/velocipede_s_000023.png to s3://udacity-ml-workflow/train/velocipede_s_000023.png\n", + "upload: train/safety_bike_s_001784.png to s3://udacity-ml-workflow/train/safety_bike_s_001784.png\n", + "upload: train/velocipede_s_000265.png to s3://udacity-ml-workflow/train/velocipede_s_000265.png\n", + "upload: train/velocipede_s_000139.png to s3://udacity-ml-workflow/train/velocipede_s_000139.png\n", + "upload: train/velocipede_s_000049.png to s3://udacity-ml-workflow/train/velocipede_s_000049.png\n", + "upload: train/velocipede_s_000330.png to s3://udacity-ml-workflow/train/velocipede_s_000330.png\n", + "upload: train/velocipede_s_000282.png to s3://udacity-ml-workflow/train/velocipede_s_000282.png\n", + "upload: train/velocipede_s_000430.png to s3://udacity-ml-workflow/train/velocipede_s_000430.png\n", + "upload: train/velocipede_s_000021.png to s3://udacity-ml-workflow/train/velocipede_s_000021.png\n", + "upload: train/velocipede_s_000485.png to s3://udacity-ml-workflow/train/velocipede_s_000485.png\n", + "upload: train/velocipede_s_000012.png to s3://udacity-ml-workflow/train/velocipede_s_000012.png\n", + "upload: train/velocipede_s_000659.png to s3://udacity-ml-workflow/train/velocipede_s_000659.png\n", + "upload: train/safety_bike_s_001715.png to s3://udacity-ml-workflow/train/safety_bike_s_001715.png\n", + "upload: train/velocipede_s_000586.png to s3://udacity-ml-workflow/train/velocipede_s_000586.png\n", + "upload: train/velocipede_s_000825.png to s3://udacity-ml-workflow/train/velocipede_s_000825.png\n", + "upload: train/velocipede_s_000807.png to s3://udacity-ml-workflow/train/velocipede_s_000807.png\n", + "upload: train/velocipede_s_001056.png to s3://udacity-ml-workflow/train/velocipede_s_001056.png\n", + "upload: train/velocipede_s_000670.png to s3://udacity-ml-workflow/train/velocipede_s_000670.png\n", + "upload: train/velocipede_s_000989.png to s3://udacity-ml-workflow/train/velocipede_s_000989.png\n", + "upload: train/velocipede_s_001158.png to s3://udacity-ml-workflow/train/velocipede_s_001158.png\n", + "upload: train/velocipede_s_000702.png to s3://udacity-ml-workflow/train/velocipede_s_000702.png\n", + "upload: train/velocipede_s_000931.png to s3://udacity-ml-workflow/train/velocipede_s_000931.png\n", + "upload: train/velocipede_s_001141.png to s3://udacity-ml-workflow/train/velocipede_s_001141.png\n", + "upload: train/velocipede_s_000358.png to s3://udacity-ml-workflow/train/velocipede_s_000358.png\n", + "upload: train/velocipede_s_000949.png to s3://udacity-ml-workflow/train/velocipede_s_000949.png\n", + "upload: train/velocipede_s_001166.png to s3://udacity-ml-workflow/train/velocipede_s_001166.png\n", + "upload: train/velocipede_s_001142.png to s3://udacity-ml-workflow/train/velocipede_s_001142.png\n", + "upload: train/velocipede_s_001200.png to s3://udacity-ml-workflow/train/velocipede_s_001200.png\n", + "upload: train/velocipede_s_001222.png to s3://udacity-ml-workflow/train/velocipede_s_001222.png\n", + "upload: train/velocipede_s_001210.png to s3://udacity-ml-workflow/train/velocipede_s_001210.png\n", + "upload: train/velocipede_s_001298.png to s3://udacity-ml-workflow/train/velocipede_s_001298.png\n", + "upload: train/velocipede_s_001338.png to s3://udacity-ml-workflow/train/velocipede_s_001338.png\n", + "upload: train/velocipede_s_001225.png to s3://udacity-ml-workflow/train/velocipede_s_001225.png\n", + "upload: train/velocipede_s_001361.png to s3://udacity-ml-workflow/train/velocipede_s_001361.png\n", + "upload: train/velocipede_s_001299.png to s3://udacity-ml-workflow/train/velocipede_s_001299.png\n", + "upload: train/velocipede_s_001244.png to s3://udacity-ml-workflow/train/velocipede_s_001244.png\n", + "upload: train/velocipede_s_001585.png to s3://udacity-ml-workflow/train/velocipede_s_001585.png\n", + "upload: train/velocipede_s_001489.png to s3://udacity-ml-workflow/train/velocipede_s_001489.png\n", + "upload: train/velocipede_s_001422.png to s3://udacity-ml-workflow/train/velocipede_s_001422.png\n", + "upload: train/velocipede_s_001514.png to s3://udacity-ml-workflow/train/velocipede_s_001514.png\n", + "upload: train/velocipede_s_001278.png to s3://udacity-ml-workflow/train/velocipede_s_001278.png\n", + "upload: train/velocipede_s_001358.png to s3://udacity-ml-workflow/train/velocipede_s_001358.png\n", + "upload: train/velocipede_s_001279.png to s3://udacity-ml-workflow/train/velocipede_s_001279.png\n", + "upload: train/velocipede_s_001637.png to s3://udacity-ml-workflow/train/velocipede_s_001637.png\n", + "upload: train/velocipede_s_001880.png to s3://udacity-ml-workflow/train/velocipede_s_001880.png\n", + "upload: train/velocipede_s_001882.png to s3://udacity-ml-workflow/train/velocipede_s_001882.png\n", + "upload: train/velocipede_s_001907.png to s3://udacity-ml-workflow/train/velocipede_s_001907.png\n", + "upload: train/velocipede_s_001920.png to s3://udacity-ml-workflow/train/velocipede_s_001920.png\n", + "upload: train/velocipede_s_001872.png to s3://udacity-ml-workflow/train/velocipede_s_001872.png\n", + "upload: train/velocipede_s_001870.png to s3://udacity-ml-workflow/train/velocipede_s_001870.png\n", + "upload: train/velocipede_s_001958.png to s3://udacity-ml-workflow/train/velocipede_s_001958.png\n", + "upload: train/velocipede_s_001874.png to s3://udacity-ml-workflow/train/velocipede_s_001874.png\n", + "upload: train/velocipede_s_001883.png to s3://udacity-ml-workflow/train/velocipede_s_001883.png\n", + "upload: train/velocipede_s_001935.png to s3://udacity-ml-workflow/train/velocipede_s_001935.png\n", + "upload: test/bicycle_s_000030.png to s3://udacity-ml-workflow/test/bicycle_s_000030.png\n", + "upload: test/bicycle_s_001107.png to s3://udacity-ml-workflow/test/bicycle_s_001107.png\n", + "upload: test/bicycle_s_000059.png to s3://udacity-ml-workflow/test/bicycle_s_000059.png\n", + "upload: test/bicycle_s_000479.png to s3://udacity-ml-workflow/test/bicycle_s_000479.png\n", + "upload: test/bicycle_s_000779.png to s3://udacity-ml-workflow/test/bicycle_s_000779.png\n", + "upload: test/bicycle_s_001047.png to s3://udacity-ml-workflow/test/bicycle_s_001047.png\n", + "upload: test/bicycle_s_000031.png to s3://udacity-ml-workflow/test/bicycle_s_000031.png\n", + "upload: test/bicycle_s_001218.png to s3://udacity-ml-workflow/test/bicycle_s_001218.png\n", + "upload: test/bike_s_000041.png to s3://udacity-ml-workflow/test/bike_s_000041.png \n", + "upload: test/bicycle_s_001102.png to s3://udacity-ml-workflow/test/bicycle_s_001102.png\n", + "upload: test/bicycle_s_002735.png to s3://udacity-ml-workflow/test/bicycle_s_002735.png\n", + "upload: test/bicycle_s_000977.png to s3://udacity-ml-workflow/test/bicycle_s_000977.png\n", + "upload: test/bicycle_s_000513.png to s3://udacity-ml-workflow/test/bicycle_s_000513.png\n", + "upload: test/bicycle_s_000776.png to s3://udacity-ml-workflow/test/bicycle_s_000776.png\n", + "upload: test/bicycle_s_001804.png to s3://udacity-ml-workflow/test/bicycle_s_001804.png\n", + "upload: test/bicycle_s_001789.png to s3://udacity-ml-workflow/test/bicycle_s_001789.png\n", + "upload: test/bicycle_s_000777.png to s3://udacity-ml-workflow/test/bicycle_s_000777.png\n", + "upload: test/bicycle_s_002458.png to s3://udacity-ml-workflow/test/bicycle_s_002458.png\n", + "upload: test/bike_s_000330.png to s3://udacity-ml-workflow/test/bike_s_000330.png \n", + "upload: test/bike_s_000643.png to s3://udacity-ml-workflow/test/bike_s_000643.png \n", + "upload: test/bike_s_000071.png to s3://udacity-ml-workflow/test/bike_s_000071.png \n", + "upload: test/bike_s_000658.png to s3://udacity-ml-workflow/test/bike_s_000658.png \n", + "upload: test/bike_s_000487.png to s3://udacity-ml-workflow/test/bike_s_000487.png \n", + "upload: test/bike_s_000457.png to s3://udacity-ml-workflow/test/bike_s_000457.png \n", + "upload: test/bike_s_000694.png to s3://udacity-ml-workflow/test/bike_s_000694.png \n", + "upload: test/bike_s_000131.png to s3://udacity-ml-workflow/test/bike_s_000131.png \n", + "upload: test/bike_s_000163.png to s3://udacity-ml-workflow/test/bike_s_000163.png \n", + "upload: test/bike_s_000801.png to s3://udacity-ml-workflow/test/bike_s_000801.png \n", + "upload: test/bike_s_001073.png to s3://udacity-ml-workflow/test/bike_s_001073.png \n", + "upload: test/bike_s_001342.png to s3://udacity-ml-workflow/test/bike_s_001342.png \n", + "upload: test/bike_s_001216.png to s3://udacity-ml-workflow/test/bike_s_001216.png \n", + "upload: test/bike_s_001738.png to s3://udacity-ml-workflow/test/bike_s_001738.png \n", + "upload: test/bike_s_001784.png to s3://udacity-ml-workflow/test/bike_s_001784.png \n", + "upload: test/bike_s_002116.png to s3://udacity-ml-workflow/test/bike_s_002116.png \n", + "upload: test/bike_s_001068.png to s3://udacity-ml-workflow/test/bike_s_001068.png \n", + "upload: test/bike_s_000941.png to s3://udacity-ml-workflow/test/bike_s_000941.png \n", + "upload: test/bike_s_002009.png to s3://udacity-ml-workflow/test/bike_s_002009.png \n", + "upload: test/bike_s_001852.png to s3://udacity-ml-workflow/test/bike_s_001852.png \n", + "upload: test/cycle_s_000010.png to s3://udacity-ml-workflow/test/cycle_s_000010.png \n", + "upload: test/bike_s_001159.png to s3://udacity-ml-workflow/test/bike_s_001159.png \n", + "upload: test/cycle_s_000068.png to s3://udacity-ml-workflow/test/cycle_s_000068.png \n", + "upload: test/cycle_s_001214.png to s3://udacity-ml-workflow/test/cycle_s_001214.png \n", + "upload: test/cycle_s_001297.png to s3://udacity-ml-workflow/test/cycle_s_001297.png \n", + "upload: test/cycle_s_000970.png to s3://udacity-ml-workflow/test/cycle_s_000970.png \n", + "upload: test/cycle_s_001306.png to s3://udacity-ml-workflow/test/cycle_s_001306.png \n", + "upload: test/cycle_s_001648.png to s3://udacity-ml-workflow/test/cycle_s_001648.png \n", + "upload: test/bike_s_002208.png to s3://udacity-ml-workflow/test/bike_s_002208.png \n", + "upload: test/cycle_s_002613.png to s3://udacity-ml-workflow/test/cycle_s_002613.png \n", + "upload: test/cycle_s_002661.png to s3://udacity-ml-workflow/test/cycle_s_002661.png \n", + "upload: test/cycle_s_002964.png to s3://udacity-ml-workflow/test/cycle_s_002964.png \n", + "upload: test/cycle_s_002305.png to s3://udacity-ml-workflow/test/cycle_s_002305.png \n", + "upload: test/cycle_s_001044.png to s3://udacity-ml-workflow/test/cycle_s_001044.png \n", + "upload: test/dirt_bike_s_000001.png to s3://udacity-ml-workflow/test/dirt_bike_s_000001.png\n", + "upload: test/minibike_s_000288.png to s3://udacity-ml-workflow/test/minibike_s_000288.png\n", + "upload: test/minibike_s_000055.png to s3://udacity-ml-workflow/test/minibike_s_000055.png\n", + "upload: test/minibike_s_000075.png to s3://udacity-ml-workflow/test/minibike_s_000075.png\n", + "upload: test/minibike_s_000254.png to s3://udacity-ml-workflow/test/minibike_s_000254.png\n", + "upload: test/minibike_s_000052.png to s3://udacity-ml-workflow/test/minibike_s_000052.png\n", + "upload: test/cycle_s_001915.png to s3://udacity-ml-workflow/test/cycle_s_001915.png \n", + "upload: test/cycle_s_001953.png to s3://udacity-ml-workflow/test/cycle_s_001953.png \n", + "upload: test/minibike_s_000398.png to s3://udacity-ml-workflow/test/minibike_s_000398.png\n", + "upload: test/minibike_s_000290.png to s3://udacity-ml-workflow/test/minibike_s_000290.png\n", + "upload: test/minibike_s_000505.png to s3://udacity-ml-workflow/test/minibike_s_000505.png\n", + "upload: test/minibike_s_000497.png to s3://udacity-ml-workflow/test/minibike_s_000497.png\n", + "upload: test/minibike_s_000801.png to s3://udacity-ml-workflow/test/minibike_s_000801.png\n", + "upload: test/minibike_s_000573.png to s3://udacity-ml-workflow/test/minibike_s_000573.png\n", + "upload: test/minibike_s_000309.png to s3://udacity-ml-workflow/test/minibike_s_000309.png\n", + "upload: test/minibike_s_000792.png to s3://udacity-ml-workflow/test/minibike_s_000792.png\n", + "upload: test/minibike_s_001089.png to s3://udacity-ml-workflow/test/minibike_s_001089.png\n", + "upload: test/minibike_s_000828.png to s3://udacity-ml-workflow/test/minibike_s_000828.png\n", + "upload: test/minibike_s_000913.png to s3://udacity-ml-workflow/test/minibike_s_000913.png\n", + "upload: test/minibike_s_000947.png to s3://udacity-ml-workflow/test/minibike_s_000947.png\n", + "upload: test/minibike_s_000960.png to s3://udacity-ml-workflow/test/minibike_s_000960.png\n", + "upload: test/minibike_s_001547.png to s3://udacity-ml-workflow/test/minibike_s_001547.png\n", + "upload: test/minibike_s_000880.png to s3://udacity-ml-workflow/test/minibike_s_000880.png\n", + "upload: test/minibike_s_001441.png to s3://udacity-ml-workflow/test/minibike_s_001441.png\n", + "upload: test/minibike_s_001473.png to s3://udacity-ml-workflow/test/minibike_s_001473.png\n", + "upload: test/minibike_s_001605.png to s3://udacity-ml-workflow/test/minibike_s_001605.png\n", + "upload: test/minibike_s_001651.png to s3://udacity-ml-workflow/test/minibike_s_001651.png\n", + "upload: test/minibike_s_001867.png to s3://udacity-ml-workflow/test/minibike_s_001867.png\n", + "upload: test/minibike_s_002173.png to s3://udacity-ml-workflow/test/minibike_s_002173.png\n", + "upload: test/minibike_s_001732.png to s3://udacity-ml-workflow/test/minibike_s_001732.png\n", + "upload: test/minibike_s_002051.png to s3://udacity-ml-workflow/test/minibike_s_002051.png\n", + "upload: test/minibike_s_002230.png to s3://udacity-ml-workflow/test/minibike_s_002230.png\n", + "upload: test/minibike_s_001893.png to s3://udacity-ml-workflow/test/minibike_s_001893.png\n", + "upload: test/moped_s_000033.png to s3://udacity-ml-workflow/test/moped_s_000033.png\n", + "upload: test/minibike_s_002227.png to s3://udacity-ml-workflow/test/minibike_s_002227.png\n", + "upload: test/moped_s_000064.png to s3://udacity-ml-workflow/test/moped_s_000064.png\n", + "upload: test/moped_s_000007.png to s3://udacity-ml-workflow/test/moped_s_000007.png\n", + "upload: test/motorbike_s_000121.png to s3://udacity-ml-workflow/test/motorbike_s_000121.png\n", + "upload: test/moped_s_000306.png to s3://udacity-ml-workflow/test/moped_s_000306.png\n", + "upload: test/motorbike_s_000135.png to s3://udacity-ml-workflow/test/motorbike_s_000135.png\n", + "upload: test/motorbike_s_000126.png to s3://udacity-ml-workflow/test/motorbike_s_000126.png\n", + "upload: test/motorbike_s_000433.png to s3://udacity-ml-workflow/test/motorbike_s_000433.png\n", + "upload: test/motorbike_s_000629.png to s3://udacity-ml-workflow/test/motorbike_s_000629.png\n", + "upload: test/motorcycle_s_000040.png to s3://udacity-ml-workflow/test/motorcycle_s_000040.png\n", + "upload: test/motorbike_s_000333.png to s3://udacity-ml-workflow/test/motorbike_s_000333.png\n", + "upload: test/motorbike_s_000324.png to s3://udacity-ml-workflow/test/motorbike_s_000324.png\n", + "upload: test/motorcycle_s_000007.png to s3://udacity-ml-workflow/test/motorcycle_s_000007.png\n", + "upload: test/motorcycle_s_000060.png to s3://udacity-ml-workflow/test/motorcycle_s_000060.png\n", + "upload: test/motorcycle_s_000139.png to s3://udacity-ml-workflow/test/motorcycle_s_000139.png\n", + "upload: test/motorcycle_s_000049.png to s3://udacity-ml-workflow/test/motorcycle_s_000049.png\n", + "upload: test/motorcycle_s_000063.png to s3://udacity-ml-workflow/test/motorcycle_s_000063.png\n", + "upload: test/motorbike_s_000465.png to s3://udacity-ml-workflow/test/motorbike_s_000465.png\n", + "upload: test/motorcycle_s_000042.png to s3://udacity-ml-workflow/test/motorcycle_s_000042.png\n", + "upload: test/motorcycle_s_000171.png to s3://udacity-ml-workflow/test/motorcycle_s_000171.png\n", + "upload: test/motorcycle_s_000211.png to s3://udacity-ml-workflow/test/motorcycle_s_000211.png\n", + "upload: test/motorcycle_s_000323.png to s3://udacity-ml-workflow/test/motorcycle_s_000323.png\n", + "upload: test/motorcycle_s_000222.png to s3://udacity-ml-workflow/test/motorcycle_s_000222.png\n", + "upload: test/motorcycle_s_000352.png to s3://udacity-ml-workflow/test/motorcycle_s_000352.png\n", + "upload: test/motorbike_s_000005.png to s3://udacity-ml-workflow/test/motorbike_s_000005.png\n", + "upload: test/motorcycle_s_000141.png to s3://udacity-ml-workflow/test/motorcycle_s_000141.png\n", + "upload: test/motorcycle_s_000427.png to s3://udacity-ml-workflow/test/motorcycle_s_000427.png\n", + "upload: test/motorcycle_s_000446.png to s3://udacity-ml-workflow/test/motorcycle_s_000446.png\n", + "upload: test/motorcycle_s_000450.png to s3://udacity-ml-workflow/test/motorcycle_s_000450.png\n", + "upload: test/motorcycle_s_000494.png to s3://udacity-ml-workflow/test/motorcycle_s_000494.png\n", + "upload: test/motorcycle_s_000530.png to s3://udacity-ml-workflow/test/motorcycle_s_000530.png\n", + "upload: test/motorcycle_s_000512.png to s3://udacity-ml-workflow/test/motorcycle_s_000512.png\n", + "upload: test/motorcycle_s_000485.png to s3://udacity-ml-workflow/test/motorcycle_s_000485.png\n", + "upload: test/motorcycle_s_000602.png to s3://udacity-ml-workflow/test/motorcycle_s_000602.png\n", + "upload: test/motorcycle_s_000615.png to s3://udacity-ml-workflow/test/motorcycle_s_000615.png\n", + "upload: test/motorcycle_s_000685.png to s3://udacity-ml-workflow/test/motorcycle_s_000685.png\n", + "upload: test/motorcycle_s_000679.png to s3://udacity-ml-workflow/test/motorcycle_s_000679.png\n", + "upload: test/motorcycle_s_000739.png to s3://udacity-ml-workflow/test/motorcycle_s_000739.png\n", + "upload: test/motorcycle_s_000606.png to s3://udacity-ml-workflow/test/motorcycle_s_000606.png\n", + "upload: test/motorcycle_s_000797.png to s3://udacity-ml-workflow/test/motorcycle_s_000797.png\n", + "upload: test/motorcycle_s_000825.png to s3://udacity-ml-workflow/test/motorcycle_s_000825.png\n", + "upload: test/motorcycle_s_000866.png to s3://udacity-ml-workflow/test/motorcycle_s_000866.png\n", + "upload: test/motorcycle_s_001249.png to s3://udacity-ml-workflow/test/motorcycle_s_001249.png\n", + "upload: test/motorcycle_s_001261.png to s3://udacity-ml-workflow/test/motorcycle_s_001261.png\n", + "upload: test/motorcycle_s_000878.png to s3://udacity-ml-workflow/test/motorcycle_s_000878.png\n", + "upload: test/motorcycle_s_000963.png to s3://udacity-ml-workflow/test/motorcycle_s_000963.png\n", + "upload: test/motorcycle_s_001385.png to s3://udacity-ml-workflow/test/motorcycle_s_001385.png\n", + "upload: test/motorcycle_s_001164.png to s3://udacity-ml-workflow/test/motorcycle_s_001164.png\n", + "upload: test/motorcycle_s_000876.png to s3://udacity-ml-workflow/test/motorcycle_s_000876.png\n", + "upload: test/motorcycle_s_001348.png to s3://udacity-ml-workflow/test/motorcycle_s_001348.png\n", + "upload: test/motorcycle_s_001269.png to s3://udacity-ml-workflow/test/motorcycle_s_001269.png\n", + "upload: test/motorcycle_s_001519.png to s3://udacity-ml-workflow/test/motorcycle_s_001519.png\n", + "upload: test/motorcycle_s_001679.png to s3://udacity-ml-workflow/test/motorcycle_s_001679.png\n", + "upload: test/motorcycle_s_001508.png to s3://udacity-ml-workflow/test/motorcycle_s_001508.png\n", + "upload: test/motorcycle_s_001782.png to s3://udacity-ml-workflow/test/motorcycle_s_001782.png\n", + "upload: test/motorcycle_s_001687.png to s3://udacity-ml-workflow/test/motorcycle_s_001687.png\n", + "upload: test/motorcycle_s_001936.png to s3://udacity-ml-workflow/test/motorcycle_s_001936.png\n", + "upload: test/motorcycle_s_001960.png to s3://udacity-ml-workflow/test/motorcycle_s_001960.png\n", + "upload: test/motorcycle_s_001955.png to s3://udacity-ml-workflow/test/motorcycle_s_001955.png\n", + "upload: test/motorcycle_s_001906.png to s3://udacity-ml-workflow/test/motorcycle_s_001906.png\n", + "upload: test/motorcycle_s_002026.png to s3://udacity-ml-workflow/test/motorcycle_s_002026.png\n", + "upload: test/motorcycle_s_001971.png to s3://udacity-ml-workflow/test/motorcycle_s_001971.png\n", + "upload: test/motorcycle_s_001892.png to s3://udacity-ml-workflow/test/motorcycle_s_001892.png\n", + "upload: test/motorcycle_s_002112.png to s3://udacity-ml-workflow/test/motorcycle_s_002112.png\n", + "upload: test/motorcycle_s_002177.png to s3://udacity-ml-workflow/test/motorcycle_s_002177.png\n", + "upload: test/motorcycle_s_002126.png to s3://udacity-ml-workflow/test/motorcycle_s_002126.png\n", + "upload: test/ordinary_bicycle_s_000105.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000105.png\n", + "upload: test/ordinary_bicycle_s_000113.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000113.png\n", + "upload: test/ordinary_bicycle_s_000350.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000350.png\n", + "upload: test/safety_bicycle_s_000235.png to s3://udacity-ml-workflow/test/safety_bicycle_s_000235.png\n", + "upload: test/safety_bicycle_s_000280.png to s3://udacity-ml-workflow/test/safety_bicycle_s_000280.png\n", + "upload: test/safety_bicycle_s_000315.png to s3://udacity-ml-workflow/test/safety_bicycle_s_000315.png\n", + "upload: test/ordinary_bicycle_s_000437.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000437.png\n", + "upload: test/ordinary_bicycle_s_000169.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000169.png\n", + "upload: test/ordinary_bicycle_s_000431.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000431.png\n", + "upload: test/safety_bicycle_s_001153.png to s3://udacity-ml-workflow/test/safety_bicycle_s_001153.png\n", + "upload: test/safety_bicycle_s_001286.png to s3://udacity-ml-workflow/test/safety_bicycle_s_001286.png\n", + "upload: test/ordinary_bicycle_s_000158.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000158.png\n", + "upload: test/safety_bicycle_s_001322.png to s3://udacity-ml-workflow/test/safety_bicycle_s_001322.png\n", + "upload: test/safety_bike_s_000438.png to s3://udacity-ml-workflow/test/safety_bike_s_000438.png\n", + "upload: test/safety_bike_s_000390.png to s3://udacity-ml-workflow/test/safety_bike_s_000390.png\n", + "upload: test/safety_bike_s_000541.png to s3://udacity-ml-workflow/test/safety_bike_s_000541.png\n", + "upload: test/safety_bike_s_000699.png to s3://udacity-ml-workflow/test/safety_bike_s_000699.png\n", + "upload: test/safety_bicycle_s_001575.png to s3://udacity-ml-workflow/test/safety_bicycle_s_001575.png\n", + "upload: test/safety_bike_s_000192.png to s3://udacity-ml-workflow/test/safety_bike_s_000192.png\n", + "upload: test/safety_bike_s_000791.png to s3://udacity-ml-workflow/test/safety_bike_s_000791.png\n", + "upload: test/safety_bike_s_000540.png to s3://udacity-ml-workflow/test/safety_bike_s_000540.png\n", + "upload: test/safety_bike_s_000488.png to s3://udacity-ml-workflow/test/safety_bike_s_000488.png\n", + "upload: test/safety_bike_s_001065.png to s3://udacity-ml-workflow/test/safety_bike_s_001065.png\n", + "upload: test/safety_bike_s_001088.png to s3://udacity-ml-workflow/test/safety_bike_s_001088.png\n", + "upload: test/safety_bike_s_001132.png to s3://udacity-ml-workflow/test/safety_bike_s_001132.png\n", + "upload: test/velocipede_s_000001.png to s3://udacity-ml-workflow/test/velocipede_s_000001.png\n", + "upload: test/safety_bike_s_001087.png to s3://udacity-ml-workflow/test/safety_bike_s_001087.png\n", + "upload: test/velocipede_s_000041.png to s3://udacity-ml-workflow/test/velocipede_s_000041.png\n", + "upload: test/safety_bike_s_001253.png to s3://udacity-ml-workflow/test/safety_bike_s_001253.png\n", + "upload: test/trail_bike_s_000073.png to s3://udacity-ml-workflow/test/trail_bike_s_000073.png\n", + "upload: test/safety_bike_s_001481.png to s3://udacity-ml-workflow/test/safety_bike_s_001481.png\n", + "upload: test/safety_bike_s_001690.png to s3://udacity-ml-workflow/test/safety_bike_s_001690.png\n", + "upload: test/velocipede_s_000292.png to s3://udacity-ml-workflow/test/velocipede_s_000292.png\n", + "upload: test/velocipede_s_000106.png to s3://udacity-ml-workflow/test/velocipede_s_000106.png\n", + "upload: test/velocipede_s_000369.png to s3://udacity-ml-workflow/test/velocipede_s_000369.png\n", + "upload: test/ordinary_bicycle_s_000284.png to s3://udacity-ml-workflow/test/ordinary_bicycle_s_000284.png\n", + "upload: test/velocipede_s_001277.png to s3://udacity-ml-workflow/test/velocipede_s_001277.png\n", + "upload: test/velocipede_s_001335.png to s3://udacity-ml-workflow/test/velocipede_s_001335.png\n", + "upload: test/velocipede_s_001355.png to s3://udacity-ml-workflow/test/velocipede_s_001355.png\n", + "upload: test/velocipede_s_000863.png to s3://udacity-ml-workflow/test/velocipede_s_000863.png\n", + "upload: test/velocipede_s_001201.png to s3://udacity-ml-workflow/test/velocipede_s_001201.png\n", + "upload: test/velocipede_s_001379.png to s3://udacity-ml-workflow/test/velocipede_s_001379.png\n", + "upload: test/velocipede_s_001466.png to s3://udacity-ml-workflow/test/velocipede_s_001466.png\n", + "upload: test/velocipede_s_001232.png to s3://udacity-ml-workflow/test/velocipede_s_001232.png\n", + "upload: test/velocipede_s_001633.png to s3://udacity-ml-workflow/test/velocipede_s_001633.png\n", + "upload: test/velocipede_s_001699.png to s3://udacity-ml-workflow/test/velocipede_s_001699.png\n", + "upload: test/velocipede_s_001744.png to s3://udacity-ml-workflow/test/velocipede_s_001744.png\n", + "upload: test/velocipede_s_001790.png to s3://udacity-ml-workflow/test/velocipede_s_001790.png\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "os.environ[\"DEFAULT_S3_BUCKET\"] = bucket\n", + "!aws s3 sync ./train s3://${DEFAULT_S3_BUCKET}/train/\n", + "!aws s3 sync ./test s3://${DEFAULT_S3_BUCKET}/test/" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And that's it! You can check the bucket and verify that the items were uploaded.\n", + "\n", + "## Model Training\n", + "\n", + "For Image Classification, Sagemaker [also expects metadata](https://docs.aws.amazon.com/sagemaker/latest/dg/image-classification.html) e.g. in the form of TSV files with labels and filepaths. We can generate these using our Pandas DataFrames from earlier:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def to_metadata_file(df, prefix):\n", + " df[\"s3_path\"] = df[\"filenames\"]\n", + " df[\"labels\"] = df[\"labels\"].apply(lambda x: 0 if x==8 else 1)\n", + " return df[[\"row\", \"labels\", \"s3_path\"]].to_csv(\n", + " f\"{prefix}.lst\", sep=\"\\t\", index=False, header=False\n", + " )\n", + " \n", + "to_metadata_file(df_train.copy(), \"train\")\n", + "to_metadata_file(df_test.copy(), \"test\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also upload our manifest files:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import boto3\n", + "bucket = \"udacity-ml-workflow\"\n", + "# Upload files\n", + "boto3.Session().resource('s3').Bucket(\n", + " bucket).Object('train.lst').upload_file('./train.lst')\n", + "boto3.Session().resource('s3').Bucket(\n", + " bucket).Object('test.lst').upload_file('./test.lst')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the `bucket` and `region` info we can get the latest prebuilt container to run our training job, and define an output location on our s3 bucket for the model. Use the `image_uris` function from the SageMaker SDK to retrieve the latest `image-classification` image below:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Use the image_uris function to retrieve the latest 'image-classification' image \n", + "algo_image = sagemaker.image_uris.retrieve('image-classification', region=region)\n", + "s3_output_location = f\"s3://{bucket}/models/image_model\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We're ready to create an estimator! Create an estimator `img_classifier_model` that uses one instance of `ml.p3.2xlarge`. Ensure that y ou use the output location we defined above - we'll be referring to that later!" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "img_classifier_model=sagemaker.estimator.Estimator(\n", + " ## TODO: define your estimator options \n", + " role=role,\n", + " instance_count = 1,\n", + " instance_type= 'ml.p3.2xlarge',\n", + " volume_size=5,\n", + " output_path=s3_output_location,\n", + " sagemaker_session=sagemaker.Session(),\n", + " image_uri = algo_image\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1000" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'811284229777.dkr.ecr.us-east-1.amazonaws.com/image-classification:1'" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "algo_image" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also set a few key hyperparameters and define the inputs for our model:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "img_classifier_model.set_hyperparameters(\n", + " image_shape= \"3,32,32\", # TODO: Fill in\n", + " num_classes=2, # TODO: Fill in\n", + " num_training_samples=1000 # TODO: fill in\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `image-classification` image uses four input channels with very specific input parameters. For convenience, we've provided them below:" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sagemaker.debugger import Rule, rule_configs\n", + "from sagemaker.session import TrainingInput\n", + "model_inputs = {\n", + " \"train\": sagemaker.inputs.TrainingInput(\n", + " s3_data=f\"s3://{bucket}/train/\",\n", + " content_type=\"application/x-image\"\n", + " ),\n", + " \"validation\": sagemaker.inputs.TrainingInput(\n", + " s3_data=f\"s3://{bucket}/test/\",\n", + " content_type=\"application/x-image\"\n", + " ),\n", + " \"train_lst\": sagemaker.inputs.TrainingInput(\n", + " s3_data=f\"s3://{bucket}/train.lst\",\n", + " content_type=\"application/x-image\"\n", + " ),\n", + " \"validation_lst\": sagemaker.inputs.TrainingInput(\n", + " s3_data=f\"s3://{bucket}/test.lst\",\n", + " content_type=\"application/x-image\"\n", + " )\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Great, now we can train the model using the model_inputs. In the cell below, call the `fit` method on our model,:" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-02-14 18:29:48 Starting - Starting the training job...ProfilerReport-1676399388: InProgress\n", + ".........\n", + "2023-02-14 18:31:41 Starting - Preparing the instances for training......\n", + "2023-02-14 18:32:41 Downloading - Downloading input data...\n", + "2023-02-14 18:33:02 Training - Downloading the training image............\n", + "2023-02-14 18:35:02 Training - Training image download completed. Training in progress...\u001b[34mDocker entrypoint called with argument(s): train\u001b[0m\n", + "\u001b[34mRunning default environment configuration script\u001b[0m\n", + "\u001b[34mNvidia gpu devices, drivers and cuda toolkit versions (only available on hosts with GPU):\u001b[0m\n", + "\u001b[34mTue Feb 14 18:35:26 2023 \u001b[0m\n", + "\u001b[34m+-----------------------------------------------------------------------------+\u001b[0m\n", + "\u001b[34m| NVIDIA-SMI 515.65.07 Driver Version: 515.65.07 CUDA Version: 11.7 |\u001b[0m\n", + "\u001b[34m|-------------------------------+----------------------+----------------------+\u001b[0m\n", + "\u001b[34m| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\u001b[0m\n", + "\u001b[34m| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\u001b[0m\n", + "\u001b[34m| | | MIG M. |\u001b[0m\n", + "\u001b[34m|===============================+======================+======================|\u001b[0m\n", + "\u001b[34m| 0 Tesla V100-SXM2... On | 00000000:00:1E.0 Off | 0 |\u001b[0m\n", + "\u001b[34m| N/A 27C P0 23W / 300W | 0MiB / 16384MiB | 0% Default |\u001b[0m\n", + "\u001b[34m| | | N/A |\u001b[0m\n", + "\u001b[34m+-------------------------------+----------------------+----------------------+\n", + " \u001b[0m\n", + "\u001b[34m+-----------------------------------------------------------------------------+\u001b[0m\n", + "\u001b[34m| Processes: |\u001b[0m\n", + "\u001b[34m| GPU GI CI PID Type Process name GPU Memory |\u001b[0m\n", + "\u001b[34m| ID ID Usage |\u001b[0m\n", + "\u001b[34m|=============================================================================|\u001b[0m\n", + "\u001b[34m| No running processes found |\u001b[0m\n", + "\u001b[34m+-----------------------------------------------------------------------------+\u001b[0m\n", + "\u001b[34mChecking for nvidia driver and cuda compatibility.\u001b[0m\n", + "\u001b[34mCUDA Compatibility driver provided.\u001b[0m\n", + "\u001b[34mProceeding with compatibility check between driver, cuda-toolkit and cuda-compat.\u001b[0m\n", + "\u001b[34mDetected cuda-toolkit version: 11.1.\u001b[0m\n", + "\u001b[34mDetected cuda-compat version: 455.32.00.\u001b[0m\n", + "\u001b[34mDetected Nvidia driver version: 515.65.07.\u001b[0m\n", + "\u001b[34mNvidia driver compatible with cuda-toolkit. Disabling cuda-compat.\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] Reading default configuration from /opt/amazon/lib/python3.7/site-packages/image_classification/default-input.json: {'use_pretrained_model': 0, 'num_layers': 152, 'epochs': 30, 'learning_rate': 0.1, 'lr_scheduler_factor': 0.1, 'optimizer': 'sgd', 'momentum': 0, 'weight_decay': 0.0001, 'beta_1': 0.9, 'beta_2': 0.999, 'eps': 1e-08, 'gamma': 0.9, 'mini_batch_size': 32, 'image_shape': '3,224,224', 'precision_dtype': 'float32'}\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] Merging with provided configuration from /opt/ml/input/config/hyperparameters.json: {'image_shape': '3,32,32', 'num_classes': '2', 'num_training_samples': '1000'}\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] Final configuration: {'use_pretrained_model': 0, 'num_layers': 152, 'epochs': 30, 'learning_rate': 0.1, 'lr_scheduler_factor': 0.1, 'optimizer': 'sgd', 'momentum': 0, 'weight_decay': 0.0001, 'beta_1': 0.9, 'beta_2': 0.999, 'eps': 1e-08, 'gamma': 0.9, 'mini_batch_size': 32, 'image_shape': '3,32,32', 'precision_dtype': 'float32', 'num_classes': '2', 'num_training_samples': '1000'}\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] Searching for .lst files in /opt/ml/input/data/train_lst.\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] Creating record files for train.lst\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] Done creating record files...\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] Searching for .lst files in /opt/ml/input/data/validation_lst.\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] Creating record files for test.lst\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] Done creating record files...\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] use_pretrained_model: 0\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] multi_label: 0\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] Performing random weight initialization\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] ---- Parameters ----\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] num_layers: 152\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] data type: \u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] epochs: 30\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] optimizer: sgd\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] momentum: 0.9\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] weight_decay: 0.0001\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] learning_rate: 0.1\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] num_training_samples: 1000\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] mini_batch_size: 32\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] image_shape: 3,32,32\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] num_classes: 2\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] augmentation_type: None\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] kv_store: device\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] checkpoint_frequency not set, will store the best model\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] --------------------\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:30 INFO 140459943757632] Setting number of threads: 7\u001b[0m\n", + "\u001b[34m[18:35:34] /opt/brazil-pkg-cache/packages/AIAlgorithmsMXNet/AIAlgorithmsMXNet-1.4.x_ecl_Cuda_11.1.x.38.0/AL2_x86_64/generic-flavor/src/src/operator/nn/./cudnn/./cudnn_algoreg-inl.h:97: Running performance tests to find the best convolution algorithm, this can take a while... (setting env variable MXNET_CUDNN_AUTOTUNE_DEFAULT to 0 to disable)\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:39 INFO 140459943757632] Epoch[0] Batch [20]#011Speed: 121.912 samples/sec#011accuracy=0.563988\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:41 INFO 140459943757632] Epoch[0] Train-accuracy=0.603831\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:41 INFO 140459943757632] Epoch[0] Time cost=6.905\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:42 INFO 140459943757632] Epoch[0] Validation-accuracy=0.505208\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:42 INFO 140459943757632] Storing the best model with validation accuracy: 0.505208\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:42 INFO 140459943757632] Saved checkpoint to \"/opt/ml/model/image-classification-0001.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:46 INFO 140459943757632] Epoch[1] Batch [20]#011Speed: 184.152 samples/sec#011accuracy=0.714286\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:47 INFO 140459943757632] Epoch[1] Train-accuracy=0.692540\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:47 INFO 140459943757632] Epoch[1] Time cost=5.117\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:48 INFO 140459943757632] Epoch[1] Validation-accuracy=0.505208\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:52 INFO 140459943757632] Epoch[2] Batch [20]#011Speed: 188.485 samples/sec#011accuracy=0.611607\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:53 INFO 140459943757632] Epoch[2] Train-accuracy=0.622984\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:53 INFO 140459943757632] Epoch[2] Time cost=5.041\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:54 INFO 140459943757632] Epoch[2] Validation-accuracy=0.484375\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:58 INFO 140459943757632] Epoch[3] Batch [20]#011Speed: 189.895 samples/sec#011accuracy=0.706845\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:59 INFO 140459943757632] Epoch[3] Train-accuracy=0.743952\u001b[0m\n", + "\u001b[34m[02/14/2023 18:35:59 INFO 140459943757632] Epoch[3] Time cost=5.016\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:00 INFO 140459943757632] Epoch[3] Validation-accuracy=0.455357\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:04 INFO 140459943757632] Epoch[4] Batch [20]#011Speed: 184.522 samples/sec#011accuracy=0.763393\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:06 INFO 140459943757632] Epoch[4] Train-accuracy=0.766129\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:06 INFO 140459943757632] Epoch[4] Time cost=5.119\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:06 INFO 140459943757632] Epoch[4] Validation-accuracy=0.479167\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:10 INFO 140459943757632] Epoch[5] Batch [20]#011Speed: 187.139 samples/sec#011accuracy=0.796131\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:12 INFO 140459943757632] Epoch[5] Train-accuracy=0.789315\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:12 INFO 140459943757632] Epoch[5] Time cost=5.126\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:12 INFO 140459943757632] Epoch[5] Validation-accuracy=0.520833\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:13 INFO 140459943757632] Storing the best model with validation accuracy: 0.520833\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:13 INFO 140459943757632] Saved checkpoint to \"/opt/ml/model/image-classification-0006.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:17 INFO 140459943757632] Epoch[6] Batch [20]#011Speed: 180.927 samples/sec#011accuracy=0.834821\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:18 INFO 140459943757632] Epoch[6] Train-accuracy=0.815524\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:18 INFO 140459943757632] Epoch[6] Time cost=5.213\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:19 INFO 140459943757632] Epoch[6] Validation-accuracy=0.552083\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:19 INFO 140459943757632] Storing the best model with validation accuracy: 0.552083\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:19 INFO 140459943757632] Saved checkpoint to \"/opt/ml/model/image-classification-0007.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:23 INFO 140459943757632] Epoch[7] Batch [20]#011Speed: 189.254 samples/sec#011accuracy=0.802083\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:24 INFO 140459943757632] Epoch[7] Train-accuracy=0.790323\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:24 INFO 140459943757632] Epoch[7] Time cost=5.030\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:25 INFO 140459943757632] Epoch[7] Validation-accuracy=0.495536\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:29 INFO 140459943757632] Epoch[8] Batch [20]#011Speed: 188.164 samples/sec#011accuracy=0.802083\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:31 INFO 140459943757632] Epoch[8] Train-accuracy=0.811492\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:31 INFO 140459943757632] Epoch[8] Time cost=5.057\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:31 INFO 140459943757632] Epoch[8] Validation-accuracy=0.526042\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:35 INFO 140459943757632] Epoch[9] Batch [20]#011Speed: 189.283 samples/sec#011accuracy=0.825893\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:37 INFO 140459943757632] Epoch[9] Train-accuracy=0.823589\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:37 INFO 140459943757632] Epoch[9] Time cost=5.053\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:37 INFO 140459943757632] Epoch[9] Validation-accuracy=0.557292\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:37 INFO 140459943757632] Storing the best model with validation accuracy: 0.557292\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:38 INFO 140459943757632] Saved checkpoint to \"/opt/ml/model/image-classification-0010.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:41 INFO 140459943757632] Epoch[10] Batch [20]#011Speed: 189.521 samples/sec#011accuracy=0.830357\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:43 INFO 140459943757632] Epoch[10] Train-accuracy=0.833669\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:43 INFO 140459943757632] Epoch[10] Time cost=5.055\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:43 INFO 140459943757632] Epoch[10] Validation-accuracy=0.520833\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:47 INFO 140459943757632] Epoch[11] Batch [20]#011Speed: 190.274 samples/sec#011accuracy=0.857143\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:49 INFO 140459943757632] Epoch[11] Train-accuracy=0.856855\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:49 INFO 140459943757632] Epoch[11] Time cost=5.044\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:49 INFO 140459943757632] Epoch[11] Validation-accuracy=0.558036\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:50 INFO 140459943757632] Storing the best model with validation accuracy: 0.558036\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:50 INFO 140459943757632] Saved checkpoint to \"/opt/ml/model/image-classification-0012.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:54 INFO 140459943757632] Epoch[12] Batch [20]#011Speed: 188.753 samples/sec#011accuracy=0.863095\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:55 INFO 140459943757632] Epoch[12] Train-accuracy=0.865927\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:55 INFO 140459943757632] Epoch[12] Time cost=5.053\u001b[0m\n", + "\u001b[34m[02/14/2023 18:36:56 INFO 140459943757632] Epoch[12] Validation-accuracy=0.536458\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:00 INFO 140459943757632] Epoch[13] Batch [20]#011Speed: 190.099 samples/sec#011accuracy=0.861607\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:01 INFO 140459943757632] Epoch[13] Train-accuracy=0.864919\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:01 INFO 140459943757632] Epoch[13] Time cost=5.036\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:02 INFO 140459943757632] Epoch[13] Validation-accuracy=0.484375\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:06 INFO 140459943757632] Epoch[14] Batch [20]#011Speed: 187.577 samples/sec#011accuracy=0.888393\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:07 INFO 140459943757632] Epoch[14] Train-accuracy=0.886089\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:07 INFO 140459943757632] Epoch[14] Time cost=5.071\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:08 INFO 140459943757632] Epoch[14] Validation-accuracy=0.500000\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:12 INFO 140459943757632] Epoch[15] Batch [20]#011Speed: 188.221 samples/sec#011accuracy=0.898810\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:13 INFO 140459943757632] Epoch[15] Train-accuracy=0.881048\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:13 INFO 140459943757632] Epoch[15] Time cost=5.042\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:14 INFO 140459943757632] Epoch[15] Validation-accuracy=0.526786\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:18 INFO 140459943757632] Epoch[16] Batch [20]#011Speed: 188.528 samples/sec#011accuracy=0.895833\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:19 INFO 140459943757632] Epoch[16] Train-accuracy=0.885081\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:19 INFO 140459943757632] Epoch[16] Time cost=5.039\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:20 INFO 140459943757632] Epoch[16] Validation-accuracy=0.557292\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:24 INFO 140459943757632] Epoch[17] Batch [20]#011Speed: 190.900 samples/sec#011accuracy=0.910714\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:25 INFO 140459943757632] Epoch[17] Train-accuracy=0.911290\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:25 INFO 140459943757632] Epoch[17] Time cost=5.004\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:26 INFO 140459943757632] Epoch[17] Validation-accuracy=0.536458\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:30 INFO 140459943757632] Epoch[18] Batch [20]#011Speed: 190.156 samples/sec#011accuracy=0.907738\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:31 INFO 140459943757632] Epoch[18] Train-accuracy=0.905242\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:31 INFO 140459943757632] Epoch[18] Time cost=5.033\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:32 INFO 140459943757632] Epoch[18] Validation-accuracy=0.510417\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:36 INFO 140459943757632] Epoch[19] Batch [20]#011Speed: 190.010 samples/sec#011accuracy=0.913690\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:37 INFO 140459943757632] Epoch[19] Train-accuracy=0.910282\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:37 INFO 140459943757632] Epoch[19] Time cost=5.013\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:38 INFO 140459943757632] Epoch[19] Validation-accuracy=0.500000\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:42 INFO 140459943757632] Epoch[20] Batch [20]#011Speed: 189.218 samples/sec#011accuracy=0.938988\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:44 INFO 140459943757632] Epoch[20] Train-accuracy=0.938508\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:44 INFO 140459943757632] Epoch[20] Time cost=5.055\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:44 INFO 140459943757632] Epoch[20] Validation-accuracy=0.494792\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:48 INFO 140459943757632] Epoch[21] Batch [20]#011Speed: 190.363 samples/sec#011accuracy=0.946429\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:49 INFO 140459943757632] Epoch[21] Train-accuracy=0.948589\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:49 INFO 140459943757632] Epoch[21] Time cost=5.010\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:50 INFO 140459943757632] Epoch[21] Validation-accuracy=0.510417\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:54 INFO 140459943757632] Epoch[22] Batch [20]#011Speed: 189.505 samples/sec#011accuracy=0.965774\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:55 INFO 140459943757632] Epoch[22] Train-accuracy=0.952621\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:55 INFO 140459943757632] Epoch[22] Time cost=5.025\u001b[0m\n", + "\u001b[34m[02/14/2023 18:37:56 INFO 140459943757632] Epoch[22] Validation-accuracy=0.505208\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:00 INFO 140459943757632] Epoch[23] Batch [20]#011Speed: 189.901 samples/sec#011accuracy=0.971726\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:01 INFO 140459943757632] Epoch[23] Train-accuracy=0.958669\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:01 INFO 140459943757632] Epoch[23] Time cost=5.032\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:02 INFO 140459943757632] Epoch[23] Validation-accuracy=0.526786\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:06 INFO 140459943757632] Epoch[24] Batch [20]#011Speed: 187.076 samples/sec#011accuracy=0.944940\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:08 INFO 140459943757632] Epoch[24] Train-accuracy=0.947581\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:08 INFO 140459943757632] Epoch[24] Time cost=5.068\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:08 INFO 140459943757632] Epoch[24] Validation-accuracy=0.526042\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:12 INFO 140459943757632] Epoch[25] Batch [20]#011Speed: 190.792 samples/sec#011accuracy=0.962798\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:14 INFO 140459943757632] Epoch[25] Train-accuracy=0.960685\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:14 INFO 140459943757632] Epoch[25] Time cost=5.010\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:14 INFO 140459943757632] Epoch[25] Validation-accuracy=0.567708\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:14 INFO 140459943757632] Storing the best model with validation accuracy: 0.567708\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:15 INFO 140459943757632] Saved checkpoint to \"/opt/ml/model/image-classification-0026.params\"\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:18 INFO 140459943757632] Epoch[26] Batch [20]#011Speed: 190.751 samples/sec#011accuracy=0.941964\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:20 INFO 140459943757632] Epoch[26] Train-accuracy=0.951613\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:20 INFO 140459943757632] Epoch[26] Time cost=4.996\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:20 INFO 140459943757632] Epoch[26] Validation-accuracy=0.473958\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:24 INFO 140459943757632] Epoch[27] Batch [20]#011Speed: 190.929 samples/sec#011accuracy=0.974702\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:26 INFO 140459943757632] Epoch[27] Train-accuracy=0.975806\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:26 INFO 140459943757632] Epoch[27] Time cost=5.016\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:26 INFO 140459943757632] Epoch[27] Validation-accuracy=0.513393\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:30 INFO 140459943757632] Epoch[28] Batch [20]#011Speed: 188.817 samples/sec#011accuracy=0.970238\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:32 INFO 140459943757632] Epoch[28] Train-accuracy=0.970766\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:32 INFO 140459943757632] Epoch[28] Time cost=5.051\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:32 INFO 140459943757632] Epoch[28] Validation-accuracy=0.515625\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:36 INFO 140459943757632] Epoch[29] Batch [20]#011Speed: 188.920 samples/sec#011accuracy=0.986607\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:38 INFO 140459943757632] Epoch[29] Train-accuracy=0.982863\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:38 INFO 140459943757632] Epoch[29] Time cost=5.026\u001b[0m\n", + "\u001b[34m[02/14/2023 18:38:39 INFO 140459943757632] Epoch[29] Validation-accuracy=0.552083\u001b[0m\n", + "\n", + "2023-02-14 18:39:03 Uploading - Uploading generated training model\n", + "2023-02-14 18:39:26 Completed - Training job completed\n", + "Training seconds: 408\n", + "Billable seconds: 408\n" + ] + } + ], + "source": [ + "## TODO: train your model\n", + "img_classifier_model.fit(model_inputs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If all goes well, you'll end up with a model topping out above `.8` validation accuracy. With only 1000 training samples in the CIFAR dataset, that's pretty good. We could definitely pursue data augmentation & gathering more samples to help us improve further, but for now let's proceed to deploy our model.\n", + "\n", + "### Getting ready to deploy\n", + "\n", + "To begin with, let's configure Model Monitor to track our deployment. We'll define a `DataCaptureConfig` below:" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sagemaker.model_monitor import DataCaptureConfig\n", + "\n", + "data_capture_config = DataCaptureConfig(\n", + " ## TODO: Set config options\n", + " enable_capture=True,\n", + " sampling_percentage=100,\n", + " destination_s3_uri=f\"s3://{bucket}/data_capture\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note the `destination_s3_uri` parameter: At the end of the project, we can explore the `data_capture` directory in S3 to find crucial data about the inputs and outputs Model Monitor has observed on our model endpoint over time.\n", + "\n", + "With that done, deploy your model on a single `ml.m5.xlarge` instance with the data capture config attached:" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-------!image-classification-2023-02-14-13-25-18-287\n" + ] + } + ], + "source": [ + "deployment = img_classifier_model.deploy(\n", + " ## TODO: fill in deployment options\n", + " data_capture_config=data_capture_config,\n", + " initial_instance_count=1, \n", + " instance_type='ml.m5.xlarge',\n", + " \n", + " )\n", + "\n", + "endpoint = deployment.endpoint_name\n", + "print(endpoint)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note the endpoint name for later as well.\n", + "\n", + "Next, instantiate a Predictor:" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sagemaker.predictor import Predictor\n", + "predictor = Predictor('image-classification-2023-02-14-13-25-18-287') ## TODO: fill in" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the code snippet below we are going to prepare one of your saved images for prediction. Use the predictor to process the `payload`." + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sagemaker.serializers import IdentitySerializer\n", + "import base64\n", + "import json\n", + "predictor.serializer = IdentitySerializer(\"image/png\")\n", + "with open(\"./test/bicycle_s_001789.png\", \"rb\") as f:\n", + " payload = f.read()\n", + "\n", + " \n", + "inference = predictor.predict(payload)## TODO: Process the payload with your predictor" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your `inference` object is an array of two values, the predicted probability value for each of your classes (bicycle and motorcycle respectively.) So, for example, a value of `b'[0.91, 0.09]'` indicates the probability of being a bike is 91% and being a motorcycle is 9%." + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b'[0.9987309575080872, 0.001269030850380659]'\n" + ] + } + ], + "source": [ + "print(inference)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "### Draft Lambdas and Step Function Workflow\n", + "\n", + "Your operations team uses Step Functions to orchestrate serverless workflows. One of the nice things about Step Functions is that [workflows can call other workflows](https://docs.aws.amazon.com/step-functions/latest/dg/connect-stepfunctions.html), so the team can easily plug your workflow into the broader production architecture for Scones Unlimited.\n", + "\n", + "In this next stage you're going to write and deploy three Lambda functions, and then use the Step Functions visual editor to chain them together! Our functions are going to work with a simple data object:\n", + "\n", + "```python\n", + "{\n", + " \"inferences\": [], # Output of predictor.predict\n", + " \"s3_key\": \"\", # Source data S3 key\n", + " \"s3_bucket\": \"\", # Source data S3 bucket\n", + " \"image_data\": \"\" # base64 encoded string containing the image data\n", + "}\n", + "```\n", + "\n", + "A good test object that you can use for Lambda tests and Step Function executions, throughout the next section, might look like this:\n", + "\n", + "```python\n", + "{\n", + " \"image_data\": \"\",\n", + " \"s3_bucket\": MY_BUCKET_NAME, # Fill in with your bucket\n", + " \"s3_key\": \"test/bicycle_s_000513.png\"\n", + "}\n", + "```\n", + "\n", + "Using these fields, your functions can read and write the necessary data to execute your workflow. Let's start with the first function. Your first Lambda function will copy an object from S3, base64 encode it, and then return it to the step function as `image_data` in an event.\n", + "\n", + "Go to the Lambda dashboard and create a new Lambda function with a descriptive name like \"serializeImageData\" and select thr 'Python 3.8' runtime. Add the same permissions as the SageMaker role you created earlier. (Reminder: you do this in the Configuration tab under \"Permissions\"). Once you're ready, use the starter code below to craft your Lambda handler:\n", + "\n", + "```python\n", + "import json\n", + "import boto3\n", + "import base64\n", + "\n", + "s3 = boto3.client('s3')\n", + "\n", + "def lambda_handler(event, context):\n", + " \"\"\"A function to serialize target data from S3\"\"\"\n", + " \n", + " # Get the s3 address from the Step Function event input\n", + " key = ## TODO: fill in\n", + " bucket = ## TODO: fill in\n", + " \n", + " # Download the data from s3 to /tmp/image.png\n", + " ## TODO: fill in\n", + " \n", + " # We read the data from a file\n", + " with open(\"/tmp/image.png\", \"rb\") as f:\n", + " image_data = base64.b64encode(f.read())\n", + "\n", + " # Pass the data back to the Step Function\n", + " print(\"Event:\", event.keys())\n", + " return {\n", + " 'statusCode': 200,\n", + " 'body': {\n", + " \"image_data\": image_data,\n", + " \"s3_bucket\": bucket,\n", + " \"s3_key\": key,\n", + " \"inferences\": []\n", + " }\n", + " }\n", + "```\n", + "\n", + "The next function is responsible for the classification part - we're going to take the image output from the previous function, decode it, and then pass inferences back to the the Step Function.\n", + "\n", + "Because this Lambda will have runtime dependencies (i.e. the SageMaker SDK) you'll need to package them in your function. *Key reading:* https://docs.aws.amazon.com/lambda/latest/dg/python-package-create.html#python-package-create-with-dependency\n", + "\n", + "Create a new Lambda function with the same rights and a descriptive name, then fill in the starter code below for your classifier Lambda.\n", + "\n", + "```python\n", + "import json\n", + "import sagemaker\n", + "import base64\n", + "from sagemaker.serializers import IdentitySerializer\n", + "\n", + "# Fill this in with the name of your deployed model\n", + "ENDPOINT = ## TODO: fill in\n", + "\n", + "def lambda_handler(event, context):\n", + "\n", + " # Decode the image data\n", + " image = base64.b64decode(## TODO: fill in)\n", + "\n", + " # Instantiate a Predictor\n", + " predictor = ## TODO: fill in\n", + "\n", + " # For this model the IdentitySerializer needs to be \"image/png\"\n", + " predictor.serializer = IdentitySerializer(\"image/png\")\n", + " \n", + " # Make a prediction:\n", + " inferences = ## TODO: fill in\n", + " \n", + " # We return the data back to the Step Function \n", + " event[\"inferences\"] = inferences.decode('utf-8')\n", + " return {\n", + " 'statusCode': 200,\n", + " 'body': json.dumps(event)\n", + " }\n", + "```\n", + "\n", + "Finally, we need to filter low-confidence inferences. Define a threshold between 1.00 and 0.000 for your model: what is reasonble for you? If the model predicts at `.70` for it's highest confidence label, do we want to pass that inference along to downstream systems? Make one last Lambda function and tee up the same permissions:\n", + "\n", + "```python\n", + "import json\n", + "\n", + "\n", + "THRESHOLD = .93\n", + "\n", + "\n", + "def lambda_handler(event, context):\n", + " \n", + " # Grab the inferences from the event\n", + " inferences = ## TODO: fill in\n", + " \n", + " # Check if any values in our inferences are above THRESHOLD\n", + " meets_threshold = ## TODO: fill in\n", + " \n", + " # If our threshold is met, pass our data back out of the\n", + " # Step Function, else, end the Step Function with an error\n", + " if meets_threshold:\n", + " pass\n", + " else:\n", + " raise(\"THRESHOLD_CONFIDENCE_NOT_MET\")\n", + "\n", + " return {\n", + " 'statusCode': 200,\n", + " 'body': json.dumps(event)\n", + " }\n", + "```\n", + "Once you have tested the lambda functions, save the code for each lambda function in a python script called 'lambda.py'.\n", + "\n", + "With your lambdas in place, you can use the Step Functions visual editor to construct a workflow that chains them together. In the Step Functions console you'll have the option to author a Standard step function *Visually*.\n", + "\n", + "When the visual editor opens, you'll have many options to add transitions in your workflow. We're going to keep it simple and have just one: to inbc83d5eb0be10e316708b03ecf7fcc5fvoke Lambda functions. Add three of them chained together. For each one, you'll be able to select the Lambda functions you just created in the proper order, filter inputs and outputs, and give them descriptive names.\n", + "\n", + "Make sure that you:\n", + "\n", + "1. Are properly filtering the inputs and outputs of your invokations (e.g. `$.body`)\n", + "2. Take care to remove the error handling from the last function - it's supposed to \"fail loudly\" for your operations colleagues!\n", + "\n", + "Take a screenshot of your working step function in action and export the step function as JSON for your submission package." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Great! Now you can use the files in `./test` as test files for our workflow. Depending on our threshold, our workflow should reliably pass predictions about images from `./test` on to downstream systems, while erroring out for inferences below our confidence threshold!\n", + "\n", + "### Testing and Evaluation\n", + "\n", + "Do several step function invokations using data from the `./test` folder. This process should give you confidence that the workflow both *succeeds* AND *fails* as expected. In addition, SageMaker Model Monitor will generate recordings of your data and inferences which we can visualize.\n", + "\n", + "Here's a function that can help you generate test inputs for your invokations:" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'{\"image_data\": \"\", \"s3_bucket\": \"udacity-ml-workflow\", \"s3_key\": \"test/ordinary_bicycle_s_000431.png\"}'" + ] + }, + "execution_count": 132, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import random\n", + "import boto3\n", + "import json\n", + "\n", + "\n", + "def generate_test_case():\n", + " # Setup s3 in boto3\n", + " s3 = boto3.resource('s3')\n", + " \n", + " # Randomly pick from sfn or test folders in our bucket\n", + " objects = s3.Bucket(bucket).objects.filter(Prefix=\"test\")\n", + " \n", + " # Grab any random object key from that folder!\n", + " obj = random.choice([x.key for x in objects])\n", + " \n", + " return json.dumps({\n", + " \"image_data\": \"\",\n", + " \"s3_bucket\": bucket,\n", + " \"s3_key\": obj\n", + " })\n", + "generate_test_case()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the Step Function dashboard for your new function, you can create new executions and copy in the generated test cases. Do several executions so that you can generate data you can evaluate and visualize.\n", + "\n", + "Once you've done several executions, let's visualize the record of our inferences. Pull in the JSONLines data from your inferences like so:" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sagemaker.s3 import S3Downloader\n", + "\n", + "# In S3 your data will be saved to a datetime-aware path\n", + "# Find a path related to a datetime you're interested in\n", + "data_path = \"s3://udacity-ml-workflow/data_capture/image-classification-2023-02-14-13-25-18-287/AllTraffic/2023/02/14/13/42-58-655-83d904b7-a5b0-4a0f-93d7-60d194497d27.jsonl\"## TODO: fill in the path to your captured data\n", + "\n", + "S3Downloader.download(data_path, \"captured_data\")\n", + "\n", + "# Feel free to repeat this multiple times and pull in more data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The data are in JSONLines format, where multiple valid JSON objects are stacked on top of eachother in a single `jsonl` file. We'll import an open-source library, `jsonlines` that was purpose built for parsing this format." + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Keyring is skipped due to an exception: 'keyring.backends'\n", + "Requirement already satisfied: jsonlines in /opt/conda/lib/python3.7/site-packages (3.1.0)\n", + "Requirement already satisfied: typing-extensions in /opt/conda/lib/python3.7/site-packages (from jsonlines) (4.4.0)\n", + "Requirement already satisfied: attrs>=19.2.0 in /opt/conda/lib/python3.7/site-packages (from jsonlines) (22.1.0)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip available: \u001b[0m\u001b[31;49m22.3.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.0\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install jsonlines\n", + "import jsonlines" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can extract the data from each of the source files:" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "# List the file names we downloaded\n", + "file_handles = os.listdir(\"./captured_data\")\n", + "\n", + "# Dump all the data into an array\n", + "json_data = []\n", + "for jsonl in file_handles:\n", + " with jsonlines.open(f\"./captured_data/{jsonl}\") as f:\n", + " json_data.append(f.read())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The data should now be a list of dictionaries, with significant nesting. We'll give you an example of some code that grabs data out of the objects and visualizes it:" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "([0.9987309575080872, 0.001269030850380659], '2023-02-14T13:42:58Z')" + ] + }, + "execution_count": 138, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Define how we'll get our data\n", + "def simple_getter(obj):\n", + " inferences = obj[\"captureData\"][\"endpointOutput\"][\"data\"]\n", + " timestamp = obj[\"eventMetadata\"][\"inferenceTime\"]\n", + " return json.loads(inferences), timestamp\n", + "\n", + "simple_getter(json_data[0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, here's an example of a visualization you can build with this data. In this last part, you will take some time and build your own - the captured data has the input images, the resulting inferences, and the timestamps." + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'captureData': {'endpointInput': {'observedContentType': 'image/png',\n", + " 'mode': 'INPUT',\n", + " 'data': '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',\n", + " 'encoding': 'BASE64'},\n", + " 'endpointOutput': {'observedContentType': 'application/json',\n", + " 'mode': 'OUTPUT',\n", + " 'data': '[0.9987309575080872, 0.001269030850380659]',\n", + " 'encoding': 'JSON'}},\n", + " 'eventMetadata': {'eventId': '57ba9915-6477-481e-886e-f2e8baf84035',\n", + " 'inferenceTime': '2023-02-14T13:42:58Z'},\n", + " 'eventVersion': '0'}" + ] + }, + "execution_count": 147, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "obj" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdQAAAH/CAYAAADuTCyZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdd1wT5x8H8E9IWIGwt4DKUBRxKyLiFtxa666ztWprf7VWrbbWvVptra2jjrZu66x17zoQBFScuAUVcaPsndzvDyQSEyDEtKh83q+Xr/aee57nvpe73Df33EAkz4gXQERERK/FoKwDICIiehcwoRIREekBEyoREZEeMKESERHpARMqERGRHjChEhER6QETKhERkR4woRIREekBEyoREZEeMKGSVjx8AuDhE1DWYbzRBg8dBbHUDbfvxJd1KFSE+QuWw7dOC5jZeEEsdcPKNZvKOiR6hzChlkNHjoWjd/9PUNG7IUytPGFXoQaatuqG+QuWIysrq6zDKxdu34mHWOqm8s/YojLcPOujV79PcPrM+bIOUe9ahvSAWOpW6nYePgGQWnu99vLXb9yG0eOmQWpqii8+G4JJ34xC7Zq+r90vUQFJWQdA/528vDx89sW3WP7HOpiZSdE2uAW8PCshOTkFBw8fx+hx07D0t7XY+ddKeHlWLutwywVPj4r4oHc3AEB6Rgaiz17Elr92YfvO/Tiwez2aNmlUxhG+O/buPwIA2PnXSjg5OZRxNPQuYkItR76Z9B2W/7EODerVwtYNy1GhgrNynlwux/RZ8zF99nx06DoAp8L2wMJCVobRlg+eHpUw+dsvVcq+/2ERvpn0HSZP+wFHDmwpo8jePQ8ePAIAJlP613DIt5y4cTMOP/2yHDY2Vti+ZYVKMgUAsViMKRNHo0+vrrh56zZ+nL9UYz/Pnydh6KdfwblSHZjZeKFRUEfs2HVArV5WVhbm/bwUdfyDYe1UHRb2VeHtG4i+A0fg4qUravW379yPNu17w9alBqTWXqhZvxV+nL8Ecrlcpd7KNZuU17527z2MZq27wdLBBx4+ATh+IgJiqRuGDB+jMfZ79x7A0Lwi2rTvrVKempqGKdN/hF+9VjCz8YKNsy/ade6HE+FRGvuJuXwNnboNgqWDD6ydqqND1wG4FHNVY11dfDgwP74zZy9qnF/aeFNT0zB91nzUbtgGMrsqsHaqjnqN2mLS1LnIzc1VqRt3+y4+/mQsKlXxh6mVJypUrofBQ0fhzt17av2KpW5oGdIDT54k4qNho+FUsTbMbLzQuFlnHD1+Uq3usdAI5f8X/Bs8dFSpPx9AdT84fOQEmrbqBpldFdi7+mHQx6OQmPhcre6RY+Eqy3/1noDjJyLQ+f3BcHCrCVMrT1T1C8LEKXOQkZGpUu/o8ZMQS90wdcY8nIw8g7adP4CNs6/acPaFi1fQZ8CnqFC5HkwsPVC5aiN8/uVEldiAl8P/g4eOQmzcHfToOwy2LjUgs6uC4A59cP7CZY2fwePHTzH26+moVqsZpNZesKtQA42bdca8n9W/u9rGAuRfEmrfpT9cPerB1MoTrh710DKkB35b8WcxW4QAnqGWG6vWbIJCocDHH34AR0f7Iut9O34k/tz4N1as3oipk1QTU05ODoI79EVmVhYGfNAdSUkp2LhlB7r1GoJVv/+MD3q/p6w76ONR2Lx1F2r6VcOg/j1hbGyEu/EJOHrsJIJbN4NfjWrKuhMmfYfvflgE1wrO6NalHSwszBF6IhJffTMTkafOYdO6JWpxbvlrNw4ePo4O7Vrhk6EDkJqahqBAf1Sq6Ia/tu/FwvkzYGJiotJm/cZtUCgU+KBPN2XZs2fP0Ty4O2IuX0dQYEMEt26K5ORU7Nh9AK3a9sLGtb+ia+e2yvqXYq4iqFU3pKWl470u7eDtWQmnzpxHUKtuqOVXDfokkah/PUsb79Onz9AipAcuX7mO2jV9MWxIPygUCly9dgtz5v2KL0cOhZWVJQAgMuos2nXph/T0DHRs3xpenpVw+849rN/wN/YdOIqwI3/Do3JFlXiSklIQ1Oo9WMjM0bdXVzx+kohNW3aiXed+OBW2GzV8fQAAk74ZhVVrN+PO3XuY9M3LJFqrZvXX+ox27TmE3XsPo2P71hj+cX+EnojEmnVbEBt7B8cP/wUAqF3TV+PyrawslP0sWb4Gn30xAdbWlujYvjXs7Wxx+sx5zJqzAEePn8ThfRthZGSksuzwyNOYPXchmjcLwMcf9sXd+ATlvB27DqB3/08hFhugU4c2cHN1weUrN7BoyUocOHQMJ4/tgLW1lUp/d+7cQ0Czzqju443BA3riVuwd7Nh1AK3a9URM9BGV7+2Nm3Fo1bYnEu4/RJPGDdClUwjS0zMQc/kaZs1ZgC9HDtMplt17D6NL98GwsrJA5w7BcHZywJOnz3D+Qgz+3LgNQwb3ea3t9c6TZ8QL/Pfu/2veNEAAIOzftb7Eui7OjgIA4fb1SGVZRXdXAYDQsnmgkJUcqyyPOXtEMDU1EaysLIWkR1cEeUa88OxBjCASiYT6dWsKOam3VfrOSb0tJN6/pJzet3OdAEBoG9xCSH16XVmel35XGDaknwBA2LR+qbL896U/CgAEkUikcV2++ep/AgBhw9pf1eb51fARTE1NlHHKM+KFPr26CgCE35b8oFL3fly04ObqItjb2wrpz24oy5sFNRIACKv/+EWl/vgxIwQAAgDh1pXwEj/jW1fCBQBCcOtmavOmTRojABDat22lNq+08Xbv1lEAIHw99jO1vu7HRQvZKXGCPCNeyEqOFSpVdBNkMnMhOmK/Sr1jh7YKYrFY6NCutUp5wfp+MnSAkJt2R1m+bPFcAYAw9KN+KvULPrvS7rsV3V0FY2NjlbKC/UAikQjHD/+lsn8V7OthR7drtfyLZw4LEolEqFOrhvDk3gWVebOmjRcACHNnf6ssO7xvk3Ldl/86V62/x/EXBAsLmeBawVmIuxahMm/tygUCAGHE8EFq+wIAYfb0r1XqTxj3uQBAmDVtvEp5w/q1BQDCkoXfqy3/zvUonWN5r0s7AYBwNvKAxvUq7bYrb/845FtOPHz0BADg5upSYt2COgXXnAqbOmkMDA0NldM+Vb0weEAvJCUlY/uLoV+RSARBEGBsbAyxWKzSXiwWK8+IAGDRkpUAgCULv4NUaqosF4lEmD39a4hEImzYtF0tji6dQtC6ZZBaeb++7wMA1v35l0r5+QuXcfHSVXTuGAyZzBxA/tnbpi070apFEwwe0EulvqOjPcaMGo4nTxJx6J8TAIC78Qk4FhqBmn7VVM7GAeDrr/6nsl7auhV7G1NnzMPUGfPw1Tcz0DKkByZN+wEODnaYM2uCSt3Sxvvo0RNs3bYbnh4V1a7TFrQpOAvetecQbt+Jx9hRw9XOGps0bojOHYOxd/8/SElJVZlnZibFdzO+gYHBy0PJwH7dIZFI/pM7lfv06orAgAbKabFYjP4fdAcArZe/7Pd1yMvLw/wfp8LGxlpl3tgvP4G9va3GfbBOrRrK4fnC1qzfgpSUVMycNh7ubhVU4+3ZFXVr+2Hjlh1q7SpXcseYUcNVyj4clN//qULrcur0OUSdPoemTfzx8Yd91fpxdX15OUfXWExNTdTKbG2t1cpIFYd8SY0gCADyk1phhoaGaNSwrlr9JoENsXjpKpy/EIN+fbrBwkKGkDbNsf/gUdQPaIf332uPJoEN4d+gjtqwWeSpszAzk+KPlRs0xmJqaoJr12+qlTesX1tj/apVPFG/bk3sO3AUz549Vx4g1/65FQDQr8/7yrqnzpyHXC5HVlY2ps6Yp9bXjVtxAIBr12+iY/vWymtZhQ/gBczNzVC7ZnW1a4cluRV7B9Nm/aRS5uBgh2MHt6KKt4dKeWnjPR19AYIgoHnTxio/gjSJPHUWAHD1+i2NfT969AQKhQLXb8Sifr1aynJvz8owNzdTqSuRSODoYIek5ORil6kPdWvXUCtzfXF/QFKSdsuPjIoGAOw/cBSHX/wYKcxQIsHV67fUyhsUsQ9GvOgvMioat27dVpuflZ2Np0+f4enTZ7Czs1GW1/SrpvLDpPC6JCenKMtOnT4HAGjTqmlxq6VTLD3e74ht2/cioFkn9O7RBS2aByKocUM4ONiVuCxiQi03nBztcfXaTcTfu4+qVTyLrXsv4UF+m1fuhrS1sVb7wgOAo0P+tZ3k5JdnL5vXL8XsOQuwYfMOfDtlDgBAJjPH4AG9MHPqOOXZ6LNnScjLy1NLKoWlp2eqlRX3Be/X932cHjMZm7buwvCP+0OhUGDDpu1wcLBDcOuXB6Fnz5MAAGEnTyHs5KkSl5/84uzMwV7zsnU56AS3boa9O9YCAJ48ScTqdZsx/tvZ6NZrCCKO71RJVqWNN+nFQbiCi1OJcTx7lt/3+g3biq2XnpGhMm1pqflOcIlEArlcUeJyX5emO9ELzrq1XX7B5zprzoJSLduxiO397Hl+Il+8dFWx7dMzMmCHlwlV02f5cl1e3pxXsF1dtNmupYylV/fOMJQY4pdFv2HZ7+vw67LVEIlEaN40AD98Nwm1a/G53eIwoZYTAf71cPT4SfxzNEzjUGmBq9du4v6DR6jg4qQ2PJz47DkUCoVaUn30OH84ufABwcxMihlTx2HG1HGIu30XR46FY9lva/HLot+RmZmFJQu/AwBYWJhDJBLhcfyFUq3Pq2fPhfXq3hljxk/H+g3bMPzj/vjnaBjuP3iEz0d8pHKjj8WLod8vRw7F3NkTS1ym5YuD9+MnTzXOf/xYc7m27O1tMfqL4UhOTsXM73/BxKlz8dPcKTrHa2WZf9NNwv2HJda1sMjve/uWFejYvrUO0b+9LGT52zXp0RXl5QBtFLUPFmyn86cOKm/K0qeC7Xpfm+2qQyzdurZDt67tkJKSivCI09i2fR/+WLUB7br0w5VzR3W6tFFe8BpqOTGgXw8YGBjgtxXr8eRJYpH1Cn6lv3qNDgByc3OVQ0iFnQjLf1yjVhFvnalcyR0fDuyNIwc2w9zcDDt3H1TOa1i/DhITn+PGzbhSrU9xHBzs0KZVU4RHnEbc7btYtyH/euqr1z0b1KsFkUiEiEj1ddKk4NqiprPDtLR0nCvi8YbS+vqrz+Di7Ihfl61WeY1haeOtX7cmDAwMcPR4uNrjMa9q2KAOACAi8ozugZeg4Hr6q49ClbWGDfKHbjXt27rwf/FZntRyO5VWwVDzwcPH/9VYLCxkaBvcAksXfY+B/Xrg8eOnyksDpBkTajlRxdsDn4/4EImJz9Gl+2C1G44UCgVmzJ6PdX/+BU+Pihj9xTCN/Uye9oPKwfnqtZtYsXojLC0t0KVjMID8ocsoDV+858+TkZ2do3LDw/8+HQwAGDJ8tMZn4h4+fIwrV2+Uen379e0GQRDw+4o/sW37PvhU9VK59gfkD2n3eL8jwiNO44efliivHRcWGXVW+Ryiu1sFNG3ijwsXr2DdK0Ojs+cs0PqaXUlMTU3x1ehPkZubixmzf9Y5XkdHe3Tr2j7/Ou1M9SH1x4+fIi8vDwDQpWMw3N0q4KcFy3H8RIRa3dzc3CKfc9VWwaMZBZcU3hSfDB0AiUSCkaMnIf7efbX5SUnJOHvuktb9DerfEzKZOSZOnYOYy9fU5mdkZL5W8m5QvzYa1q+N4ycisfyP9WrzEwp9vqWN5fCRExpfP/r4xY9wTTcr0Usc8i1Hvp85AcnJqVixeiOq1myK9m1bwrNyRaSkpuHg4eO4cTMO3l6VsWvbKo3XppydHJCUlIK6jdqifduWSE5OxYbN25GVlY2li+Yoh8sS7j9EQLPO8K1eBXVq+6GCixMSE59jx+4DyM3NVbmTsW1wC3w7fiRmfPczqvgFIaRNM1R0d0Vi4nPcir2N0LAoTJ88FtV8vEu1rl06BsPCQoYf5i9Fbm4u+hV69rSwRfNn4vr1WIybMBNr/9yKRg3rwdJShvh79xF99iJu3IxDQuwZ5TXfBT/NQFCrbhg05Ats37k//znU6As4dfocggIbIjTs9ZJOgY8/7Is5Py7GmvVb8fVXn8HTo5JO8S6aP1P5bOLe/UfQonljCIKA6zficPDwcTy4HQ0rK0sYGxtj07ol6PDeALQI7oFWLZrAt3pVAPl3N58Ij4KtjTUunzuq8zq1aNYYW7ftRq8PhqNdSEuYmBijhq8POrRr9bof12up4euDhfNnYsTIb1CtVjO0C2kJT4+KSElJReztuzgeGomB/Xrg1wWzterP3t4W61YuRK9+w1HHPwQhbZrDp6onsrKyceduAo6fiECAfz3ltXNdrP7jF7QM6YHhn43Duj+3opF/PWRlZePyles4e/4Snty7qFMsY8dPx917CWgWFIBKFV0hEokQFn4KUafPoXGj+hpvyKOXmFDLEYlEgt+W/IDePbtg+R/rERZ+Cn/v2A8zMymqVfXCsCH9MPzj/jA1NdXY3sjICPt3rcP4b2dj9botSE5OhZ9vVUwYPxKdX5ydAkCliq6YPOFLHDkWhsP/hCLxWRLsbK1Rp1YNfPG/IQhu3Uyl36mTxiCoiT8WLP4D/xwNQ1JSCmxtrFG5khsmTxiFvq8M1WrD1NQU3bq0w8o1myASiYrsw8bGGieObMOiJauwacsO5csfnBwdUNOvGiaMH6lyJ2YNXx+EHv4L47+djf0Hj+LAIRECAxog9PBf+PHnpXpLqCYmJhg/5jN8Pnoips2aj1W/zdcpXjs7G4Qf3Y4f5y/Flm27sWjJKpiYGKNyRTeMG/0pzMykyroN6tfG2Yj9+GH+Uuzd/w9OhJ+CsbERKrg4oUvHEPTu2eW11unjD/vizt172Lh5B2bNWYC8vDwM6Ne9zBNqQWy1a1bHTwuWI/REJHbuPghLSxncXSvgi/8NwYAXj+Joq0O7Vjhzch9++GkJDh85gUP/hMLMzBSuFZwxqH9PtcsPpeXtVRmnw/fiux8WYdeeg/h54e8wN5fC27MyJoz7XOdYxo0dgW3b9yL67EUcOHQMhoaGqFzRDd/PnIBPhg5QewyOVInkGfHq40ZERERUKryGSkREpAdMqERERHrAhEpERKQHTKhERER6wIRKRESkB0yoREREesCESkREpAdMqERERHrAhEpERKQHTKhERER6wIRKRESkB0yoREREesCESkREpAdMqERERHrAhEpERKQHTKj/oqPHT0IsdUNSUnJZh6I1fcc8eOgovNfzo/90mfoUdvIUajVoDWOLyniv50daxbpyzSbYOPv+h1HqT1lti9t34iGWuuHc+ZjX6sfDJwA/L/yt2DpiqRv+3rGvyPmCIGDYiHGwq1BDLzGVtZLWVx/e5O/wf4kJ9TUMHjoKYqkbxFI3GFtUhlf1QIz9ejrS0zMAAI0b1UNC7BlYWlpo1V/LkB4YNXbKvxjxf2/+3KlYsWyecvptW8cx46ahVk1f3LocjhXL5pV6m77J3rZt8V/Zd+AoVq3djB1bVyIh9gxq+FYt65DeKJr2m3fpe/E6JGUdwNsupE1z/LH0R+Tm5SE0LBJDP/0K6ekZWPzLbBgZGcHJyeE/jyk3NxeGhob/+XI1edu/YLfi7mDokH5wdXVWlpXFNn2TvUn7mz7Ext6Bs5MDGjeqr3MfgiBALpdDInn9Q6w++/q3lNWx7k3DM9TXZGycvyO5ubqgb6/30LfXe9i+8wAAzcMgYSdPoUVwd5jbesPWpQbadv4Az58nYfDQUTgWGoFfFv2uPOu9fSde4/Dh3zv2QSx1U05PnTEPdf1D8MeqDfCqHghTK08IggBBEDB33q/wqh4IMxsv1PEPxpZtu1X62rPvH/jUbAozGy+0atsTt+/EF7u+Y8ZPQ+f3Byunf174G8RSN+zee1hZVq1WMyz9bS0A1SHfotaxwJmzF9EwsD3Mbb3RpEVXXLt+q9hY7t17gD4DPoVdhRqQ2VVBw8D2iIw6q5z/67LV8PYNhImlB6rVaoY167eqtBdL3fDbij/RrdcQmNt6o6pfEHbsyt92BUOQiYnPMWT4GIilbli5ZpPGbbpyzSZUquIPc1tvdOs1BM+ePVeLdefug2jQuD2k1l7wqh6IaTN/Ql5enlaxFIi5fA0d3xsIK8dqsHTwQbPW3XAr9rZy/orVG+FbpwWk1l6oXrs5fl26qsjP7nW2ha772/PnSeg3+H9wdK8FMxsvVPULworVG1Xiio27i1Zte8Lc1ht1/INxMvKMyvytf++BX71WMLXyhIdPAOb9vLTIdQSAGzfj0LzN+5Bae6FG3ZY4ePh4sfUHDx2Fz0dPxN34BIilbvDwCQAAZGdnY+ToSXCqWBtSay80bdUNp06fU7Yr2C/2HzyKhoHtYWrlidCwKLX+C/arDZu3o0mLrpBae8GvXiscPX5Sq75K2qdLWl9N+++58zFq27+0xylN/Za0rTx8AjB7zgJ8NGw0LB18UKmKP5b9vq7Y7aNpSL+ufwimzng5CjZ1xjxUquIPUytPuHrUw8jRk5TzcnJyMG7CTLh51ofMrgoCmnZS+exfFxOqnpmamiA3L1fjvHPnY9CmfR9Ur1YFYUe24/ihrejUrg3kcgXmz52KAP96GDK4LxJizyAh9gzcXF20Xu7N2NvYvHUXNq9fiuiI/QCAiVPmYOWaTVj080xcPHMYIz8bggEfjsSx0PwdKP7efXTvMxTtQloiOmI/PhzUB99M/K7Y5TQLCsCJ8CgoFAoAwLHQCNjZ2eD4iQgAwMOHj3H9RiyaBTVSa1vSOk6cMgdzv5uIqBO7IZGIMWT4mCLjSEtLR4uQ7njw4BH+3vwHzkbux5gvP4FCyI9r2/a9GDV2Cr78fCgunD6EoR99gI+GjcaRY+Eq/Uyf9RN6vN8R56IOoF1IS/T/8HM8e/Ycbq4uSIg9AwsLGX6aOwUJsWfQq3sntTgio85iyPAx+GToAERH7EeLZo0x8/sFKnX2HzyKAR+NxGefDsal6MP4dcFsrFq7GbNeqVdULACQkPAAzYO7w8TEGIf2bMCpsD0YNKAX8vLkAIDlf6zHxClzMH3yV4g5+w9mTBmHSdN/wKq1mzV+fq+7LXTZ3yZN+wFXrtzA7m2rEXP2CBb9PAt2tjYq/U6cOgdfjhyG6Ij98PbywAcDP1P+8DgTfQG9+32CXt074fypg5g0YRQmTfsBK9ds0riOCoUC3ft8DLFYjPCj27H4l1n4+tvZGusW/lymThwN1wrOSIg9g8jQXQCAcRNm4a+/92DFsp9wOnwPPD0rol2Xfmo/nsZ/Owszp41HzNl/ULNGtSKXM+6bmRg1cijOnNyLAP966NrjQyQmFt9XSfu0LuuriT6OU9puq3m/LEP9ujVx5uRefDJ0AEaM/AZXr90sdcwFtmzbjfkLf8OvC77DtYvH8dfG31DD10c5/8NhoxF+8jTWr16Ec1EH0L1bB7Tv0h83bsbpvMzC3twxhLdQ1Kmz+HPT32jZPFDj/Lk//Yr6dWti0c+zlGW+1V9enzEyMoRUaqrT0ElOTi5W//4z7O1tAQDp6Rn4acFyHNq7EQH+9QAAHpUrIiz8FJb9vg7NggKwZNlqeFR2x7w5kyESiVC1iicuxVzFnB8XF7mcpk38kZqahrPnLqFuHT+cCI/C6JHDsG37XgDAkePhcHSwh09VL7W2lpYWxa7j9ClfoVlQ/hnBV6NHoFO3gcjKyoKJiYla3fUb/8aTp88QGboLNjbWAAAvz8rK+fN+XoaB/Xrgk2EDAQBVvIciIuosfpy/FC2aNVbWG9ivB/r07AoAmDl1HBb+ugJRp8+hbXALODk5QCQSwcJCVuQ2+WXx7whu3Qzjxox4sRwPhEecxv6Dx5R1Zs9ZgHGjP8XAfj0A5G+HqZPGYPyEmZg0YZRWsSxeugqWFhb4c/Ui5fBqFW8PZduZ3/2Mud9NRLeu7QAAlSu548rV61j++zrlcvW5LXTZ3+7GJ6B2LV/Ur1cLAFCpopvacr8cOQwd2rUCAEz59kv41WuFm7duw6eqF35asBwtWwTi26+/UK7/las38OP8pRjUv6daX4f+CcWVqzcRe+Wkcsh+xtSv0KHrALW6hT8XmcwcYrFY+bmkp2dgyfI1+GPZj2gX0gIAsGzRHHgcDsAfqzZizKjhyvZTvh2NNq2aFtl/gRHDB+H9ru0BAIt/mYX9B4/ij1UbMPbLT4rsq6R9Wpf11UQfxyltt1W7kJbK9flq9KeYv/A3HD1+UuPxQxvx8QlwcrRH65ZNYGhoCHe3CmjYoA4A4FbsbWzYtB13b0TBxcUJADD6i+HYf/AYVq7eiJnTxuu0zMJ4hvqadu89DAv7qpBaeyGwRVcEBfrjlx+na6x7/sLlIpPt66roXkF5cAOAy1euIysrGyEd+8LCvqry35r1WxEbewcAcOXaTfg3qAORSKRs16hh3WKXY2lpgdo1fXEs9CQuXroKAwMDDP3oA5y/eAWpqWk4djwCTYP8dVqHwr/onV98WR8/SdRY9/yFGNSp5atMpq+6cu0GGgeoXgMLDKiv9uvXz+/lMs3MpJDJzItcpiZXr95UJpACr06fOXsR02fPV9kOw0Z8hQcPHyMjI1OrWM5duIwmgQ01Xqt88iQR8ffu4+NPxqosY+b3C3Ar7o7W61JYSdtCl/1t+McDsHHLDtT1D8G4CTMRHnFaw3Jfnk28XO5TAPmfdWCjBir1Gzeqjxs34yCXy9X6unrtJtzdKqhc/35122jjVuwd5ObmIjDg5bINDQ3RoH5tXLl6Q6Vu/bo1teqzkf/L75lEIkG9ujVL7KukfVpf66uP45S226rwfiYSieDkaI8npfj+vap7t47IzMyCV/VADP30K2zbvlc5whF97hIEQYBPrWYq++ix0Aidvyev4hnqa2rerDEW/zwThoaGcHF2LPbmDFMNZ1olMTAwgCAIKmW5ha69FTCTSlWmFYr8Njv/WokKL36NFTA2NgYAtX611axpIxw9HgEjIyM0bdII1tZW8K1WBWEnT+FY6El8PqL4x2SKYmj4cncsSPIFQ8uvMjUt+bMs/EMByF/fV4pg+MqNHiKRqMhlaqLNZ6hQKDDl29F4r0tbtXkmJsZaxVLc+hbUWbpoDvwb1FaZJxaLS4xPk5K2hS77W7uQFoi7GoHd+w7j8JETaNO+Nz4dNo+jz7YAACAASURBVBBzZ08stNyX35+Xy83vO3/7qW/Tomia92p7bRT0o3l/Ui0zM1P9XEpDm76K26e1WV8DA5Fa3dxc1UtUuhynXqXttiq8nwGACMV//0o6Hrq5uuDK+aM4eDgUh4+cwGdffIsf5y/FkQOboVAoIBaLcSpsD8Ri1XNJczMzrdetODxDfU1mUlN4eVZGRXfXEu909Kvhg3+OhhU539DIUO2Xtr2dLVJT05SP4gDAeS2ei6tezRvGxsa4G38fXp6VVf4VXPOo7uONyFNnVdq9Oq1JwXXUf46GofmLa6VNg/yxccuOIq+fFreOuvCrUQ3nLlzWeAMQAFSr6o2w8FMqZeERZ+BT1fu1l62ynGreiIiKVil7dbpubT9cu35LbTt4eVaGgYF2X8GaNarhRFiU2sEPABwd7VHBxQlxcXfU+q9cyb3IPvW1LQDt9jcAsLe3xaD+PbHmj18wb84ULP9jvdbLqFbNGydOqt7oczLyDKp4V9b4w6Gajzfuxifg/v2HKvVLy8uzEoyMjHAi/OWyc3NzcSb6Aqr56DY0Wfjmuby8PESfvVjiMGdJ+7Q262tvlz+q8ODhY2XZuQuXVerocpxSi7WU20pb9nY2KrGnpKQi7vZdlTqmpqbo3DEYP/84Df/s34STkWdw8dJV1KlVA3K5HI+fPFXbR/V1hzLPUP9D48d+hloN2mDEyG8wbEh/GBkZ4sixcPTo1hF2djao5O6GqFNncftOPMzNzGBjYwX/BrUhlZpiwuTv8dkngxB1+lyRN5oUJpOZY/TIoRg9bioUCgWaNG6AlJQ0nIw4DTNzMwzs1wPDPu6Peb8sx+hxUzH0o344c/YCVq0pue+C66i79hzC9MljAeQn2R59h8He3hbVq1Upsq2mddRFn55d8N3chejWawhmThsPZycHnD0fAxdnRwT418PoL4ahd/9PUad2DbRq0QS79hzEtu17cWD3nzotryj/+/RDNGnRFXPn/YounUJw8NBxleunAPDt1yPR+f3BcHN1QfduHWBgYIALl67g0qWrmD7lK62WM2L4ICxcsgJ9BozA+DEjYGlpgYioaDSsXxtVq3hi0oQv8cWYSbCwkKFtcAtkZ2fjdPQFJCUlY9TnQzX2qa9tAWi3v02e9gPq1vGDb/UqyM7Owe69h1GtFNfKvvx8KPyDOmLG7Pno2b0zTkaewaIlK7Fw/kyN9Vu3DELVKp4Y9PEozJ09ESmpqZg4ZU6p183MTIrhH/fHuG9mwsbaCu5uFTD3p1+RkZmJDwf2LnV/ALB46Sp4eVZCNR9vzF/wG54nJWPwgF7Ftilpn9Zmfb08K8HN1QVTZ/6E6ZPH4sbNOPz0yzKVOrocp15V2m2lrRbNA7FqzWZ0bN8a1laWmDTtB5UEvXLNJsjlCuVxc+36rTA1NUFFd1fY2lqjb+/3MGhI/udTp7Yvnj59hiPHwlHD1wft27Z8rdgAnqH+p6p4e2DfzrW4cPEKGjXthMAWXbFj1wFIJPk7xOgvhkEsFqNG3ZZwdK+Fu/EJsLGxxurff8be/f+gVoM22LBpByZN+FKr5U2bPBYTv/4C3/+wCL51WqJdl37YuecQKlfKvxnE3a0CNq9fil17DqGOfwiW/bYWM6aWfIC3tLR4cf3SSpk8gwIbQqFQoGmTos9Oi1pHXRgZGWHfznWwt7dDx/cGolaDNpjzwyKIX5zxde3cFj/NnYIf5y+BX71WWPb7Ovy+9Ec0bxqg0/KK0qhhXSxbPAcLf12Buo1CcODwMUwY9z+VOiFtmmPH1hU49E8o/IM6onHzLpj/y3K4u7tqvRxbW2sc2rMRaenpaBHSAw0C2+P3FeuVQ2ZDBvfBssVzsGrNZtRq0AYtQnpg9drNGm/8KaCvbVGgpP3NyMgQEyZ/j9oNg9E8uDvEYgOsX71I6/7r1vHDhrW/YuOWnahZvzWmTP8RUyeO1nhDEpA/PLh1w3JkZ2ejUdNOGPrpV1r/gHnV7Onj0a1rewwc8gXqN26PW7fuYO/2tbC21u1HyKzp4zF33q+o4x+CE+FR2Lbpd9jZ2RTbpqR9Wpv1NTQ0xLpVC3Ht+k3U8Q/G3HmLMe3Fj+ICuhynXlXabaWt8WNGIKhJQ3R+fzA6vjcQXTqFwLNyReV8K0sL/L5iPYJadUPthsH452gYtm9ZAVvb/Hst/lj6I/r3fR9jv56OarWao2uPjxB56izcCl13fh0ieUa8bhfSiIioVG7fiYdntcY4c3Ifatd6O19PSUXjGSoREZEeMKESERHpAYd8iYiI9IBnqERERHrAhEpERKQHfA61CIXf1qHL21WIiOjdUPjtTMW9jIUJtRipaWllHQIREb0hZObmxc7nkC8RFUkkEsFCJuMoDZEWmFCLwAMIUf73oOAfUXlX0veACZWIiEgPmFCJiIj0gAmViIhID5hQiYiI9IAJlYiISA+YUImIiPSACZWIiEgPmFCJiIj0gAmViIhID5hQiYiI9IAJlYiISA+YUImIiPSACZWIiEgPmFCJiIj0gAmViIhID5hQiYiI9IAJlYiISA+YUImIiPSACZWIiEgPJGUdwI27D3Hg5CXcfZiI5LRMDO/eArWrViy2zfU7D7Hl0Cncf/IcVjIpghvVQNN6Pip1jp6+ioMRl5CclgEXe2v0aNMQ3u6O/+aqEBFROVbmZ6jZOXlwdbRB75BGWtV/mpSKhRsPwcvNAROGdEbbxjWx8UAUoq/eVtY5fTkOmw9GoV1gTUwY0hlebg5YuOEgniWn/UtrQURE5V2Zn6HW8HJFDS9Xresfj74GGwsz9Az2BwA421nhzoOnOBgRg7o+lQAAhyJjEFjbG03qVAEA9Az2x+XY+zgWfQ3vtain93UgehfJ5UDYSSmSk01haalAo4ZpEIvLOiqiN1eZJ9TSir33BNU8XFTKqntUQNj5G5DLFRAg4O6DRIQE+KnUqebhgth7j4vsNzdPjjy5XDktCAIAQCQSQSQS6XENiN58O3aZY/y3jrh/3/BFiS1cXHLx3YxH6NyRIz1UvgiCoMwJxXnrEmpKeiYszExVyizMTaFQCEjLyIIAQCEIsDB/pY6ZKVLSMovsd1/4BewOPa+cNjaUYNrwzpCZmzOhUrny198mGPiRLV49fjx4IMHAjypg07pEdOuaVTbBEZUBQRCQkppaYr23LqECwKvpTfnLQQRAKKZOMXmxbeOaaO3vq1I/NycbqWlpTKhUbsjlwMgxji+Sqep+LwgiiEQCvhhjiZYtnnL4l8oNbc5OgbcwoVqYmSI5XfVMMzU9CwYGIpibmkCAAAORCMmvnI2mZmSpndkWZigRw1Dy8ghRkFC1PdUneheEhUsLDfOqEwQREu4bIizcBE0CM/7DyIjefGV+l29pebja40rcfZWyK3H3UdHZDmKxASRiMdydbTXW8XB1+C9DJXrrPHqs3W9sbesRlSdlnlCzcnIR/zAR8Q8TAQBPk9IQ/zBR+YjLtiNnsGJHqLJ+07pV8Sw5HZsPRuHB0ySEnbuBsHM30KbRy+Ha1v6+yvIHT5Ow6WAUnieno2ndqv/tyhG9ZRwd8vRaj6g8KfOfmXcePMVPa/crp7ccOgUAaFTTE4M6BSE5LUPl+VE7Kxk+69Uamw9G4diZq7A0l6JXcEPlIzMAUL96ZaRlZGP3iXNIScuEi701PuvdGraW5v/ZehG9jQIaZcDFORcPHkogCOr3DohEAlyc8xDQiMO9RK8SyTPieYFQA23v6iJ61+zcLcOgIfnPhhdOqiJR/qFi5W/30KkDvxtU/ljIZMXepFrmQ75E9Gbp1CEVK3+7B2cn1WFdF+c8JlOiYvAMtQg8Q6XyTi4HIqLMkZxsBkvLdL4picq9ks5Qy/waKhG9mcRiICgwAzJzA6SmZUChKOuIiN5sHPIlIiLSAyZUIiIiPWBCJSIi0gMmVCIiIj1gQiUiItIDJlQiIiI9YEIlIiLSAyZUIiIiPWBCJSIi0gMmVCIiIj1gQiUiItIDJlQiIiI9YEIlIiLSAyZUIiIiPWBCJSIi0gMmVCIiIj1gQiUiItIDJlQiIiI9YEIlIiLSAyZUIiIiPWBCJSIi0gMmVCIiIj1gQiUiItIDJlQiIiI9YEIlIiLSAyZUIiIiPWBCJSIi0gMmVCIiIj1gQiUiItIDJlQiIiI9YEIlIiLSAyZUIiIiPWBCJSIi0gMmVCIiIj1gQiUiItIDJlQiIiI9YEIlIiLSAyZUIiIiPWBCJSIi0gNJWQcAAEdPX8XBiEtITsuAi701erRpCG93R4115XIF9oVfwMkLt5CUmg5HW0t0a1kPvp6uL+soFNh1/ByiLsUiJT0TluamCKjphXZNasFAJPqvVouIiMqRMk+opy/HYfPBKPRp2wiebg4Ijb6GhRsOYvKwrrCxNFerv/1YNCIvxqJfh8ZwsrXE5dgELNlyBGMHtoe7ky0AYH/4RRyPvoZBnZrA2d4Kdx4kYvWuEzAxNkKrhtX/61UkIqJyoMwT6qHIGATW9kaTOlUAAD2D/XE59j6ORV/Dey3qqdWPvHgL7QJrws8r/4y0WT0fXI5NwKHIGHzYpSkAIC7hCWpVcYeftxsAwM5KhtMxcbj74GmRceTmyZEnlyunBUEAAIhEIoh4VkvllIGBgcp/icojQRCUOaE4ZZpQ8+Ry3H2QiJAAP5Xyah4uiL33uIg2ChhKxCplhhIJbsY/Uk57ujngePQ1PEpMhqOtJe49eoab9x6hZ5uGRcayL/wCdoeeV04bG0owbXhnyMzNmVCp3DOTSss6BKIyIwgCUlJTS6xXpgk1LSMbCkGAhbmpSrmFmSlS0jI1tqnu4YJDkZfh5e4Ee2sZrsY9wPnrd1V+PYQE+CEzOxdTlmyDyEAEQSGgS/O6aODrUWQsbRvXRGt/X+W0IAjIzclGaloaEyqVWwYGBjCTSpGekQGFQlHW4RCVCW3OToE3YMgXAF5NV4IgqBe+0LONP9buCctPlgDsrWVoXMsb4edvKOucvhyHqIu38GHXpnCxt0b8o2fYfDAKljIpAmp6aezXUCJWOfMtSKjanuoTvcsUCgUTKlEJyjShmkuNYSASIfmVs9HUjCxYmJlqbCMzM8EnPVohNy8PaRnZsJJJse3IGdhZyZR1/jp8GiGN/ZRnpBUcrPEsOQ37wi8UmVCJiIheR5neaSARi+HubIsrcfdVyq/E3YeHq0OxbQ0lElhbmEGhEHD26h3UquKmnJeTJ1cbpjUQicATTSIi+reU+ZBva39frNgeiorOdvBwtUfo2et4npyOpnWrAgBW7AiFlUyqvOM3LuEJklIz4Opog6TUDOwKPQdBEBAcUEPZp5+3K/aGXYCNhRmc7a0Q//AZDkXFoHEt7zJZRyIieveVeUKtX70y0jKysfvEOaSkZcLF3hqf9W4N2xfPoD5LTkPhk83cPDm2H4vG0+epMDYyRA0vVwzuHASpibGyTu/gRthxLBp/7otAakYWLM2lCKpTFR2Cav3Xq0dEROWESJ4Rz4FQDbS9TZroXWZgYACZuTlS09J4UxKVexYyWbFPffBpbSIiIj1gQiUiItIDJlQiIiI9YEIlIiLSAyZUIiIiPWBCJSIi0gMmVCIiIj1gQiUiItIDJlQiIiI9YEIlIiLSAyZUIiIiPWBCJSIi0gMmVCIiIj1gQiUiItIDJlQiIiI9YEIlIiLSAyZUIiIiPWBCJSIi0gMmVCIiIj1gQiUiItIDJlQiIiI9YEIlIiLSAyZUIiIiPWBCJSIi0gMmVCIiIj1gQiUiItIDJlQiIiI9YEIlIiLSAyZUIiIiPWBCJSIi0gMmVCIiIj1gQiUiItIDJlQiIiI9YEIlIiLSAyZUIiIiPWBCJSIi0gMmVCIiIj1gQiUiItIDJlQiIiI9YEIlIiLSAyZUIiIiPZC8TuOYWwm4fvch0jKy0KFJLdhYmuP2/aewtTSHzMxE636Onr6KgxGXkJyWARd7a/Ro0xDe7o4a68rlCuwLv4CTF24hKTUdjraW6NayHnw9XVXqPU9Jx7YjZxBzKwE5uXlwtLFA/46BqOhs9zqrTEREpJFOCTUnNw+LNx/GtbgHgEgEAGhW1wc2luY4GHEJ1hZm6N66gVZ9nb4ch80Ho9CnbSN4ujkgNPoaFm44iMnDusLG0lyt/vZj0Yi8GIt+HRrDydYSl2MTsGTLEYwd2B7uTrYAgPTMbMxdvQdVKzrjs16tITMzwdPnqZCaGOmyukRERCXSacj376PRuPsgEUPfb4GfxvQFBEE5r7qHC67G3de6r0ORMQis7Y0mdarA2c4KPYP9YW1hhmPR1zTWj7x4C+0C/eDn5Qp7axma1fNBdQ8XHIqMUdY5cPIibCzMMLBTE1SuYA87Kxl8KrvA3tpCl9UlIiIqkU5nqNFXbqNT0zqo41MRCoVCZZ61hTmepaRr1U+eXI67DxIREuCnUl7NwwWx9x4X0UYBQ4lYpcxQIsHN+EfK6fM34lHdowKWbT2CG3cfwUomRdN6PgiqU6XIWHLz5MiTy5XTwosfCSKRCKIXZ+FE5Y2BgYHKf4nKI0EQlDmhODol1LSMLLjYW2mcZyDKT07a9ZMNhSDAwtxUpdzCzBQpaZka2+SfjV6Gl7sT7K1luBr3AOev31VZ2afPU3H8zFW09vdF28CauH3/KTYdiISh2ACNanpp7Hdf+AXsDj2vnDY2lGDa8M6QmZszoVK5ZyaVlnUIRGVGEASkpKaWWE+nhGolkyLhyXNUreSsNu/e4+ewtVK/9lmcV9OVIAjqhS/0bOOPtXvCMGXJNogA2FvL0LiWN8LP3yjUHqjobIuuLeoBANydbPHgSRKORV8rMqG2bVwTrf19VWLIzclGaloaEyqVWwYGBjCTSpGekaE2GkVUXmhzdgromFBrV62IvWEX4OXmCFcH6/xCEZCYnIbDUZfRuIik9SpzqTEMRCIkv3I2mpqRBQszU41tZGYm+KRHK+Tm5SEtIxtWMim2HTkDOyuZso6luSmc7VTPoJ3sLBF99U6RsRhKxCpDyQUJVdtTfaJ3mUKhYEIlKoFOCbVjUG1cu/0A363YhQr21oBIhNU7T+BJUiocbSwR0tiv5E4ASMRiuDvb4krcfdTxqagsvxJ3H7WquBfb1lAigbWFBHK5Amev3kG9apWU8zzdHPDoWbJK/UfPUmBraab9ShIREZWCePKEL6eUtpFEIkYjP08YGUrwLDkNErEYpsZGCKxdBf3aN4aRofZ52sTYEDuOnYWVTApDiRh7wy7g+u2HGNCpCaQmRlixIxS37z9FtcouAIC4hCe4ff8pJGIx7j9Jwpo94cjIysagzkEwlOQv18bCHLtCz8HAwACW5qaIuZWAXaHn0KlZHbg62GgdW3ZOTuk+GKJ3jEgkgrGREXJycjhSQ+WesbFxsZcAdX6xg5GhBG0b10TbxjV17QIAUL96ZaRlZGP3iXNIScuEi701PuvdGrYvnkF9lpyGwvHn5smx/Vg0nj5PhbGRIWp4uWJw5yBITYyVdSq52GF495b4+8gZ7A49BzsrGXq0aQj/Gp6vFSsREVFRRPKM+FL/7ExNz0JGVjYcbS3V5j1KTIaZqTHMpdq/KelNpO1dXUTvMgMDA8jMzZGalsZrqFTuWchkxZ6h6vRw2Z/7I3Ag4pLGeYciY7Bhf6Qu3RIREb21dEqot+Ifo7pHBY3zqntUwK1CL1kgIiIqD3RKqOmZWTA3NdY4T2pihNSMrNcKioiI6G2jU0KVmZki4clzjfMSnjyHmenbff2UiIiotHRKqL4eFbA37AIeJao/67kv7CJqeGkeDiYiInpX6fZih6a1cfFmPKYv346qFZ1hZSFFUkoGrt15AHOpCTo1raPvOImIiN5oOj02AwBJqRnYcewsYm4lIC0jC+ZSE9TwrIBOzerASvb2v0ibj80Q8bEZosJKemxG54T6rmNCJWJCJSrsX3kOlYiIiFTp/OrBm/GPEHUpFs+S05Gbl6c6UyTCqA9CXjc2IiKit4ZOCTX8/A2s2RUGqakxHG0sICn0Z88A5P9BUiIionJEp4R64OQl1KteCQM7Ban8DVEiIqLySqdrqInJaQisXYXJlIiI6AWdEqqznRVS0jP1HQsREdFbS6eE2qV5XewPv4jnKen6joeIiOitpNM11GNnriIzOxeTl2yDq6ONxhflf9qz1WsHR0RE9LbQKaHee/wMBiIRZFITJKdmIDk1Q2V+Mc+9EhERvZP4pqQi8E1JRHxTElFhfFMSERHRf0DnNyXl5slx8sJNXL/zEGmZWejTNgCONhY4d+0uKjhYw95aps84iYiI3mg6JdS0jCzMW7sPD54kwcLcFCnpWcjOzgUAnL9+F5djE9C3XYBeAyUiInqT6TTk+9fh08jMysHXH3bCrP/1UHnVYNWKTrhx95HeAiQiInob6JRQL968h07N6sDd2RavXp61sjDD81Q+n0pEROWLTgk1MzsHNpbmGufJ5QooFLxxmIiIyhedEqqdlQyx9x5rnHf7/lM42li8VlBERERvG50SasMaHjhw8hLOXbsL5bmoKD+Z/nPqMvz9PPUXIRER0VtApxc7yOUKLN50GJdjEyA1NUZGZjbMpSZIy8yGr0cFfNqrFQze8tcl8cUORHyxA1FhJb3YQec3JQmCgNOX43Dp5j2kpGfBXGoMPy831Pet/NYnU4AJlQhgQiUq7F9LqO86JlQiJlSiwvjqQSIiov+A1m9KmrBwS6n+isyMEd11iYeIiOitpHVC9a7oCFGh1zhcu/0AKemZ8HB1gIWZKVLSMxF77zEszE3hU9H5XwmWiIjoTaV1Qh3UKUj5/xEXb+HWvceY9kk3lRc8JCan4ef1B+Bd0Um/URIREb3hdLqGuj/8Ijo1ra32tiRbS3N0CKqF/eEX9RIcERHR20KnhPrkeQpMjI00zpOaGCMxOe21giIiInrb6JRQba3MEX7uhsZ5J85eh42l2WsFRURE9LbR6e+hhgT4Yc2uMMz+Yxca+FaGpbkpktMycSomDncfJqJ/h8b6jpOIiOiNplNCbVzLGwCw49hZbD10SlluYS5Fv/aNlfOJiIjKi9d6U5IgCHiUmIy0zGyYmxrD0day2LdIvE34piQivimJqLCS3pSk0xlqAZFIBCc7q9fpgoiI6J2gdUK9cfch3JxsYWJkiBt3H5ZY39udz6ISEVH5oXVCnbdmH74a1AGVK9hj3pp9KPI9hIIAiET49ZuBpQrk6OmrOBhxCclpGXCxt0aPNg3h7e6osa5crsC+8As4eeEWklLT4WhriW4t68HX01Vj/X1hF/D30Wi0bFANPYP9SxUXERGRNrROqKP6tYWzff7w7hf9QlReQ/i6Tl+Ow+aDUejTthE83RwQGn0NCzccxORhXdVeHgEA249FI/JiLPp1aAwnW0tcjk3Aki1HMHZge7g72arUvX3/KULPXkcFB2u9xUtERPQqrRPqvcfP4GRnCRMjQ1TV87t6D0XGILC2N5rUqQIA6Bnsj8ux93Es+hrea1FPrX7kxVtoF1gTfl75Z6TN6vngcmwCDkXG4MMuTZX1snJy8cf24+jXoTH2nDiv15iJiIgK0zqhbj54CpVd7GFhZopPZq3CVwPbo3IF+9cOIE8ux90HiQgJ8FMpr+bhgth7j4too4ChRKxSZiiR4Gb8I5WyDfsiUMPLFdUqu5SYUHPz5MiTy5XTgpB/87P/ho5Iz80otm1N++rY0H6xSlnvPZ/iwpPLxbYDgE9rDcJntQcpp1Nz0uH/Z4cS2wHA+naLUNvBVzm97/YRfHlsaontzAylONV3j0rZxPC52Hpjd4ltgys2w/zmqstovrk7Hmc8LbHt1IAx6FGlo3L6xvM4dNkxuMR2APBP901wMnNQTq+M2YQ5pxcX0yKfp1Ul7OyyUqXs44NjEXb/lOYGhQyo3gPjG4xQKau+qrlW8S5tPQdBFRoqp0MTojDs0Fdatb088KjK9HenFmH15c0ltgt0aYDlbeaqlHXaPgi3km6X2Par+p9ikG9P5fTD9MdouSV/WiQSKb8PmmzvvALe1pWV05uv78Lkkz+UuEwHqR2O9tiiUvbF0ck4cOdYiW3f9+6A6Y3HqpQ1WN++xO8qAMxrNhltK7VQTp97HIO+e0cU0+KlyD67ITN6+eKahedWYvH5lSW24zHi7T5GmBlKEdl7V4l9aZ1QTYwkyMzOyZ8o5stVWmkZ2VAIAizMTVXKLcxMkZKWqbFNdQ8XHIq8DC93J9hby3A17gHOX7+r8qU/FROLuw8T8fWHHTX28ap94RewO/Rl0jU2lGDa8M54mP4YqbnpxbZ1t6wAmbnq0HRSTjLupz8qosVLOchRaStkC1q1AwCJsUR1uRKRVm1lRuZq8abLM7RqmypPV2v7JDNRq7YKsaDS1jjLSOt1NZWaqrTNM8jTqq2ViaX6tslN0aptlpCl1lbbeMVGBiptxUYGWrd9dZlZQpZWbZNyU9TaJmY916ptnkGeSttkIVXreI1NjVTaKsTa7cMikUgt3lR5ulZt0+UZam0fZjxBao4Wrz2VqC5XkizRel3NzaSQGb9sm4McrdryGPF2HyNkhtq9/U/rhOrqaIONByLhU8kFQP4wrYWZqebKIqBXKW/+efWKrCAI6oUv9Gzjj7V7wjBlyTaIANhby9C4ljfCz+e/DvFZSjo2HYzCyD7BMJRot4ptG9dEa/+Xv+QEQUBuTjaczBwgK+FXr5WRJVLT0tTKXMw031RVmBGMVNqm5WRo1Q4A8rLzVJebJ2jV1sxQqhavmViqVVuZ2Eytrb2pbbFnMAUM5CKVttmZOVqva2ZGJlJFL9tKFBKt2tqaWKtvG0MLrdqaiEzU2mobrzxHodJWnqPQuu2ryzQRmWjV1srQQq2trYm1Vm0lColK28yMTGW7ks5QszNzVNoayEVaLdPe1FYtXpnYTLt9WKy+DztJ7bU78OUJKm3zsvO03jZp6RkQ5b48MBnBSLtt7WfPvwAAIABJREFUw2PEW32MMDOUahWD1i92iH+YiNW7wnD/SRIUglD8WWop7vLNk8vx+fdr8XG35qjjU1FZvvFAJO49eobR/dsV2TY3Lw9pGdmwkkmx7cgZXLxxD5OHdcW5a3ewZMsRGBS6E1khCBAh/+CwcHx/GBgU/xpjvtiBiC92ICpMby92cHOyxYQhnQEAn8xcqXyE5nVJxGK4O9viStx9lYR6Je4+alVxL7atoUQCawsJ5HIFzl69g3rVKgEAfCq5YOLHXVTqrt51Ak62lggO8CsxmRIREZWWTm9KGtCpCeytZXoLorW/L1ZsD0VFZzt4uNoj9Ox1PE9OR9O6VQEAK3aEwkomVd7xG5fwBEmpGXB1tEFSagZ2hZ6DIAgIDqgBADAxNlR7TMbIUAIzU2M+PkNERP8KnRJqQE0vvQZRv3plpGVkY/eJc0hJy4SLvTU+690ati+eQX2WnKbyHoncPDm2H4vG0+epMDYyRA0vVwzuHASpibFe4yIiItKWzi/Hj7x4C1ExsXiWnI7cvLxXu8WMEe/rIbyyw2uoRLyGSlTYv/Jy/P3hF/H3kTNwtreCq6M1JGJxyY2IiIjeYTol1NCz19Gsvg96hzTSdzxERERvJZ1ud01Jz0TtqhVLrkhERFRO6JRQ3Z1s8eQ5ry8SEREV0Cmh9mjdAIciL+HOg5LfzUhERFQe6HQNddWuE0jPzMZ3K3bDwswU5lL1x1VefbECERHRu0ynhGpmagxzqYm+YyEiInpr6fwc6ruOz6ES8TlUosJKeg6VL7UlIiLSA52GfAEgPTMbhyNjcPX2A6RnZsNMaoJqlZzRsmF1mJnyFYBERFS+6HSG+jwlHTN/34G9YReQmZ0La0szZGblYM+J85j1+04kpRb/90OJiIjeNTqdoW4/Go3cPDnGDe6ISi52yvLb959i8aZD+PvoGQzqFKS3IImIiN50Op2hxsQmoHOzuirJFAAqudihU9M6iLmVoJfgiIiI3hY6JdTMrBzln1Z7la2VDJlZOa8VFBER0dtGp4RqZyXDpZvxGufF3LoHOyv9/fFxIiKit4Fuf2C8ltf/27vz6Crv+87j77vpat93JBZtLEKSWYXYjM1isB2vYydOe9wkbZJ2mqY9p9N22pzTdjo90zM9s7RpZpouM24ySezEW+xgGwxmk8EsQoAAIbEJ7ft6r662e59n/hBckBEGw2Mukj6vf+T76Pc8/H4+iI9+z/P7fR9+uec4pgmrinOJi46k3+vjyJnL7Dt2jmceXWZ1P0VERB5odxWoW1YtpqvXw76Kc+w7XnP9G6bJ2iUFbFm12Kr+iYiITAn3VCmprbuf81da8Q6NEB3hZv7cDNKS4qzsX8ioUpKIKiWJ3Oh2lZLueIY6ODTCT947RFlJHsX52QCkJ8WRfkOAVl1o5Jd7K/m1x8tU61dERGaUO16UdPDkBZo6eijMnXXLNoW5s2ju7GX/jbeBRUREZoA7DtSK6jrWPlSAw37rUxx2O2sfKuDU+clXAIuIiExXdxyo7T39zMlIum272emJdPQM3FOnREREppo7DlTDMHE4bt/c4bAT0OIFERGZYe44UOOiI2jt7Lttu5bOPmKjIu6pUyIiIlPNHQdq/ux09lfWEgjcevYZCBgcqKxl/px0SzonIiIyVdxxoG5cuYi2rn5++MaeSV/P1ufx8Y+v76G9u5+NpYWWdlJERORB97kKO5SfOM+rOz7BbrMxOz2JpKs1e7v7PDS0dWOYJl/dWsbaJQVfWIfvFxV2EFFhB5EbWVbYAWDdkgJmpcTzwcEqzte3UdfcCUCYy8minFlsXVNEzqzUe+uxiIjIFHTXpQcN08TrGwYgOjIc+2ek9lSkGaqIZqgiN7J0hnoju82m1bwiIiJX3dX7UEVERGQiBaqIiIgFFKgiIiIWUKCKiIhYQIEqIiJiAQWqiIiIBRSoIiIiFlCgioiIWECBKiIiYgEFqoiIiAUUqCIiIhZQoIqIiFjgrovjW21fRQ27Dp+h3+sjMyWBFzavJH922qRtAwGDHYeq+KTqEn2eQdKS4nju0WUU5mYF2+w4WMWJ2nrauvsJczrJyUrh2UeXk54Ud7+GJCIiM8gDMUOtqK7j9V1H2bammO/91lPkZafyg9d20dPvnbT9O/srOVB5ni8/VspffPtZ1i+dzw/f2EtDW3ewzfmGNh5etoA/+doT/P5Xt2AYJt//2YeMjI7dr2GJiMgM8kDMUHcfOcuah/JZu6QAgBe3lFJ9uYX9lbU8+8iym9ofOX2JbWuKKcobn5E+vGwB1Zeb2X3kLN94ej0A331py4RzXn5yLX/0d6/R0NZN/uz0m6455g/gDwSCn01z/DWxNpvtM99/JzKd2e32CV9FZiLTNIOZ8FlCHqj+QICG1m4eKyuacHxhTiaXmzpucY6By+mYcMzldHKxsf2Wf87QyCgAkeHuSb+/41AV75WfCn52u5z81W8/RUx0tAJVZryoyMhQd0EkZEzTZMDjuW27kAeq1zeCYZrERk98WXlsVAQD3qFJz1mUk8nuI9XkzU4nJSGGmrpWTp1vuOVvEKZp8sbuY+RlpzIrNWHSNltXF7OptHDCOWOjI3i8XgWqzFh2u52oyEgGfT4Mwwh1d0RC4k5mp/AABOo1n44s0zRvPnjVi5tL+cn7B/nLH76NDUhJiGF1ST6HTl2YtP1rO4/Q1NHDH738+C3/fJfTMWHWey1Q73SqLzKdGYahQBW5jZAHanSkG7vNRv+nZqMe3zCxURGTnhMTFc7vvLCRMb8fr2+E+JhI3t57nOT4mJvavrbzMFXnG/jDl7eREBv1hYxBREQk5CsNnA4HszOSOFfXMuH4uboWcrJSP/Ncl9NJQmwUhmFyoqaekoLs4PdM0+TVHYc5UdPAH/z61knDVkRExCohn6ECbCot5JV3ypmTkUxOVgrlJ87T2z/I+qXzAXjl3XLiYyKDK37rmjvp8/jISkukz+Nje/lJTNNkS9ni4DVf3XGYY2cv8zsvbCQ8zEm/1wdAhDuMMNcDMWwREZlGHohkWb5oHl7fCO99fJIB7xCZKQl85yubSIqLBqCn38uN64LG/AHe2V9JV68Hd5iLxXlZfP2pdRNW8B6orAXgf/xkx4Q/6+Un17C6JP+LH5SIiMwotoCvUStuJnGny6RFpjO73U5MdDQer1eLkmTGi42J+cxdHyF/hioiIjIdKFBFREQsoEAVERGxgAJVRETEAgpUERERCyhQRURELKBAFRERsYACVURExAIKVBEREQsoUEVERCygQBUREbGAAlVERMQCClQRERELKFBFREQsoEAVERGxgAJVRETEAgpUERERCyhQRURELKBAFRERsYACVURExAIKVBEREQsoUEVERCygQBUREbGAAlVERMQCClQRERELKFBFREQsoEAVERGxgAJVRETEAgpUERERCyhQRURELKBAFRERsYACVURExAIKVBEREQsoUEVERCygQBUREbGAAlVERMQCClQRERELKFBFREQsoEAVERGxgAJVRETEAgpUERERCzhD3YFr9lXUsOvwGfq9PjJTEnhh80ryZ6dN2jYQMNhxqIpPqi7R5xkkLSmO5x5dRmFu1l1fU0RE5F48EDPUiuo6Xt91lG1rivnebz1FXnYqP3htFz393knbv7O/kgOV5/nyY6X8xbefZf3S+fzwjb00tHXf9TVFRETuxQMRqLuPnGXNQ/msXVJARnI8L24pJSE2iv2VtZO2P3L6EtvWFFGUl0VKQgwPL1vAopxMdh85e9fXFBERuRchv+XrDwRoaO3msbKiCccX5mRyuanjFucYuJyOCcdcTicXG9vv+ppj/gD+QCD42TRNAGw2Gzab7fMNSmSasNvtE76KzESmaQYz4bOEPFC9vhEM0yQ2OmLC8dioCAa8Q5OeMz4brSZvdjopCTHU1LVy6nxDcMB3c80dh6p4r/xU8LPb5eSvfvspYqKjFagy40VFRoa6CyIhY5omAx7PbduFPFCv+XRkmaZ588GrXtxcyk/eP8hf/vBtbEBKQgyrS/I5dOrCXV9z6+piNpUWTmg7NjqCx+tVoMqMZbfbiYqMZNDnwzCMUHdHJCTuZHYKD0CgRke6sdts9H9q5ujxDRMbFTHpOTFR4fzOCxsZ8/vx+kaIj4nk7b3HSY6PuetrupyOCbeRrwXqnU71RaYzwzAUqCK3EfIHI06Hg9kZSZyra5lw/FxdCzlZqZ95rsvpJCE2CsMwOVFTT0lB9j1fU0RE5G6EfIYKsKm0kFfeKWdORjI5WSmUnzhPb/8g65fOB+CVd8uJj4nk2UeWAVDX3Emfx0dWWiJ9Hh/by09imiZbyhbf8TVF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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Populate the data for the x and y axis\n", + "x = []\n", + "y = []\n", + "for obj in json_data:\n", + " inference, timestamp = simple_getter(obj)\n", + " \n", + " y.append(max(inference))\n", + " x.append(timestamp)\n", + "\n", + "# Todo: here is an visualization example, take some time to build another visual that helps monitor the result\n", + "# Plot the data\n", + "plt.figure(figsize=(5,5))\n", + "plt.scatter(x, y, c=['r' if k<.94 else 'b' for k in y ])\n", + "plt.axhline(y=0.94, color='g', linestyle='--')\n", + "plt.ylim(bottom=.88)\n", + "\n", + "# Add labels\n", + "plt.ylabel(\"Confidence\")\n", + "plt.suptitle(\"Observed Recent Inferences\", size=14)\n", + "plt.title(\"Pictured with confidence threshold for production use\", size=10)\n", + "\n", + "# Give it some pizzaz!\n", + "plt.style.use(\"Solarize_Light2\")\n", + "plt.gcf().autofmt_xdate()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Congratulations!\n", + "\n", + "You've reached the end of the project. In this project you created an event-drivent ML workflow that can be incorporated into the Scones Unlimited production architecture. You used the SageMaker Estimator API to deploy your SageMaker Model and Endpoint, and you used AWS Lambda and Step Functions to orchestrate your ML workflow. Using SageMaker Model Monitor, you instrumented and observed your Endpoint, and at the end of the project you built a visualization to help stakeholders understand the performance of the Endpoint over time. If you're up for it, you can even go further with these stretch goals:\n", + "\n", + "* Extend your workflow to incorporate more classes: the CIFAR dataset includes other vehicles that Scones Unlimited can identify with this model.\n", + "* Modify your event driven workflow: can you rewrite your Lambda functions so that the workflow can process multiple image inputs in parallel? Can the Step Function \"fan out\" to accomodate this new workflow?\n", + "* Consider the test data generator we provided for you. Can we use it to create a \"dummy data\" generator, to simulate a continuous stream of input data? Or a big paralell load of data?\n", + "* What if we want to get notified every time our step function errors out? Can we use the Step Functions visual editor in conjunction with a service like SNS to accomplish this? Try it out!\n", + "\n", + "\n" + ] + } + ], + "metadata": { + "instance_type": "ml.t3.medium", + "kernelspec": { + "display_name": "Python 3 (Data Science)", + "language": "python", + "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-east-1:081325390199:image/datascience-1.0" + }, + "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.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/project/step function (json & screenshot)/project-2-aws-step-function-exe.JPG b/project/step function (json & screenshot)/project-2-aws-step-function-exe.JPG new file mode 100644 index 0000000000000000000000000000000000000000..445ff89ec59a7749ff3872e5272f692b3f139489 GIT binary patch literal 118936 zcmeFZ1z4QRk~cnh@DSWRxVuY&2X_Vu?(PsI5W_7%fB?bWWpD`=+--1ocmF2moO?Fs z?mcJk-Ea5X=l|bKo(^5_yz_R~udA!8tE%6JsfR_tV_8WVNdOcS6yPP~AK+o>@sNav zr5OMqFAtyx0055wuuuX3Xh;o4S_uGnZwY{f)S)0>$bL@#{uclb06hM>O$0!ITtk7- z!jJ+W+J^l1=zHzw=O+R`5%`I~PXvA<@DqXml?cE^!u(=EU_mT}Pm!>{*9)Vgezh!k zH~@g?=zpvKn>Fz$^gCidt%?7Ya`Thvp9uU!;3on<5%`I~?+CE7vUBjWvh%ZXlCiV# zvvTlr@B#kOH2^>w0C8AAJQ~Q@7A`Ih{46YX&di1;_C}`6#`d->9)=DqY|N}I06`HC z2Sa0PQx`HLQ*%o@A)15wW*Ra}6CoN+E_qgYhi9f1meO8Mrm9{FYQ|pH#(X9;BEqOh zf*$-Hwhp$YE{0?twl;Ro{2oFSzdW5EQvZILg+f@+$;6Cb<+h&IGxG$=TD+#n6Mv&YAMJ2Rt`*Hg>XfaIv(vBm4e9LnC`v z7a8?T7f(iB5{a_h=MFXw)gJ=_~i;j;2^*IT|6PbB>R8x`Ps<71oBU~ ze!}%HA@DEV{8PGq!u2m9@Gsr`Q@Z{?2G_rtxTbaxyVf0Iz&^|Xo&gZx;Nan45#ZtA zA0Z$-Lc&0X*ceFI=#Nn_@URK+@v!l52}x+k35ltRaq%daDX3}b7#JA{$XGa7=-FxL z8R)-11PbBNBP2v5EM#OXdLld``hWTJ&;r1C1pN&534j_dD8Q~yd z$?uWL-#$>#FtBj&2#*kvkRdlzJqAES!N5Sn!ob17LSm9oK9KJLuo!Sp$l1i;F_jGw zC>*iaUq_`qq7*M{#a0*`|C$o;!$a3t%#HyDu>uc zPQyqzRGdrHN8efdg|mN-v4H;+XTLM{Z+w9PC@@fv!Gpm7hybqn?a!Fh>1P+Vb@G*< zB(RjAlw|!z3%l+(?eC!Sy-HYa-!L}sWcY2OiV|QcO8|bB{}=;h=LZ0$C&C@8;vHhX z)$0eqDjUt61BBT20??)h|589a*Kzr=cHhCL1*8Yl0`iX^0N=!W@9TK({l|?8dLIDf z$Sl{J3)e78@Ncn{Md7fQ9{_kPX@Sd9?~2X@_7rAb#DP^E>Rh53s?qTfyEnj#h7Tzo{_M|-k)QfVDXVJ6 zyrQgVnDiyt;U90j(Y6Ag?GD&Clu=3qR=y-b<6BO@)I&Xs=s?HcoCJ5==f(v=7lLAN zjI^F8@S`<0=1rmN=V}~J@6V4jQ&_(tOnJOm7oox*d}JTwi(YZKpKNNMwhcbn(WwH@ zfF-X#zZIidH)`_t;~zOPE%4x3M(}sVqp_s==x3_;tt(*^VA`mlU{Oj^FM*}<%P@Z* z>i^{hIuIi1MvB*qsn?ieXD~kyrvPOMtnUTtmx=MCR#IPk07SlxzjOJnmO3=!@5ONp z&W4*$;lH3F(Wd(gUUccB9|;$%grT?lVkOCFyVRJ7C&tKPhmby3jf!y8slFBodL_1G z3zRuJ9F}Pa?La@*Osa%NXIgiTbdY2yO8-P+xkUQ*B2E}{(ne6#8*U=4@Htb;@>B)v zTjMEzJHXLcaKRG#`+M@kyZdC+^`ONB+uhGFc@kz{kH-8S3y7kJUzMn*hrC{o^Fwp> z_CxfTk@F6r6#2kx7B?Q)G=^3~I4~P{3SVF)f_f|7M0{v)E;Nzo>WA{W)=o!}Le(Gb z5n;U-(wQu64TJgY*NoV&PH9U&dA>p4;~jBSWPozX zqcq$^?UB*WqY4ztE?e_NBxH+n3ngyJg*kj$uR{wH9N!8K&p5JT!Q4L4sZPq7!K>VH zF*DZ`@tnd2xC$ZeY2C9|CAB{QaBo?%fSr4`8F6FGYhbs$6|0SG1%wU#Bnei?h(yAD z*I7S{C>H7cvnPI&un&Ntl$_iji7(K>w7(Q&XTLnFJdO1SfXcXv|95dl`eEJGpl@hC zeq8=P`yPhlzVdMk47Q(vED$N~2A9YzkmW}d$0C2h zKIGnW&To;i`Bt9vhdPu~KQ?gh$Zt@fEV$_WvUwwU@*WzpinR~_NDSdJ4y!jU;NG6p zJpfv?{Vo%QeUqx57ruja#i$ge77#O~okjK6gBkqvk8dIu~oF9;M>muZX8QVj^LP`8N z1ON9bp3$ZHU~}5~@s@#UN)sxtuog4_r~geB=YNMKM_&2>hzL2jz9hY-qwlMbf|X}H zW>n7Y6(|LuJ6Tn|zkOxkH`($47?#mJuY%QSj;Oq2P$N7&EBF5RHlmlawJbnj$+Lrv zm?`TnB@N#jxrSL;0r?r31NxYH@CsKEf3N5fPM~WVu*=-h)q^Sf9o(bxuVS;Z;llc8 z))ik2B}{iz%L%2`b4YAz{VFy*l@NKmgkzEW;_A7%hG$UX5e8z*Sy`bFu2f*Gf;+2H z&glw^9#hiKc*fvH1~|VS?C~PHv+ORuipB}2vVazdE;s!M)oK`ua=yU{RU)BLQIqKH z$komOFhwb7cI*^5>M)(M!etY~lmWQbS?VFitP5#5hQq_t!ng%z+2)4S8cJs@Ej_87 zyWkk|PHB#P=APdRGv~?OOQDl%Nt`+JIdl<)!~#YkxZhU$E)RdBw!hp<2mD(!J9ZQHXK`EBLRH3 zbeLM7Iv-WbXlG+c8pYG!nnX(Pi4u%yn7GFm<;xI7eJyQ!k^tSKfY?1aw~?bjpT8q4 zpJ{}J&Oq~7!?Rn2ZAl8B>Kt#`pU0x`vI^g9OuqCT?>RtAh8#@{zbDiQL7|Gef3?7c zsfa?`bb6ip0-Rslm9{zr*TcY$sv`$_%VZnK8Rc21{{j}jlb`66i|g(N+z%@qwQeNp zshb`kV2%(Yifd7r=lTxVOo5jX6+2G+YVcFcq(v8*I}O&_cviF)fq*ObN$*-l0&D*y zQ>e@0#TQh51}0ZeeR2wLSh=*(8_$Ms)09HIc(CgU&RjcIIF6pmSNSB85+8RvSrK^$ z{bT`?>G{+1J~;}&95GVZNHi(f@aDIs+S{5M)vO77?I|u!FLL^?!iDW5dGR=*nkCdh zO}ISzx-uUz7%KKRf$1w-{mQ{tNqY6c*c`mH^>T*BN__IxnAC*EHX5M=7)>u<8PD=IN!|T|m}G*y{%V9M z)eausSz$EAvkG~dnLAIs3{HwM1BND-q!KFYySwKSykh9g;s$oE~`qnsJYCQg6j zzDD8!kS6nD1mf|)Fn<8(Vm<)Gux|XWkY^tNlaHED>1Z*S_S4L>XRfZpW^p3-XVw*I zB?hx)cGN_cm=723PzW^d;k)j+f{qCA_Q?)sIXa^|o;F)W5a!bNJPUXvB!=Dn05IV> zS9k#ICY1=>2>ALfJ*i$;_bIS*+aNr5tjHcrggj^`&}hzYm$=Br%Q<}w1IQ@8mPZ%cSgQ1i_eb*o6PgdSQ|$LH=S z124TM#>rz3D58&@1=r;0dTm80Uz$m@l6+cJ1)be_vFYwv6dSSN-W6y{GcE>Lt1@)% zR;;V5A+UdhK}x`bjZ~0iP!t0%sc;Cd{Qk4NxS{!#Y z?YSb#EF2Bw?K&;rSjF|sRz~;atr(0KmsCE3nE@cn22@Zt6`Pa@>|@v=eD;jn?pn9z#U z)|z)I+(~&_jm>sV3<-*F1=NUh-&~?>aDCs179PCOz{Rz;wqD`xSt@g$W>?llXEE6; ziiQYNfC;Wxp5$UkMbn?N!XOJ?-<$#8#cdV_vOn@yT?>7=`ffE;PYr348ceL%!>{OB8^!YwQofJG~=cDB9g0CpLRd;vH znbBkZn6WpwHZ5@;TA345+oVgsM_AE)p5DjoGN#GiL|3n+Z8~Zky=evAY8tVqQU*4ccVKD4c5b|M>gWl8&f5sQ9=6}ve*kdeLa=$3nO>{9 zg8Oc6WPg5yu*{vh+^&8GaSF&Af;A z4ixp@XXR)8;)KW6H@JGF?Kde2aV!uNs(bpal0){xdV~)EQ7ga@q)X6*=$DsG4}cPg z13EoAeZqx-$!U(VQ4<~0F4*F8W)x3;>6UB+Q&vYePI+I2G_el1g0O@xai2)Nicgcl zHG-bsg0kO{OS^NtF!XaV_Z%zGhL-<6sG*^TJ+|u*W7Kj0opjMFiPC9;HR&wOP8OZZ zh$`2{IrKc&cY);&rnvbaxB0S8_=h?mVNdyhvesy3MME8b<+I71M{cpplwFEhR3^N| z8!1=^juhU^n^(=JXb|T>Q#xdKzxfAh3y`6x>{4-cVt3qbC#=g$(%^mG@jOwSItfge z(1(%){VK!a`t7|d&CD9aQ{p;#cZLgbQ%U`S62;MHJ*?Cw*LGWVB~r&4z3(9C#!d31 zl3Dv2-jjx~2)Is>mpi}m+a!i~KYSqTS;z1ns3EAVtrf*ej18Air@ezsq4%;yXmQ8g z4j0kVPqceKLFpADAjgEB6PXp>{Q%;RfVQY+f1PliDRZi*b>rKh+K9+fs~<^`E-mln zEdLfDqg$*FH3$RnjkVr`L5IW*dT%{{w)352tWq7*~6MXQVFkG=}WrQRp$p^{8ZA)Bsh0 zr=b8g-qVFoEDB#%4s(9&{*QG)^Gj5ZcuYmcZ1xuxt)jX|Q!rPF%r0j&H5`m5qPr=; zE0b5fsSb{3SgH2$_pc`nF2)RQ^+%yS?-x5ekA-KRj$2TmZ3;dmm&3j&b>#o6MA1oL?Ecd zNi&$-4)sR1-B1i~S48y>BK;!^Ezhz#&gDEPqow<6`<&N^EA!nKjsbi*~_MY4UEWI0rOMr( zNR)p#1I_4O54aM9lwl>>fi3By0Cn#YSNGh(lEs`7hrO7}!E-BII62?oN9g{5<0nL% z7+dUiRpw)(h+ZW{;;ZXpKYkOP=gP3Ef&);CT3tT z-fA>U#baaFPDyxyP~TXltVHe3Ekc0VH;%>8#D*V%zx2YkRH_sp*`w)~DCRs6b+eF^qy zzJ0szxAVr}8tY@VLsetw<65|kFr}z%c)CziP;;~?$a6wEiVa^$EzfvhS)}n=3En*P zR7eU~HriaaS|wMHD$X!=qijfMgW3v4+?H_G(R}+#FI`tcINp58g6iEYIKvYZ_Mz{c zctgzX^Ur6u4E2Ad>1I(<;VrzvgN$<@05&pK7w*?@KqcoYom}&{uWMk&2qtSs4eQ4k z_t(r9%m#*YDJ>c6oji6CyC!1(pmzUG2|p@1m9v%H+Nkk#7s`zLqyeCB;=$;eUv$1! z!?<+gwJR*9Xs*|`S-jyjT)RIO46J(B=LW+NsQKfX_+y>>zPWg*`RvY(7U*Fl0F(>i ztwQdoNH9?b9Jk0{bt9N9ODeD{uINmhcUzldSMp(W;Drf^!a#rdE7n~~@!gt;hFH~>pvZd@yLw1lRqos-I#cbsgdCw`b>p>G|o4viS5vNor+lh>WQSA4|PDDlK zK=aSma(BZth;gqnqg>PI$zo3td}CM>K%-Qw20(M$_=1n$T5w$)OHyD>#KKw1$(}hZ zhsHyh_f0SWeJI%ducjJ)(UO2MA$DT}E|VK5)rv8UEb{664hU}$uS@Wyquc}FQF6)j ztE`3wZQtqhg-UyknEpO1LJ|zg7RTPOcSI1a3 z@(0M!MMd&~rIu8;y=1Labb6T0t5Qb9kL1v1L-SNvTLK;l$Nr@`fwkMfVQMT?INa?> zIU~cFZ|cyIXwaawLKPl(*3Z_!Vka06s;>j35C+-dxX@};9>jym1uEd z%8o3KF#7h|jPNIrh#yz4o0&1n2wjg88XyB_v}bhg%J+fZz_&H;_>c@`qeZ_dN%xw6 zPC?-MtEXlt4dtg0SIPk`1iKS#4^S7W-|36@E$|St&(Fb0xh{nOGdQj;F#4&N=Mg1G zl*h&Wp;WjRUC7P~7XC!*vg};n1YX}a9Su*jj;2gl*KU|=Xe6J%-?$qG7z;Y8WgYIK znrFA#J45mjETHGLf^lHXzM`#>t$M3B|EZeyrvrPK4fGe`Q`b0K3xbeL96IJj#TXr9 z{1rrW$59o9IaLNmT0=ZM?j%kNi7T&>_b?0e^Ec)-f-dR6W(0ZWw4%B!bi1P4l{&V(5DPwvJ@nl^6lI4vN7 zOGxnYziUJDzddi_pW*+%-XmXZuXN-!b-9d=Mo6*8oJ@U@y1oc_Pw2MNTx`i5e|AD3 zpG=Lte$CQRTf%tSCc3)vE-B!uuWU6+CI-T{z}LrIE9$U zExISN&G~#xkzI1L-a&eUk|vmc3avP}XXLE8az>g{EioaZ1X@IT2 zFkPLNZ?ThY=_{2=ys{ugX4nY@11E!U+5vDG(;!J$VZu}$YOadAX7F}!B&&&1Pv_%B zf#RhhLaLmn99HRJ=o&AK1KWI9vm9fH8iPs67)g?c>!+u03{Nx90~ZY>J7f2uI8X(( zpeV3Gn*DrW6D}hbVo3k&hi1vge=wFLOsAteTxXj=`Jc#SpYb_c8|29 zOusu9xP6`@T{kMu)uYJHPEq=eybG_OVA&S+bYcuwqk{Xx41qnL+q?UNN$_{?b$5eI z`pncbZ{Y&7xY1P!x&*iG@S3wOKiNty0UT>};5YmdDDFjR^v{59hP!>fWq-zD?TvN< z{;w6>1!iR&>l$QlwUU@q`W*joo<@D#L+ahvBI` zwgt{Irf`K(fGa9K5Aq4KV@e}Cx)5&x=1!t|)!_6#7lU+m&uhYgv>^NXR-qduxNQbx znWMO%!lE6ZetU??etCk4C{nSA2cHP}Ac~`=ZPgvc@mJuCt?UF)%WtBuf_drzFfY_h z0CDZqHWGH6UvC7Lxb(sYcmus%5}1u*+>X5>zQ%M2bAk>V*FvAnaCL#vwh|0To_oi- zr=WS-Te-Q*)fo6uW~J9EVtRDlkOE6b3R4wtBnCF3<$5ESD3phYpvCOQ{p60qLkjc_ zfIxjolI{9NY+=TY|p4y#3B2gjWG6Th`jiGq)~XV zdj{)XTK8_v*eQJI8xaHAmz8EtD5KwUT%d#L%KZxL)4m`mOBj2^XpOl5$z5|SHdMo~ z=be}}Na@tfMR@e@glJ*Rf>(BLjSKWP54YJjm9$zNsVER?$08Z?H==pJk+}&b&ek4r zzc+WX-9PiDHPf6LZrH{L4uu{m^doI0e$?>EZq78wYMZuli^(eO>nG}YZant+kXP_V zmEwpwNGNnNa(lww77AMXd2bcsR!j=V%tT~AKSN5x(Zc(})l$^lHhKd#wKzVde5hLm znML!6A_HN{Vad!o&vBdkiFVre1A6T#f%rRvvTjCooVkVd5ty4A@lWSBw90}_{g^Vm z-=Y+4N_yN{8bX?Lv=?gUuZn525lxgxmhFmp9h1WDrGlR$p)z__#GzrS`C^QzxK9d= z?4$5PPw~)yE*OIylYbeE`t+JmhKYrlI>DU`^nv?8dCa*3V6CjpuleE2c!^n6_{j0R z78Yl~GFiRzkgMQC6+p@F3PtAEAdR?J%9lS-za}9;)^es_9FD-GJ2`dPU-DM}n2ea_1zhpXqf_lY9eXxOYO`;8nHxu)450KF&09Zg`!UOz>yz4L zu)&)K}*sykIeXA$)9Z%1sSgJ4(`S?2Jz2&jgYk96B)8khmsmC&s z<{xZIs)$MC*FONr|ZB1@>&5)%}4xEd)MZaw+C?lg{JRkO-3 zH0oF1h^*Ql=ZpCM<&y1>mnn6h#K0bDmf5?Lv!rp*UZ?QXf_<$wRMvr zjk1f{jcsFJ5^bdn@ae*acsHIx+`KzA(bACY;;4VhM&uISx=!6t_=18a*-eD(a8-x{RxVN)Fq}%h_4v=*I9!;V#yV&T^%o@}MlX?Z>^$)6m$V=8g!I+1}1udQ4cZXmNrQH?2D5TVCf$mQbG+ zU9sn?W@GZAm(&7R>)B`+!jVx_9spli9EFm{I|ibPg=QyN``4?^K%c{dTln|B9({g! zHdy5)k97cHB6XF)%Ck>LBq*(M#5Gw{HbSE&c*NRsFHSltvf@e6V0Sbc8eN<){-leX z0g^mP>iM+GWUY0GM~=kt?Qjd+2L${L>@7}Zzny~z04wP1lEgIYl1Jn5X4JNqi7jzc zo};5PVK-rZXNxWGpy2t=9+10EGA;dbMy2NcGr1im(XSLKe3Xh6^kG@DWe6}OB!P!} zv=9&bRJN{(!BdeU~?;;*`9K4Kbp-XS;10*rwQJZ*pIG0wlJ7+6b$V1e^FMBLi!npGG+F$ zXEAjHaf$q*^$m3;Bxs=^Q^uOa!4%v0~GWiZ>@EAfngF6X6Jiueu zriaDd?i>C3G@8%0?xj9~-f(3fUVLzI8P(vfX|%4lj$-sS)7$iKs-Jv-Fe}jbu0KFNKmXuuiLH8wILE&z{DcjUYPuZ#Qjx*W2!+5sr(q&J^6*-A^Z%kirro3qa z!D<%BHw;jAb%K4 zfI5@aJg^b|9z5sX%T@UyB$B;D8ir=Rcvz;O098QXv(UkNSD7Y~O@0%%+J?%+>FkI; zgGlnL+5t47Fy#qB>ioH_c^2tH9GNP@T$75vpm=qLm}rkpujNL9;3ji#NZd-~+s7h% zmP?U!&;8oPJ5{B|BfN^&{ zs5SEC1{z$bZzb?z=Jnh$(MzaspMtV4C@4sD)l`K6!L*sIkO1F5vmgBZp29t6+57P_ zWXvlbrPAnm`+eT6ON}rrsN{4@gK2I;DnIUZ4R&4my9*&dq+!Szl`ju~W4xIA8k+kz zXF{Ss62Bh-`qe7<A%Z`oW{|7DqkFx!<@&6HN`w9C`*#DoZx1R#{ z-z#t_zb#q%KQ0dcw@a4hZ%bCw|G;|qQ(*pk1qLxwV|H@Q^NZ~b(BO9D%MA#!wQ`Fjo+#ELsfQVh{3 z^{7xDz7<0Pcfid?K653JUDC>(=MPVoB55lU&_$O_Pr@qeN0LJ>jQW-qHMGhK3DP?1 zzJ;V5*_j+kOvL6GY+ie5*NGqGv9UOF(E3E>x^5QM3LZ~&VZ{}$M1$cD4t&4Am*4iZCO6IWorS~ph#8VOvt?mFG{FooVKIB>*_tlIaPd?r5)D8 z(4Oe}xmXP&rk=1-DvLP~l5zfe*@tanw&i5jCtZY11KE=5WkRPGeRM+r-+}t+0|0~4 zz@Rl(HorHQ5UBQ?`ZKJ?Cc6T=j1XW)p-+=%v)EaF;*3~TyDk`?^U|=Y)*@v>zH`Os zv;EHNl#BqO?T+`sOeLAk1{L~b6(6%DGW#0<4J+mdOc!2@=2_%PE*fwbA-hE`N%h~- zYNO>e)T8J2R>Q_XF9K=-;j6|VoeIZgTmEsi-t)prGnIe=m7_1bjJ+UwUcpEXh^sue zSmUDI-L|CL+|WA<2xKZ$%>=z}_H0P`WY`I~-Fdkar_pD7z^tbC+(-t4(k~%(e-Do; zziM9RQRDAsyb z93C&{|BsV14KHJKYle$CdG}VrIy3UJKED(7RWos;dU{JQ(*g23Swq#Ani4gO79vS)k<7z3$X|6(MWj%ev$spJ)zv33N6GPiThYOZY>ywXpoe! z_MY?spbk~mC}FZaPd!@c{mqs+tR1A97DZN76}|Ko8p^3GkK9SLyU>=f^C%U53tU`* zy&A3ib>!QG*Q=3qS|daOthb9UG(r~WlqKo4Z;s}Zd4l&Utvy(t0+YDv!uJ{YQrPi| z=f#aJQKPTG=m?4R*2|6T2U-y?pwE#L0zXNNhYm5$2%k^50v4T5*ONaLHi;oJQMmspZM=RHyTvN2^{`N7Z}y=U#&$o0ItE_=-2bMUf--jHX2 zxOTv+z8bNX^=emiye)o-F*k5jQ@E7JvNrCES_|z3LeVH=S|$Lg66rDCD^rceLgn-$dmQYUDJ)rStfS! zu~x4*oaKh&v{2qhT|YLD8mkF&i>g>_optU-6BwxjhCMy!2Q$0@9aR@C^KR50#x_Pw z@9rAbeKf#fV(2CPM4^&t^L2&MxtmD6x8wuP){=6;^pu{gSvjZ{g!a}bYU5=PX+o$S zilmfbzpA|Dou3Y(z|7!1!c|5|dX3(*&bpj;REA@W=qxHI2u&#ZBl-h9L=kT|juENGY}MX&oR~{y1FPPJyjMQ<2aLysHUH z!2*?83ki=921zU#U7%8l8!*X6Vm^}Ud*?}_oQ>;XdJSsQG*_nB54(eKSMp*maNMGGm60uEs9|Yj|+L2^h znzgktXLa?kZb%5WtHivPr%j;@>hUVkF}j#URcT4qci*RKPWrDt8&U| zjXbVfZbq;~A&=&B{~*CmDw5q+twk?@Jae$vc={Ulz@{+Gji!Im?XzM$+X@&tk=W#r z0IA*-MFj*EOF`^q!hXxbR!QT3^f?>30cQZ?$4)6JzMlpt>2 zs{T6Wx98LesT4}n%Gr- z7AUyNI|6w-K4x|chr^O*1URezBATl**WdIbJPMk$uE}wxv(&9fui^+o^SA)iz3Dj|Kywb<59(mB&G0eYu&rF3{Xt3+cWy=3ELd|7nn0b z+xBRe*?Mwcy>N1Jb)?P5vEA>YaXgl&WvC+rG($};DB^F?+tH$fmlzwY3wo`yc0d~E zbZJ%~Yg-iS<~@@#5agR&cif|i9=UbydJHO@7zt3iyL{bX(dP&j+D(8xrz06YBEjZhWT@crPghx3iX zd4|4RcvP9>IJFjrYLdMV@E~DLMpLxX{v-3spfOzTlaB|b^Nh0)yy@Zo5 z>cm;Uft0*~L6U6nfYOr2JWW_^oOlA`fTXbMOiiA>przG3%-F41)~C7My_{I1g!l8I zrGx<~Z%RsJ`C(n%q!cBbz&syVQl;w04h~%A%pNIW%R}SF$F&`Mi>Mwwt!2(DY+IUQ zBp^oP8fYysTml^{-(fBrbfEH_FWqUyJXgnWW=tPHd-sQ zOBOqQYlF=j+;|>jyc{Rb@)fM2W2qt=Z7^Sy`<6fMS?L*36k;eFXmsL}Jv~&ccaDKy z!5;~@l8Y+cdVTB(^Q{oQ8SOF5nTBWv8p838ozDtzQgE9`Z=bmq&J5aJV9q9YlMCp> zBS(FH6^<0sDYofTS4X!144%~BYgCmQtgs8G0yVVys0gyHu?Th)$PD%sRq}5zVL)wJHF4DA!h)>0`=n=gJ{u&0bbe1$ zi#j{;OvawDQ0r_1!`^bV34|^lo#vI?iuifv6HCfjd+K;QqMY~U_9NwK*gW3Ma3HUR zlN8WYmk^lc*IHd@b9dMwwE~U06nqlyLal3a=J4Ij_T4(3p^W5cUCwSAa%JduLN(#a zbl334nJ0>qR1xvQuil`cv4jcrPTa~(KXBAqr#jrbp8iJe?e^K~0RYA*sE0G1OU~S* zBJw5(*l5F5wbG1{vxFPt*^QRLwBmSPR;pCUS`dWL^N0#Y&lQWterNRd_0FB2-hk{) zTU~{Y71$?!3OuP)dn1~tt*y^48(l9R>8Xz<;aaIICHD_Q!r1+ny^>>R7N?$->XqJM zJSuW+#IyZR`1ARrYL!2TumHQzjWHoM3P$!5I_7#Vy%yl}(0 z1?K+3Oj(cn1V1|zw}tJ>L!<3%-Z^}1j-@s6_%cMUdBQy0*i`UQSR9+ofbBX&g$ z<4|RZH=DBx>W7S<6P5F|I!qxM;^N#_^15zNlo{D;mvtS zbPOykEvsh+kHiyYbu1ITtwfqJ&6OthqouW&VY=8(h!t(18!%6KZ5M@XnaLXKqnWJM zZH1Uvp2+Jg_kJ{|f7Y4Phv$>y6xitNwrK4E0CO9TpmJzev7A?8FDQ17 zjGS7EEJsxtyN^xUul=gi?74^+=auLp%pjK+F=abQXJzO54S_E1dE%?MIGkbKZYqWS z)`V4Of>_w}P=EtRzZ;hF)}4W0pWo!#z4UTPB|65;g7uTlkZk^)(l50VVgvm-TgilV@o?GE0cXxBMyiDVsBvIMwIFGl~`~gU+P$XvLvP3gauEPZE2C0Ta=r zSoDyS-SOjzlu&iYhc_5dPp%xZd2Hy8k4jJbz2LBBY^$#WMxQ(4kdRCkmYgwZDwGbp zc;^+q`e3t{;~rpH5gVsM`QqiP3?v1CQ|N<0mm+5=8S?Sn%A*Z4>yRl|M4H5P({g-?`l)3U~kUml06e_*BmwA#ijMrH2r7&_@A0rBG8xkI$m zvEWey@iIOm7Zb(oIov)P#Qo^D0jC8n(G7_2%9-kQ`;ZPm|*LOVMwFB}(X4CFvI6g*SFj6{`jdi4C;p zbzauLe3QmRi514W$}Cc!T+^xG9Zahu@Jp@&Nx}8W1Ars-C=8-NEa}Xbx~depMVb39 zSYYrVmT124h?hAL$_fIkncUKyl^ik2@{Hn$4NIj!fUV6^ebnCSn@;7(+8|jXl1Cah z8N~_${IpXfImj&UUulvg6wFy3Zyj3mk1q?g;4=WZIV@nI=BKOF?%XN{n2t9hIcRBjqg zc4dX0gQ^SV6f`^>NAj+}$0kH1OGf&VoS!FoKX-r*Rlx~G;Ci4Sw=Bs{KRrga(juD_^lmIg^-$+i(10-VEg`8quX&9Rfs7u}OOs=cx% z-llC~OzR2_+zCHp1hHeA;y-QQmHYi!2BAZm-(d$)5s;z`GjO1oq-v)k% zwRs(~s1tKB>}gpI5R6>UkMM>*VV5IptJy~&rR&BcyPk-P`Qm4C8F0QnXBgfoCjhke zi2VE|q;E0Q7|$`>n_xCQc|P+vGn5q7!(%JuaiHY*2zbX>+C zDajAb;t6@-z#y1qSKjIau*?8KE}*A z0!HR7ri!Ma@0(eR=~YqefBkmRJ=>$L4cry9R5SW6HocI8qKhPtsf{qiu$8gw%D{st zwk_Pjx-vcWC2!-iwkER5G1vIRi}P1QJB}267cqkNw)9>-iGJ34N@9Rs}P=oLU z2}iY7TC9zW&=VnU{7mt5Gcyg_rZ0?^(E`;11iPDQ0)G1PzJ>C7!0WC1@0pm-{)@I= zYBo>}m9QqBVUu^Ad35jZMT$gzeIYMy1LQd4M&bitfzwm@0Win~$)&M83(UG4l^m}s z=%+vq#6HU$M1IDKWI``Z&3E-q?Be_jYBRma)q3+qKZ%;(Nx$DgqK`BGMVMyW*L`3= zf>!j%n4Ncx@rO=H{?KoTJK@O|Fd4^?-C~M0B;RIuO$y?9nY_PB#~0juB43y^#yyEg zNts4cdCiTpBKQwFbE?Fa@>?_i_VqO_)W5sP)sw6VJbIeujQ(!@z2fMe32WnNnP(Vd zV6KE9BoD9>RTFqPpJt05^z^;b=ziwotW)JHTg;T#V~&B_bW@uAC4a|MMxoV;6zF8W zbAOw)aDSpFrx%G`rWgH~cI52s*q(fAMQue0QqQEArUxZiC|f4`MJ(y_U-&C7kc6Eeqq|WOj}%q0IDo&Orc$8 z6&iUinC0Lg>HHa{mCUG;>42=xa{`ek$x|@TgVOpXk@KzuK<00FX7ohddzRdtDC-%_ zXiv+yJF;p~;+q4i`MRuky^j|UOf1|`wsy6}I&XVNvWREnQ->?i2i1yMPzCvpL ztzqt)xf+LruD!Yq3TVpGpvOW-@`LmOt8m;o$@OBDr*%>?8;Bg4k-wJpFHR{WDXDoF z&lToCA79EcI)+NUYKrRT-K_Hims&;{BwtD^wyK2u7xVtdzQA_U$GnUza<=7dJ@dAe zXNX5e;Piq7Jf0Cjj=9w+krtqe$n?39^DPdAoVecL~0y)9asWL4AWG?f5PH$9L6FXvge}+T ztisx}8l(gkjM)up%r4$x8hh<)oS+nghL#(lPtn>s2vDL#Al3b~%v6zYRumE$-b8r2 zk=z{`Ke&ne%_Y5_w0cJv^wx6mciO z=5IK7Qov^g!agcqU42oXENzwO*lUO${VpI-eTK%25*K-`j3Z>U;fNyEEUUL*(EBMg zV$MeX#cUV%O)fm4t)_95qH7i;PjD)x)#moNLH^-J z7)q2KdT&A1@H6f0XR5j&op}q*C#@`RJwljFGPl-|iNa7O>8NY*TW5Y}pki#@u4)qX z)$<*&xA(b>hG#ERCN6EUbqw*4lpE@jD?-c0AC&Iau?`!hA-t&nWT%@mI543Uj5|+9 ztYH+TC`$K;XeCtz<=gLFf5TX*tBLS*#g%0EEUns3PmKD3;G^vd1b2HRY zWZgPR*p|>v2ar&MJ-L#!(fg|us>;rbbkg%|v$de(Q%O-zGARSr zTx)}`heaOk&Qf~K}-%KQN)#MIHT5%FlB1r_ox3%iz2 zWGpD=F%zp#$nD5VgiX#=qy6VIbkXFKe^(`dn&UndkWtC9rj{7#si^7BrbyymngHc) z4N47_%ME#NLUQp}C95%>xfKzehCcx^90f13;EG73vNWjxj$~0M;otW7Gg|1LjZ<9- zxrw)j2~aF?qwJ0;7i?payqrT1k6~ly>T>UItHM3 z7Bip=oe%YHN%U`sCuynW$@gVznr*^_8jTTm2+=c!ugx&OKJ_5R)G+_4vFqldyLg)z z=77E17~zhx>9aNoLLw?ix8o(;z0CG2c0KN!lP+f)X1O*2)IkTOzI zTol{t_F74<$=W&Rp9nTA)U6977n2Z8B$BrBvkyCK6?_Ev@%zSG+p7hl{P_Imvi^2eq*(p46+j(0%Misz(Aenvfa+F*$^SN2VJDDj`zHI~! zSauk)`7Fg}$zO-6G+3Z5W@PWlJSGmGVoO$9EVRCvriPI-K6*~RRipDbsbE@He>P2h znrV+Z$bFPxXdm-|5^{_zB~B?m(#YQkwQ+J%-Kt5>^#&;J8|vt9$@DPesGdBmVu7bu zu4EdfNh{$3s!dga0^q54Ei6nn8$nDwCSo)%dZ{UKc^>qjhW$X3_;rkW!?$$w6gfs_ zo`_5QU}?#NMs^^+uKW|=VUHpJH8uiJKzTHgWS=kjNOwL|c3&ZzKU7?Jn5i|ojN5VS z2?mlZ5h@HVcjLFYYhSNdCv&>^_ku%1XR@I+0lK6~bu{U%uS|v8DzlFuMFzvxc^1hf zxe23R%<3wu=kRTWk5{9#B5ov%@^s`4cCPn-AFMW;Tb@E<7v80rQ*eH}RgIQ25(uNa z&#{-hOJH1L1x)XZtw6q--+$!>py#=gx+X4!g8;IefP0R`$ErFvj5w>y5@hDjY~ zE6?h7lhTx2ww36y37(>q@6u1tx79<3KL2v+lsWqlPi;M$B+MPUKb`KV)Ne|CF)>cc z%Nm2Rh!=om#}NWGTqgCrb6I&S*)DBOFpK-JZ&u=^sPpv`vF8%=2`f`$zY~4lh$z3F@tADF&48L18y;J7$1+|U-eGZ(KwtMTdqqu z^e!BSWZ!TU*v|7YHE2e-(r-jOwycY}YPuC<;0qkt5B!M4Z;c7%30bEhthFkHFM9~{l zj^0c$GW1aJI?v8TFjmcA5D?6&(Bo23e60WpsCB zWZ6A{=b>eO-%3uukyb$9q;}NskQgb_ln22%CpyY)>6`bZB+SV9&GfmE?%HtxyR)qCdHx(`T%-s2VuDcE%&~&t~Vs<;7thSDOmq0GSx3Fb6 zhUfH3W=HD-{$W*(<~^Bz2S2p}*fvXFYRlEsD}VJyZWmOHu394?t>;v#`z>WYw`7zhWqIgndGBy`dg0bd#3WLNG7d%+%$F z1K?!wK5BBnY_e69^=I%t4x7?*I|k&{)Rm7R=LqjqL+$*+WX4sxMD`Xv(cvkF+lNiJ zh)JyzXMvU6+Ib$?dI|d)a6w->(V|fUC09LVZ#r8S2PgN8bCSwe~W|!W1AoAH#3TAdxffyrajEuaAcb0lnRlB$6RBAKb zwc~Dm~;vEB4 z$^7*zB{3y!cfda15k)OTpgub;2;h&t(;Li`fKld^ADQw3Aa{&f=qN?6jnNI~$80w( z6FV7|?lnQ9(X^~f3L-%q2s9!5aY|ul!R+j`4D%ZnuY&$I4qumd0D*T$`Z?-c3hXml zu=&25q1Un(6Qsc}n1nE2prO?c;dro&!x!#JZ$IY-@BIYe+?$Ckvcq%27lPM=vtsq) z6i7tWK581vUm-6Xa)3bW=v37;5twchuf8b-1-&K^Z3TF|&rpD0B|KDW({d1;Z z$>Zx~TkOk}j?v*fOP=6j39JNb3k#a1x%X^ef<;}(d>y8qvu*f;*6@>oQk=W{kqn1> zIS0O0w#CjuB1%mOCvU5CT`CcQsybSW$H`PmPrgt-(Z%#nJu7-9OqTHcbM-Y1zgopk zvP;VQ<5}9~2d#mUj>!EZK~qzDM^T=Wxg#2@Gq%^G=eNCby(|ldB0a|~_}cTA@cR>` z5i2g#z+w5Pg>$;HR+G4Q-}oA#+Q_lT9a8pT)f^L0y1LK~3I=}I=5<)TVn!D5!N4;e zr;tfj>MVD8ynOa|QjWe-GQ_2#-(q04B3&1^-3TAwVa*kVGv~3JkJ1r80yx@I^(7Qb zWorj)LK6avqB_>KjDGq+dIA30;}9$$Rn>GToK$4t5txy`0Q5GrV%8s>ke$%hm^L); zfAs?0c*p<+jc;+XNLh9}`5>r#as={x15(Bt@JQU%to>hPro8OXY>+mhdebP@=ajT+rw%I_`ZdyyGZJCDg? zWktoknla@I75U5!64b#g%j?`6!-p+JTSr^Li7gdzAon1}DXRIxA#^4n8umij=%M83 z!ggYELY8fQF4UVO$?J}N9o>3a;#fSA;T7+!?0!dV*kb{mR|r%&AA=wW!o%;Q|M6EZ zU0eUs&YZ+@b%9Gwa&C(CU5a@D*H?AfDZ%UlQzqb|? z#OO^`y}tJ<0mz^ij3i5PQKH=gK)uQ05d{Ix8=tiAJ3c!(k)+n-I^-H~Rvb`XFx?S; z4I$6Q+bFBZJ<4F=ks8a~xmg=xw9H}Q9uJaNIp=CVkeEB9otMMH6(i0!838(q@rJ0c z`v$Ae=g+m7la}T?qh3of==!?dWS{1_@t-Ii{sf%I>Ax6VF4Ns}YBwV3+Lp7rUC!DCAg_1scNaQ4E$i4}(Wlj5Lqit_}T&BX!Ni_kGli0oVgX>)f+VmU1%F zK29=pc6D~744}Z2wIN)fP9isYP=@x7kC)7uG-gIZFj|(Ap1O5r*;Gl6`_ZZg8LsfB zvAFpLzaJZoqy*tDft}6Ci8m_J9P;_v{kBZU<+H~G(Q2s)bd*MATiW_~(1_tyeS)e9 z&d|>d>RKzt1bS17-PhY=z9VuO_G3ey8OojgTBV&#Q$EL`wF=eZnn5=UC=aK(Mw(#JCq%wsw2&cW=&`YR$FX=5dCa zzMlXlU>&B(vGicTUbL2naGIm_B8X(8Fc(45DJfw2&ql zeGeVMwi6=4!Dio{0y|_w7PfCZ{&j305hH6HEx2R2E){@W^fn*43q4ZkArHWP@Vy0` zGj^x>IgArL=mKJtZsd8$ECJ*`(xsBx&L{sS6Or zO!OPw(7g1w_i?pl($EnUF|9zvrzB_t*!$|Xk@rMBysuXw)~p6?$*lelGxA?%85Oj_ zhR!R{-zWpuufADXS@&fD$fs>mH48_?NAhM)U2nf{XJlMyt={Tj2{Rl9?6w>o5N6V_ z043cioh7brTMil4XfiYp5By837)>UboKxgOlZta;r!Yr?`wQ1d)-`@#*YMVO%81%h zl{#omviyn*g(3xQ_}nw>h3vrI6#96FOpc~dg= zS`u;(jcR1$qjJ>8NfhG+OG1E4pN{1CM*F^Zgxn!4AoP>fIkxD^ALXV9uck-+HT{Bv zyQ1p%deHDKW4|tDmTMlcUN4?Pui$3G@ZvKu(cX`71&+4RtV`VU_6{EY@Ke0(UZFQB2--s#}bZV>9r;B5J_ex_x&XHD|j!r$9%z(bEU+&wc?P4ag24hLsu*g+oa8` zANsK3=>pm73?L&L(0BWF185++$5ebJwFX~Im%~_MUtc8PV2R&qez|3`CI*P_n@nE@#^vCq&ex&c6Yo z{d*-a)j=Bb+gr-;q}6(%?-79wt8GAU=sV;;&FZ>GUFmFr=q&u7Rpz7%Ddq*-q9_;eZ>b#rY`A9RQ_Z~c} zB5mP+z5*@tMEu4(Bytv1=vc1||i24b5 zGpsph#o zwe9f`#@s9;i{>Q-S5vJxp+y6P~Kl~N{jm?x5oNcW}FoRcu29|j{ zBA$7sMr8>hVD~KnF28Nd=GTXRQQ4ov63NjlZ-$QTzHfwW$cI`4Zmxx`X?ggI;{G;a zX-7|MQ^RMfG*a$w*lc*`H+Yo~z87pFrTk9sw#63F+ZMUK`Ec5kFi4T&Hw}v3)Qmn~ zrr$ahE}C0_PcbRD^NYWXHw>%m+As=G-Zw`E{kA=S*p>dIgTH2BeBm-t`e=4m5)(+5 z_$0b5={f42-Wf0IqK7(I$notM7ikeDY0pMo6>mBx-|=v!5XZKF(u4mBd;RS&{);S| zee*`dg8SameTnBw4fc#<*h&dUm!%xQ^tT<{CT(c&BsHyVj5iFB!P>WbsED>L$yHQ= z4SoJAuUv=jDS21!rd!@+^`8hfp49LT!#I6^CyJefu|{`m!xGSz(k6T;OXv%bub3IN zFlEwVb$=LW(^Z1MrVM{Ilp~|6nNkk>Yvuo>ABPV#myvmHx+-8H;M;LKwu)r|=i{6! zF#)ZzArAjda9-0Gv(u)E?p6YRj9P$pLqnOmK}QsQU)*9`c9rKN0z*FD&h46G+TXTT zw&X?4^hQ6KzR@Rz-G}Q!_+|yd@wBFv|2xc+zjHlT^O;j1T;tBfjk#@KD~^!wT^1mU zKYG5B`PS$>oaOxD{^{I@=M`3W9n}IRDfZp_ldgjic|SCwbNHl_n7P^G&874pJ9R&P zqgcm#yrbr{6+Ac2DV8N}Pr>gFA$4;NMD5S_lQ*{%ar0QTi`Was0%T6U&;3rX-UJWA zew*pvQ_r~koPh$&Bv43N30f87SWS~|BJtu>35Yl|w0`TN)U#---m0uSf19v6M$x4s zb|BwaI0R$ku;}e~{K_YV4`t~PF6m#y4g&ZRl4lv!2sgQdtSYCKoS!g-66f%n_lV>u4wk3N?~J-Jl=|NBAd z!C&X%e;jUO^zLBlq3GGRK^uGaV&5+j948+3!$SE;H^0gj^}5&OOtFFdg{n4Fo@R^&hLlc zLcwWL`mHcDT`Vog*Bm%y9n`$SrCDj=L!TQ_RXq!5CT(%G> z=Yv@O4zi>VH7LGDU~ATlpUyOF6+@gcwf7NtQ6N;uB0-;nSA5UI|3)bs@bCOUUSB8g z3G$Rrb|+$xBww`}nD<4Av4mS*TP3Gh^yce8kFf_WU#c=h)X}Hj#~~U0vSbX5d*YJ{ zHFyhe%ep{Ds3&z_0@MKxvNTv~JRbA$hOXq0^E@+ad%D>`@F!{8uXHbcnSYxJ8!K~m zL(Ctwy@SRC+Q^ zBndG8tsBk8@zXhBH^Y`OW^0pL-ax)}H4B_?e(tyQhYRpoeLc7YJG8UFfL}O(2di{Z z+Q(??Z}cMJkiR*o|4!BVKWR7|XQb*CzstIj z^5J>DeSQVGuM{-expXuTQ&ZBJnc)nCqc5}9#Ym7mnC~tka~3{@l_g`^itI++RrcRV zb)I+??=D0j!kx@=!To}oL3c6}A z>t}wU;vPITU%0eY9cuB4Ipxz`(j03`ef$%s^w=p#&YS95IXIp6am-4lu^`@oRLT;N zPE7%*GnO}g@Qo;7O(~erBVMc(flvCfa{*TZznOIGZFyE)Ra}7ynr)AVhD1*STru3j z*w(PFz6J{qsHL9$C^Tk}vYVLvv3p6b%&2)XpRzvB18pti*NAF+Iy-W(1H%x~eo~9& z&v!cVxD|OeNMvfIJ4cM=-R(tS_DvTO=-T*HnGD%%ujz{uf&_7%`ZCIrkrB@gf7xtH zO_a{bbGG4g0o`!f)f+L~(JTiMFiEmpjleW&bc{-hTS91*FnGqf*5oao{ z)*%eN)Uk21)7ulS2JlLQw{XdU?PDf4jW)7;buzrEjU4Uf@qL8pW(vN@KEHW^r-)oS z)J8*jx)L+Tm<1hiY9Pj(wx~|n7klvSqgs?l*hg7#=9UI)^YGisk7ZJuU)6bqq(rlK z|H!J^xJ0!{_L&48^C7(C3VWyC96%oPEa?#Ya|v{_4`{-+q*7=olgZUJI*_}8YLEDv ztx=t==s_w`YGJD|B0k!Wq*81jyM;V7C0PQp2f+kY^`MmR7%zFlFrgfiC`810z;9cw zjE`ows$(FvGw5yvpNvKvc%RGBT$SFrqHo#mls{X3Qs4$71IQL^X>YZX#FRom}i5DW$v2!t3;i)(sa?EUzEeI6fFKUmguF zGgCvcH%+w$*pQ>s33WO&Q%pjC0&w-rxp_#&$G_B%+LX}6%)dg7q;bV0iIHQEz!7j8 zmfP$0_j=7VG2$hV4XKbb)sl=eM2YsBu@75B%8+ZZ&EA@bk)|!l0Hbu0N|Q=IDtKc$ z+lNkuEG4t=j)<-&Mu?2bf{hQP6VRPT+?}hPOr{*#9E_g^UyQldbNf@Cih&ds|2YcY0ZWs7%`K_?$db9Xqfx3t&1Gm{Tym zIo6d&F4ns^p;7SxfD>LYk+DPbn>0+zW=>TlPl=?D1FnGio;%v<*KFI>P6>@)C22Idn z$%}aysM3V47S)WSuV%;BY3vp;vAiI8c$%m)H&kLau}db;-d4!o9ryIxq2q!O8rSCA z!XEWF0&3K!-w9&TK6&w3TL?j#Kjw7W+AXaIFs)!vqeN*Lp+-z^$(qCVY!MDlO^vf# zbxkQLphee5=xZ$CBA2-bo#x5G9S}>EBDhoU;+U>@6YJ*wO%es;4u^ z9GQ0RQV|OVP_PF#+1E+YoNdm55has9fh9;{EuT-peP%%I2*i2S0VcMcsv)vSJ49 zM0U*SFk-}FqOUKPey3CK)%BhIa?OV!lI8}`##!I%wcXm@WW+n8Aa6NyS z+NvKEu(t^=rWV+FU+Rn!tv@C*IVj5R^gaxQy3`3}1Yr)H&ZT0C$^T@ci0<(73ugzs`<5@h@iMSJb&yI>n-Zd4UqU2s`s=%>2 zBPuDpkr;L6O908sS2jj#S~hjo%ZQ$$M#Pg|I=+b>SsmFW&kBCA^CNYS)hemfdEc2<+>`;Aha%czqC61U^Cp|j%`f?*k zhiCBQ>QYe5(VxY*&7yCN*54>Re_Q6K#pJZ3>xQ^a=#nWF7N^w#952U|+adS&34B^F*pl-Xk{*=5A$y;bzp{)?30eh|{ z;Wyu&JnNJ0W1CgSW^jizdal&%StoCsuT+>XYCJMFL@{*mFs(-@R6rOCHh&lV$7`g< zpm-jnR5O(Hyb~_}0=LI-1h7HFxZ#9z8oy_2y2BJGDE^#fyk{mo{cezVEO(7@Gg;nd z&?g!%M_r10Ja_&MW>7E${y1ojhfTF4J^JRE{w&p{4u<(K7)T&cY{7CuXV@9AOOe&9qwIr6Z{$kqz> z1(he^Lf6k`IG&-mCV!`f_#0HFw{5g3?S`gmW}gv9QOU8<+Sz8W$@OO7fH+k;Gq&}9 zx*7q}5H4RjuUB1~ZIO@&F(WwXqpkf!?-R{~s?zEUgz=&glzSSQ73f}(gl9jq+i*=3 zG@KN!!iq6?&oLtZj%ekiPDc zZO2)iEk{crmO|mIc5`+Ckvk#htbhCzQEXL|$ma-)5d-jKy;r1#x4oyWMgB0>sLmCp zK*v{W#yW8_iYAOZ#+;TB73-HmB8s8Fni{E}0A-=5WHJvctlEv#b;PM7{r0mWAv_#X z^7Y6h9gAfl7Y|I+;ZtHvClc@)>!U0Xr%%)=c4B7 zsY<*wT@FlE$QpWZ?D~937aK?ZNHfT)O2&pVnV?EHXo@ukEy2az?W*3)-sWsVSk5Euu}@t+m%{^O@g!n1p7>w23i})mNzG$ zd`VxQqhY(lL#uvnLTK@ zB&S*+qw5c~Z3Q)`lWbI$OWeO<&uCK2#CYHi-`0l-G2P6Vu-9l;rzVVt0+jlKwyynorFX`Q z%1z^W2a(Xj;!(4KWMi0DrGPhM`XF;9g$V5$ zvzX4CL7;PytqN1NjNU)nI)OA!!bi8x+hnMM*JF5`Q3jku4b1uIQ0N}kdNPJ{&$Qo* zl#9S~Ox@&XLE8N&jWLqA36500bMR)tIMlqB{ZShJUVyTiMP=%k2T;W1DvU8J?-gD4=2JJ3F{6vI8}E0NF3Jd>ycbHgZ69Ye!WdNMM~aK zk8%#QD&i$$lzlv4h0=Zx5s5gtaOb^b&3tEJdwd&?aC&C{aWDQ;nMX?l>27n}8jg3R z80CUK=1gC;z#sQlxyO3XQaetTFmR1Gsu#HVEAxxbqr#x-&?k&Kkiym+o&zkexlYX2 z)Z_N^P1sg@F~{;%HNiF}lCm$+QR+)%ROV!ec`4Ql=G<&0n#S=|8b@|nShE;Z)^&|7 z@Jr{ef`-YP=<`flN^0(##QrU2g|ni*W#km(sttn%kID!F1tk<`o`!f|ypSU+x$EE| zGK>&9+15!&GAWu)0jW$dHaJKSnSy#coO%SGXBM`%lOS({3s{2lFxMP*oS5+juoUHO zx*TNbgx8@AAKD_%DkOaHyb*B=C*IWR4I|As=IwIOdiN5MkqLQSJ{IA=oEi4GFkEq8 zJGQVrw2+h~llc^I-j0ig-~K!iG#J(N8smi-(=$L4zDX}?^klj;Rl^L}oM~@#eh7Ur z;2|z=6hrBc#}AYn4$m`Oxrze`f^_HaYP01EX;UnehP&xfH%inz)LDaTCT}ON@R(I< zfXBuZFPleCXV6Qax-ti}+Ah;GSC+@}Y^V>yo-b1io)godaCJ&&k`v#)Fe~y-{q9&i zI|mZa*ru+H;iKRkb80K6^oYXoI3-toGYaidVFtgg95V{9p#sfhX9C~)wl0o6bu$qC zESDnxSpxPRwqbn?r_BcA)sV%ZpdRv_<0l|MvF@~N)opi5&n{9wWH@JSc|?Y;x6}lJ zSQgZSA%plGf>jL0s-=AY3Rx5;jdm^a21v!M1xUUX(C zijjU$39qLYWc@0i-I>#$xixBWSbe!iF@hyCd;BB}rFVmTPz-^ZVi3^jKNX3+MKv-j z^8=HpjpL(lr^^a2jcG)}u{(Az{11&lco+N+cl=R!D{ao>Q4K`54j8H=xMqqR_w>*=v$7QFHSR_ zVDmj@rTPM0!x@$UN7#_N@jFGSCj1XgO>Q5PkZ(a-j|9OHK0UHcd8t6V$!u6U_|H3 z8;^8^liBwa)?h=+Ns%8fEubL0sXLs5q;E&8lNY355Y9{TnktPbCb>ahc5z=0U%vAk z5VeAqH5EvB+^E9(JpYAK88><#mRBBXgph?0f?<)|(?NON$X>#S)}0j+i1^(BVIyBb z7+ZWZEOt`Bb^jb+NBYq%-{D$^EXL&Hre|LkKb+2z#?Yaj4Gk`CT!LXQ4$s4Fi-jQ% zV~r@XUb@cH)??@jIb8OB6TvYb0W%kMW>4j2PtUnkZ_@G+i3oGR<_iP_t`?4AFfn=E zYh6UlIY;6V?atIxXZFmj<#j+wmNU-`>mDS#!PER>zj(78ZuZ9eRj(}jA<+__HVwS( z504I;)<2uZhU0E;+|yocpZC6czsSzQosy0(jIDp57?4UV z#u$Xe@sM=3X-nI3Uv{I|g$IEac%u%{D37!V>-7sVxAieb*2-ZCp7N9G&Coh#<^f@~ zbfYilSP%OWXd?$Bn!qrr*gSN|dqTo*0xz+x{0KTwk&(nA;})a4A!50RTgAwJZr!Mp zCnoU*Lc3;$R!9vGxl$&O5= zFH+x-vE8o+&9*CT&v>l&CMwNtXT&`M?Lgss9hDtWZ+HH&PhgWiraai{lqgv`4~h0(GlO!5>QzC?%Xj&7(%!=<@I!d1l&(FvOA~j@_HU zGvM$oOC*`HV{LOr|gaV%&Lg-+Mk0WxbLlXNt5%5Lo-Z2gU``fS>Ox zycgJVkwF%S;#jK_p%neP`0lJ!YWx)JZAxlV>;B$T_shOv0xk-5=3bN(I;~9ii*Sj2 zH`R7H^ss51lbQQ`^Bu-MGj;UkRxj~#%zXrKoqmh^H9cdrXp7$`i0dE_9+(6fw6&Qm*ZWR(%o(w* zBdu3!Wrswxk;_CN|9{{(oujTns|0@&mTcV5># zYhoUo`$A@P4CrY=Kg|X6;|_0qV*ef8&9uu?QyaV#{;*pi16VoYbjegAGO62b8A{f2 z@QO$zoMxWz@UE+{KJ}U+jrRJ9#@3!v5Behc)G*P?XxbU@`o3kUBR)QY+wJrQqS<{6 z9%=2+k*wT%#GbHV*3;#I!{Gy5zNMeX2Y+8az=2NLR?S{2W1o8@YAR&k+#Y{`!Yzd< zMxdVgEY6^pUFV)YXY8{x+2POm7NetwIjgU^nwlHjivnZhi}JHRB~m}_N@^=XLt&B~ zau<=KLg0dw41UOD);yc@iO&2bto4tQBuE)Nw*k-ZYxC|ujcr>k9OL_3FK1lispkJ# z7X^8CVOytAy{=^ps`hWCO_8&#?kZqp8Eo}G0kz|_uYUr%&+_h^Z10frk1=`y7nk#@#6cj7gwu79Xw-+n6?R<(9%^g8NZigtReG@7dpC}NgJ`)P`)hcA1bz%;%o*J5 z`~*Ox{u&>`c|Y*4#((bYzgFX4v@!87PWhMIxU>9!QxqU&u=rFh*a5ESe{5X-H+kNl z0)stvuE13 z-t~eztU797Vkq>db3b zUwBv1Hn!wT0$$c9pFhKP&C}JZ-?jLr{pcDOsS_xQBno)<7(kw%yF34>C@25V;)Muv zNg#`%`EZbJ)y$x@(pdUZN7VOq?#|>u z??+=+oIoGma|Dt{6688TY}-8o2Iffv$t8gGQ3L1f{cBZ<9&tupIGJB9bQTccj~0!x zSo|L{z?4Z$?-K_s^qg4Q!*ImZWDAxfp^k5$dKwoz0Sv9KWr#YaH`* z?fGj$CI>lO9Nxvq;bf0Xl`etYdO!J~5`|$np|N2dhEfh1S>_}5#}-8f*ZXvyKA^BK zCJDnGEMAiK1v9<0(}XeEdAkvxZi53Bad}_((oI0N>L(C4i5YhN?)T-|v+UHeF3Lu2 znQ&m@g*%=7Mzz5BO*mj)FH3(rv2rH6%^7OT^m5VRYt+Xev~r;UY5OHl&yODhkGEbl zM=8)Ss9N?sirSWo&4{v-C3nlNzHe+<^k29>;fU>moRe-f4}zU(Q_G}N1e%U|*Hf|B zl>G$4)PtQB+`VM;w4ph17M!@fH1D^9cuk1s*32j=(vA@zaA}S7ww$g8;HJjfn7ySK zZN0BF9S*gRz9LN>X_h+0HI6acYOH%&?D;cP34AcIGLbP6^vcS`X%b?+Ll{Wez($W) z$vRnb$Sf0b=jC&&k!&jY7o!`yYXW-ChS0g5PH>T{?6hBmTa!cL$Cu2j^$4RA`@PUW zUmYh4I&E||#ru{9OER6wi~2^P>C|j%5n9HX?=WZR8b4^`UfJs=_?YJ<+B_*zkvUQos#!Z`^|Eo`qSGi$ z`c;^3KPh1^9~w%e+*s`Q3I(CGv1Xd_)#eHd!J=wi>m`~;#IIjWN5+xu^#~nx%4S_M zDvsD%l~|kAyH->skFqfqV8!&&ytm7uvs;;&ggl>I+`F7gT)P9`OG$;U3`!$RsGmHR zccg2o%O`8HS;@Czw9<^suHw3~(2O2q?41@bAYW!^lpjV0v{W;{NN86!v`q9nO1G!B zWdIQazRyGuMRzZaYhAJ`!gifVWlZbMPwC96S+?a9q$OI`HiB{9I))TvdkI&L`czWg zkB=QNRpl;Nm^qBN+c%@n%XJlZuk)ftakOr!=ghT0y3S$OKI37!k$9Hy!^8P3>{RY# z$@xl>?^OD1$!{p$k;2|7krH>UMDU-FLy!7JR|57gzIKF!3Ac-F#8Em zOXR^Ml^xg1l(n5TqAL>6xYi}m%TM&RCA7f)vxaX70aFw0n^RuX30A2uYf z&3tDP6!R>CU&d-f)6e31%0o?+ibn7onZ8R4nibF$d=tp!seCzh>%KI{J*j422nXqH z+4VAarZsNDSccFUQ~gsPd*Ep`(~NO-!#HJ~1$4c+)+ToSa&mUw%2ks0t$xE%d?rYkxS}YqehD!En7V_fIHRhmfngLfkHilY?yNsdvHZZ$V$+I z9$w6oawcqDm44r*w@lXeNeB>q~b*ZtM{SqUKr*z^X6k`IF;ejHwsoK z&k`#4XBAy+DN_%1$&P05=sp?T$U=$F?i4-OYCOT7pXKc)HV25S1A-Wz$A37qNna1B zZkfo~xN~|AM;IUdegfo)={nghH9QC=cK8M-3YnMr6$|&C3cn2x1}0#v*(pUz%n$@G zfy`7#Pxrtb$<0Yv)8pASb+wTyF;Wq1c1lYmuN$bzUyD&v5Z3SbpiFnWCDv$8Cb|}V zNIbBoOURYhN~TrG|L786^aCY5H(^CQRPr#rz%b9^LZ`MR!JT4eFkCy?g*I@V0oiYU zgCaNd7*TH4!0h(Ro>Su4bv5fy&f z4k!sPLQO|LI{5QqH<6+~q;^A6F-+)# zy|yTEtHRJ0h$$afl_0GoH@PmiAb?X6m3%)EkdBYakha}@Ap=7Tq&1k=&)fscu9SaM zp$&+5@|j_)OX74xq>W)lp?UHrK;Z7$M;3GR0}pb4t(d6B$`*nkC^dB8e4wdK(j}Uc|g0daXqsSyOuyW1FsE^ePE^pljrFzg>GrN zk(wI#SP%f8e$nR=nmno^XjSu+-;;K|vZIgo8-I6BE-E8ZxR% zQe0|P$r+aQxz~=nS_)0k5oDUP7{rAcycVfBw%a_7th>Nm*&W)c>}%kF3-Oa$h1*}M z+TNm>IMTGd8)H4qXR#ig*q-lQ!LY~0E_}TDKAV1~PA=7TOLlkk%H!e+VMfK)*=qT> z)qK$~#s%_RBC#aVQLIn9N7O=tRH8-+6vkG?ymlAb;ifnKBetfa-sKbg8ay%`lTaT& z5@XC%Ozk$+z=DAmZ&NhH29iCzilARE8@Jsxa(f?0w8$0@eR|4Pl!X=jeJ=H*dT}HD zIk093K9nPz;}uN0&F)U6rq-)2`824N*mjYxcgQjuW(^4rAJv>AYi+2n_`x-!fPVSW zO9DH&j~OaE*zpmAdLYQgnJ#bcv6!bCTT3ur#% ztPj7ylVM!Nk`Q$mXu=TD^NpsnEt|Uh1ML%17uVjitxRHY)7|9R-aH_-uF%Lp+AFVP z9q*gf_ao}z7^;Av;^(Z|u7Zn#!@_RAsi4qb7g3V7VE)W~S?gf6dfK0dm>5T&4F5p8 zXG2KvTY`X^_IOd3lPnVhGMfW$5(hVL{4NhMwg^52r=Mk37wj|7ARkd*r(N97bzS>) zY3#1xoi`!oUQKfDn7n$Ntkmbm<@p2}H^Fp?mN{j`P5B9<;FeL4VOC4@)sUz0 ztK-2ymO2wd9c7Bg& zlYROK?nv$+iPK>!{bqP0b5;@6EUxHs0!dULZfASOA;9mVaz9oOzMnmPWfmP$vTPOv zAjhSlRGMd|PXisox`m1xT}>9RG1M9}l|66gI5x8sfc6E7eFw*n9<7EkK)M`v9LIfi zT1Gk%A}xdg!bU)ir$$RrO#{DdnimSt(8}>GpO|v?KPUR?w|#o;`oK=mcwM1)=HHHR z)|l}P;;NyO9dF)AVu`JFzu}xPL5$RUn9P6?hx;1WUZ|-|{8~3V0XV$Mkb4=hn>Yyj z8suLpF;x5Lt%A_7-!wcN1Ulq}K~Pmv;{*tB#(uhB=!02^9fpE5Tr-?p>$uaAW+?$J z#xE%6wkJami@cmSh8xjw7ETKdpE4Svp{eVNDzAOJSG5N@iD&y+B%ej}%qdyOcmD85 zpwz<{#@RzZP%-!e%{Z7=qC%6UlfQ8qx@xJ|qJiw&&eVn1d&oADK}V7)8sllom*rVb zpvRVnRUXH8onCe)%cAim#sgk#l$8AGN$nz8f{5Vg8ENS5+3sZp!E}jFQ4N@3?`5$Nm(okC}l{9m(A8Bi{>?p09aFFbrxUrlNN~4rUI57b2T*#ffIP24yUb5*ytwC`I75DemOV(& zdfd06P$+Mrx^#6KT}8<)v7n5G<)QB8@e4Scr>BE`!yha#qR)q{U**!32z;ppu&7UE z*EFW?FZb~ta!mcecw77VP_v<-<99QSt}cJD_jIc^Jc7^OR`iDXETuOg+&tr(_cxI7 zr|39M)SJcH$TS-Nu&DRptr1Q%N4h0$d)Ha zvdKdfIEgl9@@xhC(YRS{Kxm06;YNYAMBs#^x!gA%%N|3qd9w683&$G*GPvB{Fsu*d z1Z{n-eQYh&&J^&>Y$2q6m1c);W*7PVi!wY?kdGQwD%#r*6zNZRASxLmoa@;pLh)j9 z$BSpZ3H!SbhhnqAZsrBO<9fRjwN}(t4AIdHp6wsetQ;`T3;s+;Svh((w=iOdPjDmw#?dq+sPg=#*xb& zUde*~Au%qam;T*Uc_7WTvPT+$%7WCy0ZXMPgv-hLDO(lA=Snf zIB?w1G@<21Oy1l%`!n&ma#vafPF~7p-E|`;BUtF+j(pB|S3aA3PQs*J-X@9| z%>sE}v2b4XAH{qZut=FS&Ik7RO>v6y*;}L zq%IGV@&!gaF{_m8au+B}o6R3`(|79hK79yTF=(3HuoXqr=R`~<)Z$!$+PmG(($98P zr96b_(R1gnr2xLCSNfBOOixkmDQ?3}-0zZleWI&`at`AQ*D2a35}g@3M#BB4w0aAM zfF?P-_mrK&ue!~z!mxZ+XLNIHE^i6r2-B=iMc<~dj>qdAe(VuM^Dv)JzcsXliiKsc zr@E$pg-pJ-=>v7ebfhpPPSVvj+G)Alrk4lv#uI$#R1_{oj4k9v*{@T>6L6S<){@de zOvIk)Cqrr{>n)jewk`lvvLgE?8y_;;){P5R7vs$TSu;p4RxcVIVxRk|18K5QP(S0L z7$bZ77%u#YSAm@?L|*TwY+*CRtu|4y)LW*mJC*vtPfHlojwha;DIY0A(Vu*J-%com z-lM4_8pXeoK+T&)?0x+EHH z?=KZx!)(pi2Ud_oXPNDKg9qa#w3LiwR!@?WWdJqZtRjaQ{{uafeEF*b99auatNd^P zHk!Go-%UGLmwADDtNG8229#;x9pxFg7nQt?hy?%se~|gd$}iYl%Yq7GkVJNBeeFa| zcTHzqjJ2I(p@OXcnKb=phW0-Y!f{*y)W~bzKjYQ^KH=|m!20`o`1`&%`t<+P{Q*N< zvq{sH2MHC920zm*s`;la@*i^;s3aUbH*k?%k=APUWbs@MdCFugzbqY{j5@N_MjDx75idvZim95e}*Mq*QihP-6Ze5Io!;o z);lG~{}pz&QX$#Xu&WF#%ouqeska@<96Bw(sn+}3m4Z$ZyT075i|VinYTu|tcFF%m zrMV?`8W>?^{(_z2z7PwG{{nFBRUZ2~H|%-jbG?lisT_uOH9<7OpVgw$d4_i5wge6* zh1HYhjfsOymZW;bZ;2${op4vn9QU}FpLpriYH>6!ITkgu4-fUBh z7NNh*^Y0R1q1fOX-xZD)?v6oC`CIoj2eT+$Jn6?ldJNhH($5@R7&)2{#t6&v&5kO~ zxQT-78R7;wveiEa6>8QdZF+1s8c{1n$&Bv1H+cd`lN#Se`^FcOOF;QxttP06t#^JU zU?A{~%583FS=NmlM48hoafsvd-iDIPBgM9|~x<;zE}$ z;;>f?hqC9F0r|PMY&@M|?Po7NN2J~fiarQ;7Va7ZezE5Ka&Kbo-uT{&2$ia5AgkA2 z>ctBR`fw`$+wB^|;Hd&=gN==oz+2^~o~Rgp_>~vry?Jy_MhCF~y8;HwNd=3^9r&c} zCXh^Y2z+qV{Ri6Cwch@{oLlkiE@au3$O?sqXD{)fhOOo@a7;*1w4Fyv7 zO1F1O*Oa-tty!OJ9(Et8kC2v>7>FUG{A_WxA?w%?igf6f4Au*&zb4&{wD-@w0Zh8F zs0iixUYy>M1CXY`=Y~tLgw{x*9bHgq^oOS zkyB1(xe1yYu}Hn;m*YI<=n~%b3~RBtBh#gG-iqoI{>onEKvfX)(66y2n$HIiEGDS zB-W^q07ay3P%EW{s4Q4(~B^EbqId_EDo*DB|@!dy@gegtXa37 zY{N!@YFPUjnV>qI?he!WLh1-?luyJ@OitFaE`a~ykirP}n=(ZT3!U-cQ#_AF!9tE& z0w?w3i~KAf+Gq{i5xh<&0oPz56&%5LW1C)&!+GCK!j>9Q!_{6JqXln};A8PKGk;BJ z+N%a`l_o1<3KV}_;G3+JkN2XA(C$R4?TOV_0Asp>NNo)--XoyA75D1_&J?&agRA$h z9-NN2zP=_>uk1x#bL6oh1uDdkgXygM=V#to!UF8*M}k*H=EqYHd6&Ym8P?VWOSNaB z$>S!9tb9j)s3OzI<=#Rn?`NTTneQz%t1gY#EqpSg=mphe##GYl5VX3br1 z{O+`UDV`@iIQF_^Xua&U!Ga1znR7k^@;V2Wu*IxG^Bk`pbd>PR?P&Eud77G+zJ`XVu*3dIYsJ9H5Ghr;(mE@3b=`IhP^2HpWq;yi5KkM87a+qBw8rF}M^9mkp z#B}EtLDR$D1!`G%GMQf7$T;c>YyhY=r*g-($8^RHd6yJ8@x9!5<@XBrWVd7)?mO#f zb&KzN#%?8gr=~o@dBYP98CtRinONub2b{exW((+J+1_3wB;U@9l9LMnd@u|pN$b9j z_nwr1%AsYa%1QJ560pTKa3AM#9zBh|IjjxY3swP&|2B7m%3{@*%!g?fMK z9#@3$(c)>0b8r;Ey!YJ~N)-6z_Xkf6*&`**dgq0hcEnq3W^T{HWf6fU(`}m$w#y=; zb-=XO4%YQf2am04lNE(>BR`V6XnU&V1>tu4(SH~`){Q&3Xd#!Qs!=4&Eqw80dsuHZ zSrVeo#Aqu>*)A5Boo|E0n{x|71Nd!cADe!KW#G>=h0= zZzHssueh|+`<+-eV7Oq|d#ch;ZTFe0P(69`PzdA4kWPvx5>7ok-gdH8+ZdJt%Ate; zW7I*+8T(trjrSctKWM#RC>LbO?sm5SNJP3@gHYeKFz#^Uav_>`unK*}%H5$qi4nvz zlh8ZlCJg@UFKKI?V{`P7>V812MozL66@fn?i?>Q~-^^xqdxSy|DYJCU-v=^{*U=h# z=iB2&Y^JX6xeYpEbTMsB3=_*~YVM=)23bBnqyb(q1 zocmlwcCDf%H}!YSXmV%A=Ohr6s|e#vXSv{qzTH_T-^Ox@^ws0K`^!BPbd9>usfTZP z$<~-HvD?+I!ZLRS2+T-zRW2MLpPP*4`AYnjn@-ltS&(8AB2p5wKis;vhsUPiSiYra z8j25*-+2;=rSPi3NVhw9-+ds1gyWInUh?$tj3@U`Iw8Ff%|Y!EjKUFwCL$B7daAbU zBTl(fcKzhRW<;jq%~k~7S;8}+cj!Iu-U?C_r)DOs2e`>r$6n4Tz?&zI4$5;$jC)TO zaTWlOk65CYYej&W;`@vH$AApfbxfo!MM?(3^CJn& zoN_ZRg#JLAWV3h=fZdoD3NB^3WbQnj_tw-7+q*CSp5Kwb2$YA|($BjogWT9EMJmTW zlEkdIs3^K`@SJ^wD7Q|;K z3q>j$`Y@g4jM<2Owu%|4fTXT;n=+S2_XsTQF?KcIhx<=ZS?L&(nMZ$$$y*IpsXX?C zRoiZFd*{Gvrp8a%1X_|2y`iSw{iWsE-;x~;MA1hl3PulVCBCE{WJP%30ri|X4$Gfz z47Nx2z3{Gz7kBnN7K!DN8E*p5bY35d7%`y)hA$|M!ISJZ13I1UW$wgr7bOE+arh_9eq)vJ#_uF`*fv~WO;A5Mr(>@d6}S|^$?33`6yfWxEzwEvz-a>n>~a}#TVwO1ubG?e^myIMZlIei z@%BAbelE0IZwDe+l43#(nE08iTT|Kib;#1m&5`!WFUH}HrxH9AixknZov9=LE)uHU z3SbG=cC&I0zZW8DNxDJ}LZNh%2feaF?-{M*t`t}+Q%Lvru7k|d_v$68ex)e#>azwG+2#e|I7%XPKX@)LrHQ&RRox0dK2X3a|5| zSLv@6+!0_gi@Ml#)Tm1F^-UVhf!dtlK7r=AzhsG>s~t>jaaVwQUi$f{ozCy>Dfs5T z<+924Rp)A3%US|_Q9w{$xtOWlVV&xKoL(|ttDjrJAmE}g)n zYM4g_v0Z^`%Y;LHO`@ufv}@;!dTWO_AG1{{H#aC)ygG%Umjyd%2Z}PyuhG0~yV*f2 zjUwbiw`;!c^>vW*_`ru>D#OwgEg_R5Y=Nv~N22;)@T2+t{UgvGj zb(u$t!GzL8G(T3K=>*gkbIt>_uVfp=r?MRwd2TqpwMWzTR z-Z6uI(8l+w&)lZP5ItugYX2y%SRJrmp+o6SEy-DaAikt#vRzRrxtOs$cISa0!i!D1 zsjvP79^~Pi#)@nKa;nXfkAK^G*nbnvP5OxcBwy(5K)eFwDvdesRCyv26$`?UqVuQD zSe1Q^Tvn*~F+-(i0Ql%fQ2-S34}GMZQ1Su&T~Bb|o}5zTUY$b4T9wr}z^t*62~%O4 zi{Z-ZNe{;8Bl~bCZ0|5d0>$^>{jvN#gXWZRqq4zFcNgAuEPp#C(H@D)nBD;jAdsWuZE&Z`pmnpL?%JYe~z^s#4d!r zU7WnkI&~<@S!}H8mZvwAx1!+W;=?UJJ)VP}tVZ!x=!HvSf5MR5zYELDi;@}JR1ruD z;R-|pxZ^gqq{Q2k?ZE}00Sx0LhG7!1T`N8s3KNs>>rrVaY5c!f(u`+HQ_TQk`Ta8g zC3C$q%evY{(EdxV`vsugWt`9pN$XvMR<5d<3jj0wz2IfhcJJf4%&k>(LLn^=xp`Hk zjo@_C)i0c!2&cU@dI^MUdBnPywZU=PvVrZTn;prLGD^Ya^*r@)?6uUHAF4gr4e_&X zQC?elK2YSXDm8h5r+|N(Q~n29wbTd=QxQ|uj@?Og=B7?qu#=yCE);s1WmbTLoq|b5 zPQYtVfk9JiBZ=rHny$GQ$=#dB{(KI2Arn31P(pCV)5;GL;<|56-zdl8`AcD>Bs1ol z+NvABSSay(j;grpU}1bKm*GjXr5ZfX>fkh%?N27J86xx+eR-l`@=P=7G4jy*_%-(?INAqZ~9Cw+((>t=y?UXH@xL ztti{K$SU%u0V8r^9x+855)8zDz^7T=&TBZqs(S9rkzvoD;#Isi#K=5}s*kPY)f_p< zU946M(cbn6^_Jn~pU}@qbEM=h53?ka^!YG-csWcQcAB-_vrN&GUG6*5VbGe0l~Je% zwr(x5_VaL^_FEPKb8H;FkE>1Ucp|ybhaH^B>=ScTaM5;gok0}F*OXyQE488#NpV5I zeNe_B8lvRrSyEE&gH}@1@!OT#p5^__y`4Wb}qd^@1Y$@Ul{irPo?e3iYpf$BIJR zRPn@1T&84&+M9X(3cPIPQYD4Z9hW|bc=6h4#KZ~wCgM-GR^Az+m0?0u6RN-GVq0yn z2Y)I}!=EqB%UU>0Q?(ZM93zy1T}W)nX9HKa=hpF)nM0yM|EY|Rdl&Lhog~5BL7?b-~sU-8~K8(LHQ=Y9nl_t1J}S)=Lcxi!Y|U=Pbv44A-wS;loJDD0EZBm)vhyaWxrDbVK(NWoMN!K-$at?GAvaOG zjq6ct9PaI+H`+gb_uiP&!G<(pmQvSY0lWV0d0ORw!adz6kpQ}LH4&j6{UUvBt=8g*Pc z34LRiYvX87FAd$BDO`ote&Wi%AnkwqzxRgc6%OT`3~#K^C=qI z&b6xw7H+|uP3wy&y(zvw(5iOH3_^dU0wt|UyCCnk^wa#See4u&D&IB}o{vy?`{|vC z3Q#$Z*J_7Z=xt0f*PFXI2r?&2upMDQ>RpBjbhVgk-lt|o@b!5pThSACn2!E-$*#XM zewcas{0!elE9jes_{Tph($qAm6UDtiW<}SI(mDVuK&5>ZOGZ$ic%vNe#mJr9eDNL~ z?aAZ(+|sr$Z8h6pfDvTY&EGftY;`2qdmrWEqN^3yvh^Z{I6~JhD^D`2f8m#yXa7#v ztsHtu`izIW26TaLu9UD;H9H>Dh#Ke>LGr`z1rAo{<5^$)1@-z)JS4B@|5;_sFCd!P7=H2-hC72cql z`2R$bOk)k5Tzrk@^JWxWJGqDUAMi%Fz-@AIlB3fFK>PJy2KfKNk`(`^%^f{gPuL`e z7X&nD9%rcMGBHp(uH`|?m&yy#%=%_Q54KybAW;qToe3B9D=`{rQ?8==JPsI$7Wwpo zp`6z>BkuzEZ{_E0gZFPYS)Y_^B`Et6wnC}qb6)16LTExlE3 z7!kihbDq{2GidmlVt{V*itp1p0vPqZSse5OqE1+a5Am@9ethg-)g#%voua+h#&sST zT~+E`qdLaNCW2RZxS4urv#v={!!2tBEAqN4Nn8**CxsjC!~h&QO5N+~LKLEXTk>KV zr54mJF{^ssVKZHp$A%uSjGRk>Nt@dSQ456iXQ#ncPJ8-Zq0q2%ts#5j{7xUAGl1RL zT#;dqM3sWBpbP``sX!r6dR-xVlJ~9%^G(3>K;ZkGA09NOw~;-gyw}z+I_lP`3j!9k z36>OGTer=$JkQ07(L-cb4Ao^8K3Pwvr*La_i5*q?i6zIO|At-o!uMN(wwdE%rUSkh zLz_#a-|W(oENRC4oYsw*tb&jkQijU7vN5Bmp5Ke##Z2GeH|r6m1xXn1fu}%P=X|sa zqiCG{%i_Ymk6NqfdQ>^WyS}u|w+=jVn;-QZd3TylDPFGm*KI!Q9dXbAN+23kv!_$E zySFi1+WQb%wFeqvvi83>V&dl(sXYPr?_Ueit?)S~?2dqPY-@(hnTPJlj;LmhY+aS9 z30-k2S|wVv_FH#m2N2Y8QQq#U{0UidT?fn&<;h>`w{dhoSd~ zcj>aZiVu{rc{|v-7!G)gPuWe62YjD|AJHTmmGp>wJ?p{d(|0f%-#B^Fv39-HU>`DC zV!M^=O_VYk+KJ}6fZo@!4q3Q8#csRU_SDtAoc7c(T2vy#>DF%t#JbEESZj4}<0S?s zPR^va#xM`ZtTQR|S;TyPy1?#h4=mvhp~wRzHc`^Jf~m4}Cd}$5gB4$3B>_@W9LjPA z-iE^Yj~NXqW;baPM%JWt2vdZkMo6ILWv?;_GXi`>UDzuwEu@}vF?g8$wl`qmmWox+ zW&iOtuq3l*xn8cy9!%oYm}V#+mf=KYs1F?YuJ2_XI3*}XNTf7*3oV7yF)3cNbF3)o zd|r{+suTcB(Y&ApeK%TekqFC3{@F132bx_c)nQ|-z1oa~Rosy3MYIY!#RztlU`goY zTa9+I-?#`v=Iw;-**?Hw@)aIg>jZaQQ9|_Nuyu0G>P%sbbS?5*)p7}D;cbX6{9=rt32f|ePzTZgFe;~>T5`NZk9p*@k!~l_EqK(G|94I zN>s?j6*SA5gomyT&SG-fJx!RdynnN1>sWCwgdOfKn>xKB+Z;1~IC!JpcbPQXq(@xf z=owqTD|d0tuLzzQ?kWBL%yX$9NDbRb_nmh7!iNAqwITC`R`V))kf&D3%WhFJrU$SM z-vidHCu)z-jPk=T8$Y}Dr<~zwK#Hk--aSpXro_QIx|D-z9mmF2*&>PHRmTs@Srz(= zxO{jGymJf-gfokDAAg9iYCY}~>cJq@sj;z-Ee;XE*JE!8o=Y^swVkoo1@G^G;1uE14`YlOl#Lf;U z@2K%#!}V!`a+wYpAXuwVSKp}zl@)_jZu_t zx>33B0dJ&Bcvvf$1COzxJ~9twC}&#?p#0^iSxr4`X0)jz=L54hhWW64rRQ5yS6N|a z-)9O1HkS!r)AIweUzDdlP98csSf#H zD935fYC|?f8amDQA09o!e1vD_?3P*gaiz7CBR7=^2V>x8czZo@Z@H{?l{Bh$za9QhvL_SJg#W=r5b!_v74uIV-D(%fngndB3rM!+` zAA9yw=28%Za#+?IbIpqef8+U(T#o@LdYp;us`0Zk5IQtCtrqcgnT1lvJYMA;%M*%? zbX|#mFI9EiPh#%~K5)BeH&lUuwaxtY`!)5qlv9#GLy`4{MRQwo6%}C>!4|Z#(S|t^FbstSalN2qqIo1It>Z7TUXO}& z4zQ(5E7Vu~sHJ>aKZ-WU17{r+Ko5~q!?`FuB4E1oeFa??vzk6+Thh^VVJB%H;e8vI z{Q4&vko6lAdV2CYDzq5a;UaCph-q)!+xs1pKA*jHq_q3+ugjb8^7dE-hUjxKTfqJu z*ko%@pbnLs==9sm{lCqe(`@H%P?Y*h^2a#k?xn^|5;L7X#0vK3G?+HmR9q1_^$7P? z9byS2c;Tc6b;n9A=*YwVHrKn#wTbP_0(#C~Mw6orYEoBSv&AHX~oKTehmp z2K7ma6TC6NSR_iZ_xw${CD$9NV2=2t7-y(FgZVZ~xow$&$uuhHbMYxkr=3yEj6g}` zx9djV)N}aZHTp^M(M|6c6p8HWiuOEjWulCXBEF+Pd5UAK>+1Vh1~c(mH<3TKjIabm z{-u1PEAcuK7)5=SFV8P`8UG$-4Xe|1JQTqHG`f>zAx5A&t9m;}u=}b7%y0cWbqdy! z4YZq%V$!+7F?zp8`qd&0vYrTXzYUo9tpErl`!k|aHYyC~il!`2o@0LTY zQQ*#+P9juK5+Bt)Yk{{UD_VJbRaxMZL?*A&iSLTNSte|r6qR^@l83w3my+EXy`Af^ zJ9>5LL5m@q)r9U!;nC^LH3YDjxj;4CxQ!#gM)WtdVHL%HpjiU*qRjljOmS5&YNGt; zcpwT-a$`&1l|oO3lW*CDKdT${FKTZP5hEw>aTC)lVTpst#J6u7I>=34B9SoEr!Ory^*bG_CY-v%tlf2>g z3hRo>)aqGx#;}^xB}5}mXq`4_xpz8ublx}5*6=kg;OY8ITQc!l@nIff(xrP1 z3zhhax0#pOBvV0~zL`xv=f!pT?AgmgF=B|(UMx-!*}c;FaYb42p@{K2bdr4wp6sJ{ z=<}qvSVi$!JlCvyX$9_lkM%0&lX-h8na-u+QkSqA_Gwp;Q${rp9hU5&@J0)f;(f4P zxy`&cLb-X8Axy+?s;;r#-X0{m_GsBhm!TNu)~A8afDwzELquzvLiJe<+VZL&Cy?+heH4o|+E&SEPQF4?km#WQv z_TqkQWj28JmZWA#&TYLH#Cs=n=sqMX(ln>Uf9n!M&=t+CiVh1xV_^<@RLy5`yg$u< zx@7A+^x5<3tl3(%sv)Lpg_}3;T~lR88osx~wAi<40P`r{gYk-1V{KJq%V%7`ykZ_K z@ew6cjHIhJ?Q~fa~NDud?fmag|?`OzNvhoiG~~Wr+043t74rF-c5f zd+yF|m*wk70F}`*o$7|{okE%lWasxg(pgu^F@`WI4*htw| z2DL;9f?CxdJ8KoKB#!tVa2z;NuP3K?R(=2_Dm2Dy<9M=Bn!ZqU#|&j6GT(i#J%5AL z#fBnHGGYL3KxHZs$<4Z7zYb7wL_f=71{Wc!rq6lk&Gg5;r>81*U=y`Nx|)i%N<52m z3yzTj^ggcg>~aCwRTE{pCpK@dOMa49qoNX<4L-*=h>>mvPZ8~$qLM*NzCr>_I$H@_ zN6S(StENF599Gq7suRkCx_3*@b#%lUk_`uZmr|1g1% z0+fs({K1wjc%$OOSl{DY=nt~w$S&5~g$dkdbf>Vp7&7PC_&BRR{)Q2gM=#w|W@>cp zq&4NQUA$sIRyFw}q#H;*mm{tp&mJNpc-LM+{BAelz##M4DAAXDg(6@NO+LE0P0rS6 zoVfA?CAAnHnM2l95o$oDb={{im5%DfA@FtFaNRhc2+&IBjf)qJU92>S0p#iy@8?-^ zHNO=T_vP>+@pb0#G$pfV(3iz$B0)QtnT62}z)2acHK4Dnr8Eg#o{ql_=h zG#2J?X>Hz-CmeCBiVH-s8yZjc2A{dS;QKs%skaKaOaey>!JZW(5IvXYI zsVt@CwmhqYI9#-7{zO=P*`LoyAMayYh~0{LMQ2{V)PPBnnX%g{XeRz6@wa^iOL*za zx%^)Q(fLyuCj(s3U08$^$(U#|y4omc{KV6i?_+yNo~m)qa)5Hi!){H4Rg0gXbXhS! zijMWH9aRsmT9ev!cJW``9&~?;3X7d*t7jrest;2NLYy;%h<|BuO-Wq52J4<^EZL@p zE+Eu<0N-nBA?^wH!6ebuAl`n7OiG1mL3mwZ9|!#{s(U;{|jlK|J3umjR|uCymh(j-UQeGrDy#&`rK>u zbIt$GKm4w2R0)aBZGdCj89L7;s?&nLSB#iOF(Vp2lD3RK+R^~UG-Z_ zU6qah1wDus@cds1us^WJl>R>RpD@(_FRs#*vZfMjn)j-@^(^{nz(v@)ydsfQuVlv| z&!^?me}VR)5u@hTo1KB(RWeUMzn2Uu#zMoGcz*jYuv|52qMYyl4L$fA?e@*T@QUC4 zecs>ef`eK*)aMDSpc9_g z%+!xv#RzffrR+ZZ>lKUfJO5uVck#%7_lf-5)61vyuMTl`qMSjHAC|ogpFS-T<6Myf z{#Uo-|KaAYE@$tAf2RDLq=$Wz(n1S8kHOSY>{xI+y z^Pd5m|7pS@+y2WfSvG`(7DN9rKKoDJ@q!7Wd$0j`Mi%uKsDgOyUZbeHN+I*!`CLM= zlGI_doyFF0MDk^`ZWaT{%_xp~g?C1D9LALHI zq&M?9wyDz@;t2t-2j8$^E4WOu#p0HlJVvQ6VAHJqw#tB#19I@ZiQP)u$j(6b^4vm` zSfiUFe^TF8Kt_vQhl_tbFyvi<#5<7;;~)QD`)9bq_=w~zT)R(-zFk@ zqb*=w&h3Mc$;`DZ#O5bYzLMms?__OVyj?v(O)%kWTsx_AcgJdsYe2u!w!PTZCwd9A z73PB`w1jQ%ExuJ2Gt-G@CYkR zUL~2kfq5jYUMal1<8F=}?Br}l(=x?>eS4YnQy5rgu2hxQ-!cgT?uP}bP^b@uj)vVg=Ktb5I|!%}Bp$5HG|r;Zvm#CZ@X5};x) zUppYb9U{mWM;-03n5-e+AN$&uEynKP!CmADTWsZ>c2893f{7tH=q2SKYt?~6jivaZ z=T2tBPKBhl`;umtfUvtkpnL29%GEEsj-K#|Ai4O0t?onGW=pqKq=-@V@S_Cs*)ab7}8i5}y7+hDv% zd0^ex5xi;hzdz~O0$wowc^mwfBhtRa&nnzdl}6T@q?^gPX>l`@a?e}TPphui`#iMe zIN>82a^*`Ril+w6EjF6J*K>F3L*gKQqhcZdO%zRuiUxsOjEUPb_?~avhYIrm`=Z%j zKB&eP*#yDZ0A+vW1y=J$r|)!&SVc&k$bsYf(H#gHb~rC@rdRnQp_5}0pU|9kL{qDo z)B~J*E!QDH*4TB$wMYJFTv=$EkwS`zDgU`38=NUw>}(!o6$&&dbiW5z)L#J87VLR& z8o$5f>31$r(JXlJ83-VCejZ|H;M7(eZzLdrfl?u_w1m@CG~B1b3B5qWopss3YG zFol;`oZp{3W^mROMMK+ol!|aZFt3=r7~+xhbDun7g!>houE|R9ewiio?(O^i#%%h$ zDJ|R-HVMd2UX}l-2PJ455cD^{%UivrTDyoclGeFSTPun|7G?MGXLtt==S(f*Q&e+n z$cR+qZZ+bYr}iDU{8~oEtk^6Wzir^Z9h9&|C8u^TgsR<1IV=ScEp>=VX0t8qT$|hn zqX>wIueuOh@>|%K;}HeOh-O<;fT9+EspkR~T$8=2xw^lkAu{+3g6=5B_HO06l|W8@ z+==t>{Ctv6C_B~%G7n621Vn%GY#$3FEc+Dutyiq8!Ve4tf2%0C*g?uc$CN_&BbNo2 zb-pJ^eWxK9ez)h0)^~}fxr_fFlQ91~KUtxN75Tf>opiZ{2J;F+3r|(Kv*T}Hvt<1& zo5>m?%#w&~c0)Zq9|3!d%&}80g9sN)-bDNf!U%L(e4;#O=%VW>0$egtp0ErPlT)j! zg}A|(GA*TFoU5rygc?}kK);2maVv^+s3&684m4PM5BFXA6TX z>0VbQR3S$6pQhndVNmCpr?$SnCUXj}=i_f8wtID{gDu!85~DG6Hmqjs0|ij#M1`nE z)wX-0Gck@HoryYmV-PoT`t0S4l!cE4 ztGQ|YsT`=(?oCb}7qB&?K7Rw9TTOYZL$(*9=oDk1(wiWqU*@`!q4 z*|j6?m)MH|Ct~1S+HPrCdfB(3rk~JuE1ga8gGHKSa?I5!!FgrR2OO0X4PiY|^&dt| zBcO8I8g|_64`WN+KlyeWD!pkg`1mu*b`6^3c{5aoue;G*K+X`*h|&QIE!(%_q_Xk? zuTt-Cl8(t&6_+BUuOCr+M^ING7t_)fL4~5vp5Mwv@hLOv!mAT?GBI0IFMBhfc-5sc zIMk0ewkU=A#9TiB7Y1(cu`b t@9Am%j8rZ~Z(K_cA%QUi8+J7g2aZu&~oZ4hVn8 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 J59Rmi{{=`33UvSg literal 0 HcmV?d00001 diff --git a/project/step function (json & screenshot)/project.json b/project/step function (json & screenshot)/project.json new file mode 100644 index 000000000..a4a40ece7 --- /dev/null +++ b/project/step function (json & screenshot)/project.json @@ -0,0 +1,75 @@ +{ + "Comment": "A description of my state machine", + "StartAt": "Lambda-1-data-serialize", + "States": { + "Lambda-1-data-serialize": { + "Type": "Task", + "Resource": "arn:aws:states:::lambda:invoke", + "OutputPath": "$.Payload", + "Parameters": { + "Payload.$": "$", + "FunctionName": "arn:aws:lambda:us-east-1:683237399578:function:serializeImageData:$LATEST" + }, + "Retry": [ + { + "ErrorEquals": [ + "Lambda.ServiceException", + "Lambda.AWSLambdaException", + "Lambda.SdkClientException", + "Lambda.TooManyRequestsException" + ], + "IntervalSeconds": 2, + "MaxAttempts": 6, + "BackoffRate": 2 + } + ], + "Next": "Lambda -2-classify" + }, + "Lambda -2-classify": { + "Type": "Task", + "Resource": "arn:aws:states:::lambda:invoke", + "OutputPath": "$.Payload", + "Parameters": { + "Payload.$": "$", + "FunctionName": "arn:aws:lambda:us-east-1:683237399578:function:classification:$LATEST" + }, + "Retry": [ + { + "ErrorEquals": [ + "Lambda.ServiceException", + "Lambda.AWSLambdaException", + "Lambda.SdkClientException", + "Lambda.TooManyRequestsException" + ], + "IntervalSeconds": 2, + "MaxAttempts": 6, + "BackoffRate": 2 + } + ], + "Next": "Lambda-3-filter" + }, + "Lambda-3-filter": { + "Type": "Task", + "Resource": "arn:aws:states:::lambda:invoke", + "OutputPath": "$.Payload", + "Parameters": { + "Payload.$": "$", + "FunctionName": "arn:aws:lambda:us-east-1:683237399578:function:low-confidence-filter:$LATEST" + }, + "Retry": [ + { + "ErrorEquals": [ + "Lambda.ServiceException", + "Lambda.AWSLambdaException", + "Lambda.SdkClientException", + "Lambda.TooManyRequestsException" + ], + "IntervalSeconds": 2, + "MaxAttempts": 6, + "BackoffRate": 2 + } + ], + "End": true + } + } +} \ No newline at end of file diff --git a/project/step function (json & screenshot)/stepfunctions_graph.png b/project/step function (json & screenshot)/stepfunctions_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..9a338c1e74762624f79e20aca3bb0f46a23a3fdf GIT binary patch literal 18622 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 literal 0 HcmV?d00001 diff --git a/project/test.lst b/project/test.lst new file mode 100644 index 000000000..21363aefe --- /dev/null +++ b/project/test.lst @@ -0,0 +1,200 @@ +27 0 safety_bike_s_000390.png +28 0 bike_s_000658.png +116 0 velocipede_s_001744.png +161 0 bike_s_000643.png +319 0 ordinary_bicycle_s_000437.png +354 1 motorcycle_s_000323.png +417 0 safety_bike_s_001253.png +476 0 cycle_s_001306.png +532 0 velocipede_s_000863.png +554 0 bicycle_s_000479.png +615 1 minibike_s_002173.png +626 1 motorcycle_s_000352.png +644 0 bike_s_000801.png +752 1 motorbike_s_000433.png +756 0 bike_s_001068.png +790 1 motorcycle_s_000963.png +912 0 bike_s_001852.png +923 1 motorcycle_s_000139.png +1023 1 motorbike_s_000465.png +1043 0 bicycle_s_000513.png +1094 0 cycle_s_002305.png +1096 1 motorcycle_s_000615.png +1218 1 moped_s_000306.png +1321 1 minibike_s_000052.png +1382 0 bike_s_001342.png +1398 0 cycle_s_001297.png +1404 1 motorcycle_s_001955.png +1408 0 cycle_s_001953.png +1463 1 motorcycle_s_000494.png +1464 1 motorcycle_s_001249.png +1469 0 velocipede_s_000292.png +1671 1 minibike_s_001651.png +1675 0 bicycle_s_001102.png +1775 0 safety_bike_s_001132.png +1812 1 moped_s_000007.png +1829 1 motorcycle_s_000211.png +1999 0 cycle_s_000970.png +2033 1 motorcycle_s_002126.png +2066 1 minibike_s_001732.png +2072 1 minibike_s_001867.png +2082 1 minibike_s_002227.png +2147 0 cycle_s_000068.png +2148 1 minibike_s_000880.png +2242 1 moped_s_000033.png +2477 0 bicycle_s_001107.png +2499 0 bike_s_002116.png +2520 0 bike_s_001738.png +2885 0 bike_s_002009.png +3027 1 minibike_s_000947.png +3035 0 bike_s_001159.png +3044 0 safety_bike_s_001065.png +3054 1 motorbike_s_000005.png +3111 1 minibike_s_000075.png +3240 1 motorcycle_s_001164.png +3256 1 motorcycle_s_000679.png +3376 1 motorcycle_s_001892.png +3407 0 bike_s_000694.png +3467 0 velocipede_s_000106.png +3477 0 velocipede_s_000001.png +3525 1 motorcycle_s_002177.png +3558 1 motorbike_s_000126.png +3591 0 safety_bicycle_s_001286.png +3606 1 motorcycle_s_001936.png +3682 0 safety_bike_s_001087.png +3698 0 cycle_s_001648.png +3715 1 minibike_s_000801.png +3732 1 motorcycle_s_000427.png +3748 1 minibike_s_001089.png +3857 1 motorcycle_s_000530.png +3873 0 velocipede_s_001232.png +3893 1 motorcycle_s_001261.png +3935 0 velocipede_s_001466.png +4028 1 motorcycle_s_001269.png +4106 0 bicycle_s_000776.png +4128 1 motorcycle_s_001348.png +4147 1 motorcycle_s_002026.png +4211 0 safety_bike_s_000540.png +4239 0 safety_bicycle_s_000280.png +4251 0 bike_s_000131.png +4329 0 cycle_s_000010.png +4461 1 minibike_s_000828.png +4487 1 minibike_s_000288.png +4561 0 velocipede_s_001355.png +4646 0 safety_bicycle_s_001575.png +4765 0 safety_bike_s_001690.png +4888 0 cycle_s_001044.png +4892 1 motorcycle_s_000063.png +4908 0 velocipede_s_001379.png +4927 1 minibike_s_001441.png +4960 1 motorcycle_s_000797.png +4980 0 velocipede_s_001790.png +5003 1 motorbike_s_000135.png +5063 0 cycle_s_002613.png +5112 1 motorcycle_s_001960.png +5114 1 minibike_s_000913.png +5162 1 motorcycle_s_000685.png +5171 0 ordinary_bicycle_s_000431.png +5175 1 minibike_s_002051.png +5216 1 motorcycle_s_000446.png +5304 0 velocipede_s_001699.png +5311 1 minibike_s_000792.png +5337 0 bicycle_s_002458.png +5342 1 minibike_s_000505.png +5350 1 minibike_s_000573.png +5362 0 velocipede_s_000369.png +5430 1 moped_s_000064.png +5460 1 minibike_s_001893.png +5469 1 motorcycle_s_000878.png +5486 1 motorcycle_s_000042.png +5572 1 motorcycle_s_000606.png +5612 1 minibike_s_002230.png +5650 1 motorcycle_s_001519.png +5691 1 motorcycle_s_000512.png +5855 0 cycle_s_001915.png +5877 0 safety_bike_s_000541.png +5895 0 safety_bike_s_000192.png +5994 0 bicycle_s_000030.png +6022 1 motorcycle_s_001385.png +6144 1 minibike_s_000960.png +6210 0 safety_bike_s_000791.png +6226 0 bike_s_000071.png +6279 1 motorcycle_s_000876.png +6280 0 ordinary_bicycle_s_000350.png +6343 1 motorcycle_s_000602.png +6382 1 motorcycle_s_000222.png +6416 1 minibike_s_000309.png +6449 1 motorcycle_s_001679.png +6547 1 minibike_s_001473.png +6553 0 velocipede_s_001633.png +6713 0 safety_bike_s_000438.png +6720 0 safety_bicycle_s_000315.png +6730 1 motorcycle_s_002112.png +6799 0 bike_s_000163.png +6837 0 bicycle_s_000059.png +6848 0 bicycle_s_001789.png +6865 0 safety_bike_s_000699.png +6914 1 motorbike_s_000324.png +6954 1 motorcycle_s_000485.png +7109 1 motorcycle_s_001687.png +7110 1 minibike_s_000497.png +7160 1 minibike_s_001547.png +7209 1 minibike_s_000055.png +7242 0 ordinary_bicycle_s_000169.png +7249 1 minibike_s_000290.png +7262 0 velocipede_s_001335.png +7266 0 bicycle_s_001804.png +7281 0 safety_bike_s_000488.png +7282 0 bike_s_001216.png +7289 1 motorbike_s_000121.png +7378 0 bike_s_001073.png +7385 0 safety_bicycle_s_001153.png +7471 1 motorcycle_s_000171.png +7484 0 velocipede_s_000041.png +7489 1 motorcycle_s_001782.png +7569 1 motorbike_s_000629.png +7584 0 bicycle_s_000977.png +7640 1 motorcycle_s_001906.png +7648 0 bike_s_002208.png +7806 1 minibike_s_000254.png +7862 0 safety_bicycle_s_001322.png +7871 1 bike_s_000041.png +7947 0 bicycle_s_000031.png +7949 0 bicycle_s_000779.png +8056 0 velocipede_s_001277.png +8065 0 safety_bike_s_001088.png +8183 1 motorcycle_s_001971.png +8191 0 bike_s_001784.png +8257 1 motorcycle_s_000825.png +8300 1 dirt_bike_s_000001.png +8326 0 cycle_s_001214.png +8390 0 cycle_s_002964.png +8402 0 ordinary_bicycle_s_000284.png +8419 0 bicycle_s_002735.png +8457 1 motorcycle_s_000450.png +8460 1 motorcycle_s_000049.png +8627 1 motorcycle_s_000866.png +8661 0 velocipede_s_001201.png +8739 0 bike_s_000457.png +8744 0 bike_s_000330.png +8763 1 minibike_s_001605.png +8929 1 minibike_s_000398.png +8981 1 motorcycle_s_000007.png +9007 1 motorcycle_s_000040.png +9017 1 motorcycle_s_000739.png +9205 1 motorbike_s_000333.png +9236 0 safety_bike_s_001481.png +9253 0 ordinary_bicycle_s_000158.png +9276 1 motorcycle_s_001508.png +9345 1 motorcycle_s_000060.png +9380 0 cycle_s_002661.png +9425 0 bicycle_s_001047.png +9486 0 bicycle_s_000777.png +9556 0 safety_bicycle_s_000235.png +9615 0 bike_s_000487.png +9646 0 ordinary_bicycle_s_000113.png +9654 1 trail_bike_s_000073.png +9692 0 bike_s_000941.png +9833 1 motorcycle_s_000141.png +9928 0 ordinary_bicycle_s_000105.png +9939 0 bicycle_s_001218.png diff --git a/project/train.lst b/project/train.lst new file mode 100644 index 000000000..fcf936c0a --- /dev/null +++ b/project/train.lst @@ -0,0 +1,1000 @@ +16 0 bike_s_000682.png +30 0 bike_s_000127.png +130 0 cycle_s_002598.png +152 1 minibike_s_000824.png +195 1 motorcycle_s_001856.png +219 0 bicycle_s_000537.png +251 1 moped_s_000169.png +252 1 motorcycle_s_001453.png +298 0 safety_bike_s_000482.png +370 1 dirt_bike_s_000124.png +390 1 minibike_s_001863.png +392 1 minibike_s_001177.png +408 1 motorcycle_s_001792.png +560 1 minibike_s_001969.png +575 0 velocipede_s_001585.png +576 1 moped_s_000035.png +663 0 bike_s_000256.png +682 1 minibike_s_000571.png +785 1 motorcycle_s_001119.png +839 1 moped_s_000009.png +921 0 ordinary_bicycle_s_000023.png +922 1 motorcycle_s_001693.png +964 0 safety_bicycle_s_001570.png +984 0 safety_bike_s_000989.png +996 0 bicycle_s_001673.png +1023 0 ordinary_bicycle_s_000100.png +1114 0 bike_s_000544.png +1132 1 motorcycle_s_001368.png +1158 0 bicycle_s_000392.png +1170 1 motorbike_s_000221.png +1255 0 safety_bike_s_000311.png +1290 0 cycle_s_001745.png +1334 1 motorcycle_s_002030.png +1357 1 motorcycle_s_000074.png +1362 0 cycle_s_002978.png +1457 0 bike_s_001679.png +1555 0 bicycle_s_000536.png +1564 0 bike_s_000926.png +1644 1 motorcycle_s_000070.png +1747 0 safety_bicycle_s_000655.png +1818 0 safety_bicycle_s_000427.png +1841 1 minibike_s_000324.png +1885 1 minibike_s_001631.png +1942 1 motorcycle_s_000629.png +1964 1 motorcycle_s_000605.png +1965 1 motorcycle_s_001973.png +2010 0 bike_s_000555.png +2079 0 bicycle_s_002762.png +2105 0 bicycle_s_000778.png +2163 0 bike_s_001613.png +2296 1 motorcycle_s_001180.png +2319 1 minibike_s_001279.png +2499 1 minibike_s_000451.png +2525 1 motorbike_s_000346.png +2598 1 minibike_s_000117.png +2599 0 bicycle_s_001448.png +2790 1 motorcycle_s_000790.png +2838 0 bicycle_s_002373.png +2852 0 safety_bicycle_s_001202.png +2952 1 motorcycle_s_000001.png +2973 0 bike_s_001882.png +3053 0 bike_s_001113.png +3162 1 minibike_s_000362.png +3228 0 cycle_s_000718.png +3286 0 velocipede_s_001338.png +3464 1 minibike_s_001972.png +3566 0 ordinary_bicycle_s_000107.png +3574 1 motorcycle_s_000776.png +3584 0 safety_bike_s_000934.png +3597 0 bicycle_s_002218.png +3616 0 safety_bicycle_s_001240.png +3653 0 ordinary_bicycle_s_000355.png +3676 1 motorcycle_s_000454.png +3817 1 motorcycle_s_000245.png +3923 1 minibike_s_000743.png +3954 0 safety_bike_s_000830.png +4027 1 minibike_s_001573.png +4036 1 motorbike_s_000141.png +4097 1 minibike_s_000652.png +4197 1 motorbike_s_000058.png +4207 0 bicycle_s_000279.png +4212 0 safety_bike_s_001608.png +4221 0 bicycle_s_000522.png +4291 0 bicycle_s_002569.png +4320 0 bicycle_s_000829.png +4367 0 velocipede_s_000586.png +4416 1 dirt_bike_s_000017.png +4437 0 cycle_s_001640.png +4448 0 bicycle_s_000282.png +4478 1 motorcycle_s_000713.png +4509 1 bike_s_000035.png +4600 0 bike_s_000299.png +4654 1 minibike_s_002198.png +4690 0 safety_bicycle_s_001253.png +4693 1 minibike_s_000110.png +4779 1 motorcycle_s_001370.png +4803 1 motorcycle_s_001363.png +4838 0 ordinary_bicycle_s_000060.png +4880 1 minibike_s_001653.png +4900 0 bicycle_s_001338.png +4911 0 cycle_s_002053.png +4921 0 velocipede_s_001056.png +4957 1 minibike_s_000402.png +4997 1 motorbike_s_000124.png +5001 0 cycle_s_002638.png +5033 0 velocipede_s_000949.png +5152 0 safety_bike_s_000921.png +5213 0 ordinary_bicycle_s_000297.png +5312 1 motorcycle_s_001580.png +5352 0 velocipede_s_000139.png +5375 0 bicycle_s_000561.png +5386 0 ordinary_bicycle_s_000161.png +5403 1 minibike_s_000518.png +5551 1 motorcycle_s_000167.png +5566 0 cycle_s_000318.png +5588 0 velocipede_s_001958.png +5640 0 ordinary_bicycle_s_000201.png +5757 0 bike_s_001462.png +5759 0 bicycle_s_000437.png +5830 0 velocipede_s_000825.png +5866 0 safety_bike_s_000100.png +5882 1 minibike_s_000654.png +5886 0 bicycle_s_000021.png +5975 1 moped_s_000030.png +6070 0 velocipede_s_001142.png +6084 1 motorbike_s_000117.png +6092 0 ordinary_bicycle_s_000036.png +6123 1 motorcycle_s_000787.png +6222 0 bike_s_000516.png +6252 1 motorcycle_s_000256.png +6293 0 bicycle_s_002299.png +6330 0 velocipede_s_001883.png +6333 1 motorcycle_s_002143.png +6386 0 cycle_s_000899.png +6519 0 bicycle_s_002436.png +6540 0 safety_bicycle_s_000255.png +6687 1 minibike_s_000565.png +6701 0 bike_s_000034.png +6710 1 motorcycle_s_001064.png +6718 1 minibike_s_001017.png +6733 1 motorbike_s_000172.png +6741 1 motorcycle_s_000923.png +6832 0 cycle_s_000583.png +6853 1 motorcycle_s_000991.png +6870 1 motorbike_s_000541.png +6895 1 motorcycle_s_001303.png +6903 0 safety_bike_s_000567.png +7026 1 minibike_s_000350.png +7070 1 motorcycle_s_001905.png +7101 0 bicycle_s_001247.png +7105 0 bicycle_s_001693.png +7119 0 bicycle_s_002258.png +7120 0 safety_bike_s_001552.png +7137 0 cycle_s_002651.png +7161 0 bicycle_s_000759.png +7185 1 motorcycle_s_001176.png +7229 0 ordinary_bicycle_s_000432.png +7253 1 minibike_s_000526.png +7255 0 safety_bicycle_s_001049.png +7282 1 minibike_s_001827.png +7286 0 bike_s_001072.png +7362 0 bike_s_001876.png +7505 1 minibike_s_001511.png +7517 0 bike_s_000237.png +7650 1 motorbike_s_000254.png +7699 0 bicycle_s_000180.png +7715 0 safety_bicycle_s_000359.png +7719 1 motorcycle_s_000220.png +7732 1 motorcycle_s_002225.png +7896 1 minibike_s_001185.png +7943 1 motorcycle_s_000025.png +7946 0 safety_bike_s_000058.png +7976 1 dirt_bike_s_000030.png +8138 1 minibike_s_002009.png +8153 0 bicycle_s_000753.png +8191 0 safety_bicycle_s_001320.png +8209 1 motorcycle_s_001287.png +8222 0 ordinary_bicycle_s_000451.png +8247 1 minibike_s_000885.png +8322 1 motorcycle_s_000418.png +8355 0 velocipede_s_000282.png +8408 0 cycle_s_001474.png +8509 0 bicycle_s_000667.png +8533 1 minibike_s_001546.png +8545 0 bicycle_s_001452.png +8579 1 motorcycle_s_000978.png +8585 1 motorcycle_s_000447.png +8595 1 minibike_s_000146.png +8657 1 motorcycle_s_000300.png +8674 0 safety_bicycle_s_001381.png +8715 0 bike_s_001519.png +8740 1 minibike_s_001689.png +8744 0 bike_s_001320.png +8780 0 bike_s_000722.png +8797 1 motorcycle_s_000508.png +8868 1 motorcycle_s_002105.png +8885 1 minibike_s_000165.png +8933 0 cycle_s_002703.png +9006 0 ordinary_bicycle_s_000216.png +9035 1 motorcycle_s_001610.png +9066 0 cycle_s_002779.png +9074 0 bicycle_s_000668.png +9089 1 minibike_s_002186.png +9094 0 bike_s_002118.png +9101 0 safety_bike_s_001472.png +9132 0 ordinary_bicycle_s_000016.png +9137 1 motorcycle_s_001384.png +9199 1 motorcycle_s_000431.png +9230 0 bike_s_000302.png +9317 0 velocipede_s_000659.png +9328 1 motorcycle_s_001585.png +9356 0 bike_s_001027.png +9439 0 bicycle_s_000396.png +9455 1 minibike_s_000149.png +9518 0 velocipede_s_000702.png +9534 0 ordinary_bicycle_s_000155.png +9572 0 cycle_s_003122.png +9601 1 motorbike_s_000021.png +9614 0 safety_bicycle_s_001026.png +9615 0 bike_s_001375.png +9650 0 safety_bicycle_s_000533.png +9657 0 bike_s_000021.png +9743 1 minibike_s_000968.png +9797 1 minibike_s_001873.png +9827 0 bicycle_s_000463.png +9972 0 bike_s_001839.png +10000 1 minibike_s_000340.png +10050 1 minibike_s_000831.png +10083 1 motorcycle_s_001273.png +10091 1 motorcycle_s_000807.png +10098 0 bicycle_s_000156.png +10129 1 motorcycle_s_000732.png +10377 1 dirt_bike_s_000119.png +10468 0 bicycle_s_000231.png +10477 0 ordinary_bicycle_s_000056.png +10504 0 ordinary_bicycle_s_000022.png +10523 0 safety_bicycle_s_001243.png +10557 1 motorcycle_s_000894.png +10571 1 motorcycle_s_001397.png +10608 1 motorcycle_s_000542.png +10620 1 motorcycle_s_000834.png +10632 1 motorcycle_s_001238.png +10665 1 minibike_s_000567.png +10741 1 minibike_s_001512.png +10762 0 bike_s_001945.png +10794 0 cycle_s_003148.png +10798 0 safety_bicycle_s_000019.png +10951 0 safety_bicycle_s_000167.png +11080 1 motorcycle_s_001407.png +11106 0 velocipede_s_001225.png +11174 1 moped_s_000168.png +11229 0 bicycle_s_000071.png +11262 1 minibike_s_002030.png +11307 1 minibike_s_001294.png +11311 1 minibike_s_001767.png +11381 0 safety_bike_s_000984.png +11383 0 bicycle_s_000782.png +11388 0 ordinary_bicycle_s_000095.png +11451 0 cycle_s_001286.png +11617 0 bike_s_001116.png +11625 1 motorcycle_s_002065.png +11653 0 ordinary_bicycle_s_000433.png +11708 1 motorcycle_s_002221.png +11717 0 safety_bike_s_000054.png +11751 0 bicycle_s_001174.png +11789 0 bicycle_s_002222.png +11819 0 velocipede_s_001361.png +11955 0 safety_bike_s_001012.png +11975 1 minibike_s_000244.png +12023 0 bicycle_s_000861.png +12058 1 minibike_s_000566.png +12130 1 motorcycle_s_001244.png +12188 0 bicycle_s_002715.png +12231 0 safety_bike_s_000963.png +12265 1 motorcycle_s_001765.png +12296 0 velocipede_s_000021.png +12633 1 motorcycle_s_000580.png +12767 0 bike_s_001226.png +12822 1 motorcycle_s_000440.png +12845 1 motorcycle_s_000144.png +12964 0 cycle_s_002844.png +13009 1 minibike_s_000485.png +13089 0 ordinary_bicycle_s_000426.png +13279 1 minibike_s_002196.png +13295 0 bike_s_001897.png +13298 0 cycle_s_001374.png +13322 1 motorcycle_s_000585.png +13327 0 bike_s_000026.png +13482 0 bicycle_s_000235.png +13520 1 minibike_s_000108.png +13532 1 motorcycle_s_000072.png +13576 1 motorcycle_s_002234.png +13582 0 bicycle_s_000785.png +13642 1 motorcycle_s_000669.png +13684 0 bicycle_s_000051.png +13692 0 bike_s_001093.png +13716 0 velocipede_s_000049.png +13740 1 bike_s_000023.png +13762 1 motorcycle_s_001696.png +13772 0 safety_bicycle_s_001113.png +13786 1 motorcycle_s_000451.png +13809 0 velocipede_s_000485.png +13860 1 motorcycle_s_001753.png +13879 0 cycle_s_001439.png +13997 1 minibike_s_002038.png +14027 0 bicycle_s_000147.png +14067 0 cycle_s_002399.png +14197 1 motorcycle_s_001565.png +14254 0 bicycle_s_000159.png +14306 1 minibike_s_000035.png +14312 0 safety_bicycle_s_000239.png +14369 0 safety_bike_s_001640.png +14418 1 minibike_s_000698.png +14437 1 minibike_s_000967.png +14485 0 safety_bike_s_000381.png +14504 1 motorcycle_s_000216.png +14551 0 bike_s_000855.png +14679 1 motorcycle_s_001715.png +14715 1 motorcycle_s_002275.png +14783 0 safety_bike_s_001338.png +14786 0 safety_bicycle_s_001705.png +15007 1 minibike_s_000855.png +15036 0 bicycle_s_002132.png +15083 1 minibike_s_000218.png +15108 0 safety_bike_s_000178.png +15130 1 motorcycle_s_001584.png +15177 0 safety_bicycle_s_000162.png +15193 1 motorcycle_s_001392.png +15267 0 bicycle_s_001814.png +15312 1 motorbike_s_000362.png +15335 1 minibike_s_000519.png +15352 1 minibike_s_001417.png +15361 0 safety_bike_s_000277.png +15385 0 cycle_s_002090.png +15444 0 bicycle_s_001168.png +15447 1 minibike_s_000498.png +15535 1 motorcycle_s_001400.png +15564 1 motorcycle_s_000320.png +15569 1 minibike_s_001734.png +15600 0 cycle_s_002659.png +15641 0 bike_s_000990.png +15733 0 velocipede_s_000358.png +15756 0 safety_bicycle_s_000568.png +15830 1 motorcycle_s_000312.png +15851 1 motorcycle_s_001686.png +15867 0 cycle_s_001472.png +15888 1 minibike_s_000064.png +16015 0 safety_bike_s_001784.png +16093 1 motorcycle_s_002236.png +16124 1 minibike_s_000020.png +16150 1 motorcycle_s_001182.png +16185 0 bicycle_s_000781.png +16271 0 ordinary_bicycle_s_000167.png +16285 0 cycle_s_002666.png +16380 1 dirt_bike_s_000134.png +16402 0 bike_s_000015.png +16416 0 bike_s_001767.png +16417 1 motorcycle_s_001790.png +16448 0 bike_s_001915.png +16479 0 bike_s_001415.png +16497 1 motorbike_s_000578.png +16565 0 safety_bicycle_s_000532.png +16568 0 ordinary_bicycle_s_000049.png +16574 1 minibike_s_001639.png +16606 0 bike_s_000129.png +16609 1 minibike_s_001565.png +16660 0 bike_s_002203.png +16701 1 minibike_s_000401.png +16800 0 safety_bicycle_s_001608.png +16839 0 velocipede_s_000670.png +17049 0 safety_bicycle_s_000207.png +17073 1 motorcycle_s_001853.png +17125 0 bike_s_002222.png +17160 1 motorcycle_s_000004.png +17165 1 motorcycle_s_000496.png +17220 1 motorcycle_s_001492.png +17250 0 bike_s_001761.png +17257 0 velocipede_s_001299.png +17310 0 bike_s_000040.png +17373 0 cycle_s_003162.png +17379 0 velocipede_s_001880.png +17471 0 bike_s_002139.png +17481 0 bicycle_s_001583.png +17517 0 safety_bicycle_s_001706.png +17540 0 bike_s_001200.png +17648 1 motorcycle_s_000699.png +17730 0 cycle_s_000492.png +17971 0 cycle_s_000222.png +17988 1 motorcycle_s_002162.png +18020 1 minibike_s_000409.png +18164 0 cycle_s_001735.png +18232 0 bike_s_000657.png +18322 0 safety_bike_s_000643.png +18327 0 bike_s_000506.png +18462 1 minibike_s_001348.png +18518 1 moped_s_000065.png +18556 0 bicycle_s_002729.png +18664 0 bicycle_s_001687.png +18671 0 bicycle_s_002338.png +18787 1 motorcycle_s_000459.png +18794 0 bike_s_000593.png +18796 0 velocipede_s_001422.png +18831 0 ordinary_bicycle_s_000347.png +18892 1 minibike_s_001870.png +18951 0 bicycle_s_001757.png +18995 1 motorcycle_s_001016.png +19015 1 motorbike_s_000041.png +19021 0 bike_s_000522.png +19152 0 ordinary_bicycle_s_000104.png +19154 0 bike_s_000397.png +19336 1 minibike_s_000802.png +19343 1 trail_bike_s_000016.png +19351 1 motorcycle_s_000686.png +19511 0 velocipede_s_001935.png +19518 0 safety_bike_s_000165.png +19532 1 motorbike_s_000308.png +19628 0 bike_s_000018.png +19675 0 cycle_s_001976.png +19701 1 minibike_s_000741.png +19743 1 motorcycle_s_001236.png +19849 1 moped_s_000071.png +19925 0 bike_s_000164.png +19933 0 bike_s_001739.png +19941 0 bicycle_s_001388.png +19958 0 bicycle_s_000149.png +19972 1 motorcycle_s_002197.png +20177 1 motorcycle_s_000277.png +20221 1 motorcycle_s_001690.png +20237 1 minibike_s_002048.png +20267 1 motorcycle_s_000253.png +20397 0 safety_bike_s_001010.png +20498 1 motorcycle_s_000785.png +20548 0 ordinary_bicycle_s_000387.png +20580 0 cycle_s_001309.png +20601 1 motorcycle_s_002316.png +20647 1 motorcycle_s_000340.png +20684 1 moped_s_000124.png +20712 1 minibike_s_001917.png +20733 0 bicycle_s_000951.png +20806 1 motorcycle_s_000002.png +20842 1 motorcycle_s_001063.png +20870 1 motorcycle_s_001641.png +20982 0 bicycle_s_002129.png +20985 1 minibike_s_002182.png +21067 1 minibike_s_000427.png +21077 1 motorcycle_s_001438.png +21309 1 motorcycle_s_000126.png +21584 1 minibike_s_001865.png +21687 1 motorcycle_s_000456.png +21730 1 motorcycle_s_000252.png +21945 0 bicycle_s_000043.png +21956 0 bicycle_s_001928.png +21959 0 safety_bike_s_000173.png +22003 1 motorcycle_s_000696.png +22004 1 motorcycle_s_001413.png +22005 0 safety_bicycle_s_001303.png +22026 1 motorcycle_s_001220.png +22028 0 safety_bicycle_s_000079.png +22116 0 bicycle_s_001681.png +22173 0 cycle_s_002015.png +22237 0 cycle_s_002746.png +22275 1 minibike_s_001250.png +22303 0 safety_bicycle_s_000303.png +22304 0 bike_s_000392.png +22355 1 minibike_s_000408.png +22403 0 safety_bike_s_001355.png +22480 1 motorcycle_s_000076.png +22516 0 safety_bicycle_s_000322.png +22535 0 bike_s_002090.png +22564 1 motorcycle_s_000796.png +22565 1 motorbike_s_000225.png +22581 1 motorcycle_s_000050.png +22661 0 bike_s_000474.png +22673 1 motorcycle_s_000127.png +22699 1 motorcycle_s_002193.png +22748 0 bicycle_s_002374.png +22760 1 minibike_s_001558.png +22793 0 velocipede_s_001279.png +22807 1 minibike_s_001496.png +22811 0 bicycle_s_001411.png +22816 1 minibike_s_001072.png +22852 0 bicycle_s_001688.png +22862 0 safety_bike_s_000160.png +22947 1 minibike_s_000820.png +22948 0 ordinary_bicycle_s_000298.png +22967 0 bicycle_s_000314.png +22983 1 motorcycle_s_001862.png +23228 1 minibike_s_001575.png +23274 1 minibike_s_000709.png +23335 0 velocipede_s_000931.png +23351 0 safety_bike_s_000104.png +23537 1 motorcycle_s_001197.png +23587 1 motorbike_s_000115.png +23603 0 bicycle_s_002728.png +23616 0 safety_bike_s_001474.png +23669 0 bike_s_002024.png +23715 0 cycle_s_000666.png +23744 1 motorcycle_s_000617.png +23763 0 safety_bike_s_000461.png +23888 0 bike_s_001572.png +23908 1 motorcycle_s_000003.png +23986 0 bicycle_s_002029.png +24103 1 minibike_s_000701.png +24124 1 motorbike_s_000009.png +24130 1 minibike_s_001789.png +24170 1 motorcycle_s_000417.png +24182 1 motorcycle_s_000246.png +24246 1 minibike_s_000886.png +24284 1 motorcycle_s_000154.png +24343 1 minibike_s_001169.png +24411 0 cycle_s_002904.png +24461 1 motorcycle_s_000772.png +24467 0 velocipede_s_001158.png +24501 0 bicycle_s_002521.png +24505 1 minibike_s_001179.png +24570 0 bicycle_s_001111.png +24655 0 bicycle_s_001205.png +24723 0 bicycle_s_000435.png +24804 1 minibike_s_001771.png +24813 1 motorcycle_s_000545.png +25033 1 moped_s_000004.png +25035 0 velocipede_s_001358.png +25230 1 motorcycle_s_001402.png +25319 1 minibike_s_001836.png +25320 1 motorcycle_s_002067.png +25326 0 bicycle_s_002012.png +25346 1 motorcycle_s_000517.png +25349 1 minibike_s_001345.png +25350 1 minibike_s_000522.png +25371 1 motorcycle_s_000700.png +25476 1 motorcycle_s_001183.png +25509 0 velocipede_s_001874.png +25568 0 cycle_s_003006.png +25584 1 motorcycle_s_000170.png +25640 0 ordinary_bicycle_s_000419.png +25645 1 motorcycle_s_000284.png +25734 1 motorbike_s_000035.png +25863 1 dirt_bike_s_000005.png +25866 1 motorcycle_s_001784.png +25871 1 motorcycle_s_001848.png +26026 1 minibike_s_002046.png +26050 1 motorcycle_s_002317.png +26060 0 bike_s_001980.png +26108 0 safety_bike_s_000950.png +26114 0 bicycle_s_002237.png +26173 0 cycle_s_000042.png +26185 0 bike_s_000628.png +26216 0 bike_s_000005.png +26228 0 ordinary_bicycle_s_000324.png +26326 1 motorcycle_s_000346.png +26371 0 safety_bicycle_s_000789.png +26468 0 ordinary_bicycle_s_000011.png +26486 1 minibike_s_001157.png +26487 0 bike_s_000051.png +26491 1 motorcycle_s_000919.png +26529 0 velocipede_s_001514.png +26549 0 bike_s_001592.png +26635 0 ordinary_bicycle_s_000066.png +26648 0 bicycle_s_001470.png +26890 1 motorcycle_s_001695.png +26944 1 motorcycle_s_001215.png +26948 0 bike_s_002098.png +26971 0 bike_s_001928.png +27008 0 bicycle_s_001748.png +27125 1 motorcycle_s_001520.png +27134 0 safety_bicycle_s_000728.png +27154 1 motorcycle_s_000925.png +27198 0 safety_bike_s_000914.png +27219 0 safety_bike_s_001659.png +27233 0 safety_bike_s_000155.png +27274 0 bicycle_s_002153.png +27301 0 safety_bike_s_001715.png +27306 0 bicycle_s_000035.png +27326 0 bicycle_s_002669.png +27345 0 bike_s_002277.png +27375 0 ordinary_bicycle_s_000265.png +27425 0 bicycle_s_000369.png +27526 0 velocipede_s_001298.png +27614 1 minibike_s_001944.png +27656 1 motorcycle_s_002215.png +27691 0 ordinary_bicycle_s_000008.png +27747 0 bicycle_s_000491.png +27777 1 motorcycle_s_000146.png +27788 1 minibike_s_001261.png +27808 0 safety_bicycle_s_000140.png +27920 1 motorcycle_s_000407.png +27961 1 minibike_s_000099.png +27963 1 motorcycle_s_001767.png +28014 0 safety_bike_s_000263.png +28051 1 motorcycle_s_001205.png +28062 1 motorbike_s_000134.png +28067 0 safety_bike_s_000245.png +28073 1 motorcycle_s_000422.png +28147 1 minibike_s_000800.png +28259 1 minibike_s_001829.png +28295 1 minibike_s_002124.png +28311 0 bike_s_001414.png +28368 1 motorcycle_s_000423.png +28396 1 motorcycle_s_001435.png +28421 1 motorcycle_s_001237.png +28424 1 motorcycle_s_001878.png +28500 0 cycle_s_002093.png +28530 0 velocipede_s_000265.png +28559 0 bike_s_001847.png +28698 0 cycle_s_000463.png +28879 1 motorcycle_s_002140.png +28898 1 motorcycle_s_001246.png +29044 0 bike_s_001517.png +29119 1 motorcycle_s_000219.png +29180 1 motorbike_s_000501.png +29185 0 velocipede_s_001872.png +29236 1 motorcycle_s_001337.png +29237 1 motorcycle_s_000169.png +29245 1 motorcycle_s_000347.png +29351 0 ordinary_bicycle_s_000274.png +29430 0 safety_bicycle_s_000196.png +29550 0 bicycle_s_002049.png +29553 1 minibike_s_000010.png +29586 1 motorcycle_s_002121.png +29825 1 motorbike_s_000060.png +29857 1 motorbike_s_000534.png +29923 0 ordinary_bicycle_s_000286.png +29966 0 bicycle_s_000723.png +29988 0 bicycle_s_000066.png +30008 1 motorcycle_s_000741.png +30247 1 minibike_s_001168.png +30293 1 bike_s_000001.png +30301 1 minibike_s_001491.png +30395 1 motorcycle_s_000430.png +30497 1 motorcycle_s_000026.png +30526 0 bicycle_s_002448.png +30584 0 cycle_s_001412.png +30611 1 motorcycle_s_000714.png +30959 1 motorcycle_s_000319.png +30971 0 safety_bicycle_s_001254.png +31026 0 ordinary_bicycle_s_000205.png +31105 0 bicycle_s_002400.png +31164 1 motorcycle_s_001126.png +31181 0 bike_s_000364.png +31209 0 ordinary_bicycle_s_000096.png +31230 0 bike_s_000204.png +31243 1 motorcycle_s_001181.png +31260 1 minibike_s_001450.png +31319 1 minibike_s_000130.png +31343 1 motorcycle_s_002214.png +31370 1 motorcycle_s_001263.png +31378 1 minibike_s_000568.png +31381 0 bicycle_s_000774.png +31476 0 ordinary_bicycle_s_000125.png +31518 1 minibike_s_001731.png +31528 0 bicycle_s_000243.png +31601 1 motorcycle_s_000029.png +31654 0 velocipede_s_000023.png +31706 1 minibike_s_001701.png +31779 0 ordinary_bicycle_s_000035.png +31882 0 safety_bike_s_000244.png +31889 0 bicycle_s_000137.png +31900 1 motorbike_s_000331.png +31954 1 motorcycle_s_000120.png +32023 0 velocipede_s_000989.png +32078 1 moped_s_000135.png +32143 0 bicycle_s_000569.png +32183 0 safety_bicycle_s_001699.png +32320 0 bicycle_s_000399.png +32321 0 bike_s_002033.png +32392 0 ordinary_bicycle_s_000280.png +32551 0 bike_s_002283.png +32573 0 cycle_s_001413.png +32652 1 dirt_bike_s_000059.png +32674 1 motorcycle_s_001699.png +32677 1 motorcycle_s_000687.png +32713 0 bike_s_000304.png +32746 1 motorcycle_s_002192.png +32788 1 motorcycle_s_000887.png +32842 0 bike_s_002042.png +32849 0 bicycle_s_000467.png +32868 1 motorcycle_s_001706.png +32974 1 minibike_s_002176.png +32999 0 safety_bicycle_s_000760.png +33025 0 bicycle_s_000546.png +33075 0 safety_bike_s_000158.png +33078 0 bicycle_s_001679.png +33128 1 motorcycle_s_000924.png +33226 0 bicycle_s_000996.png +33274 1 motorcycle_s_000432.png +33385 0 ordinary_bicycle_s_000277.png +33388 0 bike_s_002164.png +33413 1 minibike_s_000036.png +33457 1 motorbike_s_000062.png +33501 1 motorcycle_s_000133.png +33544 0 safety_bike_s_000328.png +33548 0 safety_bicycle_s_001028.png +33569 1 minibike_s_001506.png +33570 1 motorcycle_s_001549.png +33609 0 bike_s_002292.png +33668 1 bike_s_000121.png +33856 1 motorcycle_s_001167.png +33858 0 bicycle_s_000124.png +33870 1 motorcycle_s_002237.png +33948 0 velocipede_s_001870.png +34039 1 moped_s_000119.png +34076 1 minibike_s_000121.png +34145 1 motorcycle_s_000928.png +34150 1 minibike_s_001881.png +34172 0 bike_s_000679.png +34221 1 motorcycle_s_002183.png +34346 0 bike_s_000111.png +34354 0 bike_s_001260.png +34391 0 safety_bicycle_s_000660.png +34397 1 motorcycle_s_000695.png +34413 0 safety_bicycle_s_000233.png +34434 1 motorcycle_s_000792.png +34468 1 motorcycle_s_000922.png +34500 0 bicycle_s_002711.png +34563 0 bike_s_000390.png +34614 1 minibike_s_001094.png +34616 1 minibike_s_000507.png +34627 1 motorcycle_s_001213.png +34644 0 bike_s_000154.png +34685 1 motorcycle_s_000223.png +34717 0 bicycle_s_002661.png +34719 0 safety_bicycle_s_000232.png +34794 0 bicycle_s_001663.png +34826 1 motorbike_s_000463.png +34861 1 minibike_s_002137.png +34882 0 safety_bicycle_s_001651.png +34903 1 motorcycle_s_000151.png +34916 1 motorcycle_s_000217.png +34945 0 bike_s_001877.png +35094 0 velocipede_s_001278.png +35095 1 minibike_s_001540.png +35206 1 minibike_s_001885.png +35210 0 velocipede_s_000012.png +35211 0 bicycle_s_001956.png +35212 0 ordinary_bicycle_s_000098.png +35238 0 bicycle_s_002725.png +35252 0 velocipede_s_001210.png +35368 0 bicycle_s_000039.png +35481 1 motorcycle_s_000654.png +35552 0 safety_bike_s_000079.png +35589 1 motorcycle_s_002291.png +35617 0 cycle_s_002168.png +35695 0 bike_s_001078.png +35716 1 motorbike_s_000427.png +35747 1 minibike_s_001921.png +35760 1 motorcycle_s_000917.png +35813 0 velocipede_s_001920.png +35817 0 cycle_s_003026.png +35876 1 motorcycle_s_000543.png +35988 1 minibike_s_000491.png +36091 1 motorcycle_s_001439.png +36150 1 minibike_s_002084.png +36188 0 bicycle_s_000775.png +36200 1 motorcycle_s_000262.png +36253 1 moped_s_000237.png +36269 0 bicycle_s_000978.png +36286 0 bike_s_000162.png +36302 1 motorbike_s_000106.png +36333 1 motorcycle_s_000136.png +36476 1 motorcycle_s_001319.png +36493 0 safety_bicycle_s_000125.png +36512 0 bicycle_s_001402.png +36530 1 minibike_s_000511.png +36614 1 motorcycle_s_000332.png +36650 1 motorcycle_s_001315.png +36744 0 ordinary_bicycle_s_000031.png +36907 1 motorcycle_s_000353.png +36957 1 motorcycle_s_000521.png +36996 0 safety_bicycle_s_000860.png +37008 1 motorcycle_s_002153.png +37024 0 safety_bicycle_s_000324.png +37081 0 ordinary_bicycle_s_000112.png +37096 1 motorbike_s_000068.png +37180 1 motorcycle_s_002254.png +37256 1 motorcycle_s_000989.png +37435 1 motorcycle_s_000622.png +37439 0 bike_s_000545.png +37469 0 ordinary_bicycle_s_000099.png +37517 0 safety_bike_s_001257.png +37539 0 bicycle_s_001203.png +37560 0 safety_bicycle_s_001085.png +37568 1 motorcycle_s_002222.png +37594 0 safety_bicycle_s_001639.png +37733 0 velocipede_s_001222.png +37790 1 minibike_s_000392.png +37814 0 ordinary_bicycle_s_000308.png +37853 1 motorcycle_s_001896.png +37872 1 motorcycle_s_000325.png +37912 0 bicycle_s_000986.png +37918 0 safety_bicycle_s_000373.png +37958 0 safety_bicycle_s_000348.png +38017 0 bicycle_s_002005.png +38021 1 minibike_s_002130.png +38126 0 safety_bike_s_000867.png +38229 0 bicycle_s_002475.png +38230 1 minibike_s_001193.png +38322 1 minibike_s_001366.png +38367 1 motorcycle_s_001711.png +38382 1 minibike_s_001275.png +38391 0 velocipede_s_001907.png +38573 1 motorcycle_s_000207.png +38752 1 motorcycle_s_001409.png +38915 0 safety_bicycle_s_000261.png +38936 1 minibike_s_000738.png +38973 1 motorcycle_s_001106.png +39117 0 safety_bike_s_000198.png +39131 1 minibike_s_001479.png +39157 0 velocipede_s_000430.png +39276 0 bicycle_s_001409.png +39282 1 motorcycle_s_000938.png +39287 1 motorcycle_s_000941.png +39380 0 bicycle_s_000038.png +39397 1 minibike_s_001016.png +39445 0 velocipede_s_001200.png +39632 0 bike_s_002109.png +39754 0 cycle_s_002092.png +39781 1 motorcycle_s_002066.png +39848 1 motorcycle_s_001920.png +39915 1 minibike_s_000459.png +39967 0 bicycle_s_001904.png +39972 1 minibike_s_001996.png +39990 1 motorcycle_s_001611.png +40041 0 velocipede_s_001141.png +40050 1 minibike_s_001747.png +40081 0 safety_bicycle_s_001029.png +40156 0 ordinary_bicycle_s_000029.png +40171 1 minibike_s_002163.png +40189 0 safety_bike_s_001148.png +40248 0 cycle_s_003008.png +40455 0 bicycle_s_000099.png +40496 1 minibike_s_000429.png +40537 0 bike_s_000003.png +40561 0 cycle_s_002178.png +40686 0 cycle_s_000639.png +40797 1 motorcycle_s_000734.png +40892 1 motorcycle_s_000309.png +40951 0 bicycle_s_000371.png +41043 1 minibike_s_001270.png +41044 1 minibike_s_000914.png +41086 1 moped_s_000021.png +41144 1 motorcycle_s_000242.png +41180 1 minibike_s_000314.png +41294 1 motorcycle_s_000698.png +41306 1 motorcycle_s_001360.png +41343 0 ordinary_bicycle_s_000157.png +41439 1 minibike_s_001838.png +41548 0 bicycle_s_002247.png +41612 1 motorcycle_s_000027.png +41694 1 minibike_s_000906.png +41735 0 safety_bicycle_s_000500.png +41800 1 minibike_s_002146.png +41848 1 motorcycle_s_001242.png +41982 1 motorcycle_s_001707.png +42056 0 cycle_s_003043.png +42107 0 safety_bicycle_s_001109.png +42154 0 bike_s_001131.png +42193 1 motorcycle_s_001118.png +42315 0 bike_s_001418.png +42499 0 bicycle_s_002550.png +42539 0 bicycle_s_002100.png +42543 1 motorcycle_s_000933.png +42570 0 bicycle_s_002624.png +42613 0 safety_bicycle_s_001063.png +42732 1 motorbike_s_000361.png +42768 0 safety_bicycle_s_000193.png +42856 0 safety_bicycle_s_000092.png +42861 1 motorcycle_s_000009.png +42892 0 bicycle_s_001554.png +42995 1 motorcycle_s_001297.png +43033 0 safety_bicycle_s_000296.png +43052 0 safety_bike_s_001371.png +43316 0 bicycle_s_001569.png +43338 1 motorcycle_s_001536.png +43343 0 safety_bicycle_s_001659.png +43412 0 ordinary_bicycle_s_000102.png +43422 0 bike_s_002215.png +43434 0 bicycle_s_002410.png +43464 0 cycle_s_003147.png +43468 0 bicycle_s_002759.png +43481 1 minibike_s_000335.png +43550 0 safety_bike_s_000848.png +43559 0 velocipede_s_000807.png +43573 0 bike_s_000024.png +43593 1 minibike_s_000435.png +43594 1 minibike_s_001498.png +43688 0 velocipede_s_001166.png +43762 1 motorcycle_s_001012.png +43847 0 velocipede_s_000330.png +43895 1 motorcycle_s_000032.png +43981 1 minibike_s_001597.png +44000 1 motorcycle_s_002298.png +44015 1 minibike_s_000102.png +44142 1 motorcycle_s_001507.png +44291 1 motorbike_s_000022.png +44300 1 motorcycle_s_000594.png +44351 1 minibike_s_001539.png +44423 0 bicycle_s_001228.png +44464 1 minibike_s_001344.png +44468 1 motorcycle_s_002271.png +44506 1 motorcycle_s_000791.png +44543 0 ordinary_bicycle_s_000218.png +44551 1 motorcycle_s_000221.png +44553 1 minibike_s_001691.png +44635 1 motorcycle_s_001209.png +44666 0 ordinary_bicycle_s_000101.png +44678 1 motorcycle_s_001326.png +44702 1 minibike_s_001249.png +44709 0 bicycle_s_000408.png +44862 1 minibike_s_000520.png +44863 1 minibike_s_002218.png +44927 1 minibike_s_001458.png +44967 1 moped_s_000034.png +45046 1 motorbike_s_000119.png +45191 1 motorcycle_s_001027.png +45233 0 cycle_s_001477.png +45336 1 motorcycle_s_001710.png +45393 1 minibike_s_000434.png +45442 1 motorcycle_s_000979.png +45449 0 safety_bike_s_001289.png +45461 0 safety_bike_s_001560.png +45483 1 minibike_s_000011.png +45489 0 bicycle_s_001642.png +45529 1 minibike_s_000527.png +45605 0 bicycle_s_001245.png +45638 0 bike_s_000934.png +45673 0 velocipede_s_001244.png +45676 0 velocipede_s_001882.png +45692 0 bike_s_001683.png +45763 1 minibike_s_000127.png +45769 0 bicycle_s_001002.png +45807 1 moped_s_000044.png +45847 1 bike_s_000025.png +45859 1 minibike_s_000690.png +45950 1 minibike_s_000022.png +46022 1 motorcycle_s_001196.png +46106 0 ordinary_bicycle_s_000269.png +46157 0 cycle_s_002503.png +46161 0 ordinary_bicycle_s_000097.png +46186 0 safety_bike_s_000009.png +46203 0 safety_bike_s_000015.png +46288 1 minibike_s_000613.png +46316 1 motorcycle_s_001017.png +46363 1 minibike_s_000203.png +46389 0 velocipede_s_001489.png +46515 1 minibike_s_000813.png +46570 0 safety_bicycle_s_000425.png +46667 1 motorcycle_s_001622.png +46675 1 motorcycle_s_000593.png +46724 1 minibike_s_000116.png +46785 1 motorcycle_s_001563.png +46899 0 cycle_s_001875.png +46922 0 safety_bike_s_001590.png +46955 1 minibike_s_000830.png +46996 1 minibike_s_000570.png +47175 0 bike_s_001380.png +47180 1 moped_s_000236.png +47302 1 motorcycle_s_000339.png +47344 0 safety_bike_s_001465.png +47374 1 motorcycle_s_001714.png +47466 1 minibike_s_001191.png +47469 0 cycle_s_002882.png +47510 0 bicycle_s_000822.png +47519 0 bike_s_001827.png +47567 0 ordinary_bicycle_s_000110.png +47721 1 minibike_s_000293.png +47772 1 motorcycle_s_000249.png +47792 0 ordinary_bicycle_s_000154.png +47888 1 motorcycle_s_001527.png +48028 1 motorcycle_s_001033.png +48044 1 motorcycle_s_001709.png +48045 0 bicycle_s_001348.png +48089 1 minibike_s_002194.png +48112 1 minibike_s_001079.png +48198 0 bicycle_s_000017.png +48220 1 minibike_s_001638.png +48271 1 motorcycle_s_001587.png +48295 1 motorcycle_s_000486.png +48375 1 minibike_s_001880.png +48546 1 dirt_bike_s_000003.png +48553 0 bike_s_000336.png +48575 1 minibike_s_002115.png +48760 1 motorbike_s_000449.png +48837 1 motorcycle_s_000304.png +48887 1 motorcycle_s_000022.png +48941 1 motorcycle_s_001623.png +48958 1 motorbike_s_000223.png +48980 1 motorcycle_s_000290.png +49151 0 safety_bicycle_s_001327.png +49172 0 bike_s_002288.png +49176 1 minibike_s_000569.png +49192 0 bike_s_002047.png +49249 1 motorcycle_s_002031.png +49452 1 bike_s_000062.png +49485 0 cycle_s_000871.png +49492 1 motorcycle_s_001778.png +49578 0 velocipede_s_000010.png +49588 1 motorcycle_s_001247.png +49882 1 motorcycle_s_000724.png +49962 0 velocipede_s_001637.png +49985 1 motorcycle_s_000291.png From ee0fac397783129b536e1ee76ba44ffc3eef3a14 Mon Sep 17 00:00:00 2001 From: ESHA MISHRA <83595196+emish8@users.noreply.github.com> Date: Wed, 15 Feb 2023 15:25:51 +0530 Subject: [PATCH 2/4] Delete starter.ipynb --- project/starter.ipynb | 1106 ----------------------------------------- 1 file changed, 1106 deletions(-) delete mode 100644 project/starter.ipynb diff --git a/project/starter.ipynb b/project/starter.ipynb deleted file mode 100644 index c782396b9..000000000 --- a/project/starter.ipynb +++ /dev/null @@ -1,1106 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Deploy and monitor a machine learning workflow for Image Classification" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setting up this notebook\n", - "\n", - "Notes about the instance size and kernel setup: this notebook has been tested on\n", - "\n", - "1. The `Python 3 (Data Science)` kernel\n", - "2. The `ml.t3.medium` Sagemaker notebook instance\n", - "\n", - "## Data Staging\n", - "\n", - "We'll use a sample dataset called CIFAR to simulate the challenges Scones Unlimited are facing in Image Classification. In order to start working with CIFAR we'll need to:\n", - "\n", - "1. Extract the data from a hosting service\n", - "2. Transform it into a usable shape and format\n", - "3. Load it into a production system\n", - "\n", - "In other words, we're going to do some simple ETL!\n", - "\n", - "### 1. Extract the data from the hosting service\n", - "\n", - "In the cell below, define a function `extract_cifar_data` that extracts python version of the CIFAR-100 dataset. The CIFAR dataaset is open source and generously hosted by the University of Toronto at: https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import requests\n", - "\n", - "def extract_cifar_data(url, filename=\"cifar.tar.gz\"):\n", - " \"\"\"A function for extracting the CIFAR-100 dataset and storing it as a gzipped file\n", - " \n", - " Arguments:\n", - " url -- the URL where the dataset is hosted\n", - " filename -- the full path where the dataset will be written\n", - " \n", - " \"\"\"\n", - " \n", - " # Todo: request the data from the data url\n", - " # Hint: use `requests.get` method\n", - " r = \n", - " with open(filename, \"wb\") as file_context:\n", - " file_context.write(r.content)\n", - " return" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's test it out! Run the following cell and check whether a new file `cifar.tar.gz` is created in the file explorer." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "extract_cifar_data(\"https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz\") " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2. Transform the data into a usable shape and format\n", - "\n", - "Clearly, distributing the data as a gzipped archive makes sense for the hosting service! It saves on bandwidth, storage, and it's a widely-used archive format. In fact, it's so widely used that the Python community ships a utility for working with them, `tarfile`, as part of its Standard Library. Execute the following cell to decompress your extracted dataset:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import tarfile\n", - "\n", - "with tarfile.open(\"cifar.tar.gz\", \"r:gz\") as tar:\n", - " tar.extractall()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A new folder `cifar-100-python` should be created, containing `meta`, `test`, and `train` files. These files are `pickles` and the [CIFAR homepage](https://www.cs.toronto.edu/~kriz/cifar.html) provides a simple script that can be used to load them. We've adapted the script below for you to run:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pickle\n", - "\n", - "with open(\"./cifar-100-python/meta\", \"rb\") as f:\n", - " dataset_meta = pickle.load(f, encoding='bytes')\n", - "\n", - "with open(\"./cifar-100-python/test\", \"rb\") as f:\n", - " dataset_test = pickle.load(f, encoding='bytes')\n", - "\n", - "with open(\"./cifar-100-python/train\", \"rb\") as f:\n", - " dataset_train = pickle.load(f, encoding='bytes')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Feel free to explore the datasets\n", - "\n", - "dataset_train.keys()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As documented on the homepage, `b'data'` contains rows of 3073 unsigned integers, representing three channels (red, green, and blue) for one 32x32 pixel image per row." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "32*32*3" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For a simple gut-check, let's transform one of our images. Each 1024 items in a row is a channel (red, green, then blue). Each 32 items in the channel are a row in the 32x32 image. Using python, we can stack these channels into a 32x32x3 array, and save it as a PNG file:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "\n", - "# Each 1024 in a row is a channel (red, green, then blue)\n", - "row = dataset_train[b'data'][0]\n", - "red, green, blue = row[0:1024], row[1024:2048], row[2048:]\n", - "\n", - "# Each 32 items in the channel are a row in the 32x32 image\n", - "red = red.reshape(32,32)\n", - "green = green.reshape(32,32)\n", - "blue = blue.reshape(32,32)\n", - "\n", - "# Combine the channels into a 32x32x3 image!\n", - "combined = np.dstack((red,green,blue))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For a more concise version, consider the following:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# All in one:\n", - "test_image = np.dstack((\n", - " row[0:1024].reshape(32,32),\n", - " row[1024:2048].reshape(32,32),\n", - " row[2048:].reshape(32,32)\n", - "))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "plt.imshow(test_image);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Looks like a cow! Let's check the label. `dataset_meta` contains label names in order, and `dataset_train` has a list of labels for each row." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dataset_train[b'fine_labels'][0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our image has a label of `19`, so let's see what the 19th item is in the list of label names." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(dataset_meta[b'fine_label_names'][19])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Ok! 'cattle' sounds about right. By the way, using the previous two lines we can do:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "n = 0\n", - "print(dataset_meta[b'fine_label_names'][dataset_train[b'fine_labels'][n]])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we know how to check labels, is there a way that we can also check file names? `dataset_train` also contains a `b'filenames'` key. Let's see what we have here:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(dataset_train[b'filenames'][0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"Taurus\" is the name of a subspecies of cattle, so this looks like a pretty reasonable filename. To save an image we can also do:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.imsave(\"file.png\", test_image)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Your new PNG file should now appear in the file explorer -- go ahead and pop it open to see!\n", - "\n", - "Now that you know how to reshape the images, save them as files, and capture their filenames and labels, let's just capture all the bicycles and motorcycles and save them. Scones Unlimited can use a model that tells these apart to route delivery drivers automatically.\n", - "\n", - "In the following cell, identify the label numbers for Bicycles and Motorcycles:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "\n", - "# Todo: Filter the dataset_train and dataset_meta objects to find the label numbers for Bicycle and Motorcycles\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Good job! We only need objects with label 8 and 48 -- this drastically simplifies our handling of the data! Below we construct a dataframe for you, and you can safely drop the rows that don't contain observations about bicycles and motorcycles. Fill in the missing lines below to drop all other rows:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#Construct the dataframe\n", - "df_train = pd.DataFrame({\n", - " \"filenames\": dataset_train[b'filenames'],\n", - " \"labels\": dataset_train[b'fine_labels'],\n", - " \"row\": range(len(dataset_train[b'filenames']))\n", - "})\n", - "\n", - "# Drop all rows from df_train where label is not 8 or 48\n", - "df_train = #TODO: Fill in\n", - "\n", - "# Decode df_train.filenames so they are regular strings\n", - "df_train[\"filenames\"] = df_train[\"filenames\"].apply(\n", - " lambda x: x.decode(\"utf-8\")\n", - ")\n", - "\n", - "\n", - "df_test = pd.DataFrame({\n", - " \"filenames\": dataset_test[b'filenames'],\n", - " \"labels\": dataset_test[b'fine_labels'],\n", - " \"row\": range(len(dataset_test[b'filenames']))\n", - "})\n", - "\n", - "# Drop all rows from df_test where label is not 8 or 48\n", - "df_test = #TODO: Fill in\n", - "\n", - "# Decode df_test.filenames so they are regular strings\n", - "df_test[\"filenames\"] = df_test[\"filenames\"].apply(\n", - " lambda x: x.decode(\"utf-8\")\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that the data is filtered for just our classes, we can save all our images." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!mkdir ./train\n", - "!mkdir ./test" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the previous sections we introduced you to several key snippets of code:\n", - "\n", - "1. Grabbing the image data:\n", - "\n", - "```python\n", - "dataset_train[b'data'][0]\n", - "```\n", - "\n", - "2. A simple idiom for stacking the image data into the right shape\n", - "\n", - "```python\n", - "import numpy as np\n", - "np.dstack((\n", - " row[0:1024].reshape(32,32),\n", - " row[1024:2048].reshape(32,32),\n", - " row[2048:].reshape(32,32)\n", - "))\n", - "```\n", - "\n", - "3. A simple `matplotlib` utility for saving images\n", - "\n", - "```python\n", - "plt.imsave(path+row['filenames'], target)\n", - "```\n", - "\n", - "Compose these together into a function that saves all the images into the `./test` and `./train` directories. Use the comments in the body of the `save_images` function below to guide your construction of the function:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def save_images():\n", - " #Grab the image data in row-major form\n", - " img = \n", - " \n", - " # Consolidated stacking/reshaping from earlier\n", - " target = \n", - " \n", - " # Save the image\n", - " \n", - " \n", - " # Return any signal data you want for debugging\n", - " return\n", - "\n", - "## TODO: save ALL images using the save_images function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3. Load the data\n", - "\n", - "Now we can load the data into S3.\n", - "\n", - "Using the sagemaker SDK grab the current region, execution role, and bucket." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sagemaker\n", - "\n", - "\n", - "bucket= ## TODO: fill in\n", - "print(\"Default Bucket: {}\".format(bucket))\n", - "\n", - "region = ## TODO: fill in\n", - "print(\"AWS Region: {}\".format(region))\n", - "\n", - "role = ## TODO: fill in\n", - "print(\"RoleArn: {}\".format(role))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With this data we can easily sync your data up into S3!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "os.environ[\"DEFAULT_S3_BUCKET\"] = bucket\n", - "!aws s3 sync ./train s3://${DEFAULT_S3_BUCKET}/train/\n", - "!aws s3 sync ./test s3://${DEFAULT_S3_BUCKET}/test/" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And that's it! You can check the bucket and verify that the items were uploaded.\n", - "\n", - "## Model Training\n", - "\n", - "For Image Classification, Sagemaker [also expects metadata](https://docs.aws.amazon.com/sagemaker/latest/dg/image-classification.html) e.g. in the form of TSV files with labels and filepaths. We can generate these using our Pandas DataFrames from earlier:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def to_metadata_file(df, prefix):\n", - " df[\"s3_path\"] = df[\"filenames\"]\n", - " df[\"labels\"] = df[\"labels\"].apply(lambda x: 0 if x==8 else 1)\n", - " return df[[\"row\", \"labels\", \"s3_path\"]].to_csv(\n", - " f\"{prefix}.lst\", sep=\"\\t\", index=False, header=False\n", - " )\n", - " \n", - "to_metadata_file(df_train.copy(), \"train\")\n", - "to_metadata_file(df_test.copy(), \"test\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also upload our manifest files:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import boto3\n", - "\n", - "# Upload files\n", - "boto3.Session().resource('s3').Bucket(\n", - " bucket).Object('train.lst').upload_file('./train.lst')\n", - "boto3.Session().resource('s3').Bucket(\n", - " bucket).Object('test.lst').upload_file('./test.lst')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using the `bucket` and `region` info we can get the latest prebuilt container to run our training job, and define an output location on our s3 bucket for the model. Use the `image_uris` function from the SageMaker SDK to retrieve the latest `image-classification` image below:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Use the image_uris function to retrieve the latest 'image-classification' image \n", - "algo_image = ## TODO: fill in\n", - "s3_output_location = f\"s3://{bucket}/models/image_model\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We're ready to create an estimator! Create an estimator `img_classifier_model` that uses one instance of `ml.p3.2xlarge`. Ensure that y ou use the output location we defined above - we'll be referring to that later!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "img_classifier_model=sagemaker.estimator.Estimator(\n", - " ## TODO: define your estimator options \n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also set a few key hyperparameters and define the inputs for our model:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "img_classifier_model.set_hyperparameters(\n", - " image_shape=, # TODO: Fill in\n", - " num_classes=, # TODO: Fill in\n", - " num_training_samples= # TODO: fill in\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `image-classification` image uses four input channels with very specific input parameters. For convenience, we've provided them below:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sagemaker.debugger import Rule, rule_configs\n", - "from sagemaker.session import TrainingInput\n", - "model_inputs = {\n", - " \"train\": sagemaker.inputs.TrainingInput(\n", - " s3_data=f\"s3://{bucket}/train/\",\n", - " content_type=\"application/x-image\"\n", - " ),\n", - " \"validation\": sagemaker.inputs.TrainingInput(\n", - " s3_data=f\"s3://{bucket}/test/\",\n", - " content_type=\"application/x-image\"\n", - " ),\n", - " \"train_lst\": sagemaker.inputs.TrainingInput(\n", - " s3_data=f\"s3://{bucket}/train.lst\",\n", - " content_type=\"application/x-image\"\n", - " ),\n", - " \"validation_lst\": sagemaker.inputs.TrainingInput(\n", - " s3_data=f\"s3://{bucket}/test.lst\",\n", - " content_type=\"application/x-image\"\n", - " )\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great, now we can train the model using the model_inputs. In the cell below, call the `fit` method on our model,:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## TODO: train your model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If all goes well, you'll end up with a model topping out above `.8` validation accuracy. With only 1000 training samples in the CIFAR dataset, that's pretty good. We could definitely pursue data augmentation & gathering more samples to help us improve further, but for now let's proceed to deploy our model.\n", - "\n", - "### Getting ready to deploy\n", - "\n", - "To begin with, let's configure Model Monitor to track our deployment. We'll define a `DataCaptureConfig` below:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sagemaker.model_monitor import DataCaptureConfig\n", - "\n", - "data_capture_config = DataCaptureConfig(\n", - " ## TODO: Set config options\n", - " destination_s3_uri=f\"s3://{bucket}/data_capture\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note the `destination_s3_uri` parameter: At the end of the project, we can explore the `data_capture` directory in S3 to find crucial data about the inputs and outputs Model Monitor has observed on our model endpoint over time.\n", - "\n", - "With that done, deploy your model on a single `ml.m5.xlarge` instance with the data capture config attached:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "deployment = img_classifier_model.deploy(\n", - " ## TODO: fill in deployment options\n", - " data_capture_config=data_capture_config\n", - " )\n", - "\n", - "endpoint = deployment.endpoint_name\n", - "print(endpoint)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note the endpoint name for later as well.\n", - "\n", - "Next, instantiate a Predictor:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predictor = ## TODO: fill in" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the code snippet below we are going to prepare one of your saved images for prediction. Use the predictor to process the `payload`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sagemaker.serializers import IdentitySerializer\n", - "import base64\n", - "\n", - "predictor.serializer = IdentitySerializer(\"image/png\")\n", - "with open(\"./test/bicycle_s_001789.png\", \"rb\") as f:\n", - " payload = f.read()\n", - "\n", - " \n", - "inference = ## TODO: Process the payload with your predictor" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Your `inference` object is an array of two values, the predicted probability value for each of your classes (bicycle and motorcycle respectively.) So, for example, a value of `b'[0.91, 0.09]'` indicates the probability of being a bike is 91% and being a motorcycle is 9%." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(inference)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Draft Lambdas and Step Function Workflow\n", - "\n", - "Your operations team uses Step Functions to orchestrate serverless workflows. One of the nice things about Step Functions is that [workflows can call other workflows](https://docs.aws.amazon.com/step-functions/latest/dg/connect-stepfunctions.html), so the team can easily plug your workflow into the broader production architecture for Scones Unlimited.\n", - "\n", - "In this next stage you're going to write and deploy three Lambda functions, and then use the Step Functions visual editor to chain them together! Our functions are going to work with a simple data object:\n", - "\n", - "```python\n", - "{\n", - " \"inferences\": [], # Output of predictor.predict\n", - " \"s3_key\": \"\", # Source data S3 key\n", - " \"s3_bucket\": \"\", # Source data S3 bucket\n", - " \"image_data\": \"\" # base64 encoded string containing the image data\n", - "}\n", - "```\n", - "\n", - "A good test object that you can use for Lambda tests and Step Function executions, throughout the next section, might look like this:\n", - "\n", - "```python\n", - "{\n", - " \"image_data\": \"\",\n", - " \"s3_bucket\": MY_BUCKET_NAME, # Fill in with your bucket\n", - " \"s3_key\": \"test/bicycle_s_000513.png\"\n", - "}\n", - "```\n", - "\n", - "Using these fields, your functions can read and write the necessary data to execute your workflow. Let's start with the first function. Your first Lambda function will copy an object from S3, base64 encode it, and then return it to the step function as `image_data` in an event.\n", - "\n", - "Go to the Lambda dashboard and create a new Lambda function with a descriptive name like \"serializeImageData\" and select thr 'Python 3.8' runtime. Add the same permissions as the SageMaker role you created earlier. (Reminder: you do this in the Configuration tab under \"Permissions\"). Once you're ready, use the starter code below to craft your Lambda handler:\n", - "\n", - "```python\n", - "import json\n", - "import boto3\n", - "import base64\n", - "\n", - "s3 = boto3.client('s3')\n", - "\n", - "def lambda_handler(event, context):\n", - " \"\"\"A function to serialize target data from S3\"\"\"\n", - " \n", - " # Get the s3 address from the Step Function event input\n", - " key = ## TODO: fill in\n", - " bucket = ## TODO: fill in\n", - " \n", - " # Download the data from s3 to /tmp/image.png\n", - " ## TODO: fill in\n", - " \n", - " # We read the data from a file\n", - " with open(\"/tmp/image.png\", \"rb\") as f:\n", - " image_data = base64.b64encode(f.read())\n", - "\n", - " # Pass the data back to the Step Function\n", - " print(\"Event:\", event.keys())\n", - " return {\n", - " 'statusCode': 200,\n", - " 'body': {\n", - " \"image_data\": image_data,\n", - " \"s3_bucket\": bucket,\n", - " \"s3_key\": key,\n", - " \"inferences\": []\n", - " }\n", - " }\n", - "```\n", - "\n", - "The next function is responsible for the classification part - we're going to take the image output from the previous function, decode it, and then pass inferences back to the the Step Function.\n", - "\n", - "Because this Lambda will have runtime dependencies (i.e. the SageMaker SDK) you'll need to package them in your function. *Key reading:* https://docs.aws.amazon.com/lambda/latest/dg/python-package-create.html#python-package-create-with-dependency\n", - "\n", - "Create a new Lambda function with the same rights and a descriptive name, then fill in the starter code below for your classifier Lambda.\n", - "\n", - "```python\n", - "import json\n", - "import sagemaker\n", - "import base64\n", - "from sagemaker.serializers import IdentitySerializer\n", - "\n", - "# Fill this in with the name of your deployed model\n", - "ENDPOINT = ## TODO: fill in\n", - "\n", - "def lambda_handler(event, context):\n", - "\n", - " # Decode the image data\n", - " image = base64.b64decode(## TODO: fill in)\n", - "\n", - " # Instantiate a Predictor\n", - " predictor = ## TODO: fill in\n", - "\n", - " # For this model the IdentitySerializer needs to be \"image/png\"\n", - " predictor.serializer = IdentitySerializer(\"image/png\")\n", - " \n", - " # Make a prediction:\n", - " inferences = ## TODO: fill in\n", - " \n", - " # We return the data back to the Step Function \n", - " event[\"inferences\"] = inferences.decode('utf-8')\n", - " return {\n", - " 'statusCode': 200,\n", - " 'body': json.dumps(event)\n", - " }\n", - "```\n", - "\n", - "Finally, we need to filter low-confidence inferences. Define a threshold between 1.00 and 0.000 for your model: what is reasonble for you? If the model predicts at `.70` for it's highest confidence label, do we want to pass that inference along to downstream systems? Make one last Lambda function and tee up the same permissions:\n", - "\n", - "```python\n", - "import json\n", - "\n", - "\n", - "THRESHOLD = .93\n", - "\n", - "\n", - "def lambda_handler(event, context):\n", - " \n", - " # Grab the inferences from the event\n", - " inferences = ## TODO: fill in\n", - " \n", - " # Check if any values in our inferences are above THRESHOLD\n", - " meets_threshold = ## TODO: fill in\n", - " \n", - " # If our threshold is met, pass our data back out of the\n", - " # Step Function, else, end the Step Function with an error\n", - " if meets_threshold:\n", - " pass\n", - " else:\n", - " raise(\"THRESHOLD_CONFIDENCE_NOT_MET\")\n", - "\n", - " return {\n", - " 'statusCode': 200,\n", - " 'body': json.dumps(event)\n", - " }\n", - "```\n", - "Once you have tested the lambda functions, save the code for each lambda function in a python script called 'lambda.py'.\n", - "\n", - "With your lambdas in place, you can use the Step Functions visual editor to construct a workflow that chains them together. In the Step Functions console you'll have the option to author a Standard step function *Visually*.\n", - "\n", - "When the visual editor opens, you'll have many options to add transitions in your workflow. We're going to keep it simple and have just one: to invoke Lambda functions. Add three of them chained together. For each one, you'll be able to select the Lambda functions you just created in the proper order, filter inputs and outputs, and give them descriptive names.\n", - "\n", - "Make sure that you:\n", - "\n", - "1. Are properly filtering the inputs and outputs of your invokations (e.g. `$.body`)\n", - "2. Take care to remove the error handling from the last function - it's supposed to \"fail loudly\" for your operations colleagues!\n", - "\n", - "Take a screenshot of your working step function in action and export the step function as JSON for your submission package." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "Great! Now you can use the files in `./test` as test files for our workflow. Depending on our threshold, our workflow should reliably pass predictions about images from `./test` on to downstream systems, while erroring out for inferences below our confidence threshold!\n", - "\n", - "### Testing and Evaluation\n", - "\n", - "Do several step function invokations using data from the `./test` folder. This process should give you confidence that the workflow both *succeeds* AND *fails* as expected. In addition, SageMaker Model Monitor will generate recordings of your data and inferences which we can visualize.\n", - "\n", - "Here's a function that can help you generate test inputs for your invokations:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import random\n", - "import boto3\n", - "import json\n", - "\n", - "\n", - "def generate_test_case():\n", - " # Setup s3 in boto3\n", - " s3 = boto3.resource('s3')\n", - " \n", - " # Randomly pick from sfn or test folders in our bucket\n", - " objects = s3.Bucket(bucket).objects.filter(\"test\")\n", - " \n", - " # Grab any random object key from that folder!\n", - " obj = random.choice([x.key for x in objects])\n", - " \n", - " return json.dumps({\n", - " \"image_data\": \"\",\n", - " \"s3_bucket\": bucket,\n", - " \"s3_key\": obj\n", - " })\n", - "generate_test_case()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the Step Function dashboard for your new function, you can create new executions and copy in the generated test cases. Do several executions so that you can generate data you can evaluate and visualize.\n", - "\n", - "Once you've done several executions, let's visualize the record of our inferences. Pull in the JSONLines data from your inferences like so:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sagemaker.s3 import S3Downloader\n", - "\n", - "# In S3 your data will be saved to a datetime-aware path\n", - "# Find a path related to a datetime you're interested in\n", - "data_path = ## TODO: fill in the path to your captured data\n", - "\n", - "S3Downloader.download(data_path, \"captured_data\")\n", - "\n", - "# Feel free to repeat this multiple times and pull in more data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The data are in JSONLines format, where multiple valid JSON objects are stacked on top of eachother in a single `jsonl` file. We'll import an open-source library, `jsonlines` that was purpose built for parsing this format." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install jsonlines\n", - "import jsonlines" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can extract the data from each of the source files:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "# List the file names we downloaded\n", - "file_handles = os.listdir(\"./captured_data\")\n", - "\n", - "# Dump all the data into an array\n", - "json_data = []\n", - "for jsonl in file_handles:\n", - " with jsonlines.open(f\"./captured_data/{jsonl}\") as f:\n", - " json_data.append(f.read())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The data should now be a list of dictionaries, with significant nesting. We'll give you an example of some code that grabs data out of the objects and visualizes it:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Define how we'll get our data\n", - "def simple_getter(obj):\n", - " inferences = obj[\"captureData\"][\"endpointOutput\"][\"data\"]\n", - " timestamp = obj[\"eventMetadata\"][\"inferenceTime\"]\n", - " return json.loads(inferences), timestamp\n", - "\n", - "simple_getter(json_data[0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, here's an example of a visualization you can build with this data. In this last part, you will take some time and build your own - the captured data has the input images, the resulting inferences, and the timestamps." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Populate the data for the x and y axis\n", - "x = []\n", - "y = []\n", - "for obj in json_data:\n", - " inference, timestamp = simple_getter(obj)\n", - " \n", - " y.append(max(inference))\n", - " x.append(timestamp)\n", - "\n", - "# Todo: here is an visualization example, take some time to build another visual that helps monitor the result\n", - "# Plot the data\n", - "plt.scatter(x, y, c=['r' if k<.94 else 'b' for k in y ])\n", - "plt.axhline(y=0.94, color='g', linestyle='--')\n", - "plt.ylim(bottom=.88)\n", - "\n", - "# Add labels\n", - "plt.ylabel(\"Confidence\")\n", - "plt.suptitle(\"Observed Recent Inferences\", size=14)\n", - "plt.title(\"Pictured with confidence threshold for production use\", size=10)\n", - "\n", - "# Give it some pizzaz!\n", - "plt.style.use(\"Solarize_Light2\")\n", - "plt.gcf().autofmt_xdate()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Todo: build your own visualization\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Congratulations!\n", - "\n", - "You've reached the end of the project. In this project you created an event-drivent ML workflow that can be incorporated into the Scones Unlimited production architecture. You used the SageMaker Estimator API to deploy your SageMaker Model and Endpoint, and you used AWS Lambda and Step Functions to orchestrate your ML workflow. Using SageMaker Model Monitor, you instrumented and observed your Endpoint, and at the end of the project you built a visualization to help stakeholders understand the performance of the Endpoint over time. If you're up for it, you can even go further with these stretch goals:\n", - "\n", - "* Extend your workflow to incorporate more classes: the CIFAR dataset includes other vehicles that Scones Unlimited can identify with this model.\n", - "* Modify your event driven workflow: can you rewrite your Lambda functions so that the workflow can process multiple image inputs in parallel? Can the Step Function \"fan out\" to accomodate this new workflow?\n", - "* Consider the test data generator we provided for you. Can we use it to create a \"dummy data\" generator, to simulate a continuous stream of input data? Or a big paralell load of data?\n", - "* What if we want to get notified every time our step function errors out? Can we use the Step Functions visual editor in conjunction with a service like SNS to accomplish this? Try it out!\n", - "\n", - "\n" - ] - } - ], - "metadata": { - "instance_type": "ml.t3.medium", - "kernelspec": { - "display_name": "Python 3 (Data Science)", - "language": "python", - "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-east-1:081325390199:image/datascience-1.0" - }, - "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.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} From f8ca0d65c946da03cf818339152e5d1e20b63bfd Mon Sep 17 00:00:00 2001 From: ESHA MISHRA <83595196+emish8@users.noreply.github.com> Date: Wed, 15 Feb 2023 15:26:42 +0530 Subject: [PATCH 3/4] html version of starter --- project/starter.html | 18495 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 18495 insertions(+) create mode 100644 project/starter.html diff --git a/project/starter.html b/project/starter.html new file mode 100644 index 000000000..a90445d1a --- /dev/null +++ b/project/starter.html @@ -0,0 +1,18495 @@ + + + + + +starter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From e399fd12938bb728ead8c47279cd11f38423fa46 Mon Sep 17 00:00:00 2001 From: ESHA MISHRA <83595196+emish8@users.noreply.github.com> Date: Wed, 15 Feb 2023 15:31:40 +0530 Subject: [PATCH 4/4] Add files via upload --- ...tep function multiple execution history.JPG | Bin 0 -> 106826 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 project/step function (json & screenshot)/step function multiple execution history.JPG diff --git a/project/step function (json & screenshot)/step function multiple execution history.JPG b/project/step function (json & screenshot)/step function multiple execution history.JPG new file mode 100644 index 0000000000000000000000000000000000000000..b2cff066bbe8ea8ac2db37d98568331c758ae916 GIT binary patch literal 106826 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≧$ zK78&1xkbu>Mc1>0(FbUurJkQhdZOC4B5~=`W*F-;JQp>wI2~9`baHbY@`%=z4@<=-yV)Y>4sjX8esy1Cgqv3wU@95S=s1X%1eE4y8rKIO<`&3~g zQSc=3?QT0Kjlpk8s4Ze+>WM;mn&2xR#vk03@2f1#qAJ5o4bm1^~&A7Caf+%5^}kGrFzHA)U@@q zxvmWS(j(#7NcoD4O{`O~?c+nq-$*^u&{9hgT}n*PD!FyZbn^#-Sr|6DaLE>4kNw0g zKcvP$lQQfAN ze+T}Omtt|bcTF2}l7X6}}!R*d#XKF!!CGe8y#7BZYvt_H6w02&yl7uh+=CQCq+E2>2@WIcciaHu%Jk}%wYfdkS)#| z1J?vDx@GL7>v@sYp#!%gynP{|2W?#+t0Fg!tt7=mi=|1mbwwHcy>*R8!b*_$3|FJaLBzHh%@N-BT+^bpbj4ufU< z1t_1i2}!d3hz7bdgMFz=nU~XgDT(Y^aX3QLb|iaR%SGSN*rWBuufqQQ_VRBqb)d!~ zT5MX`c}TYCQu%KD6hLYUQ=2VE$r8HJ~NhOI(B%U&6U6Pfn0CXUzGC^8oiiaDFT2ebred>Kfz*6q)kqgL67JqoiG@yufj#v z3(`STt3tB=3Uho`+D2HZipikE!=2cj*oi0mtVQ9_lKt?&gAt@}XWh`&=;r(CtwNQxHUdfjp^)q36k_1wUiQhxjbW}5PqS^Bfv0UU8B0zyN;xgi@ZA-R_a5(J?| zfNIh;G-Y7QVO&Ww77~gjhFopNYfF5(2_I$zT5-X9IJk}+Jr!ruAztJ57vJ%t+1T_> zR71Zn%3(ED8t5xa-PAW_t2cH$-8(XRlF$d0ug@i1F*P!fe{$LEYU#=cD6LW4{Ch^in&y%Ccyfs_9lFJ9b{TmsW|KXAQ_2sNL*Q}hJe zO&O0k(0o;>d>5vppr(~D5G1F}05W z8O(6ueDNwpU54gy+J&+zx288Ax?&tf&!{J>rb>?YCCVwbRd_FLsv_elH+kh*)?9qb zB;pnP&$Nv86J;~a+;cqEg$u-D=z70j6>~gwyG`*lBl-2X4v(AWD>dDWPIPq%f=U@D z&z$m$W#nPs=0kDie-PUKant!t()J$S+ba260Tt*iR5)+tors04MX5pJ zS$F9;<5^)Jbvl5X0wZ3sYu8WbKXxO+Ft#o6{$crMijLky@%1+*)wRzo~Gyw*>&n`LJIMqu_ z@q$ayeo346n6HVdJbc|0nS~wI%eBpNYnXXSURzX--sm6y1$+w<$1T1O-(IS!&OYQ! zJ3`@epILm9el%MK!At9xxSB-9P9R)xy%LQ`Aqu*Z97tHoKdYjy0Qdb&SSl8Y# z!x7g1Wk{Scl^}vX(J4^f_SUeq@jg)LeH=&fLtDowKAjS5;{4}AQyv!wYiHy zf{TjYY?}lDI-kj(W_C0V)$&C-MpwO`Q0HS;2;UeE(vWwt`_W_Xg2M>n&iS zxN22N0n1MT>eKC=eN#peZ;rflbd&)?Wy--GTGG7YX1vpCjb-gY!IfnpnPm~53Rand zxMv&HIK0yT^lLYA}knNrC{#w}As6>u4nyu1HnR990uz zQ^HYCatQK*@@Mguh{?S>&H$0!694V5IH{h_-vQdXhGRuEU(}k}uLd*}T@U+6X+UBN`LB*-Qksf@|s6|Vtxem1!m}| zDY?h?ZwJg13VlmU0>RwDB1X@KA5BVCW*!oxpD;7VI5j*Ks?*;8`ZXiY2lf>x>aRcB zyV8x;WI;WvfJkVE;Lu-m)7W+1z4Ec0w4UBd-dAkOG8*!ldbk@VBy7Ta%*`_(QQ^O- z)Ws`Wyb;{A!94YiW3~;C%zGm?DUqgYd`Guj`~A>g0O(r_f3-&^w39=EpO>SJGil#x zWo2Iv9@pQ(3(5?aeznN0kE!z~a)Vg_<64CC9gm&QSXrrI-&#McFRJ#Z2-Wa+E5KO@ z*l$smMXyujU%&$&QUwlSW+n%@o9cN)KTim+dw^A#p2ZuZF;=-Zj^L zV-7xRcqf95jeS943VI~*?|UBWJs*ya6z5VE`_nqpMXIQGpPyGsQ=r#4vF&=6YIbMT z8I6`RyfvQJ|1AdbM$b<;Y@ndTE*<`9UM66oq5s)?=`QmsX!sx{$w)O$ziTPT?rHhH zx(UKCMyDxWdvPQyxvLBhh)hbbgQMNVwL#;)&ZKQ}p^RfhitBbtMe$x~`o^E)26QGi zxi7GS`06E|A!Hgd#Jt}$rLAl6Uy&2G0FAB~0iw=9tSYXGjq~TAINp;@B?kcBUjDH?-eWnIUW?e+m!TTRZ_vuzy%s+`p$0)X*ddJLlSbOXXtS!4h{(m8 z7OKn&Up9}NQ!nV6X***Tsp7h=c~iKrd(KmfWHL%(hR20Io0^m{kTq`(RF#?JtGQyn zQVqt&XNK(5TR1YIh^!N3>ouFTxmPns7i=ii?WJeZ4&MZOlR|Vfv_Hl3f_10W>pBVS z9afu(va8I#NKWrMc@>JrC3cW0oGuy@C1GcDn9&{X@E`W)Sw$;+j5heGgTaV~Bg>O6 z)uS44BMa@VaaMDu5{F8QD{EVS6jbn1b7M0F)Kgj*kn!%*gzEq|A4mXb9o+xI^x>;t zB3n^zpW%cq>-x(EN~&)@hX!#s{i8I?O}vcX%rVWJ-@m{5(A*>s9IchDgRGM2=~80E zM#H@=VrVVO9fYaSWy_K-q!^mO_FjaU=P_#Z{NuTfMvLL9>@%H(~)4j+}j zqzZ8}GuE)mz1WNO)meHW(>Sq~CC7fnw>WIs)ZFxO>iv=kJsJ}TzpJ~=>@=Yb)W{d`f*>1l|~7Vf+Sy7CgoJhhIe4fVl#v^01b zX@w+gSlXwmk1cTkRoD_f(YvpL`Ymai(-c`K)Oa#Eop_Sf0{#?bY~!MW%DML|x(JWYQ?@zbuCH6MOYS|wmNj*jbLbdyY|EN|&!-z2R)>+0G z_6sVM;J(dgt@eV_voCJ!luCHF%JkJ5MLVk)v|pL*Z|y4p_1=!Q~FZO?_pwPqCL8^ah>3=!%x z?qc_PbqUCFY#w<#1L8Vy!{`LlE^Z{@H|ym3OS^glanrH6qVbEa2> zr)B@?Uo3qL{kLTkA3guP$PZ%w{cn!M8M6PJho1kVS=QxM%uR%e#+}h zeDBf@A3SoFZ~7>$6hweTzd{2?Vn0%ww-1^hE!8_*4Dyrcel(C_$YUrH3*Nd>Eh_W^ z4Zo$1Y<#b(y9Z2Ji%z^Xpq;a?{oEnX8_tD^>Pw3X^aJQ zOxE;TTI2F`jlKes6QyNu8=UXAhh#Daa%0d2mBLc2<1k1Hv1<#+vO6%aP1fD?A z-Whj)s=ffuV?W6kIaIBqlB**w5WP&WGbLX2{bCk=NvGYRxWU@VdIH|kF3JTW-(|Y| zd8HALs#viEYBxv`^*Htu;OU@|I(E1hI?ll>qBru*%y}e}u_61elL1dt1FjRm3Ju_6 zIn@77y{c!n2C`v1G3~Qu3>S3uLO*K}>m48m{3R+TWrO;H9-(tRrY5jMZBNzA)>a}i zzQAKetumjq|FSyWMvR9qo3FewYkKk%6N@>z70Q_nS=)of1QHn_xkuL7#4<-Rh2J@K z>4l5)5qxFbZm$XI3a7*_<&VzO`^SORaK;a@IfQKFU=z!;Mkt!Z;{4>l`L9g+|5IVs ze>i?IE%h|3^1fW4TkG*`HXLW0a?}RMTEO_0=H&l0&!8^pLtB=5F#H>36W^>0);N5l zO_lfK^Y*SVT)Ga`ihp1eaKs>1JOp!)k+ub|A zMe*3->JMM~3F*jn$d1|^X1^Q4Uw4^`;w(Y7SFm7W z#2Cn?Y#%?>`OYXQW$cOW%mcMoz$Jy|RL|UKK{lg@zH7VoW{E~OwN?EEA%VQVV9Lwk zS2fd?#4+*-QO{x(_;Ma!3=n`7H8V9dAWVU+YU5|TajfN9U-C0;y^+-c(dd9_56ww& zW;5$GDk^+)_|v-(2P+_nx4BmGZZ7Ak2d@g*))TTX4QQ;>0#O!ar|Y(N#eMG?9-)bM(WG0uh3Xg1yvkm0yV`?z zoJul4Hn$9(7r=s|>@xjx5sTdo7zyvcb=@O@`)7WaBX>N0H*A5;3wIVX^fF-KyH?eu;=K1Fwmfi0A z@^r>s;$El4re%5m9=cLCwkN8Z>3;HT8~I@x#lhiba~Cvs%<7#^AZee9fu8U9WDFgn z<~oc0r2Ms1Gy0)Wrlv$V5Q8lBT_uRCHFTbiYpykyaJS<7?w-{fA>wq~H`(b}1{7Og z;{(w>qV;2iB7)C1ufhBLd)cwW>|H5f9xENlB1TT(i@OSUUCt9n6`^@~-v?{HJjO3y z+&z5^3@;lut4eb6-^hi&RW;G^q&EUQ=m z>V}jK(H1y*IHuhf;2B!o_LZm(-4WV|mDOir1EbmrVkuC=&pXXV4ddL^IgkypEx zUoUV1UKzcqE(IOE#LIM8i|ixv8*kID?Z##f)xTtOXbBAemm~Nn8x?S*zxW)IeAOb=wV|y$7FMjFL^wbBa4nf@NjnD&BeHB&$qt-oU{_x5;U!? zxRGWc)BfjsMeD5**1RV=x!x43))>sBg~FiXf9MXniWu+{1>1QKbe$D&sVAS zyvakFK!KMpbkqh(M|e)7I&dg#&jEF)BCU0MwfJ-Jx;80A4=c*ML>~_KayXn<3n68l z1ln%1rHrkGYZACFUQ}-AX2fcn%-`u&?Qj1m(A7#wUS0`p(e?O)TxkwoQ{qRWtowY- z_cm^sEJM614^bZFd@PIa?1eE)=|5^`=%yAM`N=f5PTO;^qxkh>sZgu>eJM>N$Cl5Wg~H<#p?awAU%YAO zmmiEHFG;Bj_c>5?pyJ!R&eg1?rMdL#&M;v*17>}rx0dTl2q5v56mrk*FR7^pg!cYMP8P^o%4 zG7*~0vlrc3WFtg&Gjr1c^=oXLdPg5SNSI2^6PjJ#%*=QSth*mrwEEUuAg|$s|c)L0%)hwYB7Uy`bmp zd#|_>#}*bN5=E+&tF+XQ$IyX9G-A5*t0`(8SZ4U~Lze2U^$n-kGCxVjbvcIKvzexL zjvwBAu#ZjqHSOxGupcf{ zT6*DN$^HP!9E zSsT+O?P?ql_lL^1tM(he15U%nNpxhxQFVzcwpNT`ME?WH1ERIAdC8fD&N{eYVcC=+ zO)MgBbr#t1dQqT#pafECTSm>tJ6P2A!776r0pw~87f%#Snrb0E9;k4wu=RuwG}BB@ z8-F7fdqt7Ls-5gf>*KZ&{{<<9zkj2c4arAx%b77kS>+_szaAfoywVq@7!v-;|5jVm zV^Z)h;BC?T&=qsCKiAE}Cyjmha&zUrhE1IT++c6)m6T0zk?kfTS=g)|FL-h4PGJ0w z?Osa4l@m=nFn(E_(yMm~A4MHTRY0?Rf_0n2l{L7=u!Qm!xs@(3b^ZeIZE}y}(Z1Rb zw~BDTow%vvj63Pe`G`#?UK_^5k6GX$UjQ4{6)AH%Zj_Gb;fDYuPgreG9n{uI-C4?a! zzQ1f^-i*Jc@Z-%V9o*?+={*p==Ra+BG(^IlKBnzJz07e3W$}x9Qr>a(ieyB!1}FU|4sE_;iDJQ(wV|o((?h z8)qYpq$HuK$ill49(6-QH$d5BK!ynvtm0?zEk8L?0bnq8>xN)wo|HMNUg}z@p2h8` z-aqq~TOgm+9pvK@uY`o1u_i(%JI|j%BYfQIh=;l1EbYSv4W-hc1fh>H$IgQs(lzZk zR@ruK>HSEr#~!%4pB~(Ff#X+nMwRF>p!75rh1(BYr+IT3NCvWdaqYn20hf>(vKf(w zF>xhJC*BYU9~lbfP;|l?W;tINN+Cp(WUqRDdkm0=>BJ^;V<|Fs*lnRAB55}~vZ07x zqF5GSrC$$KYY2_c4RtgG?Q1e)D(ZxeNr7hV1<-J@+R6Ig3^lDYAB05Rh$_{-jPT35 zkXY8{fCGEeTiiq!;nsHyQQz&}5c0nsBzqGn$V)3pKeFE?ssOVb zeA(saGqfYRfvC9{ommg|#v~9#f6@ylsx|&8Fuj;N^Z zcq>aVBOup)u8|ipKrFJ&PSAyo?I0rAL<;K9Ad7!F@@}FY>2*<2@j2UpL2Vh7-?8&; z<;bFR^HdF;@*dcmF&1$Na;-v)lz_@ie+(8^g2D+;9MMf3=FSamc0bB>8p+ec!0n7cE(O5R>Psme&bVvVeBr(>ewmGsph1qv?=67ZT-&u#T3VnKr??g`THK+O;u74YEiS>`rO;xbKnV`T-6gm? z#UVg~ySrOY*80v`d;NR%nLYdb|D2gK^D)D`fn+9-_r0I@ey;lxUb+0{+x+e*{BHi| zV9|Gm^f^lReA@x9`-%z8@1@+5{l8|`q-gWACOBFrhNm@r`x~0Z7Vg8O916kTw8uJ$Xj? zrWEhOKj9{9_fY|{_R*$KX0}a=09KV4I|nTA3hNp|$pSiwBcc~SawrC-Vx1p_lTyU@ zh45mkt(by$(Y{MIYRwUiJYi1iRrXrrEd;LkzK22|EqSXNdo#J@c(3L(3N)8#dgYLS z{d?)odSdkB{wp-c8_@X6=<0{ecV}+)@KDq|X)mwwS)0|zwsI~iTs``c08>LexL#uz zx4pf?w=T!_5#s<+zxdH>KH~jzQLRzQI(-06Hfm$|?GwD4NUnTa(?BYfCcs%)v0BYE zy^eSlFEJ3q^Ni5Op4W`rB>N5VC2x|&O3I$jg?=5B-$p3B=%E%EAp1U&NoPO=BRxM^ zI2Igp$}J+1vx{(anLIkY7er}#rRN#06Won!&YJU`Ui9rBOA(C5!@t{zN@sceAa;Tz ziL%#Q%htT_eR`iW%^m)G$|}9mJ%pTp9!srr3OmJt!#~-zf57# z-?V|}#ah{$M&eD1Ys1hk+efX1#PN>z^IP(5YRHLCwK77ygYdDH~QJw zx+Um0wwsO$Jzv7wF3nxiZ)Drdz>p)W=x2*clO& z4bbeVW~l-hKj=w~+nA*Nh7{q+*Uv9GKg*D(3+AO|T)YqSrwP`xHKs# zquFMoK6N`o@{ER%X~P*?yin?$R~9~iWabc7abuVtt=ll0MSbmGxw#S6DaX-8?qD4Z z=FSqo$D5fZJp$U#d14NKo!ORU_HuKTT|I~tQ=*( z@_=qOQ;E!WuZ4*d75F?YkNFAlsB`j|XWqEqYa2gmEfbsPzX)fxh0u(6yEBdnkse-@ zAvm;?;*~XIZ2ZG#twZQNn?QIIGD)wpxKO#-PZ?mL4H0+ad{0p$cl!xu5dmMkAfto0 zgx1Cp9|F$-jFa?u7mDvWhkPU1n~?0R=O`fxvOO{G{Amkc6$cO6 zp{o+kU8kBNoW?t1BzK^_|s!#>$hf5>nCgOa57cNCq*3JiZ!8! zoBH(!F^qIf^DjoJ4sWjtM1+g(Wf~q4tIn5%E|_6Pg5{CLrFYb#En+7Vb(V^}*JI*0 zW_$|R_uuERzfUjsQAp_(s=dhga{t!~1Sbf(~10|pj{%=Ox8 zMD#bX7|AqG3xyASs-`}6d=bD}{c$BYp3Zr164tWXoVC}{ih3-%735Nw)k1Fo+4sY(`|ku`AoUv{;d7+Ma7LW81}z}k3GpReMMQL@;pWS z`jYC1|M82pSI|F*sDG|!0!!hP7%eBGU$Q58hU$UrpPN7%ln(M~KO-F~AC|9<^Uf@0edrf8t^`kPzfqien(XB z4|;C@iFC~))$#c)B9~$qpBimA!2K;^S72RIus;YY>33)+kH4K^JK?4}4lq94X++!{ zmwJkbztjHx>$m*i$9?yb8ej;D93>>`* zn>^+NM6!*BvAO)HXzBSCjb|u_oq%hqCTlnkQ8dNyo-TgS)~IdvIPej7_C^o*u;Yx* z;y8-2d~#kgis#>dup)kYgn&1)lypvV@5d|$@^$#&4_c~LPpG<@j>N~@dWLgYEyp6T>t0M( zXJpuM?&ugXR@PKRbdgH6zsPzS^J--Tw=VOv>yD6ot5gdzQKNdo@HjX!F}h!#{dl{` zqfU9mZ{K*7At`C(c>qz=Xd?*ggb%N+S8>^>;N0oCvNR-&-r

R5x62KF0>rmodK)wl9nW!7X$6uOG7#_SWFzr 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