20200712のTensorFlowに関する記事は2件です。

TensorFlowでの物体検出が超手軽にできる「Object Detection Tools」をTensorFlow 2.xに対応しました

odt_02.png

素材提供:「変デジ研究所」 ロンスタさん

Object Detection APIがTensorFlow2.x対応

 全世界待望(?)のTensorFlowの物体検出ライブラリ「Object Detection API」がTensorFlow 2.x対応しました。

TensorFlow 2 meets the Object Detection API

 というわけで、このObject Detection APIを手軽に使える拙作のツール「Object Detection Tools」もTensorFlow 2.xに対応したスクリプトを早速作成して追加しました。

 「Object Detection API」と「Object Detection Tools」に関しては、以下記事を参照下さい。

TensorFlowの物体検出用ライブラリ「Object Detection API」を手軽に使えるソフト「Object Detection Tools」を作ってみた

 TensorFlow2.x対応したのは物体検出の推論部分だけで、Macでしか動作確認していませんが、LinuxやRaspberry Pi、Jetson Nanoでも動くと思います(そのうち確認します、誰か試して報告してくれたらとても嬉しいです)。WindowsもWSLでパスとかを工夫すれば動くのじゃ無いかなと期待しています。

 学習に関しては、まだTensorFlow2.xに対応していません。こっちを対応しろよという話かもしれませんが、多分やることはほとんど同じだと思いますので、とりあえず以下のTensorFlow1.xでの学習方法を参考にしてみてください。

TensorFlowの「Object Detection API」で物体検出の自前データを学習する方法

 気が向いたら、そのうち書こうかと思います。

「Object Detection Tools」での物体検出スクリプトの使い方

「Object Detection Tools」を使って、物体検出を手軽に実現する方法を書きたいと思います。「Object Detection API」は、公式のチュートリアルだと、色々事前準備が必要なのですが、こちらの方法だとTensorFlowとOpenCVさえあればサクッとリアルタイムの物体検出ができます。

環境構築

 MacとLinuxを想定しています。動作確認は以下のMacのみで実施しています(Linuxは未確認)。

  • iMac(Retina 4K, 21.5-inch, 2017)
  • 3.6GHz Intel Core i7
  • メモリ 16GB
  • macOS 10.13.6

 Python環境はPyenv + Anacondaを使ってセットアップしました。以下記事を参考にPyenvとAnacondaのインストールをします。

pyenv/pyenv-virtualenv/Anacondaを使ってクリーンなPython環境をセットアップ

 続いて、以下コマンドを実行してPython環境を構築します。

$ pyenv install 3.8.2
$ conda create -n od anaconda
$ pip install --upgrade pi
$ pip install tensorflow==2.2.0
$ pip install opencv-python

 インストールするのは、TensorFlow(+関連のライブラリ)とOpenCVだけです。

「Object Detection Tools」による物体検出

 最初にリポジトリをクローンします。

$ cd && git clone https://github.com/karaage0703/object_detection_tools

 TensorFlowで使用できる学習モデルのリンク先一覧は「Model Zoo」(モデルの動物園)と呼ばれ「Object Detection API」のリポジトリ内にあります。TensorFlow 1.x用とTensorFlow 2.x用があります。

TensorFlow 1 Detection Model Zoo

TensorFlow 2 Detection Model Zoo

 もちろん、今回はTensorFlow 2.x用の「Model Zoo」を使います。「Object Detection Tools」には、ダウンロードのスクリプトも用意していあります。今回は、CenterNetとEfficientDetを使ってみます。

CenterNet

 まずは、CenterNetを試してみます。以下コマンドを実行して、モデルをダウンロードします。

$ cd ~/object_detection_tools/models
$ ./get_centernet_hg104_512x512_coco17_tpu-8.sh

 TensorFlow 1.xでは、学習済みのモデルはFreezeGraph形式(多くがfrozen_inference_graph.pbという名前で保存されています)が使われていました。しかし、FreezeGraph形式は、TensorFlow2.xでは非推奨となりsaved model形式(多くがsaved_model.pbという名前で保存されています)が使われるようになっています。拡張子が同じ.pbなので違いが分かりにくいですが、中身のフォーマットは異なるので注意が必要です。この辺りは、詳細は割愛しますが、以下のGoogle ColabのNotebookをみると多少理解が深まるかもしれません。

inference_from_saved_model.ipynb

 続いて、CenterNetの学習済みのモデルを使って、物体検出のテストをします。PCにカメラがついている場合(Mac Book/iMac等)は、以下のコマンドを実行して下さい。もしカメラがなければ、適当なWebカメラでも大丈夫と思います。

 コマンドは以下となります。

$ cd ~/object_detection_tools
$ python3 scripts/object_detection_tf2.py -l='./models/coco-labels-paper.txt' -m='./models/centernet_hg104_512x512_coco17_tpu-8/saved_model/'

