金子邦彦研究室人工知能Windows で動く人工知能関係 Pythonアプリケーション,オープンソースソフトウエア)画像分類の実行(ImageNet で学習済みの ConvNeXtBase モデル,TensorFlow, keras_cv を使用)(Windows 上)

画像分類の実行(ImageNet で学習済みの ConvNeXtBase モデル,TensorFlow, keras_cv を使用)(Windows 上)

概要

このページでは,TensorFlowとkeras_cvを使用してConvNeXtBaseモデルによる画像分類を行う方法について説明します.事前準備として,Git,Python,TensorFlowの最新版,keras_cv,oppencv-python をインストールします.次に,ConvNeXtBaseモデルを使った2つの画像分類プログラムを掲載しています.1つ目は,パソコンに接続したカメラからリアルタイムで取得した画像を分類するプログラムです.2つ目は,ユーザーが選択した複数の画像ファイルを分類するプログラムです.両者ともGPUの設定,モデルのロード,画像の前処理,画像分類,結果表示の機能を持ちます.それぞれのプログラムのソースコード,プログラムの実行方法,結果の確認方法も説明しています.

目次

  1. 前準備
  2. ImageNet で学習済みの ConvNeXtBase モデルを用いた画像分類(TensorFlow, keras_cv を使用)

関連する外部ページ

keras_cv が提供する学習済みモデル: https://keras.io/api/keras_cv/models/

前準備

Git のインストール(Windows 上)

Gitは,バージョン管理システム.ソースコードの管理や複数人での共同に役立つ.

サイト内の関連ページ

Windows での Git のインストール: 別ページ »で説明している.

関連する外部ページ

Git の公式ページ: https://git-scm.com/

Python のインストール(Windows 上)

サイト内の関連ページ

関連する外部ページ

Python の公式ページ: https://www.python.org/

TensorFlow 最新版, keras_cv のインストール(Windows 上)

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

    コマンドプロンプトを管理者として実行: 別ページ »で説明

  2. TensorFlow 最新版,keras_cv,opencv_python のインストール(Windows 上)

    次のコマンドを実行することにより,TensorFlow 最新版 および関連パッケージ(tf_slim,tensorflow_datasets,tensorflow-hub,Keras,keras-tuner,keras-visualizer, keras_cv)がインストール(インストール済みのときは最新版に更新)される. そして,Pythonパッケージ(Pillow, pydot, matplotlib, seaborn, pandas, scipy, scikit-learn, scikit-learn-intelex, opencv-python, opencv-contrib-python)がインストール(インストール済みのときは最新版に更新)される.

    python -m pip uninstall -y protobuf tensorflow tensorflow-cpu tensorflow-gpu tensorflow-intel tensorflow-text tensorflow-estimator tf-models-official tf_slim tensorflow_datasets tensorflow-hub keras keras-tuner keras-visualizer 
    python -m pip install -U protobuf tensorflow tf_slim tensorflow_datasets==4.8.3 tensorflow-hub keras keras-tuner keras-visualizer keras_cv
    python -m pip install git+https://github.com/tensorflow/docs
    python -m pip install git+https://github.com/tensorflow/examples.git
    python -m pip install git+https://www.github.com/keras-team/keras-contrib.git
    python -m pip install -U pillow pydot matplotlib seaborn pandas scipy scikit-learn scikit-learn-intelex opencv-python opencv-contrib-python
    

ImageNet で学習済みの ConvNeXtBase モデルを用いた画像分類(TensorFlow, keras_cv を使用)

パソコン接続のカメラを使用

