【概要】
このページでは,TensorFlowとkeras_cvを使用してConvNeXtBaseモデルによる画像分類を行う方法について説明します.事前準備として,Git,Python,TensorFlowの最新版,keras_cv,oppencv-python をインストールします.次に,ConvNeXtBaseモデルを使った2つの画像分類プログラムを掲載しています.1つ目は,パソコンに接続したカメラからリアルタイムで取得した画像を分類するプログラムです.2つ目は,ユーザーが選択した複数の画像ファイルを分類するプログラムです.両者ともGPUの設定,モデルのロード,画像の前処理,画像分類,結果表示の機能を持ちます.それぞれのプログラムのソースコード,プログラムの実行方法,結果の確認方法も説明しています.
【目次】
【関連する外部ページ】
keras_cv が提供する学習済みモデル: https://keras.io/api/keras_cv/models/
Pythonは,プログラミング言語の1つ. Gitは,分散型のバージョン管理システム.
【手順】
コマンドプロンプトを管理者として実行: 別ページ »で説明
次のコマンドを実行
次のコマンドは,Python ランチャーとPython 3.10とGitをインストールし,Gitにパスを通すものである.
次のコマンドでインストールされるGitは 「git for Windows」と呼ばれるものであり, Git,MinGW などから構成されている.
winget install --scope machine Python.Launcher winget install --scope machine Python.Python.3.10 winget install --scope machine Git.Git powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";c:\Program Files\Git\cmd\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"
【関連する外部ページ】
【サイト内の関連ページ】
【関連項目】 Python, Git バージョン管理システム, Git の利用
コマンドプロンプトを管理者として実行: 別ページ »で説明
次のコマンドを実行することにより,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 モデルを用いた画像分類を行う.
cd /d c:%HOMEPATH% notepad kcconvnext.py
このプログラムは,TensorFlow,keras_cv,ConvNeXtBaseモデルを活用し,カメラから取得した画像をリアルタイムで画像分類する.プログラムでは,GPUの設定,モデルのロード,フレームの前処理,画像分類,結果と推論に要した時間を表示する.カメラからの画像をリアルタイムで画像分類し,その結果をビジュアルに確認できるプログラムである. 主な機能は以下の通りである.
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()
Python プログラムの実行
【サイト内の関連ページ】 Python のまとめ: 別ページ »
プログラムを kcconvnext.pyのようなファイル名で保存したので, 「python kcconvnext.py」のようなコマンドで行う.
python kcconvnext.py
終了は q キー
ImageNet で学習済みの ConvNeXtBase モデルを用いた画像分類を行う.
cd /d c:%HOMEPATH% notepad kcconvnextimg.py
このプログラムは,TensorFlow,keras_cv,ConvNeXtBaseモデルを活用し,ユーザが選択した複数の画像について画像分類を行う.プログラムでは,GPUの設定,モデルのロード,フレームの前処理,画像分類,結果と推論に要した時間を表示する. 主な機能は以下の通りである.
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()
Python プログラムの実行
【サイト内の関連ページ】 Python のまとめ: 別ページ »
プログラムを kcconvnextimg.pyのようなファイル名で保存したので, 「python kcconvnextimg.py」のようなコマンドで行う.
python kcconvnextimg.py
このとき,画像ファイルを複数選ぶことができる.
画像分類の結果のクラス名,信頼度(Confidence),処理に要した時間が表示される.