可変ブログ

色々メモとか。とりあえず自分が分かるように。その後、なるべく人が見て分かるように。可変。

WindowsにUbuntuの仮想環境を導入する。

Windows10にUbuntu14.04の仮想環境を導入します。
取りあえず流れだけ。と言いつつ、だいたいこれがほとんどです。


環境

  • Windows10
  • Ubuntu14.04



流れ

  • UbuntuのOSイメージをダウンロードする。
  • 仮想環境構築ソフトをインストールする。
  • 仮想環境構築ソフトとOSイメージを使って仮想環境を構築する。



USB切替機を自作する。

メインのPCに加えてラズベリーパイをいじるようになりました。
まあラズベリーパイならメインのPCから遠隔操作すればいいのですが、そこに最近はSurfaceが追加されてキーボードマウスがもう一セット必要になってしまいました。
予備キーボードマウスはあるっちゃあるんですが、置くスペースもないし、何よりいちいち使い分けるのが非常に面倒です。
そこでUSB機器を複数のPCで切り替えられるUSB切替機を探してみたんですが、なぜかすごく高い。4つ切り替える切替機で1万とかします。(今はなんかすごく安くなっていますね。探し方が悪かったのかも。)
ということで、そんな高いもん買うならと思い、作ってみました。
作り終わってから記事にしようと思いついたので画像は完成したものしかありません。完成したものしかないといいつつ画像は今度アップロードします。


材料

  • ケース
  • 配線
  • オス―オスUSB端子 3つ
  • メス―メスUSB端子
  • ユニバーサル基盤
  • ロータリースイッチ



作り方

原理は簡単。単純にUSBの4端子をロータリースイッチで切り替えるだけです。
回路図は以下の通り。



他の人が自作しているものを見ると、グランドが共通だったり電源が共通だったりしますが、
電位のズレによる電流の逆流等が怖いので、電源もグランドも信号線ごとすべて切替えます。(本当はスイッチングノイズ対策とかしたほうがいいのかも)
そのためロータリースイッチは4回路3接点のものを使います。
ロータリースイッチの回路図は以下の通り。



家には電動ドリルなんてものはないので、ミニリューターとやすりとデザインナイフで頑張ってケースに穴をあけます。
メス―メスUSB端子とオス―オスUSB端子を無理やり分解して端子の部分に無理やり半田します。
伸ばした配線をロータリースイッチに半田してケースに収めて完成です。



今のところ問題なく使えてますが、やっぱり既製品を買ったほうが良いでしょう。
既製品は何より、PCやUSB機器を壊す心配がないのがいいですね。
今なら4分岐を2000円くらいで買えるようです。というか結局買っちゃいました。↓


Amazon CAPTCHA

OpenCVを使ったカメラの歪み補正。

OpenCV3.1を使ってカメラの歪み補正を行う。
取りあえず流れだけ。


環境




流れ

  • チェスボードの画像を用意する。
  • チェスボードのコーナーを検出する。
  • 検出したコーナーの情報の精度を上げる。(サブピクセル精度。)
  • チェスボードのコーナーの世界座標系を指定する。(要はチェスボードのマス目の現実での大きさを指定する。)
  • これらの情報からカメラの内部パラメータを取得する。
  • 取得したパラメータを使ってキャリブレーション



OpenCV3.2とcontribをWin10に導入してビルドしてサンプル実行。

 Win10にOpenCV3.2を導入します。基本的に導入方法はどのバージョンでも同じだと思います。


環境



流れ

  • Visual Studio Community 2015をインストールする。
  • Cmakeをインストールする。
  • OpenCV3.2のソースをダウンロードする。
  • OpenCV3.2のcontribのソースをダウンロードする。
  • Cmakeを使って自分の環境にあったOpenCVのソースを作る。
  • Visual Studioを使ってソースをビルドする。
  • ビルドしてできたDLLのパスを通して、ヘッダーとライブラリをVisual Studioで指定する。
  • サンプルプログラムをビルドする。



Visual Studio Community 2015をインストールする。

