2017-06-09 9 views
1

非常に簡単な例です:dlibを使って "cat"と "dog"(2つのクラス)を検出し、ボックス座標を指定します。私はC++が得意ではないです(私は学ぶことができる)と私はPythonで物事を行うことを好むhttp://dlib.net/train_object_detector.cpp.htmldlibを使用して複数の.svmと複数のクラスを学習またはマージする方法

:私が見つけ

これまでの例では、1つのクラスで唯一の列車にあり、1つの.svmファイルを生成します。私はhttp://dlib.net/dlib/image_processing/object_detector_abstract.h.htmlに以下の使用すべきであるように、

object_detector<image_scanner_type> detector = trainer.train(images, object_locations, ignore); 
serialize("object_detector.svm") << detector; 

explicit object_detector (
    const std::vector<object_detector>& detectors 
); 

研究の数日後に(私もディープラーニングにおける新たなんだ)、私はこれらの行を変更する必要があります考え出し質問:

  1. 私はここhttp://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2顔のランドマーク検出などの.datファイルを作成する必要があります。ですから、一度にトレーニングしてシリアル化したり、.svmファイルを後で組み合わせるにはどうすればよいですか?

  2. 次に、.datファイル内のすべての.svmを検出するために検出を実行する必要があります。 C++やPythonでこれを行う方法の例を得ることはできますか?

ありがとう。

答えて

3

C++でこれを行う方法を教えてください。私は、あなたがPythonでそれをどうやってやることができるかを理解することができるはずです。

これを行うには、単一の.datファイルを用意する必要はありません。検出器を個別に訓練し、別々のファイルに保存することができます。これにより、新しい検出器を追加したり、再訓練をしなくても既存の検出器を置き換えることができます。 検出器のベクトルを作成する必要がある場合。すなわち:

std::vector<object_detector> detectors(3); 
dlib::deserialize(detectors[0], "object_detector.svm"); 
dlib::deserialize(detectors[1], "object_detector_2.svm"); 
dlib::deserialize(detectors[2], "object_detector_3.svm"); 

そして、あなたは、このように検出を実行します。

std::vector<dlib::rect_detection> detections; 
dlib::evaluate_detectors(detectors, image, detections); 

次にあなたが検出されたオブジェクトにアクセスすることができ、この:(5)一度に全ての検出器を実行している私の場合は

for (auto& det : detections) { 
    det.rect;   // found rectangle 
    det.weight_index; // detector index in vector (to indentify object class) 
} 

連続して実行するよりも約2.5〜3倍高速に実行されます。しかし、それはどのように類似する検出窓が検出器のそれぞれにあるかに依存する。

関連する問題