├── 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 | "
"
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 | "
"
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 |
--------------------------------------------------------------------------------