misc_utils.py
4.93 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import numpy as np
import tensorflow as tf
import random
class AverageMeter(object):
def __init__(self):
self.reset()
def reset(self):
self.val = 0
self.average = 0
self.sum = 0
self.count = 0
def update(self, val, n=1):
self.val = val
self.sum += val * n
self.count += n
self.average = self.sum / float(self.count)
def parse_anchors(anchor_path):
anchors = np.reshape(np.asarray(open(anchor_path, 'r').read().split(','), np.float32), [-1, 2])
return anchors
def read_class_names(class_name_path):
names = {}
with open(class_name_path, 'r') as data:
for ID, name in enumerate(data):
names[ID] = name.strip('\n')
return names
def shuffle_and_overwrite(file_name):
content = open(file_name, 'r').readlines()
random.shuffle(content)
with open(file_name, 'w') as f:
for line in content:
f.write(line)
def update_dict(ori_dict, new_dict):
if not ori_dict:
return new_dict
for key in ori_dict:
ori_dict[key] += new_dict[key]
return ori_dict
def list_add(ori_list, new_list):
for i in range(len(ori_list)):
ori_list[i] += new_list[i]
return ori_list
def load_weights(var_list, weights_file):
with open(weights_file, "rb") as fp:
np.fromfile(fp, dtype=np.int32, count=5)
weights = np.fromfile(fp, dtype=np.float32)
ptr = 0
i = 0
assign_ops = []
while i < len(var_list) - 1:
var1 = var_list[i]
var2 = var_list[i + 1]
if 'Conv' in var1.name.split('/')[-2]:
if 'BatchNorm' in var2.name.split('/')[-2]:
gamma, beta, mean, var = var_list[i + 1:i + 5]
batch_norm_vars = [beta, gamma, mean, var]
for var in batch_norm_vars:
shape = var.shape.as_list()
num_params = np.prod(shape)
var_weights = weights[ptr:ptr + num_params].reshape(shape)
ptr += num_params
assign_ops.append(tf.assign(var, var_weights, validate_shape=True))
i += 4
elif 'Conv' in var2.name.split('/')[-2]:
# load biases
bias = var2
bias_shape = bias.shape.as_list()
bias_params = np.prod(bias_shape)
bias_weights = weights[ptr:ptr +
bias_params].reshape(bias_shape)
ptr += bias_params
assign_ops.append(tf.assign(bias, bias_weights, validate_shape=True))
i += 1
shape = var1.shape.as_list()
num_params = np.prod(shape)
var_weights = weights[ptr:ptr + num_params].reshape(
(shape[3], shape[2], shape[0], shape[1]))
var_weights = np.transpose(var_weights, (2, 3, 1, 0))
ptr += num_params
assign_ops.append(
tf.assign(var1, var_weights, validate_shape=True))
i += 1
return assign_ops
def config_learning_rate(args, global_step):
if args.lr_type == 'exponential':
lr_tmp = tf.train.exponential_decay(args.learning_rate_init, global_step, args.lr_decay_freq,
args.lr_decay_factor, staircase=True, name='exponential_learning_rate')
return tf.maximum(lr_tmp, args.lr_lower_bound)
elif args.lr_type == 'cosine_decay':
train_steps = (args.total_epoches - float(args.use_warm_up) * args.warm_up_epoch) * args.train_batch_num
return args.lr_lower_bound + 0.5 * (args.learning_rate_init - args.lr_lower_bound) * \
(1 + tf.cos(global_step / train_steps * np.pi))
elif args.lr_type == 'cosine_decay_restart':
return tf.train.cosine_decay_restarts(args.learning_rate_init, global_step,
args.lr_decay_freq, t_mul=2.0, m_mul=1.0,
name='cosine_decay_learning_rate_restart')
elif args.lr_type == 'fixed':
return tf.convert_to_tensor(args.learning_rate_init, name='fixed_learning_rate')
elif args.lr_type == 'piecewise':
return tf.train.piecewise_constant(global_step, boundaries=args.pw_boundaries, values=args.pw_values,
name='piecewise_learning_rate')
else:
raise ValueError('Unsupported learning rate type!')
def config_optimizer(optimizer_name, learning_rate, decay=0.9, momentum=0.9):
if optimizer_name == 'momentum':
return tf.train.MomentumOptimizer(learning_rate, momentum=momentum)
elif optimizer_name == 'rmsprop':
return tf.train.RMSPropOptimizer(learning_rate, decay=decay, momentum=momentum)
elif optimizer_name == 'adam':
return tf.train.AdamOptimizer(learning_rate)
elif optimizer_name == 'sgd':
return tf.train.GradientDescentOptimizer(learning_rate)
else:
raise ValueError('Unsupported optimizer type!')