Visual Studioの公式サイトからインストーラをダウンロードして、インストールします。
インストールの方法は特に変わったことはありません。インストーラに従ってインストールしてください。


Cmakeをインストールする。

公式サイトから自分環境にあったzipをダウンロードします。
これは特にインストールとか必要なく、解凍するだけでOKです。


OpenCV3.2のソースをダウンロードする。

OpenCVの公式サイトから3.2のWindow版をダウンロードします。
OpenCVGitHubからダウンロードしても同じだと思っていたのですが、うまくいかなかったので公式サイトからダウンロードしましょう。
ダウンロードしたら解凍して、適当な場所に置きます。置く場所はどこでもいいです。(多分)
今回はCドライブの直下に置いてフォルダ名をopencv320に変えておきます。


OpenCV3.2のcontribのソースをダウンロードする。

contribのソースはGitHubからダウンロードします。

ここのサイトから

opencv_contrib → release → 3.2.0と飛んで、

Source code (zip)をクリックしてダウンロードします。
ダウンロードしたら解凍して、適当な場所に置きます。置く場所はどこでもいいです。(多分)
今回はCドライブの直下に置いてフォルダ名をopencv_contrib320に変えておきます。


Cmakeを使って自分の環境にあったOpenCVのソースを作る。

Cmakeを解凍したフォルダの中のbinフォルダのcmake-gui.exeを実行します。
そしたら、Where is the source code:の欄にダウンロードしたOpenCVのソースを指定します。
今回は

C:/opencv320/sources

となります。
その下の欄のWhere to build the binaries:には

C:/opencv320/build

と入力します。これはビルドされるバイナリが保存される場所になります。
その後、Configureをクリックします。
コンパイラ環境を聞かれると思うのでVisual Studio 2015を選びます。86と付いているのは32bit版で何もついてないのは64bit版です。
すると、赤くずらずらと出てきます。
これはどういう風にOpenCVをインストールするかといったオプションです。(多分)
まず、Pythonは入っていないのでPython関係のチェックを外します。
NvidiaGPUも積んでないのでWITH_CUDAのチェックを外します。
それと何故かBUILD_opencv_hdfにチェックが入っているとビルドで失敗するのでチェックを外す。
contribのフォルダを指定します。OPENCV_EXTRA_MODULES_PATHに以下を指定します。

C:/opencv_contrib320/modules

そしたら再びConfigureを押します。
その後Generateをクリックします。
すると、自分の環境にあったソースのソリューションファイルが生成されます。


Visual Studioを使ってソースをビルドする。

CmakeのOpen Projectボタンを押すか、もしくはC:/opencv320/buildの中に生成されているOpenCV.slnをVisual Studioで開きます。
メニューバーのビルドを押してバッチビルドを選択します。そしたら、INSTALLをDebugとReleaseのどちらもチェックしてビルドボタンを押す。
ビルドが終わるのをしばらく待ってエラーなく終了したら成功です。


ビルドしてできたDLLのパスを通して、ヘッダーとライブラリをVisual Studioで指定する。

ビルドして生成されたもので本当に必要なのは3種類です。(多分)
『ヘッダファイル』(拡張子.hpp)と『ライブラリファイル』(拡張子.lib)と『ダイナミックリンクライブラリ』(拡張子.dll)の3つです。
それ以外のファイルはダウンロードしたものを含めて全て削除しても多分大丈夫です。(サンプルプログラムとかサンプルコードは別として)
ヘッダファイルはOpenCVに使われている関数とかの定義が書いてあるファイル。(多分)
ライブラリファイルは関数とかの内容が書かれているファイル。(多分)
ダイナミックリンクライブラリはOpenCVでビルドされたプログラムを実行するときに一緒に実行されるファイル。(多分)
つまり、ビルド時にはヘッダファイルとライブラリファイルが必要で、実行時にはダイナミックリンクライブラリが必要になります。(多分)
この3つのファイルをうまく配置指定してやる必要があります。

