2017-03-18 12 views
3

注:tf.image.non_max_suppressionは私が探しているものではありません!Tensorflow非最大抑制

Canny edge detectorと同様の非最大抑制(NMS)を実行しようとしています。具体的には、2D配列のNMSは、ウィンドウ内で最大値であれば値を保持し、そうでない場合は0に設定します。例えば

、私は「周りに検索しcouldnてきた私たちは3 x 3のウィンドウサイズを考慮した場合、結果は

[[0 0 0 0 0 0] [0 4 0 0 5 0] [0 0 0 0 0 0]]

あるべき行列に

[[3 2 1 4 2 3] [1 4 2 1 5 2] [2 2 3 2 1 3]]

を考えますこの操作を実行するものはtf.imagetf.nnにあります。 NMSを実行するコードがありますか?そうでない場合、Tensorflow(Python)でNMSを効率的に実装するにはどうしたらいいですか?

ありがとうございます!

EDIT:私はこれを解決する方法を考え出しましたが、より良い方法があるかどうかはわかりません:1つのストライド(つまりダウンサンプリングなし)とウィンドウサイズで最大プールをとり、tf.where値は最大プールされた値に等しく、ゼロでない場合は0に設定されます。より良い方法がありますか?

答えて

2

(よりよい解決策にかかわらず、オープン)自分の質問に答える:

import tensorflow as tf 
import numpy as np 

def non_max_suppression(input, window_size): 
    # input: B x W x H x C 
    pooled = tf.nn.max_pool(input, ksize=[1, window_size, window_size, 1], strides=[1,1,1,1], padding='SAME') 
    output = tf.where(tf.equal(input, pooled), input, tf.zeros_like(input)) 

    # NOTE: if input has negative values, the suppressed values can be higher than original 
    return output # output: B X W X H x C 

sess = tf.InteractiveSession() 

x = np.array([[3,2,1,4,2,3],[1,4,2,1,5,2],[2,2,3,2,1,3]], dtype=np.float32).reshape([1,3,6,1]) 
inp = tf.Variable(x) 
out = non_max_suppression(inp, 3) 

sess.run(tf.global_variables_initializer()) 
print out.eval().reshape([3,6]) 
''' 
[[ 0. 0. 0. 0. 0. 0.] 
[ 0. 4. 0. 0. 5. 0.] 
[ 0. 0. 0. 0. 0. 0.]] 
''' 

sess.close() 
関連する問題