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

.fstファイルのラティス(単語グラフ)可視化

OpenFST Ubuntu

OpenFSTのファイル形式(.fst)は、グラフ描画ができる。

OpenFSTがインストールされていることが前提。インストール方法は

教師なし形態素解析ツールlatticelmのインストールと実行方法 - Akiraのメモ書き

を参照。

 

ラティスをps、pdf形式で出力する方法

.fstファイルを生成していた後の処理

 $ fstdraw --isymbols=syms.txt --osymbols=syms.txt fst.fst > fst.dot

 $ nkf -w fst.dot >fst.dot   文字コードUTF-8に変換する)

dotファイルをps形式に変換

 $ dot -Tps:cairo fst.dot >fst.ps

 -Tpsオプションのみでは「Warning: UTF-8 input uses non-Latin1 characters which cannot be handled by this PostScript driver」というエラーが発生する場合がある。

日本語フォントだと文字化けする → 「-Tps:cairo」で日本語フォント挿入できる。

 

参考:

 

psファイルのpdf化

$ ps2pdf fst.ps fst.pdf

直接PDFに変換

$ dot -Tpdf:cairo fst.dot >fst.pdf

 

※適宜コマンドが実行できない場合はソフトウェアをインストールする必要がある。

sudo apt-get install nkf graphviz

 

例えば、音節辞書を使ったJuliusの音声認識結果ラティスをグラフ化するとこのようになる。

f:id:ataniguchi:20170124013217p:plain

 

SLAM、Place categorization、Indoor navigation用データセット リンク集

ROS dataset Robot SLAM

