-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathsegmenter_coco20.py
93 lines (79 loc) · 2.69 KB
/
segmenter_coco20.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import os
import torch
import argparse
from utils import Logger
from data import get_dataset, RandomHorizontalFlip, JitterRandomCrop
import torchvision.transforms as tf
from models import construct_pascal_segmenter
from experiments import SemsegExperiment
import warnings
warnings.filterwarnings("ignore")
parser = argparse.ArgumentParser('Semseg training')
parser.add_argument('--dataroot',
help='dataroot',
type=str,
default='.')
parser.add_argument('--dataset',
help='dataset',
type=str,
default='coco20')
parser.add_argument('--batch_size',
help='number of images in a mini-batch.',
type=int,
default=16)
parser.add_argument('--num_classes',
help='num classes',
type=int,
default=20)
parser.add_argument('--epochs',
help='maximum number of training epoches.',
type=int,
default=80)
parser.add_argument('--lr',
help='initial learning rate.',
type=float,
default=1e-3)
parser.add_argument('--exp_name',
help='experiment name',
type=str,
required=True)
args = parser.parse_args()
def main(args):
device = 'cuda' if torch.cuda.is_available() else 'cpu'
exp_dir = f"./logs/{args.dataset}/{args.exp_name}"
if os.path.exists(exp_dir):
raise Exception('Directory exists!')
os.makedirs(exp_dir, exist_ok=True)
CROP_SIZE = 512
logger = Logger(f"{exp_dir}/log.txt")
logger.log(str(args))
train_transforms = {
'image': [
tf.ToTensor(),
],
'target': [
],
'joint': [
JitterRandomCrop(size=CROP_SIZE, scale=(0.5, 2), ignore_id=args.num_classes, input_mean=(123, 116, 103)),
RandomHorizontalFlip()
]
}
val_transforms = {
'image': [
tf.ToTensor(),
],
'target': [
],
'joint': None
}
loaders = get_dataset(args.dataset)(args.dataroot, args.batch_size, train_transforms, val_transforms)
model = construct_pascal_segmenter(num_classes=args.num_classes, size='base').cuda()
optimizer = torch.optim.SGD(model.parameters(), lr=args.lr, weight_decay=0.)
if device == 'cuda':
torch.backends.cudnn.benchmark = True
experiment = SemsegExperiment(
model, optimizer, loaders, args.epochs, logger, device, f"{exp_dir}/checkpoint.pt", args)
experiment.start()
logger.close()
if __name__ == '__main__':
main(args)