Android-openCVアプリケーションをスピードアップするにはどうすればよいですか?

私はSURF記述子を使用するopenCVアプリケーションを実装しました。コードは次のようになります:

入力ビデオストリームのサイズを縮小してスピードアップします。

            capture.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, display.getWidth());
            capture.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, display.getHeight());

            capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);

            try{

          //-- Step 1: Detect the keypoints using SURF Detector

            surfDetector.detect( mRgba, vector1 );

            for (KeyPoint t : vector1)
                Core.circle(mRgba, t.pt, 10, new Scalar(100, 100,100));    

          //-- Step 2: Calculate descriptors (feature vectors)
            //extractor.compute(mRgba, vector1, descriptor1);

          //-- Draw matches
            //Mat img_matches;
            //drawMatches( mRgba, vector1, mRgba, vector1, matches, img_matches );


            }catch(Exception e){
                Log.e( "ERROR", e.toString());

            }

しかし計算はまだ遅すぎるので、私は入力ビデオストリームの量を減らす別の方法を見つける必要があります。またはそれをスピードアップする別の方法を知っているなら、それを私と共有してもかまいません;)

Thanks for your time & answers

17
追加された
ビュー: 3
@Csabiそしてあなたはどんな限界について話していますか?
追加された 著者 Shubhadeep Chaudhuri,
@ Csabiあなたはそれをスピードアップできましたか?私は同じ問題を抱えています。
追加された 著者 Shubhadeep Chaudhuri,
@ Csabiさて、正確さはどうですか? SURFに匹敵しますか?そして、あなたはどれくらいのフレームレートを得ていますか?
追加された 著者 Shubhadeep Chaudhuri,
あなたはプロファイリングに興味がありましたか?私はdavlikからのネイティブコールがかなり高価であると思う。カメラアプリケーションから割り当てられたmmapedメモリにアクセスすることは非常に高価です
追加された 著者 Konstantin Pribluda,
私はそれをディフォールトに設定していませんが、私はそれを設定する方法を知ることができませんでした。
追加された 著者 Csabi,
@TimeManxの限界は、例えばスケールの認識、そして誇張に対するものであり、私はサーフで10倍近いフレームを得ています。しかし、あなたはあなたのプロジェクトでそれを試してみるべきです
追加された 著者 Csabi,
@TimeManx私はオーブを使用して、サンプル画像のより大きなデータベースを使用していますが、それはより高速ですが、それは独自の制限があり、私はSurf
追加された 著者 Csabi,
私は本当にあなたの質問を理解していませんが、答えはむしろそうではありません。
追加された 著者 Csabi,
しかし、あなたが出力ビデオFPSを望むなら、それは4-5 seccondあたり1フレームなので恐ろしいです
追加された 著者 Csabi,
どのデバイスをテスト用に使用していますか?
追加された 著者 MobileCushion,
はい、それは何ですか?
追加された 著者 MobileCushion,
あなたのフレームレートは何ですか?
追加された 著者 MobileCushion,

2 答え

しかし計算はまだ遅すぎるので、別のものを探す必要があります   メソッドを使用して、入力ビデオストリームの量を減らします。

この質問に対する本当の答えは、「あなたができることはあまりありません!他の何よりも。携帯電話は、デスクトップのようにまだ強力な処理能力を持っていないことを認めなければなりません。世界のAndroid携帯の大部分は、以前のバージョンのシステムを使用していますが、最も重要なものは次のとおりです。シングルコアデバイスで、1GHz未満の速度でクロックされ、メモリが限られています。

それにもかかわらず、パフォーマンスの変化はほとんどなくスピードを上げるためにできることが常にあります。

今、私はGalaxySのOpenCV SURFを計算しています。私は320x240画像で1500でヘッセン閾値を持つ200個の特徴に対して1.5fpsのフレームレートを持っています。私はそれが間違った性能であることは認めていますが、私の場合は、追跡の目的でオプティカルフローを測定しているので、たまに毎回フィーチャを計算する必要があります。ただし、4〜5秒ごとに1つのフレームしか取得できないことは非常に奇妙です。

1)まず、VideoCaptureを使用してカメラフレームを取得しているようです。まあ、私はそうではありません。私はAndroidカメラの実装を使用しています。私は、VideoCaptureがOpenCVのJavaポートにどのように実装されているかは確認していませんでしたが、チュートリアルの一部で実装を使用するよりも遅いようです。しかし、私はそれをテストしていないので、私はこれについて100%確信することはできません。あなたは?

