Fast SIFT Image Features Library のインストール(Ubuntu 上)

Fast SIFT Image Features Library(libsiftfast)は,SIFT 画像特徴量を計算するライブラリである.コマンドラインインタフェース(siftfast コマンド),Octave/MATLAB 用スクリプト,Python インタフェースを持つ.最新版は 1.2 である.

この Web ページで行うこと

SIFT 画像特徴量のうち座標値 (x,y) をプロットしたもの

前準備

Ubuntu のシステム更新

Ubuntu で OS のシステム更新を行うときは, 端末で,次のコマンドを実行する。これは、パッケージ情報を最新の状態に保ち、インストール済みのパッケージをセキュリティアップデートやバグ修正を含めて更新するためである。

Ubuntu のインストールはこちらの別ページで説明する。
# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを包括的に更新 (依存関係も考慮)
sudo apt full-upgrade
# カーネル更新等で実際に再起動が必要な場合のみ実行を推奨
# sudo shutdown -r now

C/C++ コンパイラと Make とビルドツールのインストール

ソースコードからビルドするには、C/C++ コンパイラ (通常は GCC) や make ユーティリティといった開発ツールが必要である。Ubuntu では、これらのツールは build-essential パッケージにまとめられている。インストールするには,端末で,次のコマンドを実行する。

sudo apt -y install build-essential libtool texinfo dpkg-dev pkg-config

libtool, texinfo, dpkg-dev, pkg-config は、ビルドやパッケージ管理の際に使用される開発関連ツールである。

cmake, curl のインストール(Ubuntu 上)

インストールするには, 端末で,次のコマンドを実行する.

# パッケージリストの情報を更新
sudo apt update
sudo apt -y install cmake cmake-curses-gui cmake-gui curl

Fast SIFT Image Features Library のインストール(ソースコードを使用)(Ubuntu 上)

  1. SourceForge の Fast SIFT Image Features Library の Web ページを開く

    利用条件などを確認する.

    http://sourceforge.net/projects/libsift/

  2. View all files」をクリックし,配布ファイルの一覧を確認する
  3. libsiftfast のインストール

    端末で,次のコマンドを実行する.ソースコードは 2009 年公開の 1.2 であるため,現在の GCC でビルドできるように -std=gnu++14-Wno-narrowing-fpermissive を指定している.

    cd /tmp
    curl -L -O https://sourceforge.net/projects/libsift/files/libsiftfast/libsiftfast-1.2/libsiftfast-1.2-src.tgz
    cd /usr/local
    sudo rm -rf libsiftfast-1.2-src
    sudo tar -xvzof /tmp/libsiftfast-1.2-src.tgz
    sudo chown -R $USER libsiftfast-1.2-src
    cd libsiftfast-1.2-src
    rm -rf build
    mkdir build
    cd build
    cmake -DCMAKE_VERBOSE_MAKEFILE=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-std=gnu++14 -Wno-narrowing -fpermissive" ..
    make
    sudo make install
    # 共有ライブラリのキャッシュを更新
    sudo ldconfig
    
  4. 結果の確認

    エラーメッセージが出ていないこと

  5. siftfast コマンドが使用できることの確認

    端末で,次のコマンドを実行する.インストール先のパスが表示されればよい.

    which siftfast
    

テスト実行(Ubuntu 上)

ここでサンプルとして使用する画像

curl コマンドを用いてダウンロードできる.あるいは Web ブラウザでもダウンロードできる.

curl -L https://github.com/opencv/opencv/blob/master/samples/data/fruits.jpg?raw=true -o fruits.jpg

テスト実行の手順

siftfast を使って PGM 画像ファイル(濃淡画像)から SIFT 特徴量を求める.siftfast コマンドは標準入力から PGM 形式の濃淡画像を読み込み,標準出力に特徴量を書き出す

  1. ImageMagick のインストール

    JPEG から PGM への変換に ImageMagick を使うので,ImageMagick のインストールを行っておく.

    インストールするには, 端末で,次のコマンドを実行する.

    # パッケージリストの情報を更新
    sudo apt update
    sudo apt -y install imagemagick
    

    Ubuntu の imagemagick パッケージは ImageMagick 6 であり,コマンド名は convertdisplay である.ImageMagick 7 を別途導入している場合は,convert の代わりに magickdisplay の代わりに magick display を使用する.

  2. テストに使う PGM 画像ファイルの準備と確認表示

    ImageMagick の convert コマンドを使い,PGM 画像ファイルに変換する.-colorspace Gray の指定により濃淡画像に変換される.

    convert fruits.jpg -colorspace Gray fruits.pgm
    display fruits.pgm
    
  3. siftfast を用いた SIFT 特徴量の算出.確認のため,結果の先頭 10 行を表示.
    siftfast < fruits.pgm > fruits.key
    head fruits.key
    
  4. 結果のファイルを整形

    出力ファイルでは 1 個の特徴量が複数行に分かれて記録されている.次のコマンドは,1 個の特徴量を 1 行にまとめる整形を行う.

    cat fruits.key | sed 's/^$/@/g' | tr -d '\n' | sed 's/@/\n/g' > fruits.sift
    head fruits.sift
    

Octave を起動し SIFT 特徴量を求める

  1. Octave のインストール

    端末で,次のコマンドを実行する.rgb2gray 関数を使うため,image パッケージも併せてインストールする.

    # パッケージリストの情報を更新
    sudo apt update
    sudo apt -y install octave octave-image
    
  2. ドキュメントの確認
    cat /usr/local/share/siftfast/octave/siftfast.m
    
  3. Octave を起動し siftfast 関数を使う

    *lena_std.jpg」の部分は画像ファイル名に書き換えて使う.

    curl -O https://www.kkaneko.jp/sample/lena_std.jpg
    octave
    

    Octave のプロンプトで,次を実行する.

    pkg load image
    addpath('/usr/local/share/siftfast/octave')
    
    rgb = imread("lena_std.jpg");
    mono = rgb2gray( rgb );
    colormap(gray(256));
    imshow(mono);
    
    MA = 1 / double( max(max( mono )) );
    [frames, descriptors] = siftfast( double(mono) * MA );
    

    * addpath の実行を忘れると,siftfast 関数が見つからず,次のようなエラーが出る.その場合は addpath を実行してから再度実行する.

  4. SIFT 画像特徴量のうち座標値 (x,y) をプロット

    frames1 行目が x 座標,2 行目が y 座標である.

    imshow(mono)
    hold on
    plot(frames(1,:), frames(2,:), 'r.')
    hold off