├── Copy_of_External_data_Local_Files,_Drive,_Sheets,_and_Cloud_Storage.ipynb ├── Lego_Sorter_Image_Classifier.ipynb └── README.md /Copy_of_External_data_Local_Files,_Drive,_Sheets,_and_Cloud_Storage.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Copy of External data: Local Files, Drive, Sheets, and Cloud Storage", 7 | "version": "0.3.2", 8 | "provenance": [], 9 | "collapsed_sections": [], 10 | "toc_visible": true, 11 | "include_colab_link": true 12 | }, 13 | "kernelspec": { 14 | "name": "python3", 15 | "display_name": "Python 3" 16 | }, 17 | "accelerator": "GPU" 18 | }, 19 | "cells": [ 20 | { 21 | "cell_type": "markdown", 22 | "metadata": { 23 | "id": "view-in-github", 24 | "colab_type": "text" 25 | }, 26 | "source": [ 27 | "\"Open" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "metadata": { 33 | "id": "e8Zn3-MGlBL1", 34 | "colab_type": "code", 35 | "outputId": "add272ae-004c-4cb6-e791-59715ef5aa95", 36 | "colab": { 37 | "base_uri": "https://localhost:8080/", 38 | "height": 1000 39 | } 40 | }, 41 | "source": [ 42 | "from __future__ import absolute_import, division, print_function, unicode_literals\n", 43 | "!pip install -q tensorflow-gpu==2.0.0-beta1\n", 44 | "import tensorflow as tf\n", 45 | "\n", 46 | "from tensorflow.keras import datasets, layers, models\n", 47 | "import tensorflow.keras\n", 48 | "from tensorflow import keras\n", 49 | "from tensorflow.keras.models import Sequential, Model\n", 50 | "from tensorflow.keras.layers import Dropout, Input\n", 51 | "from tensorflow.keras.layers import Dense, Flatten\n", 52 | "from tensorflow.keras.optimizers import Adam\n", 53 | "from tensorflow.keras.metrics import categorical_crossentropy\n", 54 | "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", 55 | "print(tf.__version__)\n", 56 | "\n", 57 | "import random\n", 58 | "import glob\n", 59 | "import os\n", 60 | "import pathlib\n", 61 | "import time\n", 62 | "import matplotlib.pyplot as plt\n", 63 | "from datetime import datetime\n", 64 | "from packaging import version\n", 65 | "import IPython.display as display\n", 66 | "\n", 67 | "from google.colab import drive\n", 68 | "drive.mount('/content/drive')\n", 69 | "\n", 70 | "\n", 71 | "!pip install -q tf-nightly-2.0-preview\n", 72 | "\n", 73 | "# Load the TensorBoard notebook extension\n", 74 | "%load_ext tensorboard\n", 75 | "# Clear any logs from previous runs\n", 76 | "!rm -rf ./logs/ \n", 77 | "\n", 78 | "def imshow(image, title=None):\n", 79 | " if len(image.shape) > 3:\n", 80 | " image = tf.squeeze(image, axis=0)\n", 81 | "\n", 82 | " plt.imshow(image)\n", 83 | " if title:\n", 84 | " plt.title(title)\n", 85 | " \n", 86 | "def load_img(path_to_img):\n", 87 | " max_dim = 512\n", 88 | " img = tf.io.read_file(path_to_img)\n", 89 | " img = tf.image.decode_image(img, channels=3)\n", 90 | " img = tf.image.convert_image_dtype(img, tf.float32)\n", 91 | "\n", 92 | " shape = tf.cast(tf.shape(img)[:-1], tf.float32)\n", 93 | " long_dim = max(shape)\n", 94 | " scale = max_dim / long_dim\n", 95 | "\n", 96 | " new_shape = tf.cast(shape * scale, tf.int32)\n", 97 | "\n", 98 | " img = tf.image.resize(img, new_shape)\n", 99 | " img = img[tf.newaxis, :]\n", 100 | " return img\n", 101 | "\n", 102 | "# Function to load and preprocess each image\n", 103 | "\n", 104 | "def _parse_fn(filename, label):\n", 105 | " img = tf.io.read_file(filename)\n", 106 | " img = tf.image.decode_png(img,3)\n", 107 | " img = (tf.cast(img, tf.float32)/127.5) - 1\n", 108 | " img = tf.image.resize(img, (IMAGE_SIZE, IMAGE_SIZE))\n", 109 | " return img, label\n", 110 | "\n", 111 | "\n", 112 | "\n", 113 | "def load_and_preprocess_image(path):\n", 114 | " labels=path.split('/')\n", 115 | " label=labels[8]\n", 116 | " return label\n", 117 | "\n", 118 | "##train_path = '/Users/petesmac/Documents/Machine Learning/DATA/LEGO brick images/train'\n", 119 | "##valid_path = '/Users/petesmac/Documents/Machine Learning/DATA/LEGO brick images/valid'\n", 120 | "\n", 121 | "train_path = '/content/drive/My Drive/DATA/LEGO brick images/train'\n", 122 | "valid_path = '/content/drive/My Drive/DATA/LEGO brick images/valid'\n", 123 | "data_root = pathlib.Path(train_path)\n", 124 | "\n", 125 | "\n", 126 | "label_names = sorted(item.name for item in data_root.glob('*/') if item.is_dir())\n", 127 | "print (label_names)\n", 128 | "\n", 129 | "train_batches = ImageDataGenerator().flow_from_directory(train_path, target_size=(224,224), classes=label_names, batch_size=32)\n", 130 | "valid_batches = ImageDataGenerator().flow_from_directory(valid_path, target_size=(224,224), classes=label_names, batch_size=32)\n", 131 | "##test_batches = ImageDataGenerator().flow_from_directory(test_path, target_size=(224,224), classes=['beer', 'wings'], batch_size=32)\n", 132 | "\n", 133 | "vgg16_model = tensorflow.keras.applications.vgg16.VGG16(weights='imagenet', include_top=False, input_tensor=Input(shape=(224,224,3)))\n", 134 | "\n", 135 | "\n", 136 | "# Start TensorBoard.\n", 137 | "%tensorboard --logdir /content/drive/My Drive/logs/image\n", 138 | "\n", 139 | "# Define the Keras TensorBoard callback.\n", 140 | "logdir=\"/content/drive/My Drive/logs/fit/\" + datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n", 141 | "tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)\n", 142 | "\n", 143 | "# Create the model\n", 144 | "model = Sequential()\n", 145 | " \n", 146 | "# Add the vgg convolutional base model\n", 147 | "model.add(vgg16_model)\n", 148 | " \n", 149 | "# Add new layers\n", 150 | "model.add(Flatten())\n", 151 | "model.add(Dense(1024, activation='relu'))\n", 152 | "model.add(Dropout(0.5))\n", 153 | "model.add(Dense(16, activation='softmax'))\n", 154 | " \n", 155 | "# Show a summary of the model. Check the number of trainable parameters\n", 156 | "model.summary()\n", 157 | "\n", 158 | "model.compile(loss='categorical_crossentropy',\n", 159 | " optimizer=tensorflow.keras.optimizers.RMSprop(lr=1e-4),\n", 160 | " metrics=['acc'])\n", 161 | "\n", 162 | "history = model.fit_generator(\n", 163 | " train_batches,\n", 164 | " steps_per_epoch=train_batches.samples/train_batches.batch_size ,\n", 165 | " epochs=5,\n", 166 | " validation_data=valid_batches,\n", 167 | " validation_steps=valid_batches.samples/valid_batches.batch_size,\n", 168 | " verbose=1)\n", 169 | "\n", 170 | "%tensorboard --logdir logs/gradient_tape\n", 171 | "\n", 172 | "\n", 173 | "saved_model_path = \"/content/drive/My Drive/tmp/saved_models/\"+str(int(time.time()))\n", 174 | "keras.experimental.export_saved_model(model, saved_model_path)\n", 175 | "#tf.saved_model.save(vgg16_model, saved_model_path)\n", 176 | "#model.save('Lego.h5')\n", 177 | "#test_images = \"LEGO brick images/test/test.jpeg\"\n", 178 | "#predictions = model.predict(test_images)\n", 179 | "#predictions = model.predict(test_images)\n", 180 | "\n", 181 | "#writer =tf.summary.FileWriter(\"/tmp/logs\")\n", 182 | "#writer.add_graph(sess.graph)\n" 183 | ], 184 | "execution_count": 0, 185 | "outputs": [ 186 | { 187 | "output_type": "stream", 188 | "text": [ 189 | "\u001b[31mERROR: tf-nightly-2-0-preview 2.0.0.dev20190713 has requirement tb-nightly<1.16.0a0,>=1.15.0a0, but you'll have tb-nightly 1.14.0a20190603 which is incompatible.\u001b[0m\n", 190 | "2.0.0-beta1\n", 191 | "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n", 192 | "\u001b[31mERROR: tensorflow-gpu 2.0.0b1 has requirement tb-nightly<1.14.0a20190604,>=1.14.0a20190603, but you'll have tb-nightly 1.15.0a20190713 which is incompatible.\u001b[0m\n", 193 | "The tensorboard extension is already loaded. To reload it, use:\n", 194 | " %reload_ext tensorboard\n", 195 | "['11214 Bush 3M friction with Cross axle', '18651 Cross Axle 2M with Snap friction', '2357 Brick corner 1x2x2', '3003 Brick 2x2', '3004 Brick 1x2', '3005 Brick 1x1', '3022 Plate 2x2', '3023 Plate 1x2', '3024 Plate 1x1', '3040 Roof Tile 1x2x45deg', '3069 Flat Tile 1x2', '32123 half Bush', '3673 Peg 2M', '3713 Bush for Cross Axle', '3794 Plate 1X2 with 1 Knob', '6632 Technic Lever 3M']\n", 196 | "Found 6379 images belonging to 16 classes.\n", 197 | "Found 6399 images belonging to 16 classes.\n" 198 | ], 199 | "name": "stdout" 200 | }, 201 | { 202 | "output_type": "stream", 203 | "text": [ 204 | "W0713 18:52:42.281055 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer\n", 205 | "W0713 18:52:42.283148 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.iter\n", 206 | "W0713 18:52:42.286889 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.decay\n", 207 | "W0713 18:52:42.290935 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.learning_rate\n", 208 | "W0713 18:52:42.293502 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.momentum\n", 209 | "W0713 18:52:42.295295 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.rho\n", 210 | "W0713 18:52:42.297238 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-1.kernel\n", 211 | "W0713 18:52:42.299403 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-1.bias\n", 212 | "W0713 18:52:42.301524 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-2.kernel\n", 213 | "W0713 18:52:42.303220 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-2.bias\n", 214 | "W0713 18:52:42.304994 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-0.kernel\n", 215 | "W0713 18:52:42.306538 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-0.bias\n", 216 | "W0713 18:52:42.307996 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-1.kernel\n", 217 | "W0713 18:52:42.309723 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-1.bias\n", 218 | "W0713 18:52:42.311373 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-2.kernel\n", 219 | "W0713 18:52:42.313127 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-2.bias\n", 220 | "W0713 18:52:42.314747 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-3.kernel\n", 221 | "W0713 18:52:42.316143 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-3.bias\n", 222 | "W0713 18:52:42.317867 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-4.kernel\n", 223 | "W0713 18:52:42.319405 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-4.bias\n", 224 | "W0713 18:52:42.321108 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-5.kernel\n", 225 | "W0713 18:52:42.322549 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-5.bias\n", 226 | "W0713 18:52:42.324187 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-6.kernel\n", 227 | "W0713 18:52:42.325801 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-6.bias\n", 228 | "W0713 18:52:42.327445 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-7.kernel\n", 229 | "W0713 18:52:42.329090 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-7.bias\n", 230 | "W0713 18:52:42.330634 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-8.kernel\n", 231 | "W0713 18:52:42.332132 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-8.bias\n", 232 | "W0713 18:52:42.333719 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-9.kernel\n", 233 | "W0713 18:52:42.335432 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-9.bias\n", 234 | "W0713 18:52:42.337157 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-10.kernel\n", 235 | "W0713 18:52:42.338653 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-10.bias\n", 236 | "W0713 18:52:42.340185 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-11.kernel\n", 237 | "W0713 18:52:42.341757 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-11.bias\n", 238 | "W0713 18:52:42.343369 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-12.kernel\n", 239 | "W0713 18:52:42.344965 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-12.bias\n", 240 | "W0713 18:52:42.346605 140028060477312 util.py:252] A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/alpha/guide/checkpoints#loading_mechanics for details.\n", 241 | "W0713 18:52:42.355595 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer\n", 242 | "W0713 18:52:42.357573 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.iter\n", 243 | "W0713 18:52:42.359143 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.decay\n", 244 | "W0713 18:52:42.360861 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.learning_rate\n", 245 | "W0713 18:52:42.362195 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.momentum\n", 246 | "W0713 18:52:42.363699 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.rho\n", 247 | "W0713 18:52:42.365350 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-1.kernel\n", 248 | "W0713 18:52:42.368599 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-1.bias\n", 249 | "W0713 18:52:42.369963 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-2.kernel\n", 250 | "W0713 18:52:42.373502 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-2.bias\n", 251 | "W0713 18:52:42.376433 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-0.kernel\n", 252 | "W0713 18:52:42.378418 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-0.bias\n", 253 | "W0713 18:52:42.379777 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-1.kernel\n", 254 | "W0713 18:52:42.381239 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-1.bias\n", 255 | "W0713 18:52:42.383991 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-2.kernel\n", 256 | "W0713 18:52:42.385485 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-2.bias\n", 257 | "W0713 18:52:42.387184 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-3.kernel\n", 258 | "W0713 18:52:42.390088 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-3.bias\n", 259 | "W0713 18:52:42.391767 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-4.kernel\n", 260 | "W0713 18:52:42.393579 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-4.bias\n", 261 | "W0713 18:52:42.397372 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-5.kernel\n", 262 | "W0713 18:52:42.399503 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-5.bias\n", 263 | "W0713 18:52:42.400964 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-6.kernel\n", 264 | "W0713 18:52:42.402504 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-6.bias\n", 265 | "W0713 18:52:42.403954 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-7.kernel\n", 266 | "W0713 18:52:42.405651 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-7.bias\n", 267 | "W0713 18:52:42.407317 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-8.kernel\n", 268 | "W0713 18:52:42.408936 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-8.bias\n", 269 | "W0713 18:52:42.410668 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-9.kernel\n", 270 | "W0713 18:52:42.412231 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-9.bias\n", 271 | "W0713 18:52:42.414001 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-10.kernel\n", 272 | "W0713 18:52:42.415564 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-10.bias\n", 273 | "W0713 18:52:42.417164 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-11.kernel\n", 274 | "W0713 18:52:42.418861 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-11.bias\n", 275 | "W0713 18:52:42.420438 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-12.kernel\n", 276 | "W0713 18:52:42.421958 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-12.bias\n", 277 | "W0713 18:52:42.423557 140028060477312 util.py:252] A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/alpha/guide/checkpoints#loading_mechanics for details.\n", 278 | "W0713 18:52:42.431707 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer\n", 279 | "W0713 18:52:42.433504 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.iter\n", 280 | "W0713 18:52:42.435091 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.decay\n", 281 | "W0713 18:52:42.436612 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.learning_rate\n", 282 | "W0713 18:52:42.438253 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.momentum\n", 283 | "W0713 18:52:42.439751 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer.rho\n", 284 | "W0713 18:52:42.441182 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-1.kernel\n", 285 | "W0713 18:52:42.442796 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-1.bias\n", 286 | "W0713 18:52:42.444458 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-2.kernel\n", 287 | "W0713 18:52:42.446223 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-2.bias\n", 288 | "W0713 18:52:42.447996 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-0.kernel\n", 289 | "W0713 18:52:42.449590 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-0.bias\n", 290 | "W0713 18:52:42.451132 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-1.kernel\n", 291 | "W0713 18:52:42.452643 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-1.bias\n", 292 | "W0713 18:52:42.454497 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-2.kernel\n", 293 | "W0713 18:52:42.456126 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-2.bias\n", 294 | "W0713 18:52:42.457858 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-3.kernel\n", 295 | "W0713 18:52:42.459298 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-3.bias\n", 296 | "W0713 18:52:42.460976 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-4.kernel\n", 297 | "W0713 18:52:42.462731 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-4.bias\n", 298 | "W0713 18:52:42.464324 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-5.kernel\n", 299 | "W0713 18:52:42.465968 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-5.bias\n", 300 | "W0713 18:52:42.467445 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-6.kernel\n", 301 | "W0713 18:52:42.469037 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-6.bias\n", 302 | "W0713 18:52:42.470898 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-7.kernel\n", 303 | "W0713 18:52:42.472506 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-7.bias\n", 304 | "W0713 18:52:42.474199 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-8.kernel\n", 305 | "W0713 18:52:42.475635 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-8.bias\n", 306 | "W0713 18:52:42.477195 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-9.kernel\n", 307 | "W0713 18:52:42.478969 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-9.bias\n", 308 | "W0713 18:52:42.480525 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-10.kernel\n", 309 | "W0713 18:52:42.482168 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-10.bias\n", 310 | "W0713 18:52:42.483734 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-11.kernel\n", 311 | "W0713 18:52:42.485363 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-11.bias\n", 312 | "W0713 18:52:42.487672 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-12.kernel\n", 313 | "W0713 18:52:42.489844 140028060477312 util.py:244] Unresolved object in checkpoint: (root).optimizer's state 'rms' for (root).layer_with_weights-0.layer_with_weights-12.bias\n", 314 | "W0713 18:52:42.491422 140028060477312 util.py:252] A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/alpha/guide/checkpoints#loading_mechanics for details.\n" 315 | ], 316 | "name": "stderr" 317 | }, 318 | { 319 | "output_type": "display_data", 320 | "data": { 321 | "text/plain": [ 322 | "ERROR: Failed to launch TensorBoard (exited with 2).\n", 323 | "Contents of stderr:\n", 324 | "usage: tensorboard [-h] [--helpfull] [--logdir PATH] [--host ADDR]\n", 325 | " [--port PORT] [--purge_orphaned_data BOOL]\n", 326 | " [--reload_interval SECONDS] [--db URI] [--db_import]\n", 327 | " [--db_import_use_op] [--inspect] [--version_tb] [--tag TAG]\n", 328 | " [--event_file PATH] [--path_prefix PATH]\n", 329 | " [--window_title TEXT] [--max_reload_threads COUNT]\n", 330 | " [--reload_task TYPE]\n", 331 | " [--samples_per_plugin SAMPLES_PER_PLUGIN]\n", 332 | " [--debugger_data_server_grpc_port PORT]\n", 333 | " [--debugger_port PORT] [--master_tpu_unsecure_channel ADDR]\n", 334 | "tensorboard: error: unrecognized arguments: Drive/logs/image" 335 | ] 336 | }, 337 | "metadata": { 338 | "tags": [] 339 | } 340 | }, 341 | { 342 | "output_type": "stream", 343 | "text": [ 344 | "Model: \"sequential\"\n", 345 | "_________________________________________________________________\n", 346 | "Layer (type) Output Shape Param # \n", 347 | "=================================================================\n", 348 | "vgg16 (Model) (None, 7, 7, 512) 14714688 \n", 349 | "_________________________________________________________________\n", 350 | "flatten (Flatten) (None, 25088) 0 \n", 351 | "_________________________________________________________________\n", 352 | "dense (Dense) (None, 1024) 25691136 \n", 353 | "_________________________________________________________________\n", 354 | "dropout (Dropout) (None, 1024) 0 \n", 355 | "_________________________________________________________________\n", 356 | "dense_1 (Dense) (None, 16) 16400 \n", 357 | "=================================================================\n", 358 | "Total params: 40,422,224\n", 359 | "Trainable params: 40,422,224\n", 360 | "Non-trainable params: 0\n", 361 | "_________________________________________________________________\n", 362 | "Epoch 1/5\n" 363 | ], 364 | "name": "stdout" 365 | }, 366 | { 367 | "output_type": "stream", 368 | "text": [ 369 | "W0713 18:52:56.711229 140028060477312 deprecation.py:323] From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_grad.py:1250: add_dispatch_support..wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n", 370 | "Instructions for updating:\n", 371 | "Use tf.where in 2.0, which has the same broadcast rule as np.where\n" 372 | ], 373 | "name": "stderr" 374 | }, 375 | { 376 | "output_type": "stream", 377 | "text": [ 378 | " 21/199 [==>...........................] - ETA: 30:36 - loss: 4.5706 - acc: 0.1458" 379 | ], 380 | "name": "stdout" 381 | } 382 | ] 383 | }, 384 | { 385 | "cell_type": "markdown", 386 | "metadata": { 387 | "colab_type": "text", 388 | "id": "7Z2jcRKwUHqV" 389 | }, 390 | "source": [ 391 | "This notebook provides recipes for loading and saving data from external sources." 392 | ] 393 | }, 394 | { 395 | "cell_type": "code", 396 | "metadata": { 397 | "id": "0fd3FxU-Rv_9", 398 | "colab_type": "code", 399 | "colab": { 400 | "base_uri": "https://localhost:8080/", 401 | "height": 403 402 | }, 403 | "outputId": "c78912a6-148b-44f0-a21d-ba46e7934bc9" 404 | }, 405 | "source": [ 406 | "from __future__ import absolute_import, division, print_function, unicode_literals\n", 407 | "\n", 408 | "import matplotlib.pylab as plt\n", 409 | "\n", 410 | "!pip install -q tensorflow-gpu==2.0.0-beta1\n", 411 | "import tensorflow as tf\n", 412 | "from tensorflow import keras\n", 413 | "\n", 414 | "!pip install -q tensorflow_hub\n", 415 | "import tensorflow_hub as hub\n", 416 | "import numpy as np\n", 417 | "import PIL.Image as Image\n", 418 | "from google.colab import drive\n", 419 | "import pathlib\n", 420 | "drive.mount('/content/drive')\n", 421 | "from tensorflow.keras import layers\n", 422 | "train_path = '/content/drive/My Drive/DATA/LEGO brick images/train'\n", 423 | "data_root = pathlib.Path(train_path)\n", 424 | "label_names = sorted(item.name for item in data_root.glob('*/') if item.is_dir())\n", 425 | "print (label_names)\n", 426 | "saved_model_path = \"/content/drive/My Drive/tmp/saved_models/1563018592/\"\n", 427 | "test_path = '/content/drive/My Drive/DATA/LEGO brick images/test/test20.jpg'\n", 428 | "IMAGE_SHAPE = (224, 224)\n", 429 | "classifier = keras.experimental.load_from_saved_model(saved_model_path)\n", 430 | "img = Image.open(test_path).resize(IMAGE_SHAPE)\n", 431 | "\n", 432 | "#print(img)\n", 433 | "\n", 434 | "img = np.array(img)/255.0\n", 435 | "print(img.shape)\n", 436 | "result = classifier.predict(img[np.newaxis, ...])\n", 437 | "print(result.shape)\n", 438 | "#classifier.summary()\n", 439 | "#print(classifier.predict(img).shape)\n", 440 | "print(np.argmax(result[0]))\n", 441 | "predicted_class = np.argmax(result[0], axis=-1)\n", 442 | "print(predicted_class)\n", 443 | "#print(list(predicted_class))\n", 444 | "#labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')\n", 445 | "#imagenet_labels = np.array(open(labels_path).read().splitlines())\n", 446 | "plt.imshow(img)\n", 447 | "plt.axis('off')\n", 448 | "predicted_class_name = label_names[predicted_class]\n", 449 | "_ = plt.title(\"Prediction: \" + predicted_class_name.title())\n" 450 | ], 451 | "execution_count": 21, 452 | "outputs": [ 453 | { 454 | "output_type": "stream", 455 | "text": [ 456 | "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n", 457 | "['11214 Bush 3M friction with Cross axle', '18651 Cross Axle 2M with Snap friction', '2357 Brick corner 1x2x2', '3003 Brick 2x2', '3004 Brick 1x2', '3005 Brick 1x1', '3022 Plate 2x2', '3023 Plate 1x2', '3024 Plate 1x1', '3040 Roof Tile 1x2x45deg', '3069 Flat Tile 1x2', '32123 half Bush', '3673 Peg 2M', '3713 Bush for Cross Axle', '3794 Plate 1X2 with 1 Knob', '6632 Technic Lever 3M']\n", 458 | "(224, 224, 3)\n", 459 | "(1, 16)\n", 460 | "10\n", 461 | "10\n" 462 | ], 463 | "name": "stdout" 464 | }, 465 | { 466 | "output_type": "display_data", 467 | "data": { 468 | "image/png": "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\n", 469 | "text/plain": [ 470 | "
" 471 | ] 472 | }, 473 | "metadata": { 474 | "tags": [] 475 | } 476 | } 477 | ] 478 | }, 479 | { 480 | "cell_type": "code", 481 | "metadata": { 482 | "id": "OceayWUALABE", 483 | "colab_type": "code", 484 | "colab": {} 485 | }, 486 | "source": [ 487 | "%tensorboard --logdir logs" 488 | ], 489 | "execution_count": 0, 490 | "outputs": [] 491 | }, 492 | { 493 | "cell_type": "markdown", 494 | "metadata": { 495 | "id": "mj6-WjnRMTfF", 496 | "colab_type": "text" 497 | }, 498 | "source": [ 499 | "" 500 | ] 501 | } 502 | ] 503 | } -------------------------------------------------------------------------------- /Lego_Sorter_Image_Classifier.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Lego Sorter Image Classifier", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "toc_visible": true, 10 | "include_colab_link": true 11 | }, 12 | "kernelspec": { 13 | "name": "python3", 14 | "display_name": "Python 3" 15 | }, 16 | "accelerator": "GPU" 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "metadata": { 32 | "id": "8G38WciXAcMA" 33 | }, 34 | "source": [ 35 | "!apt install blender\n", 36 | "!apt install libboost-all-dev\n", 37 | "!apt install libgl1-mesa-dev" 38 | ], 39 | "execution_count": null, 40 | "outputs": [] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "metadata": { 45 | "id": "5hGVwOPYAiV-", 46 | "outputId": "97c5c09c-2e43-4f09-f681-944f560039ef", 47 | "colab": { 48 | "base_uri": "https://localhost:8080/" 49 | } 50 | }, 51 | "source": [ 52 | "!pip install wget\n", 53 | "from google.colab import drive\n", 54 | "drive.mount('/content/drive')\n", 55 | "\n", 56 | "import subprocess\n", 57 | "from functools import partial\n", 58 | "from multiprocessing.pool import Pool\n", 59 | "import os\n", 60 | "import sys\n", 61 | "import pandas as pd\n", 62 | "import wget\n", 63 | "from pathlib import Path\n", 64 | "import zipfile\n", 65 | "\n", 66 | "ldraw_fname = \"complete.zip\"\n", 67 | "dataset_files_base = 'ldraw/parts/'\n", 68 | "dataset_path = '/content/drive/My Drive/DATA/LEGO-brick-images/parts.csv'\n", 69 | "config_fname = 'augmentation.json'\n", 70 | "output_path = '/content/drive/My Drive/DATA/LEGO-brick-images/'\n", 71 | "url = \"http://www.ldraw.org/library/updates/complete.zip\"\n", 72 | "\n", 73 | "if (Path(dataset_files_base).is_dir() ==False):\n", 74 | " wget.download(url,ldraw_fname )\n", 75 | " with zipfile.ZipFile(ldraw_fname,\"r\") as zip_ref:\n", 76 | " zip_ref.extractall(\"\")\n", 77 | "number_of_images = 2000\n", 78 | "\n", 79 | "df = pd.read_csv(dataset_path, encoding='utf-8', index_col='part_num')\n", 80 | "\n", 81 | "dataset_files = [os.path.join(dataset_files_base, str(f) + '.dat') for f in df.index]\n", 82 | "# dataset_files = dataset_files[:20]\n", 83 | "\n", 84 | "# todo: load background images in memory before rendering process begins, possible in blender?\n", 85 | "# alternative: remove already used \"background material\" in blender\n", 86 | "def _render(idx_fname, output_path: str, list_length: int, config_fname: str, number_of_images=1):\n", 87 | "\n", 88 | " index, fname = idx_fname\n", 89 | " part_id = os.path.splitext(os.path.basename(fname))[0]\n", 90 | " if os.path.exists(os.path.join(output_path, part_id)):\n", 91 | " print('{} ({}/{}): already exists'.format(fname, index + 1, list_length))\n", 92 | " return\n", 93 | " print('{} ({}/{}): render'.format(fname, index + 1, list_length))\n", 94 | " command_path =\"\"\n", 95 | " if sys.platform =='darwin':\n", 96 | " command_path =\"/Applications/Blender/blender.app/Contents/MacOS/\" # required for OSX\n", 97 | " render_script_path = os.path.join('content','drive','My Drive', 'DATA', 'render.py')\n", 98 | " command = command_path + '!blender -b -P ' + render_script_path + ' --' \\\n", 99 | " + ' -i ' + fname \\\n", 100 | " + ' -c ' + config_fname \\\n", 101 | " + ' -s ' + os.path.join(output_path, part_id) \\\n", 102 | " + ' -n ' + str(number_of_images)\n", 103 | " print (command)\n", 104 | " try:\n", 105 | " p = subprocess.Popen(command, shell=True, stdout=subprocess.DEVNULL)\n", 106 | " except Exception as e:\n", 107 | " print(e)\n", 108 | " except subprocess.TimeoutExpired as e:\n", 109 | " print(e)\n", 110 | " finally:\n", 111 | " p.wait(timeout=30)\n", 112 | "\n", 113 | "if __name__ == '__main__': \n", 114 | " with Pool(1) as p:\n", 115 | " _partial = partial(_render,\n", 116 | " output_path=output_path,\n", 117 | " list_length=len(dataset_files),\n", 118 | " config_fname=config_fname,\n", 119 | " number_of_images=number_of_images)\n", 120 | " p.map(_partial, enumerate(dataset_files), chunksize=1)\n", 121 | "\n", 122 | "\n", 123 | "#_render((0, os.path.join(dataset_files_base, '2698c01.dat')), output_path, 1, config_fname, number_of_images=5)\n", 124 | "\n", 125 | "\n", 126 | "# for idx, dataset_file in enumerate(dataset_files):\n", 127 | "# _render((idx, dataset_file), output_path, len(dataset_files), config_fname, number_of_images)" 128 | ], 129 | "execution_count": 16, 130 | "outputs": [ 131 | { 132 | "output_type": "stream", 133 | "text": [ 134 | "Requirement already satisfied: wget in /usr/local/lib/python3.6/dist-packages (3.2)\n", 135 | "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n", 136 | "ldraw/parts/2420.dat (1/106): render\n", 137 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/2420.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/2420 -n 2000\n", 138 | "ldraw/parts/2357.dat (2/106): render\n", 139 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/2357.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/2357 -n 2000\n", 140 | "ldraw/parts/2431.dat (3/106): render\n", 141 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/2431.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/2431 -n 2000\n", 142 | "ldraw/parts/2450.dat (4/106): render\n", 143 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/2450.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/2450 -n 2000\n", 144 | "ldraw/parts/2458.dat (5/106): render\n", 145 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/2458.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/2458 -n 2000\n", 146 | "ldraw/parts/2476.dat (6/106): render\n", 147 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/2476.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/2476 -n 2000\n", 148 | "ldraw/parts/2780.dat (7/106): render\n", 149 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/2780.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/2780 -n 2000\n", 150 | "ldraw/parts/2817.dat (8/106): render\n", 151 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/2817.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/2817 -n 2000\n", 152 | "ldraw/parts/3001.dat (9/106): render\n", 153 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3001.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3001 -n 2000\n", 154 | "ldraw/parts/3003.dat (10/106): render\n", 155 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3003.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3003 -n 2000\n", 156 | "ldraw/parts/3004.dat (11/106): render\n", 157 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3004.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3004 -n 2000\n", 158 | "ldraw/parts/3005.dat (12/106): render\n", 159 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3005.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3005 -n 2000\n", 160 | "ldraw/parts/3009.dat (13/106): render\n", 161 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3009.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3009 -n 2000\n", 162 | "ldraw/parts/3010.dat (14/106): render\n", 163 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3010.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3010 -n 2000\n", 164 | "ldraw/parts/3020.dat (15/106): render\n", 165 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3020.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3020 -n 2000\n", 166 | "ldraw/parts/3021.dat (16/106): render\n", 167 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3021.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3021 -n 2000\n", 168 | "ldraw/parts/3022.dat (17/106): render\n", 169 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3022.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3022 -n 2000\n", 170 | "ldraw/parts/3023.dat (18/106): render\n", 171 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3023.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3023 -n 2000\n", 172 | "ldraw/parts/3024.dat (19/106): render\n", 173 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3024.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3024 -n 2000\n", 174 | "ldraw/parts/3040.dat (20/106): render\n", 175 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3040.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3040 -n 2000\n", 176 | "ldraw/parts/3045.dat (21/106): render\n", 177 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3045.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3045 -n 2000\n", 178 | "ldraw/parts/3460.dat (22/106): render\n", 179 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3460.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3460 -n 2000\n", 180 | "ldraw/parts/3622.dat (23/106): render\n", 181 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3622.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3622 -n 2000\n", 182 | "ldraw/parts/3623.dat (24/106): render\n", 183 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3623.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3623 -n 2000\n", 184 | "ldraw/parts/3666.dat (25/106): render\n", 185 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3666.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3666 -n 2000\n", 186 | "ldraw/parts/3679.dat (26/106): render\n", 187 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3679.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3679 -n 2000\n", 188 | "ldraw/parts/3700.dat (27/106): render\n", 189 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3700.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3700 -n 2000\n", 190 | "ldraw/parts/3710.dat (28/106): render\n", 191 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3710.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3710 -n 2000\n", 192 | "ldraw/parts/3742.dat (29/106): render\n", 193 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3742.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3742 -n 2000\n", 194 | "ldraw/parts/3795.dat (30/106): render\n", 195 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3795.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3795 -n 2000\n", 196 | "ldraw/parts/3941.dat (31/106): render\n", 197 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3941.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3941 -n 2000\n", 198 | "ldraw/parts/4032.dat (32/106): render\n", 199 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/4032.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/4032 -n 2000\n", 200 | "ldraw/parts/4070.dat (33/106): render\n", 201 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/4070.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/4070 -n 2000\n", 202 | "ldraw/parts/4073.dat (34/106): render\n", 203 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/4073.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/4073 -n 2000\n", 204 | "ldraw/parts/4274.dat (35/106): render\n", 205 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/4274.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/4274 -n 2000\n", 206 | "ldraw/parts/4589.dat (36/106): render\n", 207 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/4589.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/4589 -n 2000\n", 208 | "ldraw/parts/6091.dat (37/106): render\n", 209 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/6091.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/6091 -n 2000\n", 210 | "ldraw/parts/6231.dat (38/106): render\n", 211 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/6231.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/6231 -n 2000\n", 212 | "ldraw/parts/6558.dat (39/106): render\n", 213 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/6558.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/6558 -n 2000\n", 214 | "ldraw/parts/6587.dat (40/106): render\n", 215 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/6587.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/6587 -n 2000\n", 216 | "ldraw/parts/6636.dat (41/106): render\n", 217 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/6636.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/6636 -n 2000\n", 218 | "ldraw/parts/10247.dat (42/106): render\n", 219 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/10247.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/10247 -n 2000\n", 220 | "ldraw/parts/11477.dat (43/106): render\n", 221 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/11477.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/11477 -n 2000\n", 222 | "ldraw/parts/15068.dat (44/106): render\n", 223 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/15068.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/15068 -n 2000\n", 224 | "ldraw/parts/15379.dat (45/106): render\n", 225 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/15379.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/15379 -n 2000\n", 226 | "ldraw/parts/15573.dat (46/106): render\n", 227 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/15573.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/15573 -n 2000\n", 228 | "ldraw/parts/15712.dat (47/106): render\n", 229 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/15712.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/15712 -n 2000\n", 230 | "ldraw/parts/18654.dat (48/106): render\n", 231 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/18654.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/18654 -n 2000\n", 232 | "ldraw/parts/20482.dat (49/106): render\n", 233 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/20482.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/20482 -n 2000\n", 234 | "ldraw/parts/21459.dat (50/106): render\n", 235 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/21459.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/21459 -n 2000\n", 236 | "ldraw/parts/22885.dat (51/106): render\n", 237 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/22885.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/22885 -n 2000\n", 238 | "ldraw/parts/22890.dat (52/106): render\n", 239 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/22890.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/22890 -n 2000\n", 240 | "ldraw/parts/22961.dat (53/106): render\n", 241 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/22961.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/22961 -n 2000\n", 242 | "ldraw/parts/24201.dat (54/106): render\n", 243 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/24201.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/24201 -n 2000\n", 244 | "ldraw/parts/24307.dat (55/106): render\n", 245 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/24307.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/24307 -n 2000\n", 246 | "ldraw/parts/24316.dat (56/106): render\n", 247 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/24316.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/24316 -n 2000\n", 248 | "ldraw/parts/24866.dat (57/106): render\n", 249 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/24866.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/24866 -n 2000\n", 250 | "ldraw/parts/25214.dat (58/106): render\n", 251 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/25214.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/25214 -n 2000\n", 252 | "ldraw/parts/25269.dat (59/106): render\n", 253 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/25269.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/25269 -n 2000\n", 254 | "ldraw/parts/26047.dat (60/106): render\n", 255 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/26047.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/26047 -n 2000\n", 256 | "ldraw/parts/26601.dat (61/106): render\n", 257 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/26601.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/26601 -n 2000\n", 258 | "ldraw/parts/26603.dat (62/106): render\n", 259 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/26603.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/26603 -n 2000\n", 260 | "ldraw/parts/26604.dat (63/106): render\n", 261 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/26604.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/26604 -n 2000\n", 262 | "ldraw/parts/27925.dat (64/106): render\n", 263 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/27925.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/27925 -n 2000\n", 264 | "ldraw/parts/29119.dat (65/106): render\n", 265 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/29119.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/29119 -n 2000\n", 266 | "ldraw/parts/29120.dat (66/106): render\n", 267 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/29120.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/29120 -n 2000\n", 268 | "ldraw/parts/30162.dat (67/106): render\n", 269 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/30162.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/30162 -n 2000\n", 270 | "ldraw/parts/30374.dat (68/106): render\n", 271 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/30374.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/30374 -n 2000\n", 272 | "ldraw/parts/32001.dat (69/106): render\n", 273 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/32001.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/32001 -n 2000\n", 274 | "ldraw/parts/32062.dat (70/106): render\n", 275 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/32062.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/32062 -n 2000\n", 276 | "ldraw/parts/32123.dat (71/106): render\n", 277 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/32123.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/32123 -n 2000\n", 278 | "ldraw/parts/32271.dat (72/106): render\n", 279 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/32271.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/32271 -n 2000\n", 280 | "ldraw/parts/32525.dat (73/106): render\n", 281 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/32525.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/32525 -n 2000\n", 282 | "ldraw/parts/32530.dat (74/106): render\n", 283 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/32530.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/32530 -n 2000\n", 284 | "ldraw/parts/32607.dat (75/106): render\n", 285 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/32607.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/32607 -n 2000\n", 286 | "ldraw/parts/32803.dat (76/106): render\n", 287 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/32803.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/32803 -n 2000\n", 288 | "ldraw/parts/32828.dat (77/106): render\n", 289 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/32828.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/32828 -n 2000\n", 290 | "ldraw/parts/32952.dat (78/106): render\n", 291 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/32952.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/32952 -n 2000\n", 292 | "ldraw/parts/33291.dat (79/106): render\n", 293 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/33291.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/33291 -n 2000\n", 294 | "ldraw/parts/33909.dat (80/106): render\n", 295 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/33909.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/33909 -n 2000\n", 296 | "ldraw/parts/34103.dat (81/106): render\n", 297 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/34103.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/34103 -n 2000\n", 298 | "ldraw/parts/35480.dat (82/106): render\n", 299 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/35480.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/35480 -n 2000\n", 300 | "ldraw/parts/36840.dat (83/106): render\n", 301 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/36840.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/36840 -n 2000\n", 302 | "ldraw/parts/42446.dat (84/106): render\n", 303 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/42446.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/42446 -n 2000\n", 304 | "ldraw/parts/43093.dat (85/106): render\n", 305 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/43093.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/43093 -n 2000\n", 306 | "ldraw/parts/50745.dat (86/106): render\n", 307 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/50745.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/50745 -n 2000\n", 308 | "ldraw/parts/50950.dat (87/106): render\n", 309 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/50950.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/50950 -n 2000\n", 310 | "ldraw/parts/54200.dat (88/106): render\n", 311 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/54200.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/54200 -n 2000\n", 312 | "ldraw/parts/56145.dat (89/106): render\n", 313 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/56145.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/56145 -n 2000\n", 314 | "ldraw/parts/58176.dat (90/106): render\n", 315 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/58176.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/58176 -n 2000\n", 316 | "ldraw/parts/61184.dat (91/106): render\n", 317 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/61184.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/61184 -n 2000\n", 318 | "ldraw/parts/64782.dat (92/106): render\n", 319 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/64782.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/64782 -n 2000\n", 320 | "ldraw/parts/85861.dat (93/106): render\n", 321 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/85861.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/85861 -n 2000\n", 322 | "ldraw/parts/85984.dat (94/106): render\n", 323 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/85984.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/85984 -n 2000\n", 324 | "ldraw/parts/87079.dat (95/106): render\n", 325 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/87079.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/87079 -n 2000\n", 326 | "ldraw/parts/87087.dat (96/106): render\n", 327 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/87087.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/87087 -n 2000\n", 328 | "ldraw/parts/87580.dat (97/106): render\n", 329 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/87580.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/87580 -n 2000\n", 330 | "ldraw/parts/90640.dat (98/106): render\n", 331 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/90640.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/90640 -n 2000\n", 332 | "ldraw/parts/98138.dat (99/106): render\n", 333 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/98138.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/98138 -n 2000\n", 334 | "ldraw/parts/99563.dat (100/106): render\n", 335 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/99563.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/99563 -n 2000\n", 336 | "ldraw/parts/99780.dat (101/106): render\n", 337 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/99780.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/99780 -n 2000\n", 338 | "ldraw/parts/2412b.dat (102/106): render\n", 339 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/2412b.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/2412b -n 2000\n", 340 | "ldraw/parts/3062b.dat (103/106): render\n", 341 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3062b.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3062b -n 2000\n", 342 | "ldraw/parts/3068b.dat (104/106): render\n", 343 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3068b.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3068b -n 2000\n", 344 | "ldraw/parts/3069b.dat (105/106): render\n", 345 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3069b.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3069b -n 2000\n", 346 | "ldraw/parts/3070b.dat (106/106): render\n", 347 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3070b.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3070b -n 2000\n" 348 | ], 349 | "name": "stdout" 350 | } 351 | ] 352 | }, 353 | { 354 | "cell_type": "code", 355 | "metadata": { 356 | "id": "D9ys8lQnDt2T", 357 | "outputId": "43153f3f-afc9-43a2-b9b2-16e8bf4979cf", 358 | "colab": { 359 | "base_uri": "https://localhost:8080/" 360 | } 361 | }, 362 | "source": [ 363 | "!blender -b -P content/drive/My Drive/DATA/render.py -- -i ldraw/parts/3070b.dat -c augmentation.json -s /content/drive/My Drive/DATA/LEGO-brick-images/3070b -n 2000\n" 364 | ], 365 | "execution_count": 18, 366 | "outputs": [ 367 | { 368 | "output_type": "stream", 369 | "text": [ 370 | "src/tcmalloc.cc:283] Attempt to free invalid pointer 0x7fb5fec1e040 \n" 371 | ], 372 | "name": "stdout" 373 | } 374 | ] 375 | }, 376 | { 377 | "cell_type": "code", 378 | "metadata": { 379 | "id": "Dng_Gn61vNdL" 380 | }, 381 | "source": [ 382 | "" 383 | ], 384 | "execution_count": null, 385 | "outputs": [] 386 | }, 387 | { 388 | "cell_type": "code", 389 | "metadata": { 390 | "id": "e8Zn3-MGlBL1", 391 | "outputId": "58155fae-8ba0-44a2-a063-bdfe6d73642d", 392 | "colab": { 393 | "base_uri": "https://localhost:8080/", 394 | "height": 1000 395 | } 396 | }, 397 | "source": [ 398 | "from __future__ import absolute_import, division, print_function, unicode_literals\n", 399 | "!pip install -q tensorflow-gpu==2.0.0-beta1\n", 400 | "import tensorflow as tf\n", 401 | "\n", 402 | "from tensorflow.keras import datasets, layers, models\n", 403 | "import tensorflow.keras\n", 404 | "from tensorflow import keras\n", 405 | "from tensorflow.keras.models import Sequential, Model\n", 406 | "from tensorflow.keras.layers import Dropout, Input\n", 407 | "from tensorflow.keras.layers import Dense, Flatten\n", 408 | "from tensorflow.keras.optimizers import Adam\n", 409 | "from tensorflow.keras.metrics import categorical_crossentropy\n", 410 | "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", 411 | "print(tf.__version__)\n", 412 | "\n", 413 | "import random\n", 414 | "import glob\n", 415 | "import os\n", 416 | "import pathlib\n", 417 | "import time\n", 418 | "import matplotlib.pyplot as plt\n", 419 | "from datetime import datetime\n", 420 | "from packaging import version\n", 421 | "import IPython.display as display\n", 422 | "import pandas\n", 423 | "\n", 424 | "from google.colab import drive\n", 425 | "drive.mount('/content/drive')\n", 426 | "\n", 427 | "\n", 428 | "# Load the TensorBoard notebook extension\n", 429 | "%load_ext tensorboard\n", 430 | "# Clear any logs from previous runs\n", 431 | "!rm -rf ./logs/ \n", 432 | "\n", 433 | "\n", 434 | "##train_path = \"\"/Users/petesmac/Documents/Machine Learning/DATA/LEGO brick images/train'\n", 435 | "##valid_path = '/Users/petesmac/Documents/Machine Learning/DATA/LEGO brick images/valid'\n", 436 | "dataset_path = '/Users/petesmac/Documents/Machine Learning//DATA/LEGO-brick-images/dataset.csv'\n", 437 | "train_path = '/Users/petesmac/Documents/Machine Learning/DATA/LEGO-brick-images/train'\n", 438 | "valid_path = '/Users/petesmac/Documents/Machine Learning/DATA/LEGO-brick-images/valid'\n", 439 | "df = pd.read_csv(dataset_path, skipinitialspace=True, skip_blank_lines=True,encoding='utf-8', index_col='id')\n", 440 | "\n", 441 | "label_names = [( str(f)) for f in df.index]\n", 442 | "#label_names = ['2357','3003','3004']\n", 443 | "print (label_names)\n", 444 | "path= \"/content/drive/My Drive/DATA/LEGO-brick-images\"\n", 445 | "data_root = pathlib.Path(path)\n", 446 | "\n", 447 | "class_size=len(label_names)\n", 448 | "\n", 449 | "train_datagen = ImageDataGenerator(\n", 450 | " rescale=1./255,\n", 451 | " shear_range=0.2,\n", 452 | " zoom_range=0.2,\n", 453 | " horizontal_flip=True)\n", 454 | "\n", 455 | "test_datagen = ImageDataGenerator(\n", 456 | " rescale=1./255,\n", 457 | " shear_range=0.2,\n", 458 | " zoom_range=0.2,\n", 459 | " vertical_flip=True)\n", 460 | "\n", 461 | "valid_datagen = ImageDataGenerator(rescale=1./255)\n", 462 | "\n", 463 | "train_batches = train_datagen.flow_from_directory(path, target_size=(224,224), classes=label_names, batch_size=32)\n", 464 | "valid_batches = valid_datagen.flow_from_directory(path, target_size=(224,224), classes=label_names, batch_size=32)\n", 465 | "test_batches = test_datagen.flow_from_directory(path, target_size=(224,224), classes=label_names, batch_size=32)\n", 466 | " \n", 467 | "image_model = tf.keras.applications.InceptionV3(include_top=False,weights='imagenet',input_tensor=Input(shape=(224,224,3)))\n", 468 | "#vgg16_model = tf.keras.applications.vgg16.VGG16(weights='imagenet', include_top=False, input_tensor=Input(shape=(224,224,3)))\n", 469 | "\n", 470 | "\n", 471 | "# Create the model\n", 472 | "model = Sequential()\n", 473 | " \n", 474 | "# Add the vgg convolutional base model\n", 475 | "model.add(image_model)\n", 476 | " \n", 477 | "# Add new layers\n", 478 | "model.add(Flatten())\n", 479 | "model.add(Dense(1024, activation='relu'))\n", 480 | "model.add(Dropout(0.5))\n", 481 | "model.add(Dense(class_size, activation='softmax'))\n", 482 | " \n", 483 | "# Show a summary of the model. Check the number of trainable parameters\n", 484 | "model.summary()\n", 485 | "\n", 486 | "model.compile(loss='categorical_crossentropy',\n", 487 | " optimizer=tensorflow.keras.optimizers.RMSprop(lr=1e-4),\n", 488 | " metrics=['acc'])\n", 489 | "\n", 490 | "# Define the Keras TensorBoard callback.\n", 491 | "logdir=\"logs/fit/\" + datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n", 492 | "tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir,\n", 493 | " histogram_freq=1,\n", 494 | " write_graph=True,\n", 495 | " write_images=True,\n", 496 | " write_grads=True,\n", 497 | " batch_size=32)\n", 498 | "\n", 499 | "history = model.fit_generator(\n", 500 | " train_batches,\n", 501 | " steps_per_epoch=train_batches.samples/train_batches.batch_size ,\n", 502 | " epochs=5,\n", 503 | " validation_data=valid_batches,\n", 504 | " validation_steps=valid_batches.samples/valid_batches.batch_size,\n", 505 | " verbose=1,\n", 506 | " callbacks=[tensorboard_callback])\n", 507 | "model.evaluate(test_batches)\n", 508 | "%tensorboard --logdir logs\n", 509 | "\n", 510 | "saved_model_path = \"/content/drive/My Drive/tmp/saved_models/\"+str(int(time.time()))\n", 511 | "keras.experimental.export_saved_model(model, saved_model_path)" 512 | ], 513 | "execution_count": null, 514 | "outputs": [ 515 | { 516 | "output_type": "stream", 517 | "text": [ 518 | "\u001b[K |████████████████████████████████| 348.9MB 51kB/s \n", 519 | "\u001b[K |████████████████████████████████| 3.1MB 50.8MB/s \n", 520 | "\u001b[K |████████████████████████████████| 501kB 53.8MB/s \n", 521 | "\u001b[?25h" 522 | ], 523 | "name": "stdout" 524 | }, 525 | { 526 | "output_type": "stream", 527 | "text": [ 528 | "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", 529 | " _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n", 530 | "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", 531 | " _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n", 532 | "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", 533 | " _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n", 534 | "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", 535 | " _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n", 536 | "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", 537 | " _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n", 538 | "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", 539 | " np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n", 540 | "/usr/local/lib/python3.6/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", 541 | " _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n", 542 | "/usr/local/lib/python3.6/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", 543 | " _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n", 544 | "/usr/local/lib/python3.6/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", 545 | " _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n", 546 | "/usr/local/lib/python3.6/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", 547 | " _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n", 548 | "/usr/local/lib/python3.6/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", 549 | " _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n", 550 | "/usr/local/lib/python3.6/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", 551 | " np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n" 552 | ], 553 | "name": "stderr" 554 | }, 555 | { 556 | "output_type": "stream", 557 | "text": [ 558 | "2.0.0-beta1\n", 559 | "Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n", 560 | "\n", 561 | "Enter your authorization code:\n", 562 | "··········\n", 563 | "Mounted at /content/drive\n" 564 | ], 565 | "name": "stdout" 566 | }, 567 | { 568 | "output_type": "error", 569 | "ename": "NameError", 570 | "evalue": "ignored", 571 | "traceback": [ 572 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 573 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", 574 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0mtrain_path\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'/Users/petesmac/Documents/Machine Learning/DATA/LEGO-brick-images/train'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 44\u001b[0m \u001b[0mvalid_path\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'/Users/petesmac/Documents/Machine Learning/DATA/LEGO-brick-images/valid'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 45\u001b[0;31m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdataset_path\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mskipinitialspace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mskip_blank_lines\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf-8'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex_col\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'id'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 46\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0mlabel_names\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 575 | "\u001b[0;31mNameError\u001b[0m: name 'pd' is not defined" 576 | ] 577 | } 578 | ] 579 | }, 580 | { 581 | "cell_type": "markdown", 582 | "metadata": { 583 | "id": "Nt_y_vo0_52h" 584 | }, 585 | "source": [ 586 | "# New Section" 587 | ] 588 | }, 589 | { 590 | "cell_type": "markdown", 591 | "metadata": { 592 | "id": "0MxNFlxaNIii" 593 | }, 594 | "source": [ 595 | "" 596 | ] 597 | }, 598 | { 599 | "cell_type": "markdown", 600 | "metadata": { 601 | "id": "7Z2jcRKwUHqV" 602 | }, 603 | "source": [ 604 | "This notebook provides recipes for loading and saving data from external sources." 605 | ] 606 | }, 607 | { 608 | "cell_type": "markdown", 609 | "metadata": { 610 | "id": "RGBAVArKA2U2" 611 | }, 612 | "source": [ 613 | "" 614 | ] 615 | }, 616 | { 617 | "cell_type": "code", 618 | "metadata": { 619 | "id": "JLOUroipA1Jm" 620 | }, 621 | "source": [ 622 | "" 623 | ], 624 | "execution_count": null, 625 | "outputs": [] 626 | }, 627 | { 628 | "cell_type": "code", 629 | "metadata": { 630 | "id": "0fd3FxU-Rv_9", 631 | "outputId": "939dcc5f-803a-4d69-fb61-632fd2f057bd", 632 | "colab": { 633 | "base_uri": "https://localhost:8080/", 634 | "height": 760 635 | } 636 | }, 637 | "source": [ 638 | "from __future__ import absolute_import, division, print_function, unicode_literals\n", 639 | "\n", 640 | "import matplotlib.pylab as plt\n", 641 | "\n", 642 | "!pip install -q tensorflow-gpu==2.0.0-beta1\n", 643 | "import tensorflow as tf\n", 644 | "from tensorflow import keras\n", 645 | "\n", 646 | "import numpy as np\n", 647 | "import PIL.Image as Image\n", 648 | "from google.colab import drive\n", 649 | "import pathlib\n", 650 | "import csv\n", 651 | "drive.mount('/content/drive')\n", 652 | "from tensorflow.keras import layers\n", 653 | "path= \"/content/drive/My Drive/DATA/LEGO brick images\"\n", 654 | "with open(path+\"/labels.csv\", 'r') as f:\n", 655 | " reader = csv.reader(f,quoting=csv.QUOTE_ALL)\n", 656 | " label_names = list(reader)\n", 657 | "label_names=label_names[0]\n", 658 | "print (label_names)\n", 659 | "saved_model_path = \"/content/drive/My Drive/tmp/saved_models/1563634289/\"\n", 660 | "test_path = '/content/drive/My Drive/DATA/LEGO brick images/test6.JPG'\n", 661 | "IMAGE_SHAPE = (224, 224)\n", 662 | "img =Image.open(test_path).resize(IMAGE_SHAPE)\n", 663 | "print(img.format)\n", 664 | "print(img.mode)\n", 665 | "print(img.size)\n", 666 | "img=img.convert('RGB')\n", 667 | "\n", 668 | "\n", 669 | "#print(img.shape)\n", 670 | "img = np.array(img)/255.0\n", 671 | "imgr = tf.reshape(img, [1,224, 224, 3])\n", 672 | "print(imgr.shape)\n", 673 | "classifier = tf.keras.experimental.load_from_saved_model(saved_model_path)\n", 674 | "\n", 675 | "result = classifier.predict(imgr)\n", 676 | "print(result.shape)\n", 677 | "classifier.summary()\n", 678 | "#print(classifier.predict(img).shape)\n", 679 | "print(np.argmax(result[0]))\n", 680 | "predicted_class = np.argmax(result[0], axis=-1)\n", 681 | "print(predicted_class)\n", 682 | "img = tf.reshape(img, [224, 224, 3])\n", 683 | "plt.imshow(img)\n", 684 | "plt.axis('off')\n", 685 | "predicted_class_name = label_names[predicted_class]\n", 686 | "_ = plt.title(\"Prediction: \" + predicted_class_name.title())\n" 687 | ], 688 | "execution_count": null, 689 | "outputs": [ 690 | { 691 | "output_type": "stream", 692 | "text": [ 693 | "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n", 694 | "['11214 Bush 3M friction with Cross axle', '18651 Cross Axle 2M with Snap friction', '2357 Brick corner 1x2x2', '3003 Brick 2x2', '3004 Brick 1x2', '3005 Brick 1x1', '3022 Plate 2x2', '3023 Plate 1x2', '3024 Plate 1x1', '3040 Roof Tile 1x2x45deg', '3069 Flat Tile 1x2', '32123 half Bush', '3673 Peg 2M', '3713 Bush for Cross Axle', '3794 Plate 1X2 with 1 Knob', '6632 Technic Lever 3M']\n", 695 | "None\n", 696 | "RGB\n", 697 | "(224, 224)\n", 698 | "(1, 224, 224, 3)\n", 699 | "(1, 16)\n", 700 | "Model: \"sequential\"\n", 701 | "_________________________________________________________________\n", 702 | "Layer (type) Output Shape Param # \n", 703 | "=================================================================\n", 704 | "inception_v3 (Model) (None, 5, 5, 2048) 21802784 \n", 705 | "_________________________________________________________________\n", 706 | "flatten (Flatten) (None, 51200) 0 \n", 707 | "_________________________________________________________________\n", 708 | "dense (Dense) (None, 1024) 52429824 \n", 709 | "_________________________________________________________________\n", 710 | "dropout (Dropout) (None, 1024) 0 \n", 711 | "_________________________________________________________________\n", 712 | "dense_1 (Dense) (None, 16) 16400 \n", 713 | "=================================================================\n", 714 | "Total params: 74,249,008\n", 715 | "Trainable params: 74,214,576\n", 716 | "Non-trainable params: 34,432\n", 717 | "_________________________________________________________________\n", 718 | "3\n", 719 | "3\n" 720 | ], 721 | "name": "stdout" 722 | }, 723 | { 724 | "output_type": "display_data", 725 | "data": { 726 | "image/png": "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\nbmHXNpN2AAAAAElFTkSuQmCC\n", 727 | "text/plain": [ 728 | "
" 729 | ] 730 | }, 731 | "metadata": { 732 | "tags": [] 733 | } 734 | } 735 | ] 736 | }, 737 | { 738 | "cell_type": "code", 739 | "metadata": { 740 | "id": "LQz0cHX1vhFb" 741 | }, 742 | "source": [ 743 | "!pip install -q tensorflow-gpu==2.0.0-beta1\n", 744 | "%load_ext tensorboard" 745 | ], 746 | "execution_count": null, 747 | "outputs": [] 748 | }, 749 | { 750 | "cell_type": "code", 751 | "metadata": { 752 | "id": "JXYrSRhB-hXL", 753 | "outputId": "0f507b03-3cfa-4cc5-894a-511ac876b009", 754 | "colab": { 755 | "base_uri": "https://localhost:8080/", 756 | "height": 102 757 | } 758 | }, 759 | "source": [ 760 | "!ls\n", 761 | "!ls 'drive/My Drive/'tmp/saved_models/\n", 762 | "!saved_model_cli show --dir 'drive/My Drive/tmp/saved_models/1563479506' --tag_set serve" 763 | ], 764 | "execution_count": null, 765 | "outputs": [ 766 | { 767 | "output_type": "stream", 768 | "text": [ 769 | "drive sample_data\n", 770 | "1563018592 1563048769\t1563133774 1563399890\t1563479506\n", 771 | "The given SavedModel MetaGraphDef contains SignatureDefs with the following keys:\n", 772 | "SignatureDef key: \"__saved_model_init_op\"\n", 773 | "SignatureDef key: \"serving_default\"\n" 774 | ], 775 | "name": "stdout" 776 | } 777 | ] 778 | }, 779 | { 780 | "cell_type": "code", 781 | "metadata": { 782 | "id": "OceayWUALABE" 783 | }, 784 | "source": [ 785 | "%tensorboard --logdir 'logs'" 786 | ], 787 | "execution_count": null, 788 | "outputs": [] 789 | }, 790 | { 791 | "cell_type": "markdown", 792 | "metadata": { 793 | "id": "mj6-WjnRMTfF" 794 | }, 795 | "source": [ 796 | "" 797 | ] 798 | } 799 | ] 800 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Lego Brick Sorter Machine 2 | 3 | 4 | This project is inspired by [Daniel West's project][4] to build a Lego sorter 5 | 6 | [Lego Sorter][5] 7 | 8 | This is a nice explantion of the three steps to build a Lego sorter 9 | 10 | 1. [Build a dataset to train the AI][1] using the [Ldraw Library][3] and use [blender][2] to render the image 11 | 12 | 2. Train the AI using Tensorflow using [colab][6] using the cloud GPU to produce the classifier model 13 | 14 | 3. Build a image capature and classification process using the classifier model 15 | 16 | [1]: https://github.com/Gadgeteering/LegoBrickClassification/blob/master/README.md 17 | [2]: https://github.com/TobyLobster/ImportLDraw 18 | [3]: http://www.ldraw.org/ 19 | [4]: https://youtu.be/-UGl0ZOCgwQ 20 | [5]: https://towardsdatascience.com/how-i-created-over-100-000-labeled-lego-training-images-ec74191bb4ef 21 | [6]: https://colab.research.google.com/ 22 | --------------------------------------------------------------------------------