ダイナミックリンクライブラリのパスを通す。

ダイナミックリンクライブラリはC:/opencv320/build/install/binの中に有ります。プログラムを実行するのはWindowsなのでこのフォルダをWindowsに教えてやる必要があります。
Windowsのスタートボタンを右クリックしてシステムを選択します。
左の欄のシステムの詳細設定をクリック。詳細設定のタブの一番下の環境変数をクリック。
システムの環境変数の中のPathを選択して編集を押します。
新規を押して、

C:/opencv320/build/install/bin

と入力してOK。パソコンを再起動します。

もう一つの方法として、C:/opencv320/build/install/binの中にある.dllのファイルを
64bitでビルドしたならC:\Windows\System32に
32bitでビルドしたならC:\Windows\SysWOW64に
コピーしても良いようです。

ヘッダファイルの指定

ヘッダファイルはC:/opencv320/build/install/includeの中に有ります。プログラムをビルドするのはVisual StudioなのでこのフォルダをVisual Studioに教えてやる必要があります。
まずVisual Studioで適当なプロジェクトを作成します。
ファイル → 新規作成 → プロジェクト
Visual C++で空のプロジェクトを選んで名前を適当付けます。今回はopencv-testとします。
そしたらソリューションエクスプローラーの欄でopencv-testを右クリックしてプロパティを選択します。
構成ですべての構成を選んでC/C++を選択します。追加のインクルードディレクトリに以下を追加します。

C:/opencv320/build/install/include

ライブラリファイルの指定

ヘッダファイルはC:/opencv320/build/install/libの中に有ります。プログラムをビルドするのはVisual StudioなのでこのフォルダをVisual Studioに教えてやる必要があります。
ライブラリファイルの指定はコード上に書いて指定することができます。
面倒なので全てのライブラリを指定します。
コードの一番上に以下のように記述します。

#ifdef _DEBUG
//Debugモードの場合
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_aruco320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_bgsegm320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_calib3d320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_ccalib320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_core320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_datasets320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_dnn320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_dpm320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_face320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_features2d320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_flann320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_fuzzy320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_highgui320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_imgcodecs320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_imgproc320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_line_descriptor320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_ml320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_objdetect320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_optflow320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_photo320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_plot320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_reg320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_rgbd320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_saliency320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_shape320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_stereo320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_stitching320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_structured_light320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_superres320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_surface_matching320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_text320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_tracking320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_video320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_videoio320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_videostab320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_xfeatures2d320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_ximgproc320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_xobjdetect320d.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_xphoto320d.lib") // opencv_core
#else											  
//Releaseモードの場合								
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_aruco320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_bgsegm320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_calib3d320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_ccalib320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_core320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_datasets320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_dnn320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_dpm320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_face320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_features2d320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_flann320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_fuzzy320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_highgui320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_imgcodecs320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_imgproc320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_line_descriptor320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_ml320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_objdetect320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_optflow320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_photo320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_plot320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_reg320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_rgbd320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_saliency320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_shape320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_stereo320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_stitching320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_structured_light320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_superres320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_surface_matching320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_text320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_tracking320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_video320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_videoio320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_videostab320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_xfeatures2d320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_ximgproc320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_xobjdetect320.lib")
#pragma comment(lib,"C:\\opencv320\\build\\install\\x86\\vc14\\lib\\opencv_xphoto320.lib")
#endif


もしくは、もう一つの方法としてヘッダファイルの時と同じように、プロパティを開きリンカーの追加のライブラリディレクトリに

C:/opencv320/build/install/x86/vc14/lib

を追加します。
次にリンカーの入力の追加の依存ファイルにlibフォルダの中身を追加します。構成のDebugかReleaseかによって追加するファイルを分けてください。
opencv_xxxd.libはDebugに、opencv_xxx.libはReleaseといった感じに追加してください。

サンプルプログラムをビルドする。

ここまできたらOpenCVを使えるはずです。
適当なサンプルコードを貼っつけてビルドできたら成功です。
サンプルコードは↓



