Skip to content

Commit af3d4b9

Browse files
authored
Add: All Training and Deployment files
1 parent c76a2bd commit af3d4b9

18 files changed

+20096
-0
lines changed

EDA-v1.ipynb

+9,554
Large diffs are not rendered by default.

EDA-v2.ipynb

+423
Large diffs are not rendered by default.

Output.avi

24.1 MB
Binary file not shown.

Output.ipynb

+1,865
Large diffs are not rendered by default.

Output_v2.ipynb

+1,447
Large diffs are not rendered by default.

Post Model Analysis.ipynb

+3,406
Large diffs are not rendered by default.

Training/config.py

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import torch
2+
3+
SEED = 0
4+
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
5+
LEARNING_RATE = 0.0001
6+
EPOCHS = 100
7+
BATCH_SIZE = 2
8+
WEIGHT_DECAY = 3e-4
9+
DATAPATH = 'F:/Deep Learning/appliedai_submissions/Self Case Study/Case Study 2/processed_data_v2.csv'

Training/dataset.py

+128
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
import torch
2+
import torch.nn as nn
3+
import pandas as pd
4+
import numpy as np
5+
from glob import glob
6+
from sklearn.model_selection import train_test_split
7+
from PIL import Image
8+
from torch.utils.data import DataLoader
9+
from torchvision.utils import save_image
10+
from tqdm import tqdm
11+
import albumentations as A
12+
from albumentations.pytorch import ToTensorV2
13+
import tqdm
14+
import config
15+
import cv2
16+
import os
17+
import sys
18+
19+
class ImageFolder(nn.Module):
20+
def __init__(self, df, isTrain = True, transform = None):
21+
super(ImageFolder, self).__init__()
22+
self.df = df
23+
"""
24+
if transform is None:
25+
if isTrain == True:
26+
self.transform = A.Compose([
27+
A.HorizontalFlip(),
28+
A.VerticalFlip(),
29+
A.Normalize(),
30+
ToTensorV2()
31+
])
32+
else:
33+
self.test_transform = A.Compose([
34+
A.Normalize(),
35+
ToTensorV2()
36+
])
37+
"""
38+
if transform is None:
39+
self.transform = A.Compose([
40+
#A.Resize(width=200, height = 50),
41+
#ToTensor --> Normalize(mean, std)
42+
A.Normalize(
43+
mean=[0.485, 0.456, 0.406],
44+
std=[0.229, 0.224, 0.225],
45+
max_pixel_value = 255,
46+
),
47+
ToTensorV2()
48+
])
49+
50+
def __len__(self):
51+
return len(self.df)
52+
53+
def __getitem__(self, index):
54+
55+
img_path, table_mask_path, col_mask_path = self.df.iloc[index, 0], self.df.iloc[index, 1], self.df.iloc[index, 2]
56+
image = np.array(Image.open("../" + img_path))
57+
table_image = torch.FloatTensor(np.array(Image.open("../" + table_mask_path))/255.0).reshape(1,1024,1024)
58+
column_image = torch.FloatTensor(np.array(Image.open("../" + col_mask_path))/255.0).reshape(1,1024,1024)
59+
60+
"""
61+
augmentations = self.transform(
62+
image = image,
63+
table_mask = table_image,
64+
column_mask = column_image
65+
)
66+
image = augmentations['image']
67+
table_image = augmentations['table_mask']
68+
column_image = augmentations['column_mask']
69+
"""
70+
71+
image = self.transform(image = image)['image']
72+
73+
74+
return {"image":image,"table_image":table_image, "column_image": column_image}
75+
76+
77+
def get_mean_std(train_data, transform):
78+
dataset = ImageFolder(train_data , transform)
79+
80+
train_loader = DataLoader(dataset, batch_size=128)
81+
82+
mean = 0.
83+
std = 0.
84+
for img_dict in tqdm.tqdm(train_loader):
85+
batch_samples = img_dict["image"].size(0) # batch size (the last batch can have smaller size!)
86+
images = img_dict["image"].view(batch_samples, img_dict["image"].size(1), -1)
87+
mean += images.mean(2).sum(0)
88+
std += images.std(2).sum(0)
89+
90+
mean /= len(train_loader.dataset)
91+
std /= len(train_loader.dataset)
92+
93+
print(mean) #tensor([0.4194, 0.4042, 0.3910])
94+
print(std) #tensor([0.2439, 0.2402, 0.2372])
95+
96+
#get_mean_std()
97+
98+
if __name__ == '__main__':
99+
100+
101+
df = pd.read_csv('F:/Deep Learning/appliedai_submissions/Self Case Study/Case Study 2/processed_data_v2.csv')
102+
dataset = ImageFolder(df[df['hasTable']==1])
103+
104+
img_num = 0
105+
for img_dict in dataset:
106+
save_image(img_dict["image"], f'image_{img_num}.png')
107+
save_image(img_dict["table_image"], f'table_image_{img_num}.png')
108+
save_image(img_dict["column_image"], f'column_image_{img_num}.png')
109+
110+
img_num += 1
111+
112+
if img_num == 6:
113+
break
114+
115+
"""
116+
df = pd.read_csv(config.DATAPATH)
117+
train_data, test_data = train_test_split(df, test_size = 0.2, random_state = config.SEED, stratify = df.hasTable)
118+
119+
dataset = ImageFolder(train_data , isTrain= True)
120+
121+
train_loader = DataLoader(dataset, batch_size=2)
122+
for img_dict in train_loader:
123+
124+
image, table_image, column_image = img_dict['image'], img_dict['table_image'], img_dict['column_image']
125+
print(image.shape)
126+
print(table_image.shape)
127+
print(column_image.shape)
128+
"""

