nvidia-dockerインストール、コンテナ等メモ

基本的に公式サイトの説明とかの通りにやるだけなんだけど自分用にメモ。

ホストOS:ubuntu 16.04LTS

dockerのインストール

参考: Get Docker for Ubuntu - Docker

# https通信で公開鍵ダウンロードするため
apt-get update
apt-get install curl ca-certificates

# dockerレポジトリの公開鍵の登録
curl -fsSL https://yum.dockerproject.org/gpg | apt-key add -

# add-apt-repositoryコマンドのインストール
apt-get install software-properties-common

# dockerレポジトリ追加
add-apt-repository "deb https://apt.dockerproject.org/repo/ ubuntu-$(lsb_release -cs) main"

# aptでhttps通信するため
apt-get install apt-transport-https

# dockerのインストール
apt-get update
apt-get install docker-engine

NVIDIAドライバのインストール

これが一番ハマって大変な場合が多い気がするが、ここでは省略。どうにかうまいことインストールする。

NVIDIA Dockerのインストール

# debパッケージのダウンロード(2017/1/22現在で最新のもの)
curl -LO https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0/nvidia-docker_1.0.0-1_amd64.deb
# インストール
dpkg -i nvidia-docker_1.0.0-1_amd64.deb
rm nvidia-docker_1.0.0-1_amd64.deb
# 動作確認(GPU情報が表示されると良い)
nvidia-docker run --rm nvidia/cuda nvidia-smi

バージョンについては下記ページでチェックして適宜ダウンロードするものを確認する。

Releases · NVIDIA/nvidia-docker · GitHub

NVIDIA Dockerコンテナメモ

便利なものがあれば随時追記予定。

C#で3次元グラフを表示する ILNumerics

ILNumericsは.NETで使用可能な数値計算等のライブラリである.グラフ表示機能も備わっているので,それを使ってC#のWindowsフォーム上に3次元グラフを表示する.

ILNumericsのインストール

現在最新バージョン(4.x系)のILNumericsは14日間のトライアル版以外は有償だが,Community Editionという無償版が提供されていた3.x系のバージョンNuGetでインストール可能なのでそれを使う.

まず,Visual StudioでWindowsフォームアプリケーションを作成する.

そして,プロジェクトを右クリックして「NuGetパッケージの管理」を選択する.オンラインから「ILNumerics」を検索・インストールする.

グラフ表示用コントロールの配置

フォームデザイナを開きツールボックスの適当なところで右クリックして「アイテムの選択(I)...」を選択する.

「.NET Framework コンポーネント」タブの「参照(B)...」ボタンを押して,「(ソリューションのパス)\packages\ILNumerics.3.3.3.0\lib\ILNumerics.dll」を選択したらOK.

するとツールボックスIL○○というコントロールが追加される.その中の,ILPanelコントロールをフォーム上に配置する.

f:id:whoopsidaisies:20141202163400p:plain

使ってみる

曲面

例として,以下の2変数関数を表示させてみる.
z=\frac{\sin(\sqrt{x^2+y^2})}{\sqrt{x^2+y^2}}

まず,コードの適当な場所に以下のusingを書いておく.

using ILNumerics.Drawing;
using ILNumerics.Drawing.Plotting;

そして,フォームロードイベントとかの適当なイベントに以下のコードを書く.

// グラフを格納するオブジェクトの生成
var scene = new ILScene
{
    // 3次元モードでプロット領域を生成
    new ILPlotCube(twoDMode: false)
    {
        // 曲面の生成
        new ILSurface(
            (x,y) => (float)(
                Math.Sin(Math.Sqrt(x*x + y*y))/Math.Sqrt(x*x + y*y)))
    }
};
// 描画用コントロールに生成したグラフをセット
ilPanel1.Scene = scene;

実行すると以下のように3次元グラフが表示される.マウスドラッグとかホイールとかで視点や拡大率を変えられる.

f:id:whoopsidaisies:20141202172655p:plain

等高線

サンプル用の地形データも用意されていて,以下のように使うことが出来る.

var scene = new ILScene
{
    new ILPlotCube(twoDMode: false){
        new ILSurface(ILNumerics.ILMath.tosingle(ILNumerics.ILSpecialData.terrain))
    }
};
ilPanel1.Scene = scene;

f:id:whoopsidaisies:20141202180125p:plain

ここまでは曲面表示のためILSurfaceクラスを使ってきたが,ILContourPlotクラスを使えば以下のように等高線表示も出来る.

var scene = new ILScene
{
    new ILPlotCube{
        new ILContourPlot(ILNumerics.ILMath.tosingle(ILNumerics.ILSpecialData.terrain))
    }
};
ilPanel1.Scene = scene;

