Tensorflow: как я могу свернуть изображение с пользовательским постоянным фильтром - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть 3 фильтра 5x5, которые я хочу свернуть на входе изображения в градациях серого (форма [nx, ny, 1]). У меня есть заранее заданные жестко закодированные значения, которыми должен быть каждый из этих фильтров 5x5, и я не хочу, чтобы они были «изучены» моей моделью, а просто являлись постоянной работой.

Как мне этого добиться?

Я изучал использование tf.nn.conv2d (), и он говорит, что его фильтры должны иметь форму [высота, ширина, ввод, вывод], поэтому я попытался использовать tf.constant () для создания тензора для моего фильтры формы [5,5,1,3] (таким образом, 3 фильтра формы 5x5 применены к входу с 1 каналом), но результаты tf.constant () выглядят неправильно. Получилось так:

 [[[[ -5   7  -12]]

   [[  21  0   2]]

   [[ -6   9  -6]]

   [[  2  -2   8]]

   [[-6   4  -1]]]


  [[[  2  -6   8]]

   [[ -6   2  -1]]

   [[  2  -2   2]]

   [[ -1   1   5]]

   [[  4   3   2]]]

 ...etc

, который не похож на форму 3 фильтров 5х5.

Если я использую tf.constant () с формой [1,3,5,5], я получаю это:

[[[[ -5   7  -12   21  0]
   [  2  -6   9  -6   2]
   [ -2   8 -6   4  -1]
   [  2  -6   8  -6   2]
   [ -1   2  -2   2  -1]]

  [[  1   5   4   3   2]
   [  4   0  -2   0   4]
   [  2  -1   7  -3   5]
   [  -1   0  -1   0  -1]
   [  5   0   9   0   5]]

   ...etc

что выглядит как фильтры 5x5, но это неправильная форма, принятая tf.nn.conv2d ()

поэтому меня смущает это несоответствие, и я не знаю, что делать правильно.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Лучше не беспокоиться о том, как выглядят фильтры. Просто следите за формой, чтобы убедиться, что они имеют смысл.

Вот пример применения 2 фильтров Собела к изображению:

from skimage import data
img = np.expand_dims(data.camera(), -1)
img = np.expand_dims(img, 0)  # shape: (1, 512, 512, 1)

sobel_x = np.array([[-0.25, -0.2 ,  0.  ,  0.2 ,  0.25],
                   [-0.4 , -0.5 ,  0.  ,  0.5 ,  0.4 ],
                   [-0.5 , -1.  ,  0.  ,  1.  ,  0.5 ],
                   [-0.4 , -0.5 ,  0.  ,  0.5 ,  0.4 ],
                   [-0.25, -0.2 ,  0.  ,  0.2 ,  0.25]])

sobel_y = np.array([[-0.25, -0.4 , -0.5 , -0.4 , -0.25],
                   [-0.2 , -0.5 , -1.  , -0.5 , -0.2 ],
                   [ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ],
                   [ 0.2 ,  0.5 ,  1.  ,  0.5 ,  0.2 ],
                   [ 0.25,  0.4 ,  0.5 ,  0.4 ,  0.25]])

filters = np.concatenate([[sobel_x], [sobel_y]])  # shape: (2, 5, 5)
filters = np.expand_dims(filters, -1)  # shape: (2, 5, 5, 1)
filters = filters.transpose(1, 2, 3, 0)  # shape: (5, 5, 1, 2)

# Convolve image
ans = tf.nn.conv2d((img / 255.0).astype('float32'),
                   filters,
                   strides=[1, 1, 1, 1],
                   padding='SAME')

with tf.Session() as sess:
    ans_np = sess.run(ans)  # shape: (1, 512, 512, 2)

filtered1 = ans_np[0, ..., 0]
filtered2 = ans_np[0, ..., 1]

Изображение правильно свернуто с 2 фильтрами, и получающиеся изображения выглядят как:

plt.matshow(filtered1)
plt.show()

enter image description here

plt.matshow(filtered2)
plt.show()

enter image description here

0 голосов
/ 05 ноября 2018

Первый случай, кажется, правильно показывает фильтры формы [5, 5, 1, 3]. Посмотрите на количество квадратных скобок - тензор потока показывает 4-е измерение по горизонтали каждого из этих маленьких прямоугольников и 2-е измерение по вертикали. (Третий имеет размерность 1, поэтому нет смысла показывать это)

...