トップページ -> 最新情報技術の実習と研究ツール -> 画像分類、物体検出 -> 画像分類(ResNet50 を使用)を行ってみる
[サイトマップへ]  

画像分類(ResNet50 を使用)を行ってみる

用語:

ResNet50 の作者に感謝します


前準備

Anaconda のインストール

前準備として,Python 開発環境のAnaconda のインストールが終わっていること.

隔離された Python 環境の作成.spyder, numpy, OpenCV, Tensorflow, matplotlib, pillow のインストール

Windows での 手順は、 Windows で,隔離された Python 環境 + Keras + TensorFlow + OpenCV + spyder 環境を作る(Anaconda を利用) に記載しています

以下,Windows での Anaconda をインストール済み, 隔離された Python 環境(名前は ai)に、spyder, numpy, OpenCV, Tensorflow, matplotlib, pillow をインストール済みであるものとして説明を続けます.


必要な Python パッケージのインストール

  1. Windows のコマンドプロンプトを開く

  2. Python 環境(名前は ai)を有効にする

    「activate ai 」は Python 環境(名前はai)を有効にするためのコマンド.(各自の環境の名前にあわせること

    activate ai
    conda install -y pydot 
    

この Web ページで説明のために使用する画像

https://github.com/opencv/opencv/tree/master/samples/data で公開されている fruits.jpg, home.jpg を使うことにします (感謝)

  1. まず、C:\image のような作業用のディレクトリ(フォルダ)を作る

  2. 次の Web ページを開く

    https://github.com/opencv/opencv/tree/master/samples/data

  3. fruits.jpg を選ぶ

  4. クリックしたら、ダウンロード画面に変わるので「Download」をクリック.

  5. 画像ファイルを、C:\image の下に保存

  6. 今度は、home.jpg を選ぶ

  7. クリックしたら、ダウンロード画面に変わるので「Download」をクリック.

  8. 画像ファイルを、C:\image の下に保存

  9. 今度は、次の画像ファイルを、C:\image の下に保存

  10. 次のようになる

ResNet50 を用いた画像分類

参考 Web ページ: https://keras.io/ja/applications/

謝辞:ここでは、https://keras.io/ja/applications に記載のプログラムを変更して使用しています

Python プログラムを動かしたい. そのために, IPython シェルのコンソールで、Python 環境(名前は ai)を使う

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

※ Windows のスタートメニューで、 「spyder」の方ではなく、 「spyder(ai)」を開く。 これで、spyder の中で、Python環境aiが有効になる

※ Windows のスタートメニューで起動できないときは、Windowsのコマンドプロントで次を実行

activate ai
spyder
  1. ResNet50 のダウンロードと確認
    from keras.applications.resnet50 import ResNet50
    from keras.preprocessing import image
    from keras.applications.resnet50 import preprocess_input, decode_predictions
    from keras.utils import plot_model
    import numpy as np
    
    m = ResNet50(weights='imagenet')
    plot_model(m, to_file='C:/image/resnet50.png')
    

    確認のため C:/image/resnet50.png を表示してみる. 152 層になっていることが確認できる(はず)

  2. Resnet50 による一般物体検出

    これは、学習済みニューラルネットワークによる予測である

    from matplotlib import pyplot as plt
    %matplotlib inline
    img_path = 'C:/image/fruits.jpg'
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    
    preds = m.predict(x)
    # decode the results into a list of tuples (class, description, probability)
    # (one such list for each sample in the batch)
    plt.imshow(img)
    print('Predicted:', decode_predictions(preds, top=3)[0])
    

    分類結果が表示されるので確認する

  3. 別の画像 home.jpg で行ってみる
    from matplotlib import pyplot as plt
    %matplotlib inline
    img_path = 'C:/image/home.jpg'
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    
    preds = m.predict(x)
    # decode the results into a list of tuples (class, description, probability)
    # (one such list for each sample in the batch)
    plt.imshow(img)
    print('Predicted:', decode_predictions(preds, top=3)[0])
    

    分類結果が表示されるので確認する

  4. 別の画像 1.png で行ってみる
    from matplotlib import pyplot as plt
    %matplotlib inline
    img_path = 'C:/image/1.png' 
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    
    preds = m.predict(x)
    # decode the results into a list of tuples (class, description, probability)
    # (one such list for each sample in the batch)
    plt.imshow(img)
    print('Predicted:', decode_predictions(preds, top=3)[0])
    

    分類結果が表示されるので確認する

    USB 接続ビデオカメラの表示例

    USB接続できるビデオカメラを準備し,パソコンに接続しておく.

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    v = cv2.VideoCapture(0)
    while(v.isOpened()):
        r, f = v.read()
        if ( r == False ):
            break
        img = cv2.resize(f, (224, 224))
        x = image.img_to_array(img)
        x = np.expand_dims(x, axis=0)
        x = preprocess_input(x)
        preds = m.predict(x)
        cv2.imshow("", img)
        print('Predicted:', decode_predictions(preds, top=3)[0])
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    v.release()
    cv2.destroyAllWindows()
    

    分類結果が表示されるので確認する

    ※ 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる