弊社ではカメラから入力した映像をAI解析し、クラウド配信するソリューションとして、既にPROLICAやSCAI Watcherといった製品を提供しております。
これらは高性能な映像解析が可能ですが、一方で消費電力の観点からバッテリー駆動が難しいという課題もあります。
本ブログでは、遠隔地等の電源確保が難しい環境でもバッテリー駆動でAI解析を行うことを目指し、省電力性能に優れたCoral Edge TPUを使用した物体認識を試してみましたのでご紹介いたします。
Coral Edge TPUとは
Coral Edge TPU(Edge TPU)はGoogleが設計したチップで、小型、低消費電力ですが高パフォーマンスを実現することを謳っています。
https://coral.ai/products
に販売されているEdge TPUの情報が掲載されていますが、USBドングルタイプやPCIeに接続するタイプ、ボードに搭載済みのもの等、色々な製品に組み込むことが可能なラインナップとなっています。
スペックを見ると、Edge TPU単体の具体的な性能は
4 TOPS (int8); 2 TOPS per watt
となっています。
詳細なベンチマークは
https://coral.ai/docs/edgetpu/benchmarks/
等にまとまっているため、本ブログでは詳細な性能評価については割愛します。
Edge TPU向けソフト開発環境
Edge TPUでの推論にはTensorFlow Liteを使用できますが、TensorFlow LiteをラップしたCoral APIというインターフェースも提供されています。
python向けにはpycoral、C++向けにはlibcoralがライブラリとして提供されていますが、本ブログではpycoralを使用しました。
pycoralのインストールについては以下に説明があります。
https://coral.ai/docs/accelerator/get-started
以下Linux環境向けの手順を抜粋しますが、
1 2 |
sudo apt-get install libedgetpu1-std sudo apt-get install python3-pycoral |
の実行で必要なパッケージがインストールされます。
pycoralのインストールにあたっては
Note: PyCoral currently supports Python 3.6 through 3.9. If your default version is something else, we suggest you install Python 3.9 with pyenv.
との注意書きがあり、現状サポートしているpythonのバージョンはやや古い3.6から3.9なので、それ以外のpythonを使用されている場合は、別途pyenv等で該当のバージョンを入れる必要があります。
サンプルプログラムでの動作確認
https://coral.ai/examples
に色々なサンプルプログラムがあります。
今回はopencvを使用してカメラから映像を入力し、物体検知を行う以下のサンプルを試しました。
https://github.com/google-coral/examples-camera/tree/master/opencv
動作環境のハード構成は大まかに、
開発ボード+Edge TPU+ カメラ(RTSP LAN接続)
となります。
サンプルに含まれるinstall_requirements.shを実行すると、学習済みのモデルがダウンロードしてくれるので、モデルを自前で用意しなくてもすぐにTPUを試すことができますが、弊社のハード構成に合わせてサンプルプログラムを一部修正します。
デフォルトではopencvのVideoCaptureにUVCカメラのデバイス番号を渡すようになっています。
今回はLAN接続したカメラからRTSPで映像を受信するため、カメラのURLを指定するようにします。
1 2 |
# cap = cv2.VideoCapture(args.camera_idx) cap = cv2.VideoCapture('rtsp://192.168.100.1/rtpstream/config1') |
また、開発ボードは映像出力を持たないため、ディレクトリ配下にjpeg形式で物体検知結果の画像を保存するようにしました。
1 2 3 4 5 6 |
# cv2.imshow('frame', cv2_im) # if cv2.waitKey(1) & 0xFF == ord('q'): # break cv2.imwrite("images/{}.jpeg".format(cnt), cv2_im) cap.release() # cv2.destroyAllWindows() |
python3 detect.pyを実行すると、以下のような画像が保存されます。この例では観葉植物と鉢とが認識されています。
次に特定の物体を判定するようにしてみます。
今回は人物を認識した際に赤枠でバウンディングボックスを表示します。
1 2 |
run_inference(interpreter, cv2_im_rgb.tobytes()) objs = get_objects(interpreter, args.threshold)[:args.top_k] |
run_inferenceで推論した後に、get_objectsで取得したobjsに認識結果が格納されています。
objsの各要素のidはラベル番号に対応しています。
本例ではinstall_requirements.sh実行時にダウンロードされるall_models/coco_labels.txtを使用していますが、coco_labels.txtの中を見ると
1 2 3 4 5 6 |
0 person 1 bicycle 2 car 3 motorcycle 4 airplane ... |
のようになっています。そのため、
1 2 3 |
for obj in objs: if obj.id == 0: 処理 |
のようなコードで人物検知時に処理を行うことができます。
人物検知時にバウンディングボックスを赤枠に変更したところ、以下のように人物が分かりやすく表示されるようになりました。
おわりに
本ブログではEdge TPUを使用した物体検知についてご紹介しました。
今回はサンプルアプリをベースにした簡単な物体検知のみ行いましたが、TSX-100のようなゲートウエイと組み合わせ、物体検知映像をLTE通信+RTSPで遠隔に配信できるようすることも検討しています。
低電力、低価格でのAI映像配信システムをご提供できるように今後も目指していきます。