質問:決定する畳み込みニューラルネットワーク(CNN)を訓練しているテスト画像内のウィンドウオブジェクト検出を摺動するためのカフェを高速化する方法
/関心の対象が所与の中に存在するか否かを検出画像パッチ。
大きな画像を与えられたので、私は画像内の各ピクセルを囲むパッチに自分のCNNモデルを適用することによって、画像内のオブジェクトのすべての出現箇所をスライディングウィンドウの方法で特定しようとしています。しかし、これは非常に遅いです。
私のテスト画像のサイズは(512 x 512)です。そして、私のcaffeネットでは、テストバッチサイズは1024で、パッチサイズは(65 x 65 x 1)です。
一度に1つのパッチではなく、パッチのバッチ(size = test_batch_size)に自分のcaffeネットを適用しようとしました。それでも遅いです。
私の現在の解決策は非常に遅いです。これをスピードアップするために私のテストイメージをダウンサンプリングする以外の提案はありがたいです。非常に遅いです
現在のソリューション:
def detectObjects(net, input_file, output_file):
# read input image
inputImage = plt.imread(input_file)
# get test_batch_size and patch_size used for cnn net
test_batch_size = net.blobs['data'].data.shape[0]
patch_size = net.blobs['data'].data.shape[2]
# collect all patches
w = np.int(patch_size/2)
num_patches = (inputImage.shape[0] - patch_size) * \
(inputImage.shape[1] - patch_size)
patches = np.zeros((patch_size, patch_size, num_patches))
patch_indices = np.zeros((num_patches, 2), dtype='int64')
count = 0
for i in range(w + 1, inputImage.shape[0] - w):
for j in range(w + 1, inputImage.shape[1] - w):
# store patch center index
patch_indices[count, :] = [i, j]
# store patch
patches[:, :, count] = \
inputImage[(i - w):(i + w + 1), (j - w):(j + w + 1)]
count += 1
print "Extracted %s patches" % num_patches
# Classify patches using cnn and write result to output image
outputImage = np.zeros_like(inputImage)
outputImageFlat = np.ravel(outputImage)
pad_w = test_batch_size - num_patches % test_batch_size
patches = np.pad(patches, ((0, 0), (0, 0), (0, pad_w)),
'constant')
patch_indices = np.pad(patch_indices, ((0, pad_w), (0, 0)),
'constant')
start_time = time.time()
for i in range(0, num_patches, test_batch_size):
# get current batch of patches
cur_pind = patch_indices[i:i + test_batch_size, :]
cur_patches = patches[:, :, i:i + test_batch_size]
cur_patches = np.expand_dims(cur_patches, 0)
cur_patches = np.rollaxis(cur_patches, 3)
# apply cnn on current batch of images
net.blobs['data'].data[...] = cur_patches
output = net.forward()
prob_obj = output['prob'][:, 1]
if i + test_batch_size > num_patches:
# remove padded part
num_valid = num_patches - i
prob_obj = prob_obj[0:num_valid]
cur_pind = cur_pind[0:num_valid, :]
# set output
cur_pind_lin = np.ravel_multi_index((cur_pind[:, 0],
cur_pind[:, 1]),
outputImage.shape)
outputImageFlat[cur_pind_lin] = prob_obj
end_time = time.time()
print 'Took %s seconds' % (end_time - start_time)
# Save output
skimage.io.imsave(output_file, outputImage * 255.0)
私は線で
net.blobs['data'].data[...] = cur_patches
output = net.forward()
カフェは、GPUを使用して並列にcur_patches内のすべてのパッチを分類するだろうと期待していました。なぜそれがまだ遅いのか不思議。
どのようなネットを使用しますか?それを畳み込みネットに変換する。 – Shai
@Shai私はCNNを使用しています。私は問題を理解した。 net_deploy.prototxtの代わりにnet_test.prototxtを使用していたため、ファンキーな動作につながりました。私はデプロイメントモードでバッチサイズを調整し、バッチサイズが1000の場合、512 x 512イメージのすべてのパッチ(〜200000)を9秒間で高密度に分類できます。 net_deploy.prototxtの生成についてお手伝いいただき、ありがとうございます。 – cdeepakroy