PythonでOpenCV DNNを利用して物体検知(Object Detection)する方法

投稿者: | 2019年8月16日

Pythonを利用して、物体を検知する方法について紹介します。

過去(2年前)に実装した時には、物体の中でも顔のみの検知を対象とし、OpenCV Haar Cascade  / dlib / MTCNN (tensorflow版)を比較実装しました。そして、対象としたビデオに適用したところ、MTCNNが最も検出できたフレーム数が多かったため、MTCNNを採用することにしました。

今回、新たに調べた結果、OpenCV DNNが良さそうだと言うことをここで知りました。そこで、今回はOpenCV DNNで実装することにしました。

 

OpenCV DNNについて

OpenCV DNNは、OpenCVの関数の一つですが、バックエンドにディープラーニングのライブラリを読み込んでいるようです。利用できるバックエンドのライブラリとしては、Caffe / Tensorflow / Darknet / ONNX / Torchがあるようです。今回は、Tensorflowを利用して実装します。

 

事前準備

事前準備として、venvを利用した隔離環境を構築します。そして、必要なライブラリであるOpenCVを次の手順でインストールします。

 

サンプル実装

次に、次のようにindex.pyファイルを作成します。

ここで、4行目で学習済みのモデルを読み込んでいますが、既に学習済みのモデルがここで公開されています。また、configファイルは、ここで公開されています。

今回は、MobileNet-SSD v1を利用することにしました。上記のindex.pyと同じ階層にmodelと言うフォルダを作成し、その直下にこのファイルの解凍したファイル群を置き、このファイルをgraph.pbtxtと言う名前で保存します。

さらに、index.pyと同じ階層にsampleと言うフォルダを作成し、その下にimage.jpgと言う名前で適当な入力画像を置きます。私の場合は、次の画像を入力画像として利用しました。

Photo by mentatdgt from Pexels

そして、python index.pyを実行すると、結果の画像が表示されると同時に同じ画像がsampleフォルダの中にoutput.jpgと言う名前で作成されます。私の場合は次のような画像が作成されました。

この結果から、物体として認識されたモノが赤線の四角で囲われていることはわかりますが、どのような物体として認識されたかはわかりません。

そこで、次のようにindex.pyを修正しました。

ここでの主な変更点としては、41行目のテキストを描画した四角の左上に表示するようにした点です。また、表示するテキストは、2行目にあるカテゴリの名前リストを利用しました。

これを実行した結果が次のようになります。

 

感想

今回は、簡単にディープラーニングに触れる方法を紹介しました。実際に学習をさせたり、さらには自分でモデルを設計することはこの段階ではハードルが高いと思います。

ただ、インターネット上には既に学習済みのモデルも多く公開されており、うまく利用シーンを設計できた場合、自ら学習させなくても、サービスを実現できそうな印象です。

 

参考サイト

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください