Tensorflow Object Detection Tutorial by GraphPipe #1

Tensorflow Object Detection TutorialのモデルをGraphpipeにのせてみます。

これまでは単純な画像認識だけでしたが、どのような手順になるでしょうか。

1.サンプルモデルのダウンロード

チュートリアル用ソース(object_detection_tutorial.ipynb)と同じく、ココからダウンロードしたモデルを使用します。

# wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz
# tar zxvf ssd_mobilenet_v1_coco_2017_11_17.tar.gz
# ls -ltr ssd_mobilenet_v1_coco_2017_11_17
-rw-r—–. 1 275875 5000 3038417 Nov 18 2017 model.ckpt.meta
-rw-r—–. 1 275875 5000 8937 Nov 18 2017 model.ckpt.index
-rw-r—–. 1 275875 5000 27380740 Nov 18 2017 model.ckpt.data-00000-of-00001
-rw-r—–. 1 275875 5000 77 Nov 18 2017 checkpoint
drwxr-x—. 3 275875 5000 45 Nov 18 2017 saved_model
-rw-r—–. 1 275875 5000 29112121 Nov 18 2017 frozen_inference_graph.pb

「frozen_inference_graph.pb」があるので、これをそのままGraphPipeにデプロイします。

2.GraphPipeの起動

MNISTやひらがな認識モデルと同じように起動させてみます。

# docker run -it –name od_sample -v “$PWD/../learning:/models/” -p 9005:9005 sleepsonthefloor/graphpipe-tf:cpu –model=/models/frozen_inference_graph.pb –listen=0.0.0.0:9005
WARNING: IPv4 forwarding is disabled. Networking will not work.
INFO[0000] Starting graphpipe-tf version 1.0.0.10.f235920 (built from sha f235920)
2019-04-15 12:19:20.068122: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2019-04-15 12:19:20.112318: I tensorflow/core/common_runtime/process_util.cc:63] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.
INFO[0001] Model hash is ‘d96b65a2206a7b93b9110e4316561a991b33d0ca4d9765704f70cb32f3e16235’
INFO[0001] Using default inputs [image_tensor:0]
INFO[0001] Using default outputs [detection_boxes:0 detection_scores:0 num_detections:0 detection_classes:0]
INFO[0001] Listening on ‘0.0.0.0:9005’

サーバー起動は何も変わらずですね。

Listen Portにアクセスしてみます。

# curl http://127.0.0.1:9005 | head -10
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 –:–:– –:–:– –:–:– 0{
“Name”: “/models/frozen_inference_graph.pb”,
“Version”: “version 1.0.0.10.f235920 (built from sha f235920)”,
“Server”: “graphpipe-tf”,
“Description”: “Implementation of tensorflow model server using graphpipe. Use a graphpipe client to make requests to this server. Default Inputs: [image_tensor:0]. Default Outputs: [detection_boxes:0, detection_scores:0, num_detections:0, detection_classes:0].”,
“Inputs”: [
{
“Name”: “image_tensor:0”,
“Description”: “”,
“Shape”: [

以外とIN/OUTの定義情報がこれで見えるのが助かるんですよね。

  • Default Inputs:
    • image_tensor:0
  • Default Outputs:
    • detection_boxes:0
    • detection_scores:0
    • num_detections:0
    • detection_classes:0

InpurとOutputが変わっているだけで、完全に同じアプローチで使えそうです。

3.テスト

クライアント側のテストコードです。

内容はTutorialの推論部分とほとんど同じです。

from io import BytesIO
from PIL import Image, ImageOps
import numpy as np
import requests
import os
import cv2

from graphpipe import remote

from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util

def load_image_into_numpy_array(image):
(im_width, im_height) = image.size
return np.array(image.getdata()).reshape(
(im_height, im_width, 3)).astype(np.uint8)

image = Image.open(“dog.jpg”)
image_np = load_image_into_numpy_array(image)

data = np.array(Image.open(“dog.jpg”))
data = data.reshape([1] + list(data.shape))

PATH_TO_LABELS = os.path.join(‘data’, ‘mscoco_label_map.pbtxt’)
category_index = label_map_util.create_category_index_from_labelmap(PATH_TO_LABELS, use_display_name=True)

pred = remote.execute_multi(“http://127.0.0.1:9005”, [data], [‘image_tensor’],
[‘detection_boxes’, ‘detection_scores’, ‘num_detections’,
‘detection_classes’])
print(“Class predictions: “, pred[-1][0].astype(np.uint8))
print(“Class predictions: “, pred[-4][0])
print(“Class predictions: “, pred[-3][0])

vis_util.visualize_boxes_and_labels_on_image_array(
image_np,
pred[-4][0],
pred[-1][0].astype(np.uint8),
pred[-3][0],
category_index,
use_normalized_coordinates=True,
line_thickness=8)

cv2.imwrite(“/tmp/test.jpg”, image_np)

普通に動きますね。

シェアする

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

フォローする