f:id:whoopsidaisies:20141202180132p:plain

散布図

ILPointsクラスで散布図を表示させることも出来る.以下はランダムに点を打って対数軸にして表示した例.

ILNumerics.ILArray<float> p = ILNumerics.ILMath.tosingle(ILNumerics.ILMath.rand(3, 10000));
var scene = new ILScene{
    new ILPlotCube(twoDMode:false){
        new ILPoints
        {
            Positions = p,
            Color = null,
            Colors =  p,
            Size = 1,
        }
    }
};
var scaleModes = scene.First<ILPlotCube>().ScaleModes;
scaleModes.XAxisScale = AxisScale.Logarithmic;
scaleModes.YAxisScale = AxisScale.Logarithmic;
scaleModes.ZAxisScale = AxisScale.Logarithmic;

ilPanel1.Scene = scene;

f:id:whoopsidaisies:20141202182150p:plain

Python+OpenCVで特徴量記述・アルゴリズムまとめ

Python+OpenCVで画像の特徴点の特徴量を記述する.OpenCV2.4.9およびOpenCV3.0 alphaについて使用できるアルゴリズムをまとめる.

Python+OpenCVで特徴点抽出・使えるアルゴリズムまとめ OpenCV2.4.9と3.0 alpha - whoopsidaisies's diary
の続き.

環境

WindowsでOpenCV公式サイトのダウンロードページから2.4.9および3.0 alphaのビルド済みバイナリをダウンロードしてきて解凍したものを使う.

特徴量記述器の使い方

特徴点抽出のときのFeatureDetectorと同じように,特徴量記述についてもDescriptorExtractorという共通インターフェースが用意されている.

使い方は以下の通り.

# 引数でどの特徴量記述子を使うか指定 
extractor = cv2.DescriptorExtractor_create(extractor_name)
# 引数として画像と特徴点を渡す
# 戻り値は特徴点と特徴量
keypoints, descriptors = extractor.compute(img, keypoints)

DescriptorExtractor_createメソッドで指定出来る特徴量記述子を以下にまとめた.

OpenCVバージョン 実数ベクトル バイナリコード
2.4.9 SIFT, SURF BRIEF, BRISK, ORB, FREAK
3.0 alpha KAZE AKAZE, BRISK, ORB

(2.4.9でORBがなぜかランタイムエラーが出るので追々調査予定)

特徴量の中身

descriptorsの中身は2次元のarrayになっており,特徴点ごとに特徴量のベクトルが格納されている.

KAZEで記述した特徴量を表示してみるとこんな感じ(0番目の点).

>>descriptors[0]
array([ -7.38840317e-04,  -6.34267868e-04,   2.61819176e-03,
         3.50267510e-03,  -1.59906253e-04,  -4.56994586e-03,
         4.39605350e-03,   9.44076758e-03,  -1.75689301e-03,
         8.05667194e-04,   3.55383591e-03,   4.12554527e-03,
        -1.54193444e-03,   1.58668880e-03,   2.78847502e-03,
         3.14337271e-03,  -1.62520558e-02,   1.65848620e-02,
         3.65739577e-02,   2.07063138e-01,   2.64649391e-02,
        -6.13974873e-03,   9.64385048e-02,   2.91850477e-01,
         5.54781593e-02,   6.74537197e-03,   6.74520805e-02,
         8.45865980e-02,  -2.12559430e-03,   1.18403265e-03,
         5.09992335e-03,   4.04977519e-03,  -1.28035052e-02,
         6.93068025e-04,   3.93203236e-02,   4.54802722e-01,
        -2.96720478e-04,   6.83288351e-02,   8.15773308e-02,
         6.17026806e-01,  -1.08468741e-01,   5.95125668e-02,
         1.92962006e-01,   2.17324436e-01,  -1.21422755e-02,
         2.50244630e-03,   1.34693161e-02,   6.25377288e-03,
         2.55310140e-03,  -4.21544649e-02,   2.98030730e-02,
         1.50349155e-01,   4.27789390e-02,  -9.73087847e-02,
         1.63991615e-01,   1.90487400e-01,   3.39032081e-03,
        -2.32313443e-02,   1.98113456e-01,   6.58137947e-02,
        -1.16498368e-02,   2.66303378e-03,   1.25482017e-02,
         4.14769724e-03], dtype=float32)

グラフ表示だとこんな感じ.

import matplotlib.pyplot as plt
plt.plot(descriptors[0])

f:id:whoopsidaisies:20141201234637p:plain

KAZEは64次元の実数ベクトルで特徴量記述をするので以上のようになるが,記述子によってデータ量が違うため配列の長さや型が変わってくる.

Python+OpenCVで特徴点抽出・使えるアルゴリズムまとめ OpenCV2.4.9と3.0 alpha

