のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

dlibで画像を認識させて、遊んでみた。

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

ついに、今回はdlibで遊んでみました。
※dlibとは何だ?と思う方は以下のページへ

nonbiri-tereka.hatenablog.com

基本的な構成

基本的の構成は以下のようになっており、よく使いそうな項目と
あるけどExamplesが存在しない項目の紹介となっています。

画像の読み込みと表示

画像を読み込んで窓に開いてみます。
C++の以下のコードで動作します。案外短かった。

しかし、コンパイルに結構手こずりました。
ライブラリを見ながら、リンクに何が不足しているのかを考えつつ、リンクしていきました。
(むしろCMakeを書くべきか・・・)

g++ -I/Users/Tereka/Programing/dlib/ -lpthread -ldlib -lblas augmentation.cpp

ソースコードは基本的にこれに追加する形式となります。

#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 const *argv[])
{
        array2d<rgb_pixel> img;
        //画像をファイルから読み込む。
        load_image(img, argv[1]);
        //窓を定義する。
        image_window window(img, "Original Image");
        //クローズするまで開く。
        window.wait_until_closed();
        return 0;
}

画像の処理をかけてみる。

画像処理を実施してみました。
コンパイルコマンドは前項のをお使いください。

今回使ったのは、flipとgaussian blurと呼ばれる画像の処理をかけてみました。

#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 const *argv[])
{
     array2d<rgb_pixel> img;
    //画像をファイルから読み込む。
    load_image(img, argv[1]);
    //窓を定義する。
    image_window window(img, "Original Image");
    //クローズするまで開く。
    window.wait_until_closed();

    array2d<rgb_pixel> fliped_image;

    flip_image_up_down(img,fliped_image);
    image_window window2(fliped_image, "Fliped Image");
    window2.wait_until_closed();

    array2d<rgb_pixel> gaussian_blur_img;

    gaussian_blur(img,gaussian_blur_img);
    image_window gaussian_window(gaussian_blur_img, "Gaussian Image");
    gaussian_window.wait_until_closed();
    return 0;
}

画像特徴に使われる処理を実施してみる。

Local Binary Pattern(LBP)とHog処理を実施してみます。

Selective Searchを実施してみました。
実はこれ、PythonにはExampleがありますが、なんと、C++にはExampleを用意してくれません。
ということで、ドキュメントを読みつつ、自分でコードを書いてみました。

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

using namespace std;
using namespace dlib;

int main(int argc, char const *argv[])
{
    array2d<rgb_pixel> img;
    //画像をファイルから読み込む。
    load_image(img, argv[1]);
    //窓を定義する。
    image_window window(img, "Original Image");
    //クローズするまで開く。
    window.wait_until_closed();
    std::vector<rectangle> rects;
    //Selective Search
    find_candidate_object_locations(img,rects);
    //四角形の描画
    for (int i = 0; i < rects.size(); i++)
    {
    	cout << rects[i].top() << endl;
    	rgb_pixel pixel(255,0,0);
    	draw_rectangle(img,rects[i],pixel);
    }
    //表示
    image_window selective_window(img, "Selective Search Image");
    selective_window.wait_until_closed();
    return 0;
}

find_candidate_object_locationsがSelective Searchの実行関数となります。
その結果は与えたrectsの中に格納されるので、その結果を描画しています。

f:id:tereka:20160714230810p:plain:w250f:id:tereka:20160714230823p:plain:w250

OpenCV連携

OpenCV連携についてです。dlibライブラリ自身でサポートしており、
OpenCVで使いたい場合はOpenCVのMat型、dlibの関数しかない場合はdlibの関数を使うなど
簡単にこの連携を実現できます。

g++ -O2 -I/Users/Tereka/Programing/dlib/ -lpthread -ldlib -lblas `pkg-config --cflags opencv` `pkg-config --libs opencv` opencv_test.cpp

基本的にはtoMatとcv_imageを使えばよいです。実装コードは以下となっています。

#include <opencv2/highgui/highgui.hpp>
#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include <dlib/image_transforms.h>
#include <dlib/opencv.h>

using namespace dlib;
using namespace cv;

int main(int argc, char const *argv[])
{
	Mat temp = imread(argv[1]);
        //OpenCV→dlib変換
	cv_image<bgr_pixel> cimg(temp);
        //dlib→OpenCV変換
	Mat convertedMat = toMat(cimg);
	return 0;
}

感想

dlib使いこなせると便利ですね。deep learningも実行でき、ある程度関数が整備されているので
C++であって非常に容易に複雑なアルゴリズムを実行することができます。