Tensorflowを利用して物体検出を行うためのフレームワーク「Tensorflow Object Detection API」を用いて、街中の画像に映っている人間を検出してみます。

チャレンジ&ナレッジ最終更新日: 20190618

Tensorflow Object Detection APIを使って街中で人間を検出してみた

  • このエントリーをはてなブックマークに追加

ディープラーニングを用いて、1枚の画像を与え、何が写っているかを推定する技術を画像認識(Image Classification)といいます。一方で、物体検出(Object Detection)は画像のどこになにが写っているかを当てるという、より複雑な推定技術です。監視カメラの映像分析や顔認証システムなどにも応用されています。

Tensorflow Object Detection APIとは?

画像認識以上に複雑な処理を行わなければならないと思うと、少々ハードルが高く感じるかもしれませんが、既に物体検出の実装をサポートしてくれるフレームワークがいくつもあります。

今回は、Tensorflowを利用して物体検出を行うためのフレームワーク「Tensorflow Object Detection API」を使います。
Tensorflow Object Detection APIは下記から入手できます。

“Tensorflow Object Detection API”
https://github.com/tensorflow/models/tree/master/research/object_detection

画像認識を行う際も大量の画像データが必要ですが、物体検出をするには、さらに検出したい物体の種類の数だけ必要な画像データが増えてしまいます。

Tensorflow Object Detection APIでは学習済みのモデルが用意されており、80種類の物体を認識することができるため、気軽に物体検出を試すことができます。

Tensorflow Object Detection APIのチュートリアルを試す

環境構築

Windows10でTensorFlow Object Detection APIを試すのに必要な環境構築を行なっていきます。

まずは、ANACONDAで実行環境を立ち上げます。ANACONDAのインストール方法については下記の記事を参考にしてください。

“TensorFlowを使って顔面補正してる写真かしてない写真かを判定してみた”
https://www.pc-koubou.jp/magazine/15856

実行環境が立ち上がったら、以下のコマンドで「TensorFlow」と必要なライブラリをインストールしてください。

pip install tensorflow

pip install Protobuf Pillow lxml
pip install Jupyter
pip install Matplotlib

続いて、TensorFlowのモデルをダウンロードします。以下のGitHubからmodels-master.zipをダウンロードし、展開してください。

“Tensorflow Models”
https://github.com/tensorflow/models

次に、Protocol Buffersを導入します。Tensorflowで用いるグラフ定義はProtocol Bufferというフォーマットを用いてシリアライズされており、これをコンパイルするために使用します。

下記のGitHubからダウンロードができます。今回はprotoc-3.4.0-win32.zipを使用しました。ダウンロード後、展開したフォルダ内にあるbinの中のprotoc.exeを先にダウンロードしたTensorFlowのモデルのフォルダmodels-master内に移動させます。

“Protocol Buffers”
https://github.com/protocolbuffers/protobuf/releases

その後、環境変数の設定から「PYTHONPATH」を通します。
環境変数の設定は、「コンロトールパネル」→「システム」→「システム詳細設定」→「環境変数」から行うことができます。

変数「PYTHONPATH」の値を設定変数「PYTHONPATH」の値を設定

ここで、変数「PYTHONPATH」の値を次のように設定します。

C:/~~~/models-master/research;C:/~~~/models-master/research/slim

「~~~」の部分には、TensorFlowのモデルのフォルダmodels-masterを保存した場所のパスを入力してください。

最後に、コマンドプロント上でmodels-master内にあるフォルダresearchまで移動し、Protocol Buffersを使用してProtobufをコンパイルします。

cd ~~~ /models-master/research
# ~~~にmodels-masterを保存した場所のパスを入力

