可変ブログ

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

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モード

 となっています。


はじめに。

最近色々やるようになったのにどんどん忘れていってしまうので、

忘れても大丈夫なようにメモを残しておきたいと思います。

何も覚えてなくても大丈夫なように、初めての人が見ても分かるような内容にするつもりです。