上記のプログラムは-lのオプションでラベル、-mのオプションで使用するsaved_modelのあるディレクトリを指定します。実行するとカメラが起動して、以下のようにリアルタイムに物体検出の結果が表示されます。速度はPCに依存しますが、FPSは0.6程度と結構遅めです。

odt_01.png
 静止画ですが、実際は動画です。

 ちなみに実行すると、大量のwith ops with custom gradients. Will likely fail if a gradient is requested.というwarningが出ますが、この道の求道者である @PINTO さん曰く「無視して大丈夫です。」とのことなので、安心(?)して無視しましょう。

EfficientDet

 他のモデルの場合も、同じ要領で簡単に試すことができます。次はEfficeintDetモデルで試して見ましょう。一番軽量なD0というモデルを試します。モデルのダウンロード方法は以下です。

$ cd ~/object_detection_tools/models
$ ./get_efficientdet_d0_coco17_tpu-32.sh

 続いて、物体検出のコマンドは以下です。

$ cd ~/object_detection_tools
$ python3 scripts/object_detection_tf2.py -l='./models/coco-labels-paper.txt' -m='./models/efficientdet_d0_coco17_tpu-32/saved_model/'

odt_02.png

 FPSは4程度と、CenterNetよりかなり高速ですね。

その他のモデル

 その他のモデルも、同じ要領でモデルをダウンロードして使用することができます。スクリプトをみて「Model Zoo」のリンク先を確認すれば、すぐ真似て他のモデルも試すことができると思います。

TIPS・機能

ディープモザイク機能

 ウィンドウ上でmMを押すと検出した物体がモザイクになります。元に戻したいときはbBを押して下さい。

参考記事:ディープラーニングで動画に自動でモザイクをかける「ディープモザイク」作ってみました

動画の物体検出

 カメラが無い場合は、動画も使用可能です。以下コマンドで動画のフリー素材をダウンロードしましょう。フリー素材は、有名ブログ「変デジ研究所」のロンスタさんの提供です。

$ wget https://raw.githubusercontent.com/karaage0703/ssd_keras/master/free_data/lonestartx_free.mp4

 動画の場合は、以下のコマンドで物体検出が可能です。

$ cd ~/object_detection_tools
$ python3 scripts/object_detection_tf2.py -l='./models/coco-labels-paper.txt' -m='./models/centernet_hg104_512x512_coco17_tpu-8/saved_model/' -d='video' -i='./lonestartx_free.mp4'

 -dオプションでvideoを指定して、-iオプションでファイル名を指定できます。

「Object Detection Tools」でのエッジコンピューティング

 ラズパイ(Raspberry Pi)やJetson Nanoといった小型マイコンでの動作も想定しています。が、まだ動作確認できていません(すみません、そのうちやります)。一応、以下にセットアップ方法だけ書いておきます。

 TensorFlowとOpenCVさえセットアップすれば、基本的には上記方法と同じコマンドで動きます。

Raspberry Pi

 ラズパイのディープラーニングのセットアップ方法は以下記事を参照ください。

Raspberry Pi 4のディープラーニングで画像認識する環境をゼロから1時間で構築する方法

 上記記事は、TensorFlow 1.xのセットアップしか書いてありませんが、TensorFlow 2.xは、@PINTO さんの「Tensorflow-bin」リポジトリを使えば簡単にセットアップできます。

PINTO0309/Tensorflow-bin(GitHub)

 TensorFlow1.xをインストールした後であれば、以下を実行すれば、セットアップできます。

$ wget "https://raw.githubusercontent.com/PINTO0309/Tensorflow-bin/master/tensorflow-2.2.0-cp37-cp37m-linux_armv7l_download.sh"
$ ./tensorflow-2.2.0-cp37-cp37m-linux_armv7l_download.sh
$ sudo pip3 uninstall tensorflow
$ sudo -H pip3 install tensorflow-2.2.0-cp37-cp37m-linux_armv7l.whl

Jetson Nano

 Jetson Nanoに関しては、以下記事を参照にセットアップください。

Jetson NanoにJetPack 4.4を入れてTensorFlow・物体検出・姿勢推定・ROS2(Realsense)・ROS1動かしてみた

「Object Detection API」のGoogle Colaboratoryのチュートリアル

 Google Colaboratory(Google Colab)で動く、良さそうなチュートリアルがあるのですが、リンク切れやConfigファイルの修正がされていない等、もろもろあってそのままでは動きません(何故…)。

 クリックすれば、推論までできるように修正したGoogle Colabのノートブックを公開します。興味ある人は参考にしてみてください。

inference_tf2_colab.ipynb
チェックポイント(ckpt)とObject Detection APIを使って画像の物体検出(推論)をするチュートリアルです。

inference_from_saved_model.ipynb
saved modelを使って画像の物体検出(推論)をするチュートリアルです。Object Detection APIには依存せず、推論をしています。saved modelの理解を深めたい人は参考になるかもしれません。

 Google Colabに関しては、以下記事を参照ください。
