覚え書きブログ

Pythonの覚え書き(グラフのプロット編)

Pythonでグラフをプロットするには、matplotlibライブラリのpylabのplotが標準的に用いられる。

>>> import matplotlib.pylab as plt
>>> import numpy as np
>>> plt.plot(np.random.rand(100))

f:id:hirotaka_hachiya:20151229120613p:plain

csvファイルで保存されたデータをプロットするには、pandasライブラリのdataframeのplotを使うとより簡単にできる。

>>> import pandas as pd
>>> import matplotlib.pylab as plt
>>> df=pd.read_csv('target_train.csv')
>>> df
           date  01202_total  04100_total  13102_total  14382_total  \
0    2014-06-01         9478        25450        17546        25345   
1    2014-06-02         7670        13704        11262        13743   
2    2014-06-03         6490        12963        10263        11643   
3    2014-06-04         6394        13736        11140        12249   
4    2014-06-05         7532        14293        11314        14167   
5    2014-06-06         8926        21808        15045        16145   
6    2014-06-07        10505        37080        22156        24072   
7    2014-06-08         9190        27868        16799        22463   
8    2014-06-09         8942        14602        10439        15175   
9    2014-06-10         9093        12221         8385        10856 
...  
>>> df.plot(x='date',y='01202_total')
>>> plt.show()

f:id:hirotaka_hachiya:20151229123116p:plain

ちなみに、このデータは、ある都市の1年間の宿泊者数の推移であり、下記のサイトからダウンロードすることができる。
https://datasciencelab.jp/compe/13?tab=compedetail

ただし、dataframeのplotだと表示する行数を指定することなど細かい設定をすることができない。細かい設定をしてプロットしたい場合は、やはりpylabのplotを使う方が良い。例えば、0~30行の範囲を指定して、さらに、x軸の値を日付などの文字列に変更などは、以下のようにできる。

>>> import pandas as pd
>>> import matplotlib.pylab as plt
>>> df=pd.read_csv('target_train.csv')
>>> h1, =plt.plot(df['01202_total'][0:30],label='01202_total')
>>> h2, =plt.plot(df['14382_total'][0:30],label='14382_total')
>>> plt.xticks(range(30),df['date'][0:30],rotation=90,size='small')
>>> plt.legend(handles=[h1,h2])
>>> plt.show()

f:id:hirotaka_hachiya:20151229181435p:plain

これを関数化して、指定したcsvファイルの指定した列の数値列を指定した行間プロットできるようにしたpythonスクリプトが下記からダウンロードできる。

https://drive.google.com/file/d/0B3uB4w2FEJbIVXRLUl8waVdfRHc/view?usp=sharing

f:id:hirotaka_hachiya:20151230112745p:plain
f:id:hirotaka_hachiya:20151230112907p:plain

