1

質問:決定する畳み込みニューラルネットワーク(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内のすべてのパッチを分類するだろうと期待していました。なぜそれがまだ遅いのか不思議。

+0

どのようなネットを使用しますか?それを畳み込みネットに変換する。 – Shai

+0

@Shai私はCNNを使用しています。私は問題を理解した。 net_deploy.prototxtの代わりにnet_test.prototxtを使用していたため、ファンキーな動作につながりました。私はデプロイメントモードでバッチサイズを調整し、バッチサイズが1000の場合、512 x 512イメージのすべてのパッチ(〜200000)を9秒間で高密度に分類できます。 net_deploy.prototxtの生成についてお手伝いいただき、ありがとうございます。 – cdeepakroy

答えて

1

あなたが探しているものは、Casting a Classifier into a Fully Convolutional Network of the "net surgery" tutorialセクションに記載されていると思います。
何このソリューションは、基本的に言うと、代わりに分類するための"InnerProduct"層続いCONV層から、"InnerProduct"層は、任意のサイズの画像を処理することができる完全畳み込みネットで得られた、等価 CONV層に変換することができるということです入力されたサイズに応じた予測を出力する。
完全畳み込みアーキテクチャに移行すると、現在行っている冗長な計算の数が大幅に削減され、処理速度が大幅に向上します。


高速化するための別の可能な方向は、truncated SVD trickを使用して、2つの下位ランク行列の積によって近似高次元"InnerProduct"層です。

関連する問題