Расширение тензорного потока ведет себя иначе, чем морфологическое расширение - PullRequest
0 голосов
/ 14 февраля 2019

Как показывает следующий фрагмент кода, функция tenorflow tf.nn.dilation2D не работает как обычный оператор расширения .

import tensorflow as tf
tf.InteractiveSession()
A = [[0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 1, 0, 0],
     [0, 0, 0, 1, 1, 1, 0],
     [0, 0, 0, 0, 1, 0, 0],
     [0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0]]
kernel = tf.ones((3,3,1))
input4D = tf.cast(tf.expand_dims(tf.expand_dims(A, -1), 0), tf.float32)
output4D = tf.nn.dilation2d(input4D, filter=kernel, strides=(1,1,1,1), rates=(1,1,1,1), padding="SAME")
print(tf.cast(output4D[0,:,:,0], tf.int32).eval())

Возвращает следующий тензор:

array([[1, 1, 1, 2, 2, 2, 1],
       [1, 1, 2, 2, 2, 2, 2],
       [1, 1, 2, 2, 2, 2, 2],
       [1, 1, 2, 2, 2, 2, 2],
       [1, 1, 1, 2, 2, 2, 1],
       [1, 1, 1, 1, 1, 1, 1]], dtype=int32)

Я не понимаю ни почему ведет себя так, ни как Iследует использовать tf.nn.dilation2d, чтобы получить ожидаемый результат:

array([[0, 0, 0, 1, 1, 1, 0],
       [0, 0, 1, 1, 1, 1, 1],
       [0, 0, 1, 1, 1, 1, 1],
       [0, 0, 1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 0],
       [0, 0, 0, 0, 0, 0, 0]], dtype=int32)

Может ли кто-нибудь просветить краткую документацию по тензорному потоку и дать объяснение того, что делает функция tf.nn.dilation2D?

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

может сделать это так:

def dilation2d(self, img4D):
    '''
    '''
    with tf.variable_scope('dilation2d'):
        kernel = tf.ones((3, 3, img4D.get_shape()[3])) 
        output4D = tf.nn.dilation2d(img4D, filter=kernel, strides=(1,1,1,1), rates=(1,1,1,1), padding="SAME")
        output4D = output4D - tf.ones_like(output4D)

        return output4D
0 голосов
/ 17 марта 2019

Как упомянуто на связанной странице документации,

Вычисляет расширение оттенков серого 4-D входного и 3-D тензоров фильтра.

и

В деталях морфологическая двумерная дилатация в оттенках серого представляет собой корреляцию максимальной суммы [...]

Это означает, что значения ядра добавляются к значениям изображения прикаждая позиция, затем максимальное значение принимается в качестве выходного значения.

Сравните это с корреляцией, заменив умножение на сложение, а интеграл (или сумму) на максимальное:

свертка: г ( т ) = ∫ f (?) ч (?- т ) д?

расширение: г ( т ) = макс ? { f (?) + ч (?- t )}

Или в дискретном мире:

свертка: g [ n ] = ∑ k f [ k ] h [ k - n ]

расширение: г [ n ] = макс k { f [ k ] + h [ k - n ]}


Расширение с помощью бинарного структурирующего элемента (ядро, что в вопросе называется «обычным расширением») использует структурирующий элемент (ядро), который содержит только 1 и 0.Они обозначают «включено» и «исключено».То есть единицы определяют область структурирующего элемента.

Чтобы воссоздать то же поведение с расширением значения серого, установите для «включенных» пикселей значение 0, а для «исключенных» пикселей - минус бесконечность.

Например, квадратный структурирующий элемент 3x3, используемый в вопросе, должен быть матрицей нулей 3x3.

...