Использование потери локализации IoU в OD API

#tensorflow #object-detection-api

#tensorflow #object-detection-api

Вопрос:

В нескольких статьях, например, в этой, утверждается, что потеря локализации IoU обеспечивает лучшую производительность, чем стандартная плавная потеря L1.

При попытке использовать потерю локализации IoU, т.е. используйте эту строку в файле конфигурации:

 ...
localization_loss {
   weighted_iou {
   }
}
...
  

Я всегда получаю found NaN in loss ошибку. Если я добавлю небольшую согласующую (например, 1e-7 ) к знаменателю в matched_iou вот так:

 def matched_iou(boxlist1, boxlist2, scope=None):
  """Compute intersection-over-union between corresponding boxes in boxlists.

  Args:
    boxlist1: BoxList holding N boxes
    boxlist2: BoxList holding N boxes
    scope: name scope.

  Returns:
    a tensor with shape [N] representing pairwise iou scores.
  """
  with tf.name_scope(scope, 'MatchedIOU'):
    intersections = matched_intersection(boxlist1, boxlist2)
    areas1 = area(boxlist1)
    areas2 = area(boxlist2)
    unions = areas1   areas2 - intersections
    eps = 1e-7  # <- this is the small constant
    return tf.where(
        tf.equal(intersections, 0.0),
        tf.zeros_like(intersections), tf.truediv(intersections, unions   eps))
  

NaN Ошибка устранена, но значения потерь действительно высоки, и обучение не сходится.

Я буду признателен за любой намек на это явление.

Комментарии:

1. Как вам удалось запустить функцию потери IOU в первую очередь? Когда я меняю его на использование потери IOU, возникает ошибка о формах

2. Неважно, вам просто нужно изменить размер пакета..

3. Привет @BrunoLerner, пожалуйста, поделитесь своими обновлениями по этой проблеме, у меня все еще нет решения для этого

4. Вчера я провел эксперимент, и он также не сошелся.. Итак, я думал ночью, вы изменили его на [batch_size, -1] или [batch_size, num_anchors, -1] ? У меня есть 2 гипотезы.. Во-первых, я неправильно изменил его, а во-вторых, прогноз выполняется не так, как ожидает конструктор boxlist (то есть [y_max, x_max, y_min, x_min])

5. Какую модель вы используете? Я использую SSD, и я сильно подозреваю, что проблема заключается в том, что тензор прогнозирования принимает форму, которая сильно отличается от того, что ожидает matched_iou. Потому что, если вы читали некоторые статьи, обозначения ограничивающей рамки относятся к привязочным блокам

Ответ №1:

После небольшого изучения кода кажется, что prediction_tensor и target_tensor приходят к функции потери IOU как к закодированному тензору (относительно блоков привязки). Таким образом, функция IoU работает с бессмысленными значениями, потому что она ожидает их в декодированном формате.. Существует функция для ее декодирования с помощью BoxCoder которая зависит от используемого вами кодера, но проблема в том, что для ее использования вам нужен anchor boxes .. и получить поля привязки внутри функции потери не так просто.