Welcome to Mashykom WebSite




Coral USB accelerator + Raspberry Pi で edge computing




 Google が設計した Coral USB Accelerator は Edge TPU coprocessor を埋め込んだ、USB接続の端末チップです。on-board Edge TPU coprocessor は1秒あたり4兆回(TOPS)の演算を可能にするICチップです。また、2テラ回の演算で1ワットという省エネ効率(2 TOPS per watt)を持ちます。例えば、 MobileNet v2 のような mobile vision モデルを用いた時、効率的な方法で約400 FPSの演算を実現します。

 したがって、PCやコンピュータ・ボードにCoral USB Accelerator をUSB接続すれば、当該本体に Edge TPU の演算機能を追加できます。Linux、Mac OS 、 Windows ベースのコンピュータに接続して、deep learning モデルを用いた高速な機械学習を可能とします。たとえば、MobileNet v2などの最先端のCNNモデル(400fps)を電力効率の高い方法で実行できます。また、モデルを一から構築する必要もなく、TensorFlow Liteモデルをコンパイルして、Edge TPUで実行できます。

 このページでは、Coral USB Accelerator をRaspberry Pi に接続して画像識別や物体検出などの機械学習をするために必要な手順の初歩的な説明をします。Raspberry Pi への OS のインストール及びリモートPCからの操作に関する説明は、Raspberry Pi 入門のページを参照ください。ここでは、これらの環境は準備されていると想定します。

Last updated: 2021.2.1


Coral USB accelerator 環境 のセットアップ


 ハードウエアの必要環境としては、以下のOSを持つコンピュータが必要です。

 Python のバージョンは、3.5 - 3.8のいずれかがインストールされていることが必要です。

 ここでは、Raspberry Pi 3 Model B+ に Coral USB を接続するケースを説明します。OS は Debian 10 (Buster) です。Python のバージョンは Python 3.7.3 です。

 USB接続には、USB 3.0 Type-C が採用されていますが、USB 2.0 で接続するためのコネクターが付属しています。ここでは、USB 2.0 で接続します。

 初めに、Raspberry Pi OS のバージョンと python のバージョンを調べます。Raspberry Pi にリモート端末からssh 接続またはvnc 接続をして、Raspberry Pi の terminal コンソールで以下のコマンドを入力します。


$ cat /proc/device-tree/model
Raspberry Pi 3 Model B Plus Rev 1.2

$ cat /etc/debian_version 
10.7

$ python3 --version
Python 3.7.3

 Python 3.7.3 がインストールされています。python の環境を構築するために、pip3をインストールします。


$ sudo apt-get update

$ sudo apt-get install python3-pip python3-dev

 Coral USB の環境モジュールのインストールの手順は、coral.ai の site に説明されています。この説明に沿ってインストール作業を進めます。

 まず始めに、Debian package repository のインストールを行います。


echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list 

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -  

sudo apt-get update

 Edge TPU runtimeのインストールを行います。


sudo apt-get install libedgetpu1-std

 ここで、USB Accelerator を Raspberry Pi に接続します。すでに接続していたのならば、再度接続し直す。ここで、PyCoral library をインストールします。

  Pycoral は TensorFlow Lite library の上に作成された Python ライブラリ で、Edge TPU の機能を引き出すためのソフトです。Coral USB Accelerator を初めて使用するときは、この PyCoral API を活用する方がベターでしょう。

 PyCoral library をインストールするために、以下のコマンドを入力します。


sudo apt-get install python3-pycoral

 MobileNet v2 と example code を用いて、 image classification を実行するために、以下の手順を踏みます。

 まず、GitHub から example code をダウンロードします。


mkdir coral && cd coral

git clone https://github.com/google-coral/pycoral.git

cd pycoral

 次に、モデル、ラベル、画像をダウンロードします。


bash examples/install_requirements.sh classify_image.py 

 以下のスクリプトを実行して、正常に作動するかをみましょう。


python3 examples/classify_image.py \
--model test_data/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \
--labels test_data/inat_bird_labels.txt \
--input test_data/parrot.jpg

結果は

