トップページ -> 最新情報技術の実習と研究ツール -> Keras 2 の利用 -> SnowMasaya / ssd_keras を使ってみる
[サイトマップへ]  

SnowMasaya / ssd_keras を使ってみる.

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

先人に感謝.

入力画像の例

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

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


前もって準備しておくこと

前準備として,Anaconda のインストールが終わっていること. 手順を下に説明しています.

Anaconda のインストール

Python 3 の開発環境である Anacondaをおすすめ.Window でのインストール手順は次の通りです(Linuxでも同様の手順です).

  1. https://www.continuum.io/downloads#windowsを開く

  2. Download」をクリックする.

  3. ダウンロードが始まるので確認する.

  4. ダウンロードした .exe ファイルを実行して,Anacondaをインストール.

    Python処理系にはいくつかの種類がある. この Web ページでは Anaconda をおすすめしている. 以下,Windows に Anacondaをインストールしたものとして説明を続ける.

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

    ※ Linux の場合には,端末を開く(pyenvを使っているときは pip の実行に管理者権限を必要としない)

  6. まずは,最新の conda-build パッケージが欲しい.今のコマンドプロンプトで,次のコマンドを実行

    conda install -y conda-build
    

    ※ 「Proceed ([y]/n)?」と表示されたら, y + Enter で続行する.「反応が遅いなあ」と思ったら、Enter キーを押してみる.

  7. conda が更新されたので,コマンドプロンプトをいったん閉じる

  8. 再び,コマンドプロンプトを管理者として実行

  9. コマンドプロンプトで,次のコマンドを実行

    conda update -y pip
    conda update -y setuptools
    conda update -y conda
    conda update -y conda-build
    

    ※ 「Proceed ([y]/n)?」と表示されたら, y + Enter で続行する.「反応が遅いなあ」と思ったら、Enter キーを押してみる.


Keras 2 と前提となる Python パッケージのインストール手順

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

  2. Anaconda プロンプトで,次のコマンドを実行

    ※ Anaconda や Miniconda を使っていないときは conda コマンドがないので pip コマンドを使ってください

    ※ conda パッケージの tensorflow が古いので(2018/02時点),pip を使うことにする.

    conda install numpy scipy 
    conda install yaml 
    conda install hdf5 
    conda install h5py
    conda --upgrade all
    pip install --ignore-installed --upgrade tensorflow 
    pip install --ignore-installed --upgrade keras 
    

    ※ 「Proceed ([y]/n)?」と表示されたら, y + Enter で続行する.「反応が遅いなあ」と思ったら、Enter キーを押してみる.


SnowMasaya / ssd_keras の動作に必要となる Python パッケージのインストール

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

conda install -y opencv 
conda install -y pillow matplotlib 

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

  1. SnowMasaya / ssd_keras の Web ページを開く

    https://github.com/SnowMasaya/ssd_keras

  2. Clone or download」を展開し, 「Download ZIP」をクリック

  3. .zip ファイルがダウンロードされるので確認する.

  4. ダウンロードした .zip ファイルを展開(解凍)する.分かりやすいディレクトリに置く.

    ※ Windows での展開(解凍)のためのソフトは「7-Zip」をおすすめ.

    この .zip ファイルは,E:\ssd_keras-master に展開(解凍)したものとして,説明を続けるので,適切に読み替えてください.

  5. rykov ssd_keras の Web ページに記載の通り,次のWebページを開く

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

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

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

  8. SSD.zip というファイルがダウンロードされるので確認する.

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

    下の図のように


テスト実行

  1. Web ブラウザで SnowMasaya / ssd_keras の SSD.ipynb を開く

    https://github.com/SnowMasaya/ssd_keras/blob/master/SSD.ipynb

  2. SSD.ipynb に記載のコマンドを実行しながら結果を結果を確認したい.

    そのために, 「IPython シェル」を使う.

    Anacondaに入っている開発環境 spyder を実行し,右下の ipython コンソールを使うのが簡単.

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

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

    cd E:\ssd_keras-master
    

  4. ステップ 1 (初期設定)

    次の Python プログラムを実行

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

    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 scipy.misc import imread
    import tensorflow as tf
    
    from ssd_v2 import SSD300v2
    from ssd_utils import BBoxUtility
    from tensorflow.contrib.tensorboard.plugins import projector
    import os
    
    %matplotlib inline
    plt.rcParams['figure.figsize'] = (8, 8)
    plt.rcParams['image.interpolation'] = 'nearest'
    
    np.set_printoptions(suppress=True)
    
    config = tf.ConfigProto()
    config.gpu_options.per_process_gpu_memory_fraction = 0.45
    set_session(tf.Session(config=config))
    

    次のようなエラーが出たときは,1つ前の「cd ...」に戻ってやり直す

    「pandas パッケージ」のエラーが出た場合には、Anaconda のバージョンが古い可能性がある. Anaconda バージョン 4.2.0 ではエラーが出る. Windows では Anaconda バージョン 4.4.0 をインストールする.

  5. ステップ 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
    

  6. ステップ 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)
    

  7. ステップ 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))
    

  8. ステップ 5 (予測処理)

    次の Python プログラムを実行

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

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

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

    次の Python プログラムを実行

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

    results = bbox_util.detection_out(preds)
    

  10. 最後のステップ (結果の表示)

    次の 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.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()
    

    実行結果