ホーム » R-CNN

R-CNN」カテゴリーアーカイブ

TensorFlow 一般物体検出 API


TenosorFlow 一般物体検出 API

作成 : (株)クラスキャット セールスインフォメーション
日時 : 06/20/2017

 

概要

Google Research Blog の 6月15日付けの記事によれば、TensorFlow ベースの「一般物体検出 API (Object Detection API)」を公開して利用可能にしたとのことです :

物体検出の先端技術である Faster R-CNN や SSD が利用可能になっています。

日本語記事では以下の techcrunch ベースの記事が詳しいです :

一般物体検出については TensorFlow で「一般物体検出」入門 も参考にしてください。

以下は実際にチュートリアルで検出を実行して出力した画像サンプルです :

 

チュートリアル

jupyter ベースのチュートリアルが用意されていますので、さっそく試してみましょう。

Imports

import numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
import tensorflow as tf
import zipfile

from collections import defaultdict
from io import StringIO
from matplotlib import pyplot as plt
from PIL import Image

環境設定

%matplotlib inline
sys.path.append("..")

物体検出 imports

from utils import label_map_util
from utils import visualization_utils as vis_util

モデル準備

変数

export_inference_graph.py ツールを使用して export されたモデルはどれでも単に PATH_TO_CKPT を新しい .pb ファイルを指すように変更することでここでロード可能です。

ここでデフォルトでは “SSD with Mobilenet” を使用します。他のモデルのリストについては detection model zoo を見てください、様々な速度と精度の創造的なモデルを実行することができます。

# What model to download.
MODEL_NAME = 'ssd_mobilenet_v1_coco_11_06_2017'
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

モデルのダウンロード

opener = urllib.request.URLopener()
opener.retrieve(DOWNLOAD_BASE + MODEL_FILE, MODEL_FILE)
tar_file = tarfile.open(MODEL_FILE)
for file in tar_file.getmembers():
    file_name = os.path.basename(file.name)
    if 'frozen_inference_graph.pb' in file_name:
        tar_file.extract(file, os.getcwd())

(凍結した (frozen)) Tensorflor モデルをメモリにロードする

detection_graph = tf.Graph()
with detection_graph.as_default():
    od_graph_def = tf.GraphDef()
    with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
        serialized_graph = fid.read()
        od_graph_def.ParseFromString(serialized_graph)
        tf.import_graph_def(od_graph_def, name='')

ラベル・マップをロードする

ラベル・マップはインデックスをカテゴリー名にマップします、その結果、畳み込みネットワークが 5 と予測したときにこれが飛行機に相当することを知ることができます。ここでは内部的なユティリティ関数を使用しますが、整数を適切な文字列ラベルにマップする辞書を返すのであればどんなものでもかまいません。

label_map = label_map_util.load_labelmap(PATH_TO_LABELS)

categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True)

category_index = label_map_util.create_category_index(categories)

ヘルパー・コード

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)

検出

# 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 = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(1, 3) ]

# Size, in inches, of the output images.
IMAGE_SIZE = (12, 8)
with detection_graph.as_default():
  with tf.Session(graph=detection_graph) as sess:
    for image_path in TEST_IMAGE_PATHS:
      image = Image.open(image_path)
      # the array based representation of the image will be used later in order to prepare the
      # result image with boxes and labels on it.
      image_np = load_image_into_numpy_array(image)
      # Expand dimensions since the model expects images to have shape: [1, None, None, 3]
      image_np_expanded = np.expand_dims(image_np, axis=0)
      image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
      # Each box represents a part of the image where a particular object was detected.
      boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
      # Each score represent how level of confidence for each of the objects.
      # Score is shown on the result image, together with the class label.
      scores = detection_graph.get_tensor_by_name('detection_scores:0')
      classes = detection_graph.get_tensor_by_name('detection_classes:0')
      num_detections = detection_graph.get_tensor_by_name('num_detections:0')
      # Actual detection.
      (boxes, scores, classes, num_detections) = sess.run(
          [boxes, scores, classes, num_detections],
          feed_dict={image_tensor: image_np_expanded})
      # Visualization of the results of a detection.
      vis_util.visualize_boxes_and_labels_on_image_array(
          image_np,
          np.squeeze(boxes),
          np.squeeze(classes).astype(np.int32),
          np.squeeze(scores),
          category_index,
          use_normalized_coordinates=True,
          line_thickness=8)
      plt.figure(figsize=IMAGE_SIZE)
      plt.imshow(image_np)

