Skip to content
This repository was archived by the owner on Sep 10, 2024. It is now read-only.

Commit dc56718

Browse files
authored
Add files via upload
1 parent 50e1183 commit dc56718

1 file changed

Lines changed: 367 additions & 0 deletions

File tree

Lines changed: 367 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,367 @@
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

Comments
 (0)