コンピュータ・ビジョンのベンチマークとして最近では Caltech の歩行者データセットがよくつかわれる. しかし,このデータセットは特殊なフォーマットになっていて,あつかいにくい. Matlab があればある程度容易にあつかえるが,深層学習などのために Python にとりこもうとすると,やっかいだ. ようやく変換ツールをととのえたので,ここで公開する.
歩行者検知の問題とくにこのデータセットはコンピュータ・ビジョンのむずかしいベンチマークとしてしられている. またこのデータセットは他の同種のデータセットとくらべてはるかに大規模であり,深層学習のように多数のデータが必要なときに使用するのに適している.
ビデオの変換
Caltech のビデオは seq という形式のファイルになっている. これを Python でよめるように変換するプログラムはつぎの URL にある. reading .seq files from caltech pedestrian dataset
このプログラムをうごかしてみると,なぜか各ファイルの最後のフレームがうまくよめずに,エラーになってしまう. しかし,他のフレームはよめるので,これをもとにファイルを加工している.
Bounding box の変換
Caltech のデータセットには annotations というファイルが付属している. このファイルのなかに bonding box つまり歩行者をかこむ四角形のデータがふくまれている. これは vbb 形式という形式だが,Matlab のバイナリ形式になっている. バイナリではあつかいにくいので,Matlab をつかってテキスト形式に変換した. この変換には Caltech データセットのページからリンクされている code3 という Matlab プログラム群 (そのなかの vbb.m というファイルにある関数) をつかえばよい. バイナリ形式の vbb ファイルを読む関数 (A = vbbLoad(file)) と,テキスト形式の vbb ファイルを書く関数 (vbbSaveTxt(A, textFileName, timeStamp))とをつかう.
テキストに変換したあとは自分で書いたプログラムによって変換することができるが,Python ではパタン・マッチがめんどうなので,Perl で変換プログラムを書いた. このプログラムは Python のプログラムを生成する.
### Bounding box extractor for textual VBB file ### # # Public domain program # coded by Yasusi Kanada # 2015-6-22 open(input, "annotations/${ARGV[0]}/${ARGV[1]}vbb.txt"); print "${ARGV[0]}_${ARGV[1]}=[\n"; while (<input>) { if (/^lbl='(person(-fa|\?)?|people)'\s+str=(\d+)\s+end=(\d+)\s+hide=(\d+)/) { $type = $1; $str = $3; $end = $4; $hide = $5; $pos = ''; $posv = ''; $occl = ''; $lock = ''; } if (/^(pos|posv)\s*=\s*\[(([-\d\w\.\;\s])*)\]/) { $name = $1; $text = $2; $text =~ s/;\s+/\] \[/g; $text =~ s/\s+/, /g; $text = "[[${text}]]"; $text =~ s/, \[\]//; if ($name eq 'pos') { $pos = $text; } else { $posv = $text; } } elsif (/^(occl|lock)\s*=\s*\[(([-\d\w\.\s])*)\]/) { $name = $1; $text = $2; $text =~ s/\s+/, /g; $text = "[${text}]"; if ($name eq 'occl') { $occl = $text; } else { $lock = $text; print " \{'type':'$type', 'firstFrame':$str, 'lastFrame':$end, 'hide':$hide,\n"; print " 'pos':$pos,\n 'posv':$posv,\n"; print " 'occluded':$occl,\n 'lock':$lock\},\n"; } } } print "]\n";
このプログラムは歩行者ごとのリストになっている. もとのファイルには分離された歩行者 (person) のほかに people, person-fa というデータもふくまれている. 各歩行者について,最初のフレーム番号,最後のフレーム番号,そのあいだの各フレームの bounding box の位置 (x, y) とサイズ (width, height) がふくまれている. ただし,このプログラムにはまだ問題があって,うまく読めないファイルがある.