デフォルトでは以下の2つが表示されます :

テスト画像を入れ替えてみます。最初はクラスキャットのマスコット猫 :

以下は ImageNet からの画像です (* 元画像の版権は所有者に帰属します) :

 

以上

TensorFlow で「一般物体検出」入門

TensorFlow で「一般物体検出」入門

TensorFlow の急速な普及等もあり、画像全体の情報からクラス分類を行なう「物体認識」については畳み込みニューラルネットワーク (ConvNet or CNN = Convolutional Neural Network) を利用することで手軽に成果が出せるようになりました。

画像認識については TensorFlow : Tutorials : 画像認識 (翻訳/解説) が良い参考になります。

しかしながら、画像上の(顔や歩行者のように)限定的でない複数種類の物体の位置を特定してそれぞれをクラス分類する一般「物体検出」を行なうためには、それ以外にも多岐に渡る技術が必要となります。そして畳み込みニューラルネットワークを軸とする一般物体検出はここ2、3年の間に急速に発展しています。

クラスキャットでは TensorFlow ベースの一般物体検出ソリューション「ClassCat® ObjDetector v1.0」の提供を開始 することを既にニュースリリース致しましたが、ニュースリリースでは技術的な詳細はふれていませんので、ここでは一般物体検出入門として、基礎知識となる幾つかのペーパーを紹介して abstract を翻訳するとともに、具体的な検出例を幾つか示しておきます。

基礎知識

ConvNet を利用した一般物体検出における一つの流れとして R-CNN (Region-based CNN or Regions w/CNN features) があり、初出のペーパーは以下です :

Rich feature hierarchies for accurate object detection and semantic segmentation
R. Girshick, J. Donahue, T. Darrell, J. Malik
(Submitted on 11 Nov 2013 (v1), last revised 22 Oct 2014 (this version, v5))

Abstract :

物体検出性能は、標準的な PASCAL VOC データセット上で計測されているようにここ数年定常状態にあります。最高性能の方法は典型的には複数の低位の画像特徴を高位のコンテキストと統合した複雑なアンサンブル・システムです。このペーパーでは単純でスケーラブルな検出アルゴリズムを提案します。これは VOC 2012 上 mean average precision (mAP – 平均精度の平均) を以前のベストな結果に比較して 30 % 以上改善します — 53.3 % の mAP を獲得しています。私たちのアプローチは2つのキーとなる洞察を統合しています: (1) 物体群を位置特定して segment するためにボトムアップされた候補領域 (region proposals) に対して大容量 CNN 群を適用できます。そして (2) ラベル付けされたトレーニング・データが乏しい時、補助タスクのための教師あり事前トレーニングは、ドメイン固有な fine-tuning を続けることで、本質的な性能ブーストを生み出します。候補領域を CNN と統合しているので、私たちの方法を R-CNN (Regions with CNN features) と呼称します。また R-CNN を OverFeat とも比較します、これは最近(訳注: = ペーパー submit 時)提案された、類似の CNN アーキテクチャに基づくスライディング・ウィンドウ検出器です。200-クラス ILSVRC2013 検出データセット上、R-CNN は OverFeat よりも大差で優れていることを見出しました。

 
以後、時間を置かずに Fast R-CNN 更には Faster R-CNN が公開されます。
上の abstract でも言及されていますが、物体検出関連の初期のペーパーで良く参照される OverFeat のペーパーは以下です :

OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks
Pierre Sermanet, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus, Yann LeCun
(Submitted on 21 Dec 2013 (v1), last revised 24 Feb 2014 (this version, v4))

Abstract :

