Я пытаюсь обучить модели для определения лицевых точек.Это модель с накоплением 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]]
Простоэта последняя строка!Кто-нибудь может помочь?