Googleから一般物体検知の新しいAPIが発表されました。(Tensorflow Object Detection API)
このAPIは最新の一般物体検知技術と様々な画像認識(分類)技術を組み合わせた、学習済みのディープラーニングネットワークを利用することができます。
今回は、Object Detection APIの環境構築と実行までを解説したいと思います。
基本環境
OS: macOS Sierra 10.12.5
TensorFlow: 1.2 (virtualenv実行)
Python: 2.7.10
TensorFlow Object Detection APIのコードをGitHubからcloneする
TensorFlow Object Detection APIはTensorFlowの機械学習モデルの一つとしてオープンソースで公開されています。(GitHub公開: TensorFlow Models)
TensorFlow Object Detection APIを動かすには、まずソースコードをローカルPCにダウンロードするかCloneします。
ここでは、Cloneして動作させたいと思います。
作業フォルダに移動して、git cloneを実行します。
$ cd dev_tensorflow $ git clone https://github.com/tensorflow/models.git
TensorFlow Object Detection APIのセットアップ
Object Detection APIを動かすには依存ライブラリをインストールする必要があります。
依存ライブラリ
Protobuf 2.6
Pillow 1.0
lxml
Jupyter notebook
Matplotlib
pythonパッケージの場合はpipコマンでインストールできますが、「Protobuf」はpipでインストールできないので、パッケージ管理ソフトからインストールします。
Ubuntuの場合は「apt-get」を利用します。
$ sudo apt-get install protobuf-compiler
MacOSの場合は最近一般的な「homebrew」を利用します。
$ sudo brew install protobuf
ライブラリのインストールが終わったら、cloneしたmodelsフォルダに移動して以下の作業を行います。
Protobufのコンパイル
APIを利用する前にProtobufをコンパイルします。
$ protoc object_detection/protos/*.proto --python_out=.
PYTHONPATHの追記
PYTHONPATHにslimディレクトリのパスを追記します。因みに、slimディレクトリはCloneしたmodelsフォルダに含まれています。(virtualenvでTensorFlowを動かしている場合は、起動の度に毎回実行する必要があります。面倒な場合は.bashrcに追記しておくと良いでしょう。)
$ export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
Testコマンドの実行
APIを動かす環境の準備が正しく完了したかどうかtestスクリプトを実行して確認します。
$ python object_detection/builders/model_builder_test.py
「OK」と表示されたらObject Detection APIを動かす準備が整いました。
TensorFlow Object Detection APIの実行
Object Detection APIを実行させる準備が完了したので、サンプルコードを動かしてみます。
サンプルコードはjupyterベースになっているので、簡単にステップバイステップで動かすことができます。
models/object_detectionに移動して、jupyterを実行させます。
$ cd object_detection/ $ jupyter notebook
ブラウザからjupyterのローカルホストにアクセスして、「object_detection_tutorial.ipynb」をクリックして開きます。
上部の実行ボタンをクリックするとコードが逐次実行されるので、最後のコードまでボタンを押して実行させます。(途中の「Download Model」のところでしばらく時間がかかります。)
最後まで実行させると、以下のような画像が表示されて正しく物体検知できていることが確認できます。
テスト画像の変更
物体検知させる画像を変更するには、「TEST_IMAGE_PATHS」部分のコードを変更します。
# For the sake of simplicity we will use only 2 images: # image1.jpg # image2.jpg # If you want to test the code with your images, just add path to the images to the TEST_IMAGE_PATHS. PATH_TO_TEST_IMAGES_DIR = 'test_images' TEST_IMAGE_PATHS = [ 任意の画像ファイルへのパスを書く] # Size, in inches, of the output images. IMAGE_SIZE = (12, 8)
物体検知モデルの変更
サンプルコードでは物体検知のディープラーニングネットワークに、Single Shot Multibox Detector (SSD)にMobileNetを組み込んだネットワークモデルを使っています。
Object Detection APIでは下記の学習済みネットワークモデルを使用できます。
学習済みモデル | ネットワークモデル名 |
---|---|
SSD with MobileNet | ssd_mobilenet_v1_coco_11_06_2017 |
SSD with Inception V2 | ssd_inception_v2_coco_11_06_2017 |
R-FCN with Resnet 101 | object_detection/rfcn_resnet101_coco_11_06_2017 |
Faster RCNN with Resnet 101 | faster_rcnn_resnet101_coco_11_06_2017 |
Faster RCNN with Inception Resnet v2 | faster_rcnn_inception_resnet_v2_atrous_coco_11_06_2017 |
ネットワークモデルを変更するには、ソースコードの「MODEL_NAME」の箇所を上記のネットワークモデル名に変更します。
# What model to download. MODEL_NAME = ‘使用するネットワークモデル名' MODEL_FILE = MODEL_NAME + '.tar.gz' DOWNLOAD_BASE = 'http://download.tensorflow.org/models/object_detection/' # Path to frozen detection graph. This is the actual model that is used for the object detection. PATH_TO_CKPT = MODEL_NAME + '/frozen_inference_graph.pb' # List of the strings that is used to add correct label for each box. PATH_TO_LABELS = os.path.join('data', 'mscoco_label_map.pbtxt') NUM_CLASSES = 90
コメント