1+ # -*- coding: utf-8 -*-
2+ """densenet.ipynb
3+
4+ Automatically generated by Colaboratory.
5+
6+ Original file is located at
7+ https://colab.research.google.com/drive/1h-6a3BwghwqJWtkBngoX09Ts-13TpPpk
8+ """
9+
10+ from google .colab import drive
11+ drive .mount ('/content/drive' )
12+
13+ """##Load images"""
14+
15+ import skimage
16+ import pandas
17+ from __future__ import print_function , division
18+ import os
19+ import torch
20+ import pandas as pd
21+ from skimage import io , transform
22+ import numpy as np
23+ import matplotlib .pyplot as plt
24+ from torch .utils .data import Dataset , DataLoader
25+ from torchvision import transforms , utils
26+ from PIL import Image
27+ import pandas as pd
28+ # Ignore warnings
29+ import warnings
30+ warnings .filterwarnings ("ignore" )
31+
32+ """## Pre-trained RestNet18"""
33+
34+ import torch .nn as nn
35+ import torch .nn .functional as F
36+
37+ pip install cnn_finetune
38+
39+ import argparse
40+
41+ import torch
42+ import torchvision
43+ import torchvision .transforms as transforms
44+ from torch .autograd import Variable
45+ import torch .nn as nn
46+ import torch .optim as optim
47+
48+ from cnn_finetune import make_model
49+
50+ parser = argparse .ArgumentParser (description = 'cnn_finetune' )
51+ parser .add_argument ('-f' )
52+ parser .add_argument ('--batch-size' , type = int , default = 16 , metavar = 'N' ,
53+ help = 'input batch size for training (default: 4)' )
54+ parser .add_argument ('--epochs' , type = int , default = 30 , metavar = 'N' ,
55+ help = 'number of epochs to train (default: 30)' )
56+ parser .add_argument ('--lr' , type = float , default = 0.0001 , metavar = 'LR' ,
57+ help = 'learning rate (default: 0.01)' )
58+ parser .add_argument ('--momentum' , type = float , default = 0.9 , metavar = 'M' ,
59+ help = 'SGD momentum (default: 0.9)' )
60+ parser .add_argument ('--no-cuda' , action = 'store_true' , default = False ,
61+ help = 'disables CUDA training' )
62+ parser .add_argument ('--model-name' , type = str , default = 'densenet161' , metavar = 'M' ,
63+ help = 'model name (default: resnet50)' )
64+
65+ args = parser .parse_args ()
66+ use_cuda = not args .no_cuda and torch .cuda .is_available ()
67+ device = torch .device ("cuda:0" if torch .cuda .is_available () else "cpu" )
68+
69+ class FloodTinyDataset (Dataset ):
70+
71+ def __init__ (self , df , transform = None ):
72+
73+ self .flood_tiny_data = df
74+ ''' Change self.root_dir to load images '''
75+ self .root_dir = f"/content/drive/My Drive/ladi/Images/flood_tiny/"
76+ self .transform = transform
77+
78+ def __len__ (self ):
79+ return len (self .flood_tiny_data )
80+
81+ def __getitem__ (self , idx ):
82+ if torch .is_tensor (idx ):
83+ idx = idx .tolist ()
84+
85+ pos = self .flood_tiny_data .iloc [idx , 9 ].rfind ('/' )+ 1
86+ img_name = os .path .join (self .root_dir , self .flood_tiny_data .iloc [idx , 9 ][pos :])
87+
88+ image = Image .fromarray (io .imread (img_name ))
89+ uuid = self .flood_tiny_data .iloc [idx , 1 ]
90+ timestamp = self .flood_tiny_data .iloc [idx , 2 ]
91+ gps_lat = self .flood_tiny_data .iloc [idx , 3 ]
92+ gps_lon = self .flood_tiny_data .iloc [idx , 4 ]
93+ gps_alt = self .flood_tiny_data .iloc [idx , 5 ]
94+ file_size = self .flood_tiny_data .iloc [idx , 6 ]
95+ width = self .flood_tiny_data .iloc [idx , 7 ]
96+ height = self .flood_tiny_data .iloc [idx , 8 ]
97+ ### Labels should be numerical, not bool for training ###
98+ if self .flood_tiny_data .iloc [idx , - 1 ] == True :
99+ label = 1
100+ else :
101+ label = 0
102+
103+ if self .transform :
104+ image = self .transform (image )
105+
106+ sample = {'image' : image , 'image_name' : img_name , 'label' : 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 }
107+
108+ return sample
109+
110+ csv_file = '/content/drive/My Drive/flood_tiny_metadata.csv'
111+ label_csv = '/content/drive/My Drive/flood_tiny_label.csv'
112+
113+ metadata = pd .read_csv (csv_file )
114+ label = pd .read_csv (label_csv )
115+ all_data = pd .merge (metadata , label , on = "s3_path" )
116+
117+ class_zero = all_data [all_data ['label' ]== False ].sample (n = 1000 )
118+ class_one = all_data [all_data ['label' ]== True ].sample (n = 1000 )
119+ flood_tiny_data = pd .concat ([class_zero , class_one ]).sample (frac = 1 ).reset_index (drop = True )
120+
121+ flood_tiny_dataset = FloodTinyDataset (df = flood_tiny_data )
122+
123+ transformed_dataset = FloodTinyDataset (df = flood_tiny_data , transform = transforms .Compose ([transforms .Resize (256 ),
124+ transforms .RandomRotation (10 ),
125+ transforms .RandomCrop (250 ),
126+ transforms .RandomHorizontalFlip (),
127+ transforms .ToTensor ()]))
128+
129+ from torch .utils .data .sampler import SubsetRandomSampler
130+ from torch .utils .data import DataLoader
131+
132+ batch_size = args .batch_size
133+ test_split_ratio = .2
134+ shuffle_dataset = True
135+ random_seed = 42
136+ # Creating data indices for training and validation splits:
137+ dataset_size = len (transformed_dataset )
138+ indices = list (range (dataset_size ))
139+ split = int (np .floor (test_split_ratio * dataset_size ))
140+ if shuffle_dataset :
141+ np .random .seed (random_seed )
142+ np .random .shuffle (indices )
143+ train_indices , test_indices = indices [split :], indices [:split ]
144+
145+ # Creating data samplers and loaders:
146+ train_sampler = SubsetRandomSampler (train_indices )
147+ test_sampler = SubsetRandomSampler (test_indices )
148+
149+ train_loader = torch .utils .data .DataLoader (transformed_dataset , batch_size = batch_size ,
150+ sampler = train_sampler )
151+ test_loader = torch .utils .data .DataLoader (transformed_dataset , batch_size = batch_size ,
152+ sampler = test_sampler )
153+
154+ def train (model , epoch , optimizer , train_loader , criterion = nn .CrossEntropyLoss ()):
155+ running_loss = 0
156+ total_size = 0
157+ model .train ()
158+
159+ for i , data in enumerate (train_loader , 0 ):
160+
161+ # get the inputs; data is a list of [inputs, labels]
162+ inputs = data ['image' ]
163+ labels = data ['label' ]
164+ inputs = inputs .to (device )
165+ labels = labels .to (device )
166+ # casting int to long for loss calculation#
167+ labels = labels .long ()
168+
169+ # zero the parameter gradients
170+ optimizer .zero_grad ()
171+
172+ # forward + backward + optimize
173+ outputs = model (inputs )
174+ loss = criterion (outputs , labels )
175+
176+ running_loss += loss .item ()
177+ total_size += inputs .size (0 )
178+ loss .backward ()
179+ optimizer .step ()
180+
181+ if i % 20 == 19 :
182+ print ('[%d, %3d] loss: %.3f' %
183+ (epoch + 1 , i + 1 , running_loss / 20 ))
184+ running_loss = 0.0
185+
186+ print ('Finished Training' )
187+
188+ def test (model , test_loader , criterion = nn .CrossEntropyLoss ()):
189+ model .eval ()
190+ correct = 0
191+ total = 0
192+ with torch .no_grad ():
193+ for data in test_loader :
194+ inputs = data ['image' ]
195+ labels = data ['label' ]
196+ inputs = inputs .to (device )
197+ labels = labels .to (device )
198+
199+ outputs = model (inputs )
200+
201+ _ , predicted = torch .max (outputs .data , 1 )
202+ #test_loss += criterion(output, target).item()
203+ total += labels .size (0 )
204+ correct += (predicted == labels ).sum ().item ()
205+
206+ #correct += pred.eq(target.data.view_as(pred)).long().cpu().sum().item()
207+
208+ accuracy = 100 * correct / total
209+ print ('Accuracy of the network on the 400 test images: %d %%' % (
210+ accuracy ))
211+
212+ state = {'epoch' : epoch , 'state_dict' : model .state_dict (),
213+ 'optimizer_state_dict' : optimizer .state_dict ()}
214+
215+ model_name = 'densenet161_%d_%d.pth' % (epoch , accuracy )
216+ PATH = f"/content/drive/My Drive/{ model_name } "
217+ torch .save (state , PATH )
218+
219+ model_name = args .model_name
220+
221+ # classes = ('0','1')
222+ model = make_model (
223+ model_name ,
224+ pretrained = True ,
225+ num_classes = 2 ,
226+ input_size = None ,
227+ )
228+ model = model .to (device )
229+ optimizer = optim .SGD (model .parameters (), lr = args .lr , momentum = args .momentum )
230+
231+ # model_name = 'resnet50_2_58.pth'
232+ # PATH = f"/content/drive/My Drive/{model_name}"
233+ # checkpoint = torch.load(PATH)
234+ # start_epoch = checkpoint['epoch']
235+ # model.load_state_dict(checkpoint['state_dict'])
236+ # optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
237+
238+ #gamma: Multiplicative factor of learning rate decay.
239+ #Step_size: Period of learning rate decay.
240+ scheduler = optim .lr_scheduler .StepLR (optimizer , step_size = 10 , gamma = 0.1 )
241+ for epoch in range (0 , args .epochs ):
242+ scheduler .step (epoch )
243+ train (model , epoch , optimizer , train_loader )
244+ test (model , test_loader )
245+
246+ import torch
247+ import torchvision
248+ import torchvision .transforms as transforms
249+ import matplotlib .pyplot as plt
250+ import numpy as np
251+ import torch .optim as optim
252+ PATH = '/content/drive/My Drive/densenet161_20_75.pth'
253+
254+ def imshow (img ):
255+ #img = img / 2 + 0.5 # unnormalize
256+ npimg = img .numpy ()
257+ plt .figure (figsize = [16 , 16 ])
258+ plt .imshow (np .transpose (npimg , (1 , 2 , 0 )))
259+ plt .show ()
260+
261+ dataiter = iter (test_loader )
262+ #images, labels = dataiter.next()
263+ images = dataiter .next ()['image' ]
264+ labels = dataiter .next ()['label' ]
265+
266+ # print images
267+ classes = (0 , 1 )
268+ imshow (torchvision .utils .make_grid (images ))
269+ print ('GroundTruth: ' , ' ' .join ('%5s' % labels [j ] for j in range (16 )))
270+
271+ checkpoint = torch .load (PATH )
272+
273+ model_name = args .model_name
274+
275+ # classes = ('0','1')
276+ model = make_model (
277+ model_name ,
278+ pretrained = True ,
279+ num_classes = 2 ,
280+ input_size = None ,
281+ )
282+
283+ model .load_state_dict (checkpoint ['state_dict' ])
284+
285+ optimizer = optim .SGD (model .parameters (), lr = args .lr , momentum = args .momentum )
286+ optimizer .load_state_dict (checkpoint ['optimizer_state_dict' ])
287+
288+ outputs = model (images )
289+ _ , predicted = torch .max (outputs , 1 )
290+
291+ print ('Predicted: ' , ' ' .join ('%5s' % predicted [j ]
292+ for j in range (16 )))
293+
294+ model_name = args .model_name
295+
296+ # classes = ('0','1')
297+ model = make_model (
298+ model_name ,
299+ pretrained = True ,
300+ num_classes = 2 ,
301+ input_size = None ,
302+ )
303+
304+ model .load_state_dict (checkpoint ['state_dict' ])
305+
306+ optimizer = optim .SGD (model .parameters (), lr = args .lr , momentum = args .momentum )
307+ optimizer .load_state_dict (checkpoint ['optimizer_state_dict' ])
308+
309+ class_correct = list (0. for i in range (2 ))
310+ class_total = list (0. for i in range (2 ))
311+ with torch .no_grad ():
312+ for data in test_loader :
313+ images = data ['image' ]
314+ labels = data ['label' ]
315+ outputs = model (images )
316+ _ , predicted = torch .max (outputs , 1 )
317+ c = (predicted == labels ).squeeze ()
318+ for i in range (16 ):
319+ label = labels [i ]
320+ class_correct [label ] += c [i ].item ()
321+ class_total [label ] += 1
322+
323+
324+ for i in range (2 ):
325+ print ('Accuracy of %5s : %2d %%' % (
326+ i , 100 * class_correct [i ] / class_total [i ]))
0 commit comments