Учебная электронная сеть по сегментации человека - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь обучить семантико-сегментарную сеть ( E-Net ), в частности, для качественной сегментации человека.Для этого я собрал набор данных " Supervisely Person " и извлек маски масок аннотаций, используя предоставленный API.Этот набор данных содержит маски высокого качества, поэтому я думаю, что он обеспечит лучшие результаты по сравнению, например, с набором данных COCO.

Наблюдение - Пример ниже: исходное изображение - основополагающая правда.

enter image description here

Сначала я хочу дать некоторые подробности о модели.Сама сеть (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 из

enter image description here

enter image description here

Позже я попытался тренироваться в целомнабор данных, но потеря обучения вызывает много колебаний.Это означает, что в некоторых изображениях сеть работает хорошо, а в некоторых - нет.В результате после 743360 итераций (то есть 160 эпох, поскольку тренировочный набор содержит 4646 изображений), я прекратил тренировку, поскольку, очевидно, что-то не так с выбором гиперпараметров, который я сделал.

Контролировать -Пример ниже: (1) Потеря (2) скорость обучения (3) вход (до изменения размера) |основную правду (до изменения размера) |1080p out

enter image description here

enter image description here

enter image description here

С другой стороны, в некоторых случаях изображений обучающих наборов сеть выдает справедливые (хотя и не очень хорошие) результаты, как показано ниже.

Supervisely - пример ниже: ввод (до изменения размера)) |основную правду (до изменения размера) |1080p out

enter image description here

Почему у меня есть эти различия в этих учебных примерах?Есть ли какие-либо очевидные изменения, которые я должен сделать в модели или гиперпараметрах?Возможно ли, что эта модель просто не подходит для этого варианта использования (например, низкая емкость сети)?

Заранее спасибо.

1 Ответ

0 голосов
/ 20 декабря 2018

Оказывается, проблема здесь действительно в архитектуре электронной сети.Я изменил архитектуру с DeepLabV3 и увидел большую разницу в поведении потерь и производительности .. даже в небольшом разрешении!

enter image description here

...