覚え書きブログ

読者です 読者をやめる 読者になる 読者になる

行動認識の覚え書き(improved dense trajectoriesのインストール編)

行動認識でよく用いられているImproved Dense Trajectories(以下、IDTと呼ぶ)を試してみた。
IDTのコードは、Heng Wangにより以下のサイトで公開されている。
http://lear.inrialpes.fr/people/wang/improved_trajectories

IDTは、FFmpegOpenCVを用いている。
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

f:id:hirotaka_hachiya:20150621093648p:plain

次に、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の画像が作られる。