気の向くままに辿るIT/ICT
ソフトウェア

ChainerCV Object Detection/対象検出サンプルの実行

ホーム前へ次へ
フリーソフト・オープンソースを活用しよう。

ChainerCV Object Detection/対象検出サンプルの実行

ChainerCV Object Detection/対象検出サンプルの実行

2018/10/13
chainer 4.5.0
chainercv 0.10.0
chainerrl 0.4.0
chainermn 1.3.0
chainerui 0.6.0

 先日、DockerでChainerの開発環境を作りました。

 と言ってもニューラルネットワークに初めて触れる文系人である自身としては、どうしたらよいのか...、というわけで、とりあえず、サンプルを実行してみるところからスタートするのが、賢明だと思いました。

 さてサンプルと言っても既にリリースされているアドオンChainerMN/ChainerRL/ChainerCVを試せば良さそうですが、どこから手を付けるか...、最近、ProcessingのOpenCVライブラリを試してみたことがあることから、他に比べれば、少しは取り組みやすいのかなということでChainerCVを試してみることにしました。

Python 3.6.6

 Pythonは3系(Python 3.6.6)を使いますが、自動で入った模様の2系は、2.7.15rc1です。

[ホスト環境]
P C:TOSHIBA dynabook B45/B
CPU:Intel Cerelon 3855U 1.60GHz Core x2
GPU:Intel HD Graphics 510 (オンボード)
RAM:4GB
O S:Debian 9.5/Stretch x86-64

 ちなみに今回、検証に使っているパソコンのGPUは、Intel HD Graphics 510というオンボードのもので主流らしきNVIDIA製ではないのでCPUで動かしてみている一方、Intel CPU アクセラレータiDeepは、まだ、試していません。

実行サンプル

 というわけで今回、実行してみたのは、ChainerCV Object Detection Tutorialの一連のサンプルです。

 ただ、最初、エラーに遭遇、深入りせずに後段のリアルタイム物体検知のデモをするにあたり、ここのサンプル実行時のエラーの原因が、python3-tkがないことだとわかり、これを試すことができるに至りました。

DockerとDockerfile

Docker version 18.06.1-ce, build e68fc7a

 少なくとも現時点では、UbuntuやCentOSならEE/Enterprise版も使えるようですが、DebianやFedoraはCE版のみ、RHLに触れたり、Fedoraを使っていたこともある自身もOSを乗り換えるほどの熱量はなく、DebianにCE版をインストールしました。

 CE版のインストールは、OS、プラットフォームごとに詳述されているので戸惑うこともありませんでした。

# Dockerfile
 
FROM ubuntu
 