----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
117.4ms
11.4ms
11.3ms
11.2ms
11.4ms
-------RESULTS--------
Ara macao (Scarlet Macaw): 0.75781				

となるはずです。もしエラーが出たら、OS もしくは、環境ライブラリのインストールが正常ではない可能性があります。

 ちなみに、以下のコマンドを入力して、


python3 -c "from ctypes.util import find_library; print(find_library(\"edgetpu\"))"

結果が、「libedgetpu.so.1」となれば、正常です。そうでなければ、Edge TPU runtimeのインストールがうまくいっていないことになります。

Edge TPU の USB が有効になっているかどうかを調べるためには、以下のコマンドを打ちます。


lsusb -d 1a6e:089a

 正常な結果は 1a6e:089a Global Unichip Corp です。もしそうでなければ、デバイスは有効になっていません。

Edge TPU を用いた画像識別


もう一つのexample code を活用した画像識別を実行してみましょう。以下のコマンドを入力して下さい。


mkdir coral && cd coral

git clone https://github.com/google-coral/tflite.git

cd tflite/python/examples/classification

bash install_requirements.sh

python3 classify_image.py \
--model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \
--labels models/inat_bird_labels.txt \
--input images/parrot.jpg

 結果は以下の通りです。

----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
119.6ms
11.3ms
11.6ms
11.4ms
11.8ms
-------RESULTS--------
Ara macao (Scarlet Macaw): 0.77734

 識別された鳥は Scarlet Macaw で、正答率は77.73%です。上記の例とは正答率が若干異なります。画像識別に使用された画像は以下の通りです。

Edge TPU を用いた物体検出


 PyCoral ライブラリのすべての examples を利用するために、


bash examples/install_requirements.sh  

 と打ちます。bash コマンドの後に classify_image.py などのファイル名を明記しません。

 PyCoral ライブラリの中のexamples ディレクトリの内容を見てみましょう。

pi@raspberrypi:~/coral/pycoral/examples $ tree
.
├── README.md
├── backprop_last_layer.py
├── classify_image.py
├── detect_image.py
├── imprinting_learning.py
├── install_requirements.sh
├── model_pipelining_classify_image.py
├── semantic_segmentation.py
├── small_object_detection.py
└── two_models_inference.py

 10個のPythonファイルが存在します。

coral.ai/examples/に掲載されている例が配置されています。ちなみに、PyCoral API の test_data の中は以下のようになっています。

pi@raspberrypi:~/coral/pycoral/test_data $ tree
.
├── bird.bmp
├── cat.bmp
├── coco_labels.txt
├── deeplabv3_mnv2_pascal_quant_edgetpu.tflite
├── grace_hopper.bmp
├── imagenet_labels.txt
├── inat_bird_labels.txt
├── kite_and_cold.jpg
├── mobilenet_v1_1.0_224_l2norm_quant_edgetpu.tflite
├── mobilenet_v1_1.0_224_quant_embedding_extractor_edgetpu.tflite
├── mobilenet_v2_1.0_224_inat_bird_quant.tflite
├── mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite
├── mobilenet_v2_1.0_224_quant_edgetpu.tflite
├── parrot.jpg
├── pipeline
│   ├── inception_v3_299_quant_segment_0_of_2_edgetpu.tflite
│   └── inception_v3_299_quant_segment_1_of_2_edgetpu.tflite
├── ssd_mobilenet_v2_coco_quant_no_nms_edgetpu.tflite
├── ssd_mobilenet_v2_coco_quant_postprocess_edgetpu.tflite
├── ssd_mobilenet_v2_face_quant_postprocess_edgetpu.tflite
└── sunflower.bmp

1 directory, 20 files

example code を活用した物体検出を実行してみましょう。

python3 examples/detect_image.py \
  --model test_data/ssd_mobilenet_v2_coco_quant_postprocess_edgetpu.tflite \
  --labels test_data/coco_labels.txt \
  --input test_data/cat.bmp \
  --output ./cat_processed.bmp

以下の結果が表示されます。

