先日、DockerでChainerの開発環境を作りました。
生粋の文系人でニューラルネットワークも初めて、脳みそも退化し、とろけ始めているかもしれない自身は、一体、何から始めたらよいのか...、やはり、先人が示してくれているサンプルの実行が近道...なはず...。
というわけで早速、アドオンChainerMN/ChainerRL/ChainerCVからChainerCVを選択し、公式ドキュメントのサンプルを実行してみてみようと思ったら、エラーになり、他のサンプルを探して機械学習ChainerCVとYoloで『カメラ・動画対応!リアルタイム物体検出ソフト』を作るの『リアルタイム物体検出ソフト:Yolo_Chainer_Video.py』にたどり着きました。
(リンク先は、頑張っている理系を応援したいから配信しているとのこと...理系じゃないのにすみません...。)
ProcessingのVideoライブラリとProcessingのOpenCVライブラリで共にWebカメラによる動体検知を試していた自身にとってこれ以上ないタイムリーでありがたいサンプルです。
また、こちらを使わせて頂いたおかげで、後述のようにChainerCVの物体検出サンプルのエラーの原因もわかり、そちらのサンプルも実行できるに至りました。
Pythonは3系(Python 3.6.6)を使いますが、自動で入った模様の2系は、2.7.15rc1です。
ちなみに今回、検証に使っているパソコンのGPUは、Intel HD Graphics 510というオンボードのもので主流らしきNVIDIA製ではないのでCPUで動かしてみている一方、Intel CPU アクセラレータiDeepは、まだ、試していません。
少なくとも現時点では、UbuntuやCentOSならEE/Enterprise版も使えるようですが、DebianやFedoraはCE版のみ、RHLに触れたり、Fedoraを使っていたこともある自身もOSを乗り換えるほどの熱量はなく、DebianにCE版をインストールしました。
CE版のインストールは、OS、プラットフォームごとに詳述されているので戸惑うこともありませんでした。
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 build -tでイメージ名の命名ができず、docker tagでREPOSITORYとTAGを設定しました。
ちなみにmanページには、docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]とありましたが、noneだとカッコ付きでもエラーになるため、IMAGE IDでやってみたところできました。
apt installしているものの中には、今回のデモにあたっては不要なものもありますが、そのあたりは、よしなに。
Dockerコンテナ(仮想OS)を起動しますが、こられが何をしているのかについて必要であれば、冒頭のChainer開発環境のリンク先を参照ください。
parser.add_argument('--pretrained-model', default='voc0712')で使われているのは、Caffe/data/VOC712にある、これら画像を学習したものである模様です。
というわけでエクストラバージンオイルのガラス製のボトルを試してみることに。
デフォルトでよくて、カメラを使いたい場合は、引数に0を1つ渡すだけでよいとのことなので実行。
なんとWebカメラを向けたところ、100%(1.00)の確率でbottleだとバレ(認識され)ました。
ちなみに自分も映してみたら、100% personと認識されました(ホッ...)。
元リンク同様、ここでもCPUでの実行なので、ストップモーションどころの騒ぎではなく、タイムラグがすごいですが、見事な結果に満足です。