Я пытаюсь обучить семантико-сегментарную сеть ( E-Net ), в частности, для качественной сегментации человека.Для этого я собрал набор данных " Supervisely Person " и извлек маски масок аннотаций, используя предоставленный API.Этот набор данных содержит маски высокого качества, поэтому я думаю, что он обеспечит лучшие результаты по сравнению, например, с набором данных COCO.
Наблюдение - Пример ниже: исходное изображение - основополагающая правда.
Сначала я хочу дать некоторые подробности о модели.Сама сеть (Enet_arch
) возвращает логиты из последнего слоя свертки и вероятности, которые получены в результате tf.nn.sigmoid(logits,name='logits_to_softmax')
.
Я использую сигмоидальную кросс-энтропию на основании истинности и возвращенные логиты, импульс и экспоненциальнуюраспад на скорость обучения.Экземпляр модели и обучающий конвейер выглядят следующим образом.
self.global_step = tf.Variable(0, name='global_step', trainable=False)
self.momentum = tf.Variable(0.9, trainable=False)
# introducing weight decay
#with slim.arg_scope(ENet_arg_scope(weight_decay=2e-4)):
self.logits, self.probabilities = Enet_arch(inputs=self.input_data, num_classes=self.num_classes, batch_size=self.batch_size) # returns logits (2d), probabilities (2d)
#self.gt is int32 with values 0 or 1 (coming from read_tfrecords.Read_TFRecords annotation images + placeholder defined to int)
self.gt = self.input_masks
# self.probabilities is output of sigmoid, pixel-wise between probablities [0, 1].
# self.predictions is filtered probabilities > 0.5 = 1 else 0
self.predictions = tf.to_int32(self.probabilities > 0.5)
# capture segmentation accuracy
self.accuracy, self.accuracy_update = tf.metrics.accuracy(labels=self.gt, predictions=self.predictions)
# losses and updates
# calculate cross entropy loss on logits
loss = tf.losses.sigmoid_cross_entropy(multi_class_labels=self.gt, logits=self.logits)
# add the loss to total loss and average (?)
self.total_loss = tf.losses.get_total_loss()
# decay_steps = depend on the number of epochs
self.learning_rate = tf.train.exponential_decay(self.starter_learning_rate, global_step=self.global_step, decay_steps=123893, decay_rate=0.96, staircase=True)
#Now we can define the optimizer
#optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate, epsilon=1e-8)
optimizer = tf.train.MomentumOptimizer(self.learning_rate, self.momentum)
#Create the train_op.
self.train_op = optimizer.minimize(loss, global_step=self.global_step)
Сначала я попытался переместить модель на одном изображении, чтобы определить глубину деталей, которые эта сеть может захватить.Чтобы повысить качество вывода, я изменил размеры всех изображений до 1080p перед подачей их в сеть.В этом испытании я обучил сеть 10 000 итераций, и общая ошибка достигла ~ 30% (взято из tf.losses.get_total_loss()
).
Результаты во время тренировки на одном изображении довольно хороши, как вы можете видеть ниже.
Наблюдение - Пример ниже: (1) Потеря (2)вход (до изменения размера) |основную правду (до изменения размера) |1080p из
Позже я попытался тренироваться в целомнабор данных, но потеря обучения вызывает много колебаний.Это означает, что в некоторых изображениях сеть работает хорошо, а в некоторых - нет.В результате после 743360 итераций (то есть 160 эпох, поскольку тренировочный набор содержит 4646 изображений), я прекратил тренировку, поскольку, очевидно, что-то не так с выбором гиперпараметров, который я сделал.
Контролировать -Пример ниже: (1) Потеря (2) скорость обучения (3) вход (до изменения размера) |основную правду (до изменения размера) |1080p out
С другой стороны, в некоторых случаях изображений обучающих наборов сеть выдает справедливые (хотя и не очень хорошие) результаты, как показано ниже.
Supervisely - пример ниже: ввод (до изменения размера)) |основную правду (до изменения размера) |1080p out
Почему у меня есть эти различия в этих учебных примерах?Есть ли какие-либо очевидные изменения, которые я должен сделать в модели или гиперпараметрах?Возможно ли, что эта модель просто не подходит для этого варианта использования (например, низкая емкость сети)?
Заранее спасибо.