Tensorflow.jsとMobileNetV2 SSDLiteによる物体検出例

COCO-SSDモデル(mobilenetV2-SSDLite)をTensorflow.jsで使用して、Webブラウザ上でカスタムオブジェクトの検出を行う方法について説明します。

はじめに

この記事では、COCO-SSDモデル(mobilenetV2-SSDLite)をTensorflow.jsで使用して、Webブラウザ上でカスタムオブジェクトの検出を行う方法について説明します。

目次

  1. Tensorflow.jsのCOCO-SSDモデルによる物体検出
    1. 物体検出とは?
    2. Tensorflow.jsとは?
    3. COCO-SSDモデルの概要
    4. モデルを読み込む。
    5. 画像を検出する。
    6. 指定可能なMobileNetモデルの比較

Tensorflow.jsのCOCO-SSDモデルによる物体検出

物体検出とは?

オブジェクト検出は、画像内の特定の物体(オブジェクト)を検出する技術です。 この技術は、画像内のオブジェクトの位置を特定し、 あらかじめ定義されたカテゴリに分類することができます。例えば、混雑した道路の画像では、 物体検出アルゴリズムを使って、歩行者、車両、 交通標識、その他のオブジェクトの存在と位置を特定することができます。

Tensorflow.jsとは

TensorFlow.jsは、ブラウザやNode.js上で機械学習モデルの学習とデプロイを行うためのJavaScriptライブラリです。 オープンソースの機械学習フレームワークであるTensorFlowをJavaScriptで利用できるようになります。 TensorFlow.jsを使うと、ブラウザ上で機械学習モデルの学習とデプロイができ、 Web用の対話型機械学習アプリケーションを構築したり、Node.js上で機械学習実験を実行したりすることができます。 また、TensorFlow.jsを使用して、事前にトレーニングされたモデルを読み込んでブラウザで実行したり、 既存のTensorFlow モデルをブラウザで実行できるように変換することもできます。TensorFlow.jsは、柔軟で使いやすいように設計されており、 幅広い機械学習と深層学習の機能を提供します。

参考リンク

COCO-SSDモデルの概要

このオブジェクト検出モデルは、1つの画像内の複数のオブジェクトを識別し、位置を特定するために設計されています。 COCOデータセットはCommon Objects in Contextの略で、オブジェクトの検出、セグメンテーション、 キャプションのための大規模なデータセットです。このモデルは、 COCOデータセットを用いて80種類の異なるクラスのオブジェクトを認識するように学習されています。 Tensorflow.js用に設計されたCOCO-SSDモジュールは、 例えばimg, video, やcanvas要素など、 ブラウザで利用できるあらゆる画像入力からオブジェクトを検出することができます。 このモデルは、検出された各オブジェクトのクラス名と信頼度を含むバウンディングボックスの配列 を返します。

参考リンク

モデルの読み込み

coco-ssdモジュールにはloadという関数があり、 引数として設定オブジェクトを取り込み、モデルオブジェクトを返します。 この設定オブジェクトは、baseとmodelUrlという2つのオプションのプロパティを持っています。 baseは使用するCNNモデルの種類を指定するために使用され、'mobilenet_v1'、'mobilenet_v2'、 'lite_mobilenet_v2'のうちの一つを指定することができます。modelUrlは、 モデルのカスタムURLを指定するために使用され、 独自に用意したCNNモデルを使用する場合に指定します。

    
    export interface ModelConfig {
        base?: ObjectDetectionBaseModel;
        modelUrl?: string;
      }
      
    cocoSsd.load(config: ModelConfig = {});
    

以下の実装例では、SSD Lite Mobilenet V2を使用するため{base:'lite_mobilenet_v2'} が指定されています。

    
    // 出来上がったモデルをアプリのグローバルスコープに格納します。
    var model = undefined;
        
    // COCO-SSDクラスを使用する前に、読み込みが終了するのを待つ必要がある。
    // 読み込みが終わるのを待つ必要がある。機械学習モデルは大きく、実行に必要なものを取得するのに時間がかかることがある。
    // 実行に必要なものをすべて取得するのに時間がかかる。
    // 注意:cocoSsdはindex.htmlから読み込まれた外部オブジェクトです。
    // そのため、Glitch の警告は無視してください。
    cocoSsd.load({base: 'lite_mobilenet_v2'}).then(function (loadedModel) {
      model = loadedModel;
      // モデルが使用できるようになったので、デモセクションを表示します。
      demosSection.classList.remove('invisible');
    });
    

baseやmodelUrl引数が指定されていない場合、lite_mobilenet_v2がデフォルトで使用されます。サイズも小さく、推論速度も速いからです。

画像の検出

モデルオブジェクトには、detect というメソッドがあり、 これを用いて画像中のオブジェクトを検出することができます。 このメソッドは、引数として画像要素imgと maxNumBoxes と minScore をとります。 そして、検出されたオブジェクトのクラス名と信頼度を含むバウンディングボック スの配列を返します。image要素は、3Dテンソル、ImageDataオブジェクト、 HTMLImageElement, HTMLCanvasElement、HTMLVideoElement のいずれかです。

    
    model.detect(
    img: tf.Tensor3D | ImageData | HTMLImageElement |
    HTMLCanvasElement | HTMLVideoElement, maxNumBoxes: number, minScore: number
    )
    

指定可能なMobileNetモデルの比較

MobileNet V1とV2は、MobileNetアーキテクチャの異なるバージョンで、 それぞれ長所と短所があります。MobileNet V1はMobileNetアーキテクチャのオリジナルバージョンで、 計算とメモリ使用の面で効率的に設計されています。MobileNet V2は、MobileNet V1の原理をベースに、 精度と効率を高めるためにいく つかの改良を加えたものです。Lite MobileNet V2 は、MobileNet V2 アーキテクチャの変種で MobileNetV2よりもさらに計算効率が高くなるように設計されています。 組み込み機器やモバイル機器など、リソースに制約のある環境でよく使用されます。

精度の面では、通常、Lite MobileNet V2はMobileNet V2よりも精度が低く、MobileNet V1はMobileNet V2より精度が低いです。しかし、一方で、Lite MobileNet は計算とメモリー使用量の点 で最も効率的であり、MobileNet V2はLite MobileNet V2より劣りますが、 MobileNet V1より効率的です。

どのバージョンのMobileNetを使用するかは、ユースケースと、 使用するデバイスやプラットフォームの制約によります。 計算資源が限られている場合、MobileNet V2が最も効率的ですが、 精度を優先する場合は、MobileNet V2の方が良い場合があります。

モデル 精度 計算効率
Mobilenet V1
Mobilenet V2 非常に高い 高い
Lite Mobilenet V2 高い 非常に高い