我正在尝试使用tensorflow和keras转换numpy层
# output from model
op_from_model = <tf.Tensor '1_conv_1x1_parts/BiasAdd:0' shape=(?, 64, 64, 16) dtype=float32>
# Numpy style -
from scipy.ndimage import gaussian_filter, maximum_filter
import numpy as np
lst = np.zeros([16,3])
for i in range(maps.shape[-1]):
_map = maps[:,:,i]
_map = gaussian_filter(_map, sigma=0.3)
_nmsPeaks = non_max_supression(_map, windowSize=3, threshold=1e-6)
y, x = np.where(_nmsPeaks == _nmsPeaks.max())
if len(x) > 0 and len(y) > 0:
lst[:,i] = [int(x[0]), int(y[0]), _nmsPeaks[y[0], x[0]]]
def non_max_supression(map, windowSize, threshold):
under_th_indices = plain < threshold
plain[under_th_indices] = 0
return plain * (plain == maximum_filter(plain, footprint=np.ones((windowSize, windowSize))))
#TF layer style
# adapted from here https://stackoverflow.com/questions/52012657/how-to-make-a-2d-gaussian-filter-in-tensorflow
from keras import backend as K
import tensorflow as tf
def gaussian_kernel(size: int, mean: float, std: float):
d = tf.distributions.Normal(mean, std)
vals = d.prob(tf.range(start = -size, limit = size + 1, dtype = tf.float32))
gauss_kernel = tf.einsum('i,j->ij', vals, vals)
return gauss_kernel / tf.reduce_sum(gauss_kernel)
gauss_kernel = gaussian_kernel(5, 0.44, 0.5) # have to set correct params here
gauss_kernel = gauss_kernel[:, :, tf.newaxis, tf.newaxis]
filt_op = tf.nn.conv2d(np.expand_dims(np.expand_dims(np.array(map[:,:,0] , dtype = np.float32), axis=0),axis=3),
gauss_kernel, strides=[1, 1, 1, 1], padding="SAME")
peaks_nhwc_tensor = tf.nn.max_pool(filt_op, windowSize, strides= [1,1,1,1], padding="SAME", data_format='NHWC')
# not sure of the equivalent op here compared to numpy above
y, x = tf.where(peaks_nhwc_tensor == peaks_nhwc_tensor.max())
如何从过滤后的指数中得到lst作为模型的输出?我正在使用keras和TF。你知道吗
输入:从模型到形状的运算[1,64,64,16]
输出:过滤操作后-形状[16,3]#[x,y,置信度#分数]
转换模型的等效代码如下所示
希望这对别人有帮助。你知道吗
相关问题 更多 >
编程相关推荐