MENU NEWS
技術ブログ

技術ブログ Developers' blog

Windows Subsystem for LinuxでOpenCVのカスケード型分類器を動かす

2018.01.29中村 昴
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の機能の有効化または無効化」を開く

img01.png

2.「Windows Subsystem for Linux」をチェックして、OKをクリックする。

img02.png

3.再起動を求められるので、そのまま再起動する。

UbuntuをWindowsストアからインストールする

1.Windowsストアを開く。

2.検索ボックスに「Linux」と入力して検索する。

3.検索結果の上部にLinuxの項目が出るので、「アプリを入手する」をクリックする。

img03.png

4.Ubuntuを選択して、インストールする。

img04.png

WindowsでOpenCVを導入する

1.OpenCVのサイトから、最新版の「Win pack」をダウンロードし、実行する。

https://opencv.org/releases.html

2.フォルダの展開先が聞かれるので、適当な場所を入力する。

img05.png

展開したフォルダの 「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

アクセルユニバースは、AWSパートナーネットワーク(APN) AWSコンサルティングパートナー企業です。

アクセルユニバースは、Salesforce registered consulting partner企業です。