ImageNet で学習済みの ConvNeXtBase モデルを用いた画像分類を行う.

  1. パソコン接続のカメラを使用するので準備しておく
  2. Windows で,コマンドプロンプトを実行
  3. エディタを起動
    cd %USERPROFILE%
    notepad kcconvnext.py
    

    [image]
  4. エディタで,次のプログラムを保存

    このプログラムは,TensorFlow,keras_cv,ConvNeXtBaseモデルを活用し,カメラから取得した画像をリアルタイムで画像分類する.プログラムでは,GPUの設定,モデルのロード,フレームの前処理,画像分類,結果と推論に要した時間を表示する.カメラからの画像をリアルタイムで画像分類し,その結果をビジュアルに確認できるプログラムである. 主な機能は以下の通りである.

    • GPUの設定:利用可能なGPUを確認し,GPUのメモリに関する設定を行う. GPUが見つからない場合はCPUで実行される.
    • ConvNeXtBaseモデルのロード:imagenetで学習済みのConvNeXtBaseモデルをロードする.
    • カメラからのフレーム取得と分類: カメラからフレームを取得し,各フレームに対して画像分類を実施する. 分類結果と推論に要した時間をフレームに描画する.
    • 結果の表示:分類されたクラスラベル,信頼度,推論時間を画像上に重ねて表示する.
    • 'q'キーを押すと終了する.

    ConvNeXtBaseモデルは高精度の画像分類モデルであり,転移学習にも適している.

    import tensorflow as tf
    from tensorflow.keras.applications import ConvNeXtBase
    import numpy as np
    import time
    import cv2
    
    # GPUの確認,GPUのメモリに関する設定
    def set_gpu_config():
        physical_devices = tf.config.list_physical_devices('GPU')
        if len(physical_devices) > 0:
            print("GPU available:", physical_devices)
            for device in physical_devices:
                tf.config.experimental.set_memory_growth(device, True)
        else:
            print("No GPU found. Running on CPU.")
    
    # 画像の前処理関数
    def preprocess_image(img):
        img = cv2.resize(img, (224, 224))
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        img = np.expand_dims(img, axis=0)
        img = tf.keras.applications.convnext.preprocess_input(img)
        return img
    
    # ConvNeXtBaseモデルのロード
    def load_model():
        return ConvNeXtBase(weights='imagenet')
    
    # カメラからのフレームを取得し、分類を行う
    def classify_camera_frames(model):
        cap = cv2.VideoCapture(0)
    
        while cap.isOpened():
            ret, frame = cap.read()
            if not ret:
                break
            
            # フレームの前処理
            img = preprocess_image(frame)
            
            # 画像の分類
            start_time = time.perf_counter()
            preds = model.predict(img)
            end_time = time.perf_counter()
            prediction_time = end_time - start_time
            
            top_pred_index = np.argmax(preds)
            class_label = tf.keras.applications.convnext.decode_predictions(preds, top=1)[0][0][1]
            confidence = preds[0][top_pred_index]
            
            # 結果の表示
            cv2.putText(frame, f"Class: {class_label}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
            cv2.putText(frame, f"Confidence: {confidence:.4f}", (10, 70), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
            cv2.putText(frame, f"Time: {prediction_time:.4f} seconds", (10, 110), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
            
            cv2.imshow("Camera Classification", frame)
            
            # Press 'q' to exit
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
    
        cap.release()
        cv2.destroyAllWindows()
    
    def main():
        set_gpu_config()
        model = load_model()
        classify_camera_frames(model)
    
    if __name__ == '__main__':
        main()
    

    [image]
  5. Python プログラムの実行

    Python プログラムの実行

    Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.

    Python のまとめ: 別ページ »にまとめ

    プログラムを kcconvnext.pyのようなファイル名で保存したので, 「python kcconvnext.py」のようなコマンドで行う.

    python kcconvnext.py
    

    [image]
  6. 結果の確認

    終了は q キー

    [image]

画像ファイルを選択

ImageNet で学習済みの ConvNeXtBase モデルを用いた画像分類を行う.

  1. パソコン接続のカメラを使用するので準備しておく
  2. Windows で,コマンドプロンプトを実行
  3. エディタを起動
    cd %USERPROFILE%
    notepad kcconvnextimg.py
    

    [image]
  4. エディタで,次のプログラムを保存

    このプログラムは,TensorFlow,keras_cv,ConvNeXtBaseモデルを活用し,ユーザが選択した複数の画像について画像分類を行う.プログラムでは,GPUの設定,モデルのロード,フレームの前処理,画像分類,結果と推論に要した時間を表示する. 主な機能は以下の通りである.

    • GPUの設定:利用可能なGPUを確認し,GPUのメモリに関する設定を行う. GPUが見つからない場合はCPUで実行される.
    • ConvNeXtBaseモデルのロード:imagenetで学習済みのConvNeXtBaseモデルをロードする.
    • 画像ファイルの選択と分類: ユーザーが複数の画像ファイルを選択し,選択された各画像に対して画像分類を実施する. 分類結果と推論に要した時間を画像上に描画する.
    • 結果の表示:分類されたクラスラベル,信頼度,推論時間を画像上に重ねて表示する.
    • 任意のキーを押すと次の画像に進み,全ての画像の分類が完了すると終了する.

    ConvNeXtBaseモデルは高精度の画像分類モデルであり,転移学習にも適している.

    import tensorflow as tf
    from tensorflow.keras.applications import ConvNeXtBase
    
    import numpy as np
    import time
    import cv2
    import tkinter as tk
    from tkinter import filedialog
    import os
    
    # GPUの確認,GPUのメモリに関する設定
    def set_gpu_config():
        physical_devices = tf.config.list_physical_devices('GPU')
        if len(physical_devices) > 0:
            print("GPU available:", physical_devices)
            for device in physical_devices:
                tf.config.experimental.set_memory_growth(device, True)
        else:
            print("No GPU found. Running on CPU.")
    
    # 画像の前処理関数
    def preprocess_image(img):
        img = cv2.resize(img, (224, 224))
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        img = np.expand_dims(img, axis=0)
        img = tf.keras.applications.convnext.preprocess_input(img)
        return img
    
    # ConvNeXtBaseモデルのロード
    def load_model():
        return ConvNeXtBase(weights='imagenet')
    
    # 画像ファイルを選択する関数
    def select_files():
        try:
            if 'google.colab' in str(get_ipython()):
                from google.colab import files
                uploaded = files.upload()
                image_paths = list(uploaded.keys())
            else:
                root = tk.Tk()
                root.withdraw()
                image_paths = filedialog.askopenfilenames()
        except NameError:
            root = tk.Tk()
            root.withdraw()
            image_paths = filedialog.askopenfilenames()
        return image_paths
    
    # 選択した画像の分類を行う
    def classify_selected_images(model):
        image_paths = select_files()
        for image_path in image_paths:
            try:
                if 'google.colab' in str(get_ipython()):
                    img = cv2.imdecode(np.frombuffer(uploaded[image_path], np.uint8), cv2.IMREAD_COLOR)
                else:
                    img = cv2.imread(image_path)
            except NameError:
                img = cv2.imread(image_path)
            
            # 画像の前処理
            img_preprocessed = preprocess_image(img)
            
            # 画像の分類
            start_time = time.perf_counter()
            preds = model.predict(img_preprocessed)
            end_time = time.perf_counter()
            prediction_time = end_time - start_time
            
            top_pred_index = np.argmax(preds)
            class_label = tf.keras.applications.convnext.decode_predictions(preds, top=1)[0][0][1]
            confidence = preds[0][top_pred_index]
            
            # 結果の表示
            cv2.putText(img, f"Class: {class_label}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
            cv2.putText(img, f"Confidence: {confidence:.4f}", (10, 70), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
            cv2.putText(img, f"Time: {prediction_time:.4f} seconds", (10, 110), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
            cv2.imshow("Image Classification", img)
            cv2.waitKey(0)
            cv2.destroyAllWindows()
    
    def main():
        set_gpu_config()
        model = load_model()
        classify_selected_images(model)
    
    
    if __name__ == '__main__':
        main()
    

    [image]
  5. Python プログラムの実行

    Python プログラムの実行

    Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.

    Python のまとめ: 別ページ »にまとめ

    プログラムを kcconvnextimg.pyのようなファイル名で保存したので, 「python kcconvnextimg.py」のようなコマンドで行う.

    python kcconvnextimg.py
    

    [image]
  6. ファイルダイアログが開くので,画像ファイルを選ぶ.

    このとき,画像ファイルを複数選ぶことができる.

  7. 結果の確認

    画像分類の結果のクラス名,信頼度(Confidence),処理に要した時間が表示される.

    [image]