Python 画像分類ガイド

MediaPipe Image Classifier タスクを使用すると、画像の分類を行うことができます。このタスクを使用すると、トレーニング時に定義された一連のカテゴリの中で、画像が何を表しているかを特定できます。ここでは、Python で Image Classifier を使用する方法について説明します。

このタスクの動作を確認するには、ウェブデモをご覧ください。このタスクの機能、モデル、構成オプションの詳細については、概要をご覧ください。

サンプルコード

画像分類ツールのサンプルコードには、このタスクの完全な実装が Python で記載されています。このコードは、このタスクをテストし、独自の画像分類ツールの構築を開始するのに役立ちます。ウェブブラウザのみを使用して、画像分類システムのサンプルコードを表示、実行、編集できます。

Raspberry Pi 用に画像分類ツールを実装する場合は、Raspberry Pi のサンプルアプリをご覧ください。

セットアップ

このセクションでは、Image Classifier を使用するように開発環境とコード プロジェクトを設定する主な手順について説明します。プラットフォーム バージョンの要件など、MediaPipe タスクを使用する開発環境の設定に関する一般的な情報については、Python の設定ガイドをご覧ください。

パッケージ

画像分類ツールは、mediapipe pip パッケージをタスクします。依存関係は次のコマンドでインストールできます。

$ python -m pip install mediapipe
``` ### Imports

Import the following classes to access the Image Classifier task functions:

```python
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

モデル

MediaPipe 画像分類タスクには、このタスクに対応したトレーニング済みモデルが必要です。Image Classifier で使用可能なトレーニング済みモデルの詳細については、タスクの概要のモデルのセクションをご覧ください。

モデルを選択してダウンロードし、ローカル ディレクトリに保存します。推奨される EfficientNet-Lite0 モデルを使用できます。

model_path = '/absolute/path/to/efficientnet_lite0_int8_2.tflite'

次のように、モデル名パラメータ内にモデルのパスを指定します。

base_options = BaseOptions(model_asset_path=model_path)

タスクを作成する

create_from_options 関数を使用してタスクを作成します。create_from_options 関数は、実行モード、表示名のロケール、結果の最大数、信頼度のしきい値、カテゴリの許可リスト、拒否リストなどの構成オプションを受け入れます。構成オプションの詳細については、構成の概要をご覧ください。

Image Classifier タスクは、静止画像、動画ファイル、ライブ動画ストリームの 3 つの入力データ型をサポートしています。入力データ型に対応するタブを選択して、タスクを作成し推論を実行する方法を確認します。

画像

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=VisionRunningMode.IMAGE)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

動画

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=VisionRunningMode.VIDEO)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

ライブ配信

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifierResult = mp.tasks.vision.ImageClassifier.ImageClassifierResult
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

def print_result(result: ImageClassifierResult, output_image: mp.Image, timestamp_ms: int):
    print('ImageClassifierResult result: {}'.format(result))

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    max_results=5,
    result_callback=print_result)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

画像で使用する Image Classifier の作成例については、コード例をご覧ください。

設定オプション

このタスクには、Python アプリケーション用の次の構成オプションがあります。

オプション名 説明 値の範囲 デフォルト値
running_mode タスクの実行モードを設定します。モードは次の 3 つです。

IMAGE: 単一画像入力のモード。

動画: 動画のデコードされたフレームのモード。