軽量プログラミング言語が苦手なので敬遠していたが,世間ではPythonからOpenCVを呼ぶのが流行っているようなので,練習がてらOpenCVで使える特徴点抽出アルゴリズムをまとめてみる.

OpenCV2.4.9とOpenCV3.0 alphaについてまとめる.3.0 betaはなぜか動かなかったのでいつか暇があれば調査.

環境

WindowsでOpenCV公式サイトのダウンロードページから2.4.9および3.0 alphaのビルド済みバイナリをダウンロードしてきて解凍したものを使う.

PythonからのOpenCVの呼び出し方はこことかを参照.

特徴点抽出の使い方

OpenCVで実装されている特徴点抽出のアルゴリズムはいくつかあるが,FeatureDetectorという共通インターフェースを使うことでどのアルゴリズムでも同様の記述で使える.使い方は以下.

# 画像読み込み
img = cv2.imread('gazou.bmp')
# FeatureDetectorのインスタンスを生成
detector = cv2.FeatureDetector_create(detector_type)
# 特徴点を抽出
keypoints = detctor.detect(img)

FeatureDetector_createメソッドの引数にアルゴリズム名を文字列で渡すことで,どのアルゴリズムで特徴点抽出するかを選択することが出来る.例えば,ORBアルゴリズムで特徴点を抽出して表示するのは以下のようになる.

import cv2

img = cv2.imread('gazou.bmp')
# アルゴリズム名を引数で渡す
detector = cv2.FeatureDetector_create('ORB')
keypoints = detctor.detect(img)
# 画像への特徴点の書き込み
out = cv2.drawKeypoints(img, keypoints, None)
# 表示
cv2.imshow(name, out)
cv2.waitKey(0)

結果は以下のようになる.
f:id:whoopsidaisies:20141201024751p:plain

ちなみに特徴点の書き込み部分を以下のようにすると,特徴点のサイズと方向を表す円が描画される.

out = cv2.drawKeypoints(img, keypoints, None, None, cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

f:id:whoopsidaisies:20141201024104p:plain

FeatureDetectorインターフェースで使えるアルゴリズム

FeatureDetectorインターフェースで指定できる特徴点抽出アルゴリズムはOpenCVのバージョンで変わるようなので,OpenCV2.4.9で使えるものとOpenCV3.0 alphaで使えるものを以下にまとめる.

バージョン アルゴリズム名
2.4.9 BRISK, Dense, FAST, FASTX, GFTT, HARRIS, MSER, ORB, SIFT, STAR, SURF, SURF_OCL, SimpleBlob
3.0 alpha AKAZE, BRISK, FAST, GFTT, HARRIS, KAZE, MSER, ORB, SimpleBlob


C++版については以下の記事にまとめてある.
OpenCV3.0.0-alphaの特徴抽出・マッチングまとめ - whoopsidaisies's diary
OpenCVで画像の特徴抽出・マッチングを行う - whoopsidaisies's diary

C#で画像をWavelet変換 Accord.NET

C#で画像のWavelet変換を行う.コンピュータビジョン等の.NET向けのオープンソースのライブラリであるAccord.NET Frameworkを使う.

Accord.NETのインストール

NuGet経由でインストール可能.プロジェクトを右クリックして「NuGetパッケージの管理」を選択する.オンラインから「Accord.Imaging」を検索・インストール.

WaveletTransformクラス

Accord.NETのWaveletTransformクラスによってWavelet変換を行える.入力画像はグレースケールで,解像度が2のべき乗でないといけない.

ソースコード

WaveletTransformクラスの初期化時にWavelet母関数を指定する.その引数でWavelet変換のレベルを指定できる.ここではHaar関数でレベル2とした.

// 入力画像
var img = new Bitmap(@"Penguins.jpg");
// 画像の解像度が2のべき乗になるように調整
var bitWidth = Convert.ToString(img.Width - 1, 2).Length;
var bitHeight = Convert.ToString(img.Height - 1, 2).Length;
var width = (int)Math.Pow(2, bitWidth);
var height = (int)Math.Pow(2, bitHeight);
// 隙間の部分はゼロ埋め
var imgPadded = new Bitmap(width, height, img.PixelFormat);
var graphics = Graphics.FromImage(imgPadded);
graphics.DrawImage(img, 0, 0);
graphics.Dispose();
// グレースケール化
var gray = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721).Apply(imgPadded);
// Wavelet変換クラスの作成
//  Harrクラスの初期化時にレベルを指定出来る
var wavelet = new Accord.Imaging.Filters.WaveletTransform(new Accord.Math.Wavelets.Haar(2));
// Wavelet変換
var imgWavelet = wavelet.Apply(gray);
pictureBox1.Image = imgWavelet;

