[DeepLearning1] AIの味わい – Kerasを使った画像の分類

投稿日:

更新日:

カテゴリ:

ディープラーニングのソリューションに必要な要素は以下の4つあります。

  1. データセット
  2. モデルのアーキテクチャー
  3. フレームワーク
  4. ハードウェア

さて、私には何を用意できますか?!一応パソコンがあれば、ハードウェアがあると言えますかね?!

あとは、フレームワークとしてKerasというものが初心者にとって優しいだとそうですので、それを使って訓練済みのモデルを採用すると、訓練が必要なくなり、データセットも不要になります。

これで条件が揃ったかと思いますので、「ディープラーニング実践ガイド」のソース「Practical-Deep-Learning-Book」をダウンロードしてきて、ちょっとしたAIを味わいたいと思います。

JupyterLabで動作確認

前述ソースをzipでもgit cloneでも構いませんが、ダウンロードしたら、「ディープラーニング学習の準備」で紹介した「ml」フォルダ配下に置いてください。

そしたら、JupyterLab起動して次のように「code/chapter-2」配下で「1-predict-class.ipynb」を開きます。

次はあと実行していくだけですので、次の実行ボタン(もしくはショートカットShift+Enter)で順番に実行していきます。

うまく行けば、何にもエラー出ないかもしれませんが、私の環境では色々とモジュールが足りないということで別途インストールが必要でした。

詳しくはトラブルシューティングとして後述します。

最終的な実行結果は次のような感じになるかと思います。


結果の見方ですが、ここでは、0.5719774(57%)の確率でこの画像は「tabby」というカテゴリに入ります。

predict(IMG_PATH)
1/1 [==============================] - 0s 486ms/step
[('n02123045', 'tabby', 0.5719774), ('n02124075', 'Egyptian_cat', 0.21763441), ('n02123159', 'tiger_cat', 0.06093428)]

「tabby」とは?なりましたが、Wikipediaでは、Tabby catと紹介されてます。日本語だと「トラネコ」のようです。
それなら、結果最後の「tiger_cat」とは?!と思いましたが、まあ、猫に詳しくないので、ここらへんにしておきましょう。

ソースの解説

偉そうなタイトル付けてますが、同じ初心者ですので、あくまでも私の理解を書いてます。

間違いがありましたらコメントいただければ嬉しいです。


# 実行環境の判定、GoogleのColab環境であるかどうかによって画像ファイルの取り方が異なるように作られてます。
# macOSで動かしてますが、問題なく動作します。
try:
  import google.colab
  IS_COLAB_ENV = True
except:
  IS_COLAB_ENV = False
IS_COLAB_ENV

# 現時点tensorflowの最新版は2.15.0です。
# あえて2.0.0をインストールしようとするとエラーになる気がしますので、バージョン指定する際、ここを最新版に修正するといいと思います。
if IS_COLAB_ENV:
    !pip install tensorflow==2.0.0

# 諸々モジュールのインポート、足りないモジュールがあればpipでインストールすれば大丈夫のはずです。
import tensorflow as tf
from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt

# 本の中の紹介では、この「IMG_PATH」が小文字になってますが、まあ、ファイルが確実に存在すれば大丈夫でしょう。
IMG_PATH = '../../sample-images/cat.jpg'
if IS_COLAB_ENV:
  !curl https://raw.githubusercontent.com/PracticalDL/Practical-Deep-Learning-Book/master/sample-images/cat.jpg --output cat.jpg
  IMG_PATH = 'cat.jpg'

# 画像の読み込みとサイズ指定です。
img = image.load_img(IMG_PATH, target_size=(224, 224))
# 画像の表示、これは判定と関係ないはずです。
# ビジュアルで読み込んだ画像を確認するだけです。
plt.imshow(img)
plt.show()

# ここが重要です!
# フレームワーク中の「ResNet50」というモデルを参照してます。
model = tf.keras.applications.resnet50.ResNet50()

# 前述処理を1つの関数にまとめられてます。
def predict(img_path):
    img = image.load_img(img_path, target_size=(224, 224))
    model = tf.keras.applications.resnet50.ResNet50()
    img_array = image.img_to_array(img)

    # 次の1行について本の中でも追加説明あり、3次元配列を4次元配列にするとありましたが、
    # 画像の配列img_arrayを1つのまとまりだと見たときに、[img_array]のように、
    # それの外にもう一つの配列で囲ってあげるというふうに理解してます。
    img_batch = np.expand_dims(img_array, axis=0)

    # 何で上のような面倒なことをするかと言うと、次のようにmodelの予測関数に渡す引数はそう要求しているからです。
    img_preprocessed = preprocess_input(img_batch)
    prediction = model.predict(img_preprocessed)

    # 結果の表示
    print(decode_predictions(prediction, top=3)[0])

# 関数を呼び出して知能発揮!
predict(IMG_PATH)

いかがでしょうか?これを見て、AI活用はこうなのかと私が理解してます。

もしかしてこれがAIか?!と思われる方もいらっしゃるかもしれません。

2019年頃、AIを専門とする会社代表の方をお話する機会があって、AIは思われてるよりずっと書くコードが少なく、お客さんからも、はぁ?これだけ?と言われるそうです。

これを見ると、そのことを思い出し、確かに言われそうだなぁ〜と私も思いました。

一方でこれは既存のモデルを一切カスタマイズしないで使うとこうなるだけであって、実際のビジネスは、このモデルが出来上がるところまでが大変でしょうか。
それをお客さんに知ってもらう必要がありそうですね。

トラブルシューティング

ModuleNotFoundError類のエラーはpip installしてあげれば大丈夫そうですね。

  • エラー:
    ---------------------------------------------------------------------------
    ModuleNotFoundError                       Traceback (most recent call last)
    Cell In[4], line 1
    ----> 1 import tensorflow as tf
          2 from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
          3 from tensorflow.keras.preprocessing import image
    
    ModuleNotFoundError: No module named 'tensorflow'
    

    解決策:

    pip install tensorflow
  • エラー:
    ---------------------------------------------------------------------------
    ModuleNotFoundError                       Traceback (most recent call last)
    Cell In[3], line 5
          3 from tensorflow.keras.preprocessing import image
          4 import numpy as np
    ----> 5 import matplotlib.pyplot as plt
    
    ModuleNotFoundError: No module named 'matplotlib'

    解決策:

    pip install matplotlib
  • エラー:
    ---------------------------------------------------------------------------
    ImportError                               Traceback (most recent call last)
    Cell In[7], line 1
    ----> 1 img = image.load_img(IMG_PATH, target_size=(224, 224))
          2 plt.imshow(img)
          3 plt.show()
    
    File ~/ml/env/lib/python3.11/site-packages/keras/src/utils/image_utils.py:414, in load_img(path, grayscale, color_mode, target_size, interpolation, keep_aspect_ratio)
        412     color_mode = "grayscale"
        413 if pil_image is None:
    --> 414     raise ImportError(
        415         "Could not import PIL.Image. The use of `load_img` requires PIL."
        416     )
        417 if isinstance(path, io.BytesIO):
        418     img = pil_image.open(path)
    
    ImportError: Could not import PIL.Image. The use of `load_img` requires PIL.

    解決策:

    pip install pillow

    これだけ、jupyterを再起動する必要があるかもしれませんので、インストールしたにも関わらず、エラーになるようでしたら、jupyterを立ち上げ直してみてください。


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です