物体検出

物体検出モデルは、画像またはビデオストリームに存在する既知の物体のセットを識別し、画像内のそれらの位置に関する情報を提供します。

たとえば、以下のサンプルアプリのスクリーンショットは、2 つのオブジェクトがどのように認識され、それらの位置に注釈が付けられていることを示しています。

Android の例のスクリーンショット

注意: (1) 既存のモデルを統合するには、TensorFlow Lite Task Library を試してください。(2) モデルをカスタマイズするには、TensorFlow Lite Model Maker を試してください。

はじめに

モバイルアプリで物体検出を使用する方法については、サンプルアプリとガイドをご覧になることをお勧めします。

Android または iOS 以外のプラットフォームを使用する場合、または、すでに TensorFlow Lite API に精通している場合は、物体検出スターターモデルと付随するラベルをダウンロードしてください。

メタデータを含むスターターモデルをダウンロードする

メタデータと関連フィールド(labels.txtなど)の詳細については、モデルからメタデータを読み取るをご覧ください。

独自のタスク用にカスタム検出モデルをトレーニングする場合は、モデルのカスタマイズをご覧ください。

次の使用例では、別のタイプのモデルを使用する必要があります。

  • 画像が表す可能性が最も高い 1 つのラベルを予測する場合(画像分類を参照)
  • 画像の構成(被写体と背景など)を予測する場合(セグメンテーションを参照)

サンプルアプリとガイド

TensorFlow Lite を初めて使用する場合、Android または iOS を使用する場合は、以下のサンプルアプリをご覧ください。

Android

TensorFlow Lite Task Library のそのまま簡単に使用できる API を利用して、わずか数行のコードで物体検出モデルを統合することができます。また、TensorFlow Lite Interpreter Java API を使用して、独自のカスタム推論パイプラインを構築することもできます。

以下の Android の例では、両方のメソッドをそれぞれ Task ライブラリInterpreter API で実装しています。

Android の例を見る

iOS

TensorFlow Lite Interpreter Swift API を使用してモデルを統合できます。以下の iOS の例を参照してください。

iOS の例を見る

モデルの説明

このセクションでは、TensorFlow Object Detection API から TensorFlowLite に変換された Single-Shot Detector モデルのシグネチャについて説明します。

物体検出モデルは、物体の複数のクラスの存在と位置を検出するようにトレーニングされています。たとえば、さまざまな果物を含む画像、果物の種類を示すラベル(リンゴ、バナナ、イチゴなど)、および各物体が画像のどこにあるかを指定するデータでモデルをトレーニングすることができます。

その後、モデルに画像を提供すると、検出した物体のリスト、各物体を含む境界矩形の場所、および検出に対する信頼度を示すスコアを出力します。

入力シグネチャ

モデルは画像を入力として受け取ります。

画像は 300x300 ピクセルで、ピクセルごとに 3 つのチャネル (赤、青、緑)があるとします。これは、270,000 バイト値 (300x300x3) のフラット化されたバッファーとしてモデルにフィードする必要があります。モデルは量子化されている場合は、各値は 0〜255 間の値を表す 1 バイトである必要があります。

Android でこの前処理を行う方法についてはサンプルアプリコードをご覧ください。

出力シグネチャ

モデルは、インデックス 0〜4 にマップされた 4 つの配列を出力します。配列 0、1、2 はN個の検出されたオブジェクトを表し、各配列の 1 つの要素は各オブジェクトに対応します。

インデックス 名称 説明
0 位置 [N][4]の多次元配列 浮動小数点値(0~1) 、内部配列[上,左,下,右]は、境界矩形を示します。
1 クラス N 個の整数の配列(浮動小数点値として出力)。それぞれがラベルファイルからのクラスラベルのインデックスを示します。
2 スコア 0~1 の間の N 個の浮動小数点値の配列。クラスが検出された確率を表します。
3 検出数 N の整数値

注意: 結果の数(上記の場合は 10)は、検出モデルをTensorFlowLite にエクスポートするときに設定されるパラメータです。詳細については、モデルのカスタマイズをご覧ください。

リンゴ、バナナ、イチゴを検出するようにモデルがトレーニングされているとします。画像を渡すと、設定した数の検出結果が出力されます。この例では 5 です。

クラス スコア 位置
リンゴ 0.92 [18, 21, 57, 63]
バナナ 0.88 [100, 30, 180, 150]
イチゴ 0.87 [7, 82, 89, 163]
バナナ 0.23 [42, 66, 57, 83]
リンゴ 0.11 [6, 42, 31, 58]

信頼度スコア

これらの結果を解釈するには、検出された各物体のスコアと場所を確認します。0〜1 の数値のスコアは、物体が正確に検出されたという信頼度を示し、数値が 1 に近いほど、モデルの信頼性が高くなります。

アプリケーションによってはカットオフしきい値を決定し、それを下回る値を破棄できます。この例では、妥当なカットオフスコアが 0.5 です(この場合、検出が有効である確率は 50% です)。この場合、配列の最後の 2 つの物体の信頼スコアは 0.5 未満であるため無視します。