結果

f:id:whoopsidaisies:20141130095415p:plain

逆変換

WaveletTransformクラスのBackwordプロパティをtrueにしてApplyメソッドを実行すると逆変換が出来る.

wavelet.Backward = true;
var gyaku = wavelet.Apply(imgWavelet);

C#で画像を高速フーリエ変換 AForge.NET

C#で画像の高速フーリエ変換(FFT)を行う.コンピュータビジョン等のライブラリであるAForge.NET Frameworkを使う.

AForge.NETのインストール

Nuget経由でインストール可能.プロジェクトを右クリックして「NuGetパッケージの管理」を選択する.オンラインから「AForge」で検索.「AForge.Imaging」を選択してインストール.

ComplexImageクラス

AForge.NETのComplexImageクラスを使うと画像のFFTおよび逆FFTが出来る.入力する画像はグレースケールで解像度が2のべき乗になっている必要がある.

ソースコード

画像のグレースケール化はGrayscaleクラスを使った.

// 入力画像
var img = new Bitmap(@"Lighthouse.jpg");
pictureBox1.Image = img;
// 画像の解像度が2のべき乗になるように調整
var bitWidth = Convert.ToString(img.Width - 1, 2).Length;
var bitHeight = Convert.ToString(img.Height - 1, 2).Length;
var width = (int)Math.Pow(2, bitWidth);
var height = (int)Math.Pow(2, bitHeight);
// 隙間の部分はゼロ埋め
var imgPadded = new Bitmap(width, height, img.PixelFormat);
var graphics = Graphics.FromImage(imgPadded);
graphics.DrawImage(img, 0, 0);
graphics.Dispose();
// グレースケール化
var gray = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721).Apply(imgPadded);
pictureBox2.Image = gray;
// FFT
var complexImage = AForge.Imaging.ComplexImage.FromBitmap(gray);
complexImage.ForwardFourierTransform();
pictureBox3.Image = complexImage.ToBitmap();

結果画像

f:id:whoopsidaisies:20141130083904p:plain

FFT後の値

ComplexImageクラスのDataプロパティは2次元配列でFFT後の値が格納されている.また,BackwardFourierTransformメソッドで逆FFTを行える.

Visual Studioでデバッグ時にOpenCVのMat等の画像を表示できるプラグインが便利

OpenCV公式サイトのNEWSを見てたら「Image Watch plugin for Visual Studio」というのを見つけた.使ってみたら便利そうだったのでメモ.もっと早く知りたかった.

わざわざimshowとかのコードを追加してウィンドウを表示させなくてもMatの中の画像を確認できる.また,拡大表示とか画素値の表示も出来るため通常のOpenCVの画像表示用のウィンドウより便利な気がする.

Image Watch plugin for Visual Studioのインストール

以下のサイトからダウンロードしてきて指示にしたがってインストールするだけ.
Image Watch extension

以下のサイトに詳しい手順等載ってます.
Image Watchの使い方 | dandelion's log

使ってみる

以下のコードで試してみた.画像を表示させるためのコードは特に必要ない.画像が入っている変数があれば自動で表示してくれる.

#include <opencv2/opencv.hpp>

using namespace cv;

void main()
{
	// 画像読み込み
	Mat img = imread("Penguins.jpg");
	// Sobelフィルタ
	Mat imgSobel;
	Sobel(img, imgSobel, img.depth(), 1, 1);
	// ラプラシアンフィルタ
	Mat imgLaplacian;
	Laplacian(img, imgLaplacian, img.depth());
	// Cannyアルゴリズム
	Mat imgCanny;
	Canny(img, imgCanny, 50, 200);
}

一番下の行にブレークポイントを置いて,デバッグ実行して止める.

「表示」メニューの中から「Image Watch」を探してクリックしてウィンドウを表示させる.
f:id:whoopsidaisies:20141128173607p:plain

そうすると以下の様なウィンドウが出てきて,Mat型の変数とその中身の画像が表示される.
f:id:whoopsidaisies:20141128165602p:plain

左側に画像一覧があるので,クリックすれば以下のようにその画像が表示される.
f:id:whoopsidaisies:20141128165507p:plain

マウススクロールで拡大可能.
f:id:whoopsidaisies:20141128173940p:plain

最大まで拡大すると各画素の画素値が数字で表示される.
f:id:whoopsidaisies:20141128174024p:plain

画素を右クリックしたら,その画素のアドレスのコピーとかも出来るもよう.

以上のようにOpenCVのMatの中の画像を簡単に確認できるので,Visual StudioでOpenCVを使う場合はかなり便利だと思う.

試してないけど配布サイトの説明によると,cv::Mat_<>, CvMat, _IplImageなんかにも対応しているらしい.