{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# Seongho Jin\n# kaggle quick draw competition\n\n# drawing data를 이미지로 바꿈\n# 이미지 전처리\n# 좌우대칭, 가우시안 블러 적용 (그림 주변으로 다양한 화소값을 가지게 하기 위해)\n# 입력 이미지는 0~1 사이의 값으로 적용\n\n# MobileNetV2 사용하여 학습 (선정이유: weight는 적지만, 높은 성능을 보이는 모델로 캐글 서버에서 학습하기 적합함)\n\n\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\nimport os\nprint(os.listdir(\"../input\"))\nimport glob\nfrom matplotlib import pyplot as plt\nimport cv2\nimport keras\nimport random","execution_count":3,"outputs":[{"output_type":"stream","text":"['quickdraw-doodle-recognition', 'mydata', 'mydata1']\n","name":"stdout"},{"output_type":"stream","text":"Using TensorFlow backend.\n","name":"stderr"}]},{"metadata":{},"cell_type":"markdown","source":"### DATA arrangement"},{"metadata":{"trusted":true},"cell_type":"code","source":"class_names = sorted([name[:-4] for name in os.listdir('../input/quickdraw-doodle-recognition/train_simplified/')]) # 340 classes\nclass_dic = {}\nfor i in range(len(class_names)):\n    class_dic[class_names[i]] = i\nclass_paths = sorted(glob.glob('../input/quickdraw-doodle-recognition/train_simplified/' + \"*\"))\n\ncols=['drawing', 'key_id', 'recognized', 'word']\ntotal_df = pd.DataFrame(columns=cols)\nfor c in range(len(class_paths)):\n    df = pd.read_csv(class_paths[c], usecols=['drawing', 'key_id', 'recognized', 'word'], nrows=1500)\n    df = df[df.recognized == True]\n    df = df.head(1000)\n    df = df.reset_index(drop=True)\n    total_df = total_df.append(df, ignore_index=True)\n    print(c)\ndisplay(total_df)\n\n# Data divided into train and validation \n# 340 * 1000 = 340,000 data divide into 7:3 ratio\n\nfrom numpy.random import RandomState\nrans = RandomState(seed=0)\ntrain = total_df.sample(frac=0.7, random_state=rans)\nval = total_df.loc[~total_df.index.isin(train.index)]\n# train.to_csv('train3401000.csv')\n# val.to_csv('val3401000.csv')\n","execution_count":4,"outputs":[{"output_type":"stream","text":"0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n82\n83\n84\n85\n86\n87\n88\n89\n90\n91\n92\n93\n94\n95\n96\n97\n98\n99\n100\n101\n102\n103\n104\n105\n106\n107\n108\n109\n110\n111\n112\n113\n114\n115\n116\n117\n118\n119\n120\n121\n122\n123\n124\n125\n126\n127\n128\n129\n130\n131\n132\n133\n134\n135\n136\n137\n138\n139\n140\n141\n142\n143\n144\n145\n146\n147\n148\n149\n150\n151\n152\n153\n154\n155\n156\n157\n158\n159\n160\n161\n162\n163\n164\n165\n166\n167\n168\n169\n170\n171\n172\n173\n174\n175\n176\n177\n178\n179\n180\n181\n182\n183\n184\n185\n186\n187\n188\n189\n190\n191\n192\n193\n194\n195\n196\n197\n198\n199\n200\n201\n202\n203\n204\n205\n206\n207\n208\n209\n210\n211\n212\n213\n214\n215\n216\n217\n218\n219\n220\n221\n222\n223\n224\n225\n226\n227\n228\n229\n230\n231\n232\n233\n234\n235\n236\n237\n238\n239\n240\n241\n242\n243\n244\n245\n246\n247\n248\n249\n250\n251\n252\n253\n254\n255\n256\n257\n258\n259\n260\n261\n262\n263\n264\n265\n266\n267\n268\n269\n270\n271\n272\n273\n274\n275\n276\n277\n278\n279\n280\n281\n282\n283\n284\n285\n286\n287\n288\n289\n290\n291\n292\n293\n294\n295\n296\n297\n298\n299\n300\n301\n302\n303\n304\n305\n306\n307\n308\n309\n310\n311\n312\n313\n314\n315\n316\n317\n318\n319\n320\n321\n322\n323\n324\n325\n326\n327\n328\n329\n330\n331\n332\n333\n334\n335\n336\n337\n338\n339\n","name":"stdout"},{"output_type":"display_data","data":{"text/plain":"                                                  drawing        ...                     word\n0       [[[0, 22, 37, 64, 255], [218, 220, 227, 228, 2...        ...         The Eiffel Tower\n1       [[[47, 47, 36, 26, 0, 10, 23, 46, 46, 63, 68, ...        ...         The Eiffel Tower\n2       [[[184, 115, 67, 57, 36, 18], [251, 103, 12, 1...        ...         The Eiffel Tower\n3       [[[0, 187, 177, 132, 105, 79, 38, 19, 11], [24...        ...         The Eiffel Tower\n4       [[[0, 21, 43, 83, 97, 158, 169, 172], [162, 16...        ...         The Eiffel Tower\n5       [[[131, 119, 48, 26], [16, 56, 221, 255]], [[1...        ...         The Eiffel Tower\n6       [[[0, 37, 58, 74, 92, 105, 106], [238, 227, 21...        ...         The Eiffel Tower\n7       [[[0, 17, 50, 98, 117, 141, 153, 155], [201, 1...        ...         The Eiffel Tower\n8       [[[0, 20, 28, 48, 57, 57, 66, 57, 55, 65, 85, ...        ...         The Eiffel Tower\n9       [[[0, 12, 31, 70, 107, 118, 127, 137, 150, 161...        ...         The Eiffel Tower\n10      [[[61, 61, 58, 59, 56, 46, 40, 33, 26, 26, 16,...        ...         The Eiffel Tower\n11      [[[0, 33, 32, 19, 19, 13, 13, 21, 86, 89, 80, ...        ...         The Eiffel Tower\n12      [[[159, 142, 118, 82, 73, 62, 29, 18, 14], [21...        ...         The Eiffel Tower\n13      [[[0, 35, 50, 75, 82, 97, 128, 152, 191, 188, ...        ...         The Eiffel Tower\n14      [[[0, 15, 61, 99, 137, 143, 204, 199], [230, 1...        ...         The Eiffel Tower\n15      [[[2, 31, 47, 62, 71], [239, 127, 82, 27, 9]],...        ...         The Eiffel Tower\n16      [[[0, 21, 55, 87, 101, 119, 147, 188, 196, 187...        ...         The Eiffel Tower\n17      [[[10, 31, 40, 52, 73, 92, 121, 97], [226, 93,...        ...         The Eiffel Tower\n18      [[[0, 16, 38, 51, 66, 72, 72, 64, 96, 107, 120...        ...         The Eiffel Tower\n19      [[[50, 70, 89, 118, 128, 131, 137, 138, 152, 1...        ...         The Eiffel Tower\n20      [[[1, 4, 30, 37, 60, 75, 80, 96, 112, 132, 141...        ...         The Eiffel Tower\n21      [[[40, 42], [47, 0]], [[90, 93, 102], [50, 25,...        ...         The Eiffel Tower\n22      [[[157, 148, 142, 91, 67, 62, 40, 0], [0, 29, ...        ...         The Eiffel Tower\n23      [[[0, 17, 69, 114, 139, 157, 164, 179, 255], [...        ...         The Eiffel Tower\n24      [[[0, 0, 41, 56, 71, 79, 81], [255, 211, 152, ...        ...         The Eiffel Tower\n25      [[[0, 28], [243, 254]], [[0, 3, 64, 84, 93, 13...        ...         The Eiffel Tower\n26      [[[0, 21, 47, 65, 61], [249, 211, 129, 59, 55]...        ...         The Eiffel Tower\n27      [[[7, 26, 41, 47, 61, 69, 69, 79, 83, 92, 93, ...        ...         The Eiffel Tower\n28      [[[55, 18, 0], [2, 186, 255]], [[53, 80, 95, 1...        ...         The Eiffel Tower\n29      [[[192, 167, 132, 71, 57, 56, 52, 27, 1, 0, 44...        ...         The Eiffel Tower\n...                                                   ...        ...                      ...\n339970  [[[0, 3, 60, 83, 91, 100, 104, 107, 116, 132, ...        ...                   zigzag\n339971  [[[33, 50, 84, 94, 122, 161, 184, 201, 220, 24...        ...                   zigzag\n339972  [[[0, 31, 45, 46, 50, 63, 72, 77, 95, 99, 114,...        ...                   zigzag\n339973  [[[148, 185, 99, 190, 210, 201, 170, 104, 172,...        ...                   zigzag\n339974  [[[0, 32, 50, 58, 86, 126, 187], [26, 127, 227...        ...                   zigzag\n339975  [[[18, 37, 115, 134, 128, 67, 5, 0, 15, 78, 12...        ...                   zigzag\n339976  [[[42, 124, 195, 198, 198, 178, 137, 3, 0, 25,...        ...                   zigzag\n339977  [[[169, 154, 20, 9, 8, 62, 215, 247, 180, 92, ...        ...                   zigzag\n339978  [[[0, 7, 21, 41, 58, 63, 69, 81, 117, 120, 129...        ...                   zigzag\n339979  [[[0, 28, 78, 80, 78, 57, 157, 181, 186, 181, ...        ...                   zigzag\n339980  [[[132, 54, 15, 0, 32, 132, 175, 223, 251, 255...        ...                   zigzag\n339981  [[[0, 25, 101, 62, 52, 56, 108, 250, 255], [0,...        ...                   zigzag\n339982  [[[11, 25, 61, 62, 18, 14, 34, 54, 71, 74, 71,...        ...                   zigzag\n339983  [[[0, 11, 44, 127, 152, 151, 90, 41, 57, 108, ...        ...                   zigzag\n339984  [[[0, 142, 44, 24, 36, 140, 180, 147, 39, 45, ...        ...                   zigzag\n339985  [[[1, 1, 18, 26, 32, 71, 78, 100, 120, 123, 15...        ...                   zigzag\n339986  [[[255, 186, 162, 132, 127, 168, 181, 185, 181...        ...                   zigzag\n339987  [[[0, 41, 52, 94, 144, 160, 202, 231, 253, 255...        ...                   zigzag\n339988  [[[80, 120, 140, 235, 54, 12, 1, 1, 171, 225, ...        ...                   zigzag\n339989  [[[0, 83, 180, 141, 255, 248, 246], [34, 16, 0...        ...                   zigzag\n339990  [[[69, 89, 172, 37, 0, 255], [0, 8, 21, 82, 10...        ...                   zigzag\n339991  [[[3, 123, 213, 208, 132, 0, 255], [0, 1, 12, ...        ...                   zigzag\n339992   [[[0, 75, 40, 118, 54], [0, 55, 122, 133, 255]]]        ...                   zigzag\n339993  [[[0, 36, 110, 118, 119, 80, 139, 194, 142, 13...        ...                   zigzag\n339994  [[[187, 145, 78, 38, 17, 10, 23, 111, 197, 246...        ...                   zigzag\n339995  [[[0, 13, 26, 37, 53, 52, 58, 67, 83, 106, 108...        ...                   zigzag\n339996  [[[148, 124, 115, 107, 110, 206, 246, 230, 196...        ...                   zigzag\n339997  [[[6, 0, 0, 8, 10, 14, 49, 77, 84, 89, 98, 105...        ...                   zigzag\n339998  [[[0, 25, 46, 101, 105, 113, 119, 125, 161, 17...        ...                   zigzag\n339999  [[[0, 11, 65, 77, 110, 127, 132, 135, 178, 193...        ...                   zigzag\n\n[340000 rows x 4 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>drawing</th>\n      <th>key_id</th>\n      <th>recognized</th>\n      <th>word</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>[[[0, 22, 37, 64, 255], [218, 220, 227, 228, 2...</td>\n      <td>5027286841556992</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>[[[47, 47, 36, 26, 0, 10, 23, 46, 46, 63, 68, ...</td>\n      <td>5716269791707136</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>[[[184, 115, 67, 57, 36, 18], [251, 103, 12, 1...</td>\n      <td>5942899998982144</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>[[[0, 187, 177, 132, 105, 79, 38, 19, 11], [24...</td>\n      <td>6226163091374080</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>[[[0, 21, 43, 83, 97, 158, 169, 172], [162, 16...</td>\n      <td>4889008825958400</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>[[[131, 119, 48, 26], [16, 56, 221, 255]], [[1...</td>\n      <td>5643506171248640</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>[[[0, 37, 58, 74, 92, 105, 106], [238, 227, 21...</td>\n      <td>5048121811795968</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>[[[0, 17, 50, 98, 117, 141, 153, 155], [201, 1...</td>\n      <td>5715492117413888</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>8</th>\n      <td>[[[0, 20, 28, 48, 57, 57, 66, 57, 55, 65, 85, ...</td>\n      <td>5672915955613696</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>9</th>\n      <td>[[[0, 12, 31, 70, 107, 118, 127, 137, 150, 161...</td>\n      <td>6257783634657280</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>10</th>\n      <td>[[[61, 61, 58, 59, 56, 46, 40, 33, 26, 26, 16,...</td>\n      <td>6727058266783744</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>11</th>\n      <td>[[[0, 33, 32, 19, 19, 13, 13, 21, 86, 89, 80, ...</td>\n      <td>5894429464330240</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>12</th>\n      <td>[[[159, 142, 118, 82, 73, 62, 29, 18, 14], [21...</td>\n      <td>5471432681193472</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>13</th>\n      <td>[[[0, 35, 50, 75, 82, 97, 128, 152, 191, 188, ...</td>\n      <td>5647889722245120</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>14</th>\n      <td>[[[0, 15, 61, 99, 137, 143, 204, 199], [230, 1...</td>\n      <td>5766416324100096</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>15</th>\n      <td>[[[2, 31, 47, 62, 71], [239, 127, 82, 27, 9]],...</td>\n      <td>4552252150775808</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>16</th>\n      <td>[[[0, 21, 55, 87, 101, 119, 147, 188, 196, 187...</td>\n      <td>5690451338199040</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>17</th>\n      <td>[[[10, 31, 40, 52, 73, 92, 121, 97], [226, 93,...</td>\n      <td>6565638229196800</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>18</th>\n      <td>[[[0, 16, 38, 51, 66, 72, 72, 64, 96, 107, 120...</td>\n      <td>5495672490950656</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>19</th>\n      <td>[[[50, 70, 89, 118, 128, 131, 137, 138, 152, 1...</td>\n      <td>5110057085698048</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>20</th>\n      <td>[[[1, 4, 30, 37, 60, 75, 80, 96, 112, 132, 141...</td>\n      <td>5991781021777920</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>21</th>\n      <td>[[[40, 42], [47, 0]], [[90, 93, 102], [50, 25,...</td>\n      <td>6690778862583808</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>22</th>\n      <td>[[[157, 148, 142, 91, 67, 62, 40, 0], [0, 29, ...</td>\n      <td>5046478236024832</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>23</th>\n      <td>[[[0, 17, 69, 114, 139, 157, 164, 179, 255], [...</td>\n      <td>5861098521624576</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>24</th>\n      <td>[[[0, 0, 41, 56, 71, 79, 81], [255, 211, 152, ...</td>\n      <td>5312114191237120</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>25</th>\n      <td>[[[0, 28], [243, 254]], [[0, 3, 64, 84, 93, 13...</td>\n      <td>5905720065130496</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>26</th>\n      <td>[[[0, 21, 47, 65, 61], [249, 211, 129, 59, 55]...</td>\n      <td>6227942734561280</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>27</th>\n      <td>[[[7, 26, 41, 47, 61, 69, 69, 79, 83, 92, 93, ...</td>\n      <td>4865728761036800</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>28</th>\n      <td>[[[55, 18, 0], [2, 186, 255]], [[53, 80, 95, 1...</td>\n      <td>4506296990564352</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>29</th>\n      <td>[[[192, 167, 132, 71, 57, 56, 52, 27, 1, 0, 44...</td>\n      <td>4912632286937088</td>\n      <td>True</td>\n      <td>The Eiffel Tower</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>339970</th>\n      <td>[[[0, 3, 60, 83, 91, 100, 104, 107, 116, 132, ...</td>\n      <td>4960721911676928</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339971</th>\n      <td>[[[33, 50, 84, 94, 122, 161, 184, 201, 220, 24...</td>\n      <td>5522015505088512</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339972</th>\n      <td>[[[0, 31, 45, 46, 50, 63, 72, 77, 95, 99, 114,...</td>\n      <td>4950011437645824</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339973</th>\n      <td>[[[148, 185, 99, 190, 210, 201, 170, 104, 172,...</td>\n      <td>6096438758998016</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339974</th>\n      <td>[[[0, 32, 50, 58, 86, 126, 187], [26, 127, 227...</td>\n      <td>5785118402674688</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339975</th>\n      <td>[[[18, 37, 115, 134, 128, 67, 5, 0, 15, 78, 12...</td>\n      <td>4985941947056128</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339976</th>\n      <td>[[[42, 124, 195, 198, 198, 178, 137, 3, 0, 25,...</td>\n      <td>5534255872475136</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339977</th>\n      <td>[[[169, 154, 20, 9, 8, 62, 215, 247, 180, 92, ...</td>\n      <td>4783984330407936</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339978</th>\n      <td>[[[0, 7, 21, 41, 58, 63, 69, 81, 117, 120, 129...</td>\n      <td>4630034281136128</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339979</th>\n      <td>[[[0, 28, 78, 80, 78, 57, 157, 181, 186, 181, ...</td>\n      <td>4633423123578880</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339980</th>\n      <td>[[[132, 54, 15, 0, 32, 132, 175, 223, 251, 255...</td>\n      <td>4560919713546240</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339981</th>\n      <td>[[[0, 25, 101, 62, 52, 56, 108, 250, 255], [0,...</td>\n      <td>5336655185575936</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339982</th>\n      <td>[[[11, 25, 61, 62, 18, 14, 34, 54, 71, 74, 71,...</td>\n      <td>4874879998361600</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339983</th>\n      <td>[[[0, 11, 44, 127, 152, 151, 90, 41, 57, 108, ...</td>\n      <td>6405763108962304</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339984</th>\n      <td>[[[0, 142, 44, 24, 36, 140, 180, 147, 39, 45, ...</td>\n      <td>4926342564937728</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339985</th>\n      <td>[[[1, 1, 18, 26, 32, 71, 78, 100, 120, 123, 15...</td>\n      <td>6116152457560064</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339986</th>\n      <td>[[[255, 186, 162, 132, 127, 168, 181, 185, 181...</td>\n      <td>5536197264801792</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339987</th>\n      <td>[[[0, 41, 52, 94, 144, 160, 202, 231, 253, 255...</td>\n      <td>6343606522609664</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339988</th>\n      <td>[[[80, 120, 140, 235, 54, 12, 1, 1, 171, 225, ...</td>\n      <td>6314473172238336</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339989</th>\n      <td>[[[0, 83, 180, 141, 255, 248, 246], [34, 16, 0...</td>\n      <td>5122774639050752</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339990</th>\n      <td>[[[69, 89, 172, 37, 0, 255], [0, 8, 21, 82, 10...</td>\n      <td>4782029583417344</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339991</th>\n      <td>[[[3, 123, 213, 208, 132, 0, 255], [0, 1, 12, ...</td>\n      <td>4548304035643392</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339992</th>\n      <td>[[[0, 75, 40, 118, 54], [0, 55, 122, 133, 255]]]</td>\n      <td>6143602176557056</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339993</th>\n      <td>[[[0, 36, 110, 118, 119, 80, 139, 194, 142, 13...</td>\n      <td>5611408907567104</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339994</th>\n      <td>[[[187, 145, 78, 38, 17, 10, 23, 111, 197, 246...</td>\n      <td>5996460573196288</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339995</th>\n      <td>[[[0, 13, 26, 37, 53, 52, 58, 67, 83, 106, 108...</td>\n      <td>4578628723539968</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339996</th>\n      <td>[[[148, 124, 115, 107, 110, 206, 246, 230, 196...</td>\n      <td>4640295641677824</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339997</th>\n      <td>[[[6, 0, 0, 8, 10, 14, 49, 77, 84, 89, 98, 105...</td>\n      <td>5461855260639232</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339998</th>\n      <td>[[[0, 25, 46, 101, 105, 113, 119, 125, 161, 17...</td>\n      <td>6690517473558528</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n    <tr>\n      <th>339999</th>\n      <td>[[[0, 11, 65, 77, 110, 127, 132, 135, 178, 193...</td>\n      <td>5037856504414208</td>\n      <td>True</td>\n      <td>zigzag</td>\n    </tr>\n  </tbody>\n</table>\n<p>340000 rows × 4 columns</p>\n</div>"},"metadata":{}}]},{"metadata":{},"cell_type":"markdown","source":"### Data Preprocessing, Augmentation, and Generator"},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.utils import to_categorical\nfrom imgaug import augmenters as iaa\nseq = iaa.Sequential([\n    iaa.Fliplr(0.5),\n    iaa.GaussianBlur(sigma=(0.0, 3.0))\n])\n\nBATCH_SIZE = 680\nN_CLASS = 340\nW, H = 224, 224\n\nLINE_WIDTH = 3\ntrain_path = '../input/mydata1/train3401000.csv'\nval_path= '../input/mydata1/val3401000.csv'\n\n\ndef load_random_samples(file, sample_size):\n    num_lines = sum(1 for l in open(file))\n\n    skip_idx = random.sample(range(1, num_lines), num_lines - (sample_size + 1))\n    samples = pd.read_csv(file, usecols=['drawing',  'word'], \n                       skiprows=skip_idx)\n    return samples\n\ndef drawing_to_img(drawing,  line_width):\n    if type(drawing) == str:\n        drawing = eval(drawing)\n        \n    img = np.zeros((W, H), np.uint8)\n    for step in drawing :\n        x, y = step\n        for i in range(len(x)-1):\n            cv2.line(img, (x[i], y[i]), (x[i+1], y[i+1]), 255, line_width) # line으로 연결\n    return img\n\n\ndef img_preprocess(img_before):\n    img = np.reshape(img_before, (1, W, H))\n    img = seq.augment_images(images=img)\n    img = np.array(img).astype('float32') / 255\n    \n    dummy = np.zeros((W, H, 3))\n    for i in range(3):\n        dummy[:,:,i] = img[0,:,:]\n    return dummy\n\ndef generator_random(train_path, batch_size=680):\n    \n    while True:\n        df_batch = load_random_samples(train_path, batch_size)\n\n        batch_img = []\n        batch_label = []\n        for i in range(batch_size):\n            img = drawing_to_img(df_batch.drawing[i], LINE_WIDTH)\n            img = img_preprocess(img)\n\n            label = class_dic[df_batch.word[i]]\n            label = to_categorical(label, N_CLASS)\n            \n            batch_img.append(img)\n            batch_label.append(label)\n            \n        yield [np.array(batch_img), np.array(batch_label)]\n\ntrain_gen = generator_random(train_path, BATCH_SIZE)\nval_gen = generator_random(val_path, BATCH_SIZE)\nx, y = next(train_gen)\nprint(np.shape(x), np.shape(y))","execution_count":5,"outputs":[{"output_type":"stream","text":"(680, 224, 224, 3) (680, 340)\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"### Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.applications.mobilenet_v2 import MobileNetV2\nfrom keras.models import Sequential\nfrom keras.layers import GlobalAvgPool2D\nfrom keras.layers import Dense\n\nmobile_model = MobileNetV2(weights='imagenet', input_shape=(224, 224, 3), include_top=False, classes=N_CLASS)\nmodel = Sequential()\nmodel.add(mobile_model)\nmodel.add(GlobalAvgPool2D())\nmodel.add(Dense(N_CLASS, activation='softmax', use_bias=True))\nmodel.summary()","execution_count":6,"outputs":[{"output_type":"stream","text":"WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\nInstructions for updating:\nColocations handled automatically by placer.\nDownloading data from https://github.com/JonathanCMitchell/mobilenet_v2_keras/releases/download/v1.1/mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_224_no_top.h5\n9412608/9406464 [==============================] - 0s 0us/step\n_________________________________________________________________\nLayer (type)                 Output Shape              Param #   \n=================================================================\nmobilenetv2_1.00_224 (Model) (None, 7, 7, 1280)        2257984   \n_________________________________________________________________\nglobal_average_pooling2d_1 ( (None, 1280)              0         \n_________________________________________________________________\ndense_1 (Dense)              (None, 340)               435540    \n=================================================================\nTotal params: 2,693,524\nTrainable params: 2,659,412\nNon-trainable params: 34,112\n_________________________________________________________________\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"### Training"},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.optimizers import Adam\nfrom keras.losses import categorical_crossentropy\nfrom keras.metrics import categorical_accuracy\nfrom keras.callbacks import ModelCheckpoint\nfrom math import ceil\n\nmodel.compile(optimizer=Adam(lr=1e-4), loss=categorical_crossentropy, metrics=[categorical_accuracy])\n\nweight_save = 'mobileNet_01.hdf5'\ncallback = ModelCheckpoint(weight_save,\n                           monitor='val_acc',\n                           mode='max',\n                           save_best_only=True,\n                           save_weights_only=True,\n                           verbose=1)\n\nn_train = sum(1 for l in open(train_path)) - 1\nn_val = sum(1 for l in open(val_path)) - 1\nN_EPOCH = 100\n\nhistory = model.fit_generator(train_gen, \n                                steps_per_epoch=ceil(n_train/BATCH_SIZE),\n                                epochs=N_EPOCH,\n                                validation_data=val_gen,\n                                validation_steps=ceil(n_val/BATCH_SIZE)\n                                )\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Test "},{"metadata":{"trusted":true},"cell_type":"code","source":"test_path = '../input/quickdraw-doodle-recognition/test_simplified.csv'\ntestset = pd.read_csv(test_path)\n\ndef test_generator(batch_size=680):\n    start = 0\n    end = 0\n    while True:\n        end = start + BATCH_SIZE\n\n        batch_img = []\n        for i in range(start, end):\n            img = drawing_to_img(testset.drawing[i], LINE_WIDTH)\n            img = img_preprocess(img)\n\n            batch_img.append(img)\n        \n        start += end\n        yield np.array(batch_img)\n\n\nn_test = sum(1 for l in open(val_test)) - 1\ntest_gen = test_generator(test_path, BATCH_SIZE)\n\noutput = model.predict_generator(test_gen, steps=ceil(n_test/BATCH_SIZE), verbose=1)\n\nresult = pd.DataFrame()\nfor i in range(n_test):\n\n    output_dic = {}\n    for i, o in enumerate(output[i]):\n        output_dic[o] = i\n\n    pred = []\n    for j, o in enumerate(sorted(output[i], reverse=True)):\n        pred.append(class_names[output_dic[o]])\n        if j == 2:\n            break\n    \n#     print(testset[i], end='')\n#     for j in range(3):\n#         print(pred[j], end='')\n#     print()\n#     break\n    \n    result.append(testset[i], pred)\n\nresult.to_csv('submission.csv')","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}