Training/encoder.py

+159
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
import torch
2+
import torch.nn as nn
3+
import torchvision
4+
from efficientnet_pytorch import EfficientNet
5+
6+
class VGG19(nn.Module):
7+
def __init__(self, pretrained = True, requires_grad = True):
8+
super(VGG19, self).__init__()
9+
_vgg = torchvision.models.vgg19(pretrained=pretrained).features
10+
self.vgg_pool3 = torch.nn.Sequential()
11+
self.vgg_pool4 = torch.nn.Sequential()
12+
self.vgg_pool5 = torch.nn.Sequential()
13+
14+
for x in range(19):
15+
self.vgg_pool3.add_module(str(x), _vgg[x])
16+
for x in range(19, 28):
17+
self.vgg_pool4.add_module(str(x), _vgg[x])
18+
for x in range(28, 37):
19+
self.vgg_pool5.add_module(str(x), _vgg[x])
20+
21+
22+
if not requires_grad:
23+
for param in self.parameters():
24+
param.requires_grad = False
25+
26+
def forward(self, x):
27+
pool_3_out = self.vgg_pool3(x) #torch.Size([1, 256, 128, 128])
28+
pool_4_out = self.vgg_pool4(pool_3_out) #torch.Size([1, 512, 64, 64])
29+
pool_5_out = self.vgg_pool5(pool_4_out) #torch.Size([1, 512, 32, 32])
30+
return (pool_3_out, pool_4_out, pool_5_out)
31+
32+
class ResNet(nn.Module):
33+
def __init__(self, pretrained = True, requires_grad = True):
34+
super(ResNet, self).__init__()
35+
resnet18 = torchvision.models.resnet34(pretrained=True)
36+
37+
self.layer_1 = nn.Sequential(
38+
resnet18.conv1,
39+
resnet18.bn1,
40+
resnet18.relu,
41+
resnet18.maxpool,
42+
resnet18.layer1
43+
)
44+
self.layer_2 = resnet18.layer2
45+
self.layer_3 = resnet18.layer3
46+
self.layer_4 = resnet18.layer4
47+
48+
if not requires_grad:
49+
for param in self.parameters():
50+
param.requires_grad = False
51+
52+
def forward(self, x):
53+
54+
out_1 = self.layer_2(self.layer_1(x)) #torch.Size([1, 128, 128, 128])
55+
out_2 = self.layer_3(out_1) #torch.Size([1, 256, 64, 64])
56+
out_3 = self.layer_4(out_2) #torch.Size([1, 512, 32, 32])
57+
return out_1, out_2, out_3
58+
59+
60+
class DenseNet(nn.Module):
61+
def __init__(self, pretrained = True, requires_grad = True):
62+
super(DenseNet, self).__init__()
63+
denseNet = torchvision.models.densenet121(pretrained=True).features
64+
self.densenet_out_1 = torch.nn.Sequential()
65+
self.densenet_out_2 = torch.nn.Sequential()
66+
self.densenet_out_3 = torch.nn.Sequential()
67+
68+
for x in range(8):
69+
self.densenet_out_1.add_module(str(x), denseNet[x])
70+
for x in range(8,10):
71+
self.densenet_out_2.add_module(str(x), denseNet[x])
72+
73+
self.densenet_out_3.add_module(str(10), denseNet[10])
74+
75+
if not requires_grad:
76+
for param in self.parameters():
77+
param.requires_grad = False
78+
79+
def forward(self, x):
80+
81+
out_1 = self.densenet_out_1(x) #torch.Size([1, 256, 64, 64])
82+
out_2 = self.densenet_out_2(out_1) #torch.Size([1, 512, 32, 32])
83+
out_3 = self.densenet_out_3(out_2) #torch.Size([1, 1024, 32, 32])
84+
return out_1, out_2, out_3
85+
86+
class efficientNet_B0(nn.Module):
87+
def __init__(self, pretrained = True, requires_grad = True):
88+
super(efficientNet_B0, self).__init__()
89+
eNet = EfficientNet.from_pretrained('efficientnet-b0')
90+
91+
self.eNet_out_1 = torch.nn.Sequential()
92+
self.eNet_out_2 = torch.nn.Sequential()
93+
self.eNet_out_3 = torch.nn.Sequential()
94+
95+
blocks = eNet._blocks
96+
97+
self.eNet_out_1.add_module('_conv_stem', eNet._conv_stem)
98+
self.eNet_out_1.add_module('_bn0', eNet._bn0)
99+
100+
for x in range(14):
101+
self.eNet_out_1.add_module(str(x), blocks[x])
102+
103+
self.eNet_out_2.add_module(str(14), blocks[14])
104+
self.eNet_out_3.add_module(str(15), blocks[15])
105+
106+
107+
def forward(self, x):
108+
out_1 = self.eNet_out_1(x) #torch.Size([1, 192, 32, 32])
109+
out_2 = self.eNet_out_2(out_1) #torch.Size([1, 192, 32, 32])
110+
out_3 = self.eNet_out_3(out_2) #torch.Size([1, 320, 32, 32])
111+
return out_1, out_2, out_3
112+
113+
class efficientNet(nn.Module):
114+
def __init__(self, model_type = 'efficientnet-b0', pretrained = True, requires_grad = True):
115+
super(efficientNet, self).__init__()
116+
eNet = EfficientNet.from_pretrained(model_type)
117+
118+
self.eNet_out_1 = torch.nn.Sequential()
119+
self.eNet_out_2 = torch.nn.Sequential()
120+
self.eNet_out_3 = torch.nn.Sequential()
121+
122+
blocks = eNet._blocks
123+
124+
self.eNet_out_1.add_module('_conv_stem', eNet._conv_stem)
125+
self.eNet_out_1.add_module('_bn0', eNet._bn0)
126+
127+
for x in range(len(blocks)-3):
128+
self.eNet_out_1.add_module(str(x), blocks[x])
129+
130+
self.eNet_out_2.add_module(str(len(blocks)-2), blocks[len(blocks)-2])
131+
self.eNet_out_3.add_module(str(len(blocks)-1), blocks[len(blocks)-1])
132+
133+
134+
def forward(self, x):
135+
out_1 = self.eNet_out_1(x) #torch.Size([1, 192, 32, 32])
136+
out_2 = self.eNet_out_2(out_1) #torch.Size([1, 192, 32, 32])
137+
out_3 = self.eNet_out_3(out_2) #torch.Size([1, 320, 32, 32])
138+
139+
140+
"""
141+
shapes of b1
142+
torch.Size([1, 192, 32, 32])
143+
torch.Size([1, 320, 32, 32])
144+
torch.Size([1, 320, 32, 32])
145+
146+
shapes of b2
147+
torch.Size([1, 208, 32, 32])
148+
torch.Size([1, 352, 32, 32])
149+
torch.Size([1, 352, 32, 32])
150+
"""
151+
152+
return out_1, out_2, out_3
153+
154+
155+
156+
if __name__ == '__main__':
157+
model = efficientNet()
158+
x = torch.randn(1,3,1024,1024)
159+
model(x)

Training/loss.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import torch
2+
import torch.nn as nn
3+
4+
class TableNetLoss(nn.Module):
5+
def __init__(self):
6+
super(TableNetLoss, self).__init__()
7+
self.bce = nn.BCEWithLogitsLoss()
8+
9+
def forward(self, table_pred, table_gt, col_pred = None, col_gt = None, ):
10+
11+
table_loss = self.bce(table_pred, table_gt)
12+
column_loss = self.bce(col_pred, col_gt)
13+
return table_loss, column_loss

0 commit comments

Comments
 (0)