2018年8月25日土曜日

OpenCVでTensorflowのSSDモデルを動かす方法


背景

Tensorflowとはgoogleが公開している機械学習プログラムです。
OpenCVとは画像処理プログラムです。
SSD(Single Shot Multi Detector)とは単一画像から複数の物体を認識する手法の名前です。

OpenCVにTensorflowのデータを扱うための関数が用意されているので、TensorflowのSSD用の学習結果をOpenCVで動かしてみました。

使ったもの

python3とpython3のpipを動かせる環境
python3とpipのバージョンはこちらです。
python3 --version
Python 3.6.3
pip3 --version
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)

OpenCVをインストール

関連プログラムをインストールします。
sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt install libcblas-dev libatlas3-base libilmbase12 libopenexr22 libgstreamer1.0-0 libqtgui4 libqttest4-perl

OpenCVをインストールします。
pip3 install opencv-python

インストールできたバージョンはこちらです。
pip3 show opencv-python
Name: opencv-python
Version: 3.4.2.17

下記のようにpythonを起動してimportできれば、利用できる状態になっています。(下記のpythonモードは、Ctrl + Dもしくは「exit()」と入力すると終われます。)
python3
import cv2

インストールできない場合は、OpenCV本家の記事や、以前自分が取り組んだときの記事が参考になると思います。

Installation in Linux
PythonでOpenCVを呼び出して、Raspiカメラに写る顔を認識してみた

プログラムを準備

OpenCVのreadNetFromTensorflow関数を利用して物体を認識するプログラムを含むリポジトリをダウンロードします。
sudo apt install git
git clone https://github.com/asukiaaa/py_opencv_ssd_practice.git
cd py_opencv_ssd_practice

学習結果をダウンロード

リポジトリにdataディレクトリを作り、その中に学習済みのデータと、それに対応する設定ファイルをダウンロードします。
mkdir data
cd data
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_11_06_2017.tar.gz
tar -xzvf ssd_mobilenet_v1_coco_11_06_2017.tar.gz
wget https://raw.githubusercontent.com/opencv/opencv_extra/3.3.1/testdata/dnn/ssd_mobilenet_v1_coco.pbtxt
cd ../

実行

下記のように、ダウンロードしたファイルを引数として渡すコマンドで、物体認識プログラムを実行できます。
python3 ssd_mobilenet.py --pb "data/ssd_mobilenet_v1_coco_11_06_2017/frozen_inference_graph.pb" --pbtxt "data/ssd_mobilenet_v1_coco.pbtxt"

うまく動くと、PCに接続しているwebカメラに写る物体を認識してくれます。


課題

ラベルを割り当てたい

githubで公開されているmodel zooのラベルファイルが見当たらなかったので、画像に表示される四角が何を認識しているのか分かりません。
ラベルファイルを見つけたら、割り当てようと思います。

ラベルファイルを公開している場所を教えてもらえると、とても嬉しいです。

最新版の学習結果を読み込めない

Tensorflowの記事に沿って自分で学習したモデルや、記事を書いている時点で最新版の公開されているモデル(ssd_mobilenet_v1_coco_2018_01_28.tar.gz)をOpenCVで読み込もうとすると、エラーが出て処理を進められませんでした。

OpenCVのIssueなどを見ても解決方法を見つけられなかったので、最新版を利用する方法は、自分にとってまだ謎です。

まだ成功していませんが、自分が試したTensorflowで学習してOpenCVで取り込む流れをgithubで公開しています。

create_ssd_from_tensorflow.md

上記の流れを成功させる方法を教えてもらえると、とても嬉しいです。

まとめ

最新版ではない学習結果を利用したものではありますが、readNetFromTensorflow関数を利用して、OpenCVでTensorflowのSSD学習結果を利用して、物体認識ができました。

何かの参考になれば嬉しいです。

参考

TensorFlow Object Detection API で学習済みモデルを使って物体検出
cv::dnn::readNetFromTensorflow errors loading ssd_mobilenet_v1_coco_11_06_2017 in opencv 3.3.1

0 件のコメント :