DEVELOPER’s BLOG
技術ブログ
Windows Subsystem for LinuxでOpenCVのカスケード型分類器を動かす
Windows 10でLinux環境を使いたい場合、Windows Subsystem for Linux(WSL)が便利です。WSL以外にもLinux環境を利用する手段はありましたが、以下のような点が不便でした。
Cygwin
・Windows向けにコンパイルされていないものは利用できない
・Windowsのコマンドを利用するときに、パスを変換する必要がある
foo.exe $(cygpath -w /path/to/file)
仮想マシン
・仮想マシンの起動に時間がかかる
・メモリーなどのリソースを、ホストとは別に用意する必要がある
WSLでは、これが以下のようになります。
・動作するソフトが多い WSLでは、Linuxの実行ファイルを直接実行できるため、多くのLinuxソフトを動かせます。
・WindowsとLinux間のコマンドの相互利用が簡単
パスを変換することなくWindowsのコマンドを実行できます。
foo.exe /path/to/file
また、 wsl コマンドによって、Windows側からLinuxのコマンドを実行することもできます。
wsl ls
・リソースをホストと共有する
一つのアプリケーションとして動くので、メモリーなどを別々に確保する必要がありません。 今回は、WSLでOpenCVのカスケード型分類器を動かしてみました。
環境
・Windows 10 Fall Creators Update 64bit
手順
WSLを有効にする
1.Windowsの設定画面から、「機能の有効化」と検索して、「Windowsの機能の有効化または無効化」を開く
2.「Windows Subsystem for Linux」をチェックして、OKをクリックする。
3.再起動を求められるので、そのまま再起動する。
UbuntuをWindowsストアからインストールする
1.Windowsストアを開く。
2.検索ボックスに「Linux」と入力して検索する。
3.検索結果の上部にLinuxの項目が出るので、「アプリを入手する」をクリックする。
4.Ubuntuを選択して、インストールする。
WindowsでOpenCVを導入する
1.OpenCVのサイトから、最新版の「Win pack」をダウンロードし、実行する。
https://opencv.org/releases.html
2.フォルダの展開先が聞かれるので、適当な場所を入力する。
展開したフォルダの 「build/x64/vc14/bin」にパスを通しておく。
Ubuntuを起動する
1.初回起動時にはセットアップが行われるのでしばらく待つ。
2.新規ユーザーのユーザー名とパスワードを聞かれるので入力する。
Ubuntuでopencv-pythonをインストールする
pipを使ってopencv-pythonをインストールする。
$ pip3 install opencv-python
カスケード型分類器を動かす
1.学習データを用意する
ここではディレクトリ構成を下記のようにします。
. ├── cascade/ ├── negative_image_list.txt ├── negative_images/ ├── positive_image_list.txt ├── positive_images/ ├── test_image.jpg └── detect.py
positive_images/ negative_images/ にそれぞれ正解画像、不正解画像を入れておきます。 positive_image_list.txt には、以下のように正解画像のパスと画像内の物体の位置を記述します。
positive_image_list.txt
positive_images/000001.jpg 1 0 0 24 24 positive_images/000002.jpg 2 10 20 30 50 76 84 42 55
形式は以下のようになっています。
画像ファイルのパス 画像内の物体の個数 1つ目の物体のX座標 1つ目の物体のY座標 1つ目の物体のwidth 1つ目の物体のheight 2つ目の物体のX座標 ...
negative_image_list.txt には、以下のように不正解画像のパスを記述します。
negative_image_list.txt
negative_images/000001.jpg negative_images/000002.jpg
2. 正解画像ファイルを作成する
下記コマンドにより、正解画像ファイルを作成します。 -num には、用意した正解画像の数を指定します。
$ opencv_createsamples.exe -info positive_image_list.txt -vec positive_sample.vec -num 1200
3. 学習を実行する
カスケード型分類器の学習を行います。 -numPos -numNeg には、それぞれ使用する正解画像、不正解画像の数を指定します。正解画像は、ここで指定する数よりも多くの画像を使用する場合があるので、用意した数よりも少ない数(8~9割程度)を指定する必要があります。
$ opencv_traincascade.exe -data cascade -vec positive_sample.vec -bg negative_image_list.txt -numPos 1000 -numNeg 500 -featureType LBP
学習が終了すると、 cascade/cascade.xml にカスケードファイルが生成されます。
4. 物体の検出を行う
以下のコードでは、画像内の物体を矩形で囲み、検出結果の画像を出力しています。
detect.py
import cv2 image_source = 'test_image.jpg' image_dest = 'result_image.jpg' cascade_path = 'cascade/cascade.xml' cascade = cv2.CascadeClassifier(cascade_path) image = cv2.imread(image_source) objects = cascade.detectMultiScale(image, 1.3, 5) for (x, y, w, h) in objects: image = cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2) cv2.imwrite(image_dest, image)
$ python3 detect.py
5. 結果を確認する
WSLではGUIを使えないので、Windows側から検出結果の画像 result_image.jpg を開いて確認します。
参考
Cascade Classifier Training -- OpenCV 2.4.13.4 documentation
https://www.docs.opencv.org/2.4/doc/user_guide/ug_traincascade.html