行動認識でよく用いられているImproved Dense Trajectories(以下、IDTと呼ぶ)を試してみた。
IDTのコードは、Heng Wangにより以下のサイトで公開されている。
http://lear.inrialpes.fr/people/wang/improved_trajectories
IDTは、FFmpegとOpenCVを用いている。
UbuntsuのFFmpegパッケージには、libavdeviceが入っていない。また、OpenCVのパッケージには、ライセンスの関係上nonfreeモジュールが入っていない。
そのため、FFmepg、OpenCV両者とも手動でインストールする必要がある。
まず、FFmpegの最新バージョンffmpeg-2.7.tar.bz2を、以下からダウンロードする。
https://www.ffmpeg.org/download.html
Yasmパッケージをインストールした後、ffmpegを解凍し、インストールする。
> sudo apt-get install yasm > tar jxf ffmpeg-2.7.tar.bz2 > cd ffmpeg-2.7 > ./configure --enable-shared --enable-swscale --enable-gpl > make > sudo make install
次に、opencv-2.4.11.zipを、以下からダウンロードする。
http://opencv.org/downloads.html
> unzip opencv-2.4.11.zip > cd opencv-2.4.11 > mkdir release; cd release > cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler .. ... -- FFMPEG: YES -- codec: YES (ver 54.35.0) -- format: YES (ver 54.20.4) -- util: YES (ver 52.3.0) -- swscale: YES (ver 2.1.1) -- gentoo-style: YES ... > make > sudo make install
次に、IDTの本体を、以下からダウンロードする。
http://lear.inrialpes.fr/people/wang/download/improved_trajectory_release.tar.gz
> tar -xvzf improved_trajectory_release.tar.gz > cd improved_trajectory_release
DenseTrackStab.cppを下記のように編集して、コンパイルする。
int show_track = 1;
> make
コンパイルした、/release/DenseTrackStabが参照しているOpenCVのライブラリを確認すると、
Ubuntsのパッケージを参照しているので、LD_LIBRARY_PATHに、手動でインストールした/usr/local/libを指定する。
> ldd release/DenseTrackStab libopencv_core.so.2.4 => /usr/lib/x86_64-linux-gnu/libopencv_core.so.2.4 (0x00007f2e7fdee000) libopencv_highgui.so.2.4 => /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4 (0x00007f2e7fba3000) libopencv_imgproc.so.2.4 => /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.2.4 (0x00007f2e7f712000) libopencv_calib3d.so.2.4 => /usr/lib/x86_64-linux-gnu/libopencv_calib3d.so.2.4 (0x00007f2e7f47c000) > export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH > ldd release/DenseTrackStab libopencv_core.so.2.4 => /usr/local/lib/libopencv_core.so.2.4 (0x00007f22b1b7c000) libopencv_highgui.so.2.4 => /usr/local/lib/libopencv_highgui.so.2.4 (0x00007f22b192a000) libopencv_imgproc.so.2.4 => /usr/local/lib/libopencv_imgproc.so.2.4 (0x00007f22b143a000) libopencv_calib3d.so.2.4 => /usr/local/lib/libopencv_calib3d.so.2.4 (0x00007f22b115e000)
サンプル動画(test_sequences/person01_boxing_d1_uncomp.avi)を用いて、試しにDense Trajectoriesを抽出してみる。
>./release/DenseTrackStab test_sequences/person01_boxing_d1_uncomp.avi > test_sequences/person01_boxing_d1
次に、pythonで、出力したdense trajectoriesの特徴量をファイルから読み込んでみる。
import io # read dense trajectories to list with open('person01_boxing_d1','r') as f: d = [v.rstrip().split('\t') for v in f.readlines()] # convert to float d = [map(lambda x:float(x), d[v]) for v in range(0,len(d))]
各行の11列から436列(最後)までが、Trajectory(30次元)、HOG(96次元)、HOF(108次元)、MBHX(96次元)およびMBHY(96次元)の特徴量に対応している。
#HOG 96dim: 8(bin) x 2 x 2(spatio) x 3(temporal) print "HOG:" print d[0][40:40+96] #HOF 108dim: 9(bin) x 2 x 2(spatio) x 3(temporal) print "HOF:" print d[0][136:136+108] #MBHX 96dim: 8(bin) x 2 x 2(spatio) x 3(temporal) print "MBHX:" print d[0][244:244+96] #MBHX 96dim: 8(bin) x 2 x 2(spatio) x 3(temporal) print "MBHY:" print d[0][340:340+96]
DenseTrackStab.cppの290行目あたりを、以下のように改造して各フレームのdense trajectoriesを画像ファイルに保存するようにしてみた。
char fname[256]; if( show_track == 1 ) { sprintf(fname, "test_sequences/%d.png",frame_num); imwrite(fname,image); imshow( "DenseTrackStab", image); c = cvWaitKey(3); if((char)c == 27) break; }
makeして実行すると、test_sequencesディレクトリ以下に、フレーム番号.pngの画像が作られる。