OpenCVあれこれ。

OpenCVでよく使う色んな物を適当に追加していく。


  • cvtColor()

【参考URL】
【OpenCV】色変換(cvCvtColor)の組合せ 画像処理ソリューション

cvtColor(src_image, dest_image, CV_BGR2GRAY);

src_imageの色空間を変換してdest_imageに出力する。CV_BGR2GRAYならカラーをグレースケールに。RAW画像を使えば『CV_BayerGB2RGB』,『CV_BayerRG2RGB』,『CV_BayerGR2RGB』のどれかでカラー画像にもできる。そのときはベイヤーパターンに注意。


  • VideoCapture



  • resize()



  • rectを使ったトリミング

OpenCVのVideoWriterを使って画像から動画を作る。

連続した画像(パラパラ漫画のうような画像)から一つの動画を作ったのでメモを残しときます。


環境



流れ

  • VideoWriterのクラスがあるライブラリをインクルードする。
  • 動画ファイルの箱を作る。
  • 動画ファイルが正しく開けているか確認する。
  • 動画ファイルに画像を追加していく。



VideoWriterクラスについて

コンストラクタで箱となる動画ファイルを作って設定を行います。

VideoWriter::VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true)


【引数の説明】

引数 説明
filename 書き出すファイル名。
fourcc コーデックを指定するための関数。(4つの文字を引数に取ります。)
fps 動画像のフレームレート。(=1秒あたりのフレーム数)
frameSize 動画像の縦横サイズ。
isColor カラーの動画像ファイルとして書き出すかを指定する。


fourccは実際にはこう使います。

VideoWriter::fourcc('W', 'M', 'V', '1')


引数となる4つの文字は以下の通り。

コーデック名 引数 拡張子
MP4S ('M', 'P', '4', 'S') .mp4
MP4V ('M', 'P', '4', 'V') .mp4
DIV3 ('D', 'I', 'V', '3') .avi
DIVX ('D', 'I', 'V', 'X') .avi
I420 ('I', '4', '2', '0') .avi
IYUV ('I', 'Y', 'U', 'V') .avi
MJPG ('M', 'J', 'P', 'G') .avi
PIM1 ('P', 'I', 'M', '1') .avi
XVID ('X', 'V', 'I', 'D') .avi
dv25 ('d', 'v', '2', '5') .wmv
dv50 ('d', 'v', '5', '0') .wmv
dvc ('d', 'v', 'c', ' ') .wmv
dvh1 ('d', 'v', 'h', '1') .wmv
dvhd ('d', 'v', 'h', 'd') .wmv
dvsd ('d', 'v', 's', 'd') .wmv
dvsl ('d', 'v', 's', 'l') .wmv
H263 ('H', '2', '6', '3') .wmv
M4S2 ('M', '4', 'S', '2') .wmv
MP43 ('M', 'P', '4', '3') .wmv
MPG1 ('M', 'P', 'G', '1') .wmv
MSS1 ('M', 'S', 'S', '1') .wmv
MSS2 ('M', 'S', 'S', '2') .wmv
WMV1 ('W', 'M', 'V', '1') .wmv
WMV2 ('W', 'M', 'V', '2') .wmv
WMV3 ('W', 'M', 'V', '3') .wmv
WVC1 ('W', 'V', 'C', '1') .wmv
mp4v ('m', 'p', '4', 'v') .mov



サンプルプログラム

下記のサンプルプログラムは『C:\log\』にある『0000000.jpg』『0000001.jpg』『0000002.jpg』...といった画像を一つの動画にして『C:\Users\shibafu\Documents\OutVideo.wmv』というファイルに出力するプログラムです。

#include "opencv2/highgui.hpp"
#include "opencv2/Videoio.hpp"
#include <opencv2/core.hpp>

#include <stdio.h>
#include <iostream>

using namespace std;
using namespace cv;

