トップページデータベース研究物体認識SSD による一般物体検知(rykov SSD_Keras, Python 3.6, TensorFlow 1.15, Keras 1.2.2 を使用)

SSD による一般物体検知(rykov SSD_Keras, Python 3.6, TensorFlow 1.15, Keras 1.2.2 を使用)

SSD Keras の実装である rykov ssd_keras を使ってみる.

目次

  1. 前準備
  2. TensorFlow 1.15(旧バージョン),Keras 1.2.2(旧バージョン)のインストール
  3. rykov ssd_keras のインストール
  4. SSD を行ってみる

URL: https://github.com/rykov8/ssd_keras

手順の要点: Python 3.6, TensorFlow 1.15, Python の仮想環境(Windows では C:\venv\tf115py36)

ソフトウエア等の利用条件等は,利用者で確認すること.

謝辞:ソフトウエアの作者に感謝します.

前準備

Python 3.6 のインストール,pip の更新

※ TensorFlow 1.15.3 に対応する Python は,3.6 や 3.7 など(3.8 は対応していない)(2020/06 時点).このページでは 3.6 を使って説明する.3.7 でも同様の手順になる.

Windows の場合

  1. Python 3.6 のインストール

    Python の URL: http://www.python.org/

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

    Windows では,Python 3.8 や 3.6 の共存は簡単.

  2. pip と setuptools の更新

    コマンドプロンプトを管理者として実行し,次のコマンドを実行.

    py -3.6 -m pip install -U pip setuptools
    

    [image]

Ubuntu の場合

次の手順により,システム Python とは別に,pyenv を用いて Pytnon 3.6 をインストールする.(システム Python の設定は変えたくないため).

  1. pyenv のインストールと設定

    図などの入った詳しい説明は別ページ

    sudo apt -y install --no-install-recommends make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
    cd /tmp
    curl https://pyenv.run | bash
    echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.bashrc
    echo 'if [ -d "${PYENV_ROOT}" ]; then' >> ~/.bashrc
    echo '    export PATH=${PYENV_ROOT}/bin:$PATH' >> ~/.bashrc
    echo '    eval "$(pyenv init -)"' >> ~/.bashrc
    echo '    eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
    echo 'fi' >> ~/.bashrc
    exec $SHELL -l
    
  2. 次のコマンドにより,pyenv を用いて Python 3.6.10 をインストール
    pyenv install 3.6.12
    

    [image]
  3. Ubuntu では端末を開く.
  4. pyenv の Python 3.6 の有効化. pip と setuptools の更新,Python 開発環境(JupyterLab, spyder, nteract)のインストール(Ubuntu 上)

    端末で,次のコマンドを実行.

    pyenv shell 3.6.12
    python -m pip install -U pip setuptools
    python -m pip install -U jupyterlab jupyter jupyter-console jupytext nteract_on_jupyter spyder
    

Git のインストール

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

GPU とは,グラフィックス・プロセッシング・ユニットの略で、コンピュータグラフィックス関連の機能,乗算や加算の並列処理の機能などがある.

ダウンロードページ

詳細説明

(NVIDIA GPU を使うとき)NVIDIA CUDA ツールキット 10.0 のインストール

CUDA とは,NVIDIA社が提供している GPU 用のプラットフォームである.

指定されているバージョンより高いものは使わない. その根拠は次のページ. URL: https://www.tensorflow.org/install/source#common_installation_problems

詳細説明

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

ダウンロードページ

TensorFlow 2.4 の GPU 版での,cuDNN のバージョンは 8.0.5(現時点で,NVIDIA CUDA ツールキット 11 で動く最新版).

TensorFlow 2.3, 2.2, 2.1 の GPU 版での,cuDNN のバージョンは 7.6.そして,TensorFlow 1.13 以上 TensorFlow 2.0 までの GPU 版での,cuDNN のバージョンは7.4 .それより高いバージョンよりは使わないこと.

詳細説明

  • TensorFlow 1.15(旧バージョン),Keras 1.2.2(旧バージョン)のインストール
  • Python 3.6 を起動するコマンドを確認しておくこと.

    Windows の場合

    1. コマンドプロンプトを実行する.
    2. 隔離された Python 仮想環境使用するときは,次のようなコマンドで有効化する.

      C:\venv\tf115py36\Scripts\activate.bat
      

      [image]
    3. TensorFlow のインストール

      Python の使用は,隔離された Python 仮想環境有効化の後,「python」で行う. Windows で,隔離された Python 仮想環境使用しないときは,「python」ではなく「py -3.6」を使う.

      python -m pip uninstall -y tensorflow tensorflow-cpu tensorflow-gpu tensorflow_datasets tensorflow-hub keras
      python -m pip install -U tensorflow==1.15.5 tensorflow_datasets tensorflow-hub keras==1.2.2 matplotlib opencv-python
      python -m pip install git+https://github.com/tensorflow/docs
      python -m pip install git+https://github.com/tensorflow/examples.git
      
    4. TensorFlow のバージョン確認

      python -c "import tensorflow as tf; print( tf.__version__ )"
      

      [image]
    5. (GPU を使うとき) GPU が認識できてるかの確認

      TensorFlow が GPU を認識できているかの確認は,端末で,次を実行して行う.

      python -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
      

    Ubuntu の場合

    1. 端末を開く
    2. pyenv の Python 3.6 の有効化.

      端末で,次のコマンドを実行.

      pyenv shell 3.6.12
      

      隔離された Python 仮想環境使用するときは, 「pyenv shell 3.6.12」は実行しないで, 次のようなコマンドで Python 仮想環境を有効化する.

      source ~/tf115py36/bin/activate
      

      [image]
    3. TensorFlow のインストール

      Python の使用は,「python」で行う.

      python -m pip uninstall -y tensorflow tensorflow-cpu tensorflow-gpu tensorflow_datasets tensorflow-hub keras
      python -m pip install -U tensorflow==1.15.5 tensorflow_datasets tensorflow-hub keras==1.2.2 matplotlib opencv-python
      python -m pip install git+https://github.com/tensorflow/docs
      python -m pip install git+https://github.com/tensorflow/examples.git
      
    4. TensorFlow のバージョン確認

      python -c "import tensorflow as tf; print( tf.__version__ )"
      

      [image]
    5. (GPU を使うとき) GPU が認識できてるかの確認

      TensorFlow が GPU を認識できているかの確認は,端末で,次を実行して行う.

      python -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
      
      システムの環境変数:

    rykov ssd_keras のインストール

    Windows での手順を下に示す.Ubuntu でも同様の手順になる.

    1. Python 3.6 を起動するコマンドを確認しておく.
      • Windows の場合: 「py -3.6
      • Windows で Python 仮想環境 tf115py36 を使う場合: 「C:\venv\tf115py36\Scripts\activate.bat」の後,「python
      • Ubuntu の場合: 「pyenv shell 3.6.12」の後,「python
      • Ubuntu で Python 仮想環境 tf115py36 を使う場合: 「source ~/tf115py36/bin/activate」の後,「python
    2. 隔離された Python 仮想環境使用するときは,有効化する.

      Windows の場合での,有効化のコマンドの例.

      C:\venv\tf115py36\Scripts\activate.bat
      

      [image]

      Ubuntu の場合での,有効化のコマンドの例.

      source ~/tf115py36/bin/activate
      

      [image]

      ※ 以下,Windows での手順を示す.Ubuntu でも同様の手順になる.

    3. keras matplotlib numpy imageio などのインストール

      venv を使い,孤立した Python 仮想環境を使っているときは,Windows でも Ubuntu でも同じで,「python -m pip install ...」.

      python -m pip install -U keras==1.2.2 matplotlib numpy imageio opencv-python
      python -m pip install -U jupyterlab jupyter jupyter-console jupytext spyder
      
    4. ディレクトリ(フォルダ)を空にする操作

      cd C:\venv\tf115py36
      rmdir /s /q ssd_keras
      

      [image]
    5. rykov8/ssd_keras のインストール

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

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

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

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

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

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

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

      下の図のように

      [image]

    SSD を行ってみる

    Python コンソールで,SSD.ipynb に記載のコマンドを実行しながら結果を確認したい.結果は,画像などでプロットされる場合がある.

    Windows での手順を下に示す.Ubuntu でも同様の手順になる.

    1. Python 3.6 を起動するコマンドを確認しておく.
      • Windows の場合: 「py -3.6
      • Windows で Python 仮想環境 tf115py36 を使う場合: 「C:\venv\tf115py36\Scripts\activate.bat」の後,「python
      • Ubuntu の場合: 「pyenv shell 3.6.12」の後,「python
      • Ubuntu で Python 仮想環境 tf115py36 を使う場合: 「source ~/tf115py36/bin/activate」の後,「python
    2. 隔離された Python 仮想環境使用するときは,有効化する.

      Windows の場合での,有効化のコマンドの例.

      C:\venv\tf115py36\Scripts\activate.bat
      

      [image]

      Ubuntu の場合での,有効化のコマンドの例.

      source ~/tf115py36/bin/activate
      

      [image]

      ※ 以下,Windows での手順を示す.Ubuntu でも同様の手順になる.

    3. カレントディレクトリ

      cd C:\venv\tf115py36\ssd_keras
      

      [image]
    4. 使用する 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]
    5. ステップ 1 (初期設定)

      次の Python プログラムを実行

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

      from __future__ import absolute_import, division, print_function, unicode_literals
      
      import cv2
      import keras
      from keras.applications.imagenet_utils import preprocess_input
      from keras.backend.tensorflow_backend import set_session
      from keras.models import Model
      from tensorflow.keras.preprocessing import image
      import matplotlib.pyplot as plt
      %matplotlib inline
      import warnings
      warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings
      import numpy as np
      from imageio import imread
      import tensorflow as tf
      
      from ssd import SSD300
      from ssd_utils import BBoxUtility
      
      plt.rcParams['figure.figsize'] = (8, 8)
      plt.rcParams['image.interpolation'] = 'nearest'
      
      np.set_printoptions(suppress=True)
      

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

      次の Python プログラムを実行

      https://github.com/rykov8/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]
    7. ステップ 3 (先ほどダウンロードした学習結果ファイル weights_SSD300.hdf5 の読み込み

      次の Python プログラムを実行

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

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

      [image]
    8. ステップ 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]
    9. ステップ 5 (予測処理)

      次の Python プログラムを実行

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

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

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

      次の Python プログラムを実行

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

      results = bbox_util.detection_out(preds)
      

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

      次の 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]