GPUを使用してSURFアルゴリズムを高速化したい。しかし実際には、CPU(enale TBB)はSURFアルゴのGPUよりも高速であることがわかりました。 私のハードウェアとOS情報: CPU:Intel(R)Xeon(R)CPU E3-1230 V2 @ 3.30GHz(4コア+ 8スレッド)GPU:Nvidia GTX 660ti〜1000MHz(1344 GPUコア)ubuntu 12.04(64ビット)
シーンを適用する: 私のフォルダには約120枚の画像があります。SURFを使用してすべての画像のキーポイントを取得する必要があります。
時間ログ
すべてのイメージのCPU(TBB)、時間ログの使用:
DB:/ home / ole / MatchServer / ImgDB0 / img0のインデックス作成SURFALGO(ON TBB)のコスト時間:0.00666648
インデックス作成DB:/ home / ole / MatchServer / ImgDB0 / img1 onSURF ALGO(ON TBB)[s]:0.00803925
DB:/ home / ole / MatchServer / ImgDB0 / img2のインデックス作成SURFALGO(ON TBB)のコスト時間:0.0066344
データベースのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img3 SURF ALGO(ON TBB)のコスト時間:0.00625698
DB:/ home / ole / MatchServer / ImgDB0 / img4のインデックス作成SURFALGO(ON TBB)のコスト時間:0.00699448
DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img5 SURF ALGO(ON TBB)のコスト時間[s]:0.00621663
.................more..................................
すべての画像のGPU、時間ログ(すべての画像のGPUには2行のログがあり、1つはGPU Memにimgをアップロードし、2つ目はSURF_GPUアルゴリズムが時間を費やします):
DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img0 GPUアップロードイメージのコスト時間:1.99329
DB:/ home / ole / MatchServer / ImgDB0 /img0のインデックス作成GPUのコスト時間SURFALGO[s]:0.00971809
DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img1 GPUアップロードイメージのコスト時間:0.000157638
DB:/ home / ole / MatchServer / ImgDB0 /img1のインデックス作成GPUのコスト時間SURFALGO[s]:0.00618778
DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img2 GPUアップロードイメージのコスト時間:8.8108e-05
DB:/ home / ole / MatchServer / ImgDB0 /img2のインデックス作成GPUのコスト時間SURFALGO[s]:0.00736609
DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img3 GPUアップロードイメージのコスト時間:8.8599e-05
DB:/ home / ole / MatchServer / ImgDB0 /img3のインデックス作成GPUでのコスト時間SURFALGO[s]:0.00559131
DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img4 GPUアップロードイメージのコスト時間:8.7626e-05
DB:/ home / ole / MatchServer / ImgDB0 /img4のインデックス作成GPUのコスト時間SURFALGO[s]:0.00610033
DBのインデックス作成:/ home / ole / MatchServer / ImgDB0 / img5 GPUアップロードイメージのコスト時間:8.9125e-05
DB:/ home / ole / MatchServer / ImgDB0 /img5のインデックス作成GPUのコスト時間SURFALGO[s]:0.00632997
............................more..................................
最初の画像は、画像マットをGPUにアップロードするのに約2秒かかることがわかりました。次は通常約0.000157638秒です。
GPUコード:
try
{
double t0 = (double)getTickCount();
cv::gpu::SURF_GPU surf_gpu;
Size size = help_img.size();
Size size0 = size;
int type = help_img.type();
cv::gpu::GpuMat d_m(size0, type);
if(size0 != help_img.size() )
d_m = d_m(Rect((size0.width - size.width) / 2, (size0.height - size.height) / 2, size.width, size.height));
d_m.upload(help_img);
double t = ((double)getTickCount() - t0)/getTickFrequency();
std::cout << "indexing DB:"<< path << " cost time on upload image[s]: " << t << std::endl;
t0 = (double)getTickCount();
surf_gpu(d_m, cv::gpu::GpuMat(), help_keypoints);
t = ((double)getTickCount() - t0)/getTickFrequency();
std::cout << "indexing DB:"<< path << " cost time on Gpu image[s]: " << t << std::endl;
}
catch (const cv::Exception& e)
{
printf("issue happen!");
}
次の質問についていくつかの提案をするのを手伝ってください:
1.最初の画像のGPUへのアップロードが約2秒非常に遅いのはなぜですか?
2. GPUがSURFアルゴリズムを加速しない理由、SURFには多くの計算があり、理論的には、GPUはそれを加速できます。
3. SURFアルゴリズムのGPUパフォーマンスを改善するにはどうすればよいですか?
ありがとう!!