先日、DockerでChainerの開発環境を作りました。
と言ってもニューラルネットワークに初めて触れる文系人である自身としては、どうしたらよいのか...、というわけで、とりあえず、サンプルを実行してみるところからスタートするのが、賢明だと思いました。
さてサンプルと言っても既にリリースされているアドオンChainerMN/ChainerRL/ChainerCVを試せば良さそうですが、どこから手を付けるか...、最近、ProcessingのOpenCVライブラリを試してみたことがあることから、他に比べれば、少しは取り組みやすいのかなということでChainerCVを試してみることにしました。
Pythonは3系(Python 3.6.6)を使いますが、自動で入った模様の2系は、2.7.15rc1です。
ちなみに今回、検証に使っているパソコンのGPUは、Intel HD Graphics 510というオンボードのもので主流らしきNVIDIA製ではないのでCPUで動かしてみている一方、Intel CPU アクセラレータiDeepは、まだ、試していません。
というわけで今回、実行してみたのは、ChainerCV Object Detection Tutorialの一連のサンプルです。
ただ、最初、エラーに遭遇、深入りせずに後段のリアルタイム物体検知のデモをするにあたり、ここのサンプル実行時のエラーの原因が、python3-tkがないことだとわかり、これを試すことができるに至りました。
少なくとも現時点では、UbuntuやCentOSならEE/Enterprise版も使えるようですが、DebianやFedoraはCE版のみ、RHLに触れたり、Fedoraを使っていたこともある自身もOSを乗り換えるほどの熱量はなく、DebianにCE版をインストールしました。
CE版のインストールは、OS、プラットフォームごとに詳述されているので戸惑うこともありませんでした。
ChainerCV Object Detectionのサンプルを実行してみると[ModuleNotFoundError: No module named '_tkinter']というエラーに遭遇、結果、先日、開発環境として作成したDockerfileにpython3-tkパッケージを追加する必要がありました。
他方、apt installしているものの中には、今回のサンプルを試すにあたっては不要なものもありますが、そのあたりは、良きに計らってください。
Dockerコンテナ(仮想OS)を起動しますが、こられが何をしているのかについて必要であれば、冒頭のChainer開発環境のリンク先を参照ください。
コマンドライン、もしくは、pythonスクリプトファイルを作るなりすれば、サンプルを実行できる...と思いきや、from matplotlib import pyplot as pltか、import matplotlib.pyplot as pltの何れかをコード冒頭に入れないとポップアップ画面が真っ黒だったり、真っグレー?だったりしました。
何れの宣言でも実行できたものの、どちらが妥当な書き方なのかについては、今の自身には、わかりませんが、よく見ると2つめのサンプルには、後者の指定があるので後者で良いのでしょう。
ちなみに、たまたまなのか、前者だとポップアップを消すのに何度か同じ操作(ポップアップの☓を押す)を繰り返すことになったような...。
というわけで2つめのサンプルには、元々後者のタイプの宣言がなされており、3つめと最後の6つめのサンプルでは、この宣言は不要、他のサンプルは全て、この宣言が必要でした。
model = SSD300(pretrained_model='voc0712')で使われているのは、Caffe/data/VOC712にある、これら画像を学習したものである模様です。
手持ちを探してみましたが、適当なものがないので、ネットで著作権フリーな写真を探すことにしました。
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はどこで確認できるんでしょう...?