int main(){
	//出力する動画ファイルの設定をします。拡張子はWMV1で、毎秒15フレーム、画像縦横サイズは1024*1024。
	VideoWriter writer("C:\\Users\\shibafu\\Documents\\OutVideo.wmv", VideoWriter::fourcc('W', 'M', 'V', '1'), 15.0, Size(1024, 1024));
	//動画ファイルがちゃんと作れたかの判定。
	if (!writer.isOpened()){ return -1; }

	//動画にする画像の名前を入れる文字配列。
	char image_name[100];
	//動画にする画像を入れるMat。
	Mat image;

	//『0000000.jpg』から『0001000.jpg』までの画像を動画にしていく。
	for (int i = 0; i < 1001; i++){
		//画像の名前を更新。
		sprintf(image_name, "C:\\log\\%07d.jpg", i);
		//名前に対応した画像を取り込み。
		image = imread(image_name);

		//画像がなければ処理を飛ばす。
		if (image.empty()) {
			cout << "no image : " << image_name << endl;
			continue;
		}

		//動画ファイルに画像を出力。
		writer << image;
	}
	return 0;
}

まっさらな状態からUbuntu14.04LTSでChainerのFaster-RCNNを使って物体検出

 Faster-RCNNを実装したのでそのメモを残します。
 なるべく初めてでもできるように、まっさらな状態から環境構築して実装までやっていきます。が、この分野の知識が全くない状態から始めているので、間違いがあるかもしれません。気をつけてね。
 ちなみにCaffeじゃなくてChainerを選んだ理由は導入が簡単だったからです。最初Caffeでもやろうとしたけど挫折しました。Caffeはまた時間があるときに再挑戦してみます。

 とりあえず投稿したけど、書きかけでまだわかりづらいところもあると思うので、時間があるときに加筆修正したいと思います。長いから記事を分けるかも。


環境

【ハードウェア環境】
  • Quadro6000
