Showing
3 changed files
with
437 additions
and
0 deletions
code/CNN_classification.ipynb
0 → 100644
| 1 | +{ | ||
| 2 | + "cells": [ | ||
| 3 | + { | ||
| 4 | + "cell_type": "code", | ||
| 5 | + "execution_count": 1, | ||
| 6 | + "metadata": {}, | ||
| 7 | + "outputs": [ | ||
| 8 | + { | ||
| 9 | + "name": "stdout", | ||
| 10 | + "output_type": "stream", | ||
| 11 | + "text": [ | ||
| 12 | + "D:/Games/Images/train\n", | ||
| 13 | + "antelope 파일 길이 : 0\n", | ||
| 14 | + "cats 파일 길이 : 0\n", | ||
| 15 | + "chimpanzee 파일 길이 : 0\n", | ||
| 16 | + "cow 파일 길이 : 0\n", | ||
| 17 | + "dogs 파일 길이 : 0\n", | ||
| 18 | + "hippopotamus 파일 길이 : 0\n", | ||
| 19 | + "horse 파일 길이 : 0\n", | ||
| 20 | + "otter 파일 길이 : 0\n", | ||
| 21 | + "raccoon 파일 길이 : 0\n", | ||
| 22 | + "rat 파일 길이 : 0\n", | ||
| 23 | + "rhinoceros 파일 길이 : 0\n", | ||
| 24 | + "squirrel 파일 길이 : 0\n", | ||
| 25 | + "weasel 파일 길이 : 0\n", | ||
| 26 | + "wolf 파일 길이 : 0\n", | ||
| 27 | + "ok 0\n" | ||
| 28 | + ] | ||
| 29 | + } | ||
| 30 | + ], | ||
| 31 | + "source": [ | ||
| 32 | + "from PIL import Image\n", | ||
| 33 | + "import os, glob, numpy as np\n", | ||
| 34 | + "from sklearn.model_selection import train_test_split\n", | ||
| 35 | + "caltech_dir = \"D:/Games/Images/train\"\n", | ||
| 36 | + "categories = [\"antelope\", \"cats\", \"chimpanzee\", \"cow\", \"dogs\", \"hippopotamus\",\"horse\",\"otter\",\"raccoon\",\"rat\",\"rhinoceros\",\"squirrel\",\"weasel\",\"wolf\"]\n", | ||
| 37 | + "nb_classes = len(categories)\n", | ||
| 38 | + "print(caltech_dir)\n", | ||
| 39 | + "image_w = 64\n", | ||
| 40 | + "image_h = 64\n", | ||
| 41 | + "\n", | ||
| 42 | + "pixels = image_h * image_w * 3\n", | ||
| 43 | + "\n", | ||
| 44 | + "X = []\n", | ||
| 45 | + "y = []\n", | ||
| 46 | + "\n", | ||
| 47 | + "for idx, cat in enumerate(categories):\n", | ||
| 48 | + " \n", | ||
| 49 | + " #one-hot 돌리기.\n", | ||
| 50 | + " label = [0 for i in range(nb_classes)]\n", | ||
| 51 | + " label[idx] = 1\n", | ||
| 52 | + "\n", | ||
| 53 | + " image_dir = caltech_dir + \"/\" + cat\n", | ||
| 54 | + " files = glob.glob(image_dir+\"/*.jpg\")\n", | ||
| 55 | + " print(cat, \" 파일 길이 : \", len(files))\n", | ||
| 56 | + " for i, f in enumerate(files):\n", | ||
| 57 | + " img = Image.open(f)\n", | ||
| 58 | + " img = img.convert(\"RGB\")\n", | ||
| 59 | + " img = img.resize((image_w, image_h))\n", | ||
| 60 | + " data = np.asarray(img)\n", | ||
| 61 | + "\n", | ||
| 62 | + " X.append(data)\n", | ||
| 63 | + " y.append(label)\n", | ||
| 64 | + "\n", | ||
| 65 | + " if i % 700 == 0:\n", | ||
| 66 | + " print(cat, \" : \", f)\n", | ||
| 67 | + "\n", | ||
| 68 | + "X = np.array(X)\n", | ||
| 69 | + "y = np.array(y)\n", | ||
| 70 | + "#1 0 0 0 이면 airplanes\n", | ||
| 71 | + "#0 1 0 0 이면 buddha 이런식\n", | ||
| 72 | + "\n", | ||
| 73 | + "\n", | ||
| 74 | + "X_train, X_test, y_train, y_test = train_test_split(X, y)\n", | ||
| 75 | + "xy = (X_train, X_test, y_train, y_test)\n", | ||
| 76 | + "np.save(\"./numpy_data/multi_image_data3.npy\", xy)\n", | ||
| 77 | + "\n", | ||
| 78 | + "print(\"ok\", len(y))\n", | ||
| 79 | + "\n" | ||
| 80 | + ] | ||
| 81 | + }, | ||
| 82 | + { | ||
| 83 | + "cell_type": "code", | ||
| 84 | + "execution_count": 5, | ||
| 85 | + "metadata": {}, | ||
| 86 | + "outputs": [ | ||
| 87 | + { | ||
| 88 | + "name": "stderr", | ||
| 89 | + "output_type": "stream", | ||
| 90 | + "text": [ | ||
| 91 | + "Using TensorFlow backend.\n" | ||
| 92 | + ] | ||
| 93 | + }, | ||
| 94 | + { | ||
| 95 | + "name": "stdout", | ||
| 96 | + "output_type": "stream", | ||
| 97 | + "text": [ | ||
| 98 | + "(0,)\n", | ||
| 99 | + "0\n" | ||
| 100 | + ] | ||
| 101 | + } | ||
| 102 | + ], | ||
| 103 | + "source": [ | ||
| 104 | + "import os, glob, numpy as np\n", | ||
| 105 | + "from keras.models import Sequential\n", | ||
| 106 | + "from keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout\n", | ||
| 107 | + "from keras.callbacks import EarlyStopping, ModelCheckpoint\n", | ||
| 108 | + "import matplotlib.pyplot as plt\n", | ||
| 109 | + "from keras import optimizers\n", | ||
| 110 | + "import keras.backend.tensorflow_backend as K\n", | ||
| 111 | + "\n", | ||
| 112 | + "import tensorflow as tf\n", | ||
| 113 | + "config = tf.ConfigProto()\n", | ||
| 114 | + "config.gpu_options.allow_growth = True\n", | ||
| 115 | + "session = tf.Session(config=config)\n", | ||
| 116 | + "\n", | ||
| 117 | + "np_load_old = np.load\n", | ||
| 118 | + "np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)\n", | ||
| 119 | + "X_train, X_test, y_train, y_test = np.load('./numpy_data/multi_image_data3.npy')\n", | ||
| 120 | + "np.load = np_load_old\n", | ||
| 121 | + "print(X_train.shape)\n", | ||
| 122 | + "print(X_train.shape[0])" | ||
| 123 | + ] | ||
| 124 | + }, | ||
| 125 | + { | ||
| 126 | + "cell_type": "code", | ||
| 127 | + "execution_count": 6, | ||
| 128 | + "metadata": {}, | ||
| 129 | + "outputs": [], | ||
| 130 | + "source": [ | ||
| 131 | + "categories = [\"antelope\", \"cats\", \"chimpanzee\", \"cow\", \"dogs\", \"hippopotamus\",\"horse\",\"otter\",\"raccoon\",\"rat\",\"rhinoceros\",\"squirrel\",\"weasel\",\"wolf\"]\n", | ||
| 132 | + "nb_classes = len(categories)\n", | ||
| 133 | + "\n", | ||
| 134 | + "#일반화\n", | ||
| 135 | + "X_train = X_train.astype(float) / 255\n", | ||
| 136 | + "X_test = X_test.astype(float) / 255" | ||
| 137 | + ] | ||
| 138 | + }, | ||
| 139 | + { | ||
| 140 | + "cell_type": "code", | ||
| 141 | + "execution_count": null, | ||
| 142 | + "metadata": {}, | ||
| 143 | + "outputs": [], | ||
| 144 | + "source": [ | ||
| 145 | + "with K.tf_ops.device('/device:GPU:0'):\n", | ||
| 146 | + " model = Sequential()\n", | ||
| 147 | + " model.add(Conv2D(32, (3,3), padding=\"same\", input_shape=X_train.shape[1:], activation='relu'))\n", | ||
| 148 | + " model.add(MaxPooling2D(pool_size=(2,2)))\n", | ||
| 149 | + " model.add(Dropout(0.25))\n", | ||
| 150 | + " \n", | ||
| 151 | + " model.add(Conv2D(64, (3,3), padding=\"same\", activation='relu'))\n", | ||
| 152 | + " model.add(MaxPooling2D(pool_size=(2,2)))\n", | ||
| 153 | + " model.add(Dropout(0.25))\n", | ||
| 154 | + " \n", | ||
| 155 | + " model.add(Flatten())\n", | ||
| 156 | + " model.add(Dense(256, activation='relu'))\n", | ||
| 157 | + " model.add(Dropout(0.5))\n", | ||
| 158 | + " model.add(Dense(nb_classes, activation='softmax'))\n", | ||
| 159 | + " model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", | ||
| 160 | + " model_dir = './model'\n", | ||
| 161 | + " \n", | ||
| 162 | + " if not os.path.exists(model_dir):\n", | ||
| 163 | + " os.mkdir(model_dir)\n", | ||
| 164 | + " \n", | ||
| 165 | + " model_path = model_dir + '/multi_img_classification.model'\n", | ||
| 166 | + " checkpoint = ModelCheckpoint(filepath=model_path , monitor='val_loss', verbose=1, save_best_only=True)\n", | ||
| 167 | + " early_stopping = EarlyStopping(monitor='val_loss', patience=6)\n", | ||
| 168 | + " model.summary()\n", | ||
| 169 | + " " | ||
| 170 | + ] | ||
| 171 | + }, | ||
| 172 | + { | ||
| 173 | + "cell_type": "code", | ||
| 174 | + "execution_count": 46, | ||
| 175 | + "metadata": {}, | ||
| 176 | + "outputs": [ | ||
| 177 | + { | ||
| 178 | + "name": "stdout", | ||
| 179 | + "output_type": "stream", | ||
| 180 | + "text": [ | ||
| 181 | + "Train on 4623 samples, validate on 1541 samples\n", | ||
| 182 | + "Epoch 1/100\n", | ||
| 183 | + "4623/4623 [==============================] - 10s 2ms/step - loss: 13.5012 - acc: 0.1622 - val_loss: 13.5869 - val_acc: 0.1570\n", | ||
| 184 | + "\n", | ||
| 185 | + "Epoch 00001: val_loss improved from inf to 13.58690, saving model to ./model/multi_img_classification.model\n", | ||
| 186 | + "Epoch 2/100\n", | ||
| 187 | + "4623/4623 [==============================] - 2s 468us/step - loss: 13.4753 - acc: 0.1640 - val_loss: 13.5869 - val_acc: 0.1570\n", | ||
| 188 | + "\n", | ||
| 189 | + "Epoch 00002: val_loss did not improve from 13.58690\n", | ||
| 190 | + "Epoch 3/100\n", | ||
| 191 | + "4623/4623 [==============================] - 2s 470us/step - loss: 13.4753 - acc: 0.1640 - val_loss: 13.5869 - val_acc: 0.1570\n", | ||
| 192 | + "\n", | ||
| 193 | + "Epoch 00003: val_loss did not improve from 13.58690\n", | ||
| 194 | + "Epoch 4/100\n", | ||
| 195 | + "4623/4623 [==============================] - 2s 481us/step - loss: 13.4753 - acc: 0.1640 - val_loss: 13.5869 - val_acc: 0.1570\n", | ||
| 196 | + "\n", | ||
| 197 | + "Epoch 00004: val_loss did not improve from 13.58690\n", | ||
| 198 | + "Epoch 5/100\n", | ||
| 199 | + "4623/4623 [==============================] - 2s 471us/step - loss: 13.4753 - acc: 0.1640 - val_loss: 13.5869 - val_acc: 0.1570\n", | ||
| 200 | + "\n", | ||
| 201 | + "Epoch 00005: val_loss did not improve from 13.58690\n", | ||
| 202 | + "Epoch 6/100\n", | ||
| 203 | + "4623/4623 [==============================] - 2s 473us/step - loss: 13.4753 - acc: 0.1640 - val_loss: 13.5869 - val_acc: 0.1570\n", | ||
| 204 | + "\n", | ||
| 205 | + "Epoch 00006: val_loss did not improve from 13.58690\n", | ||
| 206 | + "Epoch 7/100\n", | ||
| 207 | + "4623/4623 [==============================] - 2s 471us/step - loss: 13.4753 - acc: 0.1640 - val_loss: 13.5869 - val_acc: 0.1570\n", | ||
| 208 | + "\n", | ||
| 209 | + "Epoch 00007: val_loss did not improve from 13.58690\n", | ||
| 210 | + "Model: \"sequential_10\"\n", | ||
| 211 | + "_________________________________________________________________\n", | ||
| 212 | + "Layer (type) Output Shape Param # \n", | ||
| 213 | + "=================================================================\n", | ||
| 214 | + "conv2d_22 (Conv2D) (None, 64, 64, 32) 896 \n", | ||
| 215 | + "_________________________________________________________________\n", | ||
| 216 | + "max_pooling2d_22 (MaxPooling (None, 32, 32, 32) 0 \n", | ||
| 217 | + "_________________________________________________________________\n", | ||
| 218 | + "dropout_30 (Dropout) (None, 32, 32, 32) 0 \n", | ||
| 219 | + "_________________________________________________________________\n", | ||
| 220 | + "conv2d_23 (Conv2D) (None, 32, 32, 64) 18496 \n", | ||
| 221 | + "_________________________________________________________________\n", | ||
| 222 | + "max_pooling2d_23 (MaxPooling (None, 16, 16, 64) 0 \n", | ||
| 223 | + "_________________________________________________________________\n", | ||
| 224 | + "dropout_31 (Dropout) (None, 16, 16, 64) 0 \n", | ||
| 225 | + "_________________________________________________________________\n", | ||
| 226 | + "flatten_9 (Flatten) (None, 16384) 0 \n", | ||
| 227 | + "_________________________________________________________________\n", | ||
| 228 | + "dense_17 (Dense) (None, 256) 4194560 \n", | ||
| 229 | + "_________________________________________________________________\n", | ||
| 230 | + "dropout_32 (Dropout) (None, 256) 0 \n", | ||
| 231 | + "_________________________________________________________________\n", | ||
| 232 | + "dense_18 (Dense) (None, 14) 3598 \n", | ||
| 233 | + "=================================================================\n", | ||
| 234 | + "Total params: 4,217,550\n", | ||
| 235 | + "Trainable params: 4,217,550\n", | ||
| 236 | + "Non-trainable params: 0\n", | ||
| 237 | + "_________________________________________________________________\n" | ||
| 238 | + ] | ||
| 239 | + } | ||
| 240 | + ], | ||
| 241 | + "source": [ | ||
| 242 | + "\n", | ||
| 243 | + "#데이터셋이 적어서 validation을 그냥 test 데이터로 했습니다. \n", | ||
| 244 | + "#데이터셋이 충분하시면 이렇게 하시지 마시고 validation_split=0.2 이렇게 하셔서 테스트 셋으로 나누시길 권장합니다.\n", | ||
| 245 | + "history = model.fit(X_train, y_train, batch_size=34, epochs=100, validation_data=(X_test, y_test), callbacks=[checkpoint, early_stopping])\n", | ||
| 246 | + "\n" | ||
| 247 | + ] | ||
| 248 | + }, | ||
| 249 | + { | ||
| 250 | + "cell_type": "code", | ||
| 251 | + "execution_count": 47, | ||
| 252 | + "metadata": {}, | ||
| 253 | + "outputs": [ | ||
| 254 | + { | ||
| 255 | + "name": "stdout", | ||
| 256 | + "output_type": "stream", | ||
| 257 | + "text": [ | ||
| 258 | + "1541/1541 [==============================] - 0s 173us/step\n", | ||
| 259 | + "정확도 : 0.1570\n" | ||
| 260 | + ] | ||
| 261 | + } | ||
| 262 | + ], | ||
| 263 | + "source": [ | ||
| 264 | + "print(\"정확도 : %.4f\" % (model.evaluate(X_test, y_test)[1]))" | ||
| 265 | + ] | ||
| 266 | + }, | ||
| 267 | + { | ||
| 268 | + "cell_type": "code", | ||
| 269 | + "execution_count": 42, | ||
| 270 | + "metadata": { | ||
| 271 | + "scrolled": false | ||
| 272 | + }, | ||
| 273 | + "outputs": [ | ||
| 274 | + { | ||
| 275 | + "data": { | ||
| 276 | + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEGCAYAAAB/+QKOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3deZzN9f7A8dfbGOuEG5EQabUvg0zWoWSpZLkhuUWu3OimXYv2bpukpB3ll0xdom655VaDhAqNbC2SJC2iMHYz798f7zMMnVmMc+acM97Px+M8Zs75fs857zlz5rzns70/oqo455xzhysW6QCcc85FJ08QzjnngvIE4ZxzLihPEM4554LyBOGccy6o4pEOIJQqVaqktWrVKtB9d+zYQdmyZUMbUBh4nKEXK7F6nKEVK3FCeGNdsmTJb6p6QtCDqlpkLomJiVpQqampBb5vYfI4Qy9WYvU4QytW4lQNb6zAYs3hMzVsXUwiUkNEUkVktYisFJFrg5zTXkS2ikha4HJntmOdReQrEVkjIiPDFadzzrngwtnFtB+4QVWXishxwBIR+Z+qrjrsvI9U9YLsN4hIHDAeOA/YAHwmIm8Fua9zzrkwCVsLQlV/UtWlge+3A6uBavm8ewtgjaquVdW9QArQPTyROuecC0a0EEptiEgtYB5QX1W3Zbu9PTAdayVsBG5U1ZUi0hvorKqDA+cNAM5W1eFBHnsIMASgSpUqiSkpKQWKMT09nYSEhALdtzB5nKEXK7HGWpwiQtmyZYmLi4t0SEGpKiIS6TDyJRSxZmRksGPHDg7/zE9OTl6iqs1yfOJwXoAEYAnQM8ixckBC4PuuwDeB7/8KvJjtvAHAuLyeywepo0esxKkaO7HGWpxr167VTZs2aWZmZmQDysG2bdsiHUK+HW2smZmZumnTJl27du2fjhGJQWoAEYnHWghTVPWNIMlpm6qmB76fBcSLSCWsRVEj26nVsRaGcy5G7N69m4oVK8bMf+lFmYhQsWJFdu/efUT3C+csJgEmAKtVdUwO55wYOA8RaRGIZzPwGXC6iJwiIiWAvsBb4Yp14fPLeeemLSx8fnm4nsK5Y5Inh+hRkN9FOGcxtcK6hpaLSFrgttuAkwFU9VmgN/APEdkP7AL6Bpo8+0VkOPAeEAdMVNWV4Qhy4XNf0G7oWWRQh/GL9/IBy0ka0iAcT+WcczElbAlCVecDuaYsVX0KeCqHY7OAWWEI7RCzXtnCPuIBYS8wZ/pmkoaE+1mdcy76HfO1mLoOqEgpdgNKBnGUOrNmpENyzkVIKGeJjR07lp07d+Z6Tq1atfjtt99C9pyhdswniKQhDfjwuTWMqPoyp/M1N48/mSlTIh2Vc8eohQvhwQfta4zLT4KIdkWqWF9BJQ1pwJ7Tf+OeR+7k4veGctllyfz6K1x3XaQjc66IGDEC0tJyP2frVvjiC8jMhGLFoGFDKF8+5/MbN4axY3N9yFtuuYWaNWty9dVXA3D33XcjIsybN4/NmzeTkZHB/fffT/fuea/D/emnn+jTpw/btm1j//79PPPMM7Rp04bZs2dz1113sWfPHk499VQmTZrExIkT2bhxI8nJyVSqVInU1NQ8H3/MmDFMnDgRgMGDBzNixAh27NjBJZdcwvr161FVRo0aRZ8+fRg5ciRvvfUWxYsXp1OnTowePTrPxy8ITxBZRCg35RlmNUliwG+Pc/31Xfn5Z3joIfCJGM4Vgq1bLTmAfd26NfcEkQ99+/ZlxIgRBxLE66+/zrvvvst1112HiLBnzx5atmzJRRddlOcsn1dffZXzzz+f22+/nYyMDHbu3Mlvv/3G/fffz/vvv0/ZsmV5+OGHGTNmDHfeeSdjxowhNTWVSpUq5RnnkiVLmDRpEp988gmqytlnn027du1Yu3YtJ510EikpKRx33HFs3bqVLVu2MGPGDL788ktEhD/++OOoXqPceILI7vjjKfX6ZFJateWaWjN55JEu/PILvPACxMdHOjjnYlge/+kD1q3UsSPs3QslSsCUKZCUdFRP26RJE3799Vc2btzIpk2b+Mtf/kLVqlW57rrrmDNnDsWLF+fHH3/kl19+4cQTT8z1sZo3b86gQYPYt28fF198MY0bN2bu3LmsWrWKVq1aAbB3716SChDz/Pnz6dGjx4GS3j179uSjjz6ic+fO3Hjjjdx555307NmTNm3asH//fkqVKsXgwYPp1q0bF1xwQR6PXnDH/BjEn5x9NnGPPsT4dV25p/NCXn4ZevSAGO9KdC76JSXBBx/AfffZ16NMDll69+7NtGnTeO211+jbty9Tpkxh06ZNzJs3j7S0NKpUqZKvBWRt27Zl3rx5VKtWjQEDBjB58mRUlfPOO4+0tDTS0tJYtWoVEyZMOOIYNYeSR2eccQZLliyhbt263Hrrrdx7770UL16cTz/9lF69ejFz5kw6d+58xM+XX54gghkxArn4Yu58vy3P3Pwds2bBuefCli2RDsy5Ii4pCW69NWTJAaybKSUlhWnTptG7d2+2bt1K5cqViY+PJzU1le+//z5fj/P9999TuXJl/v73v3PllVeydOlSWrZsyccff8yaNWsA2LlzJ19//TUAxx13HNu3b8/XY7dt25aZM2eyc+dOduzYwYwZM2jTpg0bN26kTJky9O3blxtvvJGlS5eSnp7O1q1b6dq1K2PHjiUtr7Gdo+BdTMGIwMSJ0LQpQ1Pac8LEFVx61XG0aQPvvQfVq0c6QOdcftWrV4/t27dTrVo1qlatSv/+/bnwwgtp164dTZs25ayzzsrX48yZM4dHH32U+Ph4EhISmDx5MieccAIvvfQS/fr1Y8+ePQDcf//9nHHGGQwZMoQuXbpQtWrVPAepmzZtyhVXXEGLFi0AG6Ru0qQJ7733HjfddBMAJUuW5JlnnmH79u10796d3bt3o6o8/vjjR/Hq5CGnIk2xeAl5sb5PP1WNj1e98EJN/TBTy5VTrVFDddWqAj/NUYu1gm2xIFZijbU4V0XyDyUfjqVifVmC/U6IVLG+mNe8OYweDf/5D+2XjmHuXBs/a90aFi2KdHDOORde3sWUl2uugblzYeRIGs87hwULkujUCTp0gGnToGvXSAfonAul5cuXM2DAgENuK1myJJ988kmBH/Pss88+0AWV5f/+7/9o0CC66755gsiLCEyYAE2bQp8+1P78cz7+uCJdu8JFF9lQxd/+FukgnXOh0qBBg5AP/B5Ncokk72LKjwoV4N//hl9+gcsvp8oJmaSmQvv2cPnl1gvlnHNFjSeI/EpMhDFj4J13YPRoypWzby+5BG66CS69FP71ryJRQsY55wDvYjoyV19t4xG33QbnnEPJ1q159VXIyICpU+2U0qVDusbHOecixlsQR0LE6m7UqgV9+8JvvxEXZ8MTWWVcdu2yBOGcc7HOE8SRKl/exiM2bYIBAyAzk+RkKFXqYJL4738tUTjnIuePP/7g6aefPuL7de3aNawF8ADS0tKYNSvs+6EdNU8QBdGkiRUfe/ddePjhAyVkHngAbr7ZxiG6dYP09EgH6lxsCeV2EDkliIyMjFzvN2vWLCpUqHD0AeQiVhKEj0EU1NChNh5xxx3QujVJbdocGHdo0ACuuAI6dYJZs2wSlHPHskhsBzFy5Ei+/fZbGjdufKA8RtWqVQ8U1evXrx8//fQTu3fv5tprr2XIENtruFatWixevJj09HS6dOlC69atWbBgAdWqVePNN9+kdOnSQZ/vySef5Nlnn6V48eLUrVuXlJQUduzYwTXXXMPy5cvZv38/d999N126dOHOO+9k165dzJ8/n1tvvZU+ffr86fG2bNnCoEGDWLt2LSVLlmTChAk0bNiQuXPncu211wIc2NsiPT096F4VR8sTREGJwPPPw9KlNh7x+edQuTIAl10GZctCnz6QnAyzZ8MJJ0Q4XueiXKi3g3jooYdYsWIFaWlpzJkzh27durFixQpOOeUUAMaPH0/NmjXZtWsXzZs3p1evXlSsWPGQx/jmm2+YOnUqL7zwApdccgnTp0/nsssuy/H5vvvuO0qWLHmgi+qBBx6gQ4cOTJw4kT/++IMWLVpw7rnncu+997J48WKeeuqpHOO/6667aNKkCTNnzuTtt9/mb3/7G2lpaYwePZrx48fTqlUr0tPTKVWqFM8///yf9qoIhbAlCBGpAUwGTgQygedV9YnDzukP3BK4mg78Q1WXBY6tA7YDGcB+VW0WrlgLrFw5eP11aNkSLrwQune3jJCURI8e8NZbViq8XTv43/+gWrVIB+xcZERoO4hDtGjR4kByAHj22WcPdPP88MMPfPPNN39KEKeccgqNGzcGIDExkXXr1uX4+A0bNqR///5cfPHFXHzxxQDMnj2bt95668COb7t372b9+vX5inf+/PlMnz4dgHbt2rF582a2bt1Kq1atuP766+nfvz89e/akevXqQfeqCIVwjkHsB25Q1TpAS2CYiNQ97JzvgHaq2hC4D3j+sOPJqto4KpNDlsaN4dpr4dNPrbupY8cDHaidO1v11w0boG1b+O67CMfqXBQL03YQB2RtxgNWmXXOnDksXLiQZcuW0aRJk6B7QpQsWfLA93Fxcezfvz/Hx3/nnXcYNmwYS5YsITExkf3796OqTJ8+/cB+EevXr6dOnTr5ileD7BEhIowcOZIXX3yRXbt20bJlS7788suge1WEQtgShKr+pKpLA99vB1YD1Q47Z4Gq/h64ugiIzULa5ctbl5Mq7N4N2Ur7tm1rb/bff4c2beDLLyMYp3NRLpTbQeS2H8PWrVupUKECZcqU4csvv2TRUVbfzMzM5IcffiA5OZlHHnmEP/74g/T0dM4//3zGjRt34MP+888/zzO2LG3btmXKlCkAfPTRR1SqVIly5crx7bff0qBBA2655RaaNWvGl19+GXSvilAolFlMIlILaALkVpDkSuC/2a4rMFtElojIkPBFFwLZ57mqwscf2+q5gObNYc4c2LfPEsayZZEL1bljRcWKFWnVqhX169c/sKdCls6dO7N//34aNmzIqFGjaNmy5VE9V0ZGBpdddhkNGjSgSZMmXHfddVSoUIFRo0axb98+GjZsSP369Rk1ahQAycnJrFq1isaNG/Paa68Ffcy7776bxYsX07BhQ+666y5efvllAMaOHUv9+vVp1KgRpUuXpkuXLsyZM4fGjRvTpEkTpk+ffmAQ+2hJsGZMKIlIAjAXeEBV38jhnGTgaaC1qm4O3HaSqm4UkcrA/4BrVHVekPsOAYYAVKlSJTElJaVAcaanp5OQkFCg+wKUW7mSCmlplNq4kZNmzeKXDh348tZb0eIHh3l++KE0N9zQiF274nj44S+oWzd/u02FMs7CEitxQuzEGmtxli9fntNOOy3S4eQoIyODuLi4SIeRL6GKdc2aNWzduvWQ25KTk5fk2I2f00YRobgA8cB7wPW5nNMQ+BY4I5dz7gZuzOv5Qr5hUEE9/LAqqPboobp79yGHvvtO9dRTVRMSVAvylLG2aUwsiJVYYy1O3zAodIrchkEiIsAEYLWqjsnhnJOBN4ABqvp1ttvLishxWd8DnYAV4Yo15G6+GZ54AmbMgJ49bVwioFYt+OgjOPlk6NLFVl0752LHsGHDaNy48SGXSZMmFfjxJk2a9KfHGzZsWAgjLrhwroNoBQwAlotI1hKZ24CTAVT1WeBOoCLwtOWTA9NZqwAzArcVB15V1XfDGGvo/fOfNi4xdChccAG8+aYtjgCqVrU1duefbzNjp06FXr0iHK9zYaCqSFYNmiJi/PjxIX28gQMHMnDgwJA+ZjBagOGEsCUIVZ0P5PrOUNXBwOAgt68FGoUptMIzZAiULAmDBllz4e23be0EUKkSfPih7Uh3ySUwaZJvPOSKllKlSrF582YqVqxY5JJErFFVNm/eTKlSpY7ofr6SOtwuv9xaEv37W+2Nd989UHujfHlbZd29u522fDkcf7xtROTlwl2sq169Ohs2bGDTpk2RDiWo3bt3H/EHZqSEItZSpUpRvfqRrSTwBFEY+vSxpaF9+thm1rNnWxMC63V6+20491zbmU7E8onvKeFiXXx8/CErl6PNnDlzaNKkSaTDyJdIxerVXAtLjx4wcyasWmXrJn755cChUqVs1TUcXGv34YcRitM55wI8QRSmrl1tn9K1a61A048/HjjUsaPtRpe11u6dd7xcuHMusjxBFLaOHW0cYuNGW1b9/fcAf9pT4tNPbSzi558jG65z7tjlCSIS2rSx8q6bN1uSWLMGOFiH5uGHrRLs6tV2m9dvcs5FgieISDn7bBto2LHDksRhWaBrV1srsXMnnHMOzJ8foTidc8csTxCR1LSpVfHLyLAxiVdeOWS/xWbN7NsTTrBZTtOmRTZc59yxxRNEpNWvb02FzEwYMOBPe0rUrg0LFliyuOQS+Pe/Y7MiunMu9niCiAZnnWUr5cASxZ491rIIqFjRhix69oSnnz6N6647uDWjc86FiyeIaNGrly2IAPv0X7XqkCxQujS89hr07v0DY8daa2LXrgjF6pw7JvhK6miRlGSD1h98AIsX23jE1q22Me9xxwEQFwfDhn3LOefU4IYbbArsm29aC8M550LNWxDRJCnJxiBmzIBx42DWLJvCdNhm1tddB6+/bnmkVSvf69o5Fx6eIKKRCAwfbptFbNgALVrAvEM30+vdG95/H379FVq2tGQREgsXHjKTyjl37PIEEc3OOw8++cT6kM49FyZMOORw69Y2w6lMGZslO2vWUT7f++/bA912m9WL8iTh3DHNE0S0O+MMWLTIPrAHD+bU8eNh//4Dh886yz7H69SBiy6CkSML0ADYsgXuuQcuvBD27bPb9uyB228/eN05d8zxBBELKlSw6n3XXkuNadNsh7o//jhw+MQTbVZsixZWpuP22w9ZSpGzX36BW26BmjXh7rshMdE2OIqLs0tqqjVTAqVAnHPHFk8QsaJ4cRg7lq9uuMFmOrVsCd98c+BwQgJ063awGuyuXTbDKaj16+Gaa2yD7EcftTsuW2b1PFJT4b77bOPs116Dr7+Gxo1ty7sCbFnonItdniBizE8XXGBjBb/9ZvWc3n//wLEOHWwpRbHAb/XZZw85bAnlyivhtNPsYL9+VgMqJQUaNrRzsioGJiXZYosvvrBl3IMG2YZHv/9eeD+scy6iPEHEonbt4LPP4KSTbKehwCbqWSXD778fpk6F6tVtl9MH/vkLmf3624DFq6/CVVfBt9/CxIk2xpGbGjXsQR980KbfNmx4yCpv51zR5QkiVp1yik1h6tLFpsRefTXs23egAdC3L3zy9BL6V5vDHeOqcNG/B7Bl2ChbNDFuHJx8cv6fKy7ORr8XLrQl3R062PW9e8P38znnIi5sCUJEaohIqoisFpGVInJtkHNERJ4UkTUi8oWINM12rLOIfBU4NjJccca0cuVsG9NbboFnnoHzz7fNiIYMgRYtKNuuGZPTe/J0t3eYXex8Ev9zN0t+PLHgz9esGXz+uXVTPfywLeL76qvQ/TzOuagSzhbEfuAGVa0DtASGiUjdw87pApweuAwBngEQkThgfOB4XaBfkPs6sP/uH3oIJk+2geUuXeCFF6wLatgwZP33/OPtbsyfL2Rm2mf6888fxXhz2bL2+NOnW2ukaVO77gPYzhU5YUsQqvqTqi4NfL8dWA1UO+y07sBkNYuACiJSFWgBrFHVtaq6F0gJnOtyMmAADB588HpcHFSrdqCOU4sWsGSJLae46ioYONA2Iyqwnj1tADspyVosPXvawLlzrsgQLYT//ESkFjAPqK+q27Ld/jbwkKrOD1z/ALgFqAV0VtXBgdsHAGer6vAgjz0Ea31QpUqVxJSUlALFmJ6eTkJCQoHuW5hyi7PcypU0uuEGZN8+ND6eZY89xrZ69Q45JyMDXnmlJi+/XItTTtnBvfeupFq1oygLm5lJ9WnTqP3CC+wrX54vR47k92bNYub1hKLxu48mHmfo5fV3XyEtjT8aN/7T33t+JCcnL1HVZkEPqmpYL0ACsAToGeTYO0DrbNc/ABKBvwIvZrt9ADAur+dKTEzUgkpNTS3wfQtTnnEuWKD6r3/Z11y8+67q8cerliunOmNGCAJbulT1rLNUQbVvX/124MA8Y4gWReZ3HyU8ztDLMdYFC1RLlVItVky1dOkC/c0BizWHz9SwzmISkXhgOjBFVd8IcsoGoEa269WBjbnc7vKSfR1DLs4/H5YuhTPPhB494OabD6ngceSaNLE+rB49ICWFUyZNstlOXs/JufDYuRPuugt277a9Y/buDfkU9HDOYhJgArBaVcfkcNpbwN8Cs5laAltV9SfgM+B0ETlFREoAfQPnuhCqWdPGta++2hZUd+wIP/10FA9Ypgw0bw7FiiFgb9xDVuo5545aZia8/LKtYfrf/2xlbFwclCgB7duH9KnCuWFQK6xraLmIpAVuuw04GUBVnwVmAV2BNcBOYGDg2H4RGQ68B8QBE1V1ZRhjPWaVLGnr7M45x8aa69e3ze0GDsyzERJc+/ZQsiS6ezeiahlI1WqAOOeOzgcfwI03Qlqa/TM2daqV4Zkzx/72CvRHm7OwJQi1gedcPxUC/V/Dcjg2C0sgrhD072+f43/7m81anTQJZs+2WU9HJLCc+7uJE6kdFwfPPQd33mn1nZxzBVJm3TqrmTZrljX9p061UjhZdXVCnBiy+Jaj7oAffrD3W0aGjUf06mVlmjp1OsIHSkpi/Z491G7Xzh7o/vuhdm1rljjn8u/nn+Huu2n+wgs2Zf2RR6zQZtb+9WHmpTbcAe3bWzdmXJx1PSUk2GD2gAGwaVMBHlDEVnife671X33wQahDdq5o2rnT/rE6/XSYMIEfL77Yyu7fdFOhJQfwBOGyySr2d999VvX7669h1Cir+l2nji3WPuJlM/HxMG2aTZfq1QtWrQpL7M4VCRkZ8NJLlhhGjbLm+6pVrLnmGqhUqdDD8QThDpF9lmypUnDvvVZ+6cwz4fLLbRfUI94/qHx52/CodGno2tWazc7FulDv3/7++7Zp18CBVor5o4+spM3pp4fm8QvAxyBcnurVs/fqc89ZEdcGDWz69Q03WAMhX2rWhP/8x0qVX3SRzbooUyacYTsXPh9/bOt89u61gbtOnWycLSHBxgoO/xrstjJlbDvh116zvecXLbJNvFJSbAA6Cmb+eYJw+VKsGPzjH/bZ/s9/Witj6lSb8dSiRT4fpFkz24+iRw+bNjVtmg14OBdLPv3U6ulnlbvPzLQP98WLYft228+9IIYPh9GjbQAwSngXkzsi1apZq3fGDNi82XY+HTHC/i7ypXt3ePxxK1N+001hjdW5kPr5Z+v+OftsG0TOmtFRurRNP920yRaH7t0LW7bA99/DypWWPN5/3/5oJk+Gp5+2cvnJyQdbCXFxtgFYFCUH8BaEK6CLL7YW9m23wZNPwhtv2Pv+ggvycedrr7Ud7R5/HE49FYYFXQrjXHTYuxeeeMJmb+zebXVp7rgDVqwIvkAtPh7+8he75KZNGytfsHdvWFZBh4InCFdg5crBU0/BpZfaLNYLL7Su0wED4M03T6ZkyVzW7zz+OKxbZ/1VNWvmM7M4F7BwYdhWDx9i1ixrIn/zjb1Hx4w5OGiclHR0z501bbAwfo4C8gThjto551jhv0cfhXvugddfB5FTmDLF3v9B3/dxcTYe0a6d9efOm2ebDzmXl1dftSX/mZn2n/eHH9qbMJS+/hquu84SxJlnwn//a/u/h9rRJpkw8zEIFxIlSsDtt9siTwBVYdcum7iUo4QEePttOP54++/shx8KJVYXw2bOtHGAjAxblLNnj31wX3mlDY5t3Xp0j79tm42N1a9vU/dGj7aNscKRHGKAJwgXUr1725idiK2oe+op+Pe/c7lD1aq2RiI93WrNbNuWy8numJWZaXOre/SwcatSpawVGh9vReumT7c3X6VK1ip96CFYtiz/KzszM22B2hlnWFIYMMC6lW64wf77OUZ5gnAhldWteuWV3zF1Kpx11sFxiT/+yOFODRrYlNdVq+zkffsKNWYX5bZts8Rw771wxRXWn/nhhzZoPHeuveF++826KW+6yc6/9VZo3Bhq1LCteHNrXXzyib1xBw6EU06xaawTJkCVKoX6Y0alnHYSisWL7ygXPbLi3LtX9e67VePiVGvUUP3gg1zu9MILtiPdkCGqmZmFEqdqIbym+dzlLy+x9rsPia++sp0K4+JUx43L//ti40bViRNVe/dWLV/e3lfFi6u2bav64IOqkyfruksvVe3SxY5Vrao6ebJqRkboYg+hcP7uyWVHOR+kdmEVH289A127WiuiY0ebFPKvf1lX1CEGD7bprw89ZN0IN98ckZhD6t13be3H/v02xz3HUXv3J++8Y1PkSpSwdQRHMg20alVrEQwcaC3SRYtsoHnWLGtdENiYBuyNOX68rW52h/AuJlcomje3noHhw2HsWCs5s3RpkBMfeAD69IFbboG//tV2zIol6en2IXTjjbYNa5cuNs89M9Pm0M+cGekIo5+q/Qdx4YX2j8LixUe3RiA+3tYc/OtfttHOyJEgYpvVxMVZJUpPDkF5gnCFpkwZGDcO3nvPuoPPPtvywSF7YRcrBkOH2tdp06zGTdmyVhDq/POtlXHPPdZHPHs2rF6d8zLuUBdTC2bPHusHv/NOaN3aFkd162Y/6F/+An//u7UcROyD74kn7IfevTt8McWy9HQbh7r9dujXD+bPt3UyoXTRRVCqFJnFikXtArVo4V1MrtB16gTLl9sC6jvusJmu//d/cNppgRMW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\n", | ||
| 277 | + "text/plain": [ | ||
| 278 | + "<Figure size 432x288 with 1 Axes>" | ||
| 279 | + ] | ||
| 280 | + }, | ||
| 281 | + "metadata": { | ||
| 282 | + "needs_background": "light" | ||
| 283 | + }, | ||
| 284 | + "output_type": "display_data" | ||
| 285 | + } | ||
| 286 | + ], | ||
| 287 | + "source": [ | ||
| 288 | + "y_vloss = history.history['val_loss']\n", | ||
| 289 | + "y_loss = history.history['loss']\n", | ||
| 290 | + "\n", | ||
| 291 | + "x_len = np.arange(len(y_loss))\n", | ||
| 292 | + "\n", | ||
| 293 | + "plt.plot(x_len, y_vloss, marker='.', c='red', label='val_set_loss')\n", | ||
| 294 | + "plt.plot(x_len, y_loss, marker='.', c='blue', label='train_set_oss')\n", | ||
| 295 | + "plt.legend()\n", | ||
| 296 | + "plt.xlabel('epochs')\n", | ||
| 297 | + "plt.ylabel('loss')\n", | ||
| 298 | + "plt.grid()\n", | ||
| 299 | + "plt.show()" | ||
| 300 | + ] | ||
| 301 | + }, | ||
| 302 | + { | ||
| 303 | + "cell_type": "code", | ||
| 304 | + "execution_count": 43, | ||
| 305 | + "metadata": { | ||
| 306 | + "scrolled": true | ||
| 307 | + }, | ||
| 308 | + "outputs": [ | ||
| 309 | + { | ||
| 310 | + "name": "stdout", | ||
| 311 | + "output_type": "stream", | ||
| 312 | + "text": [ | ||
| 313 | + "i: [0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000\n", | ||
| 314 | + " 0.000 0.000]\n", | ||
| 315 | + "pre_ans: 3\n", | ||
| 316 | + "해당 antelope1.jpg이미지는 cow로 추정됩니다.\n", | ||
| 317 | + "i: [0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000\n", | ||
| 318 | + " 0.000 0.000]\n", | ||
| 319 | + "pre_ans: 3\n", | ||
| 320 | + "해당 cat.jpg이미지는 cow로 추정됩니다.\n", | ||
| 321 | + "i: [0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000\n", | ||
| 322 | + " 0.000 0.000]\n", | ||
| 323 | + "pre_ans: 2\n", | ||
| 324 | + "해당 raccoon.jpg이미지는 chimpanzee로 추정됩니다.\n", | ||
| 325 | + "i: [0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000\n", | ||
| 326 | + " 0.000 0.000]\n", | ||
| 327 | + "pre_ans: 3\n", | ||
| 328 | + "해당 raccoon2.jpg이미지는 cow로 추정됩니다.\n", | ||
| 329 | + "i: [0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000\n", | ||
| 330 | + " 0.000 0.000]\n", | ||
| 331 | + "pre_ans: 3\n", | ||
| 332 | + "해당 rat.jpg이미지는 cow로 추정됩니다.\n", | ||
| 333 | + "i: [0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000\n", | ||
| 334 | + " 0.000 0.000]\n", | ||
| 335 | + "pre_ans: 1\n", | ||
| 336 | + "해당 squirrel.jpg이미지는 cats으로 추정됩니다.\n" | ||
| 337 | + ] | ||
| 338 | + } | ||
| 339 | + ], | ||
| 340 | + "source": [ | ||
| 341 | + "from PIL import Image\n", | ||
| 342 | + "import os, glob, numpy as np\n", | ||
| 343 | + "from keras.models import load_model\n", | ||
| 344 | + "\n", | ||
| 345 | + "caltech_dir = \"D:/Games/Images/val2\"\n", | ||
| 346 | + "image_w = 64\n", | ||
| 347 | + "image_h = 64\n", | ||
| 348 | + "\n", | ||
| 349 | + "pixels = image_h * image_w * 3\n", | ||
| 350 | + "\n", | ||
| 351 | + "X = []\n", | ||
| 352 | + "filenames = []\n", | ||
| 353 | + "files = glob.glob(caltech_dir+\"/*.*\")\n", | ||
| 354 | + "for i, f in enumerate(files):\n", | ||
| 355 | + " img = Image.open(f)\n", | ||
| 356 | + " img = img.convert(\"RGB\")\n", | ||
| 357 | + " img = img.resize((image_w, image_h))\n", | ||
| 358 | + " data = np.asarray(img)\n", | ||
| 359 | + " filenames.append(f)\n", | ||
| 360 | + " X.append(data)\n", | ||
| 361 | + "\n", | ||
| 362 | + "X = np.array(X)\n", | ||
| 363 | + "model = load_model('./model/multi_img_classification.model')\n", | ||
| 364 | + "\n", | ||
| 365 | + "prediction = model.predict(X)\n", | ||
| 366 | + "np.set_printoptions(formatter={'float': lambda x: \"{0:0.3f}\".format(x)})\n", | ||
| 367 | + "cnt = 0\n", | ||
| 368 | + "\n", | ||
| 369 | + "#이 비교는 그냥 파일들이 있으면 해당 파일과 비교. 카테고리와 함께 비교해서 진행하는 것은 _4 파일.\n", | ||
| 370 | + "for i in prediction:\n", | ||
| 371 | + " pre_ans = i.argmax() # 예측 레이블\n", | ||
| 372 | + " print(\"i:\",i)\n", | ||
| 373 | + " print(\"pre_ans: \",pre_ans)\n", | ||
| 374 | + " pre_ans_str = ''\n", | ||
| 375 | + " if pre_ans == 0: pre_ans_str = \"antelope\"\n", | ||
| 376 | + " elif pre_ans == 1: pre_ans_str = \"cats\"\n", | ||
| 377 | + " elif pre_ans == 2: pre_ans_str = \"chimpanzee\"\n", | ||
| 378 | + " elif pre_ans == 3: pre_ans_str = \"cow\"\n", | ||
| 379 | + " elif pre_ans == 4: pre_ans_str = \"dogs\"\n", | ||
| 380 | + " elif pre_ans == 5: pre_ans_str = \"hippopotamus\"\n", | ||
| 381 | + " elif pre_ans == 6: pre_ans_str = \"horse\"\n", | ||
| 382 | + " elif pre_ans == 7: pre_ans_str = \"otter\"\n", | ||
| 383 | + " elif pre_ans == 8: pre_ans_str = \"raccooon\"\n", | ||
| 384 | + " elif pre_ans == 9: pre_ans_str = \"rat\"\n", | ||
| 385 | + " elif pre_ans == 10: pre_ans_str = \"rhinoceros\"\n", | ||
| 386 | + " elif pre_ans == 11: pre_ans_str = \"squirrel\"\n", | ||
| 387 | + " elif pre_ans == 12: pre_ans_str = \"weasel\"\n", | ||
| 388 | + " else: pre_ans_str = \"wolf\"\n", | ||
| 389 | + " if i[0] >= 0.8: print(\"해당 \"+filenames[cnt].split(\"\\\\\")[1]+\"이미지는 \"+pre_ans_str+\"로 추정됩니다.\")\n", | ||
| 390 | + " if i[1] >= 0.8: print(\"해당 \"+filenames[cnt].split(\"\\\\\")[1]+\"이미지는 \"+pre_ans_str+\"으로 추정됩니다.\")\n", | ||
| 391 | + " if i[2] >= 0.8: print(\"해당 \"+filenames[cnt].split(\"\\\\\")[1]+\"이미지는 \"+pre_ans_str+\"로 추정됩니다.\")\n", | ||
| 392 | + " if i[3] >= 0.8: print(\"해당 \"+filenames[cnt].split(\"\\\\\")[1]+\"이미지는 \"+pre_ans_str+\"로 추정됩니다.\")\n", | ||
| 393 | + " if i[4] >= 0.8: print(\"해당 \"+filenames[cnt].split(\"\\\\\")[1]+\"이미지는 \"+pre_ans_str+\"로 추정됩니다.\")\n", | ||
| 394 | + " if i[5] >= 0.8: print(\"해당 \"+filenames[cnt].split(\"\\\\\")[1]+\"이미지는 \"+pre_ans_str+\"로 추정됩니다.\")\n", | ||
| 395 | + " if i[6] >= 0.8: print(\"해당 \"+filenames[cnt].split(\"\\\\\")[1]+\"이미지는 \"+pre_ans_str+\"로 추정됩니다.\")\n", | ||
| 396 | + " if i[7] >= 0.8: print(\"해당 \"+filenames[cnt].split(\"\\\\\")[1]+\"이미지는 \"+pre_ans_str+\"로 추정됩니다.\")\n", | ||
| 397 | + " if i[8] >= 0.8: print(\"해당 \"+filenames[cnt].split(\"\\\\\")[1]+\"이미지는 \"+pre_ans_str+\"로 추정됩니다.\")\n", | ||
| 398 | + " if i[9] >= 0.8: print(\"해당 \"+filenames[cnt].split(\"\\\\\")[1]+\"이미지는 \"+pre_ans_str+\"로 추정됩니다.\")\n", | ||
| 399 | + " if i[10] >= 0.8: print(\"해당 \"+filenames[cnt].split(\"\\\\\")[1]+\"이미지는 \"+pre_ans_str+\"로 추정됩니다.\")\n", | ||
| 400 | + " if i[11] >= 0.8: print(\"해당 \"+filenames[cnt].split(\"\\\\\")[1]+\"이미지는 \"+pre_ans_str+\"로 추정됩니다.\")\n", | ||
| 401 | + " if i[12] >= 0.8: print(\"해당 \"+filenames[cnt].split(\"\\\\\")[1]+\"이미지는 \"+pre_ans_str+\"로 추정됩니다.\")\n", | ||
| 402 | + " cnt += 1\n", | ||
| 403 | + " # print(i.argmax()) #얘가 레이블 [1. 0. 0.] 이런식으로 되어 있는 것을 숫자로 바꿔주는 것.\n", | ||
| 404 | + " # 즉 얘랑, 나중에 카테고리 데이터 불러와서 카테고리랑 비교를 해서 같으면 맞는거고, 아니면 틀린거로 취급하면 된다.\n", | ||
| 405 | + " # 이걸 한 것은 _4.py에.\n" | ||
| 406 | + ] | ||
| 407 | + }, | ||
| 408 | + { | ||
| 409 | + "cell_type": "code", | ||
| 410 | + "execution_count": null, | ||
| 411 | + "metadata": {}, | ||
| 412 | + "outputs": [], | ||
| 413 | + "source": [] | ||
| 414 | + } | ||
| 415 | + ], | ||
| 416 | + "metadata": { | ||
| 417 | + "kernelspec": { | ||
| 418 | + "display_name": "project", | ||
| 419 | + "language": "python", | ||
| 420 | + "name": "project" | ||
| 421 | + }, | ||
| 422 | + "language_info": { | ||
| 423 | + "codemirror_mode": { | ||
| 424 | + "name": "ipython", | ||
| 425 | + "version": 3 | ||
| 426 | + }, | ||
| 427 | + "file_extension": ".py", | ||
| 428 | + "mimetype": "text/x-python", | ||
| 429 | + "name": "python", | ||
| 430 | + "nbconvert_exporter": "python", | ||
| 431 | + "pygments_lexer": "ipython3", | ||
| 432 | + "version": "3.6.7" | ||
| 433 | + } | ||
| 434 | + }, | ||
| 435 | + "nbformat": 4, | ||
| 436 | + "nbformat_minor": 4 | ||
| 437 | +} |
code/Style_Transfer.ipynb
0 → 100644
This diff could not be displayed because it is too large.
code/animal_classification.ipynb
0 → 100644
This diff could not be displayed because it is too large.
-
Please register or login to post a comment