【初心者向け】Pythonを使ってディープラーニングによる画像分類を体験してみよう!

はじめに

このテキスト(章)は、手っ取り早く深層学習プログラミングを体験することを目的としています。
そのため、Pythonプログラミング基本文法及び、scikit-learnやnumpyやpandas、matplotlibの基本的な使い方や、TensorFlowまたはKerasなどの深層学習フレームワークのチュートリアルの説明や専門用語等の説明は別のテキストに譲り、このテキストでは説明しておりませんのでご了承ください。

Google Colaboratoryで深層学習をはじめよう!

Googleが機械学習の教育及び研究用に提供しているGoogle Colaboratory(グーグル・コラボレイトリー)の使い方を説明し、Pythonプログラミングと機械学習プログラミングを行っていきます。
Colaboratoryを利用することで、インストール不要かつ、すぐにPython環境を整えることが可能です。
(Pythonと機械学習ライブラリがインストールされているため、Pythonのインストールせずに済みます。)
費用は無料でCPU及びGPU(1回12時間)の環境が利用可能で、用意するものは、Googleアカウントさえあれば利用できます。
また、下記の代表的な深層学習フレームワークを動かすことが可能です。
TensorFlow/Keras/Chainer/PyTorch
Colaboratoryを使うには下記のURLにアクセスするだけです。
では早速使ってみましょう。
Googleアカウントでログインして後に、下記リンクにアクセスしてください。
Google Colaboratory

ノートブックの作成

「最近のノートブック」の画面が表示されますので、画面の左下から「PYTHON3の新しいノートブック」を選びクリックしてください。
または、左上メニューの『Python3 のノートブックを新規作成』でも同じです。

・左上メニューの『Python3 のノートブックを新規作成』の場合

Colaboratoryの画面が表示されましたでしょうか?
さて、黒丸の三角の実行ボタンの右横にある薄い青色のテキストエディタがありますので、
そこにプログラムを記述します。

print("hello Python")

始めは少し時間がかかりますが、少し待つと結果が表示されます。
ちなみに作成したノートブックは、自動的にGoogle Driveに保存されます。

GPUを使ってみる

ノートブック作成時には、GPUではないため、下記操作にてGPUを使えるようにします。

上部メニューの ランタイム > ランタイムのタイプを変更を選択。
ハードウェアアクセラレータ を None から GPU に変更して保存します。

さて、下記を実行し‘/device:GPU:0’と出力されていればGPUが利用できます。

また、

!cat /proc/cpuinfo

及び、

!cat /proc/meminfo

を実行すると、Colaboratoryのマシンスペックを調べることが出来ます。

深層学習プログラミング体験

今回はKerasを使って、犬を認識するモデルを作ります。
本来モデルを作る場合には、大量のデータを準備し、ニューラルネットワークの学習を行います。しかし、今回は手軽に深層学習を体験してもらうためにVGG16という学習済みのモデルを使います。
VGG16はImageNetという100万枚を超えるデータですでに学習された学習済みモデルです。
学習済みモデルに新しく画像データを与えると学習に基づいた予測結果を返します。
今回は、犬の画像を与えることで正しく認識できるかを試してみましょう。

from keras.applications.vgg16 import VGG16でVGG16を利用可能です。

下記プログラムをコピー&ペーストしてみてください。

# Google Colabで実行の際に、下記のコードにて、このプログラムをTensorFlow バージョン1系で動作させるためのコマンドです。
%tensorflow_version 1.x

# TensorFlow バージョン2系で実行したい場合は下記のColab(URL)をご確認ください。
# https://colab.research.google.com/notebooks/tensorflow_version.ipynb

# 必要なモジュールをインポート
from keras.applications.vgg16 import VGG16, decode_predictions,preprocess_input
from keras.preprocessing import image
from PIL import Image
import numpy as np
import urllib.request as urllib

# 手元の環境で実行させたい場合は下記2つも読み込んでください。
# import tensorflow
# import keras


"""
filename: 判定したい画像ファイル
size: 予測した結果を何件まで表示させたいか(初期値10件)
"""
def predict(filename, size=5):

    filename = urllib.urlopen(filename) # 入力画像をWebから取得
    img = image.load_img(filename, target_size=(224, 224)) # 画像を読み込み
    x = image.img_to_array(img) # 画像ファイルを数値に変換
    x = np.expand_dims(x, axis=0) # 次元を増やす
    pred = model.predict(preprocess_input(x)) # 一律に平均値を引いている処理
    results = decode_predictions(pred, top=size)[0] # VGG16の1000クラスはdecode_predictions()で文字列に変換
    return results

# VGG16を使用
model = VGG16(weights="imagenet")

# 犬の判定処理
filename = "https://aiacademy.jp/dataset/dog1.jpg"

results = predict(filename, 10)
for result in results:
    print(result)

https://aiacademy.jp/dataset/dog1.jpg
の画像は、下記になります。

dog1 16.51.59.jpg

結果は確率として返ってきます。また、今回は確率の上位10位までを表示しています。
今回のデータは79%の確率でgolden_retrieverという予測になっています。

ImageNetは犬以外の多くのデータも含むため他の動物なども予測することが可能です。
興味のある方は以下の手順に従い、他の動物などのデータでも正しく予測できるかを試してみましょう。

まずは、ローカルにある画像データをアップロードします。

from google.colab import files
uploaded = files.upload()

アップロードしたら下記のコードの「filename」といういう変数にファイル名を記述してください。

# ファイルネームにアップロードしたファイル名を記述してください。
# filename="elephant.png"
filename = ""

def predict(filename, size=5):

    img = image.load_img(filename, target_size=(224, 224)) # 画像を読み込み
    x = image.img_to_array(img) # 画像ファイルを数値に変換
    x = np.expand_dims(x, axis=0) # 次元を増やす
    pred = model.predict(preprocess_input(x)) # 一律に平均値を引いている処理
    results = decode_predictions(pred, top=size)[0] # VGG16の1000クラスはdecode_predictions()で文字列に変換
    return results

results = predict(filename, 10)
for result in results:
    print(result)

注意点

90分ほど操作しない状態が続く場合、仮想マシンは停止し、ダウンロードしたデータやライブラリは初期化される仕様になっております。
その点はデメリットではありますが、無料でブラウザからPythonやその他の機械学習ライブラリが最初からインストールされている仮想マシンを利用できるメリットがあります。

まとめ

Google Colaboratoryを利用することで無料で環境構築なしに、GPU環境にて機械学習プログラミングができます。
クラウドを利用することなく、TensorFlowやKerasなどの代表的なフレームワークも動かすことが可能です。