protoc object_detection/protos/*.proto --python_out=.
# protbufをコンパイル

エラー等何も返ってこなければ、無事にコンパイル完了です。

「models-master/research/object_detection/protos」でPythonファイルが生成されているので、それも確認してください。

生成されているPythonファイルを確認生成されているPythonファイルを確認

ここで、「OK」と表示されれば、環境構築完了です。

サンプルデータの物体を検出してみる

Tensorflow Object Detection APIのチュートリアルで用意されているサンプルデータの物体を検出してみます。

まずは、以下のコマンドでresearch内にあるフォルダobject_detectionに移動します。

cd object_detetion
 # researchからの移動

そして、以下のコマンドでjupyter notebookを起動します。

Jupyter notebook

以下のようにブラウザが開きます。

ブラウザで「jupyter notebook」が開くブラウザで「jupyter notebook」が開く

ファイル一覧の中にあるobject_detection_tutorial.ipynbをクリックして開きます。

「Cell」の中から「ALL RAN」をクリックすると、サンプルで用意されている画像についての判定結果が出力されます。

自分で用意した画像の物体を検出してみる

先ほどサンプルで判定した画像はフォルダobject_detection内にあるtest_imagesにあります。このフォルダに自分で用意した新たな画像を追加すると、物体検出を行うことができます。

このとき、画像の名前は「image3.jpg」、「image4.jpg」、「image5.jpg」…としてください。

さらに、jupyter notebook上で「Helper code」の以下の「*」の箇所を編集してください。

PATH_TO_TEST_IMAGES_DIR = 'test_images'
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(1, *) ]

上記「*」の数字を追加した最後の画像のファイル名の数字+1にしてください。

image5.jpgまで追加した場合は、以下のようになります。

PATH_TO_TEST_IMAGES_DIR = 'test_images'
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(1, 6) ]

今回は以下の画像3枚で実行してみました。

すると、以下のような結果が出力されました。

「person」や「couch」はうまく検出できていますが、特に2枚目と3枚目については「dog」と「cat」の分類が難しかったようです。場所を正確に当てることはできていますが、写っているものがなにかを当てるまでには至らず、2枚目の左側の犬と猫については「teddy bear」という結果に、3枚目の猫は「dog」、おしい!

歌舞伎町で人間を検出してみた

せっかくなので、自ら撮影した画像を学習させて物体検出をしてみることにしました。

本当は男女の区別や特定の人物の検出までやってみたいと思っていたので、とにかくたくさん人がいる新宿歌舞伎で撮影を行いましたが、詳細な検出はうまくいきませんでした。

しかし、人間の検出のみはうまくいったので、その結果を載せます。
※実際の検出は動画で行っていますが、ここでは顔がハッキリと写っていないカットのみ静止画で掲載します。

黄緑枠が人間として検出された部分黄緑枠が人間として検出された部分
(一部画像加工しています)

たまに人間でない部分を「human」とするような誤りもありますが、概ね全身が写っている人間に対しては検出することができました。

繁華街にいる人の属性が分かれば、マーケティングなどに役立ちそうです。

今回自分で撮影した画像データへのラベリング(どれが何の画像かをラベル付けする)には、「labelImg」というツールを使用しました。

“LabelImg”
https://github.com/tzutalin/labelImg

今回は100枚ほど(うまくいかなかったデータも合わせると500枚くらい?)のラベリングを手作業で行いましたが、これが意外とハードで…何千枚、何万枚もしなくては正確な結果が出ないと思うと気が遠くなりました。

Tensorflow Object Detection APIの公開データセットではデータのかさ増しを行うことができるオプションもあったので、今度はそのオプションも使用しながら、人間の属性や特定の人物の検出にリベンジしてみたいと思います。

男女の判別や特定人物の推定にも挑戦したい

以上、身の回りでも応用されつつある物体検出の技術をTensorflow Object Detection APIを使用して、試してみました。

今回、男女の判別や特定の人物の推定なども行いたかったのですが、データ不足や特徴差があまりなかったために、うまくいきませんでした。もっとたくさんのデータを集めて、ぜひリベンジしてみたいと思います。

ただ、上記で紹介したTensorflow Object Detection APIのデータセットを使用すれば、そんな苦行をせずとも80種類もの物体を検出することができるので、気軽に物体検出を試してみたいという方もぜひチャレンジしてみてください。

ranranプロフィール画像
ライタープロフィール ranran

工学部女子大生とライターをしています。卒業研究で彼氏の浮気を防ぐためにSNS上で彼氏と彼氏のフォロワーの親密度推定に挑戦中。大学院では計量言語学を専攻予定。

記事を
シェア