トップページ -> データベース関連技術 -> 物体認識 -> SSD による物体認識(SnowMasaya / ssd_keras, TensorFlow 1.15, Keras 2.0.9 を使用)
[サイトマップへ]  

SSD による物体認識(SnowMasaya / ssd_keras, TensorFlow 1.15, Keras 2.0.9 を使用)

画像の物体認識を行ってみる. 学習については,学習結果のファイルを所定のサイトからダウンロードしてみる. Keras バージョン1, Python を使うのが前提である.

先人に感謝.

入力画像の例

[image]

出力としては「種類」を表すラベル(下の図では「Person」や「Bicycle」)と、バウンディングボックス

[image]

キーワード: SnowMasaya ssd_keras, Keras 2, Python, Windows インストール


前準備

Python のインストール

virtualenv, virtualenv-wrapper のインストール

git のインストール

(NVIDIA GPU を使うとき)NVIDIA グラフィックスボード・ドライバ,NVIDIA CUDA ツールキットのインストール

次のページの手順により,インストールを行う

参考Webページ:

(NVIDIA GPU を使うとき)NVIDIA cuDNN のインストール

Windows でのインストール手順の詳細は,別ページで説明している.

インストールの要点:https://developer.nvidia.com/cudnn から cuDNN を入手し,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1 などに展開(解凍)し,パスを通しておくこと

隔離された Python 仮想環境の新規作成と,TensorFlow 1.15(旧バージョン)のインストール

  1. 今から作成する隔離された Python 仮想環境の名前と、Pythonのバージョンを決めておく
  2. Windows で,コマンドプロンプトを実行.
  3. virtualenv隔離された Python 仮想環境新規作成し,有効化

    下の例では,隔離された Python 仮想環境の名前をtf1に設定している

    mkvirtualenv tf1
    lsvirtualenv 
    

    [image]
  4. TenforFlow 1.15 のインストール

    このとき,virtualenv の隔離された Python 仮想環境を有効化する(「tf1」のところは、Python仮想環境の名前)

    ※ 「py」は,Windows のPythonランチャーAnaconda 3 内の Python などを間違って使ってしまわないように,Pythonランチャーを使って Python を起動している.Ubuntu では「py」でなく「python3」コマンドを使う.

    ※ 「py -m pip install」は,Python パッケージをインストールするための操作. Ubuntu では,「py -m pip install」の代わりに「pip3 install ...」のように操作すること.

    workon tf1
    py -m pip install --upgrade pip
    py -m pip install -U tensorflow==1.15
    

    [image]

    GPU版の TensorFlow を使いたいとき

    ※ TensorFlow 1.15 では CPU 版と GPU版が 1つのパッケージに統合されている.

    GPU 版 TensorFlow 1.15 を使うために,https://developer.nvidia.com/cuda-10.0-download-archiveから CUDA 10.0 を入手し,インストールしておくこと

    そして,https://developer.nvidia.com/cudnn から cuDNN を入手し,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0 などに展開(解凍)し,パスを通しておくこと

keras matplotlib numpy imageio のインストール

※ 「pip install ...」は,Python パッケージをインストールするための操作. Ubuntu でシステム の python3 を使っているときは,「pip install ...」の代わりに「sudo pip3 install ...」のように操作すること.

workon tf1
pip install -U keras==2.0.9
pip install -U matplotlib numpy imageio   

SnowMasaya / ssd_keras のインストール手順

  1. Windows で,コマンドプロンプトを管理者として実行

    [image]
  2. 以前に,このWebページの手順でインストールしたことがあれば,次の手順で消去

    mkdir c:\pytools
    cd c:\pytools
    rmdir /s /q ssd_keras
    

    [image]
  3. SnowMasaya/ssd_keras のインストール

    git clone https://github.com/SnowMasaya/ssd_keras
    

    [image]
  4. rykov ssd_keras の Web ページに記載の通り,次のWebページを開く

    https://mega.nz/#F!7RowVLCL!q3cEVRK9jyOSB9el3SssIA

  5. 2つの hdfファイルが表示されるので確認する.

    [image]
  6. 2つともダウンロードしたい. 「ZIPとしてダウンロードする」をクリック.

    [image]
  7. SSD.zip というファイルがダウンロードが始まるので確認する.

    [image]
  8. SSD.zip を展開(解凍)し,できたファイルを先ほど展開したディレクトリに置く.

    下の図のように

    [image]

テスト実行

Python コンソールで,SSD.ipynb に記載のコマンドを実行しながら結果を確認したい.

結果は,画像などでプロットされる場合がある. Python でプロットを行いたい.

  1. IPython シェルで,virtualenv の隔離された Python 仮想環境「tf1」を有効化する.

    PyCharm を使う場合は,次の手順である

    1. PyCharm で 「File」→ 「Settings」と操作する

    2. Project: <プロジェクト名>」を展開。 「Project Interpreter」をクリック。

    3. 右上の設定ボタンをクリック。 「Add ...」を選ぶ。

    4. System Interpreter」をクリック。

    5. ホームディレクトリの下の「\Envs\tf1\Scripts\python.exe」を設定

      そのために,まず,ホームディレクトリのアイコンをクリック

      次に,「\Envs\tf1\Scripts\python.exe」を設定.「OK」をクリック。

      virtualenv 配下の python.exe を設定している

    6. 今度は、「Build, Execution, Deployment」を展開。 そして「Concole」を展開。 「Python Concole」をクリック。

    7. Python interpreter」のプルダウンメニューで, 先ほど設定した python.exeを選ぶ。「OK」をクリック。

    8. PyCharm の Python コンソール(Python のシェル)を起動しなおす(あるいは PyCharm を起動し直す).

    9. IPython シェルで,さきほど展開(解凍)したディレクトリに移動

      ssd.py というファイルがあるディレクトリに移動.

      cd C:\pytools\ssd_keras
      sys.path.append("C:\pytools\ssd_keras")
      

      [image]
    10. 使用する GPU のメモリ量を制限したい場合のみ

      次を実行.「1024」のところは,適切に調整すること.

      https://www.tensorflow.org/guide/gpu に記載の手順による.

      from __future__ import absolute_import, division, print_function, unicode_literals
      import tensorflow as tf
      
      gpus = tf.config.experimental.list_physical_devices('GPU')
      if gpus:
        # Restrict TensorFlow to only allocate 1GB of memory on the first GPU
        try:
          tf.config.experimental.set_virtual_device_configuration(
              gpus[0],
              [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=1024)])
          logical_gpus = tf.config.experimental.list_logical_devices('GPU')
          print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
        except RuntimeError as e:
          # Virtual devices must be set before GPUs have been initialized
          print(e)
      

      [image]
    11. ステップ 1 (初期設定)

      次の Python プログラムを実行

      https://github.com/SnowMasaya/ssd_keras/blob/master/SSD.ipynb の「in [1]」に記載の通り.

      from __future__ import absolute_import, division, print_function, unicode_literals
      
      from keras.applications.imagenet_utils import preprocess_input
      from keras.backend.tensorflow_backend import set_session
      from keras.preprocessing import image
      import matplotlib.pyplot as plt
      import numpy as np
      from imageio import imread
      import tensorflow as tf
      
      from ssd_v2 import SSD300v2
      from ssd_utils import BBoxUtility
      import os
      
      plt.rcParams['figure.figsize'] = (8, 8)
      plt.rcParams['image.interpolation'] = 'nearest'
      
      np.set_printoptions(suppress=True)
      

      [image]

      次のようなエラーが出たときは, 「sys.path.append("C:\pytools\ssd_keras")」のようなコマンドを実行の後,やり直す.

      [image]
    12. ステップ 2 (種類の設定)

      次の Python プログラムを実行

      https://github.com/SnowMasaya/ssd_keras/blob/master/SSD.ipynb の「in [2]」に記載の通り.

      voc_classes = ['Aeroplane', 'Bicycle', 'Bird', 'Boat', 'Bottle',
                     'Bus', 'Car', 'Cat', 'Chair', 'Cow', 'Diningtable',
                     'Dog', 'Horse','Motorbike', 'Person', 'Pottedplant',
                     'Sheep', 'Sofa', 'Train', 'Tvmonitor']
      NUM_CLASSES = len(voc_classes) + 1
      

      [image]
    13. ステップ 3 (先ほどダウンロードした学習結果ファイル weights_SSD300.hdf5 の読み込み

      次の Python プログラムを実行

      https://github.com/SnowMasaya/ssd_keras/blob/master/SSD.ipynb の「in [3]」に記載の通り.

      input_shape=(300, 300, 3)
      model = SSD300v2(input_shape, num_classes=NUM_CLASSES)
      model.load_weights('weights_SSD300.hdf5', by_name=True)
      bbox_util = BBoxUtility(NUM_CLASSES)
      

      [image]
    14. ステップ 4 (処理したい入力画像ファイル 5つの読み込み設定)

      次の Python プログラムを実行

      https://github.com/rykov8/ssd_keras/blob/master/SSD.ipynb の「in [4]」に記載の通り.

      inputs = []
      images = []
      img_path = './pics/fish-bike.jpg'
      img = image.load_img(img_path, target_size=(300, 300))
      img = image.img_to_array(img)
      images.append(imread(img_path))
      inputs.append(img.copy())
      img_path = './pics/cat.jpg'
      img = image.load_img(img_path, target_size=(300, 300))
      img = image.img_to_array(img)
      images.append(imread(img_path))
      inputs.append(img.copy())
      img_path = './pics/boys.jpg'
      img = image.load_img(img_path, target_size=(300, 300))
      img = image.img_to_array(img)
      images.append(imread(img_path))
      inputs.append(img.copy())
      img_path = './pics/car_cat.jpg'
      img = image.load_img(img_path, target_size=(300, 300))
      img = image.img_to_array(img)
      images.append(imread(img_path))
      inputs.append(img.copy())
      img_path = './pics/car_cat2.jpg'
      img = image.load_img(img_path, target_size=(300, 300))
      img = image.img_to_array(img)
      images.append(imread(img_path))
      inputs.append(img.copy())
      inputs = preprocess_input(np.array(inputs))
      

      [image]
    15. ステップ 5 (予測処理)

      次の Python プログラムを実行

      https://github.com/rykov8/ssd_keras/blob/master/SSD.ipynb の「in [5]」に記載の通り.

      preds = model.predict(inputs, batch_size=1, verbose=1)
      

      [image]
    16. ステップ 6 (予測結果からバウンディングボックスを作るという後処理)

      次の Python プログラムを実行

      https://github.com/rykov8/ssd_keras/blob/master/SSD.ipynb の「in [6]」に記載の通り.

      results = bbox_util.detection_out(preds)
      

      [image]
    17. 最後のステップ (結果の表示)

      次の Python プログラムを実行

      https://github.com/rykov8/ssd_keras/blob/master/SSD.ipynb の「in [8]」に記載の通り.

      for i, img in enumerate(images):
          # Parse the outputs.
          det_label = results[i][:, 0]
          det_conf = results[i][:, 1]
          det_xmin = results[i][:, 2]
          det_ymin = results[i][:, 3]
          det_xmax = results[i][:, 4]
          det_ymax = results[i][:, 5]
      
          # Get detections with confidence higher than 0.6.
          top_indices = [i for i, conf in enumerate(det_conf) if conf >= 0.6]
      
          top_conf = det_conf[top_indices]
          top_label_indices = det_label[top_indices].tolist()
          top_xmin = det_xmin[top_indices]
          top_ymin = det_ymin[top_indices]
          top_xmax = det_xmax[top_indices]
          top_ymax = det_ymax[top_indices]
      
          colors = plt.cm.hsv(np.linspace(0, 1, 21)).tolist()
      
          plt.figure()
          plt.imshow(img / 255.)
          currentAxis = plt.gca()
      
          for i in range(top_conf.shape[0]):
              xmin = int(round(top_xmin[i] * img.shape[1]))
              ymin = int(round(top_ymin[i] * img.shape[0]))
              xmax = int(round(top_xmax[i] * img.shape[1]))
              ymax = int(round(top_ymax[i] * img.shape[0]))
              score = top_conf[i]
              label = int(top_label_indices[i])
              label_name = voc_classes[label - 1]
              display_txt = '{:0.2f}, {}'.format(score, label_name)
              coords = (xmin, ymin), xmax-xmin+1, ymax-ymin+1
              color = colors[label]
              currentAxis.add_patch(plt.Rectangle(*coords, fill=False, edgecolor=color, linewidth=2))
              currentAxis.text(xmin, ymin, display_txt, bbox={'facecolor':color, 'alpha':0.5})
          
          plt.show()
      

      [image]

      実行結果

      [image]

    本サイトは金子邦彦研究室のWebページです.サイトマップは,サイトマップのページをご覧下さい. 本サイト内の検索は,サイト内検索のページをご利用下さい.

    問い合わせ先: 金子邦彦(かねこ くにひこ) [image]