2016-05-30 8 views
1

私は、次の型を持つオブジェクト検出器を使用しています設定:DLIBのscan_fhog_pyramid:max_pyramid_levels

dlib::object_detector<dlib::scan_fhog_pyramid<dlib::pyramid_down<2>>>

私のコードは次のようである:だから基本的に私がやっている

dlib::object_detector<dlib::scan_fhog_pyramid<dlib::pyramid_down<2>>> d; 
dlib::deserialize(svm_path) >> d; 
d.get_scanner().set_max_pyramid_levels(max_levels); 

オブジェクト検出器を定義する。既にトレーニングされたsvmをこのオブジェクト検出器に逆シリアル化します。最後の行では、ホッグピラミッドのレベル数を変更して検出器を構成しようとしています。

最後の行はget_scanner()として返されます。const image_scanner_type &が返されます。したがって、max_pyramid_levelsを変更することはできません。私は、それを変更する方法があるかどうかを知りたいのですが、ピラミッドの画像が少ない画像をスキャンするためです。

私の目標は、検出器の性能を向上させることです。私の場合、ピラミッドの画像スケールはほんのわずかしか必要ないと確信しています。

ありがとうございます。

答えて

2

新しいイメージスキャナで新しいオブジェクト検出器を構築することができます。

typedef dlib::scan_fhog_pyramid<dlib::pyramid_down<2> > image_scanner_type; 
typedef dlib::object_detector<image_scanner_type> detector_type; 
detector_type d; 
dlib::deserialize(svm_path) >> d; 
image_scanner_type new_scanner; 
new_scanner.copy_configuration(d.get_scanner()); 
new_scanner.set_max_pyramid_levels(1); 
detector_type new_d(new_scanner, d.get_overlap_tester(), d.get_w()); 

かはconst_castを使用しています。

+0

これはわかりやすい回答です!まさに私が望んでいたもの!ありがとう@Evgeniy、私は関数copy_configurationが存在するかどうかはわかりませんでした。私はドキュメンテーションを読んでいる間、それを見逃しているに違いない。最後の1つの質問:max_pyramid_levelsを変更すると検出器の精度に影響が出るかどうか知っていますか?私はパフォーマンスが良くなると確信していますが、精度についてはわかりません。 –

+1

はい、精度には影響します。オブジェクトの位置精度として、検出のカウントとして。あなたはいくつかの可能性のあるオブジェクトを失います。ピラミッドのアイデアは、異なるスケールのオブジェクトを見つけることです。オブジェクトのスケールがあまり変化しない場合、約+ 20%(6/5)は1つのピラミッドレベルで1つの検出器で処理できる通常のスケール変更です。また、ピラミッドなしで複数のスケールでうまく動作するカスタム検出器のトレーニングを試すこともできます。私はそのようなものをうまく訓練しました。また、AVXのようなすべての最適化がONであることを確認してください。 – Evgeniy

+0

ドキュメントでは、デフォルトのmax_pyramid_levelsが1000であることが示されています。これは、関数deserializeがデフォルトで検出器にこの値を入れることを意味しますか?または、値はトレーニング自体に依存します(これはsvmファイルのどこかに保存されます)。私がmax_pyramid_levelsを変更すると、これが私の検出器に影響することになるのではないかと心配しています。 –

関連する問題