分類、位置特定そして検出のための畳み込みネットワークを使用するための統合フレームワークを提案します。マルチスケールとスライディング・ウィンドウによるアプローチが ConvNet の中でどのように効率的に実装されるかを示します。また物体境界を予測するために学習することによる位置特定に対する新しい深層学習アプローチを導入します。そして検出信頼度を上げるためにバウンディングボックスは suppressed されるよりも 蓄積 (accumulated) します。単一供給ネットワークを使用して異なるタスクが同時に学習できることを示します。この統合フレームワークは ImageNet Large Scale Visual Recognition Challenge 2013 (ILSVRC2013) の位置特定タスクの勝者でありそして検出と分類タスクのための非常に競争力のある結果を得ています。post-competition ワークでは、検出タスクに対して新しい最先端を打ち立てました。最終的に、OverFeat と呼ばれるベストモデルから特徴抽出器をリリースします。

 
但し、より実践的で後続の研究に影響を与えているのは SPP-net でしょう。畳み込みの積層の最後の (max) プーリング層を spatial pyramid pooling と置き換えて任意のサイズ/スケールが扱えるようにした点がキーポイントです :

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun
(Submitted on 18 Jun 2014 (v1), last revised 23 Apr 2015 (this version, v4))

Abstract :

既存の深層畳み込みニューラルネットワーク (CNN) は固定サイズ (e.g., 224 x 224) の入力画像を要求します。この要求は “人工的 (artificial)” で任意のサイズ/スケールの画像 or 部分画像に対する認識精度を減少させるかもしれません。このワークでは、上記の要件を取り除くためにネットワークに他の pooling ストラテジー “spatial pyramid pooling” を持たせます。SPP-net と呼ばれる新しいネットワーク構造は画像サイズ/スケールにかかわらず固定長の表現が生成できます。Pyramid pooling はまた物体 deformations(変形)に対して堅牢です。これらの利点によって、SPP-net は一般に全ての CNN ベースの画像分類法を改善するはずです。ImageNet 2012 データセット上、SPP-net が(異なる設計にもかかわらず)様々な CNN アーキテクチャの精度をブーストすることを示します。Pascal VOC 2007 and Caltech101 データセット上、SPP-net は単一のフル画像表現を使用して fine-tuning なしで最先端の分類結果を獲得しました。

SPP-net の力はまた物体検出において本質的です。SPP-net を使用して、画像全体から一度だけ特徴マップを計算し、そして検出器をトレーニングするために固定長の表現を生成するために任意の領域(部分画像)のプール特徴を計算します。この方法は繰り返し畳み込み特徴を計算することを回避します。テスト画像を処理する際、この方法は R-CNN 法よりも 24 – 102 倍速いです、その一方で Pascal VOC 2007 上より良いまたは同程度の精度を獲得しています。

ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 2014 においては、この方法は全 38 チームの中で物体検出で #2 にランクされそして画像分類で #3 にランクされました。 この原稿はまたこのコンペに対して行なわれた改善も紹介します。

 
それから前処理に良く使用される Selective Search です :

Selective Search for Object Recognition
J.R.R. Uijlings, K.E.A. van de Sande, T. Gevers, and A.W.M. Smeulders
Technical Report 2012, submitted to IJCV

Abstract :

このペーパーは物体認識で用いる、可能性のある物体位置を生成する問題に対処します。Selective Search を導入します、これは exhaustive(しらみつぶし) search とセグメンテーションの強みを結合します。セグメンテーションのように、サンプリング・プロセスを導くために画像構造を使用します。exhaustive search のように、すべての可能性ある物体位置を捉えることを目指します。可能性のある物体位置を生成するために単一の技術の代わりに、できる限り多くの画像条件を処理するために検索を多様化して各種の補完的な画像分割を使用します。selective search はデータ駆動、クラス独立、高品質な位置の小さなセットという結果になり、99 % recall と 10,097 位置において 0.879 の Mean Average Best Overlap を生みだします。exhaustive search に比べて位置の数の減少は物体認識のためにより強い機械学習テクニックとより強い appearance(見え方)モデルの利用を可能にします。このペーパーでは selective search が認識のためにパワフルな Bag-of-Words モデルの利用を可能にすることを示します。

TensorFlow による一般物体検出例

以下は TensorFlow ベースの一般物体検出ソリューション「ClassCat® TF-Detector v1.0」を利用した検出例です。

※ 画像は全て ImageNet の URL を利用しており、元画像の版権は所有者に帰属しています。
※ トレーニング途上のモデルを使用しましたので、精度は更に改善されます。

objdet_imagenet_desktop00

 
objdet_imagenet_desktop02

 
objdet_imagenet_highway02

 
以上

AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com