2017-09-05 10 views
-1

opencvでいくつかの経験を積んだ後、私は最近、強力なグラフィックカードを搭載したサーバにインストールして、cuda機能を利用しました。しかし、私は "正常な" opencvでいくつかのテストを行い、サーバがより良いハードウェアを持っていると思われても、はるかに遅く動作するように見えます。opencv:最初のcvtColorは別のマシンではるかに遅い

#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <opencv2/opencv.hpp> 
#include <ctime> 

using namespace std; 
using namespace cv; 



int main (int argc, char **argv) 
{ 
    const clock_t begin_time = clock(); 

    Mat OneRBG,OneGray,TwoRBG,TwoGray,ThreeRBG,ThreeGray; 

    OneRBG=imread("./image.jpg"); 
cout << float(clock() - begin_time)/CLOCKS_PER_SEC <<"After imread One"<<endl; 
    cvtColor(OneRBG, OneGray, CV_BGR2GRAY); 
cout << float(clock() - begin_time)/CLOCKS_PER_SEC <<"After cvtColor One"<<endl; 
    TwoRBG=imread("./image.jpg"); 
cout << float(clock() - begin_time)/CLOCKS_PER_SEC <<"After imread Two"<<endl; 
    cvtColor(TwoRBG, TwoGray, CV_BGR2GRAY); 
cout << float(clock() - begin_time)/CLOCKS_PER_SEC <<"After cvtColor Two"<<endl; 
    ThreeRBG=imread("./image.jpg"); 
cout << float(clock() - begin_time)/CLOCKS_PER_SEC <<"After imread Three"<<endl; 
    cvtColor(ThreeRBG, ThreeGray, CV_BGR2GRAY); 
cout << float(clock() - begin_time)/CLOCKS_PER_SEC <<"After cvtColor Three"<<endl; 
} 

あなたが見ることができるように、私はいくつかの絵を3回ロードし、各ステップがかかった時間をプリントアウトしながら、階調に変換します。ここで私は問題を調査するために書いた小さなコードがあります。私はいくつかのMac mini上で並列マシン上で実行されますLinux上でそれを行う場合は、ここで私が得るものです:

0.015641 After imread One 
0.020779 After cvtColor One 
0.038313 After imread Two 
0.041601 After cvtColor Two 
0.074171 After imread Three 
0.076574 After cvtColor Three 

ニースと罰金、ここには驚き。私もUbunutu 16.04を持っている前述のサーバー上で非常に同じコードを実行したときしかし、それは

0.010095 After imread One 
0.577088 After cvtColor One 
0.584784 After imread Two 
0.586759 After cvtColor Two 
0.594362 After imread Three 
0.596315 After cvtColor Three 

絶対時間はもちろん、異なるハードウェアに起因する異なる、しかし、あなたが見ることができるように、最初に言いますcvtColorは他のどれよりもずっと多くの時間を要します。私はここにいる誰かが、なぜそれが事実だろうと私に語ってもらえるほど賢明だと確信しています。 さらに面白いかもしれないのは、私の他のコンピュータがそのような振る舞いをしていないことと、私のサーバーを同じように振る舞わせる方法があれば、私はそれを聞きたいと思うでしょう。

どんな答えを事前に感謝し、あなたがOpenCVのとするとき、あなたのコードをコンパイルしてコンパイルするときは、両方とも、任意の「奇妙な」のために(例えば、マシン固有の)コンパイルフラグをチェックすることができ素敵な一日

+2

あなたのテストのための1つの提案... 1回の実行のベンチマークに頼るべきではありません。代わりに、多数の試行に対してforループを実行し、平均または同様の統計的尺度を取る必要があります。コンパイラが、同じイメージを読み込んで最適化することをコンパイラが知っている可能性はありますか?おそらくそれぞれの実行後にそれぞれの 'Mat'を削除しますか?おそらくイメージの最初の*の深いコピーを作成し、それらの 'cvtColor'スピードテストを実行します。 –

答えて

1

を持っている:それができますそれは、コンパイラが二番目に取り組むことができないの最適化を行っている最初のマシン...

0

に私はいくつかのさらなる研究を行なったし、何か面白いものを見つけました: http://answers.opencv.org/question/123990/why-is-the-first-opencv-api-call-so-slow/

私は悩ま前にそれを発見した望みました皆さん、私はそれが問題を解決すると思います。 valleymanbsが言っているように、この設定は最初からマシン1で行われているかもしれません。さらなる調査が必要だが、ここから私は一人で行くことができると思う。

最後に、この質問を見つけて、上のリンクにある行をうれしくコピーすると、ヘッダーに小さなスペルミスがありました。少なくとも私のためには、次のように書かなければなりません。

... 
#include <opencv2/core/ocl.hpp> 
.... 

cv::ocl::setUseOpenCL(false); 

あなたのおかげで皆に感謝します。

関連する問題