目次
ラジコン自動運転で。。
Donkeyでラジコン運転するところまで出来たのですが、
自動運転するには、学習させないといけないので、GPUがないと。。辛いってことがわかり、少し止まっています。Floydhubでする環境を作ってやってみるかな?とも思うのですが。。なんとなく出来そうだろうなぁ~という確認はできたので、もうひとつのアプローチとして、物体があることを検出できれば、その間を行くとかそういうこともできますし。。草刈りロボットにするには、人間が居たら止まるとかしないといけないので、物体検出の方を少しやってみようかと。。
物体検出
OpenCVでもできますし、本当に色んなアルゴリズムが昔から提案されていて。。
HOG HAAR LBPと呼ばれる局所的な特徴量で物体を検出するもの(これも機械学習といえば機械学習ですSVMやK-meansなどを使っています)や、R-CNNと呼ばれるニューラルネットを使ったもの、yolo(You look once)と呼ばれる矩形領域の抽出から検出する方法などいろいろあります。PythonやOpenCV、Tensorflowなどでそのあたりのことができます。
で・・学習してないと出てこないわけですが。。 Google のObject detection APIが凄いって言われているので、ちょっと試してみたくなって。。(こないだから、文字の切り出しをしようとして失敗したり。。MinicondaでPython入れたからAnacondaとぶつかってたり。。ですが)
入れてみようとしたら。。。結構 ハマったので、そのハマりポイントを忘備録にしておきます。
TensorFlow Object Detection API
これのチュートリアルをすれば、良いわけです。。ちなみに、Google Cloud Vision APIに行けば、写真に何が写っているのか?とか検出結果だけWebアプリとしてAPIのお試しができます。でも、画像の切り出しをしたかったり、物がある方向を知りたかったりするので、物体がある位置を返して欲しいので、ローカルでできるように設定しました。
環境のインストール
インストールはここを見てやればいいんですが。。
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md
Windows版の場合、少しいろいろと、ややこしいことが起こります。
最初にまとめておくと、
- Pythonのバージョン 3.5がよさそう
- object_detectionのresearchとその下のslimにPYTHONPATHを通す これが本当に必須なのか分からないですが・・
- Windowsのコマンドラインで正規表現が動かないことで。。Protocol BuffersのBuild、インストールが出来ない。
- 最初に試験するコマンド動かないんだけど、Jupyter Notebookのチュートリアルは動く
これらを解決しないといけないんだけど、TensorflowモデルのGitのissuesを読まないとその解決法が出てこないので・・それらを、まとめて、ここにおいておきます。(たぶん、すぐに解決して使いやすくなっていくんでしょうけど)
Tensorflow自体のインストールとかいろいろなのが出てくるので、それにしたがってもらえればいいのですが。。僕が前にやったやり方はこちら。。
【自作UAV】TensorflowをGPUなしで入れてみる。。Tensorflow OpenCV リアルタイム物体認識【VRC】
で、半年前なので・・・進んでいます(笑)
Anacondaインストール(やってない人)
AnacondaからPython3.6 の方を64-Bit Graphical Installer (515 MB) 32-Bit Graphical Installer (420 MB)をインストール
適当にやっても、今はちゃんと動きますね。。
もう入れてるひとは、conda類をアップデートしておくといいですね。僕Minicondaと併用しちゃったので、Anacondaの環境が崩れて。。ってするとAnacondaを一回消さないとダメになっちゃいました(笑)注意必要ですね。Dockerで入れてもいいんですが、処理が劇遅になるのでお勧めできない(^^;
>conda update conda >conda update --all >conda update python=3.5 >conda update anaconda >conda update anaconda-navigator
Object Detection のTensorflowモデルのダウンロード
GitにあるTensorFlow ModelsをZipダウンロードか Git cloneでもってきます。
ディレクトリを作っておかないとダメですので、適当に。。でも、このディレクトリがPYTHONPATHに出てくるので、重要です。
C:\どこか\models-master
この下に、PYTHONPATHを通すディレクトリがあるか確認しておくといいですね。
c:\どこか\models-master\research c:\どこか\models-master\research\slim
それとobject_detectionをするなら。。ここも確認
C:\どこか\models-master\research\object_detection\models C:\どこか\models-master\research\object_detection\protos
便利って言えば便利ですが、こういうのがあって、AnacondaやMinicondaやPipやといろいろあるので、毎回何かやるたびにインストールしている感じがする(笑)
Anaconda Navigatorを立ち上げます
Enviromentsに入って、Createを押して、適当な名前、たとえばobj-detectなどで作ります。そして、三角形を押して、Open terminalをクリックすると、コマンドラインが出てきます。
ここからは、ほぼコマンドラインになりますので、やりやすい(笑)
Tensorflowをインストール
pip install tensorflow
又は
pip install tensorflow-gpu
説明書通りに、他のライブラリも入れます。
pip install pillow pip install lxml pip install jupyter pip install matplotlib
Protobuf のビルド
こいつが第一の曲者。。
# From tensorflow/models/research/ protoc object_detection/protos/*.proto --python_out=.
って書いてあるんですが、まず、protocをインストールしないとダメですね。
Protobufのgitに、コンパイルされたものがありますので、それをダウンロードします。
protoc-3.5.1-win32.zipをダウンロードして、展開すると、binの中に、protoc.exeがありますので、それを
c:\どこか\models-master\research
にコピーしていれます。
PYTHONPATHを設定しておきます
>set PYTHONPATH=%PYTHONPATH%;C:\どこか\models-master\research;C:\どこか\models-master\research\slim
としてもいいですし、Windows10は文字数制限があるので、いっぱい入れている人は、ここでも飛びますので・・その場合は、GUIで設定します。
researchフォルダと、research/silm のフォルダで
python3 setup.py install
をやっておけってIssues1591にあるんですが、本当に必要かどうかは分かりませんがやっておきます(笑)
で・・・ここまでやると。。
>cd c:\どこか\models-master\research >protoc object_detection/protos/*.proto --python_out=.
でできるとされているんですが、No such file or directory と出て出来ない(笑)
で。。どうやら、*.protoという正規表現が出来てないようで、Windowsでできないみたいです。やり方はいろいろあるみたいですが、簡単に、ファイルを全部指定してしまいます。
>protoc --python_out=. .\object_detection\protos\anchor_generator.proto .\object_detection\protos\argmax_matcher.proto .\object_detection\protos\bipartite_matcher.proto .\object_detection\protos\box_coder.proto .\object_detection\protos\box_predictor.proto .\object_detection\protos\eval.proto .\object_detection\protos\faster_rcnn.proto .\object_detection\protos\faster_rcnn_box_coder.proto .\object_detection\protos\grid_anchor_generator.proto .\object_detection\protos\hyperparams.proto .\object_detection\protos\image_resizer.proto .\object_detection\protos\input_reader.proto .\object_detection\protos\losses.proto .\object_detection\protos\matcher.proto .\object_detection\protos\mean_stddev_box_coder.proto .\object_detection\protos\model.proto .\object_detection\protos\optimizer.proto .\object_detection\protos\pipeline.proto .\object_detection\protos\post_processing.proto .\object_detection\protos\preprocessor.proto .\object_detection\protos\region_similarity_calculator.proto .\object_detection\protos\square_box_coder.proto .\object_detection\protos\ssd.proto .\object_detection\protos\ssd_anchor_generator.proto .\object_detection\protos\string_int_label_map.proto .\object_detection\protos\train.proto
object_detectionのprotos内にある.protoファイル全部です。
そうすると、出来ました。
出来ているかテストしない
で、researchフォルダで、
> python object_detection/builders/model_builder_test.py
とやれば、絵が出てくると書いてあるけど。。こいつが出来ない(笑)
line21でimportできないとかいろんなエラーが出てきます。
これ、解決方法わかんないのですが。。 無視します。
Jupyter notebookを立ち上げる
research\object_detectionフォルダから
>jupyter notebook
と打って、Jupyterの環境を立ち上げちゃいます。 それで、チュートリアルを動かしてしまいます。object_detection_tutorial.ipynbというやつです。
そうすると・・ Object Detection Demoというノートが出てくるので、それを動かします。Runを押していくと。。動いていきます。
しばらくすると、結果がでてきます。
チュートリアルで出てくるのは、DogとPersonの検出ですね。
さまざまな、設定が本当に必要だったのか?どうか不明ですが、これで、一応、TensorflowのObject Detection APIがLocal環境で動くことが分かりました。
やりたかったのは、自然の写真から、自然のものをどれだけ抽出するのかな?だったので・・
適当に、 C:\どこか\models-master\research\object_detection\test_imagesにあるファイルをいじったりして、少しいろいろ試してみました。
いきなり。。がっくし
こういう写真だと何も検出されません(笑)
人は検出精度よさそうです。
人がいると、衝突回避しないといけないので、人が検出できるといいなぁ~って思ってやってみようというのがはじまりなので、この学習済みモデルは、Personの位置を出すには使えそうです。
犬は?
Birdって出てきます(笑) まぁ、二本足だからなぁ。。でも あと1匹は検出されないのか??
やはり、自分が検出したい写真を用意して、学習させないと無理っぽいですね。
今後の予定
寿司を検出する人の前例があるので、ここを参考にすると良さそうです。CPUだけじゃ何十日もかかるみたいです。GPUクラウド使うしかなさそうですね。Floydhubでやれば安価にできそうですが。
https://qiita.com/watanabe0621/items/0b1cfa2d89c8321767e2
一回やりかけているんですが・・・(笑)
【GPU】100時間まで無料?Floydを使ってみた。Jupyter Python Tensorflow+Keras【機械学習】
あとは、RasberryPiでTensorflow,OpenCV でSSD_kerasという方法で物体検出しているのを見つけたので、それもやってみようかな?でも遅すぎるって書いてあるなぁ~。。Movidiusとかないとやっぱダメなのかな?
http://ai-coordinator.jp/raspberry-pi-ssd-keras
参考にしたサイト
もう日本語のサイトの記事って、本当にやったのかな?って思うほどGoogleのインストールマニュアルのままだったりするんですが。。 日本のIT系のサイトやブログ大丈夫か?まぁ、みんな素直にGoogle Cloudでやるのがいいんでしょうけどね(^^; でも・・あんまり日本語で情報ないっていうのは、ひょっとしたら、ぼくだけがおかしいのかもですけど。。
https://pythonprogramming.net/introduction-use-tensorflow-object-detection-api-tutorial/
このPythonprogramming.netはわりと正確に書かれています。PythonのVersion違いなどでも検証しているので、参考になります。今回、こいつがなかったら、build_test.pyをすっとばしても動くってことに気が付かなかったです(笑)
あと、Stackoverflowも、信用しちゃだめですね。。余計に深みにはまる。
https://stackoverflow.com/questions/46491112/protoc-object-detection-protos-proto-no-such-file-or-directory
こいつに騙されて・・しまったのよねぇ~。Git hubのissuesの方がまだ正確ってことが今回わかりました(笑)
おんなじようなことで困った人が助かりますように!
コメントを残していただけるとありがたいです