Можно ли вычислить перекрытия между прямоугольниками в Tensorflow? - PullRequest
0 голосов
/ 03 июня 2018

новичок TensorFlow здесь.

Я разрабатываю нейронную сеть, которая выводит координаты (x, y) двух противоположных углов прямоугольников N.

Я думал о реализации функции затрат, которая учитывает перекрытия междупредсказанные прямоугольники, поскольку они вовсе не предназначены для перекрытия, но простая функция стоимости с MSE приводит к некоторому перекрытию.вычислить градиент этих вычислений, чтобы минимизировать функцию стоимости.

Обратите внимание, что я хочу проверить перекрытие между прямоугольником 1 и прямоугольниками от 2 до N, а также между прямоугольником 2 и прямоугольниками от 3 до N и т. Д.

Возможно ли это, или мне лучшепросто обработать данные и отделить перекрывающиеся прямоугольники?

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

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Вы можете сделать это, используя тот факт, что минимальный и максимальный операторы поддерживают вещание.

Измените этот вывод coords, чтобы иметь форму (B, N, 2, 2), где B - размер пакета, а N количество прямоугольников.Площадь перекрытия может быть вычислена как

c1 = coords[:, None]
c2 = coords[:, :, None]
areas = tf.reduce_prod(tf.maximum(
  tf.minimum(c1[..., 1], c2[..., 1]) - tf.maximum(c1[..., 0], c2[..., 0]), 0.), axis=-1)

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

cost = tf.reduce_sum(areas) - tf.reduce_sum(tf.trace(areas))

Правда, вы делаете некоторые дополнительные вычисления - диагональные элементы, а также перекрытия вычисляются дважды - но я считаю, что это должно быть незначительным по сравнению с остальнымивашей сети и, вероятно, быстрее, чем то, что основано на цикле.

Эта стоимость, конечно, автоматически дифференцируется по тензорному потоку.

0 голосов
/ 03 июня 2018

Вы можете использовать модифицированную версию критериев пересечения через объединение (IoU).Он в основном используется при обнаружении изображений для определения положения объектов на изображениях и позволяет отбрасывать блоки, в которых сеть наиболее неуверенна.

В вашем случае вы хотите максимизировать объединение (вы достигаете максимума, когда два прямоугольника не пересекаются) и минимизировать пересечение (теоретически, вы хотите, чтобы оно было 0).В результате IoU должен быть минимизирован, и в лучшем случае он равен 0.

Для реализации этого в TF вы можете сделать:

cost = 0
for first in range(num_rectangles):
    for second in range(first, num_rectangles)
        cost = cost + compute_IoU(rect[first], rect[second])

cost = cost / num_rectangles

Существует несколько реализацийIou.Один si предоставляется TF непосредственно .

...