----INFERENCE TIME----
Note: The first inference is slow because it includes loading the model into Edge TPU memory.
229.39 ms
65.66 ms
74.43 ms
78.45 ms
79.04 ms
-------RESULTS--------
cat
  id:     16
  score:  0.97265625
  bbox:   BBox(xmin=43, ymin=36, xmax=357, ymax=334)

 coco class no.16 は猫です。正答率は 97% です。bbox の位置も表示されています。以下が処理された画像です。

 もう少し複雑な画像の物体検出をしてみましょう。~/test_data/ディレクトリに物体検出で頻繁に使用される dog.jpg をコピーして、以下のコマンドを打ちます。

python3 examples/detect_image.py   \
  --model test_data/ssd_mobilenet_v2_coco_quant_postprocess_edgetpu.tflite \
  --labels test_data/coco_labels.txt \
  --input test_data/dog.jpg \
  --output ./dog_processed.jpg

 結果は以下の通りです。

----INFERENCE TIME----
Note: The first inference is slow because it includes loading the model into Edge TPU memory.
231.24 ms
56.98 ms
61.79 ms
65.08 ms
59.25 ms
-------RESULTS--------
dog
  id:     17
  score:  0.95703125
  bbox:   BBox(xmin=117, ymin=219, xmax=307, ymax=541)
bicycle
  id:     1
  score:  0.87109375
  bbox:   BBox(xmin=133, ymin=126, xmax=570, ymax=453)
car
  id:     2
  score:  0.72265625
  bbox:   BBox(xmin=471, ymin=73, xmax=696, ymax=167)

 一匹の犬、1台の自転車、1台の自動車が検出されています。Pytorch で SSD モデルを使用した時と比較すると、若干精度が落ちます。Pytorch での物体検出例を見て下さい。また、Yolo 2 モデルでは、自動車ではなくトラックとして検出されます。

 さらに複雑な例を見ましょう。

python3 examples/detect_image.py \
  --model test_data/ssd_mobilenet_v2_coco_quant_postprocess_edgetpu.tflite \
  --labels test_data/coco_labels.txt \
  --input test_data/kite_and_cold.jpg \
  --output ./kite_processed.jpg

以下の結果が表示されます。物体検出でよく使用される画像(海岸で遊ぶ人々とウインドサーフィン)です。

-------RESULTS--------
kite
  id:     37
  score:  0.89453125
  bbox:   BBox(xmin=603, ymin=77, xmax=668, ymax=153)
person
  id:     0
  score:  0.765625
  bbox:   BBox(xmin=208, ymin=673, xmax=277, ymax=850)
person
  id:     0
  score:  0.671875
  bbox:   BBox(xmin=103, ymin=605, xmax=169, ymax=761)
kite
  id:     37
  score:  0.6171875
  bbox:   BBox(xmin=468, ymin=339, xmax=490, ymax=363)
person
  id:     0
  score:  0.55859375
  bbox:   BBox(xmin=70, ymin=511, xmax=98, ymax=560)
kite
  id:     37
  score:  0.5
  bbox:   BBox(xmin=284, ymin=229, xmax=305, ymax=268)
person
  id:     0
  score:  0.44140625
  bbox:   BBox(xmin=52, ymin=517, xmax=75, ymax=560)

 4名の人物と3個のタコ(kite)が検出されていますが、これを越える数の人物とタコの画像が写っています。検出精度は高くありません。Tensorflow 2.0 で ssd_mobilenet_v1_coco_2017_11_17 を用いた時と比較すると明白に劣ります。TensorFlow 2.0 を用いた物体検出のページを参照して下さい。


Edge TPU を用いたライブカメラからの物体検出


 TensorFlow Lite (tflite_runtime)を以下の公式ページのTensorFlow Lite for Pythonを参考にして、インストールします。RasPi のターミナルで


pip3 install https://github.com/google-coral/pycoral/releases/download/release-frogfish/tflite_runtime-2.5.0-cp37-cp37m-linux_armv7l.whl

 と打ちます。

 ライブビデオからの映像を処理するためのソフトを Google-Coral の Git repo からダウンロードします。


mkdir google-coral && cd google-coral
git clone https://github.com/google-coral/examples-camera.git --depth 1

 ホルダーの構成は以下の通りです。

