4

ただ興味があるだけ。私はここで新しいので、私のややお粗末な質問に配慮してください。

私が画像認識を使用してAndroidアプリケーションを実行しているとしましょう。ここでは、計算量の多いすべてのプロセスがモバイルデバイスのCPUで実行される必要があります。

私はすでに画像を処理し、画像からいくつかの特徴を抽出した段階にあります。画像のセットは、関心のある特定のオブジェクト(さまざまな窓、写真、遺物、建物の外)を認識する必要がある1つの建物からのみ取得されます。つまり、これはクローズドドメインであり、さまざまな角度からのオブジェクトの十分な写真を提供できます。ニューラルネットワークをトレーニングして、画像マッチングアルゴリズムの代わりにアプリに提供する予定です。

私のアイデアは、キーポイントを抽出し、記述子を計算し(キーポイントにはFREAKを使用し、記述子にはORBを使用)、それらの記述子から、次のような単一のファイルまたは配列になりたいと考えています。

    Desc1  Desc2 Desc3 Desc4 DescN......... Class
_________________________________________________________________________________
Picture 1     0.121  0.923 0.553 0.22  0.28           "object1" 
Picture 2     0.22    0.53  0.54 0.55  0.32 .........."object1" (different scale, angle)
Picture 3     ....    ...    ...   ...  ..   .........."object2"
Picture N
Picture N+1

トレーニングのためにニューラルネットワークに渡すことができますが、Matrice(Class Mat-openCV)でバイナリ機能/記述子がどのように表されているのかわからないため、行き詰まりました。そして、これらのバイナリ記述子を正規化して、トレーニングのためにニューラルネット(多層パーセプトロン)にフィードする方法を教えてください。(擬似コードでさえ大いに役立ちます)

4

2 に答える 2

2

分類子を最初から実装しようとする代わりに。HaarTrainingを検討しましたか?画像内の複数のオブジェクトを検出するようにトレーニングできます。

ただし、トレーニングプロセスは長いです。

http://note.sonots.com/SciSoftware/haartraining.html

それが役に立てば幸い!

于 2013-05-09T22:29:25.873 に答える
2

Neuronal Networksに精通していないため、あなたの質問に完全に答えることはできませんが、ORB記述子のバイナリ表現についていくつかのアイデアを提供することはできます。

  1. キーポイントを検出しているときは、FREAKでは検出できません。ただし、FREAKの論文で説明されているように、FASTコーナー検出器でキーポイントを検出してから、FREAKで説明する必要があります。ORB記述子でオブジェクトを認識したい場合は、キーポイントの検出と説明の両方にORBを使用する必要があります。ORBキーポイントの検出もFASTに基づくことができることに注意してください。scoreTypeOpenCVドキュメントからのパラメータを変更することで変更できます。androidを使用している場合、ここで説明するようにこのパラメーターを設定できます

  2. バイナリ文字列記述子について。また、MySQLクエリで記述子マッチャーを実装するためにそれらが必要でした。OpenCV-javaのMatには二重記述子表現しかないため、それらをバイナリに変換するメソッドを実装しました。この目的のために、記述子のマットはに変換する必要がありますList<Double>。そして、私の関数を使用して、記述子のバイナリ表現を取得できます。関数はを返しますList<String>

コードは次のとおりです。

public static List<String> descriptorToBinary(List<Double> desc){

    List<String> binary_desc = new ArrayList<String>();

    String desc_bin= "";
    for(int i = 0; i < desc.size(); i++){

        String binary_str_tmp = Integer.toBinaryString((int)((double)desc.get(i)));
        if (binary_str_tmp.length() < 16)
        {
            int number_of_zeros = 16 - binary_str_tmp.length();
            String str_tmp = "";
            for(int t = 0; t < number_of_zeros; t++){
                str_tmp += "0";
            }
            binary_str_tmp = str_tmp + binary_str_tmp;
        }

        desc_bin+= binary_str_tmp;
        binary_desc.add(final_binary_str);

    }

    return binary_desc;

}

MatOfKeyPoint返される文字列のリストは、次のように変換する場合のリストと同じサイズになります。List<KeyPoint>

では、これらの記述子が正しいかどうかをどのように確認しましたか?

  1. ORBペーパーで述べられているように、元のマット記述子をブルートフォースハミングマッチャーと照合しました
  2. マッチャーから返される距離を登録しました。
  3. 次に、同じ画像の文字列記述子間の距離を計算しました。
  4. opencvのハミング距離が文字列記述子間の距離と同じであるかどうかを確認しました。それらは同じであったため、マットからリストへの変換はうまく実行されました。

したがって、キーポイントに関連付けられたバイナリ記述子は次のようになります。

Picture 1: object1
  keypoint1 : 512bit binary descriptor (1s and 0s)
  keypoint2 : 512bit binary descriptor
  keypoint3 : 512bit binary descriptor
  ...
Picture 2: object2
  keypoint1 : 512bit binary descriptor
  keypoint2 : 512bit binary descriptor
  keypoint3 : 512bit binary descriptor
  ...

次に、多層パーセプトロンについて説明します。私はそれであなたを助けることはできません。そのため、最初に私の答えは不完全であると言いました。しかし、私が与えたコメントが将来あなたの問題を解決するのに役立つことを願っています。

于 2013-05-27T14:58:06.033 に答える