LIVE_STREAM: カメラなどからの入力データのライブ配信モード。このモードでは、resultListener を呼び出して、結果を非同期で受信するリスナーを設定する必要があります。
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
display_names_locale タスクのモデルのメタデータで指定されている表示名に使用するラベルの言語を設定します(利用可能な場合)。デフォルトは英語で en です。TensorFlow Lite Metadata Writer API を使用して、カスタムモデルのメタデータにローカライズされたラベルを追加できます。 言語 / 地域コード en
max_results 返されるスコア上位の分類結果の最大数を設定します(省略可)。0 未満の場合は、利用可能なすべての結果が返されます。 任意の正の数 -1
score_threshold モデル メタデータで指定された予測スコアしきい値(存在する場合)をオーバーライドする予測スコアしきい値を設定します。この値を下回る結果は拒否されます。 任意の浮動小数点数 未設定
category_allowlist 許可されるカテゴリ名のリスト(省略可)。空でない場合、このセットにカテゴリ名が含まれていない分類結果は除外されます。重複するカテゴリ名または不明なカテゴリ名は無視されます。このオプションは category_denylist とは相互に排他的であり、両方を使用するとエラーが発生します。 任意の文字列 未設定
category_denylist 許可されないカテゴリ名のリスト(省略可)。空でない場合、このセットに含まれるカテゴリ名の分類結果は除外されます。重複するカテゴリ名または不明なカテゴリ名は無視されます。このオプションは category_allowlist と相互排他的であり、両方を使用するとエラーが発生します。 任意の文字列 未設定
result_callback 画像分類ツールがライブ配信モードのときに、分類結果を非同期で受信するように結果リスナーを設定します。実行モードが LIVE_STREAM に設定されている場合にのみ使用できます。 なし 未設定

データの準備

入力を画像ファイルまたは NumPy 配列として準備し、mediapipe.Image オブジェクトに変換します。入力が動画ファイルまたはウェブカメラからのライブ配信の場合は、OpenCV などの外部ライブラリを使用して、入力フレームを numpy 配列として読み込むことができます。

次の例では、使用可能なデータ型ごとに、処理用にデータを準備する方法について説明します。

画像

import mediapipe as mp

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
    

動画

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it to calculate the timestamp for each frame.

# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

ライブ配信

import mediapipe as mp

# Use OpenCV’s VideoCapture to start capturing from the webcam.

# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

タスクを実行する

実行モードに対応する分類関数を呼び出して、推論をトリガーできます。Image Classifier API は、入力画像またはフレーム内のオブジェクトの可能性のあるカテゴリを返します。

画像

# Perform image classification on the provided single image.
classification_result = classifier.classify(mp_image)
    

動画

# Calculate the timestamp of the current frame
frame_timestamp_ms = 1000 * frame_index / video_file_fps

# Perform image classification on the video frame.
classification_result = classifier.classify_for_video(mp_image, frame_timestamp_ms)
    

ライブ配信

# Send the latest frame to perform image classification.
# Results are sent to the `result_callback` provided in the `ImageClassifierOptions`.
classifier.classify_async(mp_image, frame_timestamp_ms)
    

次の点にご注意ください。

  • 動画モードまたはライブ配信モードで実行する場合は、Image Classifier タスクに入力フレームのタイムスタンプも指定する必要があります。
  • 画像モデルまたは動画モデルで実行する場合、Image Classifier タスクは、入力画像またはフレームの処理が完了するまで現在のスレッドをブロックします。
  • ライブ配信モードで実行する場合、Image Classifier タスクは現在のスレッドをブロックせず、すぐに返します。入力フレームの処理が完了するたびに、分類結果とともに結果リスナーが呼び出されます。画像分類タスクが別のフレームの処理でビジー状態になっているときに classifyAsync 関数が呼び出されると、タスクは新しい入力フレームを無視します。

画像で使用する Image Classifier の作成例については、コード例をご覧ください。

結果を処理して表示する

推論を実行すると、画像分類タスクは、入力画像またはフレーム内のオブジェクトに適用可能なカテゴリのリストを含む ImageClassifierResult オブジェクトを返します。

このタスクの出力データの例を次に示します。

ImageClassifierResult:
 Classifications #0 (single classification head):
  head index: 0
  category #0:
   category name: "/m/01bwb9"
   display name: "Passer domesticus"
   score: 0.91406
   index: 671
  category #1:
   category name: "/m/01bwbt"
   display name: "Passer montanus"
   score: 0.00391
   index: 670

この結果は、次の環境で Bird Classifier を実行して得られました。

ドバトのクローズアップ写真

Image Classifier のサンプルコードは、タスクから返された分類結果を表示する方法を示しています。詳細については、コードサンプルをご覧ください。