.
├── gstreamer
├── nativeapp
├── opencv
├── pygame
├── raspicam
├── download_models.sh
├── READE.md
...

 次に、モデルをダウンロードします。


cd examples-camera
sh download_models.sh

 すべてのラベルとモデルがダウンロードされ、新しいホルダー all_models に配置されます。ちなみに、all_models の内容は以下の通りです。拡張子 .tflite を持つモデルは、Tensorflow モデルから edge TPU で実行可能にするTensorflow Lite モデルに変換されたものです。

pi@raspberrypi:~/coral/google-coral/examples-camera/all_models $ tree
.
├── coco_labels.txt
├── imagenet_labels.txt
├── inat_bird_labels.txt
├── inat_insect_labels.txt
├── inat_plant_labels.txt
├── inception_v1_224_quant.tflite
├── inception_v1_224_quant_edgetpu.tflite
├── inception_v2_224_quant.tflite
├── inception_v2_224_quant_edgetpu.tflite
├── inception_v3_299_quant.tflite
├── inception_v3_299_quant_edgetpu.tflite
├── inception_v4_299_quant.tflite
├── inception_v4_299_quant_edgetpu.tflite
├── mobilenet_ssd_v1_coco_quant_postprocess.tflite
├── mobilenet_ssd_v1_coco_quant_postprocess_edgetpu.tflite
├── mobilenet_ssd_v2_coco_quant_postprocess.tflite
├── mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite
├── mobilenet_ssd_v2_face_quant_postprocess.tflite
├── mobilenet_ssd_v2_face_quant_postprocess_edgetpu.tflite
├── mobilenet_v1_1.0_224_quant.tflite
├── mobilenet_v1_1.0_224_quant_edgetpu.tflite
├── mobilenet_v1_1.0_224_quant_embedding_extractor.tflite
├── mobilenet_v1_1.0_224_quant_embedding_extractor_edgetpu.tflite
├── mobilenet_v2_1.0_224_inat_bird_quant.tflite
├── mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite
├── mobilenet_v2_1.0_224_inat_insect_quant.tflite
├── mobilenet_v2_1.0_224_inat_insect_quant_edgetpu.tflite
├── mobilenet_v2_1.0_224_inat_plant_quant.tflite
├── mobilenet_v2_1.0_224_inat_plant_quant_edgetpu.tflite
├── mobilenet_v2_1.0_224_quant.tflite
├── mobilenet_v2_1.0_224_quant_edgetpu.tflite
└── pet_labels.txt

0 directories, 32 files

 all_models に利用可能なラベルとモデルが表示されています。これらを用いて、opencv にある detect.py を実行します。その前に必要な opencv ライブラリを整備します。opencv のディレクトリに行って、


cd opencv
bash install_requirements.sh

 と入力します。この時エラーが出たら、改めて opencv環境を、以下のようにインストールします。


pip3 install opencv-contrib-python; sudo apt-get install -y libatlas-base-dev libhdf5-dev libhdf5-serial-dev libjasper-dev  libqtgui4  libqt4-test

 webcamera をRasPi に接続して、

cd ~/coral/google-coral/examples-camera/opencv 

python3 detect.py \
  --model ../all_models/mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite \
  --labels ../all_models/coco_labels.txt

 と入力すると、webcamera のライブ映像から物体検出が実行されます。物体特定の精度は良くありませんが、相当に早いスピードで実行されます。

 次日、GStreamer を利用するケースを取り上げます。以下のように関連ライブラリをインストールします。


cd google-coral/examples-camera/gstreamer

bash install_requirements.sh

 単に以下のコマンドを入力するだけで、ライブ映像から物体検出しました。

cd ~/coral/google-coral/examples-camera/gstreamer
 
python3 detect.py 

 ラベルとモデルを特定するときは

cd ~/coral/google-coral/examples-camera/gstreamer

python3 detect.py \
  --model ../all_models/mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite \
  --labels ../all_models/coco_labels.txt

 のように入力します。opencv を用いたケースと同じように、ライブ映像からの物体検出がなされます。

**** 続く ****

このページのトップに戻る