-
Notifications
You must be signed in to change notification settings - Fork 88
/
Copy pathdarknet19_train.py
90 lines (79 loc) · 2.6 KB
/
darknet19_train.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
import time
import cv2
import numpy as np
import chainer
import glob
import os
from chainer import serializers, optimizers, Variable, cuda
import chainer.functions as F
from darknet19 import *
from lib.image_generator import *
# hyper parameters
input_height, input_width = (224, 224)
item_path = "./items"
background_path = "./backgrounds"
label_file = "./data/label.txt"
backup_path = "backup"
batch_size = 32
max_batches = 3000
learning_rate = 0.001
lr_decay_power = 4
momentum = 0.9
weight_decay = 0.0005
# load image generator
print("loading image generator...")
generator = ImageGenerator(item_path, background_path)
with open(label_file, "r") as f:
labels = f.read().strip().split("\n")
# load model
print("loading model...")
model = Darknet19Predictor(Darknet19())
backup_file = "%s/backup.model" % (backup_path)
if os.path.isfile(backup_file):
serializers.load_hdf5(backup_file, model) # load saved model
model.predictor.train = True
cuda.get_device(0).use()
model.to_gpu() # for gpu
optimizer = optimizers.MomentumSGD(lr=learning_rate, momentum=momentum)
optimizer.use_cleargrads()
optimizer.setup(model)
optimizer.add_hook(chainer.optimizer.WeightDecay(weight_decay))
# start to train
print("start training")
for batch in range(max_batches):
# generate sample
x, t = generator.generate_samples(
n_samples=batch_size,
n_items=1,
crop_width=input_width,
crop_height=input_height,
min_item_scale=0.3,
max_item_scale=1.3,
rand_angle=25,
minimum_crop=0.8,
delta_hue=0.01,
delta_sat_scale=0.5,
delta_val_scale=0.5
)
x = Variable(x)
one_hot_t = []
for i in range(len(t)):
one_hot_t.append(t[i][0]["one_hot_label"])
x.to_gpu()
one_hot_t = np.array(one_hot_t, dtype=np.float32)
one_hot_t = Variable(one_hot_t)
one_hot_t.to_gpu()
y, loss, accuracy = model(x, one_hot_t)
print("[batch %d (%d images)] learning rate: %f, loss: %f, accuracy: %f" % (batch+1, (batch+1) * batch_size, optimizer.lr, loss.data, accuracy.data))
optimizer.zero_grads()
loss.backward()
optimizer.lr = learning_rate * (1 - batch / max_batches) ** lr_decay_power # Polynomial decay learning rate
optimizer.update()
# save model
if (batch+1) % 1000 == 0:
model_file = "%s/%s.model" % (backup_path, batch+1)
print("saving model to %s" % (model_file))
serializers.save_hdf5(model_file, model)
serializers.save_hdf5(backup_file, model)
print("saving model to %s/darknet19_final.model" % (backup_path))
serializers.save_hdf5("%s/darknet19_final.model" % (backup_path), model)