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

ChainerCV/YoloとWebカメラでリアルタイム物体検出デモ

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
フリーソフト・オープンソースを活用しよう。

ChainerCV/YoloとWebカメラでリアルタイム物体検出デモ

ChainerCV/YoloとWebカメラでリアルタイム物体検出デモ

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からChainerCVを選択し、公式ドキュメントのサンプルを実行してみてみようと思ったら、エラーになり、他のサンプルを探して機械学習ChainerCVとYoloで『カメラ・動画対応!リアルタイム物体検出ソフト』を作るの『リアルタイム物体検出ソフト:Yolo_Chainer_Video.py』にたどり着きました。

(リンク先は、頑張っている理系を応援したいから配信しているとのこと...理系じゃないのにすみません...。)

 ProcessingのVideoライブラリとProcessingのOpenCVライブラリで共にWebカメラによる動体検知を試していた自身にとってこれ以上ないタイムリーでありがたいサンプルです。

 また、こちらを使わせて頂いたおかげで、後述のように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は、まだ、試していません。

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
 
ENV DEBIAN_FRONTEND=noninteractive
 
RUN apt update && apt install -y \
        python3 \
        python3-pip \
        python3-tk \
        curl \
        firefox \
        git \
        less \
        mpich \
        uvccapture \
        vim \
        wget \
  && apt clean \
  && rm -rf /var/lib/apt/lists/*
 
RUN pip3 install -U setuptools \
  && pip3 install \
        cython \
        gym \
        h5py \
        jupyter notebook \
        matplotlib \
        numpy \
        opencv-python \
        pillow \
        scipy \
        chainercv \
        chainerrl \
        chainermn \
        chainerui \
        chainer
 
RUN jupyter notebook --generate-config
RUN echo "c.NotebookApp.ip = '0.0.0.0'" >> ~/.jupyter/jupyter_notebook_config.py
 
ENV DISPLAY=":0"
ENV QT_X11_NO_MITSHM=1

 Yolo_Chainer_Video.pyを実行してみると自身の環境に不足があり、Webカメラが認識できない旨のエラーに、また、[ModuleNotFoundError: No module named '_tkinter']というエラーにも遭遇しました。

 結果、前者については、Docker上でWebカメラ(UVC)を使う方法に倣い、

 後者については、先日、開発環境として作成したDockerfileに

することで対処できました。

 おかげで後者については、先に試したChainerCV Object Detectionのサンプルでエラーになった原因が、同様にpython3-tkパッケージの不足であることに気づき、そちらのサンプルも実行できるに至りました。

 また、自身が何かしでかしたようでgitインストール時らしいのですが、これに依存してtzdataパッケージがインストールされる際に対話的にTimezoneを聞かれ、今までは6. Asia 78. Tokyoなどとしていたのですが、今回のDockerfileのdocker buildでは、なぜか、6(Asia)と入れたところでフリーズしたため、やむなく、

 (ホストがDebian、仮想OSがUbuntuで、どっちに効くのか、これで良いのか迷ったものの、良いらしいです。)

 こうすると起動時、日付時刻がUTCとなるため、気になる場合は、docker run時に[-v /etc/localtime:/etc/localtime:ro]を追加するとよいでしょう。

$ docker tag SOURCE_IMAGE ID TARGET_REPOSITORY:TAG
$

 また、なぜか、docker build -tでイメージ名の命名ができず、docker tagでREPOSITORYTAGを設定しました。

 ちなみにmanページには、docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]とありましたが、noneだとカッコ付きでもエラーになるため、IMAGE IDでやってみたところできました。

 apt installしているものの中には、今回のデモにあたっては不要なものもありますが、そのあたりは、よしなに。

$ xhost local:
non-network local connections being added to access control list
$ ls
Dockerfile
$ docker build -t webzoit:chainer_move_obj_detect .
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
webzoit       chainer_move_obj_detect              ...        ...          ...
$ docker run --privileged --device /dev/video0:/dev/video0:mwr -v /tmp/.X11-unix/:/tmp/.X11-unix/ -v /etc/localtime:/etc/localtime:ro -it --rm webzoit:chainer_move_obj_detect /bin/bash
root@3a5963a3310b:/#

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

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

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

 というわけでエクストラバージンオイルのガラス製のボトルを試してみることに。

root@3a5963a3310b:/# vi Yolo_Chainer_Video.py
import argparse
...
if __name__ == '__main__':
  main()
...
(:wq)
root@3a5963a3310b:/# python3 Yolo_Chainer_Video.py 0
bottle 1.00
...

 デフォルトでよくて、カメラを使いたい場合は、引数に0を1つ渡すだけでよいとのことなので実行。

ChainerCV/YoloとWebカメラで100%ボトルと認識されたエクストラバージンオイル

 なんとWebカメラを向けたところ、100%(1.00)の確率でbottleだとバレ(認識され)ました。

 ちなみに自分も映してみたら、100% personと認識されました(ホッ...)。

 元リンク同様、ここでもCPUでの実行なので、ストップモーションどころの騒ぎではなく、タイムラグがすごいですが、見事な結果に満足です。

関連リンク

ウェブ造ホーム前へ次へ