1+ # -*- coding: utf-8 -*-
2+ """regular_cnn.ipynb
3+
4+ Automatically generated by Colaboratory.
5+
6+ Original file is located at
7+ https://colab.research.google.com/drive/10GQJ2jILwNGCsfajRbkWcsCHv7csbqf9
8+ """
9+
10+ from __future__ import print_function , division
11+ import pandas as pd
12+ import numpy as np
13+ import skimage
14+ import pandas
15+ import os
16+ import torch
17+ import pandas as pd
18+ from skimage import io , transform
19+ import numpy as np
20+ import matplotlib .pyplot as plt
21+ from torch .utils .data import Dataset , DataLoader
22+ from torchvision import transforms , utils
23+ from torch .utils .data .sampler import SubsetRandomSampler
24+ from PIL import Image
25+ import pandas as pd
26+ # Ignore warnings
27+ import warnings
28+ warnings .filterwarnings ("ignore" )
29+
30+ class FloodTinyDataset (Dataset ):
31+
32+ def __init__ (self , csv_file , label_csv , transform = None ):
33+
34+ self .flood_tiny_metadata = pd .read_csv (csv_file )
35+ self .flood_tiny_label = pd .read_csv (label_csv )
36+ self .flood_tiny_data = pd .merge (self .flood_tiny_metadata ,
37+ self .flood_tiny_label ,
38+ on = "s3_path" )
39+ ''' Change self.root_dir to load images '''
40+ self .root_dir = f"/content/drive/My Drive/ladi/Images/flood_tiny/"
41+ self .transform = transform
42+
43+ def __len__ (self ):
44+ return len (self .flood_tiny_metadata )
45+
46+ def __getitem__ (self , idx ):
47+ if torch .is_tensor (idx ):
48+ idx = idx .tolist ()
49+ pos = self .flood_tiny_metadata .iloc [idx , 9 ].rfind ('/' )+ 1
50+ img_name = os .path .join (self .root_dir , self .flood_tiny_metadata .iloc [idx , 9 ][pos :])
51+ #img_name = self.flood_tiny_metadata.iloc[idx, 10]
52+
53+ image = Image .fromarray (io .imread (img_name ))
54+ uuid = self .flood_tiny_data .iloc [idx , 1 ]
55+ timestamp = self .flood_tiny_data .iloc [idx , 2 ]
56+ gps_lat = self .flood_tiny_data .iloc [idx , 3 ]
57+ gps_lon = self .flood_tiny_data .iloc [idx , 4 ]
58+ gps_alt = self .flood_tiny_data .iloc [idx , 5 ]
59+ file_size = self .flood_tiny_data .iloc [idx , 6 ]
60+ width = self .flood_tiny_data .iloc [idx , 7 ]
61+ height = self .flood_tiny_data .iloc [idx , 8 ]
62+ ### Labels should be numerical, not bool for training ###
63+ if self .flood_tiny_data .iloc [idx , - 1 ] == True :
64+ label = 1
65+ else :
66+ label = 0
67+
68+ if self .transform :
69+ image = self .transform (image )
70+
71+ sample = {'image' : image , 'image_name' : img_name , 'damage:flood/water' : label , 'uuid' : uuid , 'timestamp' : timestamp , 'gps_lat' : gps_lat , 'gps_lon' : gps_lon , 'gps_alt' : gps_alt , 'orig_file_size' : file_size , 'orig_width' : width , 'orig_height' : height }
72+
73+ return sample
74+
75+ def show_image (image ):
76+ plt .imshow (image )
77+ # pause a bit so that plots are updated
78+ plt .pause (0.01 )
79+
80+ csv_file = './flood_tiny_metadata.csv'
81+ label_csv = './flood_tiny_label.csv'
82+
83+ flood_tiny_dataset = FloodTinyDataset (csv_file = csv_file ,label_csv = label_csv )
84+
85+ transformed_dataset = FloodTinyDataset (csv_file = csv_file ,
86+ label_csv = label_csv , transform = transforms .Compose ([transforms .Resize (2048 ),
87+ transforms .RandomRotation (10 ),
88+ transforms .RandomCrop (2000 ),
89+ transforms .RandomHorizontalFlip (),
90+ transforms .ToTensor ()]))
91+
92+ def show_images_batch (sample_batched ):
93+ images_batch = sample_batched ['image' ]
94+ batch_size = len (images_batch )
95+ im_size = images_batch .size (2 )
96+ grid_border_size = 2
97+
98+ grid = utils .make_grid (images_batch )
99+ plt .imshow (grid .numpy ().transpose ((1 , 2 , 0 )))
100+
101+ for i in range (batch_size ):
102+ plt .title ('Batch from dataloader' )
103+
104+ #### Here, we split the Dataset into training and testing subsets ####
105+
106+ batch_size = 16
107+ test_split_ratio = .2
108+ shuffle_dataset = True
109+ random_seed = 42
110+
111+ # Creating data indices for training and validation splits:
112+ dataset_size = len (transformed_dataset )
113+ indices = list (range (dataset_size ))
114+ split = int (np .floor (test_split_ratio * dataset_size ))
115+ if shuffle_dataset :
116+ np .random .seed (random_seed )
117+ np .random .shuffle (indices )
118+ train_indices , test_indices = indices [split :], indices [:split ]
119+
120+ # Creating PT data samplers and loaders:
121+ train_sampler = SubsetRandomSampler (train_indices )
122+ test_sampler = SubsetRandomSampler (test_indices )
123+
124+ train_loader = torch .utils .data .DataLoader (transformed_dataset , batch_size = batch_size ,
125+ sampler = train_sampler )
126+ test_loader = torch .utils .data .DataLoader (transformed_dataset , batch_size = batch_size ,
127+ sampler = test_sampler )
128+
129+ import torch .nn as nn
130+ import torch .nn .functional as F
131+
132+
133+ class Net (nn .Module ):
134+ def __init__ (self ):
135+ super (Net , self ).__init__ ()
136+ self .conv1 = nn .Conv2d (3 , 6 , 5 )
137+ self .pool = nn .MaxPool2d (2 , 2 )
138+ self .conv2 = nn .Conv2d (6 , 16 , 5 )
139+ self .fc1 = nn .Linear (16 * 497 * 497 , 120 )
140+ self .fc2 = nn .Linear (120 , 84 )
141+ self .fc3 = nn .Linear (84 , 10 )
142+ ### Binary classification output layer size should be 2
143+ self .fc4 = nn .Linear (10 , 2 )
144+
145+ def forward (self , x ):
146+ x = self .pool (F .relu (self .conv1 (x )))
147+ x = self .pool (F .relu (self .conv2 (x )))
148+ x = x .view (x .size (0 ), - 1 )
149+ x = F .relu (self .fc1 (x ))
150+ x = F .relu (self .fc2 (x ))
151+ x = F .relu (self .fc3 (x ))
152+ x = self .fc4 (x )
153+ return x
154+
155+
156+ net = Net ()
157+
158+ ## Use this if images are stored in google Drive
159+ from google .colab import drive
160+ drive .mount ('/content/drive' )
161+
162+ !ls / content / drive / My \ Drive /
163+
164+ import torch
165+ import torchvision
166+ import torchvision .transforms as transforms
167+ import matplotlib .pyplot as plt
168+ import torch .optim as optim
169+ import numpy as np
170+ net = Net ()
171+
172+ criterion = nn .CrossEntropyLoss ()
173+ optimizer = optim .SGD (net .parameters (), lr = 0.001 , momentum = 0.9 )
174+
175+
176+ for epoch in range (30 ): # loop over the dataset multiple times
177+
178+ running_loss = 0.0
179+ for i , data in enumerate (train_loader , 0 ):
180+
181+ # get the inputs; data is a list of [inputs, labels]
182+ inputs = data ['image' ]
183+ labels = data ['damage:flood/water' ]
184+ # casting int to long for loss calculation#
185+ labels = labels .long ()
186+
187+ # zero the parameter gradients
188+ optimizer .zero_grad ()
189+
190+ # forward + backward + optimize
191+ outputs = net (inputs )
192+ loss = criterion (outputs , labels )
193+ loss .backward ()
194+ optimizer .step ()
195+
196+ # print statistics
197+ running_loss += loss .item ()
198+ #### 1600 images for training in total, batch size is 16
199+ #### So, it should be 100 batches
200+ if i % 5 == 4 : # print every 10 mini-batches
201+ print ('[%d, %3d] loss: %.3f' %
202+ (epoch + 1 , i + 1 , running_loss / 5 ))
203+ running_loss = 0.0
204+ state = {'epoch' : epoch , 'state_dict' : net .state_dict (),
205+ 'optimizer_state_dict' : optimizer .state_dict (), 'loss' : loss }
206+ model_name = 'flood_tiny.pth'
207+ PATH = f"/content/drive/My Drive/{ model_name } "
208+ torch .save (state , PATH )
209+ print ('Finished Training' )
210+
211+ state = {'epoch' : epoch , 'state_dict' : net .state_dict (),
212+ 'optimizer_state_dict' : optimizer .state_dict (), 'loss' : loss }
213+
214+ model_name = 'flood_tiny.pth'
215+ '''Change PATH to where you want to put the trained model'''
216+ PATH = f"/content/drive/My Drive/{ model_name } "
217+ torch .save (state , PATH )
218+
219+ import torch
220+ import torchvision
221+ import torchvision .transforms as transforms
222+ import matplotlib .pyplot as plt
223+ import numpy as np
224+ import torch .optim as optim
225+
226+ net = Net ()
227+ '''This is how to continue to train the model '''
228+ model_name = 'flood_tiny.pth'
229+ PATH = f"/content/drive/My Drive/{ model_name } "
230+ checkpoint = torch .load (PATH )
231+ start_epoch = checkpoint ['epoch' ]
232+ net .load_state_dict (checkpoint ['state_dict' ])
233+ criterion = nn .CrossEntropyLoss ()
234+ optimizer = optim .SGD (net .parameters (), lr = 0.001 , momentum = 0.9 )
235+ optimizer .load_state_dict (checkpoint ['optimizer_state_dict' ])
236+
237+ for epoch in range (start_epoch + 1 , start_epoch + 4 ): # loop over the dataset multiple times
238+
239+ running_loss = 0.0
240+ for i , data in enumerate (train_loader , 0 ):
241+
242+ # get the inputs; data is a list of [inputs, labels]
243+ inputs = data ['image' ]
244+ labels = data ['damage:flood/water' ]
245+ # casting int to long for loss calculation#
246+ labels = labels .long ()
247+
248+ # zero the parameter gradients
249+ optimizer .zero_grad ()
250+
251+ # forward + backward + optimize
252+ outputs = net (inputs )
253+ loss = criterion (outputs , labels )
254+ loss .backward ()
255+ optimizer .step ()
256+
257+ # print statistics
258+ running_loss += loss .item ()
259+ #### 1600 images for training in total, batch size is 16
260+ #### So, it should be 100 batches
261+ if i % 5 == 4 : # print every 10 mini-batches
262+ print ('[%d, %3d] loss: %.3f' %
263+ (epoch + 1 , i + 1 , running_loss / 5 ))
264+ running_loss = 0.0
265+ state = {'epoch' : epoch , 'state_dict' : net .state_dict (),
266+ 'optimizer_state_dict' : optimizer .state_dict (), 'loss' : loss }
267+ model_name = 'flood_tiny.pth'
268+ PATH = f"/content/drive/My Drive/{ model_name } "
269+ torch .save (state , PATH )
270+ print ('Finished Training' )
271+
272+ state = {'epoch' : epoch , 'state_dict' : net .state_dict (),
273+ 'optimizer_state_dict' : optimizer .state_dict (), 'loss' : loss }
274+
275+ model_name = 'flood_tiny.pth'
276+ PATH = f"/content/drive/My Drive/{ model_name } "
277+ torch .save (state , PATH )
278+
279+ import torch
280+ import torchvision
281+ import torchvision .transforms as transforms
282+ import matplotlib .pyplot as plt
283+ import numpy as np
284+ import torch .optim as optim
285+ PATH = '/content/drive/My Drive/flood_tiny.pth'
286+ def imshow (img ):
287+ #img = img / 2 + 0.5 # unnormalize
288+ npimg = img .numpy ()
289+ plt .figure (figsize = [16 , 16 ])
290+ plt .imshow (np .transpose (npimg , (1 , 2 , 0 )))
291+ plt .show ()
292+
293+ dataiter = iter (test_loader )
294+ #images, labels = dataiter.next()
295+ images = dataiter .next ()['image' ]
296+ labels = dataiter .next ()['damage:flood/water' ]
297+
298+ # print images
299+ classes = (0 , 1 )
300+ imshow (torchvision .utils .make_grid (images ))
301+ print ('GroundTruth: ' , ' ' .join ('%5s' % labels [j ] for j in range (16 )))
302+
303+ net = Net ()
304+
305+ checkpoint = torch .load (PATH )
306+
307+ net .load_state_dict (checkpoint ['state_dict' ])
308+
309+ optimizer = optim .SGD (net .parameters (), lr = 0.001 , momentum = 0.9 )
310+ optimizer .load_state_dict (checkpoint ['optimizer_state_dict' ])
311+
312+ outputs = net (images )
313+ _ , predicted = torch .max (outputs , 1 )
314+
315+ print ('Predicted: ' , ' ' .join ('%5s' % predicted [j ]
316+ for j in range (16 )))
317+
318+ import torch
319+ import torchvision
320+ import torchvision .transforms as transforms
321+ import matplotlib .pyplot as plt
322+ import numpy as np
323+ import torch .optim as optim
324+ net = Net ()
325+ model_name = 'flood_tiny.pth'
326+ PATH = f"/content/drive/My Drive/{ model_name } "
327+ checkpoint = torch .load (PATH )
328+ start_epoch = checkpoint ['epoch' ]
329+ net .load_state_dict (checkpoint ['state_dict' ])
330+ correct = 0
331+ total = 0
332+ with torch .no_grad ():
333+ for data in test_loader :
334+ images = data ['image' ]
335+ labels = data ['damage:flood/water' ]
336+ outputs = net (images )
337+ _ , predicted = torch .max (outputs .data , 1 )
338+ total += labels .size (0 )
339+ correct += (predicted == labels ).sum ().item ()
340+ #
341+ print ('Accuracy of the network on the 1600 test images: %d %%' % (
342+ 100 * correct / total ))
343+
344+ net = Net ()
345+ model_name = 'flood_tiny.pth'
346+ PATH = f"/content/drive/My Drive/{ model_name } "
347+ checkpoint = torch .load (PATH )
348+ start_epoch = checkpoint ['epoch' ]
349+ net .load_state_dict (checkpoint ['state_dict' ])
350+ class_correct = list (0. for i in range (2 ))
351+ class_total = list (0. for i in range (2 ))
352+ with torch .no_grad ():
353+ for data in test_loader :
354+ images = data ['image' ]
355+ labels = data ['damage:flood/water' ]
356+ outputs = net (images )
357+ _ , predicted = torch .max (outputs , 1 )
358+ c = (predicted == labels ).squeeze ()
359+ for i in range (16 ):
360+ label = labels [i ]
361+ class_correct [label ] += c [i ].item ()
362+ class_total [label ] += 1
363+
364+
365+ for i in range (2 ):
366+ print ('Accuracy of %5s : %2d %%' % (
367+ i , 100 * class_correct [i ] / class_total [i ]))
0 commit comments