【実装したソフト環境】
  • Ubuntu14.04LTS
  • Anaconda3-4.1.1(Python
  • CUDA8.0
  • cuDNN5.1
  • OpenCV3.1
  • Chainer(バージョン不明)



全体の流れ

 実装までの流れは以下の通り。
 Ubuntu14.04LTSのインストールから始めて、実際にデモを動かすところまでやります。

  • Ubuntu14.04LTSをインストール、設定する。
  • pyenvをインストールする。
  • Anaconda3-4.1.1をインストールする。
  • OpenCV3.1をインストールする。
  • Nouveauドライバを無効化する。
  • CUDAをインストールする。(Nvidiaドライバのインストール含む。)
  • cuDNNをインストールする。
  • Chainerをインストールする。
  • Faster-RCNNをインストールする。
  • 実装する。



Ubuntu14.04LTSをインストールする。

 Chainerを動かすためのOSをインストールします。
 が、申し訳ありませんが今回インストール手順は説明してません。また今度別記事にて説明する予定です。


pyenvをインストールする。

 Ubuntu14.04LTSをインストールしたらさっそくPython管理ツール『pyenv』というものをインストールします。
 Faster-RCNNを実装するにはPythonにいろんなパッケージをインストールしなきゃいけない。そのパッケージそれぞれが導入に結構なハードルがあって一つ一ついれていくのはかなり面倒。
 そこで元からいろんなパッケージが入ったお得セットみたいなPythonがある。それがAnacondaです。そして、このAnacondaと普通のPythonをお手軽に切り替えることができるソフトがpyenv(PYthon ENVironmentの頭文字かな?)というもの。(私個人の理解なので、間違った認識をしているかもしれません。)
 今回の実装ではAnacondaを使うのでPythonの切り替えにpyenvを使います。

【導入方法】

 まず、以下の操作をしてUbuntu14.04LTSに入っているいろんなソフト(パッケージ)やら何やらを最新にします。
 Control + Alt + T を押してターミナルを起動して、以下のコマンドを一行ずつ打ち込みます。

sudo apt-get update
sudo apt-get upgrade

 これが終わったら次にpyenvをインストールするためにgitのインストールを行います。下記のコマンドを打ち込んでください。

sudo apt-get install git

 次に、gitを使ってpyenvをcloneします。

git clone https://github.com/yyuu/pyenv.git ~/.pyenv

 cloneしたpyenvのパスを通します。

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc

 これでpyenvがインストールされました。


Anacondaをインストールする。

【参考記事】

 次にAnaconda3-4.1.1をインストールします。
 pyenvのインストールでも書いたが、Anacondaはいろいろ入ったお得なPythonセットのようなものだ。これを入れることで、OpenCVの導入もものすごく簡単になる。

【導入方法】

 Anacondaの導入はpyenvを使って行う。
 まず、下記のコマンドでインストールできるAnacondaのバージョン一覧を確認する。

pyenv install -l | grep anaconda3

 すると、このように一覧が表示されると思う。

  anaconda3-2.0.0
  anaconda3-2.0.1
  anaconda3-2.1.0
  anaconda3-2.2.0
  anaconda3-2.3.0
  anaconda3-2.4.0
  anaconda3-2.4.1
  anaconda3-2.5.0
  anaconda3-4.0.0
  anaconda3-4.1.0
  anaconda3-4.1.1

 そしたら、この中から最新のバージョンを選び下記のコマンドでインストールしよう。この記事を書いたときはAnaconda3-4.1.1が最新だったのでそれをインストールする。

pyenv install anaconda3-4.1.1

 すると、

Downloading Anaconda3-4.1.1-Linux-x86-64.sh...
-> https://repo.continuum.io/archive/Anaconda3-4.1.1-Linux-x86-64.sh

 と出てしばらく止まったままだけどちゃんと動いるので、待ちます。
 その後、

Installing Anaconda3-4.1.1-Linux-x86-64...
Installed Anaconda3-4.1.1-Linux-x86-64 to ○○

 と表示されたらリハッシュします。

pyenv rehash

 これでインストール完了です。
 ちゃんとインストールされたか確認します。下のコマンドで、UbuntuにインストールされているPythonの一覧が表示されます。

pyenv versions

 Pythonを切り替えるには

pyenv global anaconda3-4.1.1

 切り替わったかの確認

pyenv version

 pyenvではなくPython側からも確認できる。

python --version

 Anacondaと表示されていれば成功。


OpenCV3.1をインストールする。

【参考記事】

 Anacondaが入ったら次はOpenCVのインストールをする。
 これはAnacondaが入っていることが前提です。
 とっても簡単。下記のコマンドを打つだけです。

conda install -c https://conda.anaconda.org/menpo opencv3

これだけでOpenCV3がインストールは完了です。
インストールの確認。

python -c "import cv2;print(cv2.__version__)"

OpenCVのバージョンが表示されたら成功。

Nouveauドライバ無効化

 NVIDIA製のGPUを積んでいるパソコンの場合、CUDAを使うためにNVIDIAのドライバをいれたほうがいいでしょう。ですが、どうやらUbuntuに標準で入っているNouveauというドライバとNVIDIAのドライバが競合してしまうらしいのでNouveauを無効化します。

【導入方法】

 blacklist-nouveau.confというファイルを編集します。もし、ファイルがなければ作成してください。

sudo vim /etc/modprobe.d/blacklist-nouveau.conf

 で下記を追記して保存します。

blacklist nouveau
options nouveau modeset=0

 その後、下記のコマンドを打ち、

sudo update-initramfs -u

 最後にUbuntuを再起動します。


CUDAをインストールする。(NVIDIAドライバのインストール含む)

 CUDAはNVIDIA製のGPUを使って並列処理を行うためのライブラリです。
 ちなみにCUDAをインストールするとNVIDIAのドライバも一緒にインストールされるようです。

【導入方法】

 まず、自分のGPUの型番を確認して下記URLから、対応しているCUDAのバージョンを調べます。

 そしたらNVIDIAのサイトからCUDA Toolkitをダウンロードします。こちらのサイトは最新版のURLになります。

 自分のGPUが最新版に対応していなかった人はこちらから。

 Select Target Platformという欄から自分の環境にあったものを選択していきます。今回はUbuntu14.04LTSの64bit環境なので、
 Linux → x86_64 → Ubuntu → 14.04 → deb(local)
 と選択していきます。
 最後のInstaller Typeの欄ですが、deb(local)かdeb(network)を選びましょう。
 2つの違いはCUDAをダウンロードしきってからインストールするか、ダウンロードしながらインストールするかの違いです。前者は手元にCUDAのデータが残りますが、後者は残りません。ですので、もし何か手違いがあってCUDA入れ直す事になったとき、後者の場合はもう一度ダウンロードしなければいけなくなります。今回は入れ直す可能性も考えて、deb(local)を選択します。
 表示されたDownloadのボタンを押して、ダウンロードします。ダウンロード場所はどこでもいいと思いますが、今回は

~/home/shiba/Download/

 にします。
 ダウンロードが終わったらダウンロードしたディレクトリにcdコマンドで移動します。そして、

sudo dpkg -i cuda-repo-ubuntu1404-8-0-local_8.0.44-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda

 でCUDAをインストールします。
 次に.bashrcか.bash_profileに下記のコマンドを追記します。

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

.bashrc .bash_profileどちらもhomeにある隠しファイルです。今回は.bashrcに追記します。
具体的な追記方法は、

sudo gedit ~/.bashrc

 でエディタを開いて上記のコマンドをコピペして保存します。
 もしくは、

echo 'PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc

 とコマンドを入力します。
.bashrcに追記した後は、

source ~/.bashrc

 と入力します。

なお、『パスを通す』ことや、『export』コマンドについて詳しくは以下のURLを参照。

 『source』コマンドについては、


 インストールできたか確認する

nvcc -V

 CUDAのバージョンが確認できれば成功。
 CUDAのインストールが完了するとNVIDIAのドライバもインストールされるので、確認します。

lsmod | grep nvidia

 このコマンドを打つと下の3つが表示されます。

nvidia_uvm ●●
nvidia ●●
drm ●●

 ●●の部分は人によって多分違います。
 参考にさせて頂いた記事にも書いてありましたが、私の環境でもnvidia_uvmが表示されていませんでした。なので

dpkg -l | grep nvidia

 このコマンドで、nvidia-●●-uvmを探します。見つけたら、

sudo modprobe nvidia-352-uvm

 と打ってカーネルモジュールにnvidia-uvmを登録します。
 再び、

lsmod | grep nvidia

 と打って、

nvidia_uvm ●●
nvidia ●●
drm ●●

 の3つが出てくれば成功です。Ubuntuを再起動しましょう。

 ちなみに、NVIDIAのドライバを個別にインストールする場合は下記の記事を参考に。



cuDNNのインストール

 cuDNNはディープニューラルネットワークを効率よく処理するためのライブラリです。

【導入方法】

 まず、NVIDIAのサイトからcuDNNをダウンロードしなきゃいないんですが、cuDNNのダウンロードにはユーザー登録が必要です。
 下記のサイトからユーザー登録を行います。
NVIDIA cuDNN | NVIDIA Developer
 Registerをクリックします。
 何やら色々書いてありますが、とりあえずJoin nowをクリック。
 必要事項を英語で記入していきます。
 Organization Nameには個人なのでIndividualと記入して次へ。(どうでもいいけど、13歳未満はcuDNNを使えないのは何故なんでしょう。そんなに過激なものなのか・・・)
自分の環境や使う言語、利用目的やらを記入して登録。
 数日すると完了するようなのでそしたら、cuDNNをダウンロードします。
 再び下記のサイトへ。
NVIDIA cuDNN | NVIDIA Developer
 今度はDownloadをクリック。登録したメールアドレスとパスワードを入力してログイン。
 そしたら再び何に使うのかやらどういう分野に使うのかやらをチェックして次へ。
 cuDNNのソフトライセンスを熟読して同意したらチェックボックスにチェック。
 そしたら、色々バージョンがでてくるので、自分のCUDAのバージョンに合った最新のcuDNNをダウンロードしましょう。
 この記事を書いているときは、cuDNN v5.1が最新でしたので、

Download cuDNN v5.1 (August 10, 2016), for CUDA 8.0

 をクリック。そして、

cuDNN v5.1 Library for Linux

 をクリックして『cudnn-8.0-linux-x64-v5.1.tgz』をダウンロードしましょう。これもダウンロードはどこでもいいと思います。
 ダウンロードが完了したらターミナルでダウンロードしたディレクトリにcdコマンドで移動します。移動したら、

tar -zxf cudnn-6.5-linux-x64-v2.tgz
cd cudnn-6.5-linux-x64-v2

 と打って、cuDNNの解凍と解凍したディレクトリへの移動をします。
 ここまできたらcuDNNのインストールを行うのですが、cuDNNのインストールはただファイルをコピーするだけとなっています。なので下のコマンドを打って終わりです。

cd lib
sudo cp lib* /usr/local/cuda/lib64/
cd ../
cd include/
sudo cp cudnn.h /usr/local/cuda/include/

 インストールできたか確認します。

python -c "import cupy.cudnn"

 と打って何も起こらなければOKです。

 ちなみに余談ですが、参考記事にもありますが、Chainerを先にインストールしてしまい後からcuDNNをインストールする場合、Chainerを再インストールする必要があるそうです。具体的には

pip unisntall chainer

でchainerをアンインストールした後に、

pip install chainer



Chainerをインストールする。

 いよいよChainerをインストールしていきます。

【導入方法】

 まず、Python環境がAnacondaに切り替わっていることを確認します。

pyenv versions

 でAnacondaと出てくればOK。もし違うようなら、

pyenv global anaconda3-4.1.1

 で切り替える。
 次にPythonパッケージ管理ツールpipを使って依存関係をインストールします。ただ、下記のパッケージはおそらくAnacondaと一緒に入っているので(pipも)、入れようとしてももう入っているよって言われると思います。ですが、念のためコマンドを入力しておきます。

pip install numpy
pip install cython

 そうしたら、次にchainerのインストールを行います。

pip install chainer

 これでChainerのインストールは完了です。ちゃんとインストールできたか確認します。

python -c "import chainer"

 と入力して何も起こらなければOKです。


Faster-RCNNをインストールする。

【導入方法】

 GitHubからchainer-faster-rcnnをクローンします。
 githubからクローンする場所なのですが人によってホントにまちまちでいろんな記事を参考にしているとてんでバラバラになってしまいます。なので、今回は参考にさせていただいた記事にならい ~/github というディレクトリを作成してそこにクローンしたいと思います。
 クローン用のディレクトリを作成します。

mkdir ~/github

 作ったディレクトリに移動して、chainer-faster-rcnnをクローンします。

cd ~/github
git clone https://github.com/mitmul/chainer-faster-rcnn

 クローンしたディレクトリに移動して、dataというディレクトリを作成します。

cd chainer-faster-rcnn
mkdir data

 作ったdataディレクトリに移動して、プレトレーニングモデルをダウンロードします。

cd mkdir
wget https://dl.dropboxusercontent.com/u/2498135/faster-rcnn/VGG16_faster_rcnn_final.model

 chainer-faster-rcnnディレクトリに戻り、サンプルの画像をダウンロードします。

cd ..
wget http://vision.cs.utexas.edu/voc/VOC2007_test/JPEGImages/004545.jpg

 が、何故か自分の環境ではサンプル画像がダウンロードできず。なので、適当にネットから画像を引っ張ってきてこのディレクトリに保存しました。
 画像が用意できたらついに、デモの実行です。

python forward.py --img_fn 004545.jpg --gpu 0

 物体が資格で囲まれたresult.jpgという画像がディレクトリに出力されれば成功です。やったね!
 オプションの詳細は

--img_fn  入力画像
--out_fn  出力画像、 省略でresult.jpg
--gpu    0でGPUモード、 -1もしくは省略でCPUモード

 となっています。