行動認識の覚え書き(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の画像が作られる。

Pythonの覚え書き(リストの連結編)

Pythonでは、2つのリストを、+を用いることにより簡単に連結することができる。

>>> list1=[1,2,3]
>>> list2=[4,5,6]
>>> list1+list2
[1, 2, 3, 4, 5, 6]

ただし、+で連結できるのは、水平方向だけで、垂直方向の連結はできない。垂直方向の連結をする場合は、numpyのvstackを使う。

>>> import numpy as np
>>> list1=[1,2,3]
>>> list2=[4,5,6]
>>> np.vstack((list1,list2))
array([[1, 2, 3],
       [4, 5, 6]])

Pythonの覚え書き(pandasのDataFrame編)

PythonのpandasモジュールのDataFrameを使うと、簡易的なデータベースを作ることができる。csvやhdfファイルで保存されたデータを読み込むこともできるため、非常に便利である。

以下は、DataFrameの定義の例である。

>>> import pandas as pd
>>> df = pd.DataFrame({'name':['ichiro','jiro','saburo'],'age':[30,25,20]},index=['01','02','03'])

ここで、id、nameおよびageはキーであり、各キーに対するフィールド(列)を定義している。また、'01','02','03'は、各レコード(行)の索引(index)である。定義されたDataFrameを表示すると次のような表になっている。

>>> df
    age    name
01   30  ichiro
02   25    jiro
03   20  saburo

このDataFrameから各フィールド(列)を参照するためには、次のようにキーで指定する。

>>> df['age']
01    30
02    25
03    20
Name: age, dtype: int64
>>> df['name']
01    ichiro
02      jiro
03    saburo
Name: name, dtype: object

また、レコード(行)を参照するためには、ix、locおよびilocを使うことができる。

>>> df.ix['01']
age         30
name    ichiro
Name: 01, dtype: object
>>> df.ix[0]
age         30
name    ichiro
Name: 01, dtype: object
>>> df.loc['01']
age         30
name    ichiro
Name: 01, dtype: object
>>> df.iloc[0]
age         30
name    ichiro
Name: 01, dtype: object

具体的には、ixは、ラベル('01', '02',および'03’)または通し番号(0,1,2)のどちらでもレコードを参照できるのに対し、locは、ラベルのみ、ilocは通し番号のみとなっている。一見、ixを使っていれば、特にlocやilocを使う必要はないように思えるが、ラベルが整数の場合は、ixはラベルしか使えなくなるというトリックがある。その場合は、loc(ラベル)とiloc(通し番号)で使い分けた方がよい。例えば次のような場合である。

>>> df = pd.DataFrame({'name':['ichiro','jiro','saburo'],'age':[30,25,20]},index=['01','02','03'])
>>> df.ix[0]
KeyError: 0
>>> df.loc[1]
age         30
name    ichiro
Name: 1, dtype: object
>>> df.iloc[1]
age       25
name    jiro
Name: 2, dtype: object

上記のように、ix[0]ではKeyErroが発生する。loc[1]は、ラベル1の1行目のレコードを参照し、iloc[1]は、通し番号1の2行目のレコードを参照している。

次に、DataFrameへの行及び列の追加は、Seriesを用いると簡単に出来る。
例えば、行の追加は、次のようになる。

>>> d=pd.Series(['shro',25],index=['name','age'],name='04')
>>> df=df.append(d)
>>> df
    age    name
01   30  ichiro
02   25    jiro
03   20  saburo
04   25    shro

また、例えば、列の追加は、次のようになる。

>>> d=pd.Series([175,173,170,165],index=['01','02','03','04'],name='height')
>>> df.T.append(d).T
   age    name height
01  30  ichiro    175
02  25    jiro    173
03  20  saburo    170
04  25    shro    165
>>> pd.concat([df,d],axis=1)
   age    name height
01  30  ichiro    175
02  25    jiro    173
03  20  saburo    170
04  25    shro    165

これまでは、既に値が入っているdataframeを扱っていたが、以下のようにすれば、まず空のdataframeを作り後から行を追加していくことができる。

>>> df = pd.DataFrame(columns=['sentence','score','predict'])
>>> d = pd.Series(['Good, works fine',1,0],index=df.columns)
>>> df = df.append(d, ignore_index=True)
>>> df = df.append(d, ignore_index=True)
>>> df = df.append(d, ignore_index=True)
>>> df
             sentence score predict
0  Good , works fine.     1       0
1  Good , works fine.     1       0
2  Good , works fine.     1       0

Ubuntuの覚え書き(flash playerプラグインのインストール編)

Ubuntu14.04のMozilla FirefoxFlash playerのプラグラインを入れてみた。
まず、下記のAdobeFlash playerのダウンロードサイトにアクセスしてみたが、Ubuntu用のパッケージ(debファイル)が見当たらない。
https://get2.adobe.com/jp/flashplayer/

そこで、apt-cacheで以下のように探してみた。

> apt-cache search adobe flash
texlive-latex-extra - TeX Live: LaTeX additional packages
flashplugin-installer - Adobe Flash Player plugin installer
flashplugin-downloader - Adobe Flash Player plugin installer (transitional package)
flashplugin-nonfree-extrasound - Adobe Flash Player platform support library for Esound and OSS
bleachbit - delete unnecessary files from the system
cclive - lightweight command line video extraction tool
libjs-swfobject - tool to embed Flash content into webpages
libquvi-dev - library for parsing video download links (development package)
libquvi-doc - library for parsing video download links (documentation package)
libquvi-scripts - library for parsing video download links (Lua scripts)
libquvi7 - library for parsing video download links (runtime libraries)
libvdpau-va-gl1 - VDPAU driver with OpenGL/VAAPI backend
nomnom - download videos from Youtube and other similar video websites
quvi - command line program to extract video download links
red5-doc - flash streaming server - documentation
red5-server - flash streaming server
konqueror-nsplugins - Netscape plugin support for Konqueror

flashplugin-installerという、それらしきものがあったので、インストールしてみたところ、下記のように、adobe-flashplugin_11.2.202.451.orig.tar.gzをダウンロードしてインストールしてくれた。

> sudo apt-get install flashplugin-installer
Preparing to unpack .../flashplugin-installer_11.2.202.451ubuntu0.14.04.1_amd64.deb ...
Unpacking flashplugin-installer (11.2.202.451ubuntu0.14.04.1) ...
Processing triggers for update-notifier-common (0.154.1ubuntu1) ...
flashplugin-installer: downloading http://archive.canonical.com/pool/partner/a/adobe-flashplugin/adobe-flashplugin_11.2.202.451.orig.tar.gz
Installing from local file /tmp/tmpHCLRfm.gz
Flash Plugin installed.
flashplugin-installer (11.2.202.451ubuntu0.14.04.1) を設定しています ...

Flash playerプラグインが動作しているか否かは、下記のページで確認することができる。
https://helpx.adobe.com/jp/flash-player/kb/235703.html