人検出における識別器構築 -その1-
今回は,人検出を行うための識別器構築をしたいと思います.
なお,本記事では,人画像(ポジティブ・歩行者)は事前に用意しているという前提で話を進めたいと思います.
背景画像(ネガティブ・非歩行者)は,人画像と同じ大きさに切り取られる必要があります.しかし,例えば今回使用したDaimler Mono Ped. Detection Benchmarkのように,背景画像が人画像と同じ大きさで与えられていないものもあります.
その場合は,自分で切り取る必要があります.
ランダムな位置およびスケールで切り出されたものを人画像と同じ大きさ(48×96ピクセル)で切り取りました.今回は1枚の背景画像について10ヶ所から切り取っています.
- 29行目で0から入力画像 (src_img) の幅 (src_img.col) からWIDTH (48) の間で乱数を生成させています.
- 30行目で0から入力画像0から入力画像 (src_img) の高さ (src_img.row) からHEIGHT (96) の間で乱数を生成させています.
- 31,32行目でWIDTH/2 (48÷2=24) からWIDTH (48) の間,HEIGHT/2 (96÷2=48) からHEIGHT (96) の間で乱数を発生させています.この値はさまざまに変えてもよいと思います.
- 33行目で
printf("%d %d\n", a, b);
とありますが,aとbの値を表示させているだけですので不要です.(私の場合は確認のために表示させています.)不要な場合は,
//printf("%d %d\n", a, b);
でコメントアウトするか削除してください.
- 35行目はroi_imgにsrc_imgに(深い)コピーしています.
- 36行目はdst_img1をroi_imgから切り取った画像としています.具体的には点(a, b)から幅c,高さdだけ切り取っています.
- 38行目ではdst_img1を正規化(48×96ピクセルの大きさにする)し,これをdst_img2としています.
- そして42行目で画像を保存します.
乱数生成については以下のサイトを参考にしました.
C言語による乱数生成
書き方の問題はあるかと思いますが...
識別器構築についてはまた書きたいと思います.
/* look back on the first week of January */
2015年を迎えて1週間以上過ぎました.
充実した毎日を過ごしたいと思っていましたが,思った通りには過ごせてはいないように思います.
/* Happy New Year 2015 */
明けましておめでとうございます.
今年もよろしくお願いします.
昨年の9月にブログを始め,年を越しました.
ブログを始めた当初は,もっと日記のような今日あった出来事を記録していくのだろうと思っていました.でも,実際は,画像処理・画像認識を勉強し始めた自分が後々に困ることのないようにソースコードを載せていることの方が多かったです.
これから,記事の内容については変わることがあるかもしれません.
2012年8月に登録したTwitterは削除しました.自分の人生は決してリセットできないけれど,すべてのつながりをいったん削除したいと思ったからです.もちろん,すべての人とつながりたくないと思ったのではありません.やめたらその分寂しくなるという思いを持って削除しました. 結局,アカウントは復活させました (2015/3/12 追記).4月からは所属が変わり,今までつながっていた人とは一生会わないかもしれません.そのような中で一日一日を大切に生き,充実した1年にしていきたいです.
マスク画像の作成
今回は,得られた座標を直線で結ぶという作業をOpenCVを用いて行ってみようと思います.
ただ,座標を直線で結んで多角形を作成するのも良いですが,今回は,作成後,いろいろと遊ぶことのできるマスク画像を作成します.
ここでは,マスク画像の詳細は省きますが,マスク画像は二値画像です.
10行目から13行目が得られた座標です.この座標を直線で結び,その内部を白く塗りつぶしています.
そしてtest.jpgは以下のようになります.
10行目から13行目の部分をtxtファイルから読み込みたいというときは,
FILE *fp; cv::Point pt[4]; int i;
などど宣言してから
fp = fopen("test.txt", "r"); if(fp == NULL){ printf("ファイルがありません\n"); return -1; } for(i = 0; i < 4; i++){ int x, y; fscanf(fp, " %d %d", &x, &y); pt[i] = cv::Point(x, y); } fclose(fp);
と書き換えます.
この書き換えの場合は
100 100 100 200 …
と座標を空白で区切ってある場合に使うことができます.
/* ポケモンORAS発売 */
ついに発売されました.(2014/11/21 記入)
ただ,今は少しプレイする余裕はなさそうです.(2014/11/28 記入)
(2014/12/26 記入)
最近,ようやく始められました.
まだジムバッジは2個ですが,ゆっくり自分のペースで進められたらと思います.
とりあえずの目標はジムバッジをすべて集めることですかね.
いろいろ見ているとポケモン以外にも欲しいゲームがたくさんありました.
でも,先月はゲームもできないほど追われていました.
もう少し,自分の人生について考えていきたいと思います.
/* coffee break */
最近,面白いブログを探すのが好きです.
さて,私は画像認識に関する研究をしているらしいのですが,先日研究されている方とお話ししました.
人と関わるのが億劫になっていて,私自身一人で何事も進めていきたいと思うことも多かったです.しかし,やはり横のつながりも非常に大事で,人と関わらずにやっていくことはおそらくできないだろうなと感じました.
OpenCVとこれから
先日,自分のコードを見てもらったら衝撃の一言.
「今はこんな書き方しないよ」
OpenCVの古いバージョンの書き方をしているようで…
cvLoadImageとかcvSaveImageとか…
Physics-Station: OpenCV を Visual Studio で使う方法
ここに書いてあるように「OpenCV 1.0で使われていたコードであり、初心者とメモリに優しくない」のです.
でも,やり始めたときに人に聞いてよかったなと.今までほぼ一人で調べてやってきたので.
今後はまた勉強しなおしてやっていきたいですね.
(あと,普段あまり更新していないのでもう少し日記みたいなものを増やすかも)