ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

ChainerCVで物体検知(Ubuntu 16.04 LTS)

[technology][chainer]Ubuntu 16.04 LTSでChainerCVを試す

画像からの物体検知を試したいと思い、Yoloとか調べていて、とりあえずChainerCVをインストールする事にしました。
いつも通り、Ubuntuへのインストール事例をググってみたのですが、意外とヒットしない。

見つけたのは下記のサイトくらい。
www.slab.ces.kyutech.ac.jp

書いてある事は公式ドキュメントと変らないですね。
chainercv.readthedocs.io

で、いずれにしてもpipで普通にパッケージでインストールするか、Anaconda環境だとgitでファイル引っ張ってきてインストールみたいなので、基本、Anaconda版の手順で進めます。
少し公式と手順を変えたのは、既にAnacondaでpython3.6+OpenCV 3.4+chainer+cupy+cuda環境を構築済みなので、その環境をコピーした環境を作って、そこにインストールします。

  1. chainerインストール済みのpython3.6環境をcondaコマンドでクローン。クローン元の環境名は「py36」。クローン先環境名は「chainercv」

    $ conda create -n chainercv --clone py36

  2. githubからchainercvをDL

    git clone https://github.com/chainer/chainercv

  3. DLしたchainercvのディレクトリに入り、先ほどクローンしたchainercv環境をactivate

    cd chainercv
    source activate chainercv

    公式手順だとこのタイミングでcondaコマンドで新環境を作りますが代わりにクローン環境を使います。

  4. pipコマンドでインストール

    pip install -e .

これで特に引っかかる事も無くインストールには成功しました。
インストール時のログを見ると下記の様なメッセージが出ていて、結局cupy,chainerは新しいバージョンが再インストールされた様です。
chainer環境をクローンした意味はあまり無かったかも?

Installing collected packages: cupy-cuda92, chainer, chainercv
  Found existing installation: cupy-cuda92 4.5.0
    Uninstalling cupy-cuda92-4.5.0:
      Successfully uninstalled cupy-cuda92-4.5.0
  Found existing installation: chainer 4.3.1
    Uninstalling chainer-4.3.1:
      Successfully uninstalled chainer-4.3.1
  Running setup.py develop for chainercv
Successfully installed chainer-5.4.0 chainercv cupy-cuda92-5.4.0

動作確認ですが、基本的には公式のチュートリアル通りです。
chainercv.readthedocs.io

自分の環境で変更必要だったのはexamples/yolo等の下のdemo.pyの先頭付近,matplotlobのimport直前に下記のおまじないを追加したことだけです。

import matplotlib as mpl # 追加
mpl.use('TkAgg') # 追加
import matplotlib.pyplot as plt

例えばyolo v3の場合、下記の様に画像ファイルをdemo.pyに渡すと認識結果を表示してくれます。
初回起動時に指定した学習モデルをネットから自動ダウンロードするため、初回はネット接続する必要があります。
モデルを指定しない場合、yoloのdemoスクリプトはyolo v2を使います。SSDとかのデモも使い方はだいたい同じで、指定可能なモデル名とかはスクリプトを読めばすぐに判ります。

$ cd examples/yolo
$ python demo.py --model yolo_v3 --gpu 0 <対象画像ファイル>

GPUを使わない場合は、--gpu 0は不要です。自分の環境には一応GeForce GTX-1050が載っていて、NVIDIAドライバーも入っているので、cupy-cudaがちゃんと動くかのテストでやってみました。問題無い様です。
公式チュートリアルにあるサンプルは普通に認識。自分の写真とかはちゃんとpersonに分類してくれました。
ちなみに以前、ブラジルで撮影したカピバラさんの写真を認識させると、sheepと分類されました。多分カピバラという分類が学習データに無いんでしょうね。
rc30-popo.hatenablog.com

Yolo V3とV2を同じ写真に対して適用してみます。V2だと手前のカピバラしか検出してませんが、V3は少し奥にいるもう一匹も検出しています。(Sheepとしてですが...)
一番奥のやつは流石に無理っぽい。


Yolo V3

Yolo V2

さて、ChainerCVでの物体検知自体は驚くほど簡単にできてしまったのですが、予め学習データにラベル付された種類のものしか認識してくれません。
自分が作ったペーパークラフトの写真をいくつか試しましたが、例えば護衛艦ペーパークラフトboatと識別されるのですが、クルマとかバイクとかのペーパークラフトであまり高精度に作っていないものは物体として検知してくれません。
実はCOZMO SDKとchainercvを組み合わせて、COZMOにカメラで認識した物体を避けるとかやらせたいなと思っているのですが、家にあるオモチャを床にばらまいてもあまり認識出来ない気がします。

自分でもっと単純なニューラルネットワーク組んで、とにかく一定距離に何か物体があったら種別関係なく検出するようにトレーニングした方が良いかな?と考え始めました。
COZMO自体は人間とペットと付属のキューブは画像認識するのですが、他の物体は認識しないんですよね。ペットも、うちで飼ってるウサギさんはあまり認識しなかったりとか。

ちょっと考えてみます。


追記:
ググってもChainerCVインストールの記事があまりヒットしないのは、「公式どおりにやれば問題無い」からなんでしょうね。
公式ドキュメントより先にqiitaとかの記事を探すのはあまり良く無い習慣かもですね...

2019/7/15追記:
COZMOを物体検知でなく、ディープラーニングでコースを暗記させる実験をやってみました。
物体検知での制御はそのうちやってみます。
rc30-popo.hatenablog.com
rc30-popo.hatenablog.com