移動ロボットを用いて取得されたSLAM、Place categorization、Indoor navigationなどのためのオープンデータセットをいくつか調べたので、まとめてみました。
(主に室内データセット

 rosbagファイルで公開されているデータセットはROSで利用可能

 

  • DATASET
    Cognitive navigation dataset
    ファイル形式:txt、jpg
    RGB-D sensor, color images and depth maps(深度画像)
  • List of RGBD datasets
    RGBD(カラー画像+深度)のデータセットのリンク集
    ・RGBD Datasets: Past, Present and Future
    ・Datasets capturing single objects
    ・Segmentation and pose estimation under controlled conditions
    Kinect data from the real world
    ・SLAM, registration and camera pose estimation
    ・Tracking
    ・Datasets involving humans: Body and hands
    ・Datasets involving humans: Head and face

 

 屋外データセット

 

今後も発見次第更新予定。


他のオープンデータセットをご存知でしたらコメントお願いします。

CaffeのPlacesCNNのリファレンスモデルで画像認識

Caffe Python Ubuntu

風景(屋外&屋内)のシーン画像データセットを基に学習されたCNNとして、PlacesCNNがある。

PlacesCNNの論文やデータは以下のサイトから見ることができる。

 

今回、ダウンロードしたリファレンスモデルは、Places205-CNNである。

Places205-CNNでは、205のシーンカテゴリを認識できる。

以下のサイトからDLできる。上記のMITのサイトからもDL可能。

AlexNet、GoogleNet、VCCの学習済みモデルが公開されている。

また、Hybrid-AlexNetという、ImageNetデータセットとPlaces detaset両方から学習されたモデルもある。これは、物体場所合わせて1183カテゴリを認識できる。

 

私は、Caffeで手軽に画像分類 - Yahoo! JAPAN Tech Blogのサイトにあったfeature.pyを参考にしたPythonプログラムを使用している。

そのプログラム内でMEAN_FILEを指定する必要があるが、DLしたリファレンスモデルのフォルダ内には.npyファイルが含まれていないので、.npyファイルを作る必要がある。

binaryproto形式からnpy形式への変換は以下のサイトを参考にした。

 

パス設定は以下のようにした。

MEAN_FILE =  './placesCNN/places205_mean.npy'
MODEL_FILE = './placesCNN/places205CNN_deploy.prototxt'
PRETRAINED = './placesCNN/places205CNN_iter_300000.caffemodel'

Places205-CNNの最終層を得たければ、feature.pyで以下のように指定すればよい。

Softmax関数をかけた後の認識結果が得られる。

LAYER = 'prob'

 

2016年最新のモデルでは、Places365というものもあるらしい。

 

 

教師なし形態素解析ツールlatticelmのインストールと実行方法

latticelm Ubuntu OpenFST

latticelmとは、Graham Neubig氏によって開発された、ノンパラメトリックベイズ法に基づくPitman-Yor言語モデルを用いた単語分割言語モデルの教師なし形態素解析ツール

latticelmでは、以下の論文に記載された手法が実装されている。

Graham Neubig, Masato Mimura, Shinsuke Mori, Tatsuya Kawahara, Learning a Language Model from Continuous Speech, In Proceedings of InterSpeech, 2010.

Nested Pitman-Yor Language Model (NPYLM)の拡張であり、ラティス(単語グラフ)から単語分割と言語モデルの学習を行うことができる。*1

これにより、例えば単語辞書や言語モデルが未知の言語の音声コーパスからでも、音素認識の誤りに対応しつつ、単語に分割された音声認識結果を得ることができる。

 

 ダウンロード、インストールは、latticelmのページから行うことができる。*2

また、OpenFSTという重み付き有限状態トランスデューサ(WFST)のライブラリのインストールが必要。*3

 

OpenFSTはREADMEまたはサイトのインストール手順に従って行う。

OSのバージョンやlatticelmのバージョンによって、対応するOpenFSTのバージョンが異なることがあるので注意。latticelm実行時にエラーがでるようなら、OpenFSTのバージョンを変更すると動く場合がある。

(Ubuntu 12.04 32bit : openfst1.4.1→latticelm :$make→エラー→openfst1.3.4に変更→OK)

(Ubuntu 14.04 64bit : v.1.3.4→エラー→1.4.1→エラー→latticelmをgitからDL→OK) 

 

opefstのディレクトリで以下を実行。

 ./configure

make

make check

sudo make install

 

latticelmはgitからDLする方がベター。

インストールはlatticelmのディレクトリで以下を実行。

 make

 

実行コマンド例

latticelm -input fst -filelist fst_gmm/fstlist.txt -prefix out/ -symbolfile fst/isyms.txt -burnin 50 -samps 100 -samprate 5 -annealsteps 10 -anneallength 15 -knownn 5 -unkn 5

 オプションで、ファイルディレクトリの指定やパラメータ値を指定することができる。

各パラメータについてはlatticelmのサイトを参照。

 

また、latticelmは、WFST形式ラティスのみならず、NPYLMと同様にテキストデータからでも実行可能。

/tutorial/にテキストおよびラティスからの実行方法とテスト用のデータ等は入っているので、まずはそれを実行してみると使い方がわかると思う。*4

/tutorial/1-wordseg/scriptには、unspace-text.plというテキスト文からスペース文字を抜くスクリプトもあるので便利。

 

テキスト実行コマンド例

$ nkf -w  --overwrite ./text.txt #文字コードUTF-8に変換

$ ~/latticelm/tutorial/1-wordseg/script/unspace-text.pl < ./text.txt > ./text.char #スペース文字を除去

$mkdir ./out  #出力用のoutフォルダを作成

$ latticelm -prefix out/ ./text.char

 

学習結果の出力

-prefixオプションで指定したoutフォルダに出力される。

  • samp.100:単語分割結果
  • sym.100:全単語のリスト
  • ulm.100:未知語モデル
  • wlm.100:単語モデル

未知語モデルと単語モデルは、ARPA 標準形式の N-gramモデルの模様。

 

latticelmのパスを通す

echo "PATH=$PATH:/home/*/latticelm" >> ~/.bashrc

*:ユーザネーム

 

[追記]OpenFSTのパスを通す

latticelmを実行したときに以下のエラーがでた場合

error while loading shared libraries: libfst.so.3: cannot open shared object file: No such file or directory

ライブラリのパスが通っていないので、パスを追加するとよい。

echo "export LD_LIBRARY_PATH=/usr/local/lib" >> ~/.bashrc

 or

echo "export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH;" >> ~/.bashrc

 

[追記2]乱数シードの変更

pylm.hで乱数シードをtimeで設定することによって、実行ごとに異なるサンプリング結果を得ることができるようになる。

#include <time.h>

rand()を呼び出している行の直前に以下を挿入

 srand( (unsigned)time(NULL) );  

 

TIPS

  • 良い結果を得るには、意外とオプションのパラメータ調整が効いてくる模様。
  • 焼きなまし、n-gram長あたりのパラメータを変えてみるとよい。
  • 適切なパラメータ値は、入力するラティスコーパスによって適宜異なるためその都度調整。(サンプリング数<パラメータ な感じで結果が依存する傾向。)
  • 入力データ、パラメータ値が同一だとサンプリング結果も同一のものが得られる。(乱数シードが同一なための模様。)

 ちなみに、開発者のgitにはlatticelm-v2なるものもあるが、こちらは開発中?

GitHub - neubig/latticelm-v2: Second version of latticelm, a tool for learning language models from lattices

 

 

*1:教師なし形態素解析では、事前に単語辞書や言語モデルを用意する必要はなく、データからそれらを推定する。

*2:現在の最新バージョンはlatticelm 0.4

*3:ラティスをWFSTの形式に変換し処理する

*4:チュートリアルのデータセットについては、テキストの方はデータ量が多いためかイテレーション速度が遅く、時間がかかる。ラティスの方はデータ量が少ないみたいなので、速い。

Caffeの学習済みモデルによる画像特徴抽出

Caffe Python Ubuntu

Caffe | Deep Learning Framework

The Berkeley Vision and Learning Centerが開発しているディープラーニング用のライブラリ

特に画像認識分野で近年成果を上げているConvolutional Neural Network (CNN)に特化している

CPUとGPUどちらでも動かすことができる*1*2

学習済みのリファレンスモデルがいくつか公開されているので、大量の画像データセットを用意できない人やコンピュータの計算能力が限られている人にも手軽に使うことができる。

 

 インストール

Ubuntuにインストールする場合は基本的にCaffeのサイトの手順で行えばできる
以下はUbuntu14.04の場合

git clone https://github.com/BVLC/Caffe.git 
sudo apt-get install g++-4.6
sudo apt-get install libatlas-base-dev
sudo apt-get install python-dev python-pip 

sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev

 

cd caffe
cp Makefile.config.example Makefile.config

コピーしたMakefile.configを編集

## Refer to http://caffe.berkeleyvision.org/installation.html

# Contributions simplifying and improving our build system are welcome!

# cuDNN acceleration switch (uncomment to build with cuDNN).

# USE_CUDNN := 1

# CPU-only switch (uncomment to build without GPU support).

CPU_ONLY := 1

# uncomment to disable IO dependencies and corresponding data layers

# USE_OPENCV := 0

# USE_LEVELDB := 0

# USE_LMDB := 0

# uncomment to allow MDB_NOLOCK when reading LMDB files (only if necessary)

#    You should not set this flag if you will be reading LMDBs with any

#    possibility of simultaneous read and write

# ALLOW_LMDB_NOLOCK := 1

# Uncomment if you're using OpenCV 3

OPENCV_VERSION := 3

# To customize your choice of compiler, uncomment and set the following.

# N.B. the default for Linux is g++ and the default for OSX is clang++

CUSTOM_CXX := g++-4.6

# CUDA directory contains bin/ and lib/ directories that we need.

#CUDA_DIR := /usr/local/cuda

# On Ubuntu 14.04, if cuda tools are installed via

# "sudo apt-get install nvidia-cuda-toolkit" then use this instead:

CUDA_DIR := /usr

Makefile.configは 環境に応じて変更すること

make
make test
make runtest

エラーが出なければインストール成功

 

 Pythonでimport caffeしたい場合は、

Ubuntu14.04へのCaffeのインストール - kivantium活動日記

Python関係のインストールの項目を参照

sudo apt-get install python-dev python-numpy python-skimage

make pycaffe

.bashrcにパスを通す

export PYTHONPATH=~/Caffe/python/:$PYTHONPATH

source ~/.bashrc

 

numpyのバージョンが違うとエラーが出た場合

RuntimeError: module compiled against API version a but this version of numpy is 9

http://nonbiri-tereka.hatenablog.com/entry/2015/04/27/114536

sudo pip install numpy --upgrade 

 

 リファレンスモデルの導入&中間層の特徴を抽出

caffeのビルドしたディレクトリ上で

./data/ilsvrc12/get_ilsvrc_aux.sh

 

ここからが少しややこしい。私がインストールした時点(2016/6/21)ではCaffeのファイル構成が微妙に参考サイトのものと違っていたりした。

 

examples/imagenetディレクトリでget_caffe_reference_imagenet_model.shを実行

→ないので、下記を実行

wget https://raw.githubusercontent.com/sguada/caffe-public/master/models/get_caffe_reference_imagenet_model.sh

chmod u+x get_caffe_reference_imagenet_model.sh

./get_caffe_reference_imagenet_model.sh

 

このコードで取得するのはILSVRC2012データセットのImageNetモデル

cd ~/Caffe/data/ilsvrc12/

./get_ilsvrc_aux.sh

cd ~/Caffe/examples/imagenet/

wget https://raw.githubusercontent.com/aybassiouny/wincaffe-cmake/master/examples/imagenet/imagenet_deploy.prototxt

cp imagenet_deploy.prototxt imagenet_feature.prototxt

emacs ./imagenet_feature.prototxt &

 imagenet_feature.prototxtを以下のように編集*3

  • layersのnameが"fc6" ⇒ topの値を"fc6"から"fc6wi"に変更
  • layersのnameが"relu6" ⇒ bottomの値を"fc6"から"fc6wi"に変更

ちなみに、ImageNetモデルでは中間層はfc6とfc7がある。

文献によっては、fc7の層から特徴を抽出している場合もあるようだ。

 

Caffeで手軽に画像分類 - Yahoo! JAPAN Tech Blogのサイトにあったfeature.pyを実行してみたが、caffeのバージョンの問題で動かなかった関数があったため、以下のように変更した。

feature.py

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, os.path, numpy, caffe

#FULL PATH
MEAN_FILE = '~/Caffe/python/caffe/imagenet/ilsvrc_2012_mean.npy'
MODEL_FILE = '~/Caffe/examples/imagenet/imagenet_feature.prototxt'
PRETRAINED = '~/Caffe/examples/imagenet/caffe_reference_imagenet_model'
LAYER = 'fc6wi'
INDEX = 4

net = caffe.Classifier(MODEL_FILE, PRETRAINED)
caffe.set_mode_cpu()
net.transformer.set_mean('data', numpy.load(MEAN_FILE))
net.transformer.set_raw_scale('data', 255)
net.transformer.set_channel_swap('data', (2,1,0))

image = caffe.io.load_image(sys.argv[1])
net.predict([ image ])
feat = net.blobs[LAYER].data[INDEX].flatten().tolist()
print(' '.join(map(str, feat)))

 

 テスト用にダウンロードする画像データセット*4

wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz

tar xf 101_ObjectCategories.tar.gz

 

実行例

python feature.py 101_ObjectCategories/airplanes/image_0001.jpg > tmp.txt

 tmp.txtに4096次元の数値データが保存できていれば成功

 

 

 feature.pyを実行した際のエラー対処にはこのサイトが役立った

OSX10.10でCaffeをインストール、リファレンスモデルで画像を分類 - Qiita

 classify.pyを使用して画像分類の項目を参照。

caffe/python/caffe/io.pyの該当部分を古いバージョンのCaffeのコードに直せばよいらしい。

 

 

 公開されているリファレンスモデル(学習済みモデル)は以下のサイトから探すことができる

Model Zoo · BVLC/caffe Wiki · GitHub

 

参考サイト

*1:CPUで動かしたい場合、インストール時に設定が必要

*2:GPU使用の場合はCUDAが必要だが、CPUのみ使用する場合はCUDAをインストールする必要はない。UbuntuではCUDAのライブラリをインストールするとディスプレイ関係(?)にエラーが出る場合があるらしいので注意。

*3:参考サイトで行われていた方法。必ずこの変更が必要かどうかは要検証。

*4:CaffeはOpenCVの関数を使用して画像を開くため、OpenCVに対応した画像フォーマットであればCaffeで使用可能のはず。

Ubuntu 14.04にOpenCV 3.1.0をインストール

OpenCV Python Ubuntu

Ubuntu 14.04 LTS(64bit)にOpenCV 3.1.0をインストールするときのメモ*1

今回は、Python 2.7.6でSIFT特徴が取れるようにする。

 

参考サイト

Ubuntu14.04にpython用にOpenCV3.0.0をインストール - Qiita

OpenCV3.0とopencv_contribをubuntuに入れた作業メモ - Qiita

UbuntuでOpenCV3.0をコンパイルする - 動かざることバグの如し

 

必要なライブラリのインストール

sudo apt-get -y install libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff4-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip

ソースファイルのダウンロード

wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/3.1.0/opencv-3.1.0.zip
unzip opencv-3.1.0.zip

opencv_contribのダウンロード

git clone --depth 1 https://github.com/Itseez/opencv_contrib.git opencv_contrib

 

.bashrcに以下を追加

export PYTHON_INCLUDE_DIRS=/usr/include/python2.7

export PYTHON_LIBRARYS=/usr/lib/x86_64-linux-gnu/libpython2.7.so

 

インストール

cd opencv-3.1.0
mkdir build
cd build

 

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules ..

 

make -j $(nproc)

sudo make install

sudo ldconfig

 $(nproc)はコア数*2

 

あと他に必要かもしれなそうなこと

sudo cp ~/opencv-3.1.0/build/lib/cv2.so /usr/local/lib/python2.7/site-packages/

 

sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'

 

Pythonで使えるようになったかどうかは、参考サイトの動作確認のコードを実行

OpenCV3.0とopencv_contribをubuntuに入れた作業メモ - Qiita

 

cppファイルのコンパイル方法

g++ -o sample ./sample.cpp  -ggdb `pkg-config --cflags opencv` `pkg-config --libs opencv`

 

OpenCVでSIFTやSURFを使う場合、バージョンによって関数名が違う場合があるので注意。

*1:自分の環境のUbuntu14.04だとOpenCV 3.0.0はエラーが出た。3.1.0にするとすんなりできた。

*2:-j オプションで並列処理のコア数を指定できるらしい。