クラス スコア 位置
リンゴ 0.92 [18, 21, 57, 63]
バナナ 0.88 [100, 30, 180, 150]
イチゴ 0.87 [7, 82, 89, 163]
バナナ 0.23 [42, 66, 57, 83]
リンゴ 0.11 [6, 42, 31, 58]

適切なカットオフ値は、偽陽性(誤って識別された物体、またはそうでない場合に誤って物体として識別される画像の領域)または偽陰性(信頼性が低いために見落とされた本物の物体)のバランスに基づく必要があります。

たとえば、次の画像では、ナシ(モデルが検出するようにトレーニングされた物体ではない)が「人」として誤って識別されました。これは、適切なカットオフを選択することで無視できる誤検知の例です。この場合、0.6(または 60%)のカットオフは、誤検知を適切に除外します。

Screenshot of Android example

位置

モデルは、検出されたオブジェクトごとに、その位置を囲む境界矩形を表す 4 つの数値の配列を返します。スターターモデルの場合、数値は次のように並べられます。

[ 上, 左, 下, ]

上の値は、画像の上端からの矩形の上端までの距離をピクセル単位で表します。左の値は、入力画像の左からの左端の距離を表します。他の値は、同様に下端と右端を表します。

注意: 物体検出モデルは、特定のサイズの入力画像を受け入れます。これは、デバイスのカメラでキャプチャされた未加工画像のサイズとは異なる可能性が高く、モデルの入力サイズに合わせて未加工画像をトリミングおよびスケーリングするコードを記述する必要があります(例はサンプルアプリケーションをご覧ください)。

モデルによって出力されたピクセル値は、トリミングおよびスケーリングされた画像内の位置を参照するため、正しく解釈するには、生の画像に合わせてスケーリングする必要があります。

パフォーマンスベンチマーク

スターターモデルのパフォーマンスベンチマークの数値は、ここで説明するツールで生成されます。

モデル名 モデルサイズ デバイス GPU CPU
COCO SSD MobileNet v1 27 Mb Pixel 3 (Android 10) 22ms 46ms*
Pixel 4 (Android 10) 20ms 29ms*
iPhone XS (iOS 12.4.1) 7.6ms 11ms**
  • 4 つのスレッドを使用。

** 最高のパフォーマンス結果を得るために、iPhone では 2 つのスレッドを使用。

モデルのカスタマイズ

事前トレーニング済みモデル

Detection Zoo には、さまざまなレイテンシと精度の特性を備えたモバイル向けに最適化された検出モデルがあります。それぞれ、次のセクションで説明する入力シグネチャおよび出力シグネチャに従います。

ほとんどのダウンロード zip には、model.tfliteファイルが含まれています。含まれていない場合は、これらの手順で TensorFlowLite フラットバッファーを生成できます。TF2 Object Detection Zooの SSD モデルは、こちらの手順を使用して TensorFlowLite に変換することもできます。検出モデルは、モバイル対応のソースモデルを生成する中間ステップを必要とするため、TensorFlow Lite Converter を使用して直接変換できないことに注意してください。上記リンクのスクリプトは、このステップを実行します。

TF1TF2 の両方のエクスポートスクリプトには、より多くの出力オブジェクトや、より低速でより正確な後処理を可能にするパラメータがあります。サポートされている引数の完全なリストを表示するには、スクリプトで --help を使用してください。

現在、オンデバイス推論は SSD モデルでのみ最適化されています。CenterNet や EfficientDet などの他のアーキテクチャに対するサポートの改善は研究されています。

カスタマイズするモデルを選択するには

各モデルには、独自の精度(mAP 値で定量化)とレイテンシ特性があります。ユースケースと対象となるハードウェアに最適なモデルを選択する必要があります。たとえば、Edge TPU モデルは、Pixel 4 上の Google Edge TPU での推論に最適です。

利用可能な最も効率的なオプションを選択するにはベンチマークツールを使用してモデルを評価します。

カスタムデータを使用するモデルのファインチューニング

提供される事前トレーニング済みモデルは、90 クラスの物体を検出するようにトレーニングされています。クラスの完全なリストについては、モデルメタデータのラベルファイルをご覧ください。

元のセットにないクラスを認識するようにモデルを再トレーニングするには転移学習と呼ばれる手法を使用します。たとえば、元のトレーニングデータには野菜は 1 つしかありませんが、モデルを再トレーニングすると複数の種類の野菜を検出できます。これを行うには、トレーニングする新しいラベルごとに一連のトレーニング画像が必要です。推奨される方法は、TensorFlow Lite Model Maker ライブラリを使用することです。このライブラリは、カスタムデータセットと数行のコードを使用して、TensorFlow Lite モデルのトレーニングプロセスを簡素化します。また、転移学習が使用されるため、必要なトレーニングデータと時間が少なくなります。いくつかの例を含む事前トレーニング済みモデルのファインチューニングの例は、少数ショット検出 Colab でも確認できます。

より大きなデータセットでファインチューニングするには、TensorFlow Object Detection API を使用して独自のモデルをトレーニングするためのガイド、TF1TF2 をご覧ください。トレーニングが完了すると、TF1TF2 の手順で、TFLite に適した形式に変換できます。