Google Colaboratoryを使えば環境構築不要・無料でPythonの機械学習ができて最高

まとめ

 TensorFlow2.xに対応した「Object Detection Tools」で物体検出をする方法を簡単に紹介しました。多くのプラットフォームで簡単に学習済みの物体検出を試すことができますので興味ある方は活用してみてください。

 TensorFlow 2.x対応は、もっとゆっくりやっていこうと思ったのですが @PINTO さん @Kazuhito さんが秒速で「Object Detection API」に手を出し始めたので、刺激とアドバイスを受けつつ、駆け足で一気にやってしまいました。あくまでサンプルスクリプトなので、いい感じのクラス化とかは各自でお願いします。PRはいつでも大歓迎です。

 個人的には、公式にこういったスクリプトが用意されていなかったり、チュートリアルがまともに動かなかったりするのが謎ですが…私のような人が少しでも役に立てるチャンスと前向きに捉えたいと思います。

関連記事

Raspberry Pi 4のディープラーニングで画像認識する環境をゼロから1時間で構築する方法

Jetson Nano関係のTIPSまとめ

Jetson Nanoでリアルタイムに物体検出をする方法(TensorFlow Object Detection API/NVIDIA TensorRT)

TensorFlowの「Object Detection API」で物体検出の自前データを学習する方法

Raspberry PiでPINTOさん謹製「TensorFlowLite-bin」を使ってお手軽に爆速エッジコンピューティング

参考リンク

https://leimao.github.io/blog/Save-Load-Inference-From-TF2-Frozen-Graph/

https://github.com/leimao/Frozen_Graph_TensorFlow/tree/master/TensorFlow_v2

https://www.tensorflow.org/tutorials/distribute/save_and_load

https://qiita.com/t_shimmura/items/1ebd2414310f827ed608

https://qiita.com/parkkiung123/items/13adb482860f356f97f3

https://www.tensorflow.org/guide/saved_model

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Tensorflow・kerasでCNNを構築して画像分類してみる(概要編)

下記の記事で、順伝播型ニューラルネットワークによる手書き画像を扱って予測を行いました。

Tensorfrowで画像分類など学習してみる(手書き文字認識編1)
Tensorfrowで画像分類など学習してみる(手書き文字認識編2)
Tensorfrowで画像分類など学習してみる(手書き文字認識編3)

この記事では畳み込みニューラルネットワークCNN(Convolutional Neural Network)、を使って画像の分類をしてみます。CNNは1980年台に考え方があり、1990年台にLeNetというモデルが考えられました。

CNNモデルの背景

順伝播型ニューラルネットワークでも画像を取り扱うことはできましたが、処理の中で2次元の行列データを1次元のデータに変換して扱っていましたがこの中で画像の持つ情報が損なわれるということがあり考えられたのがCNNです。

順伝播型ニューラルネットワークの記事では、MNISTの手書き文字セットを扱いましたが、28×28のモノクロ画像でした。この画像を784の一次元の行列に変換して処理しました。具体的には

code
x_train = x_train.reshape(60000, 784) 
x_test = x_test.reshape(10000, 784) 

#変換後の構造を確認する。
print('x_train.shape:', x_train.shape)
print('x_test.shape:', x_test.shape)

というコードを書いて変換していました。

画像自体は2次元で表現された場合、被写体の縦・横など位置情報も持っているはずですが、1次元にするとそれが失われるということで、2次元で扱うことができればそれらの情報も保持できます(もっと言えばカラー画像であれば色情報もあるので3次元にもなります)

CNNの構成(概略)

CNNの概要を記載します。C様々途中に活性化関数、最適化手法を組み合わせるなど進化していますが、ここでは大まかな概要をまずはつかみたいと思います。CNNは畳み込み層とプーリング層を重ね、最終的に全結合層と出力層を重ねていく手法です。

CNN.PNG

畳み込み層

畳み込み層は画像に対してカーネル(フィルタ)を重ね計算し画像の特徴量を得るためのものです。このフィルタを用いて実際の画像から特徴マップを作ります。

Convolusion.PNG

CNNではフィルタの値により特徴マップとして得られる値が異なるので、フィルタの値が重みとなり最適化するパラメーターともなります。

プーリング層

特徴マップに対して決められた計算を行い小さくする処理です。この処理をダウンサンプリングまたは単にサンプリングといいます。プーリング層での計算は主に2種類があり、最大値をとるMAXプーリングと平均値をとるAvgプーリングがあります。プーリング層では計算のみを行い学習するべきパラメーターはありません。
pooling.PNG

全結合層・出力層

全結合層では畳み込み層とプーリング層で得られた結果の多次元配列を1次元の状態に戻し、最終的に分類ができる形にします。この処理は順伝播型ニューラルネットワークでも最終的に1次元にしsoftmax関数で多クラスに分類した処理と同義のものです。

まとめ

概要をつかみどんな層が必要かを見てきました。次回以降はそれぞれの層をTensorFlowとkerasを使って実装していきたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む