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のインストールから始めて、実際にデモを動かすところまでやります。
- 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をインストールする。
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を参照。
- UbuntuデスクトップでPATHの設定は、~/.bashrc か ~/.bash_profile か ~/.profile のどれに書けばよいのか? - 部屋の中にも一年
- .bash_profileと.bashrcについて - Qiita
- パス(PATH)の確認と設定方法は? - Pocketstudio.jp Linux Wiki
- PATHを通すとは? (Mac OS X) - Qiita
- [Mac, Linux] PATHを通す方法 | Memo on the Web
- echoコマンドの詳細まとめました【Linuxコマンド集】
『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モード
となっています。
参考にさせて頂いた記事まとめ
- Python3とOpenCV3の環境を構築してみた | SoraLab / ソララボ
- Faster R-CNNのChainer実装で物体検出を試してみた | SoraLab / ソララボ
- Ubuntu14.04のChainer1.9でGPU(CUDA)を使う | めめんと
- UbuntuにCUDAを入れようとしたらハマった - Qiita
- Windows上にChainer v1.5+CUDA+cuDNNを一番簡単に入れれる方法 - Qiita
- Ubuntu 14.04.3 LTS に Chainer をインストールする - 不確定特異点
- Ubuntu 14.04にCUDA 7.0とcuDNNを導入する - Ry0 Note
- GitHub - mitmul/chainer-faster-rcnn: Object Detection with Faster R-CNN in Chainer
- UbuntuでNVIDIAのドライバをインストールする - Qiita
はじめに。
最近色々やるようになったのにどんどん忘れていってしまうので、
忘れても大丈夫なようにメモを残しておきたいと思います。
何も覚えてなくても大丈夫なように、初めての人が見ても分かるような内容にするつもりです。