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

Commit 9a058bc

Browse files
authored
Add files via upload
1 parent 489042c commit 9a058bc

3 files changed

Lines changed: 896 additions & 0 deletions

File tree

Tutorials/Model Script/densenet.py

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

Comments
 (0)