Dlib C++ Library に付属のサンプルプログラムで HoG を求める(Ubuntu 上)

HoG(Histogram of Oriented Gradients)は,画像中の局所領域における輝度勾配の方向をヒストグラム化した特徴量である。物体検出や画像認識において広く用いられている。本ページでは,Dlib C++ Library を用いて画像から HoG 特徴量を抽出する方法を説明する。

サイト内の関連ページ

用語説明

Ubuntu を使うとして手順を説明する.

前準備

Ubuntu のシステム更新

Ubuntu で OS のシステム更新を行うときは, 次のコマンドを実行.

# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを包括的に更新 (依存関係も考慮)
sudo apt full-upgrade
# 変更をシステム全体に確実に反映させるために再起動
sudo shutdown -r now

いくつかのパッケージのインストール

sudo apt install libx11-dev

DLib のインストール(Ubuntu 上)

DLib のインストール(Ubuntu 上): 別ページ »で説明

画像ファイル fruits.jpg, home.jpg のダウンロード

画像ファイル fruits.jpg, home.jpg のダウンロードは, Windows でコマンドプロンプト管理者として開き 次のコマンドを実行する.

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

上のコマンドがうまく実行できないときは, 別ページを参考にダウンロードを行う.

https://github.com/opencv/opencv/tree/master/samples/data で公開されている fruits.jpg, home.jpg を使用する(謝辞:画像の作者に感謝します)

HoG を標準出力に表示

dlib C++ Library を用いて HoG を求める。このプログラムは,第1引数で表示モード(0: 標準出力のみ,1: 標準出力とウィンドウ表示),第2引数で画像ファイル名を指定する。

#include<dlib/gui_widgets.h>
#include<dlib/image_io.h>
#include<dlib/image_transforms.h>

using namespace std;
using namespace dlib;

int main(int argc, char** argv)
{
        array2d<rgb_pixel> img;
        load_image(img, argv[2]);
        array2d<matrix<float,31,1> > hog;

        extract_fhog_features(img, hog);
	for(int j=1; j<hog.nr(); j++) {
	  for(int i=1; i<hog.nc(); i++) {
	    cout << i << "," << j << "," << hog[j][i] << endl;
	  }
	}

	if ( atoi(argv[1]) != 0 ) {
	  image_window winhog(draw_fhog(hog));
	  cin.get();
	}
}

上のソースコードを,a.cppのようなファイル名で保存し, 次の手順でビルドして実行

g++ -I/usr/local/include a.cpp -L/usr/local/lib -ldlib -lpthread -lX11
./a.out 0 home.jpg
./a.out 0 fruits.jpg

表示モード 0 では,HoG 特徴量が標準出力に出力される。各行は「x座標, y座標, 特徴ベクトル」の形式である。

./a.out 1 home.jpg
./a.out 1 fruits.jpg

表示モード 1 では,標準出力に加えて,HoG 特徴量を可視化したウィンドウが表示される。ウィンドウには各セルの勾配方向が描画される。