2)ネイティブコールを可能な限り少なくします。 Java OpenCVネイティブコールは時間がかかります。また、 Android-OpenCVベストプラクティスのページに記載されているすべてのガイドラインに従ってください。 。ネイティブコールが複数ある場合は、それらをすべて単一のJNIコールで結合します。

3)画像のサイズを小さくし、SURFヘッセンのしきい値を上げる必要があります。ただし、検出されたフィーチャの数は減少しますが、認識とマッチングの目的でより強固で堅牢になります。 SURFがよりロバストな検出器であると言うと、あなたは正しいです(これは最も遅く、特許取得済みです)。しかし、これがデッドロックではない場合は、新しいORB検出器を使用することをお勧めします。これは、回転の点でより優れたBRIEFの変形です。 ORBには検出されたキーポイントの数が限られており、スケール不変性が悪いなどの欠点があります。 これはです非常に興味深い特徴検出アルゴリズムの比較レポートです。これはまた、新しいOpenCV 2.3.1バージョンでSURF検出器の方が遅いことを示唆しています。おそらくアルゴリズムの変更によって、堅牢性が向上します。

4) Now the fun bits. The ARM processor architecture (in which most of the Android phones are based) has been widely reported for its slowness handling floating point calculations, in which feature detector algorithms rely heavily. There have been very interesting discussions about this issue, and many say you should use fixed-point calculations whenever possible. The new armv7-neon architecture provides faster floating point calculations, but not all devices support it. To check if your device does support it, run adb shell cat proc/cpuinfo. You can also compile your native code with NEON directives (LOCAL_ARM_NEON := true) but I doubt this will do any good, since apparently few OpenCV routines are NEON optimized. So, the only way to increase speed with this, is to rebuild the code with NEON intrinsics (this is completely unexplored ground for me, but you might find it worth looking). In the android.opencv group it was suggested that future OpenCV releases will have more NEON-optimized libraries. This could be interesting, however I am not sure if it is worth working on it or wait for faster CPUs and optimized systems using GPU computing. Note that Android systems < 3.0 do not use built-in hardware acceleration.

5)学業目的でこれをやっているなら、あなたの大学にあなたに良いデバイスを買うように説得してください^^。これは最終的には高速SURFフィーチャー検出のための最良の選択肢となるかもしれません。別のオプションは、アルゴリズムを書き換えることです。 Intelのラボでは成功した人もいますが、明らかに彼らはそれを共有しません。 正直なところ、この問題を数週間調査した結果、私の具体的なニーズ(コンピュータサイエンスのエンジニアもアルゴリズムの専門家もいないため)では、頭を叩くよりも、アルゴリズムの解剖とアセンブリに近いコードの開発を行います。

ベストアンサーと幸運!

36
追加された
2015年にようこそ。最大8コアのデバイスをご利用いただけます。
追加された 著者 Dmitry Zaytsev,
@DmitryZaitsevそして、OpenCVのwarpPerspectiveは2GBのRAMを持つSnapdragon 800クアッドコア2.3GHz上で920x720のdestサイズにイメージをワーピングするのに〜250msかかる。参照: stackoverflow.com/questions/32880842/&hellip
追加された 著者 bad_keypoints,
Ievgen Khvedcheniaによるこのトピックに関するさらに興味深い洞察:コンピュータビジョン・トーク.com/2012/04/reader-questions-1
追加された 著者 MobileCushion,
また、Snapdragonのコーナーを検出するOpenCV関数の一部で、非常に遅いフレームレートが発生しています。私は FastCV のためのショットを打ち出す予定です。誰もここでFastCVについてコメントしていますか?
追加された 著者 jairobjunior,
@jairobjuniorはい。私はそれを使用しようとしました。正直なところ、使用するのは非常に難しいツールです。ドキュメンテーションは非常に限られています。さらに、v1.7.1時点では、ML APIは1つしか提供されていません。 SVM分類子。
追加された 著者 Rishabh Bhardwaj,

アプリケーションにSURF機能/記述子を使用する必要がありますか? SURFは非常にうまく一致するので魅力的ですが、あなたが知ったように、それはやや遅いです。ビデオを介してポイントをトラッキングするだけの場合、ポイントがフレームごとに大きく変化しないことを前提にして、Harris/FASTコーナーを検出して一致させてから、一致するものが有効であると判断することができます元の点のxピクセルの半径?

OpenCVには、フィーチャディテクタおよび記述子抽出プログラムおよび記述子マッチャーを使用していない場合は、オプションを調査する価値があります。

2
追加された
はい、私は知っていますが、SURFはより強固ですが、私はFASTやHarris Cornerを使うことができます...しかし、問題はどのようにSURF
追加された 著者 Csabi,