RUN apt update && apt install -y \
        python3 \
        python3-pip \
        python3-tk \
        curl \
        firefox \
        git \
        less \
        mpich \
        vim \
        wget \
  && apt clean \
  && rm -rf /var/lib/apt/lists/*
 
RUN pip3 install -U setuptools \
  && pip3 install \
        cython \
        gym \
        h5py \
        matplotlib \
        numpy \
        opencv-python \
        pillow \
        scipy \
        chainercv \
        chainerrl \
        chainermn \
        chainerui \
        chainer
 
ENV DISPLAY=":0"

 ChainerCV Object Detectionのサンプルを実行してみると[ModuleNotFoundError: No module named '_tkinter']というエラーに遭遇、結果、先日、開発環境として作成したDockerfileにpython3-tkパッケージを追加する必要がありました。

 他方、apt installしているものの中には、今回のサンプルを試すにあたっては不要なものもありますが、そのあたりは、良きに計らってください。

$ xhost local:
non-network local connections being added to access control list
$ ls
Dockerfile
$ docker build -t webzoit:chainer_obj_detect .
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
webzoit       chainer_obj_detect              ...        ...          ...
$ docker run -v /tmp/.X11-unix/:/tmp/.X11-unix/ -it --rm webzoit:chainer_obj_detect /bin/bash
root@ancv62b48c6d:/#

 Dockerコンテナ(仮想OS)を起動しますが、こられが何をしているのかについて必要であれば、冒頭のChainer開発環境のリンク先を参照ください。

root@ancv62b48c6d:/# python3
Python 3.6.6 (default, Sep 12 2018, 18:26:19)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
([Ctrl]+[d])
root@ancv62b48c6d:/#

 コマンドライン、もしくは、pythonスクリプトファイルを作るなりすれば、サンプルを実行できる...と思いきや、from matplotlib import pyplot as pltか、import matplotlib.pyplot as pltの何れかをコード冒頭に入れないとポップアップ画面が真っ黒だったり、真っグレー?だったりしました。

 何れの宣言でも実行できたものの、どちらが妥当な書き方なのかについては、今の自身には、わかりませんが、よく見ると2つめのサンプルには、後者の指定があるので後者で良いのでしょう。

 ちなみに、たまたまなのか、前者だとポップアップを消すのに何度か同じ操作(ポップアップの☓を押す)を繰り返すことになったような...。

 というわけで2つめのサンプルには、元々後者のタイプの宣言がなされており、3つめと最後の6つめのサンプルでは、この宣言は不要、他のサンプルは全て、この宣言が必要でした。

background(背景のみ/非該当時)
aeroplane(飛行機)
bicycle(自転車)
bird(鳥)
boat(船)
bottle(瓶)
bus(バス)
car(車)
cat(猫)
chair(椅子)
cow(牛)
diningtable(食卓テーブル)
dog(犬)
horse(馬)
motorbike(バイク)
person(人)
pottedplant(鉢植え・盆栽)
sheep(羊)
sofa(ソファ)
train(列車)
tvmonitor(テレビ画面)

 model = SSD300(pretrained_model='voc0712')で使われているのは、Caffe/data/VOC712にある、これら画像を学習したものである模様です。

 手持ちを探してみましたが、適当なものがないので、ネットで著作権フリーな写真を探すことにしました。

香港の街角をChainerCV Object Detection

 ChainerCV Object Detectionリンク先ページ冒頭のサンプルで香港の街角を撮影したものらしき写真に差し替えて実行したものがこれです。

 この写真だと全て後ろ向きにもかかわらず、結構な自信(0.96〜1.0=96%〜100%の確率)をもって人と車とバスを認識していることがわかります。

 これらは、他にも写っていますが、対象1つにつき1つ検出するようになっているのか、単に他は認識できていないのかについては...と思ったら、4つめのサンプルの説明を読むと閾値よりもスコアが低いために敢えて除外された可能性が高そうで5つめは、スコアの低いものも含めた結果を出力するのサンプルとなっています。

 ちなみに帰属表示は不要のpixabayとは言え、画像をクリックすると元画像に飛ぶようにしてあります。

 ChainerCV Object Detectionリンク先ページ2つめのBounding boxes in ChainerCVサンプルは、機械学習とは無関係に?それぞれの色はデフォルトなのか、背景の指定した位置座標に矩形を2つ表示するもののようで試してみると確かにそのように表示されました。

 ChainerCV Object Detectionリンク先ページ3つめのBounding Box Datasetサンプルは、初回実行時のみデータセットVOC 2012をダウンロードし、その後、そこにある馬術の写真と認識した様子の画像が表示されるもののようで確かにそのように表示されました。

 ChainerCV Object Detectionリンク先ページ4つめのDetection Linkサンプルは、SSD/Single Shot MultiBox DetectorとFaster R-CNN/Recurrent Convolution Nueral Network/高速かつ再帰的な畳込みニューラルネットワークにより、一度の撮影で複数のターゲットを検出するもののようで、ページの写真と同じものが表示されました。

 同じくDetection Linkの5つめのサンプルは、4つめが、認識スコアの高いもののみを検出したのに対し、認識スコアの低いものも含めたものとなっており、同じ画像が表示されました。

 ChainerCV Object Detectionリンク先ページ6つめのDetection Evaluatorサンプルは、検出評価拡張機能と検出評価関数の例のようで「結果は、スコアの辞書です。出力して確認してね。result = evaluator()」で終わってしまいますが、resultはどこで確認できるんでしょう...?

ホーム前へ次へ