{"cells":[{"metadata":{"id":"sANiUFTEgSgq","colab_type":"text"},"cell_type":"markdown","source":"**EDA** <br/> (Exploratory Data Analysis)"},{"metadata":{"id":"S0WIlZdnZCY6","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"# Libraries\nimport os\nfrom glob import glob\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport cv2\n","execution_count":48,"outputs":[]},{"metadata":{"id":"mfKkVUYxZFFd","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"# All data\nprint(os.listdir('../input'))","execution_count":49,"outputs":[{"output_type":"stream","text":"['sample_submission.csv', 'test_images', 'train_images', 'test.csv', 'train.csv']\n","name":"stdout"}]},{"metadata":{"id":"gSSAPmv2ZFbA","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"# Data path\ntrain_df = pd.read_csv('../input/train.csv')\ntest_df = pd.read_csv('../input/test.csv')\nsub = pd.read_csv('../input/sample_submission.csv')\ntrain_dir = '../input/train_images'\ntest_dir = '../input/test_images'","execution_count":50,"outputs":[]},{"metadata":{"id":"3Cy_a6WEZFYY","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"print('Total images for train {0}'.format(len(os.listdir(train_dir))))\nprint('Total images for test {0}'.format(len(os.listdir(test_dir))))","execution_count":51,"outputs":[{"output_type":"stream","text":"Total images for train 196086\nTotal images for test 153730\n","name":"stdout"}]},{"metadata":{"id":"fBIV7648ZFVq","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"train_df.iloc[100:110]","execution_count":52,"outputs":[{"output_type":"execute_result","execution_count":52,"data":{"text/plain":"     category_id        date_captured   ...   width  height\n100            0  2014-05-23 15:12:10   ...    1024     747\n101            0  2014-08-19 10:35:14   ...    1024     747\n102            0  2014-05-12 12:50:39   ...    1024     747\n103            0  2013-12-07 08:07:32   ...    1024     747\n104            0  2014-05-07 14:29:28   ...    1024     747\n105           11  2011-10-10 18:43:46   ...    1024     747\n106            0  2014-05-11 13:32:39   ...    1024     747\n107            4  2012-03-18 06:00:56   ...    1024     747\n108            0  2013-10-16 16:00:00   ...    1024     747\n109           19  2011-04-23 12:04:56   ...    1024     747\n\n[10 rows x 11 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>category_id</th>\n      <th>date_captured</th>\n      <th>file_name</th>\n      <th>frame_num</th>\n      <th>id</th>\n      <th>location</th>\n      <th>rights_holder</th>\n      <th>seq_id</th>\n      <th>seq_num_frames</th>\n      <th>width</th>\n      <th>height</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>100</th>\n      <td>0</td>\n      <td>2014-05-23 15:12:10</td>\n      <td>5930ff91-23d2-11e8-a6a3-ec086b02610b.jpg</td>\n      <td>1</td>\n      <td>5930ff91-23d2-11e8-a6a3-ec086b02610b</td>\n      <td>96</td>\n      <td>Erin Boydston</td>\n      <td>6fb629bd-5567-11e8-ad1f-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>747</td>\n    </tr>\n    <tr>\n      <th>101</th>\n      <td>0</td>\n      <td>2014-08-19 10:35:14</td>\n      <td>58fa5e1e-23d2-11e8-a6a3-ec086b02610b.jpg</td>\n      <td>1</td>\n      <td>58fa5e1e-23d2-11e8-a6a3-ec086b02610b</td>\n      <td>114</td>\n      <td>Erin Boydston</td>\n      <td>7005ece1-5567-11e8-b251-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>747</td>\n    </tr>\n    <tr>\n      <th>102</th>\n      <td>0</td>\n      <td>2014-05-12 12:50:39</td>\n      <td>58fbecb5-23d2-11e8-a6a3-ec086b02610b.jpg</td>\n      <td>1</td>\n      <td>58fbecb5-23d2-11e8-a6a3-ec086b02610b</td>\n      <td>96</td>\n      <td>Erin Boydston</td>\n      <td>6fb0b97a-5567-11e8-90ec-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>747</td>\n    </tr>\n    <tr>\n      <th>103</th>\n      <td>0</td>\n      <td>2013-12-07 08:07:32</td>\n      <td>589e66cd-23d2-11e8-a6a3-ec086b02610b.jpg</td>\n      <td>1</td>\n      <td>589e66cd-23d2-11e8-a6a3-ec086b02610b</td>\n      <td>106</td>\n      <td>Erin Boydston</td>\n      <td>6f6aca3a-5567-11e8-b4d4-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>747</td>\n    </tr>\n    <tr>\n      <th>104</th>\n      <td>0</td>\n      <td>2014-05-07 14:29:28</td>\n      <td>58a0218a-23d2-11e8-a6a3-ec086b02610b.jpg</td>\n      <td>1</td>\n      <td>58a0218a-23d2-11e8-a6a3-ec086b02610b</td>\n      <td>96</td>\n      <td>Erin Boydston</td>\n      <td>6fa15691-5567-11e8-a134-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>747</td>\n    </tr>\n    <tr>\n      <th>105</th>\n      <td>11</td>\n      <td>2011-10-10 18:43:46</td>\n      <td>59e5de60-23d2-11e8-a6a3-ec086b02610b.jpg</td>\n      <td>2</td>\n      <td>59e5de60-23d2-11e8-a6a3-ec086b02610b</td>\n      <td>43</td>\n      <td>Justin Brown</td>\n      <td>6f0b7442-5567-11e8-ba49-dca9047ef277</td>\n      <td>3</td>\n      <td>1024</td>\n      <td>747</td>\n    </tr>\n    <tr>\n      <th>106</th>\n      <td>0</td>\n      <td>2014-05-11 13:32:39</td>\n      <td>5979be0e-23d2-11e8-a6a3-ec086b02610b.jpg</td>\n      <td>1</td>\n      <td>5979be0e-23d2-11e8-a6a3-ec086b02610b</td>\n      <td>26</td>\n      <td>Erin Boydston</td>\n      <td>6f3b5e30-5567-11e8-a852-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>747</td>\n    </tr>\n    <tr>\n      <th>107</th>\n      <td>4</td>\n      <td>2012-03-18 06:00:56</td>\n      <td>5a0e36da-23d2-11e8-a6a3-ec086b02610b.jpg</td>\n      <td>3</td>\n      <td>5a0e36da-23d2-11e8-a6a3-ec086b02610b</td>\n      <td>33</td>\n      <td>Justin Brown</td>\n      <td>6f0a0f26-5567-11e8-a8f1-dca9047ef277</td>\n      <td>3</td>\n      <td>1024</td>\n      <td>747</td>\n    </tr>\n    <tr>\n      <th>108</th>\n      <td>0</td>\n      <td>2013-10-16 16:00:00</td>\n      <td>591cb1d8-23d2-11e8-a6a3-ec086b02610b.jpg</td>\n      <td>1</td>\n      <td>591cb1d8-23d2-11e8-a6a3-ec086b02610b</td>\n      <td>96</td>\n      <td>Erin Boydston</td>\n      <td>6f90cd17-5567-11e8-9829-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>747</td>\n    </tr>\n    <tr>\n      <th>109</th>\n      <td>19</td>\n      <td>2011-04-23 12:04:56</td>\n      <td>598495cf-23d2-11e8-a6a3-ec086b02610b.jpg</td>\n      <td>2</td>\n      <td>598495cf-23d2-11e8-a6a3-ec086b02610b</td>\n      <td>33</td>\n      <td>Justin Brown</td>\n      <td>6f07df63-5567-11e8-b7c6-dca9047ef277</td>\n      <td>3</td>\n      <td>1024</td>\n      <td>747</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"id":"886LcOjRZFTA","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"test_df.iloc[100:110]","execution_count":53,"outputs":[{"output_type":"execute_result","execution_count":53,"data":{"text/plain":"           date_captured  ...   height\n100  2016-01-04 07:30:00  ...      726\n101  2016-01-04 07:35:00  ...      726\n102  2016-01-04 07:40:00  ...      726\n103  2016-01-04 07:45:00  ...      726\n104  2016-01-04 07:50:00  ...      726\n105  2016-01-04 07:55:00  ...      726\n106  2016-01-04 08:00:00  ...      726\n107  2016-01-04 08:05:00  ...      726\n108  2016-01-04 08:10:00  ...      726\n109  2016-01-04 08:15:00  ...      726\n\n[10 rows x 10 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>date_captured</th>\n      <th>file_name</th>\n      <th>frame_num</th>\n      <th>id</th>\n      <th>location</th>\n      <th>rights_holder</th>\n      <th>seq_id</th>\n      <th>seq_num_frames</th>\n      <th>width</th>\n      <th>height</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>100</th>\n      <td>2016-01-04 07:30:00</td>\n      <td>c18776b8-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c18776b8-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b0530-2e32-11e9-b5d8-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>101</th>\n      <td>2016-01-04 07:35:00</td>\n      <td>c18776b9-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c18776b9-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b056e-2e32-11e9-96ec-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>102</th>\n      <td>2016-01-04 07:40:00</td>\n      <td>c18776ba-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c18776ba-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b05b3-2e32-11e9-9837-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>103</th>\n      <td>2016-01-04 07:45:00</td>\n      <td>c18776bb-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c18776bb-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b05f8-2e32-11e9-9925-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>104</th>\n      <td>2016-01-04 07:50:00</td>\n      <td>c18776bc-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c18776bc-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b0638-2e32-11e9-a7b9-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>105</th>\n      <td>2016-01-04 07:55:00</td>\n      <td>c18776bd-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c18776bd-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b067d-2e32-11e9-9ff3-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>106</th>\n      <td>2016-01-04 08:00:00</td>\n      <td>c2bbdf08-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c2bbdf08-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b06c2-2e32-11e9-b099-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>107</th>\n      <td>2016-01-04 08:05:00</td>\n      <td>c2bbdf09-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c2bbdf09-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b06fd-2e32-11e9-a0aa-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>108</th>\n      <td>2016-01-04 08:10:00</td>\n      <td>c2bbdf0a-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c2bbdf0a-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b0745-2e32-11e9-858f-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>109</th>\n      <td>2016-01-04 08:15:00</td>\n      <td>c2bbdf0b-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c2bbdf0b-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b078a-2e32-11e9-9280-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"id":"Jfb2vap1ZFQE","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"test_df.iloc[100:110]","execution_count":54,"outputs":[{"output_type":"execute_result","execution_count":54,"data":{"text/plain":"           date_captured  ...   height\n100  2016-01-04 07:30:00  ...      726\n101  2016-01-04 07:35:00  ...      726\n102  2016-01-04 07:40:00  ...      726\n103  2016-01-04 07:45:00  ...      726\n104  2016-01-04 07:50:00  ...      726\n105  2016-01-04 07:55:00  ...      726\n106  2016-01-04 08:00:00  ...      726\n107  2016-01-04 08:05:00  ...      726\n108  2016-01-04 08:10:00  ...      726\n109  2016-01-04 08:15:00  ...      726\n\n[10 rows x 10 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>date_captured</th>\n      <th>file_name</th>\n      <th>frame_num</th>\n      <th>id</th>\n      <th>location</th>\n      <th>rights_holder</th>\n      <th>seq_id</th>\n      <th>seq_num_frames</th>\n      <th>width</th>\n      <th>height</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>100</th>\n      <td>2016-01-04 07:30:00</td>\n      <td>c18776b8-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c18776b8-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b0530-2e32-11e9-b5d8-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>101</th>\n      <td>2016-01-04 07:35:00</td>\n      <td>c18776b9-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c18776b9-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b056e-2e32-11e9-96ec-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>102</th>\n      <td>2016-01-04 07:40:00</td>\n      <td>c18776ba-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c18776ba-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b05b3-2e32-11e9-9837-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>103</th>\n      <td>2016-01-04 07:45:00</td>\n      <td>c18776bb-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c18776bb-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b05f8-2e32-11e9-9925-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>104</th>\n      <td>2016-01-04 07:50:00</td>\n      <td>c18776bc-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c18776bc-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b0638-2e32-11e9-a7b9-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>105</th>\n      <td>2016-01-04 07:55:00</td>\n      <td>c18776bd-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c18776bd-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b067d-2e32-11e9-9ff3-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>106</th>\n      <td>2016-01-04 08:00:00</td>\n      <td>c2bbdf08-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c2bbdf08-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b06c2-2e32-11e9-b099-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>107</th>\n      <td>2016-01-04 08:05:00</td>\n      <td>c2bbdf09-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c2bbdf09-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b06fd-2e32-11e9-a0aa-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>108</th>\n      <td>2016-01-04 08:10:00</td>\n      <td>c2bbdf0a-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c2bbdf0a-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b0745-2e32-11e9-858f-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n    <tr>\n      <th>109</th>\n      <td>2016-01-04 08:15:00</td>\n      <td>c2bbdf0b-2bf6-11e9-bcad-06f10d5896c4.jpg</td>\n      <td>1</td>\n      <td>c2bbdf0b-2bf6-11e9-bcad-06f10d5896c4</td>\n      <td>37</td>\n      <td>Idaho Department of Fish and Game</td>\n      <td>6e9b078a-2e32-11e9-9280-dca9047ef277</td>\n      <td>1</td>\n      <td>1024</td>\n      <td>726</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"id":"uj4XUoogZpZ5","colab_type":"text"},"cell_type":"markdown","source":"So, we must make prediction for each picture **\"What category does the animal in the picture belong to?\"** (column name - \"category_id\")"},{"metadata":{"id":"0j9d7vwEZFJi","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"# code from https://www.kaggle.com/gpreda/iwildcam-2019-eda\n\nclasses_wild = {0: 'empty', 1: 'deer', 2: 'moose', 3: 'squirrel', 4: 'rodent', 5: 'small_mammal', \\\n                6: 'elk', 7: 'pronghorn_antelope', 8: 'rabbit', 9: 'bighorn_sheep', 10: 'fox', 11: 'coyote', \\\n                12: 'black_bear', 13: 'raccoon', 14: 'skunk', 15: 'wolf', 16: 'bobcat', 17: 'cat',\\\n                18: 'dog', 19: 'opossum', 20: 'bison', 21: 'mountain_goat', 22: 'mountain_lion'}\n\ntrain_df['classes_wild'] = train_df['category_id'].apply(lambda cw: classes_wild[cw])","execution_count":55,"outputs":[]},{"metadata":{"id":"w9TY14MfZFC-","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"# Category distribution\ntrain_df['classes_wild'].value_counts()","execution_count":56,"outputs":[{"output_type":"execute_result","execution_count":56,"data":{"text/plain":"empty            131457\nopossum           14106\nraccoon            8623\ncoyote             7209\nrabbit             6938\ndeer               6102\nbobcat             5975\ncat                4759\nsquirrel           3398\ndog                3035\nrodent             2210\nskunk              1361\nfox                1093\nmountain_lion        33\nName: classes_wild, dtype: int64"},"metadata":{}}]},{"metadata":{"id":"AROBc-f9ZE_g","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(10,5))\ntrain_df['classes_wild'].value_counts().plot(kind='bar',  title=\"Category distribution\",);\nplt.show()","execution_count":57,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 720x360 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"id":"ybGQcM6EZE8y","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"id":"VV-er1FKZ9On","colab_type":"text"},"cell_type":"markdown","source":"Now drawing images samples for each class"},{"metadata":{"id":"6_Bhw9OlZE50","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"def image_plotting(df, category, data_dir=train_dir):\n    data_dir = data_dir\n    df = train_df[train_df['classes_wild']== category]\n    df = df[['classes_wild', 'file_name']]\n    plt.rcParams['figure.figsize'] = (15, 15)\n    plt.subplots_adjust(wspace=0, hspace=0)\n    i_ = 0\n    \n    \n    for l in range(25):\n        cat, img_name = df.sample(1).values[0]\n        path = os.path.join(train_dir, img_name)\n\n        img = cv2.imread(path)\n        img = cv2.resize(img, (256, 256)) \n\n        plt.subplot(5, 5, i_+1) #.set_title(l)\n        plt.imshow(img); plt.axis('off')\n        i_ += 1\n    print(cat)","execution_count":58,"outputs":[]},{"metadata":{"id":"reP28-5eZE26","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(data_dir=train_dir,category='bobcat',df=train_df)","execution_count":null,"outputs":[]},{"metadata":{"id":"0QG00N2WZE0D","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(train_df, 'cat')","execution_count":null,"outputs":[]},{"metadata":{"id":"zDH038sKZEw1","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(train_df, 'coyote')","execution_count":null,"outputs":[]},{"metadata":{"id":"aJxq1P8cZEt4","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(train_df, 'deer')","execution_count":null,"outputs":[]},{"metadata":{"id":"UlFRFaZWaVhJ","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(train_df, 'dog')","execution_count":null,"outputs":[]},{"metadata":{"id":"6TjgPdxUaVlt","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(train_df, 'empty')","execution_count":null,"outputs":[]},{"metadata":{"id":"kNGW0FlVaVqr","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(train_df, 'fox')","execution_count":null,"outputs":[]},{"metadata":{"id":"hb3Det1baVvB","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(train_df, 'mountain_lion' )","execution_count":null,"outputs":[]},{"metadata":{"id":"WvQFiP3baV0f","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(train_df, 'opossum' )","execution_count":null,"outputs":[]},{"metadata":{"id":"aBk_qAi2afqk","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(train_df, 'rabbit')","execution_count":null,"outputs":[]},{"metadata":{"id":"hb1PbUldafnG","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(train_df, 'raccoon' )","execution_count":null,"outputs":[]},{"metadata":{"id":"8-1A3mzXafjk","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(train_df, 'rodent' )","execution_count":null,"outputs":[]},{"metadata":{"id":"6KR7rhB9afgS","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(train_df, 'skunk' )","execution_count":null,"outputs":[]},{"metadata":{"id":"rd-p7Zg8aV7t","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"image_plotting(train_df, 'squirrel' )","execution_count":null,"outputs":[]},{"metadata":{"id":"NjP0Xjn-aug4","colab_type":"text"},"cell_type":"markdown","source":"From what i saw, i realized that i almost can't see the rodents \nsuch as : rodent, squirrel, and raccoon.\n\nBut neural net is not my eyes - handle"},{"metadata":{"id":"GoIwO8FDapPK","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"id":"X-LZTRRshkI4","colab_type":"code","colab":{},"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"id":"Db1GcKHPhd_S","colab_type":"text"},"cell_type":"markdown","source":"**Creating the  ResNet model from scratch**"},{"metadata":{"colab_type":"code","id":"dr5SKG_K79lZ","trusted":true,"colab":{}},"cell_type":"code","source":"# Libraries\nimport torch\nimport torch.nn as nn\nimport torchvision\nfrom torchvision.transforms import transforms\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import models\n\nfrom sklearn.model_selection import train_test_split","execution_count":null,"outputs":[]},{"metadata":{"id":"Nrtz2J3uktET","colab_type":"text"},"cell_type":"markdown","source":"Data and generator preparation"},{"metadata":{"id":"mBnCYHu3PFqa","colab_type":"code","outputId":"639e44ba-99cb-4d5c-d151-5c332c92947f","trusted":true,"colab":{"base_uri":"https://localhost:8080/","height":204}},"cell_type":"code","source":"train_df = train_df[['file_name','category_id']]\ntrain_df.head()\n","execution_count":null,"outputs":[]},{"metadata":{"colab_type":"code","id":"x7DaIc1B79l1","outputId":"ba7376a8-b8bd-4467-c5e4-c164a4d5a89b","trusted":true,"colab":{"base_uri":"https://localhost:8080/","height":272}},"cell_type":"code","source":"# code lightly modified from https://www.kaggle.com/ateplyuk/iwildcam2019-pytorch-starter\ncategory = train_df['category_id'].unique()\n\nencoder = dict([(v, k) for v, k in zip(category, range(len(category)))])\ndecoder = dict([(v, k) for k, v in encoder.items()])\n\n\nprint( pd.DataFrame({\n    'Before encoding': list(encoder.keys()),\n    'After encoding': list(encoder.values())}).to_string(index=False))\n\n\ndef encoding(labels):\n        return encoder[int(labels)]","execution_count":null,"outputs":[]},{"metadata":{"colab_type":"code","id":"sYkegLX279l5","trusted":true,"outputId":"60d75ccf-0c77-4e11-a40b-db2b8be89bd0","colab":{"base_uri":"https://localhost:8080/","height":272}},"cell_type":"code","source":"train_df['category_id'] = train_df['category_id'].apply(encoding)\ntrain_df['category_id'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"colab_type":"code","id":"ezprooqT79mI","trusted":true,"colab":{}},"cell_type":"code","source":"# Custom data generator\nclass WildDataset(Dataset):\n    def __init__(self, df, img_dir, transforms=None):\n        self.df = df\n        self.img_dir = img_dir\n        self.transforms = transforms\n        \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, idx):\n        img_name = os.path.join(self.img_dir,\n                               self.df.iloc[idx, 0])\n        image = cv2.imread(img_name)\n        label = self.df.iloc[idx, 1]\n        if self.transforms is not None:\n            image = self.transforms(image)\n        return image, label","execution_count":null,"outputs":[]},{"metadata":{"colab_type":"code","id":"d36HHqgN79mN","outputId":"8c72a90d-eceb-4b08-a6de-6c433d0112ca","trusted":true,"colab":{"base_uri":"https://localhost:8080/","height":34}},"cell_type":"code","source":"train, val = train_test_split(train_df, stratify=train_df.category_id, test_size=0.1)\nlen(train), len(val)","execution_count":null,"outputs":[]},{"metadata":{"colab_type":"code","id":"BzOxrX5p79mS","trusted":true,"colab":{}},"cell_type":"code","source":"# Augmentations for data\n\naug = transforms.Compose([transforms.ToPILImage(),                          \n                          transforms.Resize((32, 32)),\n                          transforms.ToTensor(),\n                          transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n                             ])\n\n\n","execution_count":null,"outputs":[]},{"metadata":{"colab_type":"code","id":"L1UjVQae79mg","trusted":true,"colab":{}},"cell_type":"code","source":"# iWildCam dataset\ndataset_train = WildDataset(df=train,\n                            img_dir=train_dir,\n                            transforms=aug)\n\ndataset_valid = WildDataset(df=val,\n                           img_dir=train_dir,\n                           transforms=aug)\n\n# Data loader\ntrain_loader = DataLoader(dataset=dataset_train, batch_size=24, shuffle=True)\nval_loader = DataLoader(dataset_valid, batch_size=24, shuffle=False, num_workers=0)","execution_count":null,"outputs":[]},{"metadata":{"colab_type":"code","id":"O6iEyxXL79mi","outputId":"1cdf5d83-ec84-4339-d4fa-647da848048a","trusted":true,"colab":{"base_uri":"https://localhost:8080/","height":867}},"cell_type":"code","source":"# Aug for data img\ndef show_aug(inp, title=None):\n    \"\"\"Imshow for Tensor.\"\"\"\n    inp = inp.numpy().transpose((1, 2, 0))\n    mean = np.array([0.485, 0.456, 0.406])\n    std = np.array([0.229, 0.224, 0.225])\n    inp = std * inp + mean\n    inp = np.clip(inp, 0, 1)\n    plt.figure(figsize=(20,15))\n    plt.imshow(inp)\n    if title is not None:\n        plt.title(title)\n    plt.pause(0.001)  # pause a bit so that plots are updated\n\n    \n# Get a batch of training data\ninputs, _ = next(iter(train_loader))\n\n# Make a grid from batch\nout = torchvision.utils.make_grid(inputs, 4)  \n\nshow_aug(out)","execution_count":null,"outputs":[]},{"metadata":{"colab_type":"code","id":"B5lNr0jS79mn","outputId":"57d67880-7b06-4fdd-e4b5-b7be8424d467","trusted":true,"colab":{"base_uri":"https://localhost:8080/","height":119}},"cell_type":"code","source":"_","execution_count":null,"outputs":[]},{"metadata":{"colab_type":"code","id":"80u0RsF979mt","outputId":"be7920b4-b581-438e-f4be-5e414e11cd0b","trusted":true,"colab":{"base_uri":"https://localhost:8080/","height":34}},"cell_type":"code","source":"_.shape","execution_count":null,"outputs":[]},{"metadata":{"colab_type":"text","id":"oczVoA248jBY"},"cell_type":"markdown","source":"**Model**"},{"metadata":{"trusted":true,"id":"2sbtW8mDlbdu","colab_type":"code","colab":{}},"cell_type":"code","source":"## Parameters for model\n\n# Hyper parameters\nnum_epochs = 2\nnum_classes = 14\nlearning_rate = 0.02\n\n# Device configuration\ndevice = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"id":"fo50PWATlbdm","colab_type":"code","colab":{}},"cell_type":"code","source":"# 3x3 convolution\ndef conv3x3(in_channels, out_channels, stride=1):\n    return nn.Conv2d(in_channels, out_channels, kernel_size=3, \n                     stride=stride, padding=1, bias=False)\n\n  \n# Residual block\nclass ResidualBlock(nn.Module):\n    def __init__(self, in_channels, out_channels, stride=1, downsample=None):\n        super(ResidualBlock, self).__init__()\n        self.conv1 = conv3x3(in_channels, out_channels, stride)\n        self.bn1 = nn.BatchNorm2d(out_channels)\n        self.relu = nn.ReLU(inplace=True)\n        self.conv2 = conv3x3(out_channels, out_channels)\n        self.bn2 = nn.BatchNorm2d(out_channels)\n        self.downsample = downsample\n        \n    def forward(self, x):\n        residual = x\n        out = self.conv1(x)\n        out = self.bn1(out)\n        out = self.relu(out)\n        out = self.conv2(out)\n        out = self.bn2(out)\n        if self.downsample:\n            residual = self.downsample(x)\n        out += residual\n        out = self.relu(out)\n        return out\n      \n      \n      \n# ResNet\nclass ResNet(nn.Module):\n    def __init__(self, block, layers, num_classes=14):\n        super(ResNet, self).__init__()\n        self.in_channels = 16\n        self.conv = conv3x3(3, 16)\n        self.bn = nn.BatchNorm2d(16)\n        self.relu = nn.LeakyReLU(inplace=True)\n        self.layer1 = self.make_layer(block, 16, layers[0])\n        self.layer2 = self.make_layer(block, 32, layers[1], 2)\n        self.layer3 = self.make_layer(block, 64, layers[2], 2)\n        self.layer4 = self.make_layer(block, 128, layers[3], 2)\n        self.avg_pool = nn.AdaptiveAvgPool2d(4)\n        self.fc = nn.Linear(128, num_classes)\n        \n    def make_layer(self, block, out_channels, blocks, stride=1):\n        downsample = None\n        if (stride != 1) or (self.in_channels != out_channels):\n            downsample = nn.Sequential(\n                conv3x3(self.in_channels, out_channels, stride=stride),\n                nn.BatchNorm2d(out_channels))\n        layers = []\n        layers.append(block(self.in_channels, out_channels, stride, downsample))\n        self.in_channels = out_channels\n        for i in range(1, blocks):\n            layers.append(block(out_channels, out_channels))\n        return nn.Sequential(*layers)\n    \n    def forward(self, x):\n        out = self.conv(x)\n        out = self.bn(out)\n        out = self.relu(out)\n        out = self.layer1(out)\n        out = self.layer2(out)\n        out = self.layer3(out)\n        out = self.layer4(out)\n        out = self.avg_pool(out)\n        out = out.view(out.size(0), -1)\n        out = self.fc(out)\n        return out\n      \n      \n      \ndef create_resnet_model(output_dim: int = 1) -> nn.Module:\n    model = ResNet(ResidualBlock, [2, 2, 2, 2])\n    in_features = model.fc.in_features\n    model.avg_pool = nn.AdaptiveAvgPool2d(1)\n    model.fc = nn.Linear(in_features, output_dim)\n    model = model.to(device)\n    return model\n\nmodel = create_resnet_model(output_dim=num_classes)\n\n# Loss and optimizer\ncriterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adamax(model.parameters(), lr=learning_rate)","execution_count":null,"outputs":[]},{"metadata":{"id":"vcamnjt9QBpn","colab_type":"code","outputId":"fb307e6c-7c6f-44be-cccf-c14e896cc4f2","trusted":true,"colab":{"base_uri":"https://localhost:8080/","height":1173}},"cell_type":"code","source":"\n# Train the model\ntotal_step = len(train_loader)\nfor epoch in range(num_epochs):\n    for i, (images, labels) in enumerate(train_loader):\n        images = images.to(device)\n        labels = labels.to(device)\n        \n        # Forward pass\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        \n        # Backward and optimize\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        if (i+1) % 100 == 0:\n            print (\"Epoch [{}/{}], Step [{}/{}] Loss: {:.4f}\"\n                   .format(epoch+1, num_epochs, i+1, total_step, loss.item()))\n","execution_count":null,"outputs":[]},{"metadata":{"colab_type":"code","id":"HTEv8SEC79nB","trusted":true,"outputId":"1f138425-8df4-4b13-873d-40aad2691020","colab":{}},"cell_type":"code","source":"# Test the model\nmodel.eval()\nwith torch.no_grad():\n    correct = 0\n    total = 0\n    for images, labels in val_loader:\n        images = images.to(device)\n        labels = labels.to(device)\n        outputs = model(images)\n        _, predicted = torch.max(outputs.data, 1)\n        total += labels.size(0)\n        correct += (predicted == labels).sum().item()\n\n    print('Accuracy of the model on the 19630 test images: {} %'.format(100 * correct / total))\n","execution_count":null,"outputs":[]},{"metadata":{"id":"5173-SkGbyC-","colab_type":"text"},"cell_type":"markdown","source":"**Prediction and submission**"},{"metadata":{"colab_type":"code","id":"Du-h6DrD79nF","trusted":true,"outputId":"17d939fb-7d5b-4495-fe66-a65f66a5a46c","colab":{}},"cell_type":"code","source":"sub = pd.read_csv('../input/sample_submission.csv')\nsub['Id'] = sub['Id'] + '.jpg'\nsub.head()","execution_count":null,"outputs":[]},{"metadata":{"id":"6kS2xRStpyPf","colab_type":"code","trusted":true,"colab":{}},"cell_type":"code","source":"# Dataset for test img\ndataset_valid = WildDataset(df=sub,\n                           img_dir=test_dir,\n                           transforms=aug)\n\n# Data loader\ntest_loader = DataLoader(dataset_valid, batch_size=24, shuffle=False)","execution_count":null,"outputs":[]},{"metadata":{"id":"xSoxMuiqgLDw","colab_type":"code","trusted":true,"colab":{}},"cell_type":"code","source":"# Test the model\nmodel.eval()\npreds = []\n#with torch.no_grad():\nfor images, labels in test_loader:\n    images = images.to(device)\n    labels = labels.to(device)\n    outputs = model(images)\n    _, predicted = torch.max(outputs.data, 1)\n    predicted\n    for i in predicted.detach().cpu().numpy():\n        preds.append(i)\n","execution_count":null,"outputs":[]},{"metadata":{"id":"xG_O1F4x1lH-","colab_type":"code","trusted":true,"outputId":"4c7a8435-f94e-4b36-cfea-adc54b746aba","colab":{}},"cell_type":"code","source":"sub['Predicted'] =  preds\nsub['Id'] = sub['Id'].str[:-4]\nsub.head()\n","execution_count":null,"outputs":[]},{"metadata":{"id":"Az-jTs9g61aZ","colab_type":"code","trusted":true,"colab":{}},"cell_type":"code","source":"\ndef decoding(labels):\n        return decoder[int(labels)]","execution_count":null,"outputs":[]},{"metadata":{"id":"DWhcLq6tTddb","colab_type":"code","trusted":true,"colab":{}},"cell_type":"code","source":"sub['Predicted'] = sub['Predicted'].apply(decoding)\nsub.head()\n\nsub.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"id":"g-aXsxoYTdX7","colab_type":"code","trusted":true,"outputId":"2bf9a923-b4aa-4d01-ccef-a93c7821a0aa","colab":{}},"cell_type":"code","source":"sub['Predicted'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"id":"pyKUIjAyTdRh","colab_type":"code","trusted":true,"colab":{}},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"id":"a4bFlMFYTdLx","colab_type":"code","trusted":true,"colab":{}},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"id":"9-B4CXjGpbAE","colab_type":"code","trusted":true,"colab":{}},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"id":"xn20A3ri1R-e","colab_type":"code","trusted":true,"colab":{}},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"colab":{"name":"EDA and ResNet [PyTorch].ipynb","version":"0.3.2","provenance":[]},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.4"},"kernelspec":{"name":"python3","display_name":"Python 3"},"accelerator":"GPU"},"nbformat":4,"nbformat_minor":1}