Генерация ключевых тепловых карт в Tensorflow - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь обучить модели для определения лицевых точек.Это модель с накоплением HourGlass.Он выдает размерный тензор 256x256x68.Каждый из 68 выходов будет иметь горячую область вокруг ключевой точки.Я определил модель и граф строит нормально.Моя проблема заключается в генерации набора данных.

Мне нужно сгенерировать размерный метку label_tensor 256x256x68 из тензора ориентировочных размеров 68x2.Хотя я могу сделать это в numpy и сохранить его в TFRecord, я хотел бы изучить и посмотреть, возможно ли это сделать во время обучения внутри parse_function API tf.data.Dataset.

Для каждой тепловой карты яМне нужно нарисовать гауссиан в точке x, y соответствующей точки ориентира.

Код

У меня есть следующий код внутри функции parse_function:

# heatmaps
joints = tf.stack([points_x, points_y], axis=1)
heatmaps = _generate_heatmaps(joints, 1., IMG_DIM)

Это функция _generate_heatmaps:

def _generate_heatmaps(joints, sigma, outres):
    npart = 68
    gtm = tf.placeholder(tf.float32, shape=[None, outres, outres, npart])
    gtmaps = tf.zeros_like(gtm)

    for i in range(npart):
        visibility = 1 
        if visibility > 0:
            gtmaps[:, :, :, i] = _draw_hotspot(gtmaps[:, :, :, i], joints[:, i, :], sigma)
    return gtmaps

Функция _draw_hotspot:

def _draw_hotspot(img, pt, sigma, type='Gaussian'):
# Draw a 2D gaussian
# Adopted from https://github.com/anewell/pose-hg-train/blob/master/src/pypose/draw.py

# Check that any part of the gaussian is in-bounds
ul = [(pt[:,0] - 3 * sigma), (pt[:,1] - 3 * sigma)]
br = [(pt[:,0] + 3 * sigma + 1), (pt[:,1] + 3 * sigma + 1)]
# if (ul[0] >= img.shape[1] or ul[1] >= img.shape[0] or
#         br[0] < 0 or br[1] < 0):
#     # If not, just return the image as is
#     return img

# Generate gaussian
size = 6 * sigma + 1
x = np.arange(0, size, 1, float)
y = x[:, np.newaxis]
x0 = y0 = size // 2
# The gaussian is not normalized, we want the center value to equal 1
# if type == 'Gaussian':
g = np.exp(- ((x - x0) ** 2 + (y - y0) ** 2) / (2 * sigma ** 2))
# elif type == 'Cauchy':
#     g = sigma / (((x - x0) ** 2 + (y - y0) ** 2 + sigma ** 2) ** 1.5)

# Usable gaussian range
g_x = [tf.clip_by_value(-1*ul[0], -100, 0)*-1, tf.minimum(br[0], img.shape[2].value) - ul[0]]
g_y = [tf.clip_by_value(-1*ul[1], -100, 0)*-1, tf.minimum(br[1], img.shape[1].value) - ul[1]]

g_x = tf.cast(g_x, tf.int64)
g_y = tf.cast(g_y, tf.int64)

# Image range
img_x = [tf.clip_by_value(ul[0], 0, img.shape[1].value), tf.clip_by_value(br[0], 0, img.shape[1].value)]
img_y = [tf.clip_by_value(ul[1], 0, img.shape[2].value), tf.clip_by_value(br[1], 0, img.shape[2].value)]

img_x = tf.cast(img_x, tf.int64)
img_y = tf.cast(img_y, tf.int64)

# img[img_y[0]:img_y[1], img_x[0]:img_x[1]] = g[g_y[0]:g_y[1], g_x[0]:g_x[1]]
img_slice = tf.image.extract_glimpse # ... stuck ...

return img

Мне нужно преобразовать этот код Numpy в код тензорного потока img[img_y[0]:img_y[1], img_x[0]:img_x[1]] = g[g_y[0]:g_y[1], g_x[0]:g_x[1]]

Простоэта последняя строка!Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 30 апреля 2019

Вот способ использования SciPy, который вы можете использовать в своем TF-конвейере с tf.py_func:

from scipy.stats import multivariate_normal

pos = np.dstack(np.mgrid[0:68:1, 0:68:1])
rv = multivariate_normal(mean=[22,43], cov=4)
plt.imshow(rv.pdf(pos))

generated heatmap

...