OpenCV 3.0 betaのサンプルのcppにtrain_HOG.cppがあるのを見つけた。
中を見てみると自分でHOGの辞書を作ることができるようだ
ソースの内容は大きく分けると
データの読み込み
ファイルリストを読み込みpositive, negativeの画像を読み込む。
ただし、この部分はINRIAデータに依存した記述になっている。
また、INRIAデータの解釈を間違っており、サンプルのままでは、よくない結果となるよ予想される。INRIAの画像は、4方に16画素のマージンが含まれており、実際の画像は、64x128が正しい
特徴量の計算
各画像のHOG特徴量を計算し、gradient_lstに格納している
hog.compute( gray, descriptors, Size( 8, 8 ), Size( 0, 0 ), location );
const vector<Point>& locationsに座標が格納されている場合は、その座標で計算する
locations.sizeが0の場合、決められた座標で計算する
SVMによる学習
SVM::Params paramsにパラメータをセットし、
Ptr<SVM> svm = StatModel::train<SVM>(train_data, ROW_SAMPLE, Mat(labels), params);
で学習を行なう
3.0はいろいろ問題があるので、2.4.10でビルドできないか試したところ、読み込みと特徴量のところは問題がなかったが、2.4.10では、mlクラスはないので、この部分を自分でlibLinearに置き換えれば、2.4.10で自分の辞書ができそうである。
2.4.10のHOGのソースの場所
opencv2410/modules/objdetect/src/hog.cpp
3.0のpython版による手書き数字識別のチュートリアル
OCR of Hand-written Data